Skip to content

Commit c20bf60

Browse files
authored
Implement rfc4363 FdbUpdater for lag inside vlan (sonic-net#203)
**- What I did** Currently if there are lags in vlan, and FDB entries with lag will not visible in FdbUpdater. **- How I did it** Implement rfc4363 FdbUpdater for lag inside vlan **- How to verify it** Test in DUT, and add unit test.
1 parent 292024a commit c20bf60

File tree

10 files changed

+78
-10
lines changed

10 files changed

+78
-10
lines changed

src/sonic_ax_impl/mibs/__init__.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -304,13 +304,24 @@ def init_sync_d_lag_tables(db_conn):
304304
if_name_lag_name_map = {}
305305
# { OID -> lag_name (SONiC) }
306306
oid_lag_name_map = {}
307+
# { lag_name (SONiC) -> lag_oid (SAI) }
308+
lag_sai_map = {}
309+
# { lag_oid (SAI) -> lag_name (SONiC) }
310+
sai_lag_map = {}
307311

308312
db_conn.connect(APPL_DB)
309313

310314
lag_entries = db_conn.keys(APPL_DB, "LAG_TABLE:*")
311315

312316
if not lag_entries:
313-
return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map
317+
return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map, lag_sai_map
318+
319+
db_conn.connect(COUNTERS_DB)
320+
lag_sai_map = db_conn.get_all(COUNTERS_DB, "COUNTERS_LAG_NAME_MAP")
321+
for name, sai_id in lag_sai_map.items():
322+
sai_id_key = get_sai_id_key(db_conn.namespace, sai_id.lstrip("oid:0x"))
323+
lag_sai_map[name] = sai_id_key
324+
sai_lag_map[sai_id_key] = name
314325

315326
for lag_entry in lag_entries:
316327
lag_name = lag_entry[len("LAG_TABLE:"):]
@@ -332,7 +343,7 @@ def member_name_str(val, lag_name):
332343
if idx:
333344
oid_lag_name_map[idx] = if_name
334345

335-
return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map
346+
return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map, sai_lag_map
336347

337348
def init_sync_d_queue_tables(db_conn):
338349
"""
@@ -588,3 +599,4 @@ def dbs_get_vlan_id_from_bvid(dbs, bvid):
588599
vlan_obj = db_conn.keys('ASIC_DB', "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:" + bvid)
589600
if vlan_obj is not None:
590601
return port_util.get_vlan_id_from_bvid(db_conn, bvid)
602+
return None

src/sonic_ax_impl/mibs/ietf/rfc1213.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ def update_data(self):
233233

234234
self.lag_name_if_name_map, \
235235
self.if_name_lag_name_map, \
236-
self.oid_lag_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, self.db_conn)
236+
self.oid_lag_name_map, _ = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, self.db_conn)
237237

238238
self.if_range = sorted(list(self.oid_name_map.keys()) +
239239
list(self.oid_lag_name_map.keys()) +

src/sonic_ax_impl/mibs/ietf/rfc2863.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def reinit_data(self):
7979

8080
self.lag_name_if_name_map, \
8181
self.if_name_lag_name_map, \
82-
self.oid_lag_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, self.db_conn)
82+
self.oid_lag_name_map, _ = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, self.db_conn)
8383
"""
8484
db_conn - will have db_conn to all namespace DBs and
8585
global db. First db in the list is global db.

src/sonic_ax_impl/mibs/ietf/rfc4363.py

+17-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ def __init__(self):
1515
self.if_alias_map = {}
1616
self.if_id_map = {}
1717
self.oid_name_map = {}
18+
self.sai_lag_map = {}
1819
self.vlanmac_ifindex_map = {}
1920
self.vlanmac_ifindex_list = []
2021
self.if_bpid_map = {}
@@ -28,6 +29,8 @@ def fdb_vlanmac(self, fdb):
2829
vlan_id = self.bvid_vlan_map[fdb["bvid"]]
2930
else:
3031
vlan_id = Namespace.dbs_get_vlan_id_from_bvid(self.db_conn, fdb["bvid"])
32+
if isinstance(vlan_id, bytes):
33+
vlan_id = vlan_id.decode()
3134
self.bvid_vlan_map[fdb["bvid"]] = vlan_id
3235
else:
3336
return None
@@ -48,6 +51,11 @@ def reinit_data(self):
4851
mibs.init_sync_d_interface_tables, self.db_conn
4952
)
5053

