void check_attr_allow_flags()

in meta/saisanitycheck.c [1822:1928]


void check_attr_allow_flags(
        _In_ const sai_attr_metadata_t* md)
{
    META_LOG_ENTER();

    if (md->allownullobjectid)
    {
        switch (md->attrvaluetype)
        {
            /* there may be other types in acl field/data that accept object id */

            case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_ID:
            case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_ID:
            case SAI_ATTR_VALUE_TYPE_OBJECT_ID:

                break;

            default:

                META_MD_ASSERT_FAIL(md, "allow null object is set but attr value type is wrong");
        }

        /*
         * Object SAI_ATTR_VALUE_TYPE_POINTER should be allowed null pointer by
         * default pointers received from SAI should be only via query api.
         */

        if (md->allowedobjecttypeslength == 0)
        {
            META_MD_ASSERT_FAIL(md, "allow null object is set but allowed object types is empty");
        }
    }

    if (md->allowedobjecttypeslength != 0)
    {
        META_ASSERT_NOT_NULL(md->allowedobjecttypes);
    }

    size_t index = 0;

    for (; index < md->allowedobjecttypeslength; ++index)
    {
        sai_object_type_t ot = md->allowedobjecttypes[index];

        if (is_valid_object_type(ot))
        {
            continue;
        }

        META_MD_ASSERT_FAIL(md, "not allowed object type %d on list", ot);
    }

    /* allow empty list can point to any list, not only object id list */

    if (md->allowemptylist)
    {
        switch (md->attrvaluetype)
        {
            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_OBJECT_LIST:
                break;

            case SAI_ATTR_VALUE_TYPE_INT8_LIST:
            case SAI_ATTR_VALUE_TYPE_UINT8_LIST:
            case SAI_ATTR_VALUE_TYPE_UINT16_LIST:
            case SAI_ATTR_VALUE_TYPE_INT32_LIST:
            case SAI_ATTR_VALUE_TYPE_VLAN_LIST:
            case SAI_ATTR_VALUE_TYPE_UINT32_LIST:
            case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST:
            case SAI_ATTR_VALUE_TYPE_MAP_LIST:
            case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
            case SAI_ATTR_VALUE_TYPE_TLV_LIST:
            case SAI_ATTR_VALUE_TYPE_SEGMENT_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_ACL_FIELD_DATA_UINT8_LIST:
            case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG_LIST:
            case SAI_ATTR_VALUE_TYPE_PORT_ERR_STATUS_LIST:
            case SAI_ATTR_VALUE_TYPE_IP_PREFIX_LIST:
            case SAI_ATTR_VALUE_TYPE_ACL_CHAIN_LIST:
                break;

            default:

                META_MD_ASSERT_FAIL(md, "allow empty list is set but attr value type is not list");
        }
    }

    if (md->allowrepetitiononlist || md->allowmixedobjecttypes)
    {
        switch (md->attrvaluetype)
        {
            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_OBJECT_LIST:
                break;

            default:

                META_MD_ASSERT_FAIL(md, "allow null object is set but attr value type is wrong");
        }
    }
}