-
Notifications
You must be signed in to change notification settings - Fork 119
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[rfc1213] Interface MIB add l3 vlan interfaces & aggregate rif counters #169
Changes from 21 commits
f1b5ec1
029a992
5d3421f
f0e4048
2a35053
0999b4b
cbf06e3
7c969b7
b5c4632
20afa18
167ece7
9124833
ed9409f
b141e51
80935af
89616da
0116f85
5d2110d
2721b32
76fb565
b22236b
8a741fb
068f530
144658f
196033f
a00e69e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,6 +4,7 @@ | |
from bisect import bisect_right | ||
|
||
from sonic_ax_impl import mibs | ||
from sonic_ax_impl import logger | ||
from sonic_ax_impl.mibs import Namespace | ||
from ax_interface.mib import MIBMeta, ValueType, MIBUpdater, MIBEntry, SubtreeMIBEntry, OverlayAdpaterMIBEntry, OidMIBEntry | ||
from ax_interface.encodings import ObjectIdentifier | ||
|
@@ -49,7 +50,8 @@ class DbTables(int, Enum): | |
class IfTypes(int, Enum): | ||
""" IANA ifTypes """ | ||
ethernetCsmacd = 6 | ||
ieee8023adLag = 161 | ||
l3ipvlan = 136 | ||
ieee8023adLag = 161 | ||
|
||
class ArpUpdater(MIBUpdater): | ||
def __init__(self): | ||
|
@@ -191,8 +193,13 @@ def __init__(self): | |
self.lag_name_if_name_map = {} | ||
self.if_name_lag_name_map = {} | ||
self.oid_lag_name_map = {} | ||
self.lag_sai_map = {} | ||
self.mgmt_oid_name_map = {} | ||
self.mgmt_alias_map = {} | ||
self.vlan_oid_name_map = {} | ||
self.vlan_name_map = {} | ||
self.rif_port_map = {} | ||
self.port_rif_map = {} | ||
|
||
# cache of interface counters | ||
self.if_counters = {} | ||
|
@@ -201,6 +208,8 @@ def __init__(self): | |
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_data(self): | ||
|
@@ -219,26 +228,48 @@ def reinit_data(self): | |
self.mgmt_oid_name_map, \ | ||
self.mgmt_alias_map = mibs.init_mgmt_interface_tables(self.db_conn[0]) | ||
|
||
self.vlan_name_map, \ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
If you merge latest master, you don't need to encoding to byte array. |
||
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.rif_port_map, \ | ||
self.port_rif_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_rif_tables, self.db_conn) | ||
|
||
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]) | ||
self.if_counters[if_idx] = self.namespace_db_map[namespace].get_all(mibs.COUNTERS_DB, \ | ||
mibs.counter_table(sai_id), blocking=True) | ||
|
||
self.update_if_counters() | ||
self.update_rif_counters() | ||
|
||
self.aggregate_counters() | ||
|
||
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) | ||
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.mgmt_oid_name_map.keys()) + | ||
list(self.vlan_oid_name_map.keys())) | ||
self.if_range = [(i,) for i in self.if_range] | ||
|
||
def update_if_counters(self): | ||
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]) | ||
self.if_counters[if_idx] = self.namespace_db_map[namespace].get_all(mibs.COUNTERS_DB, \ | ||
mibs.counter_table(sai_id), blocking=True) | ||
|
||
def update_rif_counters(self): | ||
rif_sai_ids = list(self.rif_port_map) + list(self.vlan_name_map) | ||
self.rif_counters = \ | ||
{sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=False) | ||
for sai_id in rif_sai_ids} | ||
|
||
def get_next(self, sub_id): | ||
""" | ||
:param sub_id: The 1-based sub-identifier query. | ||
|
@@ -280,6 +311,8 @@ def interface_description(self, sub_id): | |
return self.oid_lag_name_map[oid] | ||
elif oid in self.mgmt_oid_name_map: | ||
return self.mgmt_alias_map[self.mgmt_oid_name_map[oid]] | ||
elif oid in self.vlan_oid_name_map: | ||
return self.vlan_oid_name_map[oid] | ||
|
||
return self.if_alias_map[self.oid_name_map[oid]] | ||
|
||
|
@@ -302,6 +335,31 @@ def _get_counter(self, oid, table_name): | |
mibs.logger.warning("SyncD 'COUNTERS_DB' missing attribute '{}'.".format(e)) | ||
return None | ||
|
||
def aggregate_counters(self): | ||
""" | ||
For ports with l3 router interfaces l3 drops may be counted separately (RIF counters) | ||
add l3 drops to l2 drop counters cache according to mapping | ||
|
||
For l3vlan map l3 counters to l2 counters | ||
""" | ||
for rif_sai_id, port_sai_id in self.rif_port_map.items(): | ||
if port_sai_id in self.if_id_map: | ||
port_idx = mibs.get_index_from_str(self.if_id_map[port_sai_id]) | ||
for port_counter_name, rif_counter_name in mibs.RIF_DROPS_AGGR_MAP.items(): | ||
self.if_counters[port_idx][port_counter_name] = \ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I see you change |
||
int(self.if_counters[port_idx][port_counter_name]) + \ | ||
int(self.rif_counters[rif_sai_id][rif_counter_name]) | ||
|
||
for vlan_sai_id, vlan_name in self.vlan_name_map.items(): | ||
for port_counter_name, rif_counter_name in mibs.RIF_COUNTERS_AGGR_MAP.items(): | ||
vlan_idx = mibs.get_index_from_str(vlan_name.decode()) | ||
vlan_rif_counters = self.rif_counters[vlan_sai_id] | ||
if rif_counter_name in vlan_rif_counters: | ||
self.if_counters.setdefault(vlan_idx, {}) | ||
self.if_counters[vlan_idx][port_counter_name] = \ | ||
int(vlan_rif_counters[rif_counter_name]) | ||
|
||
|
||
def get_counter(self, sub_id, table_name): | ||
""" | ||
:param sub_id: The 1-based sub-identifier query. | ||
|
@@ -321,7 +379,13 @@ def get_counter(self, sub_id, table_name): | |
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), table_name) | ||
|
||
sai_lag_id = self.lag_sai_map[self.oid_lag_name_map[oid]] | ||
sai_lag_rif_id = self.port_rif_map[sai_lag_id] | ||
if sai_lag_rif_id in self.rif_port_map: | ||
table_name = bytes(getattr(table_name, 'name', table_name), 'utf-8') | ||
if table_name in mibs.RIF_DROPS_AGGR_MAP: | ||
rif_table_name = mibs.RIF_DROPS_AGGR_MAP[table_name] | ||
counter_value += int(self.rif_counters[sai_lag_rif_id].get(rif_table_name, 0)) | ||
# truncate to 32-bit counter | ||
return counter_value & 0x00000000ffffffff | ||
else: | ||
|
@@ -351,6 +415,8 @@ def _get_if_entry(self, sub_id): | |
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: | ||
|
@@ -455,6 +521,7 @@ def get_if_type(self, sub_id): | |
|
||
ethernetCsmacd(6), -- for all ethernet-like interfaces, | ||
-- regardless of speed, as per RFC3635 | ||
l3ipvlan(136) -- Layer 3 Virtual LAN using IP | ||
ieee8023adLag(161) -- IEEE 802.3ad Link Aggregate | ||
""" | ||
oid = self.get_oid(sub_id) | ||
|
@@ -463,6 +530,8 @@ def get_if_type(self, sub_id): | |
|
||
if oid in self.oid_lag_name_map: | ||
return IfTypes.ieee8023adLag | ||
elif oid in self.vlan_oid_name_map: | ||
return IfTypes.l3ipvlan | ||
else: | ||
return IfTypes.ethernetCsmacd | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Merge with above line #Closed