void check_attr_flags()

in meta/saisanitycheck.c [549:654]


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

    switch ((int)md->flags)
    {
        case SAI_ATTR_FLAGS_MANDATORY_ON_CREATE | SAI_ATTR_FLAGS_CREATE_ONLY | SAI_ATTR_FLAGS_KEY:
        case SAI_ATTR_FLAGS_MANDATORY_ON_CREATE | SAI_ATTR_FLAGS_CREATE_ONLY:
        case SAI_ATTR_FLAGS_MANDATORY_ON_CREATE | SAI_ATTR_FLAGS_CREATE_AND_SET:

            if (md->validonlytype != SAI_ATTR_CONDITION_TYPE_NONE)
            {
                META_MD_ASSERT_FAIL(md, "valid only attribute can't be mandatory on create, use condition");
            }

            /*
             * Currently we don't use RANGE type so this check can be disabled.
             * Range idea was introduces so attribute can be in specific range
             * of other MIN/MAX attributes. This is not supported yet.
             *
             * if (md->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT32 &&
             *         md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_ATTR_RANGE)
             * {
             *     break;
             * }
             */

            if (md->defaultvaluetype != SAI_DEFAULT_VALUE_TYPE_NONE)
            {
                META_MD_ASSERT_FAIL(md, "no default value expected, but type provided: %s",
                        sai_metadata_get_default_value_type_name(md->defaultvaluetype));
            }

            break;

        case SAI_ATTR_FLAGS_CREATE_ONLY:
        case SAI_ATTR_FLAGS_CREATE_AND_SET:

            if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_NONE)
            {
                /*
                 * Default value of object id can be internal or NULL and it
                 * needs to be specified explicitly.
                 */

                /*
                 * Default value for pointer must be specified and must be NULL.
                 */

                /*
                 * Default value for acl field or action is provided and is
                 * disabled by default.
                 */

                META_MD_ASSERT_FAIL(md, "expected default value, but none provided");
            }

            break;

        case SAI_ATTR_FLAGS_READ_ONLY:

            if (md->conditiontype != SAI_ATTR_CONDITION_TYPE_NONE)
            {
                META_MD_ASSERT_FAIL(md, "read only attribute can't be conditional");
            }

            if (md->validonlytype != SAI_ATTR_CONDITION_TYPE_NONE)
            {
                META_MD_ASSERT_FAIL(md, "read only attribute can't be valid only");
            }

            if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_SWITCH_INTERNAL)
            {
                if (md->attrvaluetype == SAI_ATTR_VALUE_TYPE_OBJECT_ID ||
                        md->attrvaluetype == SAI_ATTR_VALUE_TYPE_OBJECT_LIST)
                {
                    /*
                     * Read only object id/list can be marked as internal like
                     * default virtual router, cpu port id, default queues on
                     * ports, etc.
                     */

                    break;
                }
            }

            if (md->defaultvaluetype != SAI_DEFAULT_VALUE_TYPE_NONE)
            {
                META_MD_ASSERT_FAIL(md, "no default value expected, but type provided: %s",
                        sai_metadata_get_default_value_type_name(md->defaultvaluetype));
            }

            break;

        default:

            META_MD_ASSERT_FAIL(md, "invalid creation flags: 0x%x", md->flags);
    }

    META_ASSERT_TRUE(SAI_HAS_FLAG_MANDATORY_ON_CREATE(md->flags) == md->ismandatoryoncreate, "wrong ismandatoryoncreate");
    META_ASSERT_TRUE(SAI_HAS_FLAG_CREATE_ONLY(md->flags) == md->iscreateonly, "wrong iscreateonly");
    META_ASSERT_TRUE(SAI_HAS_FLAG_CREATE_AND_SET(md->flags) == md->iscreateandset, "wrong iscreateandset");
    META_ASSERT_TRUE(SAI_HAS_FLAG_READ_ONLY(md->flags) == md->isreadonly, "wrong isreadonly");
    META_ASSERT_TRUE(SAI_HAS_FLAG_KEY(md->flags) == md->iskey, "wrong iskey");
}