Skip to content

Commit ed2fa69

Browse files
authored
[debug dump util] FDB debug dump util changes (sonic-net#1968)
What I did Added FDB debug dump module How I did it Used debug dump infra to add the FDB debug dump utility How to verify it Added Unit test cases to verify it
1 parent 3b642c9 commit ed2fa69

File tree

5 files changed

+416
-0
lines changed

5 files changed

+416
-0
lines changed

dump/plugins/fdb.py

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
from dump.match_infra import MatchRequest
2+
from dump.helper import create_template_dict
3+
from .executor import Executor
4+
5+
6+
class Fdb(Executor):
7+
"""
8+
Debug Dump Plugin for FDB Module
9+
"""
10+
ARG_NAME = "Vlan:fdb_entry"
11+
12+
def __init__(self, match_engine=None):
13+
super().__init__(match_engine)
14+
15+
def get_all_args(self, ns=""):
16+
req = MatchRequest(db="STATE_DB", table="FDB_TABLE", key_pattern="*", ns=ns)
17+
ret = self.match_engine.fetch(req)
18+
fdb_entries = ret["keys"]
19+
return [key.split("|")[-1] for key in fdb_entries]
20+
21+
def execute(self, params):
22+
self.ret_temp = create_template_dict(dbs=["APPL_DB", "ASIC_DB", "STATE_DB"])
23+
fdb_entry = params[Fdb.ARG_NAME]
24+
self.ns = params["namespace"]
25+
self.init_fdb_appl_info(fdb_entry)
26+
self.init_asic_fdb_info(fdb_entry)
27+
self.init_state_fdb_info(fdb_entry)
28+
return self.ret_temp
29+
30+
def init_state_fdb_info(self, fdb_name):
31+
req = MatchRequest(db="STATE_DB", table="FDB_TABLE", key_pattern=fdb_name, ns=self.ns)
32+
ret = self.match_engine.fetch(req)
33+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"])
34+
35+
def init_fdb_appl_info(self, fdb_name):
36+
req = MatchRequest(db="APPL_DB", table="FDB_TABLE", key_pattern=fdb_name, ns=self.ns)
37+
ret = self.match_engine.fetch(req)
38+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"], False)
39+
req = MatchRequest(db="APPL_DB", table="VXLAN_FDB_TABLE", key_pattern=fdb_name, ns=self.ns)
40+
ret = self.match_engine.fetch(req)
41+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"], False)
42+
req = MatchRequest(db="APPL_DB", table="MCLAG_FDB_TABLE", key_pattern=fdb_name, ns=self.ns)
43+
ret = self.match_engine.fetch(req)
44+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"], False)
45+
46+
def init_asic_fdb_info(self, fdb_name):
47+
# One colon between Vlan and MAC and 5 colons in mac address are expected in key
48+
if fdb_name.count(':') != 6:
49+
self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY")
50+
self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT")
51+
return
52+
53+
key_split = fdb_name.split(":",1)
54+
vlan_name = key_split[0]
55+
mac = key_split[1]
56+
if vlan_name[0:4] != "Vlan" or not vlan_name[4:].isnumeric():
57+
self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY")
58+
self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT")
59+
return
60+
61+
vlan_num = int(vlan_name[4:])
62+
# Find the table named "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:*" in which SAI_VLAN_AT'TR_VLAN_ID = vlan_num
63+
req = MatchRequest(db="ASIC_DB", table="ASIC_STATE:SAI_OBJECT_TYPE_VLAN", key_pattern="*", field="SAI_VLAN_ATTR_VLAN_ID",
64+
value=str(vlan_num), ns=self.ns)
65+
ret = self.match_engine.fetch(req)
66+
if not ret["error"] and len(ret["keys"]) == 1:
67+
vlan_obj = ret["keys"][0].split(":",2)[-1]
68+
else:
69+
self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY")
70+
self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT")
71+
return
72+
73+
# ASIC_DB FDB format is bvid:vlan_obj + mac:mac_address + switch id which is wildcard here
74+
fdb_key = '{"bvid":"' + vlan_obj + '","mac":"' + mac.upper() + '"*}'
75+
req = MatchRequest(db="ASIC_DB", table="ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY", key_pattern=fdb_key,
76+
return_fields=["SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID"], ns=self.ns)
77+
ret = self.match_engine.fetch(req)
78+
bridge_port_id = ""
79+
if not ret["error"] and len(ret["keys"]) != 0:
80+
asic_fdb_key = ret["keys"][0]
81+
if asic_fdb_key in ret["return_values"] and "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID" in ret["return_values"][asic_fdb_key]:
82+
bridge_port_id = ret["return_values"][asic_fdb_key]["SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID"]
83+
else:
84+
self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT")
85+
86+
if bridge_port_id:
87+
bridge_port_req = MatchRequest(db="ASIC_DB", table="ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT",
88+
key_pattern = bridge_port_id, ns = self.ns)
89+
bridge_ret = self.match_engine.fetch(bridge_port_req)
90+
if not bridge_ret["error"] and len(bridge_ret["keys"]) != 0:
91+
self.ret_temp[bridge_port_req.db]["keys"].append(bridge_ret["keys"][0])
92+
else:
93+
self.ret_temp["ASIC_DB"]["tables_not_found"].append("ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT")
94+
95+
96+
self.add_to_ret_template(req.table, req.db, ret["keys"], ret["error"])

tests/dump_input/fdb/appl_db.json

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"FDB_TABLE:Vlan10:04:3f:72:ce:80:8b":{
3+
"port" : "Ethernet252",
4+
"type" : "static"
5+
},
6+
"VXLAN_FDB_TABLE:Vlan10:04:3f:72:ce:80:8c":{
7+
"port" : "Ethernet252",
8+
"type" : "dynamic",
9+
"end_point_ip" : "192.234.11.233"
10+
},
11+
"MCLAG_FDB_TABLE:Vlan10:04:3f:72:ce:80:8d":{
12+
"port" : "Ethernet252",
13+
"type" : "dynamic"
14+
}
15+
}

