Skip to content

Commit c0b9917

Browse files
authored
[debug dump util] COPP Module Added (#1670)
What I did HLD for Dump Utility: HLD. Added the COPP Module to the Debug Dump Utility Added the Corresponding UT's
1 parent 826311c commit c0b9917

File tree

6 files changed

+726
-0
lines changed

6 files changed

+726
-0
lines changed

dump/plugins/copp.py

+351
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,351 @@
1+
import re
2+
from dump.match_infra import MatchRequest
3+
from dump.helper import create_template_dict
4+
from dump.helper import handle_error, handle_multiple_keys_matched_error
5+
from .executor import Executor
6+
7+
TRAP_ID_MAP = {
8+
"stp": "SAI_HOSTIF_TRAP_TYPE_STP",
9+
"lacp": "SAI_HOSTIF_TRAP_TYPE_LACP",
10+
"eapol": "SAI_HOSTIF_TRAP_TYPE_EAPOL",
11+
"lldp": "SAI_HOSTIF_TRAP_TYPE_LLDP",
12+
"pvrst": "SAI_HOSTIF_TRAP_TYPE_PVRST",
13+
"igmp_query": "SAI_HOSTIF_TRAP_TYPE_IGMP_TYPE_QUERY",
14+
"igmp_leave": "SAI_HOSTIF_TRAP_TYPE_IGMP_TYPE_LEAVE",
15+
"igmp_v1_report": "SAI_HOSTIF_TRAP_TYPE_IGMP_TYPE_V1_REPORT",
16+
"igmp_v2_report": "SAI_HOSTIF_TRAP_TYPE_IGMP_TYPE_V2_REPORT",
17+
"igmp_v3_report": "SAI_HOSTIF_TRAP_TYPE_IGMP_TYPE_V3_REPORT",
18+
"sample_packet": "SAI_HOSTIF_TRAP_TYPE_SAMPLEPACKET",
19+
"switch_cust_range": "SAI_HOSTIF_TRAP_TYPE_SWITCH_CUSTOM_RANGE_BASE",
20+
"arp_req": "SAI_HOSTIF_TRAP_TYPE_ARP_REQUEST",
21+
"arp_resp": "SAI_HOSTIF_TRAP_TYPE_ARP_RESPONSE",
22+
"dhcp": "SAI_HOSTIF_TRAP_TYPE_DHCP",
23+
"ospf": "SAI_HOSTIF_TRAP_TYPE_OSPF",
24+
"pim": "SAI_HOSTIF_TRAP_TYPE_PIM",
25+
"vrrp": "SAI_HOSTIF_TRAP_TYPE_VRRP",
26+
"bgp": "SAI_HOSTIF_TRAP_TYPE_BGP",
27+
"dhcpv6": "SAI_HOSTIF_TRAP_TYPE_DHCPV6",
28+
"ospfv6": "SAI_HOSTIF_TRAP_TYPE_OSPFV6",
29+
"vrrpv6": "SAI_HOSTIF_TRAP_TYPE_VRRPV6",
30+
"bgpv6": "SAI_HOSTIF_TRAP_TYPE_BGPV6",
31+
"neigh_discovery": "SAI_HOSTIF_TRAP_TYPE_IPV6_NEIGHBOR_DISCOVERY",
32+
"mld_v1_v2": "SAI_HOSTIF_TRAP_TYPE_IPV6_MLD_V1_V2",
33+
"mld_v1_report": "SAI_HOSTIF_TRAP_TYPE_IPV6_MLD_V1_REPORT",
34+
"mld_v1_done": "SAI_HOSTIF_TRAP_TYPE_IPV6_MLD_V1_DONE",
35+
"mld_v2_report": "SAI_HOSTIF_TRAP_TYPE_MLD_V2_REPORT",
36+
"ip2me": "SAI_HOSTIF_TRAP_TYPE_IP2ME",
37+
"ssh": "SAI_HOSTIF_TRAP_TYPE_SSH",
38+
"snmp": "SAI_HOSTIF_TRAP_TYPE_SNMP",
39+
"router_custom_range": "SAI_HOSTIF_TRAP_TYPE_ROUTER_CUSTOM_RANGE_BASE",
40+
"l3_mtu_error": "SAI_HOSTIF_TRAP_TYPE_L3_MTU_ERROR",
41+
"ttl_error": "SAI_HOSTIF_TRAP_TYPE_TTL_ERROR",
42+
"udld": "SAI_HOSTIF_TRAP_TYPE_UDLD",
43+
"bfd": "SAI_HOSTIF_TRAP_TYPE_BFD",
44+
"bfdv6": "SAI_HOSTIF_TRAP_TYPE_BFDV6",
45+
"src_nat_miss": "SAI_HOSTIF_TRAP_TYPE_SNAT_MISS",
46+
"dest_nat_miss": "SAI_HOSTIF_TRAP_TYPE_DNAT_MISS"
47+
}
48+
49+
CFG_COPP_TRAP_TABLE_NAME = "COPP_TRAP"
50+
CFG_COPP_GROUP_TABLE_NAME = "COPP_GROUP"
51+
APP_COPP_TABLE_NAME = "COPP_TABLE"
52+
53+
ASIC_DB_PREFIX = "ASIC_STATE"
54+
55+
ASIC_TRAP_OBJ = ASIC_DB_PREFIX + ":" + "SAI_OBJECT_TYPE_HOSTIF_TRAP"
56+
ASIC_TRAP_GROUP_OBJ = ASIC_DB_PREFIX + ":" + "SAI_OBJECT_TYPE_HOSTIF_TRAP_GROUP"
57+
ASIC_HOSTIF_TABLE_ENTRY = ASIC_DB_PREFIX + ":" + "SAI_OBJECT_TYPE_HOSTIF_TABLE_ENTRY"
58+
ASIC_HOSTIF = ASIC_DB_PREFIX + ":" + "SAI_OBJECT_TYPE_HOSTIF"
59+
ASIC_POLICER_OBJ = ASIC_DB_PREFIX + ":" + "SAI_OBJECT_TYPE_POLICER"
60+
ASIC_QUEUE_OBJ = ASIC_DB_PREFIX + ":" + "SAI_OBJECT_TYPE_QUEUE"
61+
62+
63+
class Copp(Executor):
64+
65+
ARG_NAME = "trap_id"
66+
CONFIG_FILE = "/etc/sonic/copp_cfg.json"
67+
68+
def __init__(self, match_engine=None):
69+
super().__init__(match_engine)
70+
self.copp_trap_cfg_key = ""
71+
self.trap_group = ""
72+
self.trap_id = ""
73+
self.ns = ""
74+
self.ret_temp = {}
75+
76+
def fetch_all_trap_ids(self, ret):
77+
traps = []
78+
if not ret["error"]:
79+
for key in ret["keys"]:
80+
temp_ids = ret["return_values"][key]["trap_ids"].split(",")
81+
for id in temp_ids:
82+
traps.append(id)
83+
return traps
84+
85+
def get_all_args(self, ns):
86+
all_trap_ids = set()
87+
req = MatchRequest(file=Copp.CONFIG_FILE, table=CFG_COPP_TRAP_TABLE_NAME, return_fields=["trap_ids"], ns=ns)
88+
ret = self.match_engine.fetch(req)
89+
all_trap_ids.update(self.fetch_all_trap_ids(ret))
90+
91+
req = MatchRequest(db="CONFIG_DB", table=CFG_COPP_TRAP_TABLE_NAME, return_fields=["trap_ids"], ns=ns)
92+
ret = self.match_engine.fetch(req)
93+
all_trap_ids.update(self.fetch_all_trap_ids(ret))
94+
return list(all_trap_ids)
95+
96+
def execute(self, params):
97+
self.ret_temp = create_template_dict(dbs=["CONFIG_DB", "APPL_DB", "ASIC_DB", "STATE_DB", "CONFIG_FILE"])
98+
self.ns = params["namespace"]
99+
self.trap_id = params[Copp.ARG_NAME]
100+
self.copp_trap_cfg_key = ""
101+
self.trap_group = ""
102+
self.handle_user_and_default_config()
103+
self.handle_appl_db()
104+
self.handle_asic_db()
105+
self.handle_state_db()
106+
return self.ret_temp
107+
108+
def handle_state_db(self):
109+
req = MatchRequest(db="STATE_DB", table="COPP_TRAP_TABLE", key_pattern=self.copp_trap_cfg_key)
110+
ret = self.match_engine.fetch(req)
111+
if not ret["error"] and len(ret["keys"]) > 0:
112+
self.ret_temp["STATE_DB"]["keys"].append(ret["keys"][0])
113+
else:
114+
self.ret_temp["STATE_DB"]["tables_not_found"].append("COPP_TRAP_TABLE")
115+
116+
req = MatchRequest(db="STATE_DB", table="COPP_GROUP_TABLE", key_pattern=self.trap_group)
117+
ret = self.match_engine.fetch(req)
118+
if not ret["error"] and len(ret["keys"]) > 0:
119+
self.ret_temp["STATE_DB"]["keys"].append(ret["keys"][0])
120+
else:
121+
self.ret_temp["STATE_DB"]["tables_not_found"].append("COPP_GROUP_TABLE")
122+
123+
def handle_appl_db(self):
124+
req = MatchRequest(db="APPL_DB", table=APP_COPP_TABLE_NAME, key_pattern="*", field="trap_ids",
125+
value=self.trap_id, match_entire_list=False, return_fields=["trap_group"])
126+
ret = self.match_engine.fetch(req)
127+
tg = ""
128+
if not ret["error"] and len(ret["keys"]) > 0:
129+
if len(ret["keys"]) > 1:
130+
err_str_tup = ("ERROR: Multiple COPP_TABLE Keys found for the trap_id {} in",
131+
"the APPL_DB, keys found: {}")
132+
err_str = " ".join(err_str_tup)
133+
err_str = err_str.format(self.trap_id, str(ret["keys"]))
134+
handle_multiple_keys_matched_error(err_str, ret["keys"][0])
135+
self.ret_temp["APPL_DB"]["keys"].append(ret["keys"][0])
136+
tg = ret["return_values"][ret["keys"][0]]["trap_group"]
137+
else:
138+
self.ret_temp["APPL_DB"]["tables_not_found"].append(APP_COPP_TABLE_NAME)
139+
140+
if tg != self.trap_group and not self.trap_group and not tg:
141+
err_str_tup = ("The Associated Trap_group for the trap_id found in APPL",
142+
"and CONFIG_DB/CONFIG_FILE did not match.",
143+
"In APPL_DB: {}, CONFIG_DB: {}",
144+
"\n Proceding with the trap group found in APPL DB")
145+
err_str = " ".join(err_str_tup)
146+
err_str = err_str.format(tg, self.trap_group)
147+
handle_error(err_str, False)
148+
149+
if tg:
150+
self.trap_group = tg
151+
152+
def handle_asic_db(self):
153+
if self.trap_id not in TRAP_ID_MAP:
154+
err_str = "Invalid Trap Id {} is provided, no corresponding SAI_TRAP_OBJ is found"
155+
handle_error(err_str.format(self.trap_id), False)
156+
sai_trap_id = ""
157+
else:
158+
sai_trap_id = TRAP_ID_MAP[self.trap_id]
159+
sai_trap, sai_trap_grp = self.__get_asic_hostif_trap_obj(sai_trap_id)
160+
sai_queue, sai_policer = self.__get_asic_hostif_trap_group_obj(sai_trap_grp)
161+
self.__get_asic_policer_obj(sai_policer)
162+
self.__get_asic_queue_obj(sai_queue)
163+
sai_hostif_vid = self.__get_asic_hostif_entry_obj(sai_trap)
164+
self.__get_asic_hostif_obj(sai_hostif_vid)
165+
166+
def __get_asic_hostif_trap_obj(self, sai_trap_id):
167+
if not sai_trap_id:
168+
self.ret_temp["ASIC_DB"]["tables_not_found"].append(ASIC_TRAP_OBJ)
169+
return "", ""
170+
171+
req = MatchRequest(db="ASIC_DB", table=ASIC_TRAP_OBJ, field="SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE", value=sai_trap_id,
172+
ns=self.ns, return_fields=["SAI_HOSTIF_TRAP_ATTR_TRAP_GROUP"])
173+
ret = self.match_engine.fetch(req)
174+
if not ret["error"] and len(ret["keys"]) > 0:
175+
if len(ret["keys"]) > 1:
176+
err_str = "ERROR: Multiple {} Keys found for the trap_sai_type {} in the ASIC_DB, keys found: {}".format(ASIC_TRAP_OBJ, trap_sai_obj, str(ret["keys"]))
177+
handle_multiple_keys_matched_error(err_str, ret["keys"][0])
178+
trap_asic_key = ret["keys"][0]
179+
self.ret_temp["ASIC_DB"]["keys"].append(trap_asic_key)
180+
return trap_asic_key, ret["return_values"][trap_asic_key]["SAI_HOSTIF_TRAP_ATTR_TRAP_GROUP"]
181+
else:
182+
self.ret_temp["ASIC_DB"]["tables_not_found"].append(ASIC_TRAP_OBJ)
183+
return "", ""
184+
185+
def __get_asic_hostif_trap_group_obj(self, trap_group_obj):
186+
if not trap_group_obj:
187+
self.ret_temp["ASIC_DB"]["tables_not_found"].append(ASIC_TRAP_GROUP_OBJ)
188+
return "", ""
189+
190+
req = MatchRequest(db="ASIC_DB", table=ASIC_TRAP_GROUP_OBJ, key_pattern=trap_group_obj, ns=self.ns,
191+
return_fields=["SAI_HOSTIF_TRAP_GROUP_ATTR_QUEUE", "SAI_HOSTIF_TRAP_GROUP_ATTR_POLICER"])
192+
ret = self.match_engine.fetch(req)
193+
if not ret["error"] and len(ret["keys"]) > 0:
194+
trap_group_asic_key = ret["keys"][0]
195+
self.ret_temp["ASIC_DB"]["keys"].append(trap_group_asic_key)
196+
SAI_QUEUE_INDEX = ret["return_values"][trap_group_asic_key]["SAI_HOSTIF_TRAP_GROUP_ATTR_QUEUE"]
197+
SAI_POLICER_OBJ = ret["return_values"][trap_group_asic_key]["SAI_HOSTIF_TRAP_GROUP_ATTR_POLICER"]
198+
return SAI_QUEUE_INDEX, SAI_POLICER_OBJ
199+
else:
200+
self.ret_temp["ASIC_DB"]["tables_not_found"].append(ASIC_TRAP_GROUP_OBJ)
201+
return "", ""
202+
203+
def __get_asic_policer_obj(self, policer_sai_obj):
204+
# Not adding to tables_not_found because, some of the trap_ids might not have a policer associated with them
205+
# and that is expected
206+
if not policer_sai_obj:
207+
return
208+
req = MatchRequest(db="ASIC_DB", table=ASIC_POLICER_OBJ, key_pattern=policer_sai_obj, ns=self.ns)
209+
ret = self.match_engine.fetch(req)
210+
if not ret["error"] and len(ret["keys"]) > 0:
211+
self.ret_temp["ASIC_DB"]["keys"].append(ret["keys"][0])
212+
213+
def __get_asic_queue_obj(self, queue_sai_obj):
214+
# Not adding tp tables_not_found because of the type of reason specified for policer obj
215+
if not queue_sai_obj:
216+
return
217+
req = MatchRequest(db="ASIC_DB", table=ASIC_QUEUE_OBJ, field="SAI_QUEUE_ATTR_INDEX", value=queue_sai_obj, ns=self.ns)
218+
ret = self.match_engine.fetch(req)
219+
if not ret["error"] and len(ret["keys"]) > 0:
220+
self.ret_temp["ASIC_DB"]["keys"].append(ret["keys"][0])
221+
222+
def __get_asic_hostif_entry_obj(self, sai_trap_key):
223+
# Not adding tp tables_not_found because of the type of reason specified for policer obj
224+
if not sai_trap_key:
225+
return
226+
matches = re.findall(r"oid:0x\w{1,14}", sai_trap_key)
227+
if matches:
228+
sai_trap_vid = matches[0]
229+
else:
230+
return
231+
req = MatchRequest(db="ASIC_DB", table=ASIC_HOSTIF_TABLE_ENTRY, field="SAI_HOSTIF_TABLE_ENTRY_ATTR_TRAP_ID",
232+
value=sai_trap_vid, return_fields=["SAI_HOSTIF_TABLE_ENTRY_ATTR_HOST_IF"], ns=self.ns)
233+
ret = self.match_engine.fetch(req)
234+
if not ret["error"] and len(ret["keys"]) > 0:
235+
sai_hostif_table_entry_key = ret["keys"][0]
236+
self.ret_temp["ASIC_DB"]["keys"].append(sai_hostif_table_entry_key)
237+
sai_hostif_vid = ret["return_values"][sai_hostif_table_entry_key]["SAI_HOSTIF_TABLE_ENTRY_ATTR_HOST_IF"]
238+
return sai_hostif_vid
239+
240+
def __get_asic_hostif_obj(self, sai_hostif_vid):
241+
# Not adding tp tables_not_found because of the type of reason specified for policer obj
242+
if not sai_hostif_vid:
243+
return
244+
req = MatchRequest(db="ASIC_DB", table=ASIC_HOSTIF, key_pattern=sai_hostif_vid, ns=self.ns)
245+
ret = self.match_engine.fetch(req)
246+
if not ret["error"] and len(ret["keys"]) > 0:
247+
self.ret_temp["ASIC_DB"]["keys"].append(ret["keys"][0])
248+
249+
# When the user writes config to CONFIG_DB, that takes precedence over default config
250+
def handle_user_and_default_config(self):
251+
# ------------------ Find trap_id_key and trap_group from both the sources
252+
# Search for any user-provided config for the trap-id provided
253+
trap_id_key_db, trap_group_db = self.__find_trap_id_in_db()
254+
trap_id_key_cf, trap_group_cf = "", ""
255+
if not trap_id_key_db: # If nothing is found, search in CONFIG_FILE
256+
trap_id_key_cf, trap_group_cf = self.__find_trap_id_in_conf_file()
257+
elif trap_id_key_db and not trap_group_db:
258+
_, trap_group_cf = self.__find_trap_id_in_conf_file(trap_id_key_db.split("|")[-1], False)
259+
260+
# ------------------ Find any diff and fill the return dictionary with COPP_TRAP keys
261+
if trap_id_key_db:
262+
self.ret_temp["CONFIG_DB"]["keys"].append(trap_id_key_db)
263+
self.copp_trap_cfg_key = trap_id_key_db.split("|")[-1]
264+
id_in_file, _ = self.__find_trap_id_in_conf_file(self.copp_trap_cfg_key, False)
265+
if id_in_file == trap_id_key_db: # If any diff
266+
self.ret_temp["CONFIG_FILE"]["keys"].append(trap_id_key_db)
267+
elif trap_id_key_cf:
268+
self.ret_temp["CONFIG_FILE"]["keys"].append(trap_id_key_cf)
269+
self.copp_trap_cfg_key = trap_id_key_cf.split("|")[-1]
270+
id_in_file, _ = self.__find_trap_id_in_db(self.copp_trap_cfg_key, False)
271+
if id_in_file == trap_id_key_cf: # Find the diff, if any, inside the CONFIG DB
272+
self.ret_temp["CONFIG_DB"]["keys"].append(trap_id_key_cf)
273+
else:
274+
self.ret_temp["CONFIG_FILE"]["tables_not_found"].append(CFG_COPP_TRAP_TABLE_NAME)
275+
self.ret_temp["CONFIG_DB"]["tables_not_found"].append(CFG_COPP_TRAP_TABLE_NAME)
276+
277+
# ------------------ Find any diff and fill the return dictionary with COPP_GROUP keys
278+
if trap_group_db: # Preference to User-provided Config
279+
self.trap_group = trap_group_db
280+
trap_in_cfg_file = False
281+
elif trap_group_cf: # Then, the preference to the group found in CFG_File
282+
self.trap_group = trap_group_cf
283+
trap_in_cfg_file = True
284+
else:
285+
self.ret_temp["CONFIG_FILE"]["tables_not_found"].append(CFG_COPP_GROUP_TABLE_NAME)
286+
self.ret_temp["CONFIG_DB"]["tables_not_found"].append(CFG_COPP_GROUP_TABLE_NAME)
287+
return
288+
tg_in_default = self.__fill_trap_group_in_conf_file(trap_in_cfg_file) # Check if the trap_group in cfg_file
289+
# Trap_group is expected to be in cfg_db when
290+
# 1) Trap_group is not found in cfg_file
291+
# 2) Trap_ID was provided by the user i.e trap_in_cfg_file = False
292+
# Otherwise, we're just looking for diff
293+
self.__fill_trap_group_in_conf_db(not(tg_in_default) and not(trap_in_cfg_file))
294+
295+
def __fill_trap_group_in_conf_file(self, not_found_report=True):
296+
req = MatchRequest(table=CFG_COPP_GROUP_TABLE_NAME, key_pattern=self.trap_group, ns=self.ns, file=Copp.CONFIG_FILE)
297+
ret = self.match_engine.fetch(req)
298+
key_tg = ""
299+
if not ret["error"] and len(ret["keys"]) > 0:
300+
key_tg = ret["keys"][0]
301+
self.ret_temp["CONFIG_FILE"]["keys"].append(key_tg)
302+
return True
303+
elif not_found_report:
304+
self.ret_temp["CONFIG_FILE"]["tables_not_found"].append(CFG_COPP_GROUP_TABLE_NAME)
305+
return False
306+
307+
def __fill_trap_group_in_conf_db(self, not_found_report=True):
308+
req = MatchRequest(table=CFG_COPP_GROUP_TABLE_NAME, key_pattern=self.trap_group, ns=self.ns, db="CONFIG_DB")
309+
ret = self.match_engine.fetch(req)
310+
key_tg = ""
311+
if not ret["error"] and len(ret["keys"]) > 0:
312+
key_tg = ret["keys"][0]
313+
self.ret_temp["CONFIG_DB"]["keys"].append(key_tg)
314+
return True
315+
elif not_found_report:
316+
self.ret_temp["CONFIG_DB"]["tables_not_found"].append(CFG_COPP_GROUP_TABLE_NAME)
317+
return False
318+
319+
def __find_trap_id_in_conf_file(self, key_ptrn="*", do_fv_check=True):
320+
field_, value_ = None, None
321+
if do_fv_check:
322+
field_ = "trap_ids"
323+
value_ = self.trap_id
324+
req = MatchRequest(file=Copp.CONFIG_FILE, table=CFG_COPP_TRAP_TABLE_NAME, key_pattern=key_ptrn, match_entire_list=False,
325+
ns=self.ns, return_fields=["trap_group"], field=field_, value=value_)
326+
ret = self.match_engine.fetch(req)
327+
if not ret["error"] and len(ret["keys"]) > 0:
328+
if len(ret["keys"]) > 1:
329+
err_str = "ERROR (AMBIGUITY): Multiple COPP_TRAP Keys found for the trap_id {} in the copp_init file, i.e. {}".format(self.trap_id, str(ret["keys"]))
330+
handle_multiple_keys_matched_error(err_str, ret["keys"][0])
331+
key_copp_trap = ret["keys"][0]
332+
return key_copp_trap, ret["return_values"][key_copp_trap]["trap_group"]
333+
else:
334+
return "", ""
335+
336+
def __find_trap_id_in_db(self, key_ptrn="*", do_fv_check=True):
337+
field_, value_ = None, None
338+
if do_fv_check:
339+
field_ = "trap_ids"
340+
value_ = self.trap_id
341+
req = MatchRequest(db="CONFIG_DB", table=CFG_COPP_TRAP_TABLE_NAME, key_pattern=key_ptrn, match_entire_list=False,
342+
ns=self.ns, return_fields=["trap_group"], field=field_, value=value_)
343+
ret = self.match_engine.fetch(req)
344+
if not ret["error"] and len(ret["keys"]) > 0:
345+
if len(ret["keys"]) > 1:
346+
err_str = "Multiple COPP_TRAP Keys found for the trap_id {} in the CONFIG_DB, i.e. {}".format(self.trap_id, str(ret["keys"]))
347+
handle_multiple_keys_matched_error(err_str, ret["keys"][0])
348+
key_copp_trap = ret["keys"][0]
349+
return key_copp_trap, ret["return_values"][key_copp_trap]["trap_group"]
350+
else:
351+
return "", ""

tests/dump_input/copp/appl_db.json

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"COPP_TABLE:queue4_group2": {
3+
"cbs": "6000",
4+
"cir": "6000",
5+
"meter_type": "packets",
6+
"mode": "sr_tcm",
7+
"queue": "1",
8+
"red_action": "drop",
9+
"trap_action": "trap",
10+
"trap_priority": "1",
11+
"trap_ids": "arp_req,arp_resp,neigh_discovery,snmp"
12+
},
13+
"COPP_TABLE:queue2_group1": {
14+
"cbs": "2000",
15+
"cir": "2000",
16+
"meter_type": "packets",
17+
"mode": "sr_tcm",
18+
"queue": "1",
19+
"red_action": "drop",
20+
"trap_action": "trap",
21+
"trap_priority": "1",
22+
"trap_ids": "sample_packet"
23+
},
24+
"COPP_TABLE:queue4_group1": {
25+
"trap_action":"trap",
26+
"trap_priority":"4",
27+
"queue": "4",
28+
"trap_ids": "bgp,bgpv6,ospfv6,ospf"
29+
},
30+
"COPP_TABLE:queue1_group2":{
31+
"trap_ids": "src_nat_miss",
32+
"trap_action":"trap",
33+
"trap_priority":"4",
34+
"queue": "4"
35+
}
36+
}

0 commit comments

Comments
 (0)