@@ -32,6 +32,8 @@ extern CrmOrch *gCrmOrch;
32
32
33
33
acl_rule_attr_lookup_t aclMatchLookup =
34
34
{
35
+ { MATCH_IN_PORTS, SAI_ACL_ENTRY_ATTR_FIELD_IN_PORTS },
36
+ { MATCH_OUT_PORTS, SAI_ACL_ENTRY_ATTR_FIELD_OUT_PORTS },
35
37
{ MATCH_SRC_IP, SAI_ACL_ENTRY_ATTR_FIELD_SRC_IP },
36
38
{ MATCH_DST_IP, SAI_ACL_ENTRY_ATTR_FIELD_DST_IP },
37
39
{ MATCH_SRC_IPV6, SAI_ACL_ENTRY_ATTR_FIELD_SRC_IPV6 },
@@ -108,15 +110,6 @@ static acl_ip_type_lookup_t aclIpTypeLookup =
108
110
{ IP_TYPE_ARP_REPLY, SAI_ACL_IP_TYPE_ARP_REPLY }
109
111
};
110
112
111
- inline string toUpper (const string& str)
112
- {
113
- string uppercase = str;
114
-
115
- transform (uppercase.begin (), uppercase.end (), uppercase.begin (), ::toupper);
116
-
117
- return uppercase;
118
- }
119
-
120
113
inline string trim (const std::string& str, const std::string& whitespace = " \t " )
121
114
{
122
115
const auto strBegin = str.find_first_not_of (whitespace);
@@ -171,9 +164,59 @@ bool AclRule::validateAddMatch(string attr_name, string attr_value)
171
164
{
172
165
if (aclMatchLookup.find (attr_name) == aclMatchLookup.end ())
173
166
{
167
+ SWSS_LOG_ERROR (" Failed to locate match criterion %s" ,
168
+ attr_name.c_str ());
174
169
return false ;
175
170
}
176
- else if (attr_name == MATCH_IP_TYPE)
171
+ else if (attr_name == MATCH_IN_PORTS)
172
+ {
173
+ auto ports = tokenize (attr_value, ' ,' );
174
+
175
+ if (ports.size () == 0 )
176
+ {
177
+ return false ;
178
+ }
179
+
180
+ m_inPorts.clear ();
181
+ for (auto alias : ports)
182
+ {
183
+ Port port;
184
+ if (!gPortsOrch ->getPort (alias, port))
185
+ {
186
+ SWSS_LOG_ERROR (" Failed to locate port %s" , alias.c_str ());
187
+ return false ;
188
+ }
189
+ m_inPorts.push_back (port.m_port_id );
190
+ }
191
+
192
+ value.aclfield .data .objlist .count = static_cast <uint32_t >(m_inPorts.size ());
193
+ value.aclfield .data .objlist .list = m_inPorts.data ();
194
+ }
195
+ else if (attr_name == MATCH_OUT_PORTS)
196
+ {
197
+ auto ports = tokenize (attr_value, ' ,' );
198
+
199
+ if (ports.size () == 0 )
200
+ {
201
+ return false ;
202
+ }
203
+
204
+ m_outPorts.clear ();
205
+ for (auto alias : ports)
206
+ {
207
+ Port port;
208
+ if (!gPortsOrch ->getPort (alias, port))
209
+ {
210
+ SWSS_LOG_ERROR (" Failed to locate port %s" , alias.c_str ());
211
+ return false ;
212
+ }
213
+ m_outPorts.push_back (port.m_port_id );
214
+ }
215
+
216
+ value.aclfield .data .objlist .count = static_cast <uint32_t >(m_outPorts.size ());
217
+ value.aclfield .data .objlist .list = m_outPorts.data ();
218
+ }
219
+ else if (attr_name == MATCH_IP_TYPE)
177
220
{
178
221
if (!processIpType (attr_value, value.aclfield .data .u32 ))
179
222
{
@@ -183,7 +226,7 @@ bool AclRule::validateAddMatch(string attr_name, string attr_value)
183
226
184
227
value.aclfield .mask .u32 = 0xFFFFFFFF ;
185
228
}
186
- else if (attr_name == MATCH_TCP_FLAGS)
229
+ else if (attr_name == MATCH_TCP_FLAGS)
187
230
{
188
231
vector<string> flagsData;
189
232
string flags, mask;
@@ -220,12 +263,12 @@ bool AclRule::validateAddMatch(string attr_name, string attr_value)
220
263
}
221
264
value.aclfield .mask .u8 = (uint8_t )val;
222
265
}
223
- else if (attr_name == MATCH_ETHER_TYPE || attr_name == MATCH_L4_SRC_PORT || attr_name == MATCH_L4_DST_PORT)
266
+ else if (attr_name == MATCH_ETHER_TYPE || attr_name == MATCH_L4_SRC_PORT || attr_name == MATCH_L4_DST_PORT)
224
267
{
225
268
value.aclfield .data .u16 = to_uint<uint16_t >(attr_value);
226
269
value.aclfield .mask .u16 = 0xFFFF ;
227
270
}
228
- else if (attr_name == MATCH_DSCP)
271
+ else if (attr_name == MATCH_DSCP)
229
272
{
230
273
/* Support both exact value match and value/mask match */
231
274
auto dscp_data = tokenize (attr_value, ' /' );
@@ -241,7 +284,7 @@ bool AclRule::validateAddMatch(string attr_name, string attr_value)
241
284
value.aclfield .mask .u8 = 0x3F ;
242
285
}
243
286
}
244
- else if (attr_name == MATCH_IP_PROTOCOL)
287
+ else if (attr_name == MATCH_IP_PROTOCOL)
245
288
{
246
289
value.aclfield .data .u8 = to_uint<uint8_t >(attr_value);
247
290
value.aclfield .mask .u8 = 0xFF ;
@@ -286,7 +329,7 @@ bool AclRule::validateAddMatch(string attr_name, string attr_value)
286
329
return false ;
287
330
}
288
331
}
289
- else if (attr_name == MATCH_TC)
332
+ else if (attr_name == MATCH_TC)
290
333
{
291
334
value.aclfield .data .u8 = to_uint<uint8_t >(attr_value);
292
335
value.aclfield .mask .u8 = 0xFF ;
@@ -328,7 +371,7 @@ bool AclRule::processIpType(string type, sai_uint32_t &ip_type)
328
371
{
329
372
SWSS_LOG_ENTER ();
330
373
331
- auto it = aclIpTypeLookup.find (toUpper (type));
374
+ auto it = aclIpTypeLookup.find (to_upper (type));
332
375
333
376
if (it == aclIpTypeLookup.end ())
334
377
{
@@ -428,7 +471,8 @@ bool AclRule::create()
428
471
status = sai_acl_api->create_acl_entry (&m_ruleOid, gSwitchId , (uint32_t )rule_attrs.size (), rule_attrs.data ());
429
472
if (status != SAI_STATUS_SUCCESS)
430
473
{
431
- SWSS_LOG_ERROR (" Failed to create ACL rule" );
474
+ SWSS_LOG_ERROR (" Failed to create ACL rule %s, rv:%d" ,
475
+ m_id.c_str (), status);
432
476
AclRange::remove (range_objects, range_object_list.count );
433
477
decreaseNextHopRefCount ();
434
478
}
@@ -515,7 +559,7 @@ shared_ptr<AclRule> AclRule::makeShared(acl_table_type_t type, AclOrch *acl, Mir
515
559
/* Find action configured by user. Based on action type create rule. */
516
560
for (const auto & itr : kfvFieldsValues (data))
517
561
{
518
- string attr_name = toUpper (fvField (itr));
562
+ string attr_name = to_upper (fvField (itr));
519
563
string attr_value = fvValue (itr);
520
564
if (attr_name == ACTION_PACKET_ACTION || attr_name == ACTION_MIRROR_ACTION ||
521
565
attr_name == ACTION_DTEL_FLOW_OP || attr_name == ACTION_DTEL_INT_SESSION ||
@@ -660,7 +704,7 @@ bool AclRuleL3::validateAddAction(string attr_name, string _attr_value)
660
704
{
661
705
SWSS_LOG_ENTER ();
662
706
663
- string attr_value = toUpper (_attr_value);
707
+ string attr_value = to_upper (_attr_value);
664
708
sai_attribute_value_t value;
665
709
666
710
if (attr_name != ACTION_PACKET_ACTION)
@@ -764,7 +808,7 @@ sai_object_id_t AclRuleL3::getRedirectObjectId(const string& redirect_value)
764
808
{
765
809
SWSS_LOG_INFO (" ACL Redirect action target next hop group: '%s' doesn't exist on the switch. Creating it." , ips.to_string ().c_str ());
766
810
767
- if (!m_pAclOrch->m_routeOrch ->addNextHopGroup (ips))
811
+ if (!m_pAclOrch->m_routeOrch ->addNextHopGroup (ips))
768
812
{
769
813
SWSS_LOG_ERROR (" Can't create required target next hop group '%s'" , ips.to_string ().c_str ());
770
814
return SAI_NULL_OBJECT_ID;
@@ -1013,6 +1057,7 @@ bool AclTable::validate()
1013
1057
if (type == ACL_TABLE_UNKNOWN || type == ACL_TABLE_CTRLPLANE) return false ;
1014
1058
if (stage == ACL_STAGE_UNKNOWN) return false ;
1015
1059
if (portSet.empty ()) return false ;
1060
+
1016
1061
return true ;
1017
1062
}
1018
1063
@@ -1022,11 +1067,17 @@ bool AclTable::create()
1022
1067
1023
1068
sai_attribute_t attr;
1024
1069
vector<sai_attribute_t > table_attrs;
1025
- vector<int32_t > bpoint_list = { SAI_ACL_BIND_POINT_TYPE_PORT, SAI_ACL_BIND_POINT_TYPE_LAG };
1070
+ vector<int32_t > bpoint_list;
1071
+
1072
+ // PFC watch dog ACLs are only applied to port
1026
1073
if (type == ACL_TABLE_PFCWD)
1027
1074
{
1028
1075
bpoint_list = { SAI_ACL_BIND_POINT_TYPE_PORT };
1029
1076
}
1077
+ else
1078
+ {
1079
+ bpoint_list = { SAI_ACL_BIND_POINT_TYPE_PORT, SAI_ACL_BIND_POINT_TYPE_LAG };
1080
+ }
1030
1081
1031
1082
attr.id = SAI_ACL_TABLE_ATTR_ACL_BIND_POINT_TYPE_LIST;
1032
1083
attr.value .s32list .count = static_cast <uint32_t >(bpoint_list.size ());
@@ -1085,6 +1136,7 @@ bool AclTable::create()
1085
1136
attr.value .booldata = true ;
1086
1137
table_attrs.push_back (attr);
1087
1138
}
1139
+
1088
1140
attr.id = SAI_ACL_TABLE_ATTR_FIELD_L4_SRC_PORT;
1089
1141
attr.value .booldata = true ;
1090
1142
table_attrs.push_back (attr);
@@ -1097,7 +1149,7 @@ bool AclTable::create()
1097
1149
attr.value .booldata = true ;
1098
1150
table_attrs.push_back (attr);
1099
1151
1100
- if (stage == ACL_STAGE_INGRESS)
1152
+ if (stage == ACL_STAGE_INGRESS)
1101
1153
{
1102
1154
int32_t range_types_list[] = { SAI_ACL_RANGE_TYPE_L4_DST_PORT_RANGE, SAI_ACL_RANGE_TYPE_L4_SRC_PORT_RANGE };
1103
1155
attr.id = SAI_ACL_TABLE_ATTR_FIELD_ACL_RANGE_TYPE;
@@ -1287,7 +1339,7 @@ bool AclRuleDTelFlowWatchListEntry::validateAddAction(string attr_name, string a
1287
1339
SWSS_LOG_ENTER ();
1288
1340
1289
1341
sai_attribute_value_t value;
1290
- string attr_value = toUpper (attr_val);
1342
+ string attr_value = to_upper (attr_val);
1291
1343
sai_object_id_t session_oid;
1292
1344
1293
1345
if (!m_pDTelOrch ||
@@ -1366,7 +1418,7 @@ bool AclRuleDTelFlowWatchListEntry::validate()
1366
1418
{
1367
1419
SWSS_LOG_ENTER ();
1368
1420
1369
- if (!m_pDTelOrch)
1421
+ if (!m_pDTelOrch)
1370
1422
{
1371
1423
return false ;
1372
1424
}
@@ -1503,7 +1555,7 @@ bool AclRuleDTelDropWatchListEntry::validateAddAction(string attr_name, string a
1503
1555
}
1504
1556
1505
1557
sai_attribute_value_t value;
1506
- string attr_value = toUpper (attr_val);
1558
+ string attr_value = to_upper (attr_val);
1507
1559
1508
1560
if (attr_name != ACTION_DTEL_DROP_REPORT_ENABLE &&
1509
1561
attr_name != ACTION_DTEL_TAIL_DROP_REPORT_ENABLE)
@@ -1556,7 +1608,7 @@ AclRange *AclRange::create(sai_acl_range_type_t type, int min, int max)
1556
1608
1557
1609
acl_range_properties_t rangeProperties = make_tuple (type, min, max);
1558
1610
auto range_it = m_ranges.find (rangeProperties);
1559
- if (range_it == m_ranges.end ())
1611
+ if (range_it == m_ranges.end ())
1560
1612
{
1561
1613
sai_attribute_t attr;
1562
1614
vector<sai_attribute_t > range_attrs;
@@ -1611,7 +1663,7 @@ bool AclRange::remove(sai_acl_range_type_t type, int min, int max)
1611
1663
1612
1664
auto range_it = m_ranges.find (make_tuple (type, min, max));
1613
1665
1614
- if (range_it == m_ranges.end ())
1666
+ if (range_it == m_ranges.end ())
1615
1667
{
1616
1668
return false ;
1617
1669
}
@@ -1733,7 +1785,7 @@ AclOrch::~AclOrch()
1733
1785
{
1734
1786
m_mirrorOrch->detach (this );
1735
1787
1736
- if (m_dTelOrch)
1788
+ if (m_dTelOrch)
1737
1789
{
1738
1790
m_dTelOrch->detach (this );
1739
1791
}
@@ -1905,7 +1957,7 @@ void AclOrch::doAclTableTask(Consumer &consumer)
1905
1957
{
1906
1958
newTable.id = table_id;
1907
1959
1908
- string attr_name = toUpper (fvField (itp));
1960
+ string attr_name = to_upper (fvField (itp));
1909
1961
string attr_value = fvValue (itp);
1910
1962
1911
1963
SWSS_LOG_DEBUG (" TABLE ATTRIBUTE: %s : %s" , attr_name.c_str (), attr_value.c_str ());
@@ -2016,7 +2068,7 @@ void AclOrch::doAclRuleTask(Consumer &consumer)
2016
2068
2017
2069
for (const auto & itr : kfvFieldsValues (t))
2018
2070
{
2019
- string attr_name = toUpper (fvField (itr));
2071
+ string attr_name = to_upper (fvField (itr));
2020
2072
string attr_value = fvValue (itr);
2021
2073
2022
2074
SWSS_LOG_INFO (" ATTRIBUTE: %s %s" , attr_name.c_str (), attr_value.c_str ());
@@ -2044,7 +2096,7 @@ void AclOrch::doAclRuleTask(Consumer &consumer)
2044
2096
// validate and create ACL rule
2045
2097
if (bAllAttributesOk && newRule->validate ())
2046
2098
{
2047
- if (addAclRule (newRule, table_id))
2099
+ if (addAclRule (newRule, table_id))
2048
2100
it = consumer.m_toSync .erase (it);
2049
2101
else
2050
2102
it++;
@@ -2057,7 +2109,7 @@ void AclOrch::doAclRuleTask(Consumer &consumer)
2057
2109
}
2058
2110
else if (op == DEL_COMMAND)
2059
2111
{
2060
- if (removeAclRule (table_id, rule_id))
2112
+ if (removeAclRule (table_id, rule_id))
2061
2113
it = consumer.m_toSync .erase (it);
2062
2114
else
2063
2115
it++;
@@ -2213,7 +2265,7 @@ bool AclOrch::processAclTableType(string type, acl_table_type_t &table_type)
2213
2265
{
2214
2266
SWSS_LOG_ENTER ();
2215
2267
2216
- auto tt = aclTableTypeLookUp.find (toUpper (type));
2268
+ auto tt = aclTableTypeLookUp.find (to_upper (type));
2217
2269
2218
2270
if (tt == aclTableTypeLookUp.end ())
2219
2271
{
@@ -2229,7 +2281,7 @@ bool AclOrch::processAclTableStage(string stage, acl_stage_type_t &acl_stage)
2229
2281
{
2230
2282
SWSS_LOG_ENTER ();
2231
2283
2232
- auto iter = aclStageLookUp.find (toUpper (stage));
2284
+ auto iter = aclStageLookUp.find (to_upper (stage));
2233
2285
2234
2286
if (iter == aclStageLookUp.end ())
2235
2287
{
0 commit comments