Skip to content

Commit 700492f

Browse files
[aclorch] Fix and simplify DTel watchlist tables and entries (#2155)
* Fix DTel acl rule creation The significant rewrite of aclorch when adding ACL_TABLE_TYPE configuration caused a bug that prevents configuration of any DTel rules. This is due to use of an incorrect set of enum mappings while determining which type of AclRule to create.
1 parent 59f77ea commit 700492f

File tree

4 files changed

+140
-115
lines changed

4 files changed

+140
-115
lines changed

orchagent/aclorch.cpp

+33-100
Original file line numberDiff line numberDiff line change
@@ -1455,23 +1455,14 @@ shared_ptr<AclRule> AclRule::makeShared(AclOrch *acl, MirrorOrch *mirror, DTelOr
14551455
{
14561456
return make_shared<AclRulePacket>(acl, rule, table);
14571457
}
1458-
else if (aclDTelFlowOpTypeLookup.find(action) != aclDTelFlowOpTypeLookup.cend())
1458+
else if (aclDTelActionLookup.find(action) != aclDTelActionLookup.cend())
14591459
{
14601460
if (!dtel)
14611461
{
14621462
throw runtime_error("DTel feature is not enabled. Watchlists cannot be configured");
14631463
}
14641464

1465-
if (action == ACTION_DTEL_DROP_REPORT_ENABLE ||
1466-
action == ACTION_DTEL_TAIL_DROP_REPORT_ENABLE ||
1467-
action == ACTION_DTEL_REPORT_ALL_PACKETS)
1468-
{
1469-
return make_shared<AclRuleDTelDropWatchListEntry>(acl, dtel, rule, table);
1470-
}
1471-
else
1472-
{
1473-
return make_shared<AclRuleDTelFlowWatchListEntry>(acl, dtel, rule, table);
1474-
}
1465+
return make_shared<AclRuleDTelWatchListEntry>(acl, dtel, rule, table);
14751466
}
14761467
}
14771468

@@ -2447,13 +2438,13 @@ bool AclTable::clear()
24472438
return true;
24482439
}
24492440

2450-
AclRuleDTelFlowWatchListEntry::AclRuleDTelFlowWatchListEntry(AclOrch *aclOrch, DTelOrch *dtel, string rule, string table) :
2441+
AclRuleDTelWatchListEntry::AclRuleDTelWatchListEntry(AclOrch *aclOrch, DTelOrch *dtel, string rule, string table) :
24512442
AclRule(aclOrch, rule, table),
24522443
m_pDTelOrch(dtel)
24532444
{
24542445
}
24552446

2456-
bool AclRuleDTelFlowWatchListEntry::validateAddAction(string attr_name, string attr_val)
2447+
bool AclRuleDTelWatchListEntry::validateAddAction(string attr_name, string attr_val)
24572448
{
24582449
SWSS_LOG_ENTER();
24592450

@@ -2535,7 +2526,7 @@ bool AclRuleDTelFlowWatchListEntry::validateAddAction(string attr_name, string a
25352526
return setAction(aclDTelActionLookup[attr_name], actionData);
25362527
}
25372528

2538-
bool AclRuleDTelFlowWatchListEntry::validate()
2529+
bool AclRuleDTelWatchListEntry::validate()
25392530
{
25402531
SWSS_LOG_ENTER();
25412532

@@ -2552,19 +2543,19 @@ bool AclRuleDTelFlowWatchListEntry::validate()
25522543
return true;
25532544
}
25542545

2555-
bool AclRuleDTelFlowWatchListEntry::createRule()
2546+
bool AclRuleDTelWatchListEntry::createRule()
25562547
{
25572548
SWSS_LOG_ENTER();
25582549

25592550
return activate();
25602551
}
25612552

2562-
bool AclRuleDTelFlowWatchListEntry::removeRule()
2553+
bool AclRuleDTelWatchListEntry::removeRule()
25632554
{
25642555
return deactivate();
25652556
}
25662557

2567-
bool AclRuleDTelFlowWatchListEntry::activate()
2558+
bool AclRuleDTelWatchListEntry::activate()
25682559
{
25692560
SWSS_LOG_ENTER();
25702561

@@ -2581,7 +2572,7 @@ bool AclRuleDTelFlowWatchListEntry::activate()
25812572
return AclRule::createRule();
25822573
}
25832574

2584-
bool AclRuleDTelFlowWatchListEntry::deactivate()
2575+
bool AclRuleDTelWatchListEntry::deactivate()
25852576
{
25862577
SWSS_LOG_ENTER();
25872578

@@ -2612,7 +2603,7 @@ bool AclRuleDTelFlowWatchListEntry::deactivate()
26122603
return true;
26132604
}
26142605

2615-
void AclRuleDTelFlowWatchListEntry::onUpdate(SubjectType type, void *cntx)
2606+
void AclRuleDTelWatchListEntry::onUpdate(SubjectType type, void *cntx)
26162607
{
26172608
sai_acl_action_data_t actionData;
26182609
sai_object_id_t session_oid = SAI_NULL_OBJECT_ID;
@@ -2673,72 +2664,19 @@ void AclRuleDTelFlowWatchListEntry::onUpdate(SubjectType type, void *cntx)
26732664
}
26742665
}
26752666

