From fc897a7fe2f0195bc8bf45930ce8b149fbfaa308 Mon Sep 17 00:00:00 2001 From: "Brad House (nexthop)" Date: Wed, 9 Apr 2025 10:15:04 -0400 Subject: [PATCH] dot3 SNMP counters as per RFC3635 dot3 statistics are used for monitoring and debugging and are common among switch vendors to have implemented. This commit implements the dot3StatsTable and dot3HCStatsTable. Based on the code in rfc1213.py and rfc2863.py. Signed-off-by: Brad House --- src/sonic_ax_impl/main.py | 3 +- src/sonic_ax_impl/mibs/ietf/rfc3635.py | 400 +++++++++++++++++++++++++ tests/mock_tables/counters_db.json | 315 +++++++++++++++++-- tests/test_rfc3635.py | 70 +++++ 4 files changed, 766 insertions(+), 22 deletions(-) create mode 100644 src/sonic_ax_impl/mibs/ietf/rfc3635.py create mode 100644 tests/test_rfc3635.py diff --git a/src/sonic_ax_impl/main.py b/src/sonic_ax_impl/main.py index c798ab690..c9d1e4585 100644 --- a/src/sonic_ax_impl/main.py +++ b/src/sonic_ax_impl/main.py @@ -11,7 +11,7 @@ import ax_interface from sonic_ax_impl.mibs import ieee802_1ab, Namespace from . import logger -from .mibs.ietf import rfc1213, rfc2737, rfc2863, rfc3433, rfc4292, rfc4363 +from .mibs.ietf import rfc1213, rfc2737, rfc2863, rfc3433, rfc3635, rfc4292, rfc4363 from .mibs.vendor import dell, cisco # Background task update frequency ( in seconds ) @@ -27,6 +27,7 @@ class SonicMIB( rfc1213.SysNameMIB, rfc2737.PhysicalTableMIB, rfc3433.PhysicalSensorTableMIB, + rfc3635.etherMIBObjects, rfc2863.InterfaceMIBObjects, rfc4363.QBridgeMIBObjects, rfc4292.IpCidrRouteTable, diff --git a/src/sonic_ax_impl/mibs/ietf/rfc3635.py b/src/sonic_ax_impl/mibs/ietf/rfc3635.py new file mode 100644 index 000000000..285ea1279 --- /dev/null +++ b/src/sonic_ax_impl/mibs/ietf/rfc3635.py @@ -0,0 +1,400 @@ +from enum import Enum, unique +from bisect import bisect_right + +from sonic_ax_impl import mibs +from ax_interface.mib import MIBMeta, MIBUpdater, ValueType, SubtreeMIBEntry, OverlayAdpaterMIBEntry, OidMIBEntry +from sonic_ax_impl.mibs import Namespace + +@unique +class DbTables32(int, Enum): + """ + Maps database tables names to SNMP sub-identifiers. + https://datatracker.ietf.org/doc/html/rfc3635#section-4 + + REDIS_TABLE_NAME = (RFC3635 OID NUMBER) + """ + + # dot3StatsAlignmentErrors ::= { dot3StatsEntry 2 } + SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS = 2 + # dot3StatsFCSErrors ::= { dot3StatsEntry 3 } + SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS = 3 + # dot3StatsSingleCollisionFrames ::= { dot3StatsEntry 4 } + SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES = 4 + # dot3StatsMultipleCollisionFrames ::= { dot3StatsEntry 5 } + SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES = 5 + # dot3StatsSQETestErrors ::= { dot3StatsEntry 6 } + SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS = 6 + # dot3StatsDeferredTransmissions ::= { dot3StatsEntry 7 } + SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS = 7 + # dot3StatsLateCollisions ::= { dot3StatsEntry 8 } + SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS = 8 + # dot3StatsExcessiveCollisions ::= { dot3StatsEntry 9 } + SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS = 9 + # dot3StatsInternalMacTransmitErrors ::= { dot3StatsEntry 10 } + SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS = 10 + # dot3StatsCarrierSenseErrors ::= { dot3StatsEntry 11 } + SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS = 11 + # { dot3StatsEntry 12 } is not assigned + # dot3StatsFrameTooLongs ::= { dot3StatsEntry 13 } + SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS = 13 + # { dot3StatsEntry 14 } is not assigned + # { dot3StatsEntry 15 } is not assigned + # dot3StatsInternalMacReceiveErrors ::= { dot3StatsEntry 16 } + SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS = 16 + # dot3StatsEtherChipSet ::= { dot3StatsEntry 17 } -- deprecated + # dot3StatsSymbolErrors ::= { dot3StatsEntry 18 } + SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS = 18 + # dot3StatsDuplexStatus ::= { dot3StatsEntry 19} -- no SAI stat + # dot3StatsRateControlAbility ::= { dot3StatsEntry 20 } -- no SAI stat + # dot3StatsRateControlStatus ::= { dot3StatsEntry 21 } -- no SAI stat + + +@unique +class DbTables64(int, Enum): + # dot3HCStatsAlignmentErrors ::= { dot3HCStatsEntry 1 } + SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS = 1 + # dot3HCStatsFCSErrors ::= { dot3HCStatsEntry 2 } + SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS = 2 + # dot3HCStatsInternalMacTransmitErrors ::= { dot3HCStatsEntry 3 } + SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS = 3 + # dot3HCStatsFrameTooLongs ::= { dot3HCStatsEntry 4 } + SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS = 4 + # dot3HCStatsInternalMacReceiveErrors ::= { dot3HCStatsEntry 5 } + SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS = 5 + # dot3HCStatsSymbolErrors ::= { dot3HCStatsEntry 6 } + SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS = 6 + + +class dot3MIBUpdater(MIBUpdater): + def __init__(self): + super().__init__() + + self.db_conn = Namespace.init_namespace_dbs() + + self.lag_name_if_name_map = {} + self.if_name_lag_name_map = {} + self.oid_lag_name_map = {} + self.mgmt_oid_name_map = {} + self.mgmt_alias_map = {} + self.vlan_oid_name_map = {} + self.vlan_name_map = {} + self.if_counters = {} + self.if_range = [] + self.if_name_map = {} + self.if_alias_map = {} + self.if_id_map = {} + self.oid_name_map = {} + self.rif_counters = {} + + self.namespace_db_map = Namespace.get_namespace_db_map(self.db_conn) + + def reinit_connection(self): + Namespace.connect_namespace_dbs(self.db_conn) + + def reinit_data(self): + """ + Subclass update interface information + """ + self.if_name_map, \ + self.if_alias_map, \ + self.if_id_map, \ + self.oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_interface_tables, self.db_conn) + + self.lag_name_if_name_map, \ + self.if_name_lag_name_map, \ + self.oid_lag_name_map, _, _ = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, self.db_conn) + """ + db_conn - will have db_conn to all namespace DBs and + global db. First db in the list is global db. + Use first global db to get management interface table. + """ + self.mgmt_oid_name_map, \ + self.mgmt_alias_map = mibs.init_mgmt_interface_tables(self.db_conn[0]) + + self.vlan_name_map, \ + self.vlan_oid_sai_map, \ + self.vlan_oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_vlan_tables, self.db_conn) + + self.if_range = sorted(list(self.oid_name_map.keys()) + + list(self.oid_lag_name_map.keys()) + + list(self.mgmt_oid_name_map.keys()) + + list(self.vlan_oid_name_map.keys())) + self.if_range = [(i,) for i in self.if_range] + + def update_data(self): + """ + Update redis (caches config) + Pulls the table references for each interface. + """ + for sai_id_key in self.if_id_map: + namespace, sai_id = mibs.split_sai_id_key(sai_id_key) + if_idx = mibs.get_index_from_str(self.if_id_map[sai_id_key]) + counter_table = self.namespace_db_map[namespace].get_all(mibs.COUNTERS_DB, \ + mibs.counter_table(sai_id)) + if counter_table is None: + counter_table = {} + self.if_counters[if_idx] = counter_table + + self.lag_name_if_name_map, \ + self.if_name_lag_name_map, \ + self.oid_lag_name_map, \ + self.lag_sai_map, _ = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, self.db_conn) + + self.if_range = sorted(list(self.oid_name_map.keys()) + + list(self.oid_lag_name_map.keys()) + + list(self.mgmt_oid_name_map.keys()) + + list(self.vlan_oid_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. + """ + right = bisect_right(self.if_range, sub_id) + if right == len(self.if_range): + return None + return self.if_range[right] + + def get_oid(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the interface OID. + """ + if sub_id not in self.if_range: + return + + return sub_id[0] + + def if_index(self, sub_id): + """ + :param sub_id: The 1-based sub-identifier query. + :return: the 0-based interface ID. + """ + if sub_id: + return self.get_oid(sub_id) - 1 + + def get_counter32(self, sub_id, table_name): + oid = self.get_oid(sub_id) + if not oid: + return + + return self._get_counter(oid, table_name, 0x00000000ffffffff) + + def get_counter64(self, sub_id, table_name): + oid = self.get_oid(sub_id) + if not oid: + return + + return self._get_counter(oid, table_name, 0xffffffffffffffff) + + def _get_counter(self, oid, table_name, mask): + """ + :param oid: The 1-based sub-identifier query. + :param table_name: the redis table (either IntEnum or string literal) to query. + :param mask: mask to apply to counter + :return: the counter for the respective sub_id/table. + """ + + if oid in self.mgmt_oid_name_map: + # TODO: mgmt counters not available through SNMP right now + # COUNTERS DB does not have support for generic linux (mgmt) interface counters + return 0 + + 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]]: + member_counter = self._get_counter(mibs.get_index_from_str(lag_member), table_name, mask) + if member_counter is not None: + counter_value += member_counter + else: + return None + + return counter_value & mask + + # Enum.name or table_name = 'name_of_the_table' + _table_name = getattr(table_name, 'name', table_name) + try: + counter_value = self.if_counters[oid][_table_name] + # truncate to 32-bit counter (database implements 64-bit counters) + counter_value = int(counter_value) & mask + # done! + return counter_value + except KeyError as e: + mibs.logger.warning("SyncD 'COUNTERS_DB' missing attribute '{}'.".format(e)) + return None + + def _get_if_entry(self, oid): + """ + :param oid: The 1-based sub-identifier query. + :return: the DB entry for the respective sub_id. + """ + if_table = "" + # Once PORT_TABLE will be moved to CONFIG DB + # we will get entry from CONFIG_DB for all cases + db = mibs.APPL_DB + if oid in self.oid_lag_name_map: + if_table = mibs.lag_entry_table(self.oid_lag_name_map[oid]) + elif oid in self.mgmt_oid_name_map: + if_table = mibs.mgmt_if_entry_table(self.mgmt_oid_name_map[oid]) + db = mibs.CONFIG_DB + elif oid in self.vlan_oid_name_map: + if_table = mibs.vlan_entry_table(self.vlan_oid_name_map[oid]) + elif oid in self.oid_name_map: + if_table = mibs.if_entry_table(self.oid_name_map[oid]) + else: + return None + + return Namespace.dbs_get_all(self.db_conn, db, if_table, blocking=True) + + +class etherMIBObjects(metaclass=MIBMeta, prefix='.1.3.6.1.2.1.10.7'): + """ + 'etherMIBObjects' https://datatracker.ietf.org/doc/html/rfc3635#section-4 + """ + if_updater = dot3MIBUpdater() + + oidtree_updater = mibs.RedisOidTreeUpdater(prefix_str='1.3.6.1.2.1.10.7') + + # dot3StatsTable = '2' + # dot3StatsEntry = '2.1' + + ifIndex = \ + SubtreeMIBEntry('2.1.1', if_updater, ValueType.INTEGER, if_updater.if_index) + + dot3StatsAlignmentErrors = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.2', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(2)), + OidMIBEntry('2.1.2', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + dot3StatsFCSErrors = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.3', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(3)), + OidMIBEntry('2.1.3', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + dot3StatsSingleCollisionFrames = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.4', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(4)), + OidMIBEntry('2.1.4', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + dot3StatsMultipleCollisionFrames = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.5', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(5)), + OidMIBEntry('2.1.5', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + dot3StatsSQETestErrors = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.6', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(6)), + OidMIBEntry('2.1.6', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + dot3StatsDeferredTransmissions = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.7', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(7)), + OidMIBEntry('2.1.7', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + dot3StatsLateCollisions = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.8', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(8)), + OidMIBEntry('2.1.8', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + dot3StatsExcessiveCollisions = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.9', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(9)), + OidMIBEntry('2.1.9', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + dot3StatsInternalMacTransmitErrors = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.10', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(10)), + OidMIBEntry('2.1.10', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + dot3StatsCarrierSenseErrors = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.11', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(11)), + OidMIBEntry('2.1.11', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + dot3StatsFrameTooLongs = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.13', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(13)), + OidMIBEntry('2.1.13', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + dot3StatsInternalMacReceiveErrors = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.16', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(16)), + OidMIBEntry('2.1.16', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + dot3StatsSymbolErrors = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('2.1.18', if_updater, ValueType.COUNTER_32, if_updater.get_counter32, + DbTables32(18)), + OidMIBEntry('2.1.18', ValueType.COUNTER_32, oidtree_updater.get_oidvalue) + ) + + # dot3HCStatsTable = '11' + # dot3HCStatsEntry = '11.1' + + dot3HCStatsAlignmentErrors = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('11.1.1', if_updater, ValueType.COUNTER_64, if_updater.get_counter64, + DbTables64(1)), + OidMIBEntry('11.1.1', ValueType.COUNTER_64, oidtree_updater.get_oidvalue) + ) + + dot3HCStatsFCSErrors = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('11.1.2', if_updater, ValueType.COUNTER_64, if_updater.get_counter64, + DbTables64(2)), + OidMIBEntry('11.1.2', ValueType.COUNTER_64, oidtree_updater.get_oidvalue) + ) + + dot3HCStatsInternalMacTransmitErrors = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('11.1.3', if_updater, ValueType.COUNTER_64, if_updater.get_counter64, + DbTables64(3)), + OidMIBEntry('11.1.3', ValueType.COUNTER_64, oidtree_updater.get_oidvalue) + ) + + dot3HCStatsFrameTooLongs = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('11.1.4', if_updater, ValueType.COUNTER_64, if_updater.get_counter64, + DbTables64(4)), + OidMIBEntry('11.1.4', ValueType.COUNTER_64, oidtree_updater.get_oidvalue) + ) + + dot3HCStatsInternalMacReceiveErrors = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('11.1.5', if_updater, ValueType.COUNTER_64, if_updater.get_counter64, + DbTables64(5)), + OidMIBEntry('11.1.5', ValueType.COUNTER_64, oidtree_updater.get_oidvalue) + ) + + dot3HCStatsInternalMacReceiveErrors = \ + OverlayAdpaterMIBEntry( + SubtreeMIBEntry('11.1.6', if_updater, ValueType.COUNTER_64, if_updater.get_counter64, + DbTables64(6)), + OidMIBEntry('11.1.6', ValueType.COUNTER_64, oidtree_updater.get_oidvalue) + ) + diff --git a/tests/mock_tables/counters_db.json b/tests/mock_tables/counters_db.json index 9f9c34857..bd0c78357 100755 --- a/tests/mock_tables/counters_db.json +++ b/tests/mock_tables/counters_db.json @@ -99,7 +99,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x100000000000a": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -201,7 +214,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x1000000000021": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -303,7 +329,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x1000000000022": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -405,7 +444,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x1000000000023": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -507,7 +559,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x100000000000f": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -609,7 +674,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x1000000000010": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -711,7 +789,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x100000000001f": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -813,7 +904,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x1000000000006": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -915,7 +1019,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x100000000001b": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1017,7 +1134,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x1000000000018": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1119,7 +1249,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x100000000000b": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1221,7 +1364,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x100000000000c": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1323,7 +1479,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x100000000001c": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1425,7 +1594,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x1000000000005": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1527,7 +1709,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x100000000001e": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1629,7 +1824,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x100000000001d": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1731,7 +1939,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x100000000000d": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1833,7 +2054,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x100000000000e": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -1935,7 +2169,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x1000000000019": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -2037,7 +2284,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS:oid:0x100000000001a": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", @@ -2139,7 +2399,20 @@ "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" + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8", + "SAI_PORT_STAT_DOT3_STATS_ALIGNMENT_ERRORS": "1", + "SAI_PORT_STAT_DOT3_STATS_FCS_ERRORS": "2", + "SAI_PORT_STAT_DOT3_STATS_SINGLE_COLLISION_FRAMES": "3", + "SAI_PORT_STAT_DOT3_STATS_MULTIPLE_COLLISION_FRAMES": "4", + "SAI_PORT_STAT_DOT3_STATS_SQE_TEST_ERRORS": "5", + "SAI_PORT_STAT_DOT3_STATS_DEFERRED_TRANSMISSIONS": "6", + "SAI_PORT_STAT_DOT3_STATS_LATE_COLLISIONS": "7", + "SAI_PORT_STAT_DOT3_STATS_EXCESSIVE_COLLISIONS": "8", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_TRANSMIT_ERRORS": "9", + "SAI_PORT_STAT_DOT3_STATS_CARRIER_SENSE_ERRORS": "10", + "SAI_PORT_STAT_DOT3_STATS_FRAME_TOO_LONGS": "11", + "SAI_PORT_STAT_DOT3_STATS_INTERNAL_MAC_RECEIVE_ERRORS": "12", + "SAI_PORT_STAT_DOT3_STATS_SYMBOL_ERRORS": "13" }, "COUNTERS_PORT_NAME_MAP": { "Ethernet8": "oid:0x1000000000017", diff --git a/tests/test_rfc3635.py b/tests/test_rfc3635.py new file mode 100644 index 000000000..8f34847f8 --- /dev/null +++ b/tests/test_rfc3635.py @@ -0,0 +1,70 @@ +import os +import sys +import sonic_ax_impl +from unittest import TestCase + +if sys.version_info.major == 3: + from unittest import mock +else: + import mock + +modules_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, os.path.join(modules_path, 'src')) + +from sonic_ax_impl.mibs.ietf.rfc3635 import dot3MIBUpdater +from sonic_ax_impl.mibs.ietf.rfc3635 import DbTables64 + +class Testdot3MIBUpdater(TestCase): + + def mock_get_sync_d_from_all_namespace(per_namespace_func, dbs): + if per_namespace_func == sonic_ax_impl.mibs.init_sync_d_lag_tables: + return [{'PortChannel999': [], 'PortChannel103': ['Ethernet120']}, # lag_name_if_name_map + {}, + {1999: 'PortChannel999', 1103: 'PortChannel103'}, # oid_lag_name_map + {}, + {}] + + if per_namespace_func == sonic_ax_impl.mibs.init_sync_d_interface_tables: + return [{}, + {}, + {}, + {121: 'Ethernet120'}] + + return [{},{},{}] + + def mock_lag_entry_table(lag_name): + if lag_name == "PortChannel103": + return "PORT_TABLE:Ethernet120" + + return + + def mock_dbs_get_all(dbs, db_name, hash, *args, **kwargs): + if hash == "PORT_TABLE:Ethernet120": + return {'admin_status': 'up', 'alias': 'fortyGigE0/120', 'description': 'ARISTA03T1:Ethernet1', 'index': '30', 'lanes': '101,102,103,104', 'mtu': '9100', 'oper_status': 'up', 'pfc_asym': 'off', 'speed': '40000', 'tpid': '0x8100'} + + return + + def mock_init_mgmt_interface_tables(db_conn): + return [{},{}] + + @mock.patch('sonic_ax_impl.mibs.Namespace.get_sync_d_from_all_namespace', mock_get_sync_d_from_all_namespace) + @mock.patch('sonic_ax_impl.mibs.Namespace.dbs_get_all', mock_dbs_get_all) + @mock.patch('sonic_ax_impl.mibs.lag_entry_table', mock_lag_entry_table) + @mock.patch('sonic_ax_impl.mibs.init_mgmt_interface_tables', mock_init_mgmt_interface_tables) + def test_dot3MIBUpdater_get_counters(self): + updater = dot3MIBUpdater() + + updater.reinit_data() + updater.update_data() + def mock_get_counter(oid, table_name, mask): + if oid == 121: + return None + else: + return updater._get_counter(oid, table_name, mask) + + try: + counter = updater.get_counter64((1103,), DbTables64(6)) + except TypeError: + self.fail("Caught Type error") + self.assertTrue(counter == None) +