@@ -35,6 +35,8 @@ extern CrmOrch *gCrmOrch;
35
35
#define MIN_VLAN_ID 1 // 0 is a reserved VLAN ID
36
36
#define MAX_VLAN_ID 4095 // 4096 is a reserved VLAN ID
37
37
38
+ const int TCP_PROTOCOL_NUM = 6 ; // TCP protocol number
39
+
38
40
acl_rule_attr_lookup_t aclMatchLookup =
39
41
{
40
42
{ MATCH_IN_PORTS, SAI_ACL_ENTRY_ATTR_FIELD_IN_PORTS },
@@ -645,7 +647,7 @@ void AclRule::updateInPorts()
645
647
attr.id = SAI_ACL_ENTRY_ATTR_FIELD_IN_PORTS;
646
648
attr.value = m_matches[SAI_ACL_ENTRY_ATTR_FIELD_IN_PORTS];
647
649
attr.value .aclfield .enable = true ;
648
-
650
+
649
651
status = sai_acl_api->set_acl_entry_attribute (m_ruleOid, &attr);
650
652
if (status != SAI_STATUS_SUCCESS)
651
653
{
@@ -1378,14 +1380,14 @@ bool AclTable::create()
1378
1380
attr.id = SAI_ACL_TABLE_ATTR_ACL_STAGE;
1379
1381
attr.value .s32 = (stage == ACL_STAGE_INGRESS) ? SAI_ACL_STAGE_INGRESS : SAI_ACL_STAGE_EGRESS;
1380
1382
table_attrs.push_back (attr);
1381
-
1383
+
1382
1384
if (stage == ACL_STAGE_INGRESS)
1383
1385
{
1384
1386
attr.id = SAI_ACL_TABLE_ATTR_FIELD_IN_PORTS;
1385
1387
attr.value .booldata = true ;
1386
1388
table_attrs.push_back (attr);
1387
1389
}
1388
-
1390
+
1389
1391
sai_status_t status = sai_acl_api->create_acl_table (&m_oid, gSwitchId , (uint32_t )table_attrs.size (), table_attrs.data ());
1390
1392
1391
1393
if (status == SAI_STATUS_SUCCESS)
@@ -2985,11 +2987,11 @@ AclRule* AclOrch::getAclRule(string table_id, string rule_id)
2985
2987
bool AclOrch::updateAclRule (string table_id, string rule_id, string attr_name, void *data, bool oper)
2986
2988
{
2987
2989
SWSS_LOG_ENTER ();
2988
-
2990
+
2989
2991
sai_object_id_t table_oid = getTableById (table_id);
2990
2992
string attr_value;
2991
2993
2992
- if (table_oid == SAI_NULL_OBJECT_ID)
2994
+ if (table_oid == SAI_NULL_OBJECT_ID)
2993
2995
{
2994
2996
SWSS_LOG_ERROR (" Failed to update ACL rule in ACL table %s. Table doesn't exist" , table_id.c_str ());
2995
2997
return false ;
@@ -3002,29 +3004,29 @@ bool AclOrch::updateAclRule(string table_id, string rule_id, string attr_name, v
3002
3004
return false ;
3003
3005
}
3004
3006
3005
- switch (aclMatchLookup[attr_name])
3007
+ switch (aclMatchLookup[attr_name])
3006
3008
{
3007
3009
case SAI_ACL_ENTRY_ATTR_FIELD_IN_PORTS:
3008
3010
{
3009
3011
sai_object_id_t port_oid = *(sai_object_id_t *)data;
3010
3012
vector<sai_object_id_t > in_ports = rule_it->second ->getInPorts ();
3011
3013
3012
- if (oper == RULE_OPER_ADD)
3014
+ if (oper == RULE_OPER_ADD)
3013
3015
{
3014
3016
in_ports.push_back (port_oid);
3015
- }
3016
- else
3017
+ }
3018
+ else
3017
3019
{
3018
3020
for (auto port_iter = in_ports.begin (); port_iter != in_ports.end (); port_iter++)
3019
3021
{
3020
- if (*port_iter == port_oid)
3022
+ if (*port_iter == port_oid)
3021
3023
{
3022
3024
in_ports.erase (port_iter);
3023
3025
break ;
3024
3026
}
3025
3027
}
3026
3028
}
3027
-
3029
+
3028
3030
for (const auto & port_iter: in_ports)
3029
3031
{
3030
3032
Port p;
@@ -3277,14 +3279,22 @@ void AclOrch::doAclRuleTask(Consumer &consumer)
3277
3279
it = consumer.m_toSync .erase (it);
3278
3280
return ;
3279
3281
}
3280
-
3282
+ bool bHasTCPFlag = false ;
3283
+ bool bHasIPProtocol = false ;
3281
3284
for (const auto & itr : kfvFieldsValues (t))
3282
3285
{
3283
3286
string attr_name = to_upper (fvField (itr));
3284
3287
string attr_value = fvValue (itr);
3285
3288
3286
3289
SWSS_LOG_INFO (" ATTRIBUTE: %s %s" , attr_name.c_str (), attr_value.c_str ());
3287
-
3290
+ if (attr_name == MATCH_TCP_FLAGS)
3291
+ {
3292
+ bHasTCPFlag = true ;
3293
+ }
3294
+ if (attr_name == MATCH_IP_PROTOCOL || attr_name == MATCH_NEXT_HEADER)
3295
+ {
3296
+ bHasIPProtocol = true ;
3297
+ }
3288
3298
if (newRule->validateAddPriority (attr_name, attr_value))
3289
3299
{
3290
3300
SWSS_LOG_INFO (" Added priority attribute" );
@@ -3304,6 +3314,30 @@ void AclOrch::doAclRuleTask(Consumer &consumer)
3304
3314
break ;
3305
3315
}
3306
3316
}
3317
+ // If acl rule is to match TCP_FLAGS, and IP_PROTOCOL(NEXT_HEADER) is not set
3318
+ // we set IP_PROTOCOL(NEXT_HEADER) to 6 to match TCP explicitly
3319
+ if (bHasTCPFlag && !bHasIPProtocol)
3320
+ {
3321
+ string attr_name;
3322
+ if (type == ACL_TABLE_MIRRORV6 || type == ACL_TABLE_L3V6)
3323
+ {
3324
+ attr_name = MATCH_NEXT_HEADER;
3325
+ }
3326
+ else
3327
+ {
3328
+ attr_name = MATCH_IP_PROTOCOL;
3329
+
3330
+ }
3331
+ string attr_value = std::to_string (TCP_PROTOCOL_NUM);
3332
+ if (newRule->validateAddMatch (attr_name, attr_value))
3333
+ {
3334
+ SWSS_LOG_INFO (" Automatically added match attribute '%s : %s'" , attr_name.c_str (), attr_value.c_str ());
3335
+ }
3336
+ else
3337
+ {
3338
+ SWSS_LOG_ERROR (" Failed to add attribute '%s : %s'" , attr_name.c_str (), attr_value.c_str ());
3339
+ }
3340
+ }
3307
3341
3308
3342
// validate and create ACL rule
3309
3343
if (bAllAttributesOk && newRule->validate ())
0 commit comments