void check_attr_allowed_object_types()

in meta/saisanitycheck.c [825:903]


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

    if (md->allowedobjecttypeslength != 0 && md->allowedobjecttypes == NULL)
    {
        META_MD_ASSERT_FAIL(md, "allowed object type len is specified but pointer is NULL");
    }

    if (md->allowedobjecttypeslength == 0 && md->allowedobjecttypes != NULL)
    {
        META_MD_ASSERT_FAIL(md, "allowed object type len zero, but but pointer to objects is specified");
    }

    if (md->allowedobjecttypes == NULL)
    {
        return;
    }

    if (md->isoidattribute)
    {
        META_ASSERT_TRUE(md->allowedobjecttypeslength > 0, "object len should be at least 1");
    }
    else
    {
        META_ASSERT_TRUE(md->allowedobjecttypeslength == 0, "object len should be 0");
    }

    switch (md->attrvaluetype)
    {
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_LIST:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_ID:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_LIST:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_ID:
        case SAI_ATTR_VALUE_TYPE_OBJECT_LIST:
        case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
            break;

        default:

            META_MD_ASSERT_FAIL(md, "allowed object types should be empty on this attr value type");
    }

    /*
     * check if allowed object types are in range
     * they may repeat, but we can also check that
     */

    size_t i = 0;

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

        if (!is_valid_object_type(ot))
        {
            META_MD_ASSERT_FAIL(md, "invalid allowed object type: %d", ot);
        }

        const sai_object_type_info_t* info = sai_metadata_get_object_type_info(ot);

        META_ASSERT_NOT_NULL(info);

        if (info->isnonobjectid)
        {
            META_MD_ASSERT_FAIL(md, "non object id can't be used as object id: %d", ot);
        }

        if (ot == SAI_OBJECT_TYPE_SWITCH ||
                ot == SAI_OBJECT_TYPE_FDB_FLUSH ||
                ot == SAI_OBJECT_TYPE_HOSTIF_PACKET)
        {
            /* switch object type is meant to be used only in non object id struct types */

            META_MD_ASSERT_FAIL(md, "switch object type can't be used as object type in any attribute");
        }
    }
}