void check_attr_default_value_type()

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);
    }
}