tests/dump_input/fdb/asic_db.json

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{
2+
"ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x26000000000d22\",\"mac\":\"04:3F:72:E3:70:08\",\"switch_id\":\"oid:0x21000000000000\"}":{
3+
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID" : "oid:0x3a000000000d23",
4+
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC",
5+
"SAI_FDB_ENTRY_ATTR_PACKET_ACTION" : "SAI_PACKET_ACTION_FORWARD"
6+
},
7+
"ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x26000000000d20\",\"mac\":\"04:3F:72:CE:80:8B\",\"switch_id\":\"oid:0x21000000000000\"}":{
8+
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID" : "oid:0x3a000000000d18",
9+
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_STATIC",
10+
"SAI_FDB_ENTRY_ATTR_PACKET_ACTION" : "SAI_PACKET_ACTION_FORWARD"
11+
},
12+
"ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x26000000000d20\",\"mac\":\"04:3F:72:CE:80:8C\",\"switch_id\":\"oid:0x21000000000000\"}":{
13+
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID" : "oid:0x3a000000000d18",
14+
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC",
15+
"SAI_FDB_ENTRY_ATTR_PACKET_ACTION" : "SAI_PACKET_ACTION_FORWARD"
16+
},
17+
"ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x26000000000d20\",\"mac\":\"04:3F:72:CE:80:8D\",\"switch_id\":\"oid:0x21000000000000\"}":{
18+
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID" : "oid:0x3a000000000d18",
19+
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC",
20+
"SAI_FDB_ENTRY_ATTR_PACKET_ACTION" : "SAI_PACKET_ACTION_FORWARD"
21+
},
22+
"ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x26000000000d1c\",\"mac\":\"04:3F:72:CE:80:8B\",\"switch_id\":\"oid:0x21000000000000\"}":{
23+
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID" : "oid:0x3a000000000d55",
24+
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC",
25+
"SAI_FDB_ENTRY_ATTR_PACKET_ACTION" : "SAI_PACKET_ACTION_FORWARD"
26+
},
27+
"ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x26000000000d22": {
28+
"SAI_VLAN_ATTR_VLAN_ID" : "50"
29+
},
30+
"ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x26000000000d20": {
31+
"SAI_VLAN_ATTR_VLAN_ID" : "10"
32+
},
33+
"ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x26000000000d1c": {
34+
"SAI_VLAN_ATTR_VLAN_ID" : "690"
35+
},
36+
"ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a000000000d23":{
37+
"SAI_BRIDGE_PORT_ATTR_TYPE" : "SAI_BRIDGE_PORT_TYPE_PORT",
38+
"SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x100000000093e",
39+
"SAI_BRIDGE_PORT_ATTR_ADMIN_STATE" : "true",
40+
"SAI_BRIDGE_PORT_ATTR_FDB_LEARNING_MODE" : "SAI_BRIDGE_PORT_FDB_LEARNING_MODE_HW"
41+
},
42+
"ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a000000000d18":{
43+
"SAI_BRIDGE_PORT_ATTR_TYPE" : "SAI_BRIDGE_PORT_TYPE_PORT",
44+
"SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x100000000053f",
45+
"SAI_BRIDGE_PORT_ATTR_ADMIN_STATE" : "true",
46+
"SAI_BRIDGE_PORT_ATTR_FDB_LEARNING_MODE" : "SAI_BRIDGE_PORT_FDB_LEARNING_MODE_HW"
47+
}
48+
}

tests/dump_input/fdb/state_db.json

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{
2+
"FDB_TABLE|Vlan50:04:3f:72:e3:70:08":{
3+
"port" : "Ethernet0",
4+
"type" : "dynamic"
5+
},
6+
"FDB_TABLE|Vlan10:04:3f:72:ce:80:8b":{
7+
"port" : "Ethernet252",
8+
"type" : "static"
9+
},
10+
"FDB_TABLE|Vlan10:04:3f:72:ce:80:8c":{
11+
"port" : "Ethernet252",
12+
"type" : "dynamic"
13+
},
14+
"FDB_TABLE|Vlan10:04:3f:72:ce:80:8d":{
15+
"port" : "Ethernet252",
16+
"type" : "dynamic"
17+
},
18+
"FDB_TABLE|Vlan690:04:3f:72:ce:80:8b":{
19+
"port" : "Ethernet248",
20+
"type" : "dynamic"
21+
},
22+
"FDB_TABLE|Vlan40:04:3f:72:e3:70:09":{
23+
"port" : "PortChannel0002",
24+
"type" : "dynamic"
25+
},
26+
"FDB_TABLE|Vlan691:04:3f:72:ce:80:8b":{
27+
"port" : "Ethernet248",
28+
"type" : "dynamic"
29+
}
30+
}

0 commit comments

Comments
 (0)