diff --git a/meta/Meta.cpp b/meta/Meta.cpp index d9f9e554b..e3b36e372 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,13 @@ sai_status_t Meta::meta_generic_validation_create( break; } - // case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST: + // Used by UDF-backed ACL match fields (byte pattern + mask). + 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 +4281,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 +4761,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 +5032,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 +6015,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 +6244,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 +7552,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/tests/aspell.en.pws b/tests/aspell.en.pws index 8c3b8d9b9..741437873 100644 --- a/tests/aspell.en.pws +++ b/tests/aspell.en.pws @@ -101,6 +101,7 @@ TODO TPID TXSC TestCase +UDF tokenize VID VIDCOUNTER 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());