void check_attr_acl_fields()

in meta/saisanitycheck.c [2005:2165]


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

    switch (md->attrvaluetype)
    {
        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_FIELD_DATA_OBJECT_LIST:
        case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST:

            if (md->objecttype == SAI_OBJECT_TYPE_ACL_ENTRY &&
                    md->attrid >= SAI_ACL_ENTRY_ATTR_FIELD_START &&
                    md->attrid  <= SAI_ACL_ENTRY_ATTR_FIELD_END)
            {
                break;

            }

            if (md->objecttype == SAI_OBJECT_TYPE_ACL_TABLE &&
                    md->attrid >= SAI_ACL_TABLE_ATTR_FIELD_VALID_BITS_START &&
                    md->attrid  <= SAI_ACL_TABLE_ATTR_FIELD_VALID_BITS_END)
            {
                break;

            }

            if (md->objecttype == SAI_OBJECT_TYPE_UDF_MATCH)
            {
                /*
                 * This is special case, object for UDF MATCH can use acl field
                 * attribute values since it's easier to maintain since this
                 * match also need a mask parameter. But restriction is that
                 * only primitive types can be used, no object id;
                 */

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

                    default:

                        META_MD_ASSERT_FAIL(md, "acl field data used on udf match can be only primitive type");
                }

                break;
            }

            if (md->objecttype == SAI_OBJECT_TYPE_DTEL &&
                    md->attrid == SAI_DTEL_ATTR_INT_L4_DSCP &&
                    md->attrvaluetype == SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8)
            {
                break;
            }

            META_MD_ASSERT_FAIL(md, "acl field may only be set on acl field and udf match");

            break;

        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:
        case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_LIST:

            if (md->objecttype == SAI_OBJECT_TYPE_ACL_ENTRY && md->isextensionattr)
            {
                break;
            }

            if (md->objecttype != SAI_OBJECT_TYPE_ACL_ENTRY  ||
                    md->attrid < SAI_ACL_ENTRY_ATTR_ACTION_START  ||
                    md->attrid > SAI_ACL_ENTRY_ATTR_ACTION_END)
            {
                META_MD_ASSERT_FAIL(md, "acl action may only be set on acl action");
            }

            break;

        default:
            break;
    }

    if (md->objecttype == SAI_OBJECT_TYPE_ACL_ENTRY)
    {
        if (md->attrid >= SAI_ACL_ENTRY_ATTR_FIELD_START &&
                md->attrid <= SAI_ACL_ENTRY_ATTR_FIELD_END)
        {
            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_FIELD_DATA_OBJECT_LIST:
                case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT8_LIST:
                    break;

                default:
                    META_MD_ASSERT_FAIL(md, "invalid attr value type for acl field");
            }
        }

        if (md->attrid >= SAI_ACL_ENTRY_ATTR_ACTION_START &&
                md->attrid <= SAI_ACL_ENTRY_ATTR_ACTION_END)
        {
            switch (md->attrvaluetype)
            {
                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_INT32:
                case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_UINT32:
                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:
                case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_LIST:
                    break;

                default:
                    META_MD_ASSERT_FAIL(md, "invalid attr value type for acl action");
            }
        }
    }
}