in meta/saisanitycheck.c [905:1141]
void check_attr_default_required(
_In_ const sai_attr_metadata_t* md)
{
META_LOG_ENTER();
bool requiredefault = (!SAI_HAS_FLAG_MANDATORY_ON_CREATE(md->flags)) &&
(SAI_HAS_FLAG_CREATE_ONLY(md->flags) || SAI_HAS_FLAG_CREATE_AND_SET(md->flags));
if (requiredefault == false)
{
return;
}
if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_NONE)
{
/*
* If default value type is NONE, then default value must be NULL.
*/
META_ASSERT_NULL(md->defaultvalue);
/*
* By default we assume that default acl field or action is
* disabled and default value is not provided.
*/
META_MD_ASSERT_FAIL(md, "expected default value, but none provided");
}
switch (md->defaultvaluetype)
{
case SAI_DEFAULT_VALUE_TYPE_CONST:
if (md->objecttype == SAI_OBJECT_TYPE_UDF && md->attrid == SAI_UDF_ATTR_HASH_MASK)
{
if (md->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT8_LIST)
{
/*
* Const on list, this is exception for UDF object since
* it's default value is 2 bytes 0xFF,0xFF and it's special
* case.
*/
break;
}
}
if ((md->objecttype == SAI_OBJECT_TYPE_PORT) || (md->objecttype == SAI_OBJECT_TYPE_PORT_SERDES))
{
/*
* Allow PORT non object list attributes to be set to internal switch values.
*/
break;
}
if (md->defaultvalue == NULL)
{
META_MD_ASSERT_FAIL(md, "default value type is provided, but default value pointer is NULL");
}
break;
case SAI_DEFAULT_VALUE_TYPE_ATTR_VALUE:
case SAI_DEFAULT_VALUE_TYPE_ATTR_RANGE:
case SAI_DEFAULT_VALUE_TYPE_SWITCH_INTERNAL:
case SAI_DEFAULT_VALUE_TYPE_VENDOR_SPECIFIC:
case SAI_DEFAULT_VALUE_TYPE_EMPTY_LIST:
if (md->defaultvalue != NULL)
{
META_MD_ASSERT_FAIL(md, "default value type is provided, but default value pointer is not NULL");
}
break;
default:
META_MD_ASSERT_FAIL(md, "unknown default value type %d", md->defaultvaluetype);
}
/* default value is required */
switch (md->attrvaluetype)
{
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT8:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT16:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT16:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT32:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT32:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV4:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV6:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_ID:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_BOOL:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT8:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_INT8:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT16:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_INT16:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT32:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_INT32:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_MAC:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IPV4:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IPV6:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IP_ADDRESS:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_ID:
if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_CONST)
{
break;
}
META_MD_ASSERT_FAIL(md, "default value on acl field/action must be const/disabled");
case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
case SAI_ATTR_VALUE_TYPE_BOOL:
case SAI_ATTR_VALUE_TYPE_INT32:
case SAI_ATTR_VALUE_TYPE_UINT8:
case SAI_ATTR_VALUE_TYPE_UINT16:
case SAI_ATTR_VALUE_TYPE_UINT32:
case SAI_ATTR_VALUE_TYPE_UINT64:
case SAI_ATTR_VALUE_TYPE_MAC:
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS:
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
case SAI_ATTR_VALUE_TYPE_PRBS_RX_STATE:
case SAI_ATTR_VALUE_TYPE_TIMESPEC:
case SAI_ATTR_VALUE_TYPE_IPV4:
case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG:
case SAI_ATTR_VALUE_TYPE_IPV6:
break;
case SAI_ATTR_VALUE_TYPE_CHARDATA:
if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_CONST)
{
break;
}
META_MD_ASSERT_FAIL(md, "default value on chardata const");
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_LIST:
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_LIST:
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST:
/* even if this is list, on acl field/action we require disabled */
if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_CONST)
{
break;
}
META_MD_ASSERT_FAIL(md, "default value on acl field/action must be const/disabled");
case SAI_ATTR_VALUE_TYPE_INT8_LIST:
case SAI_ATTR_VALUE_TYPE_UINT32_LIST:
case SAI_ATTR_VALUE_TYPE_INT32_LIST:
case SAI_ATTR_VALUE_TYPE_OBJECT_LIST:
case SAI_ATTR_VALUE_TYPE_TLV_LIST:
case SAI_ATTR_VALUE_TYPE_SEGMENT_LIST:
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS_LIST:
case SAI_ATTR_VALUE_TYPE_PORT_EYE_VALUES_LIST:
case SAI_ATTR_VALUE_TYPE_PORT_FREQUENCY_OFFSET_PPM_LIST:
case SAI_ATTR_VALUE_TYPE_PORT_SNR_LIST:
case SAI_ATTR_VALUE_TYPE_PORT_LANE_LATCH_STATUS_LIST:
case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG_LIST:
case SAI_ATTR_VALUE_TYPE_IP_PREFIX_LIST:
case SAI_ATTR_VALUE_TYPE_ACL_CHAIN_LIST:
if (((md->objecttype == SAI_OBJECT_TYPE_PORT) || (md->objecttype == SAI_OBJECT_TYPE_PORT_SERDES))
&& md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_SWITCH_INTERNAL)
{
/*
* Allow non object lists on PORT to be set to internal default value.
*/
break;
}
if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_EMPTY_LIST)
{
break;
}
META_MD_ASSERT_FAIL(md, "default value list is needed on this attr value type but list is NULL");
case SAI_ATTR_VALUE_TYPE_UINT8_LIST:
if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_EMPTY_LIST)
{
break;
}
if (md->objecttype == SAI_OBJECT_TYPE_UDF && md->attrid == SAI_UDF_ATTR_HASH_MASK)
{
if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_CONST)
{
/*
* Again this is exception only for this one UDF attribute
* to support CONST on list.
*/
break;
}
}
META_MD_ASSERT_FAIL(md, "default value list is needed on this attr value type but list is NULL");
case SAI_ATTR_VALUE_TYPE_UINT16_LIST:
if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_EMPTY_LIST)
{
break;
}
META_MD_ASSERT_FAIL(md, "default value list is needed on this attr value type but list is NULL");
case SAI_ATTR_VALUE_TYPE_POINTER:
/*
* Gearbox exception for mandatory pointer attribute
* to support CONST on list.
*/
break;
case SAI_ATTR_VALUE_TYPE_JSON:
break;
default:
META_MD_ASSERT_FAIL(md, "default value is required but this attr value type is not supported yet");
}
}