2676-
bool AclRuleDTelFlowWatchListEntry::update(const AclRule& rule)
2667+
bool AclRuleDTelWatchListEntry::update(const AclRule& rule)
26772668
{
2678-
auto dtelDropWathcListRule = dynamic_cast<const AclRuleDTelFlowWatchListEntry*>(&rule);
2679-
if (!dtelDropWathcListRule)
2669+
auto dtelWatchListRule = dynamic_cast<const AclRuleDTelWatchListEntry*>(&rule);
2670+
if (!dtelWatchListRule)
26802671
{
2681-
SWSS_LOG_ERROR("Cannot update DTEL flow watch list rule with a rule of a different type");
2672+
SWSS_LOG_ERROR("Cannot update DTEL watch list rule with a rule of a different type");
26822673
return false;
26832674
}
26842675

2685-
SWSS_LOG_ERROR("Updating DTEL flow watch list rule is currently not implemented");
2676+
SWSS_LOG_ERROR("Updating DTEL watch list rule is currently not implemented");
26862677
return false;
26872678
}
26882679

2689-
AclRuleDTelDropWatchListEntry::AclRuleDTelDropWatchListEntry(AclOrch *aclOrch, DTelOrch *dtel, string rule, string table) :
2690-
AclRule(aclOrch, rule, table),
2691-
m_pDTelOrch(dtel)
2692-
{
2693-
}
2694-
2695-
bool AclRuleDTelDropWatchListEntry::validateAddAction(string attr_name, string attr_val)
2696-
{
2697-
SWSS_LOG_ENTER();
2698-
2699-
if (!m_pDTelOrch)
2700-
{
2701-
return false;
2702-
}
2703-
2704-
sai_acl_action_data_t actionData;
2705-
string attr_value = to_upper(attr_val);
2706-
2707-
if (attr_name != ACTION_DTEL_DROP_REPORT_ENABLE &&
2708-
attr_name != ACTION_DTEL_TAIL_DROP_REPORT_ENABLE &&
2709-
attr_name != ACTION_DTEL_REPORT_ALL_PACKETS)
2710-
{
2711-
return false;
2712-
}
2713-
2714-
actionData.parameter.booldata = (attr_value == DTEL_ENABLED) ? true : false;
2715-
actionData.enable = (attr_value == DTEL_ENABLED) ? true : false;
2716-
2717-
return setAction(aclDTelActionLookup[attr_name], actionData);
2718-
}
2719-
2720-
bool AclRuleDTelDropWatchListEntry::validate()
2721-
{
2722-
SWSS_LOG_ENTER();
2723-
2724-
if (!m_pDTelOrch)
2725-
{
2726-
return false;
2727-
}
2728-
2729-
if ((m_rangeConfig.empty() && m_matches.empty()) || m_actions.size() == 0)
2730-
{
2731-
return false;
2732-
}
2733-
2734-
return true;
2735-
}
2736-
2737-
void AclRuleDTelDropWatchListEntry::onUpdate(SubjectType, void *)
2738-
{
2739-
// Do nothing
2740-
}
2741-
27422680
AclRange::AclRange(sai_acl_range_type_t type, sai_object_id_t oid, int min, int max):
27432681
m_oid(oid), m_refCnt(0), m_min(min), m_max(max), m_type(type)
27442682
{
@@ -4619,11 +4557,10 @@ void AclOrch::createDTelWatchListTables()
46194557

46204558
AclTableTypeBuilder builder;
46214559

4622-
AclTable flowWLTable(this, TABLE_TYPE_DTEL_FLOW_WATCHLIST);
4623-
AclTable dropWLTable(this, TABLE_TYPE_DTEL_DROP_WATCHLIST);
4560+
AclTable dtelWLTable(this, TABLE_TYPE_DTEL_FLOW_WATCHLIST);
46244561

4625-
flowWLTable.validateAddStage(ACL_STAGE_INGRESS);
4626-
flowWLTable.validateAddType(builder
4562+
dtelWLTable.validateAddStage(ACL_STAGE_INGRESS);
4563+
dtelWLTable.validateAddType(builder
46274564
.withBindPointType(SAI_ACL_BIND_POINT_TYPE_SWITCH)
46284565
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_ETHER_TYPE))
46294566
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_SRC_IP))
@@ -4635,39 +4572,35 @@ void AclOrch::createDTelWatchListTables()
46354572
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_INNER_ETHER_TYPE))
46364573
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_INNER_SRC_IP))
46374574
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_INNER_DST_IP))
4575+
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_OUTER_VLAN_ID))
4576+
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE))
4577+
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_TCP_FLAGS))
4578+
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_DSCP))
4579+
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_SRC_IPV6))
4580+
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_DST_IPV6))
4581+
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_ICMP_TYPE))
4582+
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_ICMP_CODE))
4583+
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_ICMPV6_TYPE))
4584+
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_ICMPV6_CODE))
4585+
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_IPV6_NEXT_HEADER))
46384586
.withAction(SAI_ACL_ACTION_TYPE_ACL_DTEL_FLOW_OP)
46394587
.withAction(SAI_ACL_ACTION_TYPE_DTEL_INT_SESSION)
4640-
.withAction(SAI_ACL_ACTION_TYPE_DTEL_REPORT_ALL_PACKETS)
4641-
.withAction(SAI_ACL_ACTION_TYPE_DTEL_FLOW_SAMPLE_PERCENT)
4642-
.build()
4643-
);
4644-
flowWLTable.setDescription("Dataplane Telemetry Flow Watchlist table");
4645-
4646-
dropWLTable.validateAddStage(ACL_STAGE_INGRESS);
4647-
dropWLTable.validateAddType(builder
4648-
.withBindPointType(SAI_ACL_BIND_POINT_TYPE_SWITCH)
4649-
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_ETHER_TYPE))
4650-
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_SRC_IP))
4651-
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_DST_IP))
4652-
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_L4_SRC_PORT))
4653-
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_L4_DST_PORT))
4654-
.withMatch(make_shared<AclTableMatch>(SAI_ACL_TABLE_ATTR_FIELD_IP_PROTOCOL))
46554588
.withAction(SAI_ACL_ACTION_TYPE_DTEL_DROP_REPORT_ENABLE)
46564589
.withAction(SAI_ACL_ACTION_TYPE_DTEL_TAIL_DROP_REPORT_ENABLE)
4590+
.withAction(SAI_ACL_ACTION_TYPE_DTEL_REPORT_ALL_PACKETS)
4591+
.withAction(SAI_ACL_ACTION_TYPE_DTEL_FLOW_SAMPLE_PERCENT)
46574592
.build()
46584593
);
4659-
dropWLTable.setDescription("Dataplane Telemetry Drop Watchlist table");
4594+
dtelWLTable.setDescription("Dataplane Telemetry Watchlist table");
46604595