54+
self.lag_name_if_name_map, \
55+
self.if_name_lag_name_map, \
56+
self.oid_lag_name_map, \
57+
self.sai_lag_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, self.db_conn)
58+
5159
self.if_bpid_map = Namespace.dbs_get_bridge_port_map(self.db_conn, mibs.ASIC_DB)
5260
self.bvid_vlan_map.clear()
5361

@@ -77,12 +85,20 @@ def update_data(self):
7785
if bridge_port_id not in self.if_bpid_map:
7886
continue
7987
port_id = self.if_bpid_map[bridge_port_id]
88+
if port_id in self.if_id_map:
89+
port_name = self.if_id_map[port_id]
90+
port_index = mibs.get_index_from_str(port_name)
91+
elif port_id in self.sai_lag_map:
92+
port_name = self.sai_lag_map[port_id]
93+
port_index = mibs.get_index_from_str(port_name)
94+
else:
95+
continue
8096

8197
vlanmac = self.fdb_vlanmac(fdb)
8298
if not vlanmac:
8399
mibs.logger.error("SyncD 'ASIC_DB' includes invalid FDB_ENTRY '{}': failed in fdb_vlanmac().".format(fdb_str))
84100
continue
85-
self.vlanmac_ifindex_map[vlanmac] = mibs.get_index_from_str(self.if_id_map[port_id])
101+
self.vlanmac_ifindex_map[vlanmac] = port_index
86102
self.vlanmac_ifindex_list.append(vlanmac)
87103
self.vlanmac_ifindex_list.sort()
88104

src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def update_data(self):
5252

5353
self.lag_name_if_name_map, \
5454
self.if_name_lag_name_map, \
55-
self.oid_lag_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, self.db_conn)
55+
self.oid_lag_name_map, _ = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, self.db_conn)
5656

5757
self.if_range = sorted(list(self.oid_name_map.keys()) + list(self.oid_lag_name_map.keys()))
5858
self.if_range = [(i,) for i in self.if_range]

tests/mock_tables/asic_db.json

+20
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@
77
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a000000000608",
88
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC"
99
},
10+
"ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bridge_id\":\"oid:0x0\",\"bridge_type\":\"SAI_FDB_ENTRY_BRIDGE_TYPE_1Q\",\"mac\":\"7C:FE:90:80:9F:06\",\"switch_id\":\"oid:0x21000000000000\",\"bvid\":\"oid:0x26000000000a20\"}": {
11+
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a000000000a21",
12+
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC"
13+
},
14+
"ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x26000000000013\",\"mac\":\"7C:FE:90:5E:6B:BE\",\"switch_id\":\"oid:0x21000000000000\"}" : {
15+
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a000000000a21",
16+
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC",
17+
"SAI_FDB_ENTRY_ATTR_PACKET_ACTION": "SAI_PACKET_ACTION_FORWARD"
18+
},
1019
"ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a000000000616": {
1120
"SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT",
1221
"SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000006",
@@ -16,5 +25,16 @@
1625
"SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT",
1726
"SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000008",
1827
"SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true"
28+
},
29+
"ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a000000000a21": {
30+
"SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT",
31+
"SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x2000000000a14",
32+
"SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true"
33+
},
34+
"ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x26000000000a20": {
35+
"SAI_VLAN_ATTR_VLAN_ID": "102"
36+
},
37+
"ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x26000000000013": {
38+
"NULL": "NULL"
1939
}
2040
}

