$schema: http://json-schema.org/draft-04/schema#
description: Schema describing an OpenFlow error message, version 1.3
id: of13/ofp_error.json
type: object
# Note: code is not required when type is OFPET_EXPERIMENTER
# In this case, set it to `null`
required: [header, type, code]
properties:
  header:
    allOf:
      - $ref: definitions.json#/ofp_header
      - properties:
          type:
            enum: [OFPT_ERROR]
            default: OFPT_ERROR
  type:
    type: string
    enum:
      - OFPET_HELLO_FAILED
      - OFPET_BAD_REQUEST
      - OFPET_BAD_ACTION
      - OFPET_BAD_INSTRUCTION
      - OFPET_BAD_MATCH
      - OFPET_FLOW_MOD_FAILED
      - OFPET_GROUP_MOD_FAILED
      - OFPET_PORT_MOD_FAILED
      - OFPET_TABLE_MOD_FAILED
      - OFPET_QUEUE_OP_FAILED
      - OFPET_SWITCH_CONFIG_FAILED
      - OFPET_ROLE_REQUEST_FAILED
      - OFPET_METER_MOD_FAILED
      - OFPET_TABLE_FEATURES_FAILED
      - OFPET_EXPERIMENTER
    default: OFPET_BAD_REQUEST
  # TODO: tie code to specific type
  code:
    type: string
    enum:
      - OFPHFC_INCOMPATIBLE
      - OFPHFC_EPERM
      - OFPBRC_BAD_VERSION
      - OFPBRC_BAD_TYPE
      - OFPBRC_BAD_MULTIPART
      - OFPBRC_BAD_EXPERIMENTER
      - OFPBRC_BAD_EXP_TYPE
      - OFPBRC_EPERM
      - OFPBRC_BAD_LEN
      - OFPBRC_BUFFER_EMPTY
      - OFPBRC_BUFFER_UNKNOWN
      - OFPBRC_BAD_TABLE_ID
      - OFPBRC_IS_SLAVE
      - OFPBRC_BAD_PORT
      - OFPBRC_BAD_PACKET
      - OFPBRC_MULTIPART_BUFFER_OVERFLOW
      - OFPBAC_BAD_TYPE
      - OFPBAC_BAD_LEN
      - OFPBAC_BAD_EXPERIMENTER
      - OFPBAC_BAD_EXP_TYPE
      - OFPBAC_BAD_OUT_PORT
      - OFPBAC_BAD_ARGUMENT
      - OFPBAC_EPERM
      - OFPBAC_TOO_MANY
      - OFPBAC_BAD_QUEUE
      - OFPBAC_BAD_OUT_GROUP
      - OFPBAC_MATCH_INCONSISTENT
      - OFPBAC_UNSUPPORTED_ORDER
      - OFPBAC_BAD_TAG
      - OFPBAC_BAD_SET_TYPE
      - OFPBAC_BAD_SET_LEN
      - OFPBAC_BAD_SET_ARGUMENT
      - OFPBIC_UNKNOWN_INST
      - OFPBIC_UNSUP_INST
      - OFPBIC_BAD_TABLE_ID
      - OFPBIC_UNSUP_METADATA
      - OFPBIC_UNSUP_METADATA_MASK
      - OFPBIC_BAD_EXPERIMENTER
      - OFPBIC_BAD_EXP_TYPE
      - OFPBIC_BAD_LEN
      - OFPBIC_EPERM
      - OFPBMC_BAD_TYPE
      - OFPBMC_BAD_LEN
      - OFPBMC_BAD_TAG
      - OFPBMC_BAD_DL_ADDR_MASK
      - OFPBMC_BAD_NW_ADDR_MASK
      - OFPBMC_BAD_WILDCARDS
      - OFPBMC_BAD_FIELD
      - OFPBMC_BAD_VALUE
      - OFPBMC_BAD_MASK
      - OFPBMC_BAD_PREREQ
      - OFPBMC_DUP_FIELD
      - OFPBMC_EPERM
      - OFPFMFC_UNKNOWN
      - OFPFMFC_TABLE_FULL
      - OFPFMFC_BAD_TABLE_ID
      - OFPFMFC_OVERLAP
      - OFPFMFC_EPERM
      - OFPFMFC_BAD_TIMEOUT
      - OFPFMFC_BAD_COMMAND
      - OFPFMFC_BAD_FLAGS
      - OFPGMFC_GROUP_EXISTS
      - OFPGMFC_INVALID_GROUP
      - OFPGMFC_WEIGHT_UNSUPPORTED
      - OFPGMFC_OUT_OF_GROUPS
      - OFPGMFC_OUT_OF_BUCKETS
      - OFPGMFC_CHAINING_UNSUPPORTED
      - OFPGMFC_WATCH_UNSUPPORTED
      - OFPGMFC_LOOP
      - OFPGMFC_UNKNOWN_GROUP
      - OFPGMFC_CHAINED_GROUP
      - OFPGMFC_BAD_TYPE
      - OFPGMFC_BAD_COMMAND
      - OFPGMFC_BAD_BUCKET
      - OFPGMFC_BAD_WATCH
      - OFPGMFC_EPERM
      - OFPPMFC_BAD_PORT
      - OFPPMFC_BAD_HW_ADDR
      - OFPPMFC_BAD_CONFIG
      - OFPPMFC_BAD_ADVERTISE
      - OFPPMFC_EPERM
      - OFPTMFC_BAD_TABLE
      - OFPTMFC_BAD_CONFIG
      - OFPTMFC_EPERM
      - OFPQOFC_BAD_PORT
      - OFPQOFC_BAD_QUEUE
      - OFPQOFC_EPERM
      - OFPSCFC_BAD_FLAGS
      - OFPSCFC_BAD_LEN
      - OFPSCFC_EPERM
      - OFPRRFC_STALE
      - OFPRRFC_UNSUP
      - OFPRRFC_BAD_ROLE
      - OFPMMFC_UNKNOWN
      - OFPMMFC_METER_EXISTS
      - OFPMMFC_INVALID_METER
      - OFPMMFC_UNKNOWN_METER
      - OFPMMFC_BAD_COMMAND
      - OFPMMFC_BAD_FLAGS
      - OFPMMFC_BAD_RATE
      - OFPMMFC_BAD_BURST
      - OFPMMFC_BAD_BAND
      - OFPMMFC_BAD_BAND_VALUE
      - OFPMMFC_OUT_OF_METERS
      - OFPMMFC_OUT_OF_BANDS
      - OFPTFFC_BAD_TABLE
      - OFPTFFC_BAD_METADATA
      - OFPTFFC_BAD_TYPE
      - OFPTFFC_BAD_LEN
      - OFPTFFC_BAD_ARGUMENT
      - OFPTFFC_EPERM
      - null
    default: OFPBRC_BAD_VERSION
  data:
    $ref: definitions.json#/optional_data
