From 90be7cdc66ecfb024f71740656c5ba647736ab09 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 15 Mar 2017 21:42:10 +0000 Subject: [PATCH 1/5] Add cisco specific mibs --- src/sonic_ax_impl/main.py | 3 +- .../mibs/vendor/cisco/__init__.py | 1 + src/sonic_ax_impl/mibs/vendor/cisco/mgmt.py | 40 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/sonic_ax_impl/mibs/vendor/cisco/__init__.py create mode 100644 src/sonic_ax_impl/mibs/vendor/cisco/mgmt.py diff --git a/src/sonic_ax_impl/main.py b/src/sonic_ax_impl/main.py index 7701e3d91a..0c9df40752 100644 --- a/src/sonic_ax_impl/main.py +++ b/src/sonic_ax_impl/main.py @@ -12,7 +12,7 @@ from sonic_ax_impl.mibs import ieee802_1ab from . import logger from .mibs.ietf import rfc1213, rfc2737, rfc2863, rfc4292, rfc4363 -from .mibs.vendor import dell +from .mibs.vendor import dell, cisco # Background task update frequency ( in seconds ) DEFAULT_UPDATE_FREQUENCY = 5 @@ -31,6 +31,7 @@ class SonicMIB( ieee802_1ab.LLDPLocPortTable, ieee802_1ab.LLDPRemTable, dell.force10.SSeriesMIB, + cisco.mgmt.CiscoSystemExtMIB, ): """ If SONiC was to create custom MIBEntries, they may be specified here. diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py b/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py new file mode 100644 index 0000000000..5a7a784b3d --- /dev/null +++ b/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py @@ -0,0 +1 @@ +from . import mgmt \ No newline at end of file diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/mgmt.py b/src/sonic_ax_impl/mibs/vendor/cisco/mgmt.py new file mode 100644 index 0000000000..10c0a3da7b --- /dev/null +++ b/src/sonic_ax_impl/mibs/vendor/cisco/mgmt.py @@ -0,0 +1,40 @@ +from sonic_ax_impl.mibs.vendor import sys_util_h +from ax_interface import MIBMeta, ValueType +from ax_interface.mib import MIBEntry + + +class CiscoSystemExtMIB(metaclass=MIBMeta, prefix='.1.3.6.1.4.1.9.9.305'): + """ + {iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 9 ciscoMgmt(9) + CISCO-SYSTEM-EXT-MIB (305)} + + OID_cseSysMemoryUtilization = "1.3.6.1.4.1.9.9.305.1.1.2.0"; + OID_cseSysCPUUtilization = "1.3.6.1.4.1.9.9.305.1.1.1.0"; + """ + updater = sys_util_h + + """ + cseSysMemoryUtilization OBJECT-TYPE + SYNTAX Gauge32 (0..100 ) + UNITS "%" + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The average utilization of memory on the active + supervisor." + ::= { ciscoSysInfoGroup 2 } + """ + cseSysMemoryUtilization = MIBEntry('1.1.2.0', ValueType.GAUGE_32, sys_util_h.get_memutil) + + """ + cseSysCPUUtilization OBJECT-TYPE + SYNTAX Gauge32 (0..100 ) + UNITS "%" + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The average utilization of CPU on the active + supervisor." + ::= { ciscoSysInfoGroup 1 } + """ + cseSysCPUUtilization = MIBEntry('1.1.1.0', ValueType.GAUGE_32, sys_util_h.get_cpuutil_5sec) From 35760706ff2d214dc5c59339423e691955569c2e Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Sat, 26 Aug 2017 01:55:52 +0000 Subject: [PATCH 2/5] Implement BgpInfo --- __init__.py | 0 src/sonic_ax_impl/lib/__init__.py | 0 src/sonic_ax_impl/lib/vtysh_helper.py | 128 ++++++++++++++++++ src/sonic_ax_impl/main.py | 1 + .../mibs/vendor/cisco/__init__.py | 2 +- src/sonic_ax_impl/mibs/vendor/cisco/bgp4.py | 44 ++++++ tests/__init__.py | 1 + tests/mock_tables/bgpsummary_ipv4.txt | 35 +++++ tests/mock_tables/bgpsummary_ipv6.txt | 31 +++++ tests/mock_tables/socket.py | 47 +++++++ tests/test_vtysh.py | 100 ++++++++++++++ 11 files changed, 388 insertions(+), 1 deletion(-) create mode 100644 __init__.py create mode 100644 src/sonic_ax_impl/lib/__init__.py create mode 100644 src/sonic_ax_impl/lib/vtysh_helper.py create mode 100644 src/sonic_ax_impl/mibs/vendor/cisco/bgp4.py create mode 100644 tests/mock_tables/bgpsummary_ipv4.txt create mode 100644 tests/mock_tables/bgpsummary_ipv6.txt create mode 100644 tests/mock_tables/socket.py create mode 100644 tests/test_vtysh.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/sonic_ax_impl/lib/__init__.py b/src/sonic_ax_impl/lib/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/sonic_ax_impl/lib/vtysh_helper.py b/src/sonic_ax_impl/lib/vtysh_helper.py new file mode 100644 index 0000000000..7d8f01cf64 --- /dev/null +++ b/src/sonic_ax_impl/lib/vtysh_helper.py @@ -0,0 +1,128 @@ +import re +import ipaddress +import socket + +HOST = '127.0.0.1' +PORT = 2605 + +def union_bgp_sessions(): + bgpsumm_ipv4 = show_bgp_summary('ip') + sessions_ipv4 = parse_bgp_summary(bgpsumm_ipv4) + + bgpsumm_ipv6 = show_bgp_summary('ipv6') + sessions_ipv6 = parse_bgp_summary(bgpsumm_ipv6) + + # Note: sessions_ipv4 will overwrite sessions_ipv6 if key is the same + sessions = {} + for ses in sessions_ipv6 + sessions_ipv4: + nei = ses['Neighbor'] + sessions[nei] = ses + return sessions + +def vtysh_run(command): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((HOST, PORT)) + + cmd = b"zebra\r\n" + command.encode() + b"\r\nexit\r\n" + s.send(cmd) + + acc = b"" + while True: + data = s.recv(1024) + if not data: + break + acc += data + + s.close() + return acc.decode('ascii', 'ignore') + +def show_bgp_summary(ipver): + assert(ipver in ['ip', 'ipv6']) + try: + result = vtysh_run('show %s bgp summary' % ipver) + + except ConnectionRefusedError as e: + raise RuntimeError('Failed to connect quagga socket') from e + except OSError as e: + raise RuntimeError('Socket error when talking with quagga') from e + return result + +def parse_bgp_summary(summ): + ls = summ.splitlines() + bgpinfo = [] + + ## Read until the table header + n = len(ls) + li = 0 + while li < n: + l = ls[li] + if l.startswith('Neighbor '): break + if l.startswith('No IPv'): # eg. No IPv6 neighbor is configured + return bgpinfo + li += 1 + + ## Read and store the table header + if li >= n: + raise ValueError('No table header found') + hl = ls[li] + li += 1 + ht = re.split('\s+', hl.rstrip()) + hn = len(ht) + + ## Read rows in the table + while li < n: + l = ls[li] + li += 1 + if l == '': break + + ## Handle line wrap + ## ref: bgp_show_summary in https://github.com/Azure/sonic-quagga/blob/debian/0.99.24.1/bgpd/bgp_vty.c + if ' ' not in l: + ## Read next line + if li >= n: + raise ValueError('Unexpected line wrap') + l += ls[li] + li += 1 + + ## Note: State/PfxRcd field may be 'Idle (Admin)' + lt = re.split('\s+', l.rstrip(), maxsplit = hn - 1) + if len(lt) != hn: + raise ValueError('Unexpected row in the table') + dic = dict(zip(ht, lt)) + bgpinfo.append(dic) + return bgpinfo + +STATE_CODE = { + "Idle": 1, + "Idle (Admin)": 1, + "Connect": 2, + "Active": 3, + "OpenSent": 4, + "OpenConfirm": 5, + "Established": 6 +}; + +def bgp_peer_tuple(dic): + nei = dic['Neighbor'] + ver = dic['V'] + sta = dic['State/PfxRcd'] + + # prefix '*' appears if the entry is a dynamic neighbor + nei = nei[1:] if nei[0] == '*' else nei + ip = ipaddress.ip_address(nei) + if type(ip) is ipaddress.IPv4Address: + oid_head = (1, 4) + else: + oid_head = (2, 16) + + oid_ip = tuple(i for i in ip.packed) + + if sta.isdigit(): + status = 6 + elif sta in STATE_CODE: + status = STATE_CODE[sta] + else: + return None, None + + return oid_head + oid_ip, status + diff --git a/src/sonic_ax_impl/main.py b/src/sonic_ax_impl/main.py index 0c9df40752..d5fff6132f 100644 --- a/src/sonic_ax_impl/main.py +++ b/src/sonic_ax_impl/main.py @@ -32,6 +32,7 @@ class SonicMIB( ieee802_1ab.LLDPRemTable, dell.force10.SSeriesMIB, cisco.mgmt.CiscoSystemExtMIB, + cisco.bgp4.CiscoBgp4MIB, ): """ If SONiC was to create custom MIBEntries, they may be specified here. diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py b/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py index 5a7a784b3d..d77c3adb60 100644 --- a/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py +++ b/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py @@ -1 +1 @@ -from . import mgmt \ No newline at end of file +from . import mgmt, bgp4 diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/bgp4.py b/src/sonic_ax_impl/mibs/vendor/cisco/bgp4.py new file mode 100644 index 0000000000..a77c7a7276 --- /dev/null +++ b/src/sonic_ax_impl/mibs/vendor/cisco/bgp4.py @@ -0,0 +1,44 @@ +from bisect import bisect_right +from sonic_ax_impl import mibs +from sonic_ax_impl.lib import vtysh_helper +from ax_interface import MIBMeta, ValueType, MIBUpdater, SubtreeMIBEntry +from ax_interface.mib import MIBEntry + +class BgpSessionUpdater(MIBUpdater): + def __init__(self): + super().__init__() + self.update_data() + + def update_data(self): + self.session_status_map = {} + self.session_status_list = [] + + try: + sessions = vtysh_helper.union_bgp_sessions() + except RuntimeError as e: + mibs.logger.error("Failed to union bgp sessions: {}.".format(e)) + return + + for nei, ses in sessions.items(): + oid, status = vtysh_helper.bgp_peer_tuple(ses) + if oid is None: continue + self.session_status_list.append(oid) + self.session_status_map[oid] = status + + self.session_status_list.sort() + + def sessionstatus(self, sub_id): + return self.session_status_map.get(sub_id, None) + + def get_next(self, sub_id): + right = bisect_right(self.session_status_list, sub_id) + if right >= len(self.session_status_list): + return None + + return self.session_status_list[right] + + +class CiscoBgp4MIB(metaclass=MIBMeta, prefix='.1.3.6.1.4.1.9.9.187'): + bgpsession_updater = BgpSessionUpdater() + + cbgpPeer2State = SubtreeMIBEntry('1.2.5.1.3', bgpsession_updater, ValueType.INTEGER, bgpsession_updater.sessionstatus) diff --git a/tests/__init__.py b/tests/__init__.py index e69de29bb2..5feedc0e9b 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -0,0 +1 @@ +import tests.mock_tables.socket diff --git a/tests/mock_tables/bgpsummary_ipv4.txt b/tests/mock_tables/bgpsummary_ipv4.txt new file mode 100644 index 0000000000..44f8b69da8 --- /dev/null +++ b/tests/mock_tables/bgpsummary_ipv4.txt @@ -0,0 +1,35 @@ + +Hello, this is Quagga (version 0.99.24.1). +Copyright 1996-2005 Kunihiro Ishiguro, et al. + + User Access Verification + +"Password: +str-msn2700-05> str-msn2700-05> show ip bgp summary +BGP router identifier 10.1.0.32, local AS number 65100 +RIB entries 13025, using 1425 KiB of memory +Peers 16, using 291 KiB of memory + +Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd +10.0.0.57 4 64600 3253 3255 0 0 0 00:48:54 6402 +10.0.0.59 4 64600 3252 3258 0 0 0 00:48:56 6402 +10.0.0.61 4 64600 3253 3256 0 0 0 00:48:55 6402 +10.0.0.63 4 64600 3252 56 0 0 0 00:48:57 6402 +10.0.0.65 4 64016 205 9956 0 0 0 13:21:23 Idle +10.0.0.67 4 65200 3210 3246 0 0 0 00:00:11 Idle (Admin) +fc00::72 4 64600 3253 3255 0 0 0 00:48:54 0 +fc00::76 4 64600 3253 3255 0 0 0 00:48:54 0 +fc00::7a 4 64600 3253 3255 0 0 0 00:48:55 0 +fc00::7e 4 64600 3253 54 0 0 0 00:48:55 0 +fc00::2 4 65200 6608 6790 0 0 0 13:21:22 Active +fc00::4 4 65200 6608 6790 0 0 0 13:21:22 Connect +fc00::6 4 65200 6608 6790 0 0 0 13:21:22 OpenSent +fc00::8 4 65200 6608 6790 0 0 0 13:21:22 OpenConfirm +fc00::10 4 65200 6608 6790 0 0 0 13:21:22 Clearing +fc00::12 4 65200 6608 6790 0 0 0 13:21:22 Deleted + +Total number of neighbors 15 +str-msn2700-05> +str-msn2700-05> exit + + diff --git a/tests/mock_tables/bgpsummary_ipv6.txt b/tests/mock_tables/bgpsummary_ipv6.txt new file mode 100644 index 0000000000..318f3db051 --- /dev/null +++ b/tests/mock_tables/bgpsummary_ipv6.txt @@ -0,0 +1,31 @@ + +Hello, this is Quagga (version 0.99.24.1). +Copyright 1996-2005 Kunihiro Ishiguro, et al. + + +User Access Verification + +"Password: +str-msn2700-05> +BGP router identifier 10.1.0.32, local AS number 65100 +RIB entries 13025, using 1425 KiB of memory +Peers 11, using 291 KiB of memory + +Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd +fc00::72 4 64600 3253 3255 0 0 0 00:48:54 Idle (Admin) +fc00::76 4 64600 3253 3255 0 0 0 00:48:54 0 +fc00::7a 4 64600 3253 3255 0 0 0 00:48:55 0 +fc00::7e 4 64600 3253 54 0 0 0 00:48:55 0 +fc00::2 4 65200 6608 6790 0 0 0 13:21:22 Active +fc00::4 4 65200 6608 6790 0 0 0 13:21:22 Connect +fc00::6 4 65200 6608 6790 0 0 0 13:21:22 OpenSent +fc00::8 4 65200 6608 6790 0 0 0 13:21:22 OpenConfirm +fc00::10 4 65200 6608 6790 0 0 0 13:21:22 Clearing +fc00::12 4 65200 6608 6790 0 0 0 13:21:22 Deleted +2603:10b0:2800:cc1::2e + 4 64611 2919 92 0 0 0 01:18:59 0 + +Total number of neighbors 11 +str-msn2700-05> +str-msn2700-05> exit + diff --git a/tests/mock_tables/socket.py b/tests/mock_tables/socket.py new file mode 100644 index 0000000000..86d6f025de --- /dev/null +++ b/tests/mock_tables/socket.py @@ -0,0 +1,47 @@ +import os +from collections import namedtuple +import unittest +from unittest import TestCase, mock +from unittest.mock import patch, mock_open, MagicMock + +INPUT_DIR = os.path.dirname(os.path.abspath(__file__)) + +import socket + +# Backup original class +_socket_class = socket.socket + +# Monkey patch +class MockSocket(_socket_class): + _instance_count = 0 + + def __init__(self, *args, **kwargs): + super(MockSocket, self).__init__(*args, **kwargs) + MockSocket._instance_count %= 2 + MockSocket._instance_count += 1 + self.first = True + + def connect(self, *args, **kwargs): + pass + + def send(self, *args, **kwargs): + pass + + def recv(self, *args, **kwargs): + if not self.first: + return None + self.first = False + + if MockSocket._instance_count == 1: + filename = INPUT_DIR + '/bgpsummary_ipv4.txt' + elif MockSocket._instance_count == 2: + filename = INPUT_DIR + '/bgpsummary_ipv6.txt' + + ret = namedtuple('ret', ['returncode', 'stdout']) + ret.returncode = 0 + with open(filename, 'rb') as f: + ret = f.read() + return ret + +# Replace the function with mocked one +socket.socket = MockSocket diff --git a/tests/test_vtysh.py b/tests/test_vtysh.py new file mode 100644 index 0000000000..128bcffdc2 --- /dev/null +++ b/tests/test_vtysh.py @@ -0,0 +1,100 @@ +import os +import sys + +modules_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, os.path.join(modules_path, 'src')) + +from unittest import TestCase +from unittest.mock import patch, mock_open + +from ax_interface.mib import MIBTable +from ax_interface.pdu import PDUHeader +from ax_interface.pdu_implementations import GetPDU, GetNextPDU +from ax_interface import ValueType +from ax_interface.encodings import ObjectIdentifier +from ax_interface.constants import PduTypes +from sonic_ax_impl.mibs.ietf import rfc4363 +from sonic_ax_impl.main import SonicMIB + +class TestSonicMIB(TestCase): + @classmethod + def setUpClass(cls): + cls.lut = MIBTable(SonicMIB) + + def test_getpdu_established(self): + oid = ObjectIdentifier(20, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 187, 1, 2, 5, 1, 3, 1, 4, 10, 0, 0, 61)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, 6) + + def test_getpdu_idle(self): + oid = ObjectIdentifier(20, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 187, 1, 2, 5, 1, 3, 1, 4, 10, 0, 0, 65)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, 1) + + def test_getpdu_active(self): + oid = ObjectIdentifier(20, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 187, 1, 2, 5, 1, 3, 2, 16, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, 3) + + def test_getpdu_disappeared(self): + oid = ObjectIdentifier(20, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 187, 1, 2, 5, 1, 3, 2, 16, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.NO_SUCH_INSTANCE) + + def test_getpdu_ipv4_overwite_ipv6(self): + oid = ObjectIdentifier(20, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 187, 1, 2, 5, 1, 3, 2, 16, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x72)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, 6) From 0ce71650a80f9b8c22545963d38ea1a70fa0164f Mon Sep 17 00:00:00 2001 From: andrii savka Date: Mon, 20 Nov 2017 17:22:02 +0200 Subject: [PATCH 3/5] Added PSU support --- src/sonic_ax_impl/main.py | 1 + .../mibs/vendor/cisco/__init__.py | 1 + .../vendor/cisco/ciscoEntityFruControlMIB.py | 102 ++++++++++++++++++ tests/__init__.py | 1 + tests/mock_tables/imp.py | 15 +++ tests/plugins/psuutil.py | 58 ++++++++++ tests/test_psu.py | 101 +++++++++++++++++ 7 files changed, 279 insertions(+) create mode 100644 src/sonic_ax_impl/mibs/vendor/cisco/ciscoEntityFruControlMIB.py create mode 100644 tests/mock_tables/imp.py create mode 100644 tests/plugins/psuutil.py create mode 100644 tests/test_psu.py diff --git a/src/sonic_ax_impl/main.py b/src/sonic_ax_impl/main.py index d5fff6132f..7aec24bcd1 100644 --- a/src/sonic_ax_impl/main.py +++ b/src/sonic_ax_impl/main.py @@ -33,6 +33,7 @@ class SonicMIB( dell.force10.SSeriesMIB, cisco.mgmt.CiscoSystemExtMIB, cisco.bgp4.CiscoBgp4MIB, + cisco.ciscoEntityFruControlMIB.cefcFruPowerStatusTable, ): """ If SONiC was to create custom MIBEntries, they may be specified here. diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py b/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py index d77c3adb60..04a4015d5a 100644 --- a/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py +++ b/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py @@ -1 +1,2 @@ from . import mgmt, bgp4 +from . import ciscoEntityFruControlMIB diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoEntityFruControlMIB.py b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoEntityFruControlMIB.py new file mode 100644 index 0000000000..c61a95fbe8 --- /dev/null +++ b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoEntityFruControlMIB.py @@ -0,0 +1,102 @@ +import imp +import re +import sys + +from sonic_ax_impl import mibs +from ax_interface import MIBMeta, ValueType, MIBUpdater, MIBEntry, SubtreeMIBEntry +from ax_interface.encodings import ObjectIdentifier + +PSU_PLUGIN_MODULE_NAME = 'psuutil' +PSU_PLUGIN_MODULE_PATH = "/usr/share/sonic/platform/plugins/{}.py".format(PSU_PLUGIN_MODULE_NAME) +PSU_PLUGIN_CLASS_NAME = 'PsuUtil' + +class PowerStatusHandler: + """ + Class to handle the SNMP request + """ + def __init__(self): + """ + init the handler + """ + self.psuutil = None + + try: + module = imp.load_source(PSU_PLUGIN_MODULE_NAME, PSU_PLUGIN_MODULE_PATH) + except ImportError as e: + mibs.logger.error("Failed to load PSU module '%s': %s" % (PSU_PLUGIN_MODULE_NAME, str(e)), True) + return + except FileNotFoundError as e: + mibs.logger.error("Failed to get platform specific PSU module '%s': %s" % (PSU_PLUGIN_MODULE_NAME, str(e)), True) + return + + try: + platform_psuutil_class = getattr(module, PSU_PLUGIN_CLASS_NAME) + self.psuutil = platform_psuutil_class() + except AttributeError as e: + mibs.logger.error("Failed to instantiate '%s' class: %s" % (PLATFORM_SPECIFIC_CLASS_NAME, str(e)), True) + + def _getPsuIndex(self, sub_id): + """ + Get the PSU index from sub_id + :return: the index of supported PSU + """ + if not self.psuutil or not sub_id or len(sub_id) > 1: + return None + + psu_index = int(sub_id[0]) + + if psu_index < 1 or psu_index > self.psuutil.get_num_psus(): + return None + + return psu_index + + def get_next(self, sub_id): + """ + :param sub_id: The 1-based snmp sub-identifier query. + :return: the next sub id. + """ + if not self.psuutil: + return None + + if not sub_id: + return (1,) + + psu_index = self._getPsuIndex(sub_id) + + if psu_index and psu_index + 1 <= self.psuutil.get_num_psus(): + return (psu_index + 1,) + + return None + + def getPsuStatus(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the status of requested PSU according to cefcModuleOperStatus ModuleOperType + 2 - PSU has correct functionalling - ok + 7 - PSU has a problem with functionalling - failed + :ref: https://www.cisco.com/c/en/us/td/docs/switches/wan/mgx/mgx_8850/software/mgx_r2-0-10/pxm/reference/guide/pxm/cscoent.html + """ + psu_index = self._getPsuIndex(sub_id) + + if not psu_index: + return None + + psu_status = self.psuutil.get_psu_status(psu_index) + + if psu_status: + return 2 + + return 7 + + +class cefcFruPowerStatusTable(metaclass=MIBMeta, prefix='.1.3.6.1.4.1.9.9.117.1.1.2'): + """ + 'cefcFruPowerStatusTable' http://oidref.com/1.3.6.1.4.1.9.9.117.1.1.2 + """ + + power_status_handler = PowerStatusHandler() + + # cefcFruPowerStatusTable = '1.3.6.1.4.1.9.9.117.1.1.2' + # csqIfQosGroupStatsEntry = '1.3.6.1.4.1.9.9.117.1.1.2.1' + + psu_status = SubtreeMIBEntry('1.2', power_status_handler, ValueType.INTEGER, power_status_handler.getPsuStatus) diff --git a/tests/__init__.py b/tests/__init__.py index 5feedc0e9b..98cfd92200 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1 +1,2 @@ import tests.mock_tables.socket +import tests.mock_tables.imp diff --git a/tests/mock_tables/imp.py b/tests/mock_tables/imp.py new file mode 100644 index 0000000000..8dee765a55 --- /dev/null +++ b/tests/mock_tables/imp.py @@ -0,0 +1,15 @@ +import imp +import os + +TEST_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +# Backup original function +_load_source = getattr(imp, 'load_source') + +# Monkey patch +def load_source(name, pathname): + if name == 'psuutil': + return _load_source(name, TEST_DIR + '/plugins/psuutil.py') + +# Replace the function with mocked one +imp.load_source = load_source diff --git a/tests/plugins/psuutil.py b/tests/plugins/psuutil.py new file mode 100644 index 0000000000..60957e8a52 --- /dev/null +++ b/tests/plugins/psuutil.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status for SNMP testing +# +############################################################################# + +class PsuUtil(): + """PSUutil class for SNMP testing""" + + def __init__(self): + """ For testing purpose only """ + self.num_of_psus = 2 + self.psu_status = { 1 : True, 2 : False } + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + + :return: An integer, the number of PSUs available on the device + """ + """ For testing purpose only """ + return self.num_of_psus + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + """ For testing purpose only """ + if not isinstance(index, int): + return False + elif index > 0 and index <= self.num_of_psus: + return self.psu_status[index] + else: + return False + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + """ For testing purpose only """ + if not isinstance(index, int): + return False + elif index > 0 and index <= self.num_of_psus: + return self.psu_status[index] + else: + return False diff --git a/tests/test_psu.py b/tests/test_psu.py new file mode 100644 index 0000000000..9923efd51b --- /dev/null +++ b/tests/test_psu.py @@ -0,0 +1,101 @@ +import os +import sys + +# noinspection PyUnresolvedReferences +import tests.mock_tables.dbconnector + +modules_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, os.path.join(modules_path, 'src')) + +from unittest import TestCase + +from ax_interface import ValueType +from ax_interface.pdu_implementations import GetPDU, GetNextPDU +from ax_interface.encodings import ObjectIdentifier +from ax_interface.constants import PduTypes +from ax_interface.pdu import PDU, PDUHeader +from ax_interface.mib import MIBTable +from sonic_ax_impl.mibs.vendor.cisco import ciscoEntityFruControlMIB + +class TestPsuStatus(TestCase): + @classmethod + def setUpClass(cls): + cls.lut = MIBTable(ciscoEntityFruControlMIB.cefcFruPowerStatusTable) + + def test_getPsu1Status(self): + oid = ObjectIdentifier(2, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 117, 1, 1, 2, 1, 2, 1)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, 2) + + def test_getNextPsu1(self): + oid = ObjectIdentifier(2, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 117, 1, 1, 2, 1, 2, 1)) + expected_oid = ObjectIdentifier(2, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 117, 1, 1, 2, 1, 2, 2)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET_NEXT, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(expected_oid)) + self.assertEqual(value0.data, 7) + + def test_getPsu2Status(self): + oid = ObjectIdentifier(2, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 117, 1, 1, 2, 1, 2, 2)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, 7) + + def test_getNextPsu2(self): + oid = ObjectIdentifier(2, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 117, 1, 1, 2, 1, 2, 2)) + expected_oid = None + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET_NEXT, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.END_OF_MIB_VIEW) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, None) + + def test_getMissedPsu(self): + oid = ObjectIdentifier(2, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 117, 1, 1, 2, 1, 2, 5, 1)) + expected_oid = None + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET_NEXT, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.END_OF_MIB_VIEW) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, None) From c954e4e44d1e44fc5b4b2269a5bbcee63aeb07c7 Mon Sep 17 00:00:00 2001 From: AndriiS Date: Thu, 11 Jan 2018 21:51:35 +0200 Subject: [PATCH 4/5] Added ciscoPfcExtMIB, ciscoSwitchQosMIB MIBs (#1) --- src/sonic_ax_impl/main.py | 3 + src/sonic_ax_impl/mibs/__init__.py | 66 ++ .../mibs/vendor/cisco/__init__.py | 2 + .../mibs/vendor/cisco/ciscoPfcExtMIB.py | 275 ++++++ .../mibs/vendor/cisco/ciscoSwitchQosMIB.py | 213 +++++ tests/mock_tables/counters_db.json | 884 +++++++++++++++++- tests/test_pfc.py | 205 ++++ tests/test_queues_stat.py | 110 +++ 8 files changed, 1726 insertions(+), 32 deletions(-) create mode 100644 src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py create mode 100644 src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py create mode 100644 tests/test_pfc.py create mode 100644 tests/test_queues_stat.py diff --git a/src/sonic_ax_impl/main.py b/src/sonic_ax_impl/main.py index 7aec24bcd1..0275900465 100644 --- a/src/sonic_ax_impl/main.py +++ b/src/sonic_ax_impl/main.py @@ -33,6 +33,9 @@ class SonicMIB( dell.force10.SSeriesMIB, cisco.mgmt.CiscoSystemExtMIB, cisco.bgp4.CiscoBgp4MIB, + cisco.ciscoPfcExtMIB.cpfcIfTable, + cisco.ciscoPfcExtMIB.cpfcIfPriorityTable, + cisco.ciscoSwitchQosMIB.csqIfQosGroupStatsTable, cisco.ciscoEntityFruControlMIB.cefcFruPowerStatusTable, ): """ diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index edac80c87f..38aa6f1037 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -7,6 +7,7 @@ from sonic_ax_impl import logger, _if_alias_map COUNTERS_PORT_NAME_MAP = b'COUNTERS_PORT_NAME_MAP' +COUNTERS_QUEUE_NAME_MAP = b'COUNTERS_QUEUE_NAME_MAP' LAG_TABLE = b'LAG_TABLE' LAG_MEMBER_TABLE = b'LAG_MEMBER_TABLE' APPL_DB = 'APPL_DB' @@ -22,6 +23,16 @@ def counter_table(sai_id): """ return b'COUNTERS:oid:0x' + sai_id +def queue_table(sai_id): + """ + :param sai_id: given sai_id to cast. + :return: COUNTERS table key. + """ + return b'COUNTERS:' + sai_id + +def queue_key(port_index, queue_index): + return str(port_index) + ':' + str(queue_index) + def lldp_entry_table(if_name): """ @@ -158,3 +169,58 @@ def member_name_str(val, lag_name): oid_lag_name_map[idx] = if_name return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map + +def init_sync_d_queue_tables(db_conn): + """ + Initializes queue maps for SyncD-connected MIB(s). + :return: tuple(port_queues_map, queue_stat_map) + """ + + # Make sure we're connected to COUNTERS_DB + db_conn.connect(COUNTERS_DB) + + # { Port index : Queue index (SONiC) -> sai_id } + # ex: { "1:2" : "1000000000023" } + queue_name_map = db_conn.get_all(COUNTERS_DB, COUNTERS_QUEUE_NAME_MAP, blocking=True) + logger.debug("Queue name map:\n" + pprint.pformat(queue_name_map, indent=2)) + + # Parse the queue_name_map and create the following maps: + # port_queues_map -> {"if_index : queue_index" : sai_oid} + # queue_stat_map -> {queue stat table name : {counter name : value}} + # port_queue_list_map -> {if_index: [sorted queue list]} + port_queues_map = {} + queue_stat_map = {} + port_queue_list_map = {} + + for queue_name, sai_id in queue_name_map.items(): + port_name, queue_index = queue_name.decode().split(':') + queue_index = ''.join(i for i in queue_index if i.isdigit()) + port_index = get_index_from_str(port_name) + key = queue_key(port_index, queue_index) + port_queues_map[key] = sai_id + + queue_stat_name = queue_table(sai_id) + queue_stat = db_conn.get_all(COUNTERS_DB, queue_stat_name, blocking=False) + if queue_stat is not None: + queue_stat_map[queue_stat_name] = queue_stat + + if not port_queue_list_map.get(int(port_index)): + port_queue_list_map[int(port_index)] = [int(queue_index)] + else: + port_queue_list_map[int(port_index)].append(int(queue_index)) + + # SyncD consistency checks. + if not port_queues_map: + # In the event no queue exists that follows the SONiC pattern, no OIDs are able to be registered. + # A RuntimeError here will prevent the 'main' module from loading. (This is desirable.) + logger.error("No queues found in the Counter DB. SyncD database is incoherent.") + raise RuntimeError('The port_queues_map is not defined') + elif not queue_stat_map: + logger.error("No queue stat counters found in the Counter DB. SyncD database is incoherent.") + raise RuntimeError('The queue_stat_map is not defined') + + for queues in port_queue_list_map.values(): + queues.sort() + + return port_queues_map, queue_stat_map, port_queue_list_map + diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py b/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py index 04a4015d5a..e295a873b0 100644 --- a/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py +++ b/src/sonic_ax_impl/mibs/vendor/cisco/__init__.py @@ -1,2 +1,4 @@ from . import mgmt, bgp4 +from . import ciscoPfcExtMIB +from . import ciscoSwitchQosMIB from . import ciscoEntityFruControlMIB diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py new file mode 100644 index 0000000000..7fa8d94f97 --- /dev/null +++ b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py @@ -0,0 +1,275 @@ +from enum import unique, Enum +from bisect import bisect_right + +from sonic_ax_impl import mibs +from ax_interface import MIBMeta, ValueType, MIBUpdater, MIBEntry, SubtreeMIBEntry +from ax_interface.encodings import ObjectIdentifier + +class PfcUpdater(MIBUpdater): + """ + Class to update the info from Counter DB and to handle the SNMP request + """ + def __init__(self): + super().__init__() + self.db_conn = mibs.init_db() + + self.if_name_map = {} + self.if_alias_map = {} + self.if_id_map = {} + self.oid_sai_map = {} + self.oid_name_map = {} + + self.lag_name_if_name_map = {} + self.if_name_lag_name_map = {} + self.oid_lag_name_map = {} + + # cache of interface counters + self.if_counters = {} + self.if_range = [] + + def reinit_data(self): + """ + Subclass update interface information + """ + self.if_name_map, \ + self.if_alias_map, \ + self.if_id_map, \ + self.oid_sai_map, \ + self.oid_name_map = mibs.init_sync_d_interface_tables(self.db_conn) + + self.update_data() + + def update_data(self): + """ + Update redis (caches config) + Pulls the table references for each interface. + """ + self.if_counters = \ + {sai_id: self.db_conn.get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) + for sai_id in self.if_id_map} + + self.lag_name_if_name_map, \ + self.if_name_lag_name_map, \ + self.oid_lag_name_map = mibs.init_sync_d_lag_tables(self.db_conn) + + self.if_range = sorted(list(self.oid_sai_map.keys()) + list(self.oid_lag_name_map.keys())) + self.if_range = [(i,) for i in self.if_range] + + def get_next(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the next sub id. + """ + try: + if not sub_id: + return self.if_range[0] + + right = bisect_right(self.if_range, sub_id) + if right >= len(self.if_range): + return None + return self.if_range[right] + except (IndexError, KeyError) as e: + mibs.logger.error("failed to get next oid with error = {}".format(str(e))) + + def get_oid(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the interface OID. + """ + if sub_id is None or sub_id not in self.if_range: + return None + + return sub_id[0] + + def _get_counter(self, oid, counter_name): + """ + :param sub_id: The interface OID. + :param counter_name: the redis table (either IntEnum or string literal) to query. + :return: the counter for the respective sub_id/table. + """ + sai_id = self.oid_sai_map[oid] + + # Enum.name or counter_name = 'name_of_the_table' + _counter_name = bytes(getattr(counter_name, 'name', counter_name), 'utf-8') + + try: + counter_value = self.if_counters[sai_id][_counter_name] + counter_value = int(counter_value) + # done! + return counter_value + except KeyError as e: + mibs.logger.warning("SyncD 'COUNTERS_DB' missing attribute '{}'.".format(e)) + return None + + def cpfc_if_requests(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the counter for the respective sub_id/table. + """ + oid = self.get_oid(sub_id) + if oid is None: + return None + + counter_name = 'SAI_PORT_STAT_PFC_3_RX_PKTS' + + if oid in self.oid_lag_name_map: + counter_value = 0 + for lag_member in self.lag_name_if_name_map[self.oid_lag_name_map[oid]]: + counter_value += self._get_counter(mibs.get_index(lag_member), counter_name) + + return counter_value + else: + return self._get_counter(oid, counter_name) + + + def cpfc_if_indications(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the counter for the respective sub_id/table. + """ + oid = self.get_oid(sub_id) + if oid is None: + return None + + counter_name = 'SAI_PORT_STAT_PFC_3_TX_PKTS' + + if oid in self.oid_lag_name_map: + counter_value = 0 + for lag_member in self.lag_name_if_name_map[self.oid_lag_name_map[oid]]: + counter_value += self._get_counter(mibs.get_index(lag_member), counter_name) + + return counter_value + else: + return self._get_counter(oid, counter_name) + + +class PfcPrioUpdater(PfcUpdater): + def __init__(self): + super().__init__() + self.min_prio = 1 + self.max_prio = 8 + + def queue_index(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the 0-based interface ID. + """ + if len(sub_id) >= 2: + return sub_id[1] - 1 + return None + + def get_next(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the next sub id. + """ + try: + if not sub_id: + return self.if_range[0][0], self.min_prio + + if len(sub_id) < 2: + return sub_id[0], self.min_prio + + if sub_id[1] >= self.max_prio: + idx = self.if_range.index((sub_id[0],)) + return self.if_range[idx + 1][0], self.min_prio + + right = sub_id[1] + 1 + + return sub_id[0], right + except IndexError: + # Reached the last element. Return None to notify caller + return None + except Exception as e: + mibs.logger.error("failed to get next oid with error = {}".format(str(e))) + return None + + def requests_per_priority(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the counter for the respective sub_id/table. + """ + port_oid = '' + queue_index = '' + try: + if not sub_id: + return None + + port_oid = self.get_oid((sub_id[0],)) + queue_index = self.queue_index(sub_id) + if port_oid is None or queue_index is None: + return None + except Exception as e: + mibs.logger.warning("requestsPerPriority: incorrect sub_id = {} error: {}".format(str(sub_id), e)) + return None + + counter_name = 'SAI_PORT_STAT_PFC_' + str(queue_index) + '_RX_PKTS' + + if port_oid in self.oid_lag_name_map: + counter_value = 0 + for lag_member in self.lag_name_if_name_map[self.oid_lag_name_map[port_oid]]: + counter_value += self._get_counter(mibs.get_index(lag_member), counter_name) + + return counter_value + else: + return self._get_counter(port_oid, counter_name) + + def indications_per_priority(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the counter for the respective sub_id/table. + """ + port_oid = '' + queue_index = '' + try: + if not sub_id: + return None + + port_oid = self.get_oid((sub_id[0],)) + queue_index = self.queue_index(sub_id) + if port_oid is None or queue_index is None: + return None + except IndexError: + mibs.logger.warning("indicationsPerPriority: incorrect sub_id = {}".format(str(sub_id))) + return None + + counter_name = 'SAI_PORT_STAT_PFC_' + str(queue_index) + '_TX_PKTS' + + if port_oid in self.oid_lag_name_map: + counter_value = 0 + for lag_member in self.lag_name_if_name_map[self.oid_lag_name_map[port_oid]]: + counter_value += self._get_counter(mibs.get_index(lag_member), counter_name) + + return counter_value + else: + return self._get_counter(port_oid, counter_name) + + +# cpfcIfTable = '1.1' +# cpfcIfEntry = '1.1.1.x' +class cpfcIfTable(metaclass=MIBMeta, prefix='.1.3.6.1.4.1.9.9.813.1.1'): + """ + 'ciscoPfcExtMIB' http://oidref.com/1.3.6.1.4.1.9.9.813.1.1 + """ + pfc_updater = PfcUpdater() + + ifRequests = \ + SubtreeMIBEntry('1.1', pfc_updater, ValueType.INTEGER, pfc_updater.cpfc_if_requests) + + ifIndications = \ + SubtreeMIBEntry('1.2', pfc_updater, ValueType.INTEGER, pfc_updater.cpfc_if_indications) + + +# cpfcIfPriorityTable = '1.2' +# cpfcIfPriorityEntry = '1.2.x' +class cpfcIfPriorityTable(metaclass=MIBMeta, prefix='.1.3.6.1.4.1.9.9.813.1.2'): + """ + 'ciscoPfcExtMIB' http://oidref.com/1.3.6.1.4.1.9.9.813 + """ + pfc_updater = PfcPrioUpdater() + + prioRequests = \ + SubtreeMIBEntry('1.2', pfc_updater, ValueType.INTEGER, pfc_updater.requests_per_priority) + + prioIndications = \ + SubtreeMIBEntry('1.3', pfc_updater, ValueType.INTEGER, pfc_updater.indications_per_priority) diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py new file mode 100644 index 0000000000..bf1f13b015 --- /dev/null +++ b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py @@ -0,0 +1,213 @@ +from enum import unique, Enum +from bisect import bisect_right + +from sonic_ax_impl import mibs +from ax_interface import MIBMeta, ValueType, MIBUpdater, MIBEntry, SubtreeMIBEntry +from ax_interface.encodings import ObjectIdentifier + +# Maps SNMP queue stat counters to SAI counters and type +CounterMap = { + # Unicast send packets + (b'SAI_QUEUE_STAT_PACKETS', b'SAI_QUEUE_TYPE_UNICAST'): 1, + # Unicast send bytes + (b'SAI_QUEUE_STAT_BYTES', b'SAI_QUEUE_TYPE_UNICAST'): 2, + # Multicast send packets + (b'SAI_QUEUE_STAT_PACKETS',b'SAI_QUEUE_TYPE_MULTICAST'): 3, + # Multicast send bytes + (b'SAI_QUEUE_STAT_BYTES',b'SAI_QUEUE_TYPE_MULTICAST'): 4, + # Unicast dropped packets + (b'SAI_QUEUE_STAT_DROPPED_PACKETS',b'SAI_QUEUE_TYPE_UNICAST'): 5, + # Unicast dropped bytes + (b'SAI_QUEUE_STAT_DROPPED_BYTES',b'SAI_QUEUE_TYPE_UNICAST'): 6, + # Multicast dropped packets + (b'SAI_QUEUE_STAT_DROPPED_PACKETS',b'SAI_QUEUE_TYPE_MULTICAST'): 7, + # Multicast dropped bytes + (b'SAI_QUEUE_STAT_DROPPED_BYTES', b'SAI_QUEUE_TYPE_MULTICAST'): 8 +} + + +class DirectionTypes(int, Enum): + """ + Queue direction types + """ + INGRESS = 1 + EGRESS = 2 + + +class QueueStatUpdater(MIBUpdater): + """ + Class to update the info from Counter DB and to handle the SNMP request + """ + def __init__(self): + """ + init the updater + """ + super().__init__() + self.db_conn = mibs.init_db() + self.lag_name_if_name_map = {} + self.if_name_lag_name_map = {} + self.oid_lag_name_map = {} + self.queue_type_map = {} + + self.if_name_map = {} + self.if_alias_map = {} + self.if_id_map = {} + self.oid_sai_map = {} + self.oid_name_map = {} + + self.port_queues_map = {} + self.queue_stat_map = {} + self.port_queue_list_map = {} + + self.mib_oid_to_queue_map = {} + self.mib_oid_list = [] + + self.queue_type_map = {} + + def reinit_data(self): + """ + Subclass update interface information + """ + self.if_name_map, \ + self.if_alias_map, \ + self.if_id_map, \ + self.oid_sai_map, \ + self.oid_name_map = mibs.init_sync_d_interface_tables(self.db_conn) + + self.port_queues_map, self.queue_stat_map, self.port_queue_list_map = \ + mibs.init_sync_d_queue_tables(self.db_conn) + + self.queue_type_map = self.db_conn.get_all(mibs.COUNTERS_DB, "COUNTERS_QUEUE_TYPE_MAP", blocking=False) + + self.update_data() + + def update_data(self): + """ + Update redis (caches config) + Pulls the table references for each queue. + """ + for queue_key, sai_id in self.port_queues_map.items(): + queue_stat_name = mibs.queue_table(sai_id) + queue_stat = self.db_conn.get_all(mibs.COUNTERS_DB, queue_stat_name, blocking=False) + if queue_stat is not None: + self.queue_stat_map[queue_stat_name] = queue_stat + + self.lag_name_if_name_map, \ + self.if_name_lag_name_map, \ + self.oid_lag_name_map = mibs.init_sync_d_lag_tables(self.db_conn) + + self.update_stats() + + def update_stats(self): + """ + Update statistics. + 1. Get and sort port list to keep the order in MIB + 2. Prepare OID and get a statistic for each queue of each port + 3. Get and sort LAG ports list to keep the order in MIB + 4. Prepare OID for LAG and prepare a statistic for each queue of each LAG port + """ + # Clear previous data + self.mib_oid_to_queue_map = {} + self.mib_oid_list = [] + + # Sort the ports to keep the OID order in the MIB + if_range = sorted(list(self.oid_sai_map.keys())) + # Update queue counters for port + for if_index in if_range: + if if_index not in self.port_queue_list_map: + # Port does not has a queues, continue.. + continue + if_queues = self.port_queue_list_map[if_index] + + for queue in if_queues: + # Get queue type and statistics + queue_sai_oid = self.port_queues_map[mibs.queue_key(if_index, queue)] + queue_stat_table_name = mibs.queue_table(queue_sai_oid) + queue_type = self.queue_type_map.get(queue_sai_oid) + queue_stat = self.queue_stat_map.get(queue_stat_table_name, {}) + + # Add supported counters to MIBs list and store counters values + for (counter, counter_type), counter_mib_id in CounterMap.items(): + # Only egress queues are supported + mib_oid = (if_index, int(DirectionTypes.EGRESS), queue + 1, counter_mib_id) + + counter_value = 0 + if queue_type == counter_type: + counter_value = int(queue_stat.get(counter, 0)) + + self.mib_oid_list.append(mib_oid) + self.mib_oid_to_queue_map[mib_oid] = counter_value + + # Sort the LAG ports to keep the OID order in the MIB + lag_range = sorted(list(self.oid_lag_name_map.keys())) + # Update queue counters for LAG + for lag_index in lag_range: + lag_oid_list = [] + lag_oid_to_queue_map = {} + # Get counters for each LAG member + for lag_member in self.lag_name_if_name_map[self.oid_lag_name_map[lag_index]]: + lag_member_queues = [] + if mibs.get_index(lag_member) not in self.port_queue_list_map: + # LAG member does not has a queues, continue.. + continue + lag_member_queues = self.port_queue_list_map[mibs.get_index(lag_member)] + + for queue in lag_member_queues: + # Get queue type and statistics + queue_sai_oid = self.port_queues_map[mibs.queue_key(mibs.get_index(lag_member), queue)] + queue_stat_table_name = mibs.queue_table(queue_sai_oid) + queue_type = self.queue_type_map.get(queue_sai_oid) + queue_stat = self.queue_stat_map.get(queue_stat_table_name, {}) + + # Add supported counters to MIBs list and store counters values + for (counter, counter_type), counter_mib_id in CounterMap.items(): + # Only egress queues are supported + mib_oid = (lag_index, int(DirectionTypes.EGRESS), queue + 1, counter_mib_id) + + counter_value = 0 + if queue_type == counter_type: + counter_value = int(queue_stat.get(counter, 0)) + + if mib_oid not in lag_oid_list: + lag_oid_list.append(mib_oid) + lag_oid_to_queue_map[mib_oid] = counter_value + else: + lag_oid_to_queue_map[mib_oid] += counter_value + + # Append the LAG port counters to the MIB with keeping the OID order + self.mib_oid_list += lag_oid_list + self.mib_oid_to_queue_map.update(lag_oid_to_queue_map) + + def get_next(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the next sub id. + """ + + right = bisect_right(self.mib_oid_list, sub_id) + if right >= len(self.mib_oid_list): + return None + + return self.mib_oid_list[right] + + def handle_stat_request(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the counter for the respective sub_id/table. + """ + # if_index, if_direction, queue_index and counter id should be passed + + return self.mib_oid_to_queue_map.get(sub_id) + +class csqIfQosGroupStatsTable(metaclass=MIBMeta, prefix='.1.3.6.1.4.1.9.9.580.1.5.5'): + """ + 'csqIfQosGroupStatsTable' http://oidref.com/1.3.6.1.4.1.9.9.580.1.5.5 + """ + + queue_updater = QueueStatUpdater() + + # csqIfQosGroupStatsTable = '1.3.6.1.4.1.9.9.580.1.5.5' + # csqIfQosGroupStatsEntry = '1.3.6.1.4.1.9.9.580.1.5.5.1.4' + + queue_stat_request = \ + SubtreeMIBEntry('1.4', queue_updater, ValueType.INTEGER, queue_updater.handle_stat_request) diff --git a/tests/mock_tables/counters_db.json b/tests/mock_tables/counters_db.json index f9efd46107..936e24438d 100644 --- a/tests/mock_tables/counters_db.json +++ b/tests/mock_tables/counters_db.json @@ -81,7 +81,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x100000000000a": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -165,7 +183,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000020": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -249,7 +285,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000021": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -333,7 +387,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000022": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -417,7 +489,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x100000000000f": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -501,7 +591,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000010": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -585,7 +693,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x100000000001f": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -669,7 +795,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000006": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -753,7 +897,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x100000000001b": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -837,7 +999,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000018": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -921,7 +1101,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x100000000000b": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1005,7 +1203,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x100000000000c": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1089,7 +1305,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x100000000001c": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1173,7 +1407,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000005": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1257,7 +1509,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x100000000001e": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1341,7 +1611,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x100000000001d": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1425,7 +1713,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x100000000000d": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1509,7 +1815,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x100000000000e": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1593,7 +1917,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000019": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1677,7 +2019,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x100000000001a": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1761,7 +2121,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS_PORT_NAME_MAP": { "Ethernet8": "oid:0x1000000000017", @@ -1879,7 +2257,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000004": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1963,7 +2359,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000008": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -2047,7 +2461,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000011": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -2131,7 +2563,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000003": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -2215,7 +2665,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000013": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -2299,7 +2767,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000012": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -2383,7 +2869,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000015": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -2467,7 +2971,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000014": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -2551,7 +3073,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000017": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -2635,7 +3175,25 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, "COUNTERS:oid:0x1000000000016": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -2719,6 +3277,268 @@ "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0" + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" + }, + "COUNTERS_QUEUE_NAME_MAP": { + "Ethernet0:0": "oid:0x15000000000230", + "Ethernet0:1": "oid:0x15000000000231", + "Ethernet0:2": "oid:0x15000000000232", + "Ethernet0:3": "oid:0x15000000000233", + "Ethernet0:4": "oid:0x15000000000234", + "Ethernet0:5": "oid:0x15000000000235", + "Ethernet0:6": "oid:0x15000000000236", + "Ethernet0:7": "oid:0x15000000000237", + "Ethernet4:0": "oid:0x15000000000240", + "Ethernet4:1": "oid:0x15000000000241", + "Ethernet4:2": "oid:0x15000000000242", + "Ethernet4:3": "oid:0x15000000000243", + "Ethernet4:4": "oid:0x15000000000244", + "Ethernet4:5": "oid:0x15000000000245", + "Ethernet4:6": "oid:0x15000000000246", + "Ethernet4:7": "oid:0x15000000000247", + "Ethernet8:0": "oid:0x15000000000250", + "Ethernet8:1": "oid:0x15000000000251", + "Ethernet8:2": "oid:0x15000000000252", + "Ethernet8:3": "oid:0x15000000000253", + "Ethernet8:4": "oid:0x15000000000254", + "Ethernet8:5": "oid:0x15000000000255", + "Ethernet8:6": "oid:0x15000000000256", + "Ethernet8:7": "oid:0x15000000000257" + }, + "COUNTERS_QUEUE_TYPE_MAP": { + "oid:0x15000000000230": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000231": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000232": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000233": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000234": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000235": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000236": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000237": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000240": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000241": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000242": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000243": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000244": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000245": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000246": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000247": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000250": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000251": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000252": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000253": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000254": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000255": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000256": "SAI_QUEUE_TYPE_UNICAST", + "oid:0x15000000000257": "SAI_QUEUE_TYPE_UNICAST" + }, + "COUNTERS:oid:0x15000000000230": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000231": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000232": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000233": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000234": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000235": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000236": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000237": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000240": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000241": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000242": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000243": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000244": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000245": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000246": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000247": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000250": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000251": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000252": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000253": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000254": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000255": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000256": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" + }, + "COUNTERS:oid:0x15000000000257": { + "SAI_QUEUE_STAT_PACKETS": "1", + "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", + "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", + "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", + "SAI_QUEUE_STAT_WATERMARK_BYTES": "6" } } diff --git a/tests/test_pfc.py b/tests/test_pfc.py new file mode 100644 index 0000000000..f3c4537b9b --- /dev/null +++ b/tests/test_pfc.py @@ -0,0 +1,205 @@ +import os +import sys + +# noinspection PyUnresolvedReferences +import tests.mock_tables.dbconnector + +modules_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, os.path.join(modules_path, 'src')) + +from unittest import TestCase + +from ax_interface import ValueType +from ax_interface.pdu_implementations import GetPDU, GetNextPDU +from ax_interface.encodings import ObjectIdentifier +from ax_interface.constants import PduTypes +from ax_interface.pdu import PDU, PDUHeader +from ax_interface.mib import MIBTable +from sonic_ax_impl.mibs.vendor.cisco import ciscoPfcExtMIB + +class TestPfcPortCounters(TestCase): + @classmethod + def setUpClass(cls): + cls.lut_port = MIBTable(ciscoPfcExtMIB.cpfcIfTable) + cls.lut_prio = MIBTable(ciscoPfcExtMIB.cpfcIfPriorityTable) + + # Update MIBs + for updater in cls.lut_port.updater_instances: + updater.reinit_data() + updater.update_data() + for updater in cls.lut_prio.updater_instances: + updater.reinit_data() + updater.update_data() + + def test_getPduRequestForPort(self): + oid = ObjectIdentifier(32, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 1, 1, 1, 1)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut_port) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, 4) + + def test_getNextPduRequestForPort(self): + oid = ObjectIdentifier(32, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 1, 1, 1, 1)) + expected_oid = ObjectIdentifier(32, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 1, 1, 1, 5)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET_NEXT, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut_port) + print(response) + + n = len(response.values) + print('values = ' + str(n)) + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(expected_oid)) + self.assertEqual(value0.data, 4) + + def test_getPduIndicationForPort(self): + oid = ObjectIdentifier(32, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 1, 1, 2, 1)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut_port) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, 4) + + def test_getNextPduindicationForPort(self): + oid = ObjectIdentifier(32, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 1, 1, 2, 1)) + expected_oid = ObjectIdentifier(32, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 1, 1, 2, 5)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut_port) + print(response) + + n = len(response.values) + print('values = ' + str(n)) + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(expected_oid)) + self.assertEqual(value0.data, 4) + + def test_getPduRequestForPriority(self): + oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 2, 1, 2, 1, 1)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut_prio) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, 1) + + def test_getNextPduRequestForPriority(self): + oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 2, 1, 2, 1, 2)) + expected_oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 2, 1, 2, 1, 3)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut_prio) + print(response) + + n = len(response.values) + print('values = ' + str(n)) + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(expected_oid)) + self.assertEqual(value0.data, 3) + + def test_getPduIndicationForPriority(self): + oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 2, 1, 3, 5, 1)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut_prio) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, 1) + + def test_getNextPduindicationForPriority(self): + oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 2, 1, 3, 1, 1)) + expected_oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 2, 1, 3, 1, 2)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut_prio) + print(response) + + n = len(response.values) + print('values = ' + str(n)) + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(expected_oid)) + self.assertEqual(value0.data, 2) + + def test_getPfcSubtree(self): + # Subtree for port + oid = ObjectIdentifier(32, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 1)) + expected_oid = ObjectIdentifier(32, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 1, 1, 1, 1)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET_NEXT, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut_port) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(expected_oid)) + self.assertEqual(value0.data, 4) + + # Subtree for Priority + oid = ObjectIdentifier(33, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 2)) + expected_oid = ObjectIdentifier(33, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 2, 1, 2, 1, 1)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET_NEXT, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut_prio) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(expected_oid)) + self.assertEqual(value0.data, 1) diff --git a/tests/test_queues_stat.py b/tests/test_queues_stat.py new file mode 100644 index 0000000000..37c7fbb244 --- /dev/null +++ b/tests/test_queues_stat.py @@ -0,0 +1,110 @@ +import os +import sys + +# noinspection PyUnresolvedReferences +import tests.mock_tables.dbconnector + +modules_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, os.path.join(modules_path, 'src')) + +from unittest import TestCase + +from ax_interface import ValueType +from ax_interface.pdu_implementations import GetPDU, GetNextPDU +from ax_interface.encodings import ObjectIdentifier +from ax_interface.constants import PduTypes +from ax_interface.pdu import PDU, PDUHeader +from ax_interface.mib import MIBTable +from sonic_ax_impl.mibs.vendor.cisco import ciscoSwitchQosMIB + +class TestQueueCounters(TestCase): + @classmethod + def setUpClass(cls): + cls.lut = MIBTable(ciscoSwitchQosMIB.csqIfQosGroupStatsTable) + + # Update MIBs + for updater in cls.lut.updater_instances: + updater.reinit_data() + updater.update_data() + + def test_getQueueCounters(self): + for counter_id in range(1, 8): + oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 580, 1, 5, 5, 1, 4, 1, 2, 1, 1)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, 1) + + def test_getNextPduForQueueCounter(self): + oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 580, 1, 5, 5, 1, 4, 1, 2, 1, 1)) + expected_oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 580, 1, 5, 5, 1, 4, 1, 2, 1, 2)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET_NEXT, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(expected_oid)) + self.assertEqual(value0.data, 2) + + def test_getIngressQueueCounters(self): + oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 580, 1, 5, 5, 1, 4, 1, 1, 1, 1)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.NO_SUCH_INSTANCE) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, None) + + def test_getMulticastQueueCounters(self): + oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 580, 1, 5, 5, 1, 4, 1, 2, 1, 3)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.NO_SUCH_INSTANCE) + self.assertEqual(str(value0.name), str(oid)) + self.assertEqual(value0.data, None) + + def test_getSubtreeForQueueCounters(self): + oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 580, 1, 5, 5)) + expected_oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 580, 1, 5, 5, 1, 4, 1, 2, 1, 1)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET_NEXT, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(expected_oid)) + self.assertEqual(value0.data, 1) From f0cbfff09066e372c1fe99983692a1dd719e5e80 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 23 Jan 2018 23:20:02 +0000 Subject: [PATCH 5/5] Fix Pfc/Qos counter integer range Signed-off-by: Qi Luo --- src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py | 2 +- src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py | 5 ++++- tests/mock_tables/counters_db.json | 4 ++-- tests/test_pfc.py | 4 ++-- tests/test_queues_stat.py | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py index 7fa8d94f97..0600c55aa8 100644 --- a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py +++ b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py @@ -94,7 +94,7 @@ def _get_counter(self, oid, counter_name): try: counter_value = self.if_counters[sai_id][_counter_name] - counter_value = int(counter_value) + counter_value = int(counter_value) & 0x00000000ffffffff # done! return counter_value except KeyError as e: diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py index bf1f13b015..b1db234215 100644 --- a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py +++ b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py @@ -197,7 +197,10 @@ def handle_stat_request(self, sub_id): """ # if_index, if_direction, queue_index and counter id should be passed - return self.mib_oid_to_queue_map.get(sub_id) + if sub_id in self.mib_oid_to_queue_map: + return self.mib_oid_to_queue_map[sub_id] & 0x00000000ffffffff + else: + return None class csqIfQosGroupStatsTable(metaclass=MIBMeta, prefix='.1.3.6.1.4.1.9.9.580.1.5.5'): """ diff --git a/tests/mock_tables/counters_db.json b/tests/mock_tables/counters_db.json index 936e24438d..19ceeb0fdf 100644 --- a/tests/mock_tables/counters_db.json +++ b/tests/mock_tables/counters_db.json @@ -1104,7 +1104,7 @@ "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", - "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "209347219842134092490", "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", @@ -3351,7 +3351,7 @@ }, "COUNTERS:oid:0x15000000000230": { "SAI_QUEUE_STAT_PACKETS": "1", - "SAI_QUEUE_STAT_BYTES": "2", + "SAI_QUEUE_STAT_BYTES": "23492723984237432", "SAI_QUEUE_STAT_DROPPED_PACKETS": "3", "SAI_QUEUE_STAT_DISCARD_DROPPED_PACKETS": "4", "SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "5", diff --git a/tests/test_pfc.py b/tests/test_pfc.py index f3c4537b9b..6b617e74e6 100644 --- a/tests/test_pfc.py +++ b/tests/test_pfc.py @@ -115,7 +115,7 @@ def test_getPduRequestForPriority(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.INTEGER) self.assertEqual(str(value0.name), str(oid)) - self.assertEqual(value0.data, 1) + self.assertEqual(value0.data, 209347219842134092490 % pow(2, 32)) # Test integer truncation def test_getNextPduRequestForPriority(self): oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 813, 1, 2, 1, 2, 1, 2)) @@ -202,4 +202,4 @@ def test_getPfcSubtree(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.INTEGER) self.assertEqual(str(value0.name), str(expected_oid)) - self.assertEqual(value0.data, 1) + self.assertEqual(value0.data, 209347219842134092490 % pow(2, 32)) # Test integer truncation diff --git a/tests/test_queues_stat.py b/tests/test_queues_stat.py index 37c7fbb244..58f6771428 100644 --- a/tests/test_queues_stat.py +++ b/tests/test_queues_stat.py @@ -59,7 +59,7 @@ def test_getNextPduForQueueCounter(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.INTEGER) self.assertEqual(str(value0.name), str(expected_oid)) - self.assertEqual(value0.data, 2) + self.assertEqual(value0.data, 23492723984237432 & 0x00000000ffffffff) # Test integer truncation def test_getIngressQueueCounters(self): oid = ObjectIdentifier(8, 0, 0, 0, (1, 3, 6, 1, 4, 1, 9, 9, 580, 1, 5, 5, 1, 4, 1, 1, 1, 1))