Skip to content

Commit 059ffc6

Browse files
[P4Orch] Add new ACL match qualifiers vrf_id and ipmc_table_hit. (#3892)
What I did Added new ACL qualifiers (vrf_id, ipmc_table_hit) to enable more precise packet filtering based on VRF and multicast lookup status. Why I did it How I verified it Verified this by creating and testing rules that used these new match criteria.
1 parent 3749e6d commit 059ffc6

File tree

4 files changed

+53
-7
lines changed

4 files changed

+53
-7
lines changed

orchagent/p4orch/acl_rule_manager.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,7 @@ ReturnCode AclRuleManager::setMatchValue(const acl_entry_attr_union_t attr_name,
764764
sai_attribute_value_t *value, P4AclRule *acl_rule,
765765
const std::string &ip_type_bit_type)
766766
{
767+
SWSS_LOG_ENTER();
767768
try
768769
{
769770
switch (attr_name)
@@ -859,6 +860,7 @@ ReturnCode AclRuleManager::setMatchValue(const acl_entry_attr_union_t attr_name,
859860
case SAI_ACL_ENTRY_ATTR_FIELD_IP_IDENTIFICATION:
860861
case SAI_ACL_ENTRY_ATTR_FIELD_OUTER_VLAN_ID:
861862
case SAI_ACL_ENTRY_ATTR_FIELD_INNER_VLAN_ID:
863+
case SAI_ACL_ENTRY_ATTR_FIELD_VRF_ID:
862864
case SAI_ACL_ENTRY_ATTR_FIELD_INNER_ETHER_TYPE:
863865
case SAI_ACL_ENTRY_ATTR_FIELD_INNER_L4_SRC_PORT:
864866
case SAI_ACL_ENTRY_ATTR_FIELD_INNER_L4_DST_PORT: {
@@ -1028,6 +1030,18 @@ ReturnCode AclRuleManager::setMatchValue(const acl_entry_attr_union_t attr_name,
10281030
value->aclfield.mask.u32 = 0xFFFFFFFF;
10291031
break;
10301032
}
1033+
case SAI_ACL_ENTRY_ATTR_FIELD_IPMC_NPU_META_DST_HIT:
1034+
{
1035+
const std::vector<std::string>& value_and_mask =
1036+
tokenize(attr_value, kDataMaskDelimiter);
1037+
uint8_t hit_value = to_uint<uint8_t>(trim(value_and_mask[0]));
1038+
if (value_and_mask.size() > 1)
1039+
{
1040+
SWSS_LOG_INFO("Mask ignored for IPMC table hit field.");
1041+
}
1042+
value->aclfield.data.booldata = hit_value != 0;
1043+
break;
1044+
}
10311045
default: {
10321046
return ReturnCode(StatusCode::SWSS_RC_INVALID_PARAM)
10331047
<< "ACL match field " << attr_name << " is not supported.";

orchagent/p4orch/acl_util.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,6 +929,7 @@ bool isDiffMatchFieldValue(const acl_entry_attr_union_t attr_name, const sai_att
929929
case SAI_ACL_ENTRY_ATTR_FIELD_IP_IDENTIFICATION:
930930
case SAI_ACL_ENTRY_ATTR_FIELD_OUTER_VLAN_ID:
931931
case SAI_ACL_ENTRY_ATTR_FIELD_INNER_VLAN_ID:
932+
case SAI_ACL_ENTRY_ATTR_FIELD_VRF_ID:
932933
case SAI_ACL_ENTRY_ATTR_FIELD_INNER_ETHER_TYPE:
933934
case SAI_ACL_ENTRY_ATTR_FIELD_INNER_L4_SRC_PORT:
934935
case SAI_ACL_ENTRY_ATTR_FIELD_INNER_L4_DST_PORT: {
@@ -954,6 +955,10 @@ bool isDiffMatchFieldValue(const acl_entry_attr_union_t attr_name, const sai_att
954955
return memcmp(value.aclfield.data.mac, old_value.aclfield.data.mac, sizeof(sai_mac_t)) ||
955956
memcmp(value.aclfield.mask.mac, old_value.aclfield.mask.mac, sizeof(sai_mac_t));
956957
}
958+
case SAI_ACL_ENTRY_ATTR_FIELD_IPMC_NPU_META_DST_HIT:
959+
{
960+
return value.aclfield.data.booldata != old_value.aclfield.data.booldata;
961+
}
957962
default: {
958963
return false;
959964
}

orchagent/p4orch/acl_util.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,8 @@ using P4AclRuleTables = std::map<std::string, std::map<std::string, P4AclRule>>;
325325
#define P4_MATCH_SRC_IPV6_WORD2 "SAI_ACL_TABLE_ATTR_FIELD_SRC_IPV6_WORD2"
326326
#define P4_MATCH_ROUTE_DST_USER_META "SAI_ACL_TABLE_ATTR_FIELD_ROUTE_DST_USER_META"
327327
#define P4_MATCH_ACL_USER_META "SAI_ACL_TABLE_ATTR_FIELD_ACL_USER_META"
328+
#define P4_MATCH_VRF_ID "SAI_ACL_TABLE_ATTR_FIELD_VRF_ID"
329+
#define P4_MATCH_IPMC_TABLE_HIT "SAI_ACL_TABLE_ATTR_FIELD_IPMC_NPU_META_DST_HIT"
328330

329331
#define P4_ACTION_PACKET_ACTION "SAI_ACL_ENTRY_ATTR_ACTION_PACKET_ACTION"
330332
#define P4_ACTION_REDIRECT "SAI_ACL_ENTRY_ATTR_ACTION_REDIRECT"
@@ -486,6 +488,8 @@ static const acl_table_attr_lookup_t aclMatchTableAttrLookup = {
486488
{P4_MATCH_IPV6_NEXT_HEADER, SAI_ACL_TABLE_ATTR_FIELD_IPV6_NEXT_HEADER},
487489
{P4_MATCH_ROUTE_DST_USER_META, SAI_ACL_TABLE_ATTR_FIELD_ROUTE_DST_USER_META},
488490
{P4_MATCH_ACL_USER_META, SAI_ACL_TABLE_ATTR_FIELD_ACL_USER_META},
491+
{P4_MATCH_VRF_ID, SAI_ACL_TABLE_ATTR_FIELD_VRF_ID},
492+
{P4_MATCH_IPMC_TABLE_HIT, SAI_ACL_TABLE_ATTR_FIELD_IPMC_NPU_META_DST_HIT},
489493
};
490494

491495
static const acl_table_attr_format_lookup_t aclMatchTableAttrFormatLookup = {
@@ -536,6 +540,8 @@ static const acl_table_attr_format_lookup_t aclMatchTableAttrFormatLookup = {
536540
{SAI_ACL_TABLE_ATTR_FIELD_IPV6_NEXT_HEADER, Format::HEX_STRING},
537541
{SAI_ACL_TABLE_ATTR_FIELD_ROUTE_DST_USER_META, Format::HEX_STRING},
538542
{SAI_ACL_TABLE_ATTR_FIELD_ACL_USER_META, Format::HEX_STRING},
543+
{SAI_ACL_TABLE_ATTR_FIELD_VRF_ID, Format::HEX_STRING},
544+
{SAI_ACL_TABLE_ATTR_FIELD_IPMC_NPU_META_DST_HIT, Format::HEX_STRING},
539545
};
540546

541547
static const acl_table_attr_lookup_t aclCompositeMatchTableAttrLookup = {
@@ -593,6 +599,8 @@ static const acl_rule_attr_lookup_t aclMatchEntryAttrLookup = {
593599
{P4_MATCH_IPV6_NEXT_HEADER, SAI_ACL_ENTRY_ATTR_FIELD_IPV6_NEXT_HEADER},
594600
{P4_MATCH_ROUTE_DST_USER_META, SAI_ACL_ENTRY_ATTR_FIELD_ROUTE_DST_USER_META},
595601
{P4_MATCH_ACL_USER_META, SAI_ACL_ENTRY_ATTR_FIELD_ACL_USER_META},
602+
{P4_MATCH_VRF_ID, SAI_ACL_ENTRY_ATTR_FIELD_VRF_ID},
603+
{P4_MATCH_IPMC_TABLE_HIT, SAI_ACL_ENTRY_ATTR_FIELD_IPMC_NPU_META_DST_HIT},
596604
};
597605

598606
static const acl_rule_attr_lookup_t aclCompositeMatchEntryAttrLookup = {

orchagent/p4orch/tests/acl_manager_test.cpp

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -636,10 +636,16 @@ P4AclTableDefinitionAppDbEntry getDefaultAclTableDefAppDbEntry()
636636
app_db_entry.match_field_lookup["inner_vlan_pri"] = BuildMatchFieldJsonStrKindSaiField(P4_MATCH_INNER_VLAN_PRI);
637637
app_db_entry.match_field_lookup["inner_vlan_id"] = BuildMatchFieldJsonStrKindSaiField(P4_MATCH_INNER_VLAN_ID);
638638
app_db_entry.match_field_lookup["inner_vlan_cfi"] = BuildMatchFieldJsonStrKindSaiField(P4_MATCH_INNER_VLAN_CFI);
639-
app_db_entry.match_field_lookup["l3_class_id"] =
639+
app_db_entry.match_field_lookup["vrf_id"] =
640+
BuildMatchFieldJsonStrKindSaiField(P4_MATCH_VRF_ID, P4_FORMAT_HEX_STRING,
641+
/*bitwidth=*/16);
642+
app_db_entry.match_field_lookup["ipmc_table_hit"] =
643+
BuildMatchFieldJsonStrKindSaiField(P4_MATCH_IPMC_TABLE_HIT,
644+
P4_FORMAT_HEX_STRING, /*bitwidth=*/1);
645+
app_db_entry.match_field_lookup["l3_clasvs_id"] =
640646
BuildMatchFieldJsonStrKindSaiField(P4_MATCH_ROUTE_DST_USER_META, P4_FORMAT_HEX_STRING, /*bitwidth=*/32);
641647
app_db_entry.match_field_lookup["acl_user_meta"] =
642-
BuildMatchFieldJsonStrKindSaiField(P4_MATCH_ACL_USER_META, P4_FORMAT_HEX_STRING, /*bitwidth=*/8);
648+
BuildMatchFieldJsonStrKindSaiField(P4_MATCH_ACL_USER_META, P4_FORMAT_HEX_STRING, /*bitwidth=*/8);
643649
app_db_entry.match_field_lookup["src_ipv6_64bit"] = BuildMatchFieldJsonStrKindComposite(
644650
{nlohmann::json::parse(BuildMatchFieldJsonStrKindSaiField(P4_MATCH_SRC_IPV6_WORD3, P4_FORMAT_IPV6, 32)),
645651
nlohmann::json::parse(BuildMatchFieldJsonStrKindSaiField(P4_MATCH_SRC_IPV6_WORD2, P4_FORMAT_IPV6, 32))},
@@ -2794,6 +2800,8 @@ TEST_F(AclManagerTest, AclRuleWithValidMatchFields)
27942800
app_db_entry.match_fvs["inner_vlan_pri"] = "200";
27952801
app_db_entry.match_fvs["inner_vlan_id"] = "200";
27962802
app_db_entry.match_fvs["inner_vlan_cfi"] = "200";
2803+
app_db_entry.match_fvs["vrf_id"] = "0x777";
2804+
app_db_entry.match_fvs["ipmc_table_hit"] = "0x1";
27972805

27982806
const auto &acl_rule_key = KeyGenerator::generateAclRuleKey(app_db_entry.match_fvs, "100");
27992807

@@ -2890,6 +2898,11 @@ TEST_F(AclManagerTest, AclRuleWithValidMatchFields)
28902898
EXPECT_EQ(SAI_ACL_IP_FRAG_HEAD, acl_rule->match_fvs[SAI_ACL_ENTRY_ATTR_FIELD_ACL_IP_FRAG].aclfield.data.u32);
28912899
EXPECT_EQ(SAI_PACKET_VLAN_SINGLE_OUTER_TAG,
28922900
acl_rule->match_fvs[SAI_ACL_ENTRY_ATTR_FIELD_PACKET_VLAN].aclfield.data.u32);
2901+
EXPECT_EQ(0x777, acl_rule->match_fvs[SAI_ACL_ENTRY_ATTR_FIELD_VRF_ID].aclfield.data.u16);
2902+
EXPECT_EQ(0xFFFF, acl_rule->match_fvs[SAI_ACL_ENTRY_ATTR_FIELD_VRF_ID].aclfield.mask.u16);
2903+
EXPECT_EQ(true,
2904+
acl_rule->match_fvs[SAI_ACL_ENTRY_ATTR_FIELD_IPMC_NPU_META_DST_HIT]
2905+
.aclfield.data.booldata);
28932906

28942907
// Check action field value
28952908
EXPECT_EQ(SAI_PACKET_ACTION_TRAP,
@@ -5146,7 +5159,8 @@ TEST_F(AclManagerTest, AclRuleVerifyStateTest)
51465159
"ipv6_dst\":\"fdf8:f53b:82e4::53 & "
51475160
"fdf8:f53b:82e4::53\",\"match/arp_tpa\": \"0xff112231\", "
51485161
"\"match/in_ports\": \"Ethernet1,Ethernet2\", \"match/out_ports\": "
5149-
"\"Ethernet4,Ethernet5\", \"priority\":15}";
5162+
"\"Ethernet4,Ethernet5\", \"priority\":15,\"match/ipmc_table_hit\":"
5163+
"\"0x1\"}";
51505164
const auto &rule_tuple_key = std::string(kAclIngressTableName) + kTableKeyDelimiter + acl_rule_json_key;
51515165
EnqueueRuleTuple(std::string(kAclIngressTableName),
51525166
swss::KeyOpFieldsValuesTuple({rule_tuple_key, SET_COMMAND, attributes}));
@@ -5176,6 +5190,7 @@ TEST_F(AclManagerTest, AclRuleVerifyStateTest)
51765190
swss::FieldValueTuple{"SAI_ACL_ENTRY_ATTR_FIELD_ACL_IP_TYPE",
51775191
"SAI_ACL_IP_TYPE_ANY&mask:0xffffffffffffffff"},
51785192
swss::FieldValueTuple{"SAI_ACL_ENTRY_ATTR_USER_DEFINED_FIELD_GROUP_MIN", "2:255,17&mask:2:0xff,0xff"},
5193+
swss::FieldValueTuple{"SAI_ACL_ENTRY_ATTR_FIELD_IPMC_NPU_META_DST_HIT", "true"},
51795194
swss::FieldValueTuple{"SAI_ACL_ENTRY_ATTR_USER_DEFINED_FIELD_GROUP_1", "2:34,49&mask:2:0xff,0xff"},
51805195
swss::FieldValueTuple{"SAI_ACL_ENTRY_ATTR_FIELD_IN_PORTS", "2:oid:0x112233,oid:0x1fed3"},
51815196
swss::FieldValueTuple{"SAI_ACL_ENTRY_ATTR_FIELD_OUT_PORTS", "2:oid:0x9988,oid:0x56789abcdef"},
@@ -5209,20 +5224,23 @@ TEST_F(AclManagerTest, AclRuleVerifyStateTest)
52095224
EXPECT_FALSE(VerifyRuleState(std::string(APP_P4RT_TABLE_NAME) +
52105225
":ACL_PUNT_TABLE:{\"match/ether_type\":\"0x0800\",\"match/"
52115226
"ipv6_dst\":\"fdf8:f53b:82e4::53 & "
5212-
"fdf8:f53b:82e4::53\",\"priority\":0}",
5227+
"fdf8:f53b:82e4::53\",\"priority\":0,\"match/ipmc_table_hit\":"
5228+
"\"0x1\"}",
52135229
attributes)
52145230
.empty());
52155231
EXPECT_FALSE(VerifyRuleState(std::string(APP_P4RT_TABLE_NAME) +
52165232
":ACL_PUNT_TABLE:{\"match/ether_type\":\"0x0800\",\"match/"
5217-
"ipv6_dst\":\"127.0.0.1/24\",\"priority\":15}",
5233+
"ipv6_dst\":\"127.0.0.1/24\",\"priority\":15,"
5234+
"\"match/ipmc_table_hit\":\"0x1\"}",
52185235
attributes)
52195236
.empty());
52205237

52215238
// Verification should fail if entry does not exist.
52225239
EXPECT_FALSE(VerifyRuleState(std::string(APP_P4RT_TABLE_NAME) +
52235240
":ACL_PUNT_TABLE:{\"match/ether_type\":\"0x0800\",\"match/"
52245241
"ipv6_dst\":\"fdf8:f53b:82e4::54 & "
5225-
"fdf8:f53b:82e4::54\",\"priority\":15}",
5242+
"fdf8:f53b:82e4::54\",\"priority\":15,\"match/ipmc_table_hit\":"
5243+
"\"0x1\"}",
52265244
attributes)
52275245
.empty());
52285246

@@ -5232,7 +5250,8 @@ TEST_F(AclManagerTest, AclRuleVerifyStateTest)
52325250
auto *acl_table = GetAclTable(kAclIngressTableName);
52335251
EXPECT_NE(acl_table, nullptr);
52345252
const auto &acl_rule_key = "match/arp_tpa=0xff112231:match/ether_type=0x0800:match/"
5235-
"in_ports=Ethernet1,Ethernet2:match/ipv6_dst=fdf8:f53b:82e4::53 & "
5253+
"in_ports=Ethernet1,Ethernet2:match/ipmc_table_hit=0x1:"
5254+
"match/ipv6_dst=fdf8:f53b:82e4::53 & "
52365255
"fdf8:f53b:82e4::53:match/out_ports=Ethernet4,Ethernet5:priority=15";
52375256
auto *acl_rule = GetAclRule(kAclIngressTableName, acl_rule_key);
52385257
ASSERT_NE(acl_rule, nullptr);

0 commit comments

Comments
 (0)