tests/mock_tables/counters_db.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -2278,7 +2278,8 @@
22782278
"Ethernet68": "oid:0x1000000000020"
22792279
},
22802280
"COUNTERS_LAG_NAME_MAP": {
2281-
"PortChannel01": "oid:0x1000000000023"
2281+
"PortChannel01": "oid:0x1000000000023",
2282+
"PortChannel101": "oid:0x2000000000a14"
22822283
},
22832284
"COUNTERS:oid:0x1000000000009": {
22842285
"SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0",

tests/namespace/test_mibs.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def test_init_namespace_sync_d_lag_tables(self):
2121

2222
lag_name_if_name_map, \
2323
if_name_lag_name_map, \
24-
oid_lag_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, dbs)
24+
oid_lag_name_map, _ = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, dbs)
2525
#PortChannel in asic0 Namespace
2626
self.assertTrue("PortChannel01" in lag_name_if_name_map)
2727
self.assertTrue("Ethernet-BP0" in lag_name_if_name_map["PortChannel01"])

tests/test_fdb.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,16 @@
1717
from ax_interface.constants import PduTypes
1818
from sonic_ax_impl.mibs.ietf import rfc4363
1919
from sonic_ax_impl.main import SonicMIB
20+
from swsssdk.port_util import BaseIdx
2021

2122
class TestSonicMIB(TestCase):
2223
@classmethod
2324
def setUpClass(cls):
2425
cls.lut = MIBTable(SonicMIB)
26+
for updater in cls.lut.updater_instances:
27+
updater.update_data()
28+
updater.reinit_data()
29+
updater.update_data()
2530

2631
def test_getpdu(self):
2732
oid = ObjectIdentifier(20, 0, 0, 0, (1, 3, 6, 1, 2, 1, 17, 7, 1, 2, 2, 1, 2, 1000, 124, 254, 144, 128, 159, 4))
@@ -43,7 +48,7 @@ def test_getnextpdu(self):
4348
get_pdu = GetNextPDU(
4449
header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0),
4550
oids=(
46-
ObjectIdentifier(20, 0, 0, 0, (1, 3, 6, 1, 2, 1, 17, 7, 1, 2, 2, 1, 2)),
51+
ObjectIdentifier(20, 0, 0, 0, (1, 3, 6, 1, 2, 1, 17, 7, 1, 2, 2, 1, 2, 999)),
4752
)
4853
)
4954

@@ -56,6 +61,20 @@ def test_getnextpdu(self):
5661
self.assertEqual(value0.type_, ValueType.INTEGER)
5762
self.assertEqual(value0.data, 113)
5863

64+
def test_getnextpdu_lag(self):
65+
get_pdu = GetNextPDU(
66+
header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0),
67+
oids=(
68+
ObjectIdentifier(20, 0, 0, 0, (1, 3, 6, 1, 2, 1, 17, 7, 1, 2, 2, 1, 2, 101)),
69+
)
70+
)
71+
72+
response = get_pdu.make_response(self.lut)
73+
74+
value0 = response.values[0]
75+
self.assertEqual(value0.type_, ValueType.INTEGER)
76+
self.assertEqual(value0.data, BaseIdx.portchannel_base_idx + 101)
77+
5978
def test_getnextpdu_exactmatch(self):
6079
# oid.include = 1
6180
oid = ObjectIdentifier(20, 0, 1, 0, (1, 3, 6, 1, 2, 1, 17, 7, 1, 2, 2, 1, 2, 1000, 124, 254, 144, 128, 159, 4))

tests/test_mibs.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def test_init_sync_d_lag_tables(self):
2121

2222
lag_name_if_name_map, \
2323
if_name_lag_name_map, \
24-
oid_lag_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, db_conn)
24+
oid_lag_name_map, _ = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, db_conn)
2525

2626
self.assertTrue("PortChannel04" in lag_name_if_name_map)
2727
self.assertTrue(lag_name_if_name_map["PortChannel04"] == ["Ethernet124"])

0 commit comments

Comments
 (0)