4661-
addAclTable(flowWLTable);
4662-
addAclTable(dropWLTable);
4596+
addAclTable(dtelWLTable);
46634597
}
46644598

46654599
void AclOrch::deleteDTelWatchListTables()
46664600
{
46674601
SWSS_LOG_ENTER();
46684602

46694603
removeAclTable(TABLE_TYPE_DTEL_FLOW_WATCHLIST);
4670-
removeAclTable(TABLE_TYPE_DTEL_DROP_WATCHLIST);
46714604
}
46724605

46734606
void AclOrch::registerFlexCounter(const AclRule& rule)

orchagent/aclorch.h

+2-13
Original file line numberDiff line numberDiff line change
@@ -339,10 +339,10 @@ class AclRuleMirror: public AclRule
339339
MirrorOrch *m_pMirrorOrch {nullptr};
340340
};
341341

342-
class AclRuleDTelFlowWatchListEntry: public AclRule
342+
class AclRuleDTelWatchListEntry: public AclRule
343343
{
344344
public:
345-
AclRuleDTelFlowWatchListEntry(AclOrch *m_pAclOrch, DTelOrch *m_pDTelOrch, string rule, string table);
345+
AclRuleDTelWatchListEntry(AclOrch *m_pAclOrch, DTelOrch *m_pDTelOrch, string rule, string table);
346346
bool validateAddAction(string attr_name, string attr_value);
347347
bool validate();
348348
bool createRule();
@@ -360,17 +360,6 @@ class AclRuleDTelFlowWatchListEntry: public AclRule
360360
bool INT_session_valid;
361361
};
362362

