in meta/saisanitycheck.c [825:903]
void check_attr_allowed_object_types(
_In_ const sai_attr_metadata_t* md)
{
META_LOG_ENTER();
if (md->allowedobjecttypeslength != 0 && md->allowedobjecttypes == NULL)
{
META_MD_ASSERT_FAIL(md, "allowed object type len is specified but pointer is NULL");
}
if (md->allowedobjecttypeslength == 0 && md->allowedobjecttypes != NULL)
{
META_MD_ASSERT_FAIL(md, "allowed object type len zero, but but pointer to objects is specified");
}
if (md->allowedobjecttypes == NULL)
{
return;
}
if (md->isoidattribute)
{
META_ASSERT_TRUE(md->allowedobjecttypeslength > 0, "object len should be at least 1");
}
else
{
META_ASSERT_TRUE(md->allowedobjecttypeslength == 0, "object len should be 0");
}
switch (md->attrvaluetype)
{
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_LIST:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_ID:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_LIST:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_ID:
case SAI_ATTR_VALUE_TYPE_OBJECT_LIST:
case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
break;
default:
META_MD_ASSERT_FAIL(md, "allowed object types should be empty on this attr value type");
}
/*
* check if allowed object types are in range
* they may repeat, but we can also check that
*/
size_t i = 0;
for (; i < md->allowedobjecttypeslength; ++i)
{
sai_object_type_t ot = md->allowedobjecttypes[i];
if (!is_valid_object_type(ot))
{
META_MD_ASSERT_FAIL(md, "invalid allowed object type: %d", ot);
}
const sai_object_type_info_t* info = sai_metadata_get_object_type_info(ot);
META_ASSERT_NOT_NULL(info);
if (info->isnonobjectid)
{
META_MD_ASSERT_FAIL(md, "non object id can't be used as object id: %d", ot);
}
if (ot == SAI_OBJECT_TYPE_SWITCH ||
ot == SAI_OBJECT_TYPE_FDB_FLUSH ||
ot == SAI_OBJECT_TYPE_HOSTIF_PACKET)
{
/* switch object type is meant to be used only in non object id struct types */
META_MD_ASSERT_FAIL(md, "switch object type can't be used as object type in any attribute");
}
}
}