void check_attr_default_required()

in meta/saisanitycheck.c [905:1141]


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

    bool requiredefault = (!SAI_HAS_FLAG_MANDATORY_ON_CREATE(md->flags)) &&
        (SAI_HAS_FLAG_CREATE_ONLY(md->flags) || SAI_HAS_FLAG_CREATE_AND_SET(md->flags));

    if (requiredefault == false)
    {
        return;
    }

    if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_NONE)
    {
        /*
         * If default value type is NONE, then default value must be NULL.
         */

        META_ASSERT_NULL(md->defaultvalue);

        /*
         * By default we assume that default acl field or action is
         * disabled and default value is not provided.
         */

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

    switch (md->defaultvaluetype)
    {
        case SAI_DEFAULT_VALUE_TYPE_CONST:

            if (md->objecttype == SAI_OBJECT_TYPE_UDF && md->attrid == SAI_UDF_ATTR_HASH_MASK)
            {
                if (md->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT8_LIST)
                {
                    /*
                     * Const on list, this is exception for UDF object since
                     * it's default value is 2 bytes 0xFF,0xFF and it's special
                     * case.
                     */

                    break;
                }
            }

            if ((md->objecttype == SAI_OBJECT_TYPE_PORT) || (md->objecttype == SAI_OBJECT_TYPE_PORT_SERDES))
            {
                /*
                 * Allow PORT non object list attributes to be set to internal switch values.
                 */
                break;
            }

            if (md->defaultvalue == NULL)
            {
                META_MD_ASSERT_FAIL(md, "default value type is provided, but default value pointer is NULL");
            }

            break;

        case SAI_DEFAULT_VALUE_TYPE_ATTR_VALUE:
        case SAI_DEFAULT_VALUE_TYPE_ATTR_RANGE:
        case SAI_DEFAULT_VALUE_TYPE_SWITCH_INTERNAL:
        case SAI_DEFAULT_VALUE_TYPE_VENDOR_SPECIFIC:
        case SAI_DEFAULT_VALUE_TYPE_EMPTY_LIST:

            if (md->defaultvalue != NULL)
            {
                META_MD_ASSERT_FAIL(md, "default value type is provided, but default value pointer is not NULL");
            }

            break;

        default:

            META_MD_ASSERT_FAIL(md, "unknown default value type %d", md->defaultvaluetype);
    }

    /* default value is required */

    switch (md->attrvaluetype)
    {
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT8:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT16:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT16:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT32:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT32:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV4:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV6:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_ID:

        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_BOOL:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT8:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_INT8:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT16:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_INT16:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT32:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_INT32:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_MAC:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IPV4:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IPV6:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IP_ADDRESS:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_ID:

            if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_CONST)
            {
                break;
            }

            META_MD_ASSERT_FAIL(md, "default value on acl field/action must be const/disabled");

        case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
        case SAI_ATTR_VALUE_TYPE_BOOL:
        case SAI_ATTR_VALUE_TYPE_INT32:
        case SAI_ATTR_VALUE_TYPE_UINT8:
        case SAI_ATTR_VALUE_TYPE_UINT16:
        case SAI_ATTR_VALUE_TYPE_UINT32:
        case SAI_ATTR_VALUE_TYPE_UINT64:
        case SAI_ATTR_VALUE_TYPE_MAC:
        case SAI_ATTR_VALUE_TYPE_IP_ADDRESS:
        case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
        case SAI_ATTR_VALUE_TYPE_PRBS_RX_STATE:
        case SAI_ATTR_VALUE_TYPE_TIMESPEC:
        case SAI_ATTR_VALUE_TYPE_IPV4:
        case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG:
        case SAI_ATTR_VALUE_TYPE_IPV6:
            break;

        case SAI_ATTR_VALUE_TYPE_CHARDATA:

            if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_CONST)
            {
                break;
            }

            META_MD_ASSERT_FAIL(md, "default value on chardata const");

        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_ACL_FIELD_DATA_UINT8_LIST:

            /* even if this is list, on acl field/action we require disabled */

            if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_CONST)
            {
                break;
            }

            META_MD_ASSERT_FAIL(md, "default value on acl field/action must be const/disabled");

        case SAI_ATTR_VALUE_TYPE_INT8_LIST:
        case SAI_ATTR_VALUE_TYPE_UINT32_LIST:
        case SAI_ATTR_VALUE_TYPE_INT32_LIST:
        case SAI_ATTR_VALUE_TYPE_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:

            if (((md->objecttype == SAI_OBJECT_TYPE_PORT) || (md->objecttype == SAI_OBJECT_TYPE_PORT_SERDES))
                 && md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_SWITCH_INTERNAL)
            {
                /*
                 * Allow non object lists on PORT to be set to internal default value.
                 */
                break;
            }

            if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_EMPTY_LIST)
            {
                break;
            }

            META_MD_ASSERT_FAIL(md, "default value list is needed on this attr value type but list is NULL");

        case SAI_ATTR_VALUE_TYPE_UINT8_LIST:

            if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_EMPTY_LIST)
            {
                break;
            }

            if (md->objecttype == SAI_OBJECT_TYPE_UDF && md->attrid == SAI_UDF_ATTR_HASH_MASK)
            {
                if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_CONST)
                {
                    /*
                     * Again this is exception only for this one UDF attribute
                     * to support CONST on list.
                     */

                    break;
                }
            }

            META_MD_ASSERT_FAIL(md, "default value list is needed on this attr value type but list is NULL");

        case SAI_ATTR_VALUE_TYPE_UINT16_LIST:

            if (md->defaultvaluetype == SAI_DEFAULT_VALUE_TYPE_EMPTY_LIST)
            {
                break;
            }

            META_MD_ASSERT_FAIL(md, "default value list is needed on this attr value type but list is NULL");

        case SAI_ATTR_VALUE_TYPE_POINTER:

            /*
             * Gearbox exception for mandatory pointer attribute
             * to support CONST on list.
             */

            break;

        case SAI_ATTR_VALUE_TYPE_JSON:

            break;

        default:

            META_MD_ASSERT_FAIL(md, "default value is required but this attr value type is not supported yet");
    }
}