in meta/saisanitycheck.c [549:654]
void check_attr_flags(
_In_ const sai_attr_metadata_t* md)
{
META_LOG_ENTER();
switch ((int)md->flags)
{
case SAI_ATTR_FLAGS_MANDATORY_ON_CREATE | SAI_ATTR_FLAGS_CREATE_ONLY | SAI_ATTR_FLAGS_KEY:
case SAI_ATTR_FLAGS_MANDATORY_ON_CREATE | SAI_ATTR_FLAGS_CREATE_ONLY:
case SAI_ATTR_FLAGS_MANDATORY_ON_CREATE | SAI_ATTR_FLAGS_CREATE_AND_SET:
if (md->validonlytype != SAI_ATTR_CONDITION_TYPE_NONE)
{
META_MD_ASSERT_FAIL(md, "valid only attribute can't be mandatory on create, use condition");
}
/*
* Currently we don't use RANGE type so this check can be disabled.
* Range idea was introduces so attribute can be in specific range
* of other MIN/MAX attributes. This is not supported yet.
*
* if (md->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT32 &&
* md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_ATTR_RANGE)
* {
* break;
* }
*/
if (md->defaultvaluetype != SAI_DEFAULT_VALUE_TYPE_NONE)
{
META_MD_ASSERT_FAIL(md, "no default value expected, but type provided: %s",
sai_metadata_get_default_value_type_name(md->defaultvaluetype));
}
break;
case SAI_ATTR_FLAGS_CREATE_ONLY:
case SAI_ATTR_FLAGS_CREATE_AND_SET:
if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_NONE)
{
/*
* Default value of object id can be internal or NULL and it
* needs to be specified explicitly.
*/
/*
* Default value for pointer must be specified and must be NULL.
*/
/*
* Default value for acl field or action is provided and is
* disabled by default.
*/
META_MD_ASSERT_FAIL(md, "expected default value, but none provided");
}
break;
case SAI_ATTR_FLAGS_READ_ONLY:
if (md->conditiontype != SAI_ATTR_CONDITION_TYPE_NONE)
{
META_MD_ASSERT_FAIL(md, "read only attribute can't be conditional");
}
if (md->validonlytype != SAI_ATTR_CONDITION_TYPE_NONE)
{
META_MD_ASSERT_FAIL(md, "read only attribute can't be valid only");
}
if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_SWITCH_INTERNAL)
{
if (md->attrvaluetype == SAI_ATTR_VALUE_TYPE_OBJECT_ID ||
md->attrvaluetype == SAI_ATTR_VALUE_TYPE_OBJECT_LIST)
{
/*
* Read only object id/list can be marked as internal like
* default virtual router, cpu port id, default queues on
* ports, etc.
*/
break;
}
}
if (md->defaultvaluetype != SAI_DEFAULT_VALUE_TYPE_NONE)
{
META_MD_ASSERT_FAIL(md, "no default value expected, but type provided: %s",
sai_metadata_get_default_value_type_name(md->defaultvaluetype));
}
break;
default:
META_MD_ASSERT_FAIL(md, "invalid creation flags: 0x%x", md->flags);
}
META_ASSERT_TRUE(SAI_HAS_FLAG_MANDATORY_ON_CREATE(md->flags) == md->ismandatoryoncreate, "wrong ismandatoryoncreate");
META_ASSERT_TRUE(SAI_HAS_FLAG_CREATE_ONLY(md->flags) == md->iscreateonly, "wrong iscreateonly");
META_ASSERT_TRUE(SAI_HAS_FLAG_CREATE_AND_SET(md->flags) == md->iscreateandset, "wrong iscreateandset");
META_ASSERT_TRUE(SAI_HAS_FLAG_READ_ONLY(md->flags) == md->isreadonly, "wrong isreadonly");
META_ASSERT_TRUE(SAI_HAS_FLAG_KEY(md->flags) == md->iskey, "wrong iskey");
}