363-
class AclRuleDTelDropWatchListEntry: public AclRule
364-
{
365-
public:
366-
AclRuleDTelDropWatchListEntry(AclOrch *m_pAclOrch, DTelOrch *m_pDTelOrch, string rule, string table);
367-
bool validateAddAction(string attr_name, string attr_value);
368-
bool validate();
369-
void onUpdate(SubjectType, void *) override;
370-
protected:
371-
DTelOrch *m_pDTelOrch;
372-
};
373-
374363
class AclTable
375364
{
376365
public:

orchagent/acltable.h

-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ extern "C" {
3131
#define TABLE_TYPE_PFCWD "PFCWD"
3232
#define TABLE_TYPE_CTRLPLANE "CTRLPLANE"
3333
#define TABLE_TYPE_DTEL_FLOW_WATCHLIST "DTEL_FLOW_WATCHLIST"
34-
#define TABLE_TYPE_DTEL_DROP_WATCHLIST "DTEL_DROP_WATCHLIST"
3534
#define TABLE_TYPE_MCLAG "MCLAG"
3635
#define TABLE_TYPE_MUX "MUX"
3736
#define TABLE_TYPE_DROP "DROP"

tests/test_dtel.py

+105-1
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,111 @@ def test_DtelQueueReportAttribs(self, dvs, testlog):
211211
assert False
212212

213213
tbl._del("Ethernet0|0")
214-
214+
215+
def test_DtelFlowWatchlist(self, dvs, testlog):
216+
self.db = swsscommon.DBConnector(4, dvs.redis_sock, 0)
217+
self.adb = swsscommon.DBConnector(1, dvs.redis_sock, 0)
218+
self.table = "DTEL_FLOW_WATCHLIST"
219+
220+
fields_1=[("PRIORITY", "30"),
221+
("ETHER_TYPE", "0x800"),
222+
("L4_DST_PORT", "1674"),
223+
("FLOW_OP", "POSTCARD"),
224+
("REPORT_ALL_PACKETS", "FALSE"),
225+
("DROP_REPORT_ENABLE", "TRUE"),
226+
("TAIL_DROP_REPORT_ENABLE", "TRUE")]
227+
fields_2=[("PRIORITY", "40"),
228+
("ETHER_TYPE", "0x800"),
229+
("L4_DST_PORT", "1674"),
230+
("FLOW_OP", "POSTCARD"),
231+
("REPORT_ALL_PACKETS", "TRUE"),
232+
("DROP_REPORT_ENABLE", "FALSE"),
233+
("TAIL_DROP_REPORT_ENABLE", "FALSE")]
234+
fields_3=[("PRIORITY", "50"),
235+
("ETHER_TYPE", "0x800"),
236+
("L4_DST_PORT", "1674"),
237+
("FLOW_OP", "POSTCARD"),
238+
("REPORT_ALL_PACKETS", "TRUE")]
239+
fields_4=[("PRIORITY", "60"),
240+
("ETHER_TYPE", "0x800"),
241+
("L4_DST_PORT", "1674"),
242+
("REPORT_ALL_PACKETS", "TRUE"),
243+
("DROP_REPORT_ENABLE", "TRUE"),
244+
("TAIL_DROP_REPORT_ENABLE", "TRUE")]
245+
fields_5=[("PRIORITY", "70"),
246+
("ETHER_TYPE", "0x800"),
247+
("L4_DST_PORT", "1674"),
248+
("FLOW_OP", "NOP"),
249+
("REPORT_ALL_PACKETS", "FALSE"),
250+
("DROP_REPORT_ENABLE", "TRUE"),
251+
("TAIL_DROP_REPORT_ENABLE", "TRUE")]
252+
listfield = [fields_1, fields_2, fields_3, fields_4, fields_5]
253+
254+
for field in listfield:
255+
k = listfield.index(field)
256+
rule = "RULE-" + str(k)
257+
self._create_dtel_acl_rule(self.table, rule, field)
258+
self._check_dtel_acl_rule(dvs, rule)
259+
self._remove_dtel_acl_rule(self.table, rule)
260+
261+
def _create_dtel_acl_rule(self, table, rule, field):
262+
tbl = swsscommon.Table(self.db, "ACL_RULE")
263+
fvs = swsscommon.FieldValuePairs(field)
264+
tbl.set(table + "|" + rule, fvs)
265+
time.sleep(1)
266+
267+
def _remove_dtel_acl_rule(self, table, rule):
268+
tbl = swsscommon.Table(self.db, "ACL_RULE")
269+
tbl._del(table + "|" + rule)
270+
time.sleep(1)
271+
272+
def _check_dtel_acl_rule(self, dvs, rule):
273+
time.sleep(1)
274+
atbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_ACL_ENTRY")
275+
keys = atbl.getKeys()
276+
acl_entry = [k for k in keys if k not in dvs.asicdb.default_acl_entries]
277+
assert len(acl_entry) != 0
278+
(status, fvs) = atbl.get(acl_entry[0])
279+
value = dict(fvs)
280+
assert status
281+
282+
if rule == "RULE-0":
283+
assert value["SAI_ACL_ENTRY_ATTR_PRIORITY"] == "30"
284+
assert value["SAI_ACL_ENTRY_ATTR_FIELD_ETHER_TYPE"] == "2048&mask:0xffff"
285+
assert value["SAI_ACL_ENTRY_ATTR_FIELD_L4_DST_PORT"] == "1674&mask:0xffff"
286+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_ACL_DTEL_FLOW_OP"] == "SAI_ACL_DTEL_FLOW_OP_POSTCARD"
287+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_REPORT_ALL_PACKETS"] == "disabled"
288+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_DROP_REPORT_ENABLE"] == "true"
289+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_TAIL_DROP_REPORT_ENABLE"] == "true"
290+
elif rule == "RULE-1":
291+
assert value["SAI_ACL_ENTRY_ATTR_PRIORITY"] == "40"
292+
assert value["SAI_ACL_ENTRY_ATTR_FIELD_ETHER_TYPE"] == "2048&mask:0xffff"
293+
assert value["SAI_ACL_ENTRY_ATTR_FIELD_L4_DST_PORT"] == "1674&mask:0xffff"
294+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_ACL_DTEL_FLOW_OP"] == "SAI_ACL_DTEL_FLOW_OP_POSTCARD"
295+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_REPORT_ALL_PACKETS"] == "true"
296+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_DROP_REPORT_ENABLE"] == "disabled"
297+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_TAIL_DROP_REPORT_ENABLE"] == "disabled"
298+
elif rule == "RULE-2":
299+
assert value["SAI_ACL_ENTRY_ATTR_PRIORITY"] == "50"
300+
assert value["SAI_ACL_ENTRY_ATTR_FIELD_ETHER_TYPE"] == "2048&mask:0xffff"
301+
assert value["SAI_ACL_ENTRY_ATTR_FIELD_L4_DST_PORT"] == "1674&mask:0xffff"
302+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_ACL_DTEL_FLOW_OP"] == "SAI_ACL_DTEL_FLOW_OP_POSTCARD"
303+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_REPORT_ALL_PACKETS"] == "true"
304+
elif rule == "RULE-3":
305+
assert value["SAI_ACL_ENTRY_ATTR_PRIORITY"] == "60"
306+
assert value["SAI_ACL_ENTRY_ATTR_FIELD_ETHER_TYPE"] == "2048&mask:0xffff"
307+
assert value["SAI_ACL_ENTRY_ATTR_FIELD_L4_DST_PORT"] == "1674&mask:0xffff"
308+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_REPORT_ALL_PACKETS"] == "true"
309+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_DROP_REPORT_ENABLE"] == "true"
310+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_TAIL_DROP_REPORT_ENABLE"] == "true"
311+
elif rule == "RULE-4":
312+
assert value["SAI_ACL_ENTRY_ATTR_PRIORITY"] == "70"
313+
assert value["SAI_ACL_ENTRY_ATTR_FIELD_ETHER_TYPE"] == "2048&mask:0xffff"
314+
assert value["SAI_ACL_ENTRY_ATTR_FIELD_L4_DST_PORT"] == "1674&mask:0xffff"
315+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_ACL_DTEL_FLOW_OP"] == "SAI_ACL_DTEL_FLOW_OP_NOP"
316+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_REPORT_ALL_PACKETS"] == "disabled"
317+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_DROP_REPORT_ENABLE"] == "true"
318+
assert value["SAI_ACL_ENTRY_ATTR_ACTION_DTEL_TAIL_DROP_REPORT_ENABLE"] == "true"
215319

216320
def test_DtelEventAttribs(self, dvs, testlog):
217321

0 commit comments

Comments
 (0)