in meta/saisanitycheck.c [1219:1363]
void check_attr_default_value_type(
_In_ const sai_attr_metadata_t* md)
{
META_LOG_ENTER();
switch (md->defaultvaluetype)
{
case SAI_DEFAULT_VALUE_TYPE_NONE:
case SAI_DEFAULT_VALUE_TYPE_CONST:
/* check conditions/creation flags? */
break;
case SAI_DEFAULT_VALUE_TYPE_ATTR_VALUE:
{
const sai_attr_metadata_t* def = sai_metadata_get_attr_metadata(md->defaultvalueobjecttype, md->defaultvalueattrid);
if (def == NULL)
{
META_MD_ASSERT_FAIL(md, "attr value can't be found");
}
if (md->attrvaluetype != def->attrvaluetype)
{
META_MD_ASSERT_FAIL(md, "default attr value type is different");
}
break;
}
case SAI_DEFAULT_VALUE_TYPE_ATTR_RANGE:
{
const sai_attr_metadata_t* def = sai_metadata_get_attr_metadata(md->defaultvalueobjecttype, md->defaultvalueattrid);
if (def == NULL)
{
META_MD_ASSERT_FAIL(md, "attr range can't be found");
}
META_MD_ASSERT_FAIL(md, "attr value attribute value range not supported yet");
break;
}
case SAI_DEFAULT_VALUE_TYPE_EMPTY_LIST:
switch (md->attrvaluetype)
{
case SAI_ATTR_VALUE_TYPE_UINT32_LIST:
case SAI_ATTR_VALUE_TYPE_INT32_LIST:
case SAI_ATTR_VALUE_TYPE_UINT8_LIST:
case SAI_ATTR_VALUE_TYPE_UINT16_LIST:
case SAI_ATTR_VALUE_TYPE_INT8_LIST:
case SAI_ATTR_VALUE_TYPE_OBJECT_LIST:
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_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:
break;
default:
META_MD_ASSERT_FAIL(md, "default empty list specified, but attribute is not list");
}
break;
case SAI_DEFAULT_VALUE_TYPE_VENDOR_SPECIFIC:
switch (md->attrvaluetype)
{
case SAI_ATTR_VALUE_TYPE_MAC:
case SAI_ATTR_VALUE_TYPE_UINT64:
case SAI_ATTR_VALUE_TYPE_JSON:
break;
default:
/*
* Vendor specific attribute should be used only on
* primitive types and not on object id types (OIDs).
*/
META_MD_ASSERT_FAIL(md, "vendor specific not allowed on this type");
}
break;
case SAI_DEFAULT_VALUE_TYPE_SWITCH_INTERNAL:
if ((md->objecttype == SAI_OBJECT_TYPE_PORT) ||
(md->objecttype == SAI_OBJECT_TYPE_PORT_SERDES) ||
(md->objecttype == SAI_OBJECT_TYPE_SAMPLEPACKET) ||
(md->objecttype == SAI_OBJECT_TYPE_NEIGHBOR_ENTRY))
{
/*
* Allow PORT, NEIGHBOR attribute list's to be set to internal.
*/
break;
}
if (md->flags != SAI_ATTR_FLAGS_READ_ONLY)
{
META_MD_ASSERT_FAIL(md, "default internal currently can be set only on read only objects");
}
if (md->objecttype != SAI_OBJECT_TYPE_SWITCH)
{
/*
* This can be later relaxed to be set on ports since they have
* by default queues created.
*/
META_MD_ASSERT_FAIL(md, "default internal can be only set on switch object type");
}
switch (md->attrvaluetype)
{
case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
case SAI_ATTR_VALUE_TYPE_OBJECT_LIST:
break;
default:
META_MD_ASSERT_FAIL(md, "invalid attribute value type specified: %d", md->attrvaluetype);
}
break;
default:
META_MD_ASSERT_FAIL(md, "invalid default value type specified: %d", md->defaultvaluetype);
}
}