From 12393d8ff7f0ff929ac38f4056afa44bc4119be8 Mon Sep 17 00:00:00 2001 From: satishkumar rodd Date: Tue, 21 Apr 2026 13:47:41 +0000 Subject: [PATCH 01/10] u8_list validation handling Signed-off-by: satishkumar rodd --- meta/Meta.cpp | 41 ++++++++++++++++++++++++++++++++++------- meta/SaiSerialize.cpp | 12 +++++++++++- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/meta/Meta.cpp b/meta/Meta.cpp index d9f9e554b..3e54da6af 100644 --- a/meta/Meta.cpp +++ b/meta/Meta.cpp @@ -1953,7 +1953,9 @@ void Meta::meta_generic_validation_post_remove( } break; - // case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + // no object references to decrement for uint8 list + break; // ACL ACTION @@ -3620,7 +3622,12 @@ sai_status_t Meta::meta_generic_validation_create( break; } - // case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + if (value.aclfield.enable) + { + VALIDATION_LIST(md, value.aclfield.data.u8list); + } + break; // ACL ACTION @@ -4273,7 +4280,12 @@ sai_status_t Meta::meta_generic_validation_set( break; } - // case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + if (value.aclfield.enable) + { + VALIDATION_LIST(md, value.aclfield.data.u8list); + } + break; // ACL ACTION @@ -4748,7 +4760,9 @@ sai_status_t Meta::meta_generic_validation_get( VALIDATION_LIST(md, value.aclfield.data.objlist); break; - // case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + VALIDATION_LIST(md, value.aclfield.data.u8list); + break; // ACL ACTION @@ -5017,7 +5031,12 @@ void Meta::meta_generic_validation_post_get( meta_generic_validation_post_get_objlist(meta_key, md, switch_id, value.aclfield.data.objlist.count, value.aclfield.data.objlist.list); break; - // case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: (2 lists) + case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + if (value.aclfield.enable) + { + VALIDATION_LIST_GET(md, value.aclfield.data.u8list); + } + break; // ACL ACTION @@ -5995,7 +6014,9 @@ void Meta::meta_generic_validation_post_create( } break; - // case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + // no object references to increment for uint8 list + break; // ACL ACTION @@ -6222,7 +6243,9 @@ void Meta::meta_generic_validation_post_set( break; } - // case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + // no object references to handle for uint8 list + break; // ACL ACTION @@ -7528,6 +7551,10 @@ void Meta::populate( } break; + case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + // no object references in uint8 list + break; + case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_ID: if (value.aclaction.enable) { diff --git a/meta/SaiSerialize.cpp b/meta/SaiSerialize.cpp index b2d2ec155..9a0c44039 100644 --- a/meta/SaiSerialize.cpp +++ b/meta/SaiSerialize.cpp @@ -2042,7 +2042,17 @@ std::string sai_serialize_acl_field( return sai_serialize_oid_list(field.data.objlist, countOnly); case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: - return sai_serialize_number_list(field.data.u8list, countOnly) + "&mask:" + sai_serialize_number_list(field.mask.u8list, countOnly, true); + { + std::string result = sai_serialize_number_list(field.data.u8list, countOnly); + + // Only serialize mask if it's properly initialized + if (field.mask.u8list.list != NULL && field.mask.u8list.count > 0) + { + result += "&mask:" + sai_serialize_number_list(field.mask.u8list, countOnly, true); + } + + return result; + } default: SWSS_LOG_THROW("sai attr value %s is not implemented, FIXME", sai_serialize_attr_value_type(meta.attrvaluetype).c_str()); From a2bdcfa281fd807d029227d2462e123c3865f6b4 Mon Sep 17 00:00:00 2001 From: satishkumar rodd Date: Tue, 12 May 2026 04:26:58 +0000 Subject: [PATCH 02/10] meta: clarify intent of u8_list validation case Note that the UINT8_LIST ACL field value type is consumed by UDF-backed ACL match fields, where the byte pattern lives in aclfield.data.u8list. Signed-off-by: satishkumar rodd --- meta/Meta.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/meta/Meta.cpp b/meta/Meta.cpp index 3e54da6af..e3b36e372 100644 --- a/meta/Meta.cpp +++ b/meta/Meta.cpp @@ -3622,6 +3622,7 @@ sai_status_t Meta::meta_generic_validation_create( break; } + // Used by UDF-backed ACL match fields (byte pattern + mask). case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: if (value.aclfield.enable) { From bff2d9d21db7c8d5fc5e646f84e1c095ad10a3c6 Mon Sep 17 00:00:00 2001 From: satishkumar rodd Date: Wed, 13 May 2026 05:55:37 +0000 Subject: [PATCH 03/10] ci: retrigger pipeline Signed-off-by: satishkumar rodd From 31dfa7cfa09353e7844ce79082ce9a4edd683c02 Mon Sep 17 00:00:00 2001 From: satishkumar rodd Date: Wed, 13 May 2026 08:08:33 +0000 Subject: [PATCH 04/10] tests: add UDF to aspell dictionary Fixes Build amd64 / BuildAsan amd64 failure: aspellcheck.pl: WARNING: Word 'UDF' is misspelled ../meta/Meta.cpp Signed-off-by: satishkumar rodd --- tests/aspell.en.pws | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/aspell.en.pws b/tests/aspell.en.pws index b6680bc80..2a54c7bc6 100644 --- a/tests/aspell.en.pws +++ b/tests/aspell.en.pws @@ -100,6 +100,7 @@ TODO TPID TXSC TestCase +UDF tokenize VID VIDCOUNTER From 9af843e92ffd76b74a59ee0b101f5c4df13846e3 Mon Sep 17 00:00:00 2001 From: satishkumar rodd Date: Wed, 13 May 2026 11:45:10 +0000 Subject: [PATCH 05/10] meta: drop UINT8_LIST serialize mask guard Fixes SaiSerialize.sai_serialize_attr_value unit test failure: C++ exception with description ':- sai_deserialize_list: invalid list' thrown in the test body. The earlier guard (12393d8f, a2bdcfa2) skipped the '&mask:' portion when mask.u8list was empty. That broke round-trip: deserialize still expects the suffix and throws on an empty smask. Reverting to the unconditional form (matching master and all other ACL field types) restores symmetry. sai_serialize_number_list handles empty lists without crashing, as proven by master where this test passes. Signed-off-by: satishkumar rodd --- meta/SaiSerialize.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/meta/SaiSerialize.cpp b/meta/SaiSerialize.cpp index 9a0c44039..b2d2ec155 100644 --- a/meta/SaiSerialize.cpp +++ b/meta/SaiSerialize.cpp @@ -2042,17 +2042,7 @@ std::string sai_serialize_acl_field( return sai_serialize_oid_list(field.data.objlist, countOnly); case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: - { - std::string result = sai_serialize_number_list(field.data.u8list, countOnly); - - // Only serialize mask if it's properly initialized - if (field.mask.u8list.list != NULL && field.mask.u8list.count > 0) - { - result += "&mask:" + sai_serialize_number_list(field.mask.u8list, countOnly, true); - } - - return result; - } + return sai_serialize_number_list(field.data.u8list, countOnly) + "&mask:" + sai_serialize_number_list(field.mask.u8list, countOnly, true); default: SWSS_LOG_THROW("sai attr value %s is not implemented, FIXME", sai_serialize_attr_value_type(meta.attrvaluetype).c_str()); From 3074f0d566b937b45dac8ddccbeba2aadbe1b175 Mon Sep 17 00:00:00 2001 From: satishkumar rodd Date: Wed, 13 May 2026 12:45:52 +0000 Subject: [PATCH 06/10] ci: retrigger pipeline Signed-off-by: satishkumar rodd From 1ea00a6faee06ff05248fabd007a320e0b28ec01 Mon Sep 17 00:00:00 2001 From: satishkumar rodd Date: Tue, 19 May 2026 04:04:25 +0000 Subject: [PATCH 07/10] ci: retrigger pipeline Retrigger Test vstest stage: upstream master is green as of 2026-05-16, so the prior test_acl_mark.py OID-assertion flake should not reproduce. Signed-off-by: satishkumar rodd From a763f41ea335c9000198934f5917cf61ae54c4ea Mon Sep 17 00:00:00 2001 From: satishkumar rodd Date: Tue, 19 May 2026 15:07:48 +0000 Subject: [PATCH 08/10] ci: retrigger pipeline Retrigger Build/BuildAsan amd64 stages: previous run hit FlexCounter.bulkChunksize flake. PR diff is meta/Meta.cpp + tests/aspell.en.pws, no flex counter code touched. Signed-off-by: satishkumar rodd From 66cb24c66915b37604dc82da6d2cda379a0a7aed Mon Sep 17 00:00:00 2001 From: satishkumar rodd Date: Mon, 25 May 2026 03:30:49 +0000 Subject: [PATCH 09/10] tests: cover UINT8_LIST meta validation and populate paths Add unit tests exercising the SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST branches enabled in Meta.cpp for UDF-backed ACL match fields: - Legacy.acl_entry_udf_uint8_list_field walks create/set/get/remove on an ACL_ENTRY with SAI_ACL_ENTRY_ATTR_USER_DEFINED_FIELD_GROUP_MIN populated with a u8list data+mask, hitting the new case branches in meta_generic_validation_{create,set,get,post_get,post_create,post_set, post_remove}. - Meta.populate_acl_entry_udf_uint8_list seeds a TableDump with a UINT8_LIST attr so Meta::populate exercises the new case in its reference-walking switch. Signed-off-by: satishkumar rodd --- unittest/meta/TestLegacyOther.cpp | 47 +++++++++++++++++++++++++++++++ unittest/meta/TestMeta.cpp | 14 +++++++++ 2 files changed, 61 insertions(+) diff --git a/unittest/meta/TestLegacyOther.cpp b/unittest/meta/TestLegacyOther.cpp index 1ec342a9f..1a5572f9a 100644 --- a/unittest/meta/TestLegacyOther.cpp +++ b/unittest/meta/TestLegacyOther.cpp @@ -1040,3 +1040,50 @@ TEST(Legacy, bulk_route_entry_create) std::cout << "ms: " << (double)us.count()/1000 << " / " << n << "/" << object_count << std::endl; } +TEST(Legacy, acl_entry_udf_uint8_list_field) +{ + SWSS_LOG_ENTER(); + + clear_local(); + + sai_object_id_t switch_id = create_switch(); + sai_object_id_t aclentry; + sai_object_id_t table_id = insert_dummy_object(SAI_OBJECT_TYPE_ACL_TABLE, switch_id); + + uint8_t data[4] = {0x11, 0x22, 0x33, 0x44}; + uint8_t mask[4] = {0xff, 0xff, 0xff, 0xff}; + + std::vector vattrs; + + sai_attribute_t a_table; + memset(&a_table, 0, sizeof(a_table)); + a_table.id = SAI_ACL_ENTRY_ATTR_TABLE_ID; + a_table.value.oid = table_id; + vattrs.push_back(a_table); + + sai_attribute_t a_udf; + memset(&a_udf, 0, sizeof(a_udf)); + a_udf.id = SAI_ACL_ENTRY_ATTR_USER_DEFINED_FIELD_GROUP_MIN; + a_udf.value.aclfield.enable = true; + a_udf.value.aclfield.data.u8list.count = 4; + a_udf.value.aclfield.data.u8list.list = data; + a_udf.value.aclfield.mask.u8list.count = 4; + a_udf.value.aclfield.mask.u8list.list = mask; + vattrs.push_back(a_udf); + + auto status = g_meta->create(SAI_OBJECT_TYPE_ACL_ENTRY, &aclentry, switch_id, + (uint32_t)vattrs.size(), vattrs.data()); + EXPECT_EQ(SAI_STATUS_SUCCESS, status); + + status = g_meta->set(SAI_OBJECT_TYPE_ACL_ENTRY, aclentry, &a_udf); + EXPECT_EQ(SAI_STATUS_SUCCESS, status); + + status = g_meta->get(SAI_OBJECT_TYPE_ACL_ENTRY, aclentry, 1, &a_udf); + EXPECT_EQ(SAI_STATUS_SUCCESS, status); + + status = g_meta->remove(SAI_OBJECT_TYPE_ACL_ENTRY, aclentry); + EXPECT_EQ(SAI_STATUS_SUCCESS, status); + + remove_switch(switch_id); +} + diff --git a/unittest/meta/TestMeta.cpp b/unittest/meta/TestMeta.cpp index 92c9243bf..f8336f402 100644 --- a/unittest/meta/TestMeta.cpp +++ b/unittest/meta/TestMeta.cpp @@ -1739,6 +1739,20 @@ TEST(Meta, populate) m.populate(dump); } +TEST(Meta, populate_acl_entry_udf_uint8_list) +{ + Meta m(std::make_shared()); + + swss::TableDump dump; + + dump["SAI_OBJECT_TYPE_ACL_TABLE:oid:0x7000000000700"]["SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE"] = "true"; + dump["SAI_OBJECT_TYPE_ACL_ENTRY:oid:0x8000000000701"]["SAI_ACL_ENTRY_ATTR_TABLE_ID"] = "oid:0x7000000000700"; + dump["SAI_OBJECT_TYPE_ACL_ENTRY:oid:0x8000000000701"]["SAI_ACL_ENTRY_ATTR_USER_DEFINED_FIELD_GROUP_MIN"] = + "4:17,34,51,68&mask:4:0xff,0xff,0xff,0xff"; + + m.populate(dump); +} + TEST(Meta, bulkGetClearStats) { Meta m(std::make_shared()); From 7b523bdd836d6da36e68b70e8323ad813428c14d Mon Sep 17 00:00:00 2001 From: satishkumar rodd Date: Mon, 25 May 2026 08:48:17 +0000 Subject: [PATCH 10/10] ci: retrigger pipeline Signed-off-by: satishkumar rodd