From a4d40f2fee1fe977e0c1a888970f14535212b885 Mon Sep 17 00:00:00 2001 From: Mykola F <37578614+mykolaf@users.noreply.github.com> Date: Wed, 24 Jun 2020 02:59:25 +0300 Subject: [PATCH] [port_util] add get_rif_port_map, get_vlan_interface_oid_map (#78) * [port_util] add get_rif_port_map, get_vlan_interface_oid_map * clear lgtm warning * fix comments --- src/swsssdk/port_util.py | 46 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/swsssdk/port_util.py b/src/swsssdk/port_util.py index e7e8c8c145b8..63f9505f48a6 100644 --- a/src/swsssdk/port_util.py +++ b/src/swsssdk/port_util.py @@ -11,12 +11,14 @@ in multi-asic platform. """ SONIC_ETHERNET_BP_RE_PATTERN = "^Ethernet-BP(\d+)$" +SONIC_VLAN_RE_PATTERN = "^Vlan(\d+)$" SONIC_PORTCHANNEL_RE_PATTERN = "^PortChannel(\d+)$" SONIC_MGMT_PORT_RE_PATTERN = "^eth(\d+)$" class BaseIdx: ethernet_base_idx = 1 + vlan_interface_base_idx = 2000 ethernet_bp_base_idx = 9000 portchannel_base_idx = 1000 mgmt_port_base_idx = 10000 @@ -25,6 +27,7 @@ def get_index(if_name): """ OIDs are 1-based, interfaces are 0-based, return the 1-based index Ethernet N = N + 1 + Vlan N = N + 2000 Ethernet_BP N = N + 9000 PortChannel N = N + 1000 eth N = N + 10000 @@ -36,6 +39,7 @@ def get_index_from_str(if_name): """ OIDs are 1-based, interfaces are 0-based, return the 1-based index Ethernet N = N + 1 + Vlan N = N + 2000 Ethernet_BP N = N + 9000 PortChannel N = N + 1000 eth N = N + 10000 @@ -43,6 +47,7 @@ def get_index_from_str(if_name): patterns = { SONIC_ETHERNET_RE_PATTERN: BaseIdx.ethernet_base_idx, SONIC_ETHERNET_BP_RE_PATTERN: BaseIdx.ethernet_bp_base_idx, + SONIC_VLAN_RE_PATTERN: BaseIdx.vlan_interface_base_idx, SONIC_PORTCHANNEL_RE_PATTERN: BaseIdx.portchannel_base_idx, SONIC_MGMT_PORT_RE_PATTERN: BaseIdx.mgmt_port_base_idx } @@ -103,3 +108,44 @@ def get_vlan_id_from_bvid(db, bvid): return vlan_id +def get_rif_port_map(db): + """ + Get the RIF port mapping from ASIC DB + """ + db.connect('ASIC_DB') + rif_keys_str = db.keys('ASIC_DB', "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:*") + if not rif_keys_str: + return {} + + rif_port_oid_map = {} + for rif_s in rif_keys_str: + rif_id = rif_s.lstrip(b"ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:oid:0x") + ent = db.get_all('ASIC_DB', rif_s, blocking=True) + if b"SAI_ROUTER_INTERFACE_ATTR_PORT_ID" in ent: + port_id = ent[b"SAI_ROUTER_INTERFACE_ATTR_PORT_ID"].lstrip(b"oid:0x") + rif_port_oid_map[rif_id] = port_id + + return rif_port_oid_map + +def get_vlan_interface_oid_map(db): + """ + Get Vlan Interface names and sai oids + """ + db.connect('COUNTERS_DB') + rif_name_map = db.get_all('COUNTERS_DB', 'COUNTERS_RIF_NAME_MAP', blocking=True) + rif_type_name_map = db.get_all('COUNTERS_DB', 'COUNTERS_RIF_TYPE_MAP', blocking=True) + + if not rif_name_map or not rif_type_name_map: + return {} + + oid_pfx = len("oid:0x") + vlan_if_name_map = {} + + for if_name, sai_oid in rif_name_map.items(): + # Check if RIF is l3 vlan interface + if rif_type_name_map[sai_oid] == b'SAI_ROUTER_INTERFACE_TYPE_VLAN': + # Check if interface name is in style understood to be a SONiC interface + if get_index(if_name): + vlan_if_name_map[sai_oid[oid_pfx:]] = if_name + + return vlan_if_name_map