/*
 * Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior University
 * Copyright (c) 2011, 2012 Open Networking Foundation
 * Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler.
 * Copyright 2018, Red Hat, Inc.
 */
// Automatically generated by LOXI from template const.go
// Do not modify

package of15

import (
	"fmt"
	"strings"
)

const (
	// Identifiers from group macro_definitions
	MaxTableNameLen    = 32         // OFP_MAX_TABLE_NAME_LEN
	MaxPortNameLen     = 16         // OFP_MAX_PORT_NAME_LEN
	TCPPort            = 6653       // OFP_TCP_PORT
	SSLPort            = 6653       // OFP_SSL_PORT
	EthAlen            = 6          // OFP_ETH_ALEN
	DefaultMissSendLen = 128        // OFP_DEFAULT_MISS_SEND_LEN
	VLANNone           = 0          // OFP_VLAN_NONE
	FlowPermanent      = 0          // OFP_FLOW_PERMANENT
	DefaultPriority    = 32768      // OFP_DEFAULT_PRIORITY
	NoBuffer           = 4294967295 // OFP_NO_BUFFER
	DescStrLen         = 256        // DESC_STR_LEN
	SerialNumLen       = 32         // SERIAL_NUM_LEN
	OFPQAll            = 4294967295 // OFPQ_ALL
	OFPQMaxRateUncfg   = 65535      // OFPQ_MAX_RATE_UNCFG
	OFPQMinRateUncfg   = 65535      // OFPQ_MIN_RATE_UNCFG
)

const (
	// Identifiers from group nx_action_controller2_prop_type
	Nxac2PtMaxLen       = 0 // NXAC2PT_MAX_LEN
	Nxac2PtControllerID = 1 // NXAC2PT_CONTROLLER_ID
	Nxac2PtReason       = 2 // NXAC2PT_REASON
	Nxac2PtUserdata     = 3 // NXAC2PT_USERDATA
	Nxac2PtPause        = 4 // NXAC2PT_PAUSE
	Nxac2PtMeterID      = 5 // NXAC2PT_METER_ID
)

type NxActionController2PropType uint16

func (self NxActionController2PropType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group nx_bd_algorithms
	NxBdAlgActiveBackup = 0 // NX_BD_ALG_ACTIVE_BACKUP
	NxBdAlgHrw          = 1 // NX_BD_ALG_HRW
)

type NxBdAlgorithms uint16

func (self NxBdAlgorithms) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("\"%s\"", self)), nil
}

func (self NxBdAlgorithms) String() string {
	switch self {
	case NxBdAlgActiveBackup:
		return "active_backup"
	case NxBdAlgHrw:
		return "hrw"
	default:
		return fmt.Sprintf("%d", self)
	}
}

const (
	// Identifiers from group nx_conntrack_flags
	NxCtFCommit = 1 // NX_CT_F_COMMIT
	NxCtFForce  = 2 // NX_CT_F_FORCE
)

type NxConntrackFlags uint16

func (self NxConntrackFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&NxCtFCommit == NxCtFCommit {
		flags = append(flags, "\"Commit\": true")
	}
	if self&NxCtFForce == NxCtFForce {
		flags = append(flags, "\"Force\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group nx_flow_monitor_flags
	NxfmfInitial = 1  // NXFMF_INITIAL
	NxfmfAdd     = 2  // NXFMF_ADD
	NxfmfDelete  = 4  // NXFMF_DELETE
	NxfmfModify  = 8  // NXFMF_MODIFY
	NxfmfActions = 16 // NXFMF_ACTIONS
	NxfmfOwn     = 32 // NXFMF_OWN
)

type NxFlowMonitorFlags uint16

func (self NxFlowMonitorFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&NxfmfInitial == NxfmfInitial {
		flags = append(flags, "\"Initial\": true")
	}
	if self&NxfmfAdd == NxfmfAdd {
		flags = append(flags, "\"Add\": true")
	}
	if self&NxfmfDelete == NxfmfDelete {
		flags = append(flags, "\"Delete\": true")
	}
	if self&NxfmfModify == NxfmfModify {
		flags = append(flags, "\"Modify\": true")
	}
	if self&NxfmfActions == NxfmfActions {
		flags = append(flags, "\"Actions\": true")
	}
	if self&NxfmfOwn == NxfmfOwn {
		flags = append(flags, "\"Own\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group nx_hash_fields
	NxHashFieldsEthSrc           = 0 // NX_HASH_FIELDS_ETH_SRC
	NxHashFieldsSymmetricL4      = 1 // NX_HASH_FIELDS_SYMMETRIC_L4
	NxHashFieldsSymmetricL3L4    = 2 // NX_HASH_FIELDS_SYMMETRIC_L3L4
	NxHashFieldsSymmetricL3L4Udp = 3 // NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP
	NxHashFieldsNwSrc            = 4 // NX_HASH_FIELDS_NW_SRC
	NxHashFieldsNwDst            = 5 // NX_HASH_FIELDS_NW_DST
	NxHashFieldsSymmetricL3      = 6 // NX_HASH_FIELDS_SYMMETRIC_L3
)

type NxHashFields uint16

func (self NxHashFields) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("\"%s\"", self)), nil
}

func (self NxHashFields) String() string {
	switch self {
	case NxHashFieldsEthSrc:
		return "eth_src"
	case NxHashFieldsSymmetricL4:
		return "symmetric_l4"
	case NxHashFieldsSymmetricL3L4:
		return "symmetric_l3l4"
	case NxHashFieldsSymmetricL3L4Udp:
		return "symmetric_l3l4_udp"
	case NxHashFieldsNwSrc:
		return "nw_src"
	case NxHashFieldsNwDst:
		return "nw_dst"
	case NxHashFieldsSymmetricL3:
		return "symmetric_l3"
	default:
		return fmt.Sprintf("%d", self)
	}
}

const (
	// Identifiers from group nx_mp_algorithm
	NxMpAlgModuloN       = 0 // NX_MP_ALG_MODULO_N
	NxMpAlgHashThreshold = 1 // NX_MP_ALG_HASH_THRESHOLD
	NxMpAlgHrw           = 2 // NX_MP_ALG_HRW
	NxMpAlgIterHash      = 3 // NX_MP_ALG_ITER_HASH
)

type NxMpAlgorithm uint16

func (self NxMpAlgorithm) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("\"%s\"", self)), nil
}

func (self NxMpAlgorithm) String() string {
	switch self {
	case NxMpAlgModuloN:
		return "modulo_n"
	case NxMpAlgHashThreshold:
		return "hash_threshold"
	case NxMpAlgHrw:
		return "hrw"
	case NxMpAlgIterHash:
		return "iter_hash"
	default:
		return fmt.Sprintf("%d", self)
	}
}

const (
	// Identifiers from group of_action_nx_bundle_slave_type
	NxmOfInPort                  = 2     // NXM_OF_IN_PORT
	NxmOfJustThereToDefinePrefix = 10000 // NXM_OF_JUST_THERE_TO_DEFINE_PREFIX
)

type ActionNxBundleSlaveType uint32

func (self ActionNxBundleSlaveType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("\"%s\"", self)), nil
}

func (self ActionNxBundleSlaveType) String() string {
	switch self {
	case NxmOfInPort:
		return "in_port"
	case NxmOfJustThereToDefinePrefix:
		return "just_there_to_define_prefix"
	default:
		return fmt.Sprintf("%d", self)
	}
}

const (
	// Identifiers from group of_bsn_gentable_error_code
	OFBSNGentableErrorUnknown   = 0 // OF_BSN_GENTABLE_ERROR_UNKNOWN
	OFBSNGentableErrorParam     = 1 // OF_BSN_GENTABLE_ERROR_PARAM
	OFBSNGentableErrorTableFull = 2 // OF_BSN_GENTABLE_ERROR_TABLE_FULL
)

type BsnGentableErrorCode uint16

func (self BsnGentableErrorCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group of_bsn_hash_gtp_port_match
	OFBSNHashGtpPortMatchSrc       = 1 // OF_BSN_HASH_GTP_PORT_MATCH_SRC
	OFBSNHashGtpPortMatchDst       = 2 // OF_BSN_HASH_GTP_PORT_MATCH_DST
	OFBSNHashGtpPortMatchSrcOrDst  = 3 // OF_BSN_HASH_GTP_PORT_MATCH_SRC_OR_DST
	OFBSNHashGtpPortMatchSrcAndDst = 4 // OF_BSN_HASH_GTP_PORT_MATCH_SRC_AND_DST
)

type BsnHashGtpPortMatch uint8

func (self BsnHashGtpPortMatch) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group of_bsn_hash_packet_field
	BSNHashFieldDstMAC           = 2      // OFP_BSN_HASH_FIELD_DST_MAC
	BSNHashFieldSrcMAC           = 4      // OFP_BSN_HASH_FIELD_SRC_MAC
	BSNHashFieldEthType          = 8      // OFP_BSN_HASH_FIELD_ETH_TYPE
	BSNHashFieldVLANID           = 16     // OFP_BSN_HASH_FIELD_VLAN_ID
	BSNHashFieldInnerL2          = 32     // OFP_BSN_HASH_FIELD_INNER_L2
	BSNHashFieldInnerL3          = 64     // OFP_BSN_HASH_FIELD_INNER_L3
	BSNHashFieldSrcIp            = 128    // OFP_BSN_HASH_FIELD_SRC_IP
	BSNHashFieldDstIp            = 256    // OFP_BSN_HASH_FIELD_DST_IP
	BSNHashFieldIpProto          = 512    // OFP_BSN_HASH_FIELD_IP_PROTO
	BSNHashFieldSrcL4Port        = 1024   // OFP_BSN_HASH_FIELD_SRC_L4_PORT
	BSNHashFieldDstL4Port        = 2048   // OFP_BSN_HASH_FIELD_DST_L4_PORT
	BSNHashFieldMplsLabel1       = 4096   // OFP_BSN_HASH_FIELD_MPLS_LABEL1
	BSNHashFieldMplsLabel2       = 8192   // OFP_BSN_HASH_FIELD_MPLS_LABEL2
	BSNHashFieldMplsLabel3       = 16384  // OFP_BSN_HASH_FIELD_MPLS_LABEL3
	BSNHashFieldMplsLabelHiBits  = 32768  // OFP_BSN_HASH_FIELD_MPLS_LABEL_HI_BITS
	BSNHashFieldMplsPayloadSrcIp = 65536  // OFP_BSN_HASH_FIELD_MPLS_PAYLOAD_SRC_IP
	BSNHashFieldMplsPayloadDstIp = 131072 // OFP_BSN_HASH_FIELD_MPLS_PAYLOAD_DST_IP
	BSNHashFieldSymmetric        = 262144 // OFP_BSN_HASH_FIELD_SYMMETRIC
)

type BsnHashPacketField uint64

func (self BsnHashPacketField) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNHashFieldDstMAC == BSNHashFieldDstMAC {
		flags = append(flags, "\"DstMAC\": true")
	}
	if self&BSNHashFieldSrcMAC == BSNHashFieldSrcMAC {
		flags = append(flags, "\"SrcMAC\": true")
	}
	if self&BSNHashFieldEthType == BSNHashFieldEthType {
		flags = append(flags, "\"EthType\": true")
	}
	if self&BSNHashFieldVLANID == BSNHashFieldVLANID {
		flags = append(flags, "\"VlanID\": true")
	}
	if self&BSNHashFieldInnerL2 == BSNHashFieldInnerL2 {
		flags = append(flags, "\"InnerL2\": true")
	}
	if self&BSNHashFieldInnerL3 == BSNHashFieldInnerL3 {
		flags = append(flags, "\"InnerL3\": true")
	}
	if self&BSNHashFieldSrcIp == BSNHashFieldSrcIp {
		flags = append(flags, "\"SrcIp\": true")
	}
	if self&BSNHashFieldDstIp == BSNHashFieldDstIp {
		flags = append(flags, "\"DstIp\": true")
	}
	if self&BSNHashFieldIpProto == BSNHashFieldIpProto {
		flags = append(flags, "\"IpProto\": true")
	}
	if self&BSNHashFieldSrcL4Port == BSNHashFieldSrcL4Port {
		flags = append(flags, "\"SrcL4Port\": true")
	}
	if self&BSNHashFieldDstL4Port == BSNHashFieldDstL4Port {
		flags = append(flags, "\"DstL4Port\": true")
	}
	if self&BSNHashFieldMplsLabel1 == BSNHashFieldMplsLabel1 {
		flags = append(flags, "\"MplsLabel1\": true")
	}
	if self&BSNHashFieldMplsLabel2 == BSNHashFieldMplsLabel2 {
		flags = append(flags, "\"MplsLabel2\": true")
	}
	if self&BSNHashFieldMplsLabel3 == BSNHashFieldMplsLabel3 {
		flags = append(flags, "\"MplsLabel3\": true")
	}
	if self&BSNHashFieldMplsLabelHiBits == BSNHashFieldMplsLabelHiBits {
		flags = append(flags, "\"MplsLabelHiBits\": true")
	}
	if self&BSNHashFieldMplsPayloadSrcIp == BSNHashFieldMplsPayloadSrcIp {
		flags = append(flags, "\"MplsPayloadSrcIp\": true")
	}
	if self&BSNHashFieldMplsPayloadDstIp == BSNHashFieldMplsPayloadDstIp {
		flags = append(flags, "\"MplsPayloadDstIp\": true")
	}
	if self&BSNHashFieldSymmetric == BSNHashFieldSymmetric {
		flags = append(flags, "\"Symmetric\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group of_bsn_hash_packet_type
	OFBSNHashPacketL2        = 0 // OF_BSN_HASH_PACKET_L2
	OFBSNHashPacketL2Gre     = 1 // OF_BSN_HASH_PACKET_L2GRE
	OFBSNHashPacketIpv4      = 3 // OF_BSN_HASH_PACKET_IPV4
	OFBSNHashPacketIpv6      = 4 // OF_BSN_HASH_PACKET_IPV6
	OFBSNHashPacketMpls      = 5 // OF_BSN_HASH_PACKET_MPLS
	OFBSNHashPacketSymmetric = 6 // OF_BSN_HASH_PACKET_SYMMETRIC
)

type BsnHashPacketType uint8

func (self BsnHashPacketType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group of_bsn_hash_type
	BSNHashTypeL2       = 0 // OFP_BSN_HASH_TYPE_L2
	BSNHashTypeL3       = 1 // OFP_BSN_HASH_TYPE_L3
	BSNHashTypeEnhanced = 2 // OFP_BSN_HASH_TYPE_ENHANCED
)

type BsnHashType uint8

func (self BsnHashType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group of_bsn_lacp_convergence_status
	LacpSuccess   = 0 // LACP_SUCCESS
	LacpTimedout  = 1 // LACP_TIMEDOUT
	LacpOutOfSync = 2 // LACP_OUT_OF_SYNC
)

type BsnLacpConvergenceStatus uint8

func (self BsnLacpConvergenceStatus) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group of_bsn_pdu_slot_num
	BsnPduSlotNumAny = 255 // BSN_PDU_SLOT_NUM_ANY
)

type BsnPduSlotNum uint8

func (self BsnPduSlotNum) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group of_bsn_vlan_counter
	BSNVLANCounterRxBytes   = 0 // OFP_BSN_VLAN_COUNTER_RX_BYTES
	BSNVLANCounterRxPackets = 1 // OFP_BSN_VLAN_COUNTER_RX_PACKETS
	BSNVLANCounterTxBytes   = 2 // OFP_BSN_VLAN_COUNTER_TX_BYTES
	BSNVLANCounterTxPackets = 3 // OFP_BSN_VLAN_COUNTER_TX_PACKETS
)

type BsnVlanCounter uint8

func (self BsnVlanCounter) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group of_bsn_vrf_counter
	BSNVrfCounterBytes   = 0 // OFP_BSN_VRF_COUNTER_BYTES
	BSNVrfCounterPackets = 1 // OFP_BSN_VRF_COUNTER_PACKETS
)

type BsnVrfCounter uint8

func (self BsnVrfCounter) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group of_nx_nat_range
	NxNatRangeIpv4Min  = 1  // NX_NAT_RANGE_IPV4_MIN
	NxNatRangeIpv4Max  = 2  // NX_NAT_RANGE_IPV4_MAX
	NxNatRangeIpv6Min  = 4  // NX_NAT_RANGE_IPV6_MIN
	NxNatRangeIpv6Max  = 8  // NX_NAT_RANGE_IPV6_MAX
	NxNatRangeProtoMin = 16 // NX_NAT_RANGE_PROTO_MIN
	NxNatRangeProtoMax = 32 // NX_NAT_RANGE_PROTO_MAX
)

type NxNatRange uint16

func (self NxNatRange) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&NxNatRangeIpv4Min == NxNatRangeIpv4Min {
		flags = append(flags, "\"Ipv4Min\": true")
	}
	if self&NxNatRangeIpv4Max == NxNatRangeIpv4Max {
		flags = append(flags, "\"Ipv4Max\": true")
	}
	if self&NxNatRangeIpv6Min == NxNatRangeIpv6Min {
		flags = append(flags, "\"Ipv6Min\": true")
	}
	if self&NxNatRangeIpv6Max == NxNatRangeIpv6Max {
		flags = append(flags, "\"Ipv6Max\": true")
	}
	if self&NxNatRangeProtoMin == NxNatRangeProtoMin {
		flags = append(flags, "\"ProtoMin\": true")
	}
	if self&NxNatRangeProtoMax == NxNatRangeProtoMax {
		flags = append(flags, "\"ProtoMax\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_action_type
	OFPATOutput       = 0     // OFPAT_OUTPUT
	OFPATCopyTtlOut   = 11    // OFPAT_COPY_TTL_OUT
	OFPATCopyTtlIn    = 12    // OFPAT_COPY_TTL_IN
	OFPATSetMplsTtl   = 15    // OFPAT_SET_MPLS_TTL
	OFPATDecMplsTtl   = 16    // OFPAT_DEC_MPLS_TTL
	OFPATPushVLAN     = 17    // OFPAT_PUSH_VLAN
	OFPATPopVLAN      = 18    // OFPAT_POP_VLAN
	OFPATPushMpls     = 19    // OFPAT_PUSH_MPLS
	OFPATPopMpls      = 20    // OFPAT_POP_MPLS
	OFPATSetQueue     = 21    // OFPAT_SET_QUEUE
	OFPATGroup        = 22    // OFPAT_GROUP
	OFPATSetNwTtl     = 23    // OFPAT_SET_NW_TTL
	OFPATDecNwTtl     = 24    // OFPAT_DEC_NW_TTL
	OFPATSetField     = 25    // OFPAT_SET_FIELD
	OFPATPushPbb      = 26    // OFPAT_PUSH_PBB
	OFPATPopPbb       = 27    // OFPAT_POP_PBB
	OFPATCopyField    = 28    // OFPAT_COPY_FIELD
	OFPATMeter        = 29    // OFPAT_METER
	OFPATExperimenter = 65535 // OFPAT_EXPERIMENTER
)

type ActionType uint16

func (self ActionType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_async_config_failed_code
	OFPACFCInvalid     = 0 // OFPACFC_INVALID
	OFPACFCUnsupported = 1 // OFPACFC_UNSUPPORTED
	OFPACFCEperm       = 2 // OFPACFC_EPERM
)

type AsyncConfigFailedCode uint16

func (self AsyncConfigFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_async_config_prop_type
	OFPACPTPacketInSlave        = 0     // OFPACPT_PACKET_IN_SLAVE
	OFPACPTPacketInMaster       = 1     // OFPACPT_PACKET_IN_MASTER
	OFPACPTPortStatusSlave      = 2     // OFPACPT_PORT_STATUS_SLAVE
	OFPACPTPortStatusMaster     = 3     // OFPACPT_PORT_STATUS_MASTER
	OFPACPTFlowRemovedSlave     = 4     // OFPACPT_FLOW_REMOVED_SLAVE
	OFPACPTFlowRemovedMaster    = 5     // OFPACPT_FLOW_REMOVED_MASTER
	OFPACPTRoleStatusSlave      = 6     // OFPACPT_ROLE_STATUS_SLAVE
	OFPACPTRoleStatusMaster     = 7     // OFPACPT_ROLE_STATUS_MASTER
	OFPACPTTableStatusSlave     = 8     // OFPACPT_TABLE_STATUS_SLAVE
	OFPACPTTableStatusMaster    = 9     // OFPACPT_TABLE_STATUS_MASTER
	OFPACPTRequestforwardSlave  = 10    // OFPACPT_REQUESTFORWARD_SLAVE
	OFPACPTRequestforwardMaster = 11    // OFPACPT_REQUESTFORWARD_MASTER
	OFPACPTFlowStatsSlave       = 12    // OFPACPT_FLOW_STATS_SLAVE
	OFPACPTFlowStatsMaster      = 13    // OFPACPT_FLOW_STATS_MASTER
	OFPACPTContStatusSlave      = 14    // OFPACPT_CONT_STATUS_SLAVE
	OFPACPTContStatusMaster     = 15    // OFPACPT_CONT_STATUS_MASTER
	OFPACPTExperimenterSlave    = 65534 // OFPACPT_EXPERIMENTER_SLAVE
	OFPACPTExperimenterMaster   = 65535 // OFPACPT_EXPERIMENTER_MASTER
)

const (
	// Identifiers from group ofp_bad_action_code
	OFPBACBadType             = 0  // OFPBAC_BAD_TYPE
	OFPBACBadLen              = 1  // OFPBAC_BAD_LEN
	OFPBACBadExperimenter     = 2  // OFPBAC_BAD_EXPERIMENTER
	OFPBACBadExperimenterType = 3  // OFPBAC_BAD_EXPERIMENTER_TYPE
	OFPBACBadOutPort          = 4  // OFPBAC_BAD_OUT_PORT
	OFPBACBadArgument         = 5  // OFPBAC_BAD_ARGUMENT
	OFPBACEperm               = 6  // OFPBAC_EPERM
	OFPBACTooMany             = 7  // OFPBAC_TOO_MANY
	OFPBACBadQueue            = 8  // OFPBAC_BAD_QUEUE
	OFPBACBadOutGroup         = 9  // OFPBAC_BAD_OUT_GROUP
	OFPBACMatchInconsistent   = 10 // OFPBAC_MATCH_INCONSISTENT
	OFPBACUnsupportedOrder    = 11 // OFPBAC_UNSUPPORTED_ORDER
	OFPBACBadTag              = 12 // OFPBAC_BAD_TAG
	OFPBACBadSetType          = 13 // OFPBAC_BAD_SET_TYPE
	OFPBACBadSetLen           = 14 // OFPBAC_BAD_SET_LEN
	OFPBACBadSetArgument      = 15 // OFPBAC_BAD_SET_ARGUMENT
	OFPBACBadSetMask          = 16 // OFPBAC_BAD_SET_MASK
	OFPBACBadMeter            = 17 // OFPBAC_BAD_METER
)

type BadActionCode uint16

func (self BadActionCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bad_instruction_code
	OFPBICUnknownInst         = 0 // OFPBIC_UNKNOWN_INST
	OFPBICUnsupInst           = 1 // OFPBIC_UNSUP_INST
	OFPBICBadTableID          = 2 // OFPBIC_BAD_TABLE_ID
	OFPBICUnsupMetadata       = 3 // OFPBIC_UNSUP_METADATA
	OFPBICUnsupMetadataMask   = 4 // OFPBIC_UNSUP_METADATA_MASK
	OFPBICBadExperimenter     = 5 // OFPBIC_BAD_EXPERIMENTER
	OFPBICBadExperimenterType = 6 // OFPBIC_BAD_EXPERIMENTER_TYPE
	OFPBICBadLen              = 7 // OFPBIC_BAD_LEN
	OFPBICEperm               = 8 // OFPBIC_EPERM
	OFPBICDupInst             = 9 // OFPBIC_DUP_INST
)

type BadInstructionCode uint16

func (self BadInstructionCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bad_match_code
	OFPBMCBadType       = 0  // OFPBMC_BAD_TYPE
	OFPBMCBadLen        = 1  // OFPBMC_BAD_LEN
	OFPBMCBadTag        = 2  // OFPBMC_BAD_TAG
	OFPBMCBadDlAddrMask = 3  // OFPBMC_BAD_DL_ADDR_MASK
	OFPBMCBadNwAddrMask = 4  // OFPBMC_BAD_NW_ADDR_MASK
	OFPBMCBadWildcards  = 5  // OFPBMC_BAD_WILDCARDS
	OFPBMCBadField      = 6  // OFPBMC_BAD_FIELD
	OFPBMCBadValue      = 7  // OFPBMC_BAD_VALUE
	OFPBMCBadMask       = 8  // OFPBMC_BAD_MASK
	OFPBMCBadPrereq     = 9  // OFPBMC_BAD_PREREQ
	OFPBMCDupField      = 10 // OFPBMC_DUP_FIELD
	OFPBMCEperm         = 11 // OFPBMC_EPERM
)

type BadMatchCode uint16

func (self BadMatchCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bad_property_code
	OFPBPCBadType         = 0 // OFPBPC_BAD_TYPE
	OFPBPCBadLen          = 1 // OFPBPC_BAD_LEN
	OFPBPCBadValue        = 2 // OFPBPC_BAD_VALUE
	OFPBPCTooMany         = 3 // OFPBPC_TOO_MANY
	OFPBPCDupType         = 4 // OFPBPC_DUP_TYPE
	OFPBPCBadExperimenter = 5 // OFPBPC_BAD_EXPERIMENTER
	OFPBPCBadExpType      = 6 // OFPBPC_BAD_EXP_TYPE
	OFPBPCBadExpValue     = 7 // OFPBPC_BAD_EXP_VALUE
	OFPBPCEperm           = 8 // OFPBPC_EPERM
)

type BadPropertyCode uint16

func (self BadPropertyCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bad_request_code
	OFPBRCBadVersion              = 0  // OFPBRC_BAD_VERSION
	OFPBRCBadType                 = 1  // OFPBRC_BAD_TYPE
	OFPBRCBadStat                 = 2  // OFPBRC_BAD_STAT
	OFPBRCBadExperimenter         = 3  // OFPBRC_BAD_EXPERIMENTER
	OFPBRCBadExperimenterType     = 4  // OFPBRC_BAD_EXPERIMENTER_TYPE
	OFPBRCEperm                   = 5  // OFPBRC_EPERM
	OFPBRCBadLen                  = 6  // OFPBRC_BAD_LEN
	OFPBRCBufferEmpty             = 7  // OFPBRC_BUFFER_EMPTY
	OFPBRCBufferUnknown           = 8  // OFPBRC_BUFFER_UNKNOWN
	OFPBRCBadTableID              = 9  // OFPBRC_BAD_TABLE_ID
	OFPBRCIsSlave                 = 10 // OFPBRC_IS_SLAVE
	OFPBRCBadPort                 = 11 // OFPBRC_BAD_PORT
	OFPBRCBadPacket               = 12 // OFPBRC_BAD_PACKET
	OFPBRCMultipartBufferOverflow = 13 // OFPBRC_MULTIPART_BUFFER_OVERFLOW
	OFPBRCMultipartRequestTimeout = 14 // OFPBRC_MULTIPART_REQUEST_TIMEOUT
	OFPBRCMultipartReplyTimeout   = 15 // OFPBRC_MULTIPART_REPLY_TIMEOUT
	OFPBRCMultipartBadSched       = 16 // OFPBRC_MULTIPART_BAD_SCHED
	OFPBRCPipelineFieldsOnly      = 17 // OFPBRC_PIPELINE_FIELDS_ONLY
	OFPBRCUnknown                 = 18 // OFPBRC_UNKNOWN
)

type BadRequestCode uint16

func (self BadRequestCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_anchor
	BSNAnchorPacketStart    = 0 // OFP_BSN_ANCHOR_PACKET_START
	BSNAnchorL3HeaderStart  = 1 // OFP_BSN_ANCHOR_L3_HEADER_START
	BSNAnchorL4HeaderStart  = 2 // OFP_BSN_ANCHOR_L4_HEADER_START
	BSNAnchorL4PayloadStart = 3 // OFP_BSN_ANCHOR_L4_PAYLOAD_START
)

type BsnAnchor uint16

func (self BsnAnchor) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_auto_negotiation_type
	BSNAutoNegotiationDefault = 0 // OFP_BSN_AUTO_NEGOTIATION_DEFAULT
	BSNAutoNegotiationEnable  = 1 // OFP_BSN_AUTO_NEGOTIATION_ENABLE
	BSNAutoNegotiationDisable = 2 // OFP_BSN_AUTO_NEGOTIATION_DISABLE
)

type BsnAutoNegotiationType uint8

func (self BsnAutoNegotiationType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_bfd_endpoint
	BSNBfdUnused   = 0 // OFP_BSN_BFD_UNUSED
	BSNBfdMicro    = 1 // OFP_BSN_BFD_MICRO
	BSNBfd1Hop     = 2 // OFP_BSN_BFD_1_HOP
	BSNBfdMultiHop = 3 // OFP_BSN_BFD_MULTI_HOP
)

type BsnBfdEndpoint uint8

func (self BsnBfdEndpoint) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_bfd_endpoint_state
	BSNBfdEndpointStateAdmindown  = 0 // OFP_BSN_BFD_ENDPOINT_STATE_ADMINDOWN
	BSNBfdEndpointStateDown       = 1 // OFP_BSN_BFD_ENDPOINT_STATE_DOWN
	BSNBfdEndpointStateInit       = 2 // OFP_BSN_BFD_ENDPOINT_STATE_INIT
	BSNBfdEndpointStateUp         = 3 // OFP_BSN_BFD_ENDPOINT_STATE_UP
	BSNBfdEndpointSessionError    = 4 // OFP_BSN_BFD_ENDPOINT_SESSION_ERROR
	BSNBfdEndpointRemoteAdmindown = 5 // OFP_BSN_BFD_ENDPOINT_REMOTE_ADMINDOWN
	BSNBfdEndpointParamsChange    = 6 // OFP_BSN_BFD_ENDPOINT_PARAMS_CHANGE
)

type BsnBfdEndpointState uint8

func (self BsnBfdEndpointState) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_cml
	BSNCmlNone       = 0 // OFP_BSN_CML_NONE
	BSNCmlCpuDrop    = 1 // OFP_BSN_CML_CPU_DROP
	BSNCmlForward    = 2 // OFP_BSN_CML_FORWARD
	BSNCmlCpuForward = 3 // OFP_BSN_CML_CPU_FORWARD
)

type BsnCml uint16

func (self BsnCml) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_controller_connection_state
	BSNControllerConnectionStateDisconnected = 0 // OFP_BSN_CONTROLLER_CONNECTION_STATE_DISCONNECTED
	BSNControllerConnectionStateConnected    = 1 // OFP_BSN_CONTROLLER_CONNECTION_STATE_CONNECTED
)

type BsnControllerConnectionState uint8

func (self BsnControllerConnectionState) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_decap
	BSNDecapVxlan  = 0 // OFP_BSN_DECAP_VXLAN
	BSNDecapErspan = 1 // OFP_BSN_DECAP_ERSPAN
	BSNDecapL2GRE  = 2 // OFP_BSN_DECAP_L2_GRE
	BSNDecapNvgre  = 3 // OFP_BSN_DECAP_NVGRE
	BSNDecapCapwap = 4 // OFP_BSN_DECAP_CAPWAP
	BSNDecapL2Mpls = 5 // OFP_BSN_DECAP_L2_MPLS
	BSNDecapL3GRE  = 6 // OFP_BSN_DECAP_L3_GRE
	BSNDecapGtp    = 7 // OFP_BSN_DECAP_GTP
	BSNDecapL3Mpls = 8 // OFP_BSN_DECAP_L3_MPLS
)

type BsnDecap uint16

func (self BsnDecap) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_encap
	BSNEncapUnused  = 0 // OFP_BSN_ENCAP_UNUSED
	BSNEncapIpv4Udp = 1 // OFP_BSN_ENCAP_IPV4_UDP
	BSNEncapIpv6Udp = 2 // OFP_BSN_ENCAP_IPV6_UDP
)

type BsnEncap uint8

func (self BsnEncap) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_enhanced_hash_type
	BSNEnhancedHashL2        = 1  // OFP_BSN_ENHANCED_HASH_L2
	BSNEnhancedHashL3        = 2  // OFP_BSN_ENHANCED_HASH_L3
	BSNEnhancedHashL2Gre     = 4  // OFP_BSN_ENHANCED_HASH_L2GRE
	BSNEnhancedHashMpls      = 8  // OFP_BSN_ENHANCED_HASH_MPLS
	BSNEnhancedHashGtp       = 16 // OFP_BSN_ENHANCED_HASH_GTP
	BSNEnhancedHashSymmetric = 32 // OFP_BSN_ENHANCED_HASH_SYMMETRIC
)

type BsnEnhancedHashType uint64

func (self BsnEnhancedHashType) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNEnhancedHashL2 == BSNEnhancedHashL2 {
		flags = append(flags, "\"L2\": true")
	}
	if self&BSNEnhancedHashL3 == BSNEnhancedHashL3 {
		flags = append(flags, "\"L3\": true")
	}
	if self&BSNEnhancedHashL2Gre == BSNEnhancedHashL2Gre {
		flags = append(flags, "\"L2Gre\": true")
	}
	if self&BSNEnhancedHashMpls == BSNEnhancedHashMpls {
		flags = append(flags, "\"Mpls\": true")
	}
	if self&BSNEnhancedHashGtp == BSNEnhancedHashGtp {
		flags = append(flags, "\"Gtp\": true")
	}
	if self&BSNEnhancedHashSymmetric == BSNEnhancedHashSymmetric {
		flags = append(flags, "\"Symmetric\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_extended_capabilities
	BSNExtCapAn  = 1 // OFP_BSN_EXT_CAP_AN
	BSNExtCapFec = 2 // OFP_BSN_EXT_CAP_FEC
)

type BsnExtendedCapabilities uint64

func (self BsnExtendedCapabilities) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNExtCapAn == BSNExtCapAn {
		flags = append(flags, "\"An\": true")
	}
	if self&BSNExtCapFec == BSNExtCapFec {
		flags = append(flags, "\"Fec\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_fabric_port_role
	BSNFabricPortRolePartitionedSpine = 1 // OFP_BSN_FABRIC_PORT_ROLE_PARTITIONED_SPINE
)

type BsnFabricPortRole uint16

func (self BsnFabricPortRole) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_fec_config_state
	BSNFecConfigStateUnset    = 0 // OFP_BSN_FEC_CONFIG_STATE_UNSET
	BSNFecConfigStateEnabled  = 1 // OFP_BSN_FEC_CONFIG_STATE_ENABLED
	BSNFecConfigStateDisabled = 2 // OFP_BSN_FEC_CONFIG_STATE_DISABLED
)

type BsnFecConfigState uint32

func (self BsnFecConfigState) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_flow_classifier
	BSNFlowClassifierNone        = 0 // OFP_BSN_FLOW_CLASSIFIER_NONE
	BSNFlowClassifierL2Bc        = 1 // OFP_BSN_FLOW_CLASSIFIER_L2BC
	BSNFlowClassifierL2Uc        = 2 // OFP_BSN_FLOW_CLASSIFIER_L2UC
	BSNFlowClassifierL2Unknown   = 3 // OFP_BSN_FLOW_CLASSIFIER_L2UNKNOWN
	BSNFlowClassifierL2Mcknown   = 4 // OFP_BSN_FLOW_CLASSIFIER_L2MCKNOWN
	BSNFlowClassifierL2Mcunknown = 5 // OFP_BSN_FLOW_CLASSIFIER_L2MCUNKNOWN
	BSNFlowClassifierL3Mcunknown = 6 // OFP_BSN_FLOW_CLASSIFIER_L3MCUNKNOWN
	BSNFlowClassifierL3Mcknown   = 7 // OFP_BSN_FLOW_CLASSIFIER_L3MCKNOWN
	BSNFlowClassifierL3Ucknown   = 8 // OFP_BSN_FLOW_CLASSIFIER_L3UCKNOWN
	BSNFlowClassifierL3Ucunknown = 9 // OFP_BSN_FLOW_CLASSIFIER_L3UCUNKNOWN
)

type BsnFlowClassifier uint16

func (self BsnFlowClassifier) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_forward_error_correction_type
	BSNForwardErrorCorrectionDefault = 0 // OFP_BSN_FORWARD_ERROR_CORRECTION_DEFAULT
	BSNForwardErrorCorrectionEnable  = 1 // OFP_BSN_FORWARD_ERROR_CORRECTION_ENABLE
	BSNForwardErrorCorrectionDisable = 2 // OFP_BSN_FORWARD_ERROR_CORRECTION_DISABLE
)

type BsnForwardErrorCorrectionType uint8

func (self BsnForwardErrorCorrectionType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_hash_algorithm_type
	BSNHashAlgorithmCrc16Xor8  = 0 // OFP_BSN_HASH_ALGORITHM_CRC16XOR8
	BSNHashAlgorithmCrc16Xor4  = 1 // OFP_BSN_HASH_ALGORITHM_CRC16XOR4
	BSNHashAlgorithmCrc16Xor2  = 2 // OFP_BSN_HASH_ALGORITHM_CRC16XOR2
	BSNHashAlgorithmCrc16Xor1  = 3 // OFP_BSN_HASH_ALGORITHM_CRC16XOR1
	BSNHashAlgorithmCrc16      = 4 // OFP_BSN_HASH_ALGORITHM_CRC16
	BSNHashAlgorithmXor16      = 5 // OFP_BSN_HASH_ALGORITHM_XOR16
	BSNHashAlgorithmCrc16Ccitt = 6 // OFP_BSN_HASH_ALGORITHM_CRC16CCITT
	BSNHashAlgorithmCrc32Lo    = 7 // OFP_BSN_HASH_ALGORITHM_CRC32LO
	BSNHashAlgorithmCrc32Hi    = 8 // OFP_BSN_HASH_ALGORITHM_CRC32HI
)

type BsnHashAlgorithmType uint16

func (self BsnHashAlgorithmType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_hash_select_flags
	BSNHashSelectSrcIp = 1 // OFP_BSN_HASH_SELECT_SRC_IP
	BSNHashSelectDstIp = 2 // OFP_BSN_HASH_SELECT_DST_IP
)

type BsnHashSelectFlags uint32

func (self BsnHashSelectFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNHashSelectSrcIp == BSNHashSelectSrcIp {
		flags = append(flags, "\"SrcIp\": true")
	}
	if self&BSNHashSelectDstIp == BSNHashSelectDstIp {
		flags = append(flags, "\"DstIp\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_ip_tunnel_type
	BSNIpTunnelTypeNone = 0 // OFP_BSN_IP_TUNNEL_TYPE_NONE
	BSNIpTunnelTypePim  = 1 // OFP_BSN_IP_TUNNEL_TYPE_PIM
)

type BsnIpTunnelType uint16

func (self BsnIpTunnelType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_lacp_state
	BSNLacpStateActivity        = 1   // OFP_BSN_LACP_STATE_ACTIVITY
	BSNLacpStateTimeout         = 2   // OFP_BSN_LACP_STATE_TIMEOUT
	BSNLacpStateAggregation     = 4   // OFP_BSN_LACP_STATE_AGGREGATION
	BSNLacpStateSynchronization = 8   // OFP_BSN_LACP_STATE_SYNCHRONIZATION
	BSNLacpStateCollecting      = 16  // OFP_BSN_LACP_STATE_COLLECTING
	BSNLacpStateDistributing    = 32  // OFP_BSN_LACP_STATE_DISTRIBUTING
	BSNLacpStateDefaulted       = 64  // OFP_BSN_LACP_STATE_DEFAULTED
	BSNLacpStateExpired         = 128 // OFP_BSN_LACP_STATE_EXPIRED
)

type BsnLacpState uint8

func (self BsnLacpState) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNLacpStateActivity == BSNLacpStateActivity {
		flags = append(flags, "\"Activity\": true")
	}
	if self&BSNLacpStateTimeout == BSNLacpStateTimeout {
		flags = append(flags, "\"Timeout\": true")
	}
	if self&BSNLacpStateAggregation == BSNLacpStateAggregation {
		flags = append(flags, "\"Aggregation\": true")
	}
	if self&BSNLacpStateSynchronization == BSNLacpStateSynchronization {
		flags = append(flags, "\"Synchronization\": true")
	}
	if self&BSNLacpStateCollecting == BSNLacpStateCollecting {
		flags = append(flags, "\"Collecting\": true")
	}
	if self&BSNLacpStateDistributing == BSNLacpStateDistributing {
		flags = append(flags, "\"Distributing\": true")
	}
	if self&BSNLacpStateDefaulted == BSNLacpStateDefaulted {
		flags = append(flags, "\"Defaulted\": true")
	}
	if self&BSNLacpStateExpired == BSNLacpStateExpired {
		flags = append(flags, "\"Expired\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_lag_flag
	BSNLagFlagAutoRecovery = 1 // OFP_BSN_LAG_FLAG_AUTO_RECOVERY
)

type BsnLagFlag uint16

func (self BsnLagFlag) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNLagFlagAutoRecovery == BSNLagFlagAutoRecovery {
		flags = append(flags, "\"BSNLagFlagAutoRecovery\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_loglevel
	BSNLoglevelMsg     = 0 // OFP_BSN_LOGLEVEL_MSG
	BSNLoglevelError   = 1 // OFP_BSN_LOGLEVEL_ERROR
	BSNLoglevelWarn    = 2 // OFP_BSN_LOGLEVEL_WARN
	BSNLoglevelInfo    = 3 // OFP_BSN_LOGLEVEL_INFO
	BSNLoglevelVerbose = 4 // OFP_BSN_LOGLEVEL_VERBOSE
	BSNLoglevelTrace   = 5 // OFP_BSN_LOGLEVEL_TRACE
)

type BsnLoglevel uint8

func (self BsnLoglevel) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_loopback_mode
	BSNLoopbackModeNone      = 0 // OFP_BSN_LOOPBACK_MODE_NONE
	BSNLoopbackModeMAC       = 1 // OFP_BSN_LOOPBACK_MODE_MAC
	BSNLoopbackModePhy       = 2 // OFP_BSN_LOOPBACK_MODE_PHY
	BSNLoopbackModePhyRemote = 3 // OFP_BSN_LOOPBACK_MODE_PHY_REMOTE
)

type BsnLoopbackMode uint8

func (self BsnLoopbackMode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_lua_upload_flags
	BSNLuaUploadMore  = 1 // OFP_BSN_LUA_UPLOAD_MORE
	BSNLuaUploadForce = 2 // OFP_BSN_LUA_UPLOAD_FORCE
)

type BsnLuaUploadFlags uint16

func (self BsnLuaUploadFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNLuaUploadMore == BSNLuaUploadMore {
		flags = append(flags, "\"More\": true")
	}
	if self&BSNLuaUploadForce == BSNLuaUploadForce {
		flags = append(flags, "\"Force\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_misc_capabilities
	BSNMiscCapFec = 1 // OFP_BSN_MISC_CAP_FEC
)

type BsnMiscCapabilities uint64

func (self BsnMiscCapabilities) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNMiscCapFec == BSNMiscCapFec {
		flags = append(flags, "\"BSNMiscCapFec\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_multicast_packet
	BSNMulticastPacketNone         = 0 // OFP_BSN_MULTICAST_PACKET_NONE
	BSNMulticastPacketPimHello     = 1 // OFP_BSN_MULTICAST_PACKET_PIM_HELLO
	BSNMulticastPacketPimJoinPrune = 2 // OFP_BSN_MULTICAST_PACKET_PIM_JOIN_PRUNE
	BSNMulticastPacketPimAssert    = 3 // OFP_BSN_MULTICAST_PACKET_PIM_ASSERT
)

type BsnMulticastPacket uint16

func (self BsnMulticastPacket) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_pktin_flag
	BSNPktinFlagPdu             = 1        // OFP_BSN_PKTIN_FLAG_PDU
	BSNPktinFlagNewHost         = 2        // OFP_BSN_PKTIN_FLAG_NEW_HOST
	BSNPktinFlagStationMove     = 4        // OFP_BSN_PKTIN_FLAG_STATION_MOVE
	BSNPktinFlagARP             = 8        // OFP_BSN_PKTIN_FLAG_ARP
	BSNPktinFlagDhcp            = 16       // OFP_BSN_PKTIN_FLAG_DHCP
	BSNPktinFlagL2Cpu           = 32       // OFP_BSN_PKTIN_FLAG_L2_CPU
	BSNPktinFlagDebug           = 64       // OFP_BSN_PKTIN_FLAG_DEBUG
	BSNPktinFlagTtlExpired      = 128      // OFP_BSN_PKTIN_FLAG_TTL_EXPIRED
	BSNPktinFlagL3Miss          = 256      // OFP_BSN_PKTIN_FLAG_L3_MISS
	BSNPktinFlagL3Cpu           = 512      // OFP_BSN_PKTIN_FLAG_L3_CPU
	BSNPktinFlagIngressAcl      = 1024     // OFP_BSN_PKTIN_FLAG_INGRESS_ACL
	BSNPktinFlagSflow           = 2048     // OFP_BSN_PKTIN_FLAG_SFLOW
	BSNPktinFlagARPCache        = 4096     // OFP_BSN_PKTIN_FLAG_ARP_CACHE
	BSNPktinFlagARPTarget       = 8192     // OFP_BSN_PKTIN_FLAG_ARP_TARGET
	BSNPktinFlagIgmp            = 16384    // OFP_BSN_PKTIN_FLAG_IGMP
	BSNPktinFlagPim             = 32768    // OFP_BSN_PKTIN_FLAG_PIM
	BSNPktinFlagVxlanSipMiss    = 65536    // OFP_BSN_PKTIN_FLAG_VXLAN_SIP_MISS
	BSNPktinFlagMcReserved      = 131072   // OFP_BSN_PKTIN_FLAG_MC_RESERVED
	BSNPktinFlagAnalytics       = 262144   // OFP_BSN_PKTIN_FLAG_ANALYTICS
	BSNPktinFlagIcmpv6          = 524288   // OFP_BSN_PKTIN_FLAG_ICMPV6
	BSNPktinFlagIngressAclLocal = 1048576  // OFP_BSN_PKTIN_FLAG_INGRESS_ACL_LOCAL
	BSNPktinFlagIpmcMiss        = 2097152  // OFP_BSN_PKTIN_FLAG_IPMC_MISS
	BSNPktinFlagIpmcRpfFailed   = 4194304  // OFP_BSN_PKTIN_FLAG_IPMC_RPF_FAILED
	BSNPktinFlagBfdSlowpath     = 8388608  // OFP_BSN_PKTIN_FLAG_BFD_SLOWPATH
	BSNPktinFlagSflowEgress     = 16777216 // OFP_BSN_PKTIN_FLAG_SFLOW_EGRESS
)

type BsnPktinFlag uint64

func (self BsnPktinFlag) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNPktinFlagPdu == BSNPktinFlagPdu {
		flags = append(flags, "\"Pdu\": true")
	}
	if self&BSNPktinFlagNewHost == BSNPktinFlagNewHost {
		flags = append(flags, "\"NewHost\": true")
	}
	if self&BSNPktinFlagStationMove == BSNPktinFlagStationMove {
		flags = append(flags, "\"StationMove\": true")
	}
	if self&BSNPktinFlagARP == BSNPktinFlagARP {
		flags = append(flags, "\"Arp\": true")
	}
	if self&BSNPktinFlagDhcp == BSNPktinFlagDhcp {
		flags = append(flags, "\"Dhcp\": true")
	}
	if self&BSNPktinFlagL2Cpu == BSNPktinFlagL2Cpu {
		flags = append(flags, "\"L2Cpu\": true")
	}
	if self&BSNPktinFlagDebug == BSNPktinFlagDebug {
		flags = append(flags, "\"Debug\": true")
	}
	if self&BSNPktinFlagTtlExpired == BSNPktinFlagTtlExpired {
		flags = append(flags, "\"TtlExpired\": true")
	}
	if self&BSNPktinFlagL3Miss == BSNPktinFlagL3Miss {
		flags = append(flags, "\"L3Miss\": true")
	}
	if self&BSNPktinFlagL3Cpu == BSNPktinFlagL3Cpu {
		flags = append(flags, "\"L3Cpu\": true")
	}
	if self&BSNPktinFlagIngressAcl == BSNPktinFlagIngressAcl {
		flags = append(flags, "\"IngressAcl\": true")
	}
	if self&BSNPktinFlagSflow == BSNPktinFlagSflow {
		flags = append(flags, "\"Sflow\": true")
	}
	if self&BSNPktinFlagARPCache == BSNPktinFlagARPCache {
		flags = append(flags, "\"ArpCache\": true")
	}
	if self&BSNPktinFlagARPTarget == BSNPktinFlagARPTarget {
		flags = append(flags, "\"ArpTarget\": true")
	}
	if self&BSNPktinFlagIgmp == BSNPktinFlagIgmp {
		flags = append(flags, "\"Igmp\": true")
	}
	if self&BSNPktinFlagPim == BSNPktinFlagPim {
		flags = append(flags, "\"Pim\": true")
	}
	if self&BSNPktinFlagVxlanSipMiss == BSNPktinFlagVxlanSipMiss {
		flags = append(flags, "\"VxlanSipMiss\": true")
	}
	if self&BSNPktinFlagMcReserved == BSNPktinFlagMcReserved {
		flags = append(flags, "\"McReserved\": true")
	}
	if self&BSNPktinFlagAnalytics == BSNPktinFlagAnalytics {
		flags = append(flags, "\"Analytics\": true")
	}
	if self&BSNPktinFlagIcmpv6 == BSNPktinFlagIcmpv6 {
		flags = append(flags, "\"Icmpv6\": true")
	}
	if self&BSNPktinFlagIngressAclLocal == BSNPktinFlagIngressAclLocal {
		flags = append(flags, "\"IngressAclLocal\": true")
	}
	if self&BSNPktinFlagIpmcMiss == BSNPktinFlagIpmcMiss {
		flags = append(flags, "\"IpmcMiss\": true")
	}
	if self&BSNPktinFlagIpmcRpfFailed == BSNPktinFlagIpmcRpfFailed {
		flags = append(flags, "\"IpmcRpfFailed\": true")
	}
	if self&BSNPktinFlagBfdSlowpath == BSNPktinFlagBfdSlowpath {
		flags = append(flags, "\"BfdSlowpath\": true")
	}
	if self&BSNPktinFlagSflowEgress == BSNPktinFlagSflowEgress {
		flags = append(flags, "\"SflowEgress\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_port_counter
	BSNPortCounterRxBytes                = 0  // OFP_BSN_PORT_COUNTER_RX_BYTES
	BSNPortCounterRxPacketsUnicast       = 1  // OFP_BSN_PORT_COUNTER_RX_PACKETS_UNICAST
	BSNPortCounterRxPacketsBroadcast     = 2  // OFP_BSN_PORT_COUNTER_RX_PACKETS_BROADCAST
	BSNPortCounterRxPacketsMulticast     = 3  // OFP_BSN_PORT_COUNTER_RX_PACKETS_MULTICAST
	BSNPortCounterRxDropped              = 4  // OFP_BSN_PORT_COUNTER_RX_DROPPED
	BSNPortCounterRxErrors               = 5  // OFP_BSN_PORT_COUNTER_RX_ERRORS
	BSNPortCounterTxBytes                = 6  // OFP_BSN_PORT_COUNTER_TX_BYTES
	BSNPortCounterTxPacketsUnicast       = 7  // OFP_BSN_PORT_COUNTER_TX_PACKETS_UNICAST
	BSNPortCounterTxPacketsBroadcast     = 8  // OFP_BSN_PORT_COUNTER_TX_PACKETS_BROADCAST
	BSNPortCounterTxPacketsMulticast     = 9  // OFP_BSN_PORT_COUNTER_TX_PACKETS_MULTICAST
	BSNPortCounterTxDropped              = 10 // OFP_BSN_PORT_COUNTER_TX_DROPPED
	BSNPortCounterTxErrors               = 11 // OFP_BSN_PORT_COUNTER_TX_ERRORS
	BSNPortCounterRxRunts                = 12 // OFP_BSN_PORT_COUNTER_RX_RUNTS
	BSNPortCounterRxGiants               = 13 // OFP_BSN_PORT_COUNTER_RX_GIANTS
	BSNPortCounterRxCrcErrors            = 14 // OFP_BSN_PORT_COUNTER_RX_CRC_ERRORS
	BSNPortCounterRxAlignmentErrors      = 15 // OFP_BSN_PORT_COUNTER_RX_ALIGNMENT_ERRORS
	BSNPortCounterRxSymbolErrors         = 16 // OFP_BSN_PORT_COUNTER_RX_SYMBOL_ERRORS
	BSNPortCounterRxPauseInput           = 17 // OFP_BSN_PORT_COUNTER_RX_PAUSE_INPUT
	BSNPortCounterTxCollisions           = 18 // OFP_BSN_PORT_COUNTER_TX_COLLISIONS
	BSNPortCounterTxLateCollisions       = 19 // OFP_BSN_PORT_COUNTER_TX_LATE_COLLISIONS
	BSNPortCounterTxDeferred             = 20 // OFP_BSN_PORT_COUNTER_TX_DEFERRED
	BSNPortCounterTxPauseOutput          = 21 // OFP_BSN_PORT_COUNTER_TX_PAUSE_OUTPUT
	BSNPortCounterRxPackets              = 22 // OFP_BSN_PORT_COUNTER_RX_PACKETS
	BSNPortCounterTxPackets              = 23 // OFP_BSN_PORT_COUNTER_TX_PACKETS
	BSNPortCounterRxLengthErrors         = 24 // OFP_BSN_PORT_COUNTER_RX_LENGTH_ERRORS
	BSNPortCounterRxOverflowErrors       = 25 // OFP_BSN_PORT_COUNTER_RX_OVERFLOW_ERRORS
	BSNPortCounterTxCarrierErrors        = 26 // OFP_BSN_PORT_COUNTER_TX_CARRIER_ERRORS
	BSNPortCounterRxPacketsBadVLAN       = 27 // OFP_BSN_PORT_COUNTER_RX_PACKETS_BAD_VLAN
	BSNPortCounterLinkUp                 = 28 // OFP_BSN_PORT_COUNTER_LINK_UP
	BSNPortCounterLinkDown               = 29 // OFP_BSN_PORT_COUNTER_LINK_DOWN
	BSNPortCounterRxPfcControlFrame      = 30 // OFP_BSN_PORT_COUNTER_RX_PFC_CONTROL_FRAME
	BSNPortCounterTxPfcControlFrame      = 31 // OFP_BSN_PORT_COUNTER_TX_PFC_CONTROL_FRAME
	BSNPortCounterRxPfcFrameXonPriority0 = 32 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_0
	BSNPortCounterRxPfcFrameXonPriority1 = 33 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_1
	BSNPortCounterRxPfcFrameXonPriority2 = 34 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_2
	BSNPortCounterRxPfcFrameXonPriority3 = 35 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_3
	BSNPortCounterRxPfcFrameXonPriority4 = 36 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_4
	BSNPortCounterRxPfcFrameXonPriority5 = 37 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_5
	BSNPortCounterRxPfcFrameXonPriority6 = 38 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_6
	BSNPortCounterRxPfcFrameXonPriority7 = 39 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_XON_PRIORITY_7
	BSNPortCounterRxPfcFramePriority0    = 40 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_0
	BSNPortCounterRxPfcFramePriority1    = 41 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_1
	BSNPortCounterRxPfcFramePriority2    = 42 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_2
	BSNPortCounterRxPfcFramePriority3    = 43 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_3
	BSNPortCounterRxPfcFramePriority4    = 44 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_4
	BSNPortCounterRxPfcFramePriority5    = 45 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_5
	BSNPortCounterRxPfcFramePriority6    = 46 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_6
	BSNPortCounterRxPfcFramePriority7    = 47 // OFP_BSN_PORT_COUNTER_RX_PFC_FRAME_PRIORITY_7
	BSNPortCounterTxPfcFramePriority0    = 48 // OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_0
	BSNPortCounterTxPfcFramePriority1    = 49 // OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_1
	BSNPortCounterTxPfcFramePriority2    = 50 // OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_2
	BSNPortCounterTxPfcFramePriority3    = 51 // OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_3
	BSNPortCounterTxPfcFramePriority4    = 52 // OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_4
	BSNPortCounterTxPfcFramePriority5    = 53 // OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_5
	BSNPortCounterTxPfcFramePriority6    = 54 // OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_6
	BSNPortCounterTxPfcFramePriority7    = 55 // OFP_BSN_PORT_COUNTER_TX_PFC_FRAME_PRIORITY_7
)

type BsnPortCounter uint8

func (self BsnPortCounter) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_port_mode
	BSNPortModeNone  = 0  // OFP_BSN_PORT_MODE_NONE
	BSNPortMode4Xx   = 1  // OFP_BSN_PORT_MODE_4XX
	BSNPortMode4X1   = 2  // OFP_BSN_PORT_MODE_4X1
	BSNPortMode4X10  = 3  // OFP_BSN_PORT_MODE_4X10
	BSNPortMode4X25  = 4  // OFP_BSN_PORT_MODE_4X25
	BSNPortMode2X50  = 5  // OFP_BSN_PORT_MODE_2X50
	BSNPortMode1X1   = 6  // OFP_BSN_PORT_MODE_1X1
	BSNPortMode1X10  = 7  // OFP_BSN_PORT_MODE_1X10
	BSNPortMode1X25  = 8  // OFP_BSN_PORT_MODE_1X25
	BSNPortMode1X40  = 9  // OFP_BSN_PORT_MODE_1X40
	BSNPortMode1X100 = 10 // OFP_BSN_PORT_MODE_1X100
)

type BsnPortMode uint16

func (self BsnPortMode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_port_speed_gbps_type
	BSNPortSpeedGbps1   = 1   // OFP_BSN_PORT_SPEED_GBPS_1
	BSNPortSpeedGbps10  = 10  // OFP_BSN_PORT_SPEED_GBPS_10
	BSNPortSpeedGbps25  = 25  // OFP_BSN_PORT_SPEED_GBPS_25
	BSNPortSpeedGbps40  = 40  // OFP_BSN_PORT_SPEED_GBPS_40
	BSNPortSpeedGbps50  = 50  // OFP_BSN_PORT_SPEED_GBPS_50
	BSNPortSpeedGbps100 = 100 // OFP_BSN_PORT_SPEED_GBPS_100
)

type BsnPortSpeedGbpsType uint32

func (self BsnPortSpeedGbpsType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_port_usage
	BSNPortUnused       = 0 // OFP_BSN_PORT_UNUSED
	BSNPortTransmitOnly = 1 // OFP_BSN_PORT_TRANSMIT_ONLY
	BSNPortReceiveOnly  = 2 // OFP_BSN_PORT_RECEIVE_ONLY
	BSNPortBidirection  = 3 // OFP_BSN_PORT_BIDIRECTION
)

type BsnPortUsage uint16

func (self BsnPortUsage) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_port_vxlan_mode
	BSNPortVxlanRecirculationEnable = 0 // OFP_BSN_PORT_VXLAN_RECIRCULATION_ENABLE
	BSNPortVxlanTerminationEnable   = 1 // OFP_BSN_PORT_VXLAN_TERMINATION_ENABLE
)

type BsnPortVxlanMode uint8

func (self BsnPortVxlanMode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_push_vlan
	BSNPushVLANUntagged     = 1 // OFP_BSN_PUSH_VLAN_UNTAGGED
	BSNPushVLANSingleTagged = 2 // OFP_BSN_PUSH_VLAN_SINGLE_TAGGED
	BSNPushVLANDoubleTagged = 4 // OFP_BSN_PUSH_VLAN_DOUBLE_TAGGED
)

type BsnPushVlan uint8

func (self BsnPushVlan) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNPushVLANUntagged == BSNPushVLANUntagged {
		flags = append(flags, "\"Untagged\": true")
	}
	if self&BSNPushVLANSingleTagged == BSNPushVLANSingleTagged {
		flags = append(flags, "\"SingleTagged\": true")
	}
	if self&BSNPushVLANDoubleTagged == BSNPushVLANDoubleTagged {
		flags = append(flags, "\"DoubleTagged\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_rate_unit
	BSNRateUnitPps    = 0 // OFP_BSN_RATE_UNIT_PPS
	BSNRateUnitKbitps = 1 // OFP_BSN_RATE_UNIT_KBITPS
)

type BsnRateUnit uint8

func (self BsnRateUnit) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_routing_param
	BSNRoutingParamOspfUcast     = 1 // OFP_BSN_ROUTING_PARAM_OSPF_UCAST
	BSNRoutingParamOspfMcast     = 2 // OFP_BSN_ROUTING_PARAM_OSPF_MCAST
	BSNRoutingParamARPFrr        = 3 // OFP_BSN_ROUTING_PARAM_ARP_FRR
	BSNRoutingParamIpv6OspfUcast = 4 // OFP_BSN_ROUTING_PARAM_IPV6_OSPF_UCAST
	BSNRoutingParamIpv6OspfMcast = 5 // OFP_BSN_ROUTING_PARAM_IPV6_OSPF_MCAST
	BSNRoutingParamIpv6NdpFrr    = 6 // OFP_BSN_ROUTING_PARAM_IPV6_NDP_FRR
)

type BsnRoutingParam uint16

func (self BsnRoutingParam) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_speed_capabilities
	BSNSpeedCap10M   = 1   // OFP_BSN_SPEED_CAP_10M
	BSNSpeedCap100M  = 2   // OFP_BSN_SPEED_CAP_100M
	BSNSpeedCap1Gb   = 4   // OFP_BSN_SPEED_CAP_1GB
	BSNSpeedCap10Gb  = 8   // OFP_BSN_SPEED_CAP_10GB
	BSNSpeedCap25Gb  = 16  // OFP_BSN_SPEED_CAP_25GB
	BSNSpeedCap40Gb  = 32  // OFP_BSN_SPEED_CAP_40GB
	BSNSpeedCap50Gb  = 64  // OFP_BSN_SPEED_CAP_50GB
	BSNSpeedCap100Gb = 128 // OFP_BSN_SPEED_CAP_100GB
)

type BsnSpeedCapabilities uint64

func (self BsnSpeedCapabilities) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNSpeedCap10M == BSNSpeedCap10M {
		flags = append(flags, "\"10M\": true")
	}
	if self&BSNSpeedCap100M == BSNSpeedCap100M {
		flags = append(flags, "\"100M\": true")
	}
	if self&BSNSpeedCap1Gb == BSNSpeedCap1Gb {
		flags = append(flags, "\"1Gb\": true")
	}
	if self&BSNSpeedCap10Gb == BSNSpeedCap10Gb {
		flags = append(flags, "\"10Gb\": true")
	}
	if self&BSNSpeedCap25Gb == BSNSpeedCap25Gb {
		flags = append(flags, "\"25Gb\": true")
	}
	if self&BSNSpeedCap40Gb == BSNSpeedCap40Gb {
		flags = append(flags, "\"40Gb\": true")
	}
	if self&BSNSpeedCap50Gb == BSNSpeedCap50Gb {
		flags = append(flags, "\"50Gb\": true")
	}
	if self&BSNSpeedCap100Gb == BSNSpeedCap100Gb {
		flags = append(flags, "\"100Gb\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_status
	BSNStatusDisable = 0 // OFP_BSN_STATUS_DISABLE
	BSNStatusEnable  = 1 // OFP_BSN_STATUS_ENABLE
)

type BsnStatus uint8

func (self BsnStatus) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_strip_vlan
	BSNStripVLANFirst  = 1 // OFP_BSN_STRIP_VLAN_FIRST
	BSNStripVLANSecond = 2 // OFP_BSN_STRIP_VLAN_SECOND
	BSNStripVLANThird  = 4 // OFP_BSN_STRIP_VLAN_THIRD
)

type BsnStripVlan uint8

func (self BsnStripVlan) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNStripVLANFirst == BSNStripVLANFirst {
		flags = append(flags, "\"First\": true")
	}
	if self&BSNStripVLANSecond == BSNStripVLANSecond {
		flags = append(flags, "\"Second\": true")
	}
	if self&BSNStripVLANThird == BSNStripVLANThird {
		flags = append(flags, "\"Third\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_tcp_flag
	BSNTCPFlagFin = 1   // OFP_BSN_TCP_FLAG_FIN
	BSNTCPFlagSyn = 2   // OFP_BSN_TCP_FLAG_SYN
	BSNTCPFlagRst = 4   // OFP_BSN_TCP_FLAG_RST
	BSNTCPFlagPsh = 8   // OFP_BSN_TCP_FLAG_PSH
	BSNTCPFlagAck = 16  // OFP_BSN_TCP_FLAG_ACK
	BSNTCPFlagUrg = 32  // OFP_BSN_TCP_FLAG_URG
	BSNTCPFlagEce = 64  // OFP_BSN_TCP_FLAG_ECE
	BSNTCPFlagCwr = 128 // OFP_BSN_TCP_FLAG_CWR
	BSNTCPFlagNs  = 256 // OFP_BSN_TCP_FLAG_NS
)

type BsnTcpFlag uint16

func (self BsnTcpFlag) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNTCPFlagFin == BSNTCPFlagFin {
		flags = append(flags, "\"Fin\": true")
	}
	if self&BSNTCPFlagSyn == BSNTCPFlagSyn {
		flags = append(flags, "\"Syn\": true")
	}
	if self&BSNTCPFlagRst == BSNTCPFlagRst {
		flags = append(flags, "\"Rst\": true")
	}
	if self&BSNTCPFlagPsh == BSNTCPFlagPsh {
		flags = append(flags, "\"Psh\": true")
	}
	if self&BSNTCPFlagAck == BSNTCPFlagAck {
		flags = append(flags, "\"Ack\": true")
	}
	if self&BSNTCPFlagUrg == BSNTCPFlagUrg {
		flags = append(flags, "\"Urg\": true")
	}
	if self&BSNTCPFlagEce == BSNTCPFlagEce {
		flags = append(flags, "\"Ece\": true")
	}
	if self&BSNTCPFlagCwr == BSNTCPFlagCwr {
		flags = append(flags, "\"Cwr\": true")
	}
	if self&BSNTCPFlagNs == BSNTCPFlagNs {
		flags = append(flags, "\"Ns\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_tunnel_type
	BSNTunnelL2Gre = 1 // OFP_BSN_TUNNEL_L2GRE
	BSNTunnelVxlan = 2 // OFP_BSN_TUNNEL_VXLAN
)

type BsnTunnelType uint64

func (self BsnTunnelType) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNTunnelL2Gre == BSNTunnelL2Gre {
		flags = append(flags, "\"L2Gre\": true")
	}
	if self&BSNTunnelVxlan == BSNTunnelVxlan {
		flags = append(flags, "\"Vxlan\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_udf_anchor
	BSNUdfAnchorPacketStart   = 0 // OFP_BSN_UDF_ANCHOR_PACKET_START
	BSNUdfAnchorL3HeaderStart = 1 // OFP_BSN_UDF_ANCHOR_L3_HEADER_START
	BSNUdfAnchorL4HeaderStart = 2 // OFP_BSN_UDF_ANCHOR_L4_HEADER_START
)

type BsnUdfAnchor uint16

func (self BsnUdfAnchor) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_udf_mode
	BSNUdf8X2Bytes = 1 // OFP_BSN_UDF_8X2_BYTES
)

type BsnUdfMode uint8

func (self BsnUdfMode) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&BSNUdf8X2Bytes == BSNUdf8X2Bytes {
		flags = append(flags, "\"BSNUdf8X2Bytes\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_upgrade
	BSNUpgradeInvalid    = 0 // OFP_BSN_UPGRADE_INVALID
	BSNUpgradeInProgress = 1 // OFP_BSN_UPGRADE_IN_PROGRESS
)

type BsnUpgrade uint16

func (self BsnUpgrade) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_vlan_counter_constants
	BSNVLANAll = 65535 // OFP_BSN_VLAN_ALL
)

const (
	// Identifiers from group ofp_bsn_vport_l2gre_flags
	OFBSNVportL2GreLocalMACIsValid  = 1  // OF_BSN_VPORT_L2GRE_LOCAL_MAC_IS_VALID
	OFBSNVportL2GreDSCPAssign       = 2  // OF_BSN_VPORT_L2GRE_DSCP_ASSIGN
	OFBSNVportL2GreDSCPCopy         = 4  // OF_BSN_VPORT_L2GRE_DSCP_COPY
	OFBSNVportL2GreLoopbackIsValid  = 8  // OF_BSN_VPORT_L2GRE_LOOPBACK_IS_VALID
	OFBSNVportL2GreRateLimitIsValid = 16 // OF_BSN_VPORT_L2GRE_RATE_LIMIT_IS_VALID
)

type BsnVportL2GreFlags uint32

func (self BsnVportL2GreFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFBSNVportL2GreLocalMACIsValid == OFBSNVportL2GreLocalMACIsValid {
		flags = append(flags, "\"LocalMACIsValid\": true")
	}
	if self&OFBSNVportL2GreDSCPAssign == OFBSNVportL2GreDSCPAssign {
		flags = append(flags, "\"DscpAssign\": true")
	}
	if self&OFBSNVportL2GreDSCPCopy == OFBSNVportL2GreDSCPCopy {
		flags = append(flags, "\"DscpCopy\": true")
	}
	if self&OFBSNVportL2GreLoopbackIsValid == OFBSNVportL2GreLoopbackIsValid {
		flags = append(flags, "\"LoopbackIsValid\": true")
	}
	if self&OFBSNVportL2GreRateLimitIsValid == OFBSNVportL2GreRateLimitIsValid {
		flags = append(flags, "\"RateLimitIsValid\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bsn_vport_q_in_q_untagged
	OFBSNVportQInQUntagged = 65535 // OF_BSN_VPORT_Q_IN_Q_UNTAGGED
)

type BsnVportQInQUntagged uint16

func (self BsnVportQInQUntagged) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bsn_vport_status
	OFBSNVportStatusOk     = 0 // OF_BSN_VPORT_STATUS_OK
	OFBSNVportStatusFailed = 1 // OF_BSN_VPORT_STATUS_FAILED
)

const (
	// Identifiers from group ofp_bsn_vrf_counter_constants
	BSNVrfAll = 4294967295 // OFP_BSN_VRF_ALL
)

type BsnVrfCounterConstants uint32

func (self BsnVrfCounterConstants) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bundle_ctrl_type
	OFPBCTOpenRequest    = 0 // OFPBCT_OPEN_REQUEST
	OFPBCTOpenReply      = 1 // OFPBCT_OPEN_REPLY
	OFPBCTCloseRequest   = 2 // OFPBCT_CLOSE_REQUEST
	OFPBCTCloseReply     = 3 // OFPBCT_CLOSE_REPLY
	OFPBCTCommitRequest  = 4 // OFPBCT_COMMIT_REQUEST
	OFPBCTCommitReply    = 5 // OFPBCT_COMMIT_REPLY
	OFPBCTDiscardRequest = 6 // OFPBCT_DISCARD_REQUEST
	OFPBCTDiscardReply   = 7 // OFPBCT_DISCARD_REPLY
)

type BundleCtrlType uint16

func (self BundleCtrlType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bundle_failed_code
	OFPBFCUnknown           = 0  // OFPBFC_UNKNOWN
	OFPBFCEperm             = 1  // OFPBFC_EPERM
	OFPBFCBadID             = 2  // OFPBFC_BAD_ID
	OFPBFCBundleExist       = 3  // OFPBFC_BUNDLE_EXIST
	OFPBFCBundleClosed      = 4  // OFPBFC_BUNDLE_CLOSED
	OFPBFCOutOfBundles      = 5  // OFPBFC_OUT_OF_BUNDLES
	OFPBFCBadType           = 6  // OFPBFC_BAD_TYPE
	OFPBFCBadFlags          = 7  // OFPBFC_BAD_FLAGS
	OFPBFCMsgBadLen         = 8  // OFPBFC_MSG_BAD_LEN
	OFPBFCMsgBadXid         = 9  // OFPBFC_MSG_BAD_XID
	OFPBFCMsgUnsup          = 10 // OFPBFC_MSG_UNSUP
	OFPBFCMsgConflict       = 11 // OFPBFC_MSG_CONFLICT
	OFPBFCMsgTooMany        = 12 // OFPBFC_MSG_TOO_MANY
	OFPBFCMsgFailed         = 13 // OFPBFC_MSG_FAILED
	OFPBFCTimeout           = 14 // OFPBFC_TIMEOUT
	OFPBFCBundleInProgress  = 15 // OFPBFC_BUNDLE_IN_PROGRESS
	OFPBFCSchedNotSupported = 16 // OFPBFC_SCHED_NOT_SUPPORTED
	OFPBFCSchedFuture       = 17 // OFPBFC_SCHED_FUTURE
	OFPBFCSchedPast         = 18 // OFPBFC_SCHED_PAST
)

type BundleFailedCode uint16

func (self BundleFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_bundle_feature_flags
	OFPBFTimestamp    = 1 // OFPBF_TIMESTAMP
	OFPBFTimeSetSched = 2 // OFPBF_TIME_SET_SCHED
)

type BundleFeatureFlags uint32

func (self BundleFeatureFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPBFTimestamp == OFPBFTimestamp {
		flags = append(flags, "\"Stamp\": true")
	}
	if self&OFPBFTimeSetSched == OFPBFTimeSetSched {
		flags = append(flags, "\"SetSched\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bundle_features_prop_type
	OFPTMPBFTimeCapability = 1     // OFPTMPBF_TIME_CAPABILITY
	OFPTMPBFExperimenter   = 65535 // OFPTMPBF_EXPERIMENTER
)

const (
	// Identifiers from group ofp_bundle_flags
	OFPBFAtomic  = 1 // OFPBF_ATOMIC
	OFPBFOrdered = 2 // OFPBF_ORDERED
	OFPBFTime    = 4 // OFPBF_TIME
)

type BundleFlags uint16

func (self BundleFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPBFAtomic == OFPBFAtomic {
		flags = append(flags, "\"Atomic\": true")
	}
	if self&OFPBFOrdered == OFPBFOrdered {
		flags = append(flags, "\"Ordered\": true")
	}
	if self&OFPBFTime == OFPBFTime {
		flags = append(flags, "\"Time\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_bundle_prop_type
	OFPBPTTime         = 1     // OFPBPT_TIME
	OFPBPTExperimenter = 65535 // OFPBPT_EXPERIMENTER
)

const (
	// Identifiers from group ofp_capabilities
	OFPCFlowStats      = 1    // OFPC_FLOW_STATS
	OFPCTableStats     = 2    // OFPC_TABLE_STATS
	OFPCPortStats      = 4    // OFPC_PORT_STATS
	OFPCGroupStats     = 8    // OFPC_GROUP_STATS
	OFPCIpReasm        = 32   // OFPC_IP_REASM
	OFPCQueueStats     = 64   // OFPC_QUEUE_STATS
	OFPCPortBlocked    = 256  // OFPC_PORT_BLOCKED
	OFPCBundles        = 512  // OFPC_BUNDLES
	OFPCFlowMonitoring = 1024 // OFPC_FLOW_MONITORING
)

type Capabilities uint32

func (self Capabilities) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPCFlowStats == OFPCFlowStats {
		flags = append(flags, "\"FlowStats\": true")
	}
	if self&OFPCTableStats == OFPCTableStats {
		flags = append(flags, "\"TableStats\": true")
	}
	if self&OFPCPortStats == OFPCPortStats {
		flags = append(flags, "\"PortStats\": true")
	}
	if self&OFPCGroupStats == OFPCGroupStats {
		flags = append(flags, "\"GroupStats\": true")
	}
	if self&OFPCIpReasm == OFPCIpReasm {
		flags = append(flags, "\"IpReasm\": true")
	}
	if self&OFPCQueueStats == OFPCQueueStats {
		flags = append(flags, "\"QueueStats\": true")
	}
	if self&OFPCPortBlocked == OFPCPortBlocked {
		flags = append(flags, "\"PortBlocked\": true")
	}
	if self&OFPCBundles == OFPCBundles {
		flags = append(flags, "\"Bundles\": true")
	}
	if self&OFPCFlowMonitoring == OFPCFlowMonitoring {
		flags = append(flags, "\"FlowMonitoring\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_config_flags
	OFPCFragNormal = 0 // OFPC_FRAG_NORMAL
	OFPCFragDrop   = 1 // OFPC_FRAG_DROP
	OFPCFragReasm  = 2 // OFPC_FRAG_REASM
	OFPCFragMask   = 3 // OFPC_FRAG_MASK
)

type ConfigFlags uint16

func (self ConfigFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPCFragNormal == OFPCFragNormal {
		flags = append(flags, "\"Normal\": true")
	}
	if self&OFPCFragDrop == OFPCFragDrop {
		flags = append(flags, "\"Drop\": true")
	}
	if self&OFPCFragReasm == OFPCFragReasm {
		flags = append(flags, "\"Reasm\": true")
	}
	if self&OFPCFragMask == OFPCFragMask {
		flags = append(flags, "\"Mask\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_control_channel_status
	OFPCTStatusUp   = 0 // OFPCT_STATUS_UP
	OFPCTStatusDown = 1 // OFPCT_STATUS_DOWN
)

type ControlChannelStatus uint8

func (self ControlChannelStatus) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_controller_max_len
	OFPCMLMax      = 65509 // OFPCML_MAX
	OFPCMLNoBuffer = 65535 // OFPCML_NO_BUFFER
)

type ControllerMaxLen uint16

func (self ControllerMaxLen) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_controller_role
	OFPCRRoleNochange = 0 // OFPCR_ROLE_NOCHANGE
	OFPCRRoleEqual    = 1 // OFPCR_ROLE_EQUAL
	OFPCRRoleMaster   = 2 // OFPCR_ROLE_MASTER
	OFPCRRoleSlave    = 3 // OFPCR_ROLE_SLAVE
)

type ControllerRole uint32

func (self ControllerRole) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_controller_role_reason
	OFPCRRMasterRequest = 0 // OFPCRR_MASTER_REQUEST
	OFPCRRConfig        = 1 // OFPCRR_CONFIG
	OFPCRRExperimenter  = 2 // OFPCRR_EXPERIMENTER
)

type ControllerRoleReason uint8

func (self ControllerRoleReason) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_controller_status_prop_type
	OFPCSPTUri          = 0     // OFPCSPT_URI
	OFPCSPTExperimenter = 65535 // OFPCSPT_EXPERIMENTER
)

const (
	// Identifiers from group ofp_controller_status_reason
	OFPCSRRequest           = 0 // OFPCSR_REQUEST
	OFPCSRChannelStatus     = 1 // OFPCSR_CHANNEL_STATUS
	OFPCSRRole              = 2 // OFPCSR_ROLE
	OFPCSRControllerAdded   = 3 // OFPCSR_CONTROLLER_ADDED
	OFPCSRControllerRemoved = 4 // OFPCSR_CONTROLLER_REMOVED
	OFPCSRShortID           = 5 // OFPCSR_SHORT_ID
	OFPCSRExperimenter      = 6 // OFPCSR_EXPERIMENTER
)

type ControllerStatusReason uint8

func (self ControllerStatusReason) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_cs_states
	CsNew         = 1   // OFP_CS_NEW
	CsEstablished = 2   // OFP_CS_ESTABLISHED
	CsRelated     = 4   // OFP_CS_RELATED
	CsReplyDir    = 8   // OFP_CS_REPLY_DIR
	CsInvalid     = 16  // OFP_CS_INVALID
	CsTracked     = 32  // OFP_CS_TRACKED
	CsSrcNat      = 64  // OFP_CS_SRC_NAT
	CsDstNat      = 128 // OFP_CS_DST_NAT
)

type CsStates uint32

func (self CsStates) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&CsNew == CsNew {
		flags = append(flags, "\"New\": true")
	}
	if self&CsEstablished == CsEstablished {
		flags = append(flags, "\"Established\": true")
	}
	if self&CsRelated == CsRelated {
		flags = append(flags, "\"Related\": true")
	}
	if self&CsReplyDir == CsReplyDir {
		flags = append(flags, "\"ReplyDir\": true")
	}
	if self&CsInvalid == CsInvalid {
		flags = append(flags, "\"Invalid\": true")
	}
	if self&CsTracked == CsTracked {
		flags = append(flags, "\"Tracked\": true")
	}
	if self&CsSrcNat == CsSrcNat {
		flags = append(flags, "\"SrcNat\": true")
	}
	if self&CsDstNat == CsDstNat {
		flags = append(flags, "\"DstNat\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_ed_nsh_prop_type
	OFPPPTPropNshNone   = 0 // OFPPPT_PROP_NSH_NONE
	OFPPPTPropNshMdtype = 1 // OFPPPT_PROP_NSH_MDTYPE
	OFPPPTPropNshTlv    = 2 // OFPPPT_PROP_NSH_TLV
)

type EdNshPropType uint8

func (self EdNshPropType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_ed_prop_class
	OFPPPCBasic        = 0     // OFPPPC_BASIC
	OFPPPCMpls         = 1     // OFPPPC_MPLS
	OFPPPCGRE          = 2     // OFPPPC_GRE
	OFPPPCGtp          = 3     // OFPPPC_GTP
	OFPPPCNsh          = 4     // OFPPPC_NSH
	OFPPPCExperimenter = 65535 // OFPPPC_EXPERIMENTER
)

type EdPropClass uint16

func (self EdPropClass) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_error_type
	OFPETHelloFailed         = 0     // OFPET_HELLO_FAILED
	OFPETBadRequest          = 1     // OFPET_BAD_REQUEST
	OFPETBadAction           = 2     // OFPET_BAD_ACTION
	OFPETBadInstruction      = 3     // OFPET_BAD_INSTRUCTION
	OFPETBadMatch            = 4     // OFPET_BAD_MATCH
	OFPETFlowModFailed       = 5     // OFPET_FLOW_MOD_FAILED
	OFPETGroupModFailed      = 6     // OFPET_GROUP_MOD_FAILED
	OFPETPortModFailed       = 7     // OFPET_PORT_MOD_FAILED
	OFPETTableModFailed      = 8     // OFPET_TABLE_MOD_FAILED
	OFPETQueueOpFailed       = 9     // OFPET_QUEUE_OP_FAILED
	OFPETSwitchConfigFailed  = 10    // OFPET_SWITCH_CONFIG_FAILED
	OFPETRoleRequestFailed   = 11    // OFPET_ROLE_REQUEST_FAILED
	OFPETMeterModFailed      = 12    // OFPET_METER_MOD_FAILED
	OFPETTableFeaturesFailed = 13    // OFPET_TABLE_FEATURES_FAILED
	OFPETBadProperty         = 14    // OFPET_BAD_PROPERTY
	OFPETAsyncConfigFailed   = 15    // OFPET_ASYNC_CONFIG_FAILED
	OFPETFlowMonitorFailed   = 16    // OFPET_FLOW_MONITOR_FAILED
	OFPETBundleFailed        = 17    // OFPET_BUNDLE_FAILED
	OFPETExperimenter        = 65535 // OFPET_EXPERIMENTER
)

type ErrorType uint16

func (self ErrorType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_ethernet_type
	EthPLoop      = 96    // ETH_P_LOOP
	EthPPup       = 512   // ETH_P_PUP
	EthPPupat     = 513   // ETH_P_PUPAT
	EthPIp        = 2048  // ETH_P_IP
	EthPX25       = 2053  // ETH_P_X25
	EthPARP       = 2054  // ETH_P_ARP
	EthPBpq       = 2303  // ETH_P_BPQ
	EthPIeeepup   = 2560  // ETH_P_IEEEPUP
	EthPIeeepupat = 2561  // ETH_P_IEEEPUPAT
	EthPDec       = 24576 // ETH_P_DEC
	EthPDnaDl     = 24577 // ETH_P_DNA_DL
	EthPDnaRc     = 24578 // ETH_P_DNA_RC
	EthPDnaRt     = 24579 // ETH_P_DNA_RT
	EthPLat       = 24580 // ETH_P_LAT
	EthPDiag      = 24581 // ETH_P_DIAG
	EthPCust      = 24582 // ETH_P_CUST
	EthPSca       = 24583 // ETH_P_SCA
	EthPTeb       = 25944 // ETH_P_TEB
	EthPRarp      = 32821 // ETH_P_RARP
	EthPAtalk     = 32923 // ETH_P_ATALK
	EthPAarp      = 33011 // ETH_P_AARP
	EthP8021Q     = 33024 // ETH_P_8021Q
	EthPIpx       = 33079 // ETH_P_IPX
	EthPIpv6      = 34525 // ETH_P_IPV6
	EthPPause     = 34824 // ETH_P_PAUSE
	EthPSlow      = 34825 // ETH_P_SLOW
	EthPWccp      = 34878 // ETH_P_WCCP
	EthPPppDisc   = 34915 // ETH_P_PPP_DISC
	EthPPppSes    = 34916 // ETH_P_PPP_SES
	EthPMplsUc    = 34887 // ETH_P_MPLS_UC
	EthPMplsMc    = 34888 // ETH_P_MPLS_MC
	EthPAtmmpoa   = 34892 // ETH_P_ATMMPOA
	EthPAtmfate   = 34948 // ETH_P_ATMFATE
	EthPPae       = 34958 // ETH_P_PAE
	EthPAoe       = 34978 // ETH_P_AOE
	EthPTipc      = 35018 // ETH_P_TIPC
	EthP1588      = 35063 // ETH_P_1588
	EthPFcoe      = 35078 // ETH_P_FCOE
	EthPFip       = 35092 // ETH_P_FIP
	EthPEdsa      = 56026 // ETH_P_EDSA
)

type EthernetType uint16

func (self EthernetType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("\"%s\"", self)), nil
}

func (self EthernetType) String() string {
	switch self {
	case EthPLoop:
		return "loop"
	case EthPPup:
		return "pup"
	case EthPPupat:
		return "pupat"
	case EthPIp:
		return "ip"
	case EthPX25:
		return "x25"
	case EthPARP:
		return "arp"
	case EthPBpq:
		return "bpq"
	case EthPIeeepup:
		return "ieeepup"
	case EthPIeeepupat:
		return "ieeepupat"
	case EthPDec:
		return "dec"
	case EthPDnaDl:
		return "dna_dl"
	case EthPDnaRc:
		return "dna_rc"
	case EthPDnaRt:
		return "dna_rt"
	case EthPLat:
		return "lat"
	case EthPDiag:
		return "diag"
	case EthPCust:
		return "cust"
	case EthPSca:
		return "sca"
	case EthPTeb:
		return "teb"
	case EthPRarp:
		return "rarp"
	case EthPAtalk:
		return "atalk"
	case EthPAarp:
		return "aarp"
	case EthP8021Q:
		return "8021q"
	case EthPIpx:
		return "ipx"
	case EthPIpv6:
		return "ipv6"
	case EthPPause:
		return "pause"
	case EthPSlow:
		return "slow"
	case EthPWccp:
		return "wccp"
	case EthPPppDisc:
		return "ppp_disc"
	case EthPPppSes:
		return "ppp_ses"
	case EthPMplsUc:
		return "mpls_uc"
	case EthPMplsMc:
		return "mpls_mc"
	case EthPAtmmpoa:
		return "atmmpoa"
	case EthPAtmfate:
		return "atmfate"
	case EthPPae:
		return "pae"
	case EthPAoe:
		return "aoe"
	case EthPTipc:
		return "tipc"
	case EthP1588:
		return "1588"
	case EthPFcoe:
		return "fcoe"
	case EthPFip:
		return "fip"
	case EthPEdsa:
		return "edsa"
	default:
		return fmt.Sprintf("%d", self)
	}
}

const (
	// Identifiers from group ofp_flow_mod_command
	OFPFCAdd          = 0 // OFPFC_ADD
	OFPFCModify       = 1 // OFPFC_MODIFY
	OFPFCModifyStrict = 2 // OFPFC_MODIFY_STRICT
	OFPFCDelete       = 3 // OFPFC_DELETE
	OFPFCDeleteStrict = 4 // OFPFC_DELETE_STRICT
)

type FlowModCommand uint8

func (self FlowModCommand) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_flow_mod_failed_code
	OFPFMFCUnknown     = 0  // OFPFMFC_UNKNOWN
	OFPFMFCTableFull   = 1  // OFPFMFC_TABLE_FULL
	OFPFMFCBadTableID  = 2  // OFPFMFC_BAD_TABLE_ID
	OFPFMFCOverlap     = 3  // OFPFMFC_OVERLAP
	OFPFMFCEperm       = 4  // OFPFMFC_EPERM
	OFPFMFCBadTimeout  = 5  // OFPFMFC_BAD_TIMEOUT
	OFPFMFCBadCommand  = 6  // OFPFMFC_BAD_COMMAND
	OFPFMFCBadFlags    = 7  // OFPFMFC_BAD_FLAGS
	OFPFMFCCantSync    = 8  // OFPFMFC_CANT_SYNC
	OFPFMFCBadPriority = 9  // OFPFMFC_BAD_PRIORITY
	OFPFMFCIsSync      = 10 // OFPFMFC_IS_SYNC
)

type FlowModFailedCode uint16

func (self FlowModFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_flow_mod_flags
	OFPFFSendFlowRem  = 1   // OFPFF_SEND_FLOW_REM
	OFPFFCheckOverlap = 2   // OFPFF_CHECK_OVERLAP
	OFPFFResetCounts  = 4   // OFPFF_RESET_COUNTS
	OFPFFNoPktCounts  = 8   // OFPFF_NO_PKT_COUNTS
	OFPFFNoBytCounts  = 16  // OFPFF_NO_BYT_COUNTS
	OFPFFBSNSendIdle  = 128 // OFPFF_BSN_SEND_IDLE
)

type FlowModFlags uint16

func (self FlowModFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPFFSendFlowRem == OFPFFSendFlowRem {
		flags = append(flags, "\"SendFlowRem\": true")
	}
	if self&OFPFFCheckOverlap == OFPFFCheckOverlap {
		flags = append(flags, "\"CheckOverlap\": true")
	}
	if self&OFPFFResetCounts == OFPFFResetCounts {
		flags = append(flags, "\"ResetCounts\": true")
	}
	if self&OFPFFNoPktCounts == OFPFFNoPktCounts {
		flags = append(flags, "\"NoPktCounts\": true")
	}
	if self&OFPFFNoBytCounts == OFPFFNoBytCounts {
		flags = append(flags, "\"NoBytCounts\": true")
	}
	if self&OFPFFBSNSendIdle == OFPFFBSNSendIdle {
		flags = append(flags, "\"BsnSendIdle\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_flow_monitor_command
	OFPFMCAdd    = 0 // OFPFMC_ADD
	OFPFMCModify = 1 // OFPFMC_MODIFY
	OFPFMCDelete = 2 // OFPFMC_DELETE
)

type FlowMonitorCommand uint8

func (self FlowMonitorCommand) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_flow_monitor_failed_code
	OFPMOFCUnknown        = 0 // OFPMOFC_UNKNOWN
	OFPMOFCMonitorExists  = 1 // OFPMOFC_MONITOR_EXISTS
	OFPMOFCInvalidMonitor = 2 // OFPMOFC_INVALID_MONITOR
	OFPMOFCUnknownMonitor = 3 // OFPMOFC_UNKNOWN_MONITOR
	OFPMOFCBadCommand     = 4 // OFPMOFC_BAD_COMMAND
	OFPMOFCBadFlags       = 5 // OFPMOFC_BAD_FLAGS
	OFPMOFCBadTableID     = 6 // OFPMOFC_BAD_TABLE_ID
	OFPMOFCBadOut         = 7 // OFPMOFC_BAD_OUT
)

type FlowMonitorFailedCode uint16

func (self FlowMonitorFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_flow_monitor_flags
	OFPFMFInitial      = 1  // OFPFMF_INITIAL
	OFPFMFAdd          = 2  // OFPFMF_ADD
	OFPFMFRemoved      = 4  // OFPFMF_REMOVED
	OFPFMFModify       = 8  // OFPFMF_MODIFY
	OFPFMFInstructions = 16 // OFPFMF_INSTRUCTIONS
	OFPFMFNoAbbrev     = 32 // OFPFMF_NO_ABBREV
	OFPFMFOnlyOwn      = 64 // OFPFMF_ONLY_OWN
)

type FlowMonitorFlags uint16

func (self FlowMonitorFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPFMFInitial == OFPFMFInitial {
		flags = append(flags, "\"Initial\": true")
	}
	if self&OFPFMFAdd == OFPFMFAdd {
		flags = append(flags, "\"Add\": true")
	}
	if self&OFPFMFRemoved == OFPFMFRemoved {
		flags = append(flags, "\"Removed\": true")
	}
	if self&OFPFMFModify == OFPFMFModify {
		flags = append(flags, "\"Modify\": true")
	}
	if self&OFPFMFInstructions == OFPFMFInstructions {
		flags = append(flags, "\"Instructions\": true")
	}
	if self&OFPFMFNoAbbrev == OFPFMFNoAbbrev {
		flags = append(flags, "\"NoAbbrev\": true")
	}
	if self&OFPFMFOnlyOwn == OFPFMFOnlyOwn {
		flags = append(flags, "\"OnlyOwn\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_flow_removed_reason
	OFPRRIdleTimeout = 0 // OFPRR_IDLE_TIMEOUT
	OFPRRHardTimeout = 1 // OFPRR_HARD_TIMEOUT
	OFPRRDelete      = 2 // OFPRR_DELETE
	OFPRRGroupDelete = 3 // OFPRR_GROUP_DELETE
	OFPRRMeterDelete = 4 // OFPRR_METER_DELETE
	OFPRREviction    = 5 // OFPRR_EVICTION
)

type FlowRemovedReason uint8

func (self FlowRemovedReason) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_flow_stats_reason
	OFPFSRStatsRequest = 0 // OFPFSR_STATS_REQUEST
	OFPFSRStatTrigger  = 1 // OFPFSR_STAT_TRIGGER
)

type FlowStatsReason uint8

func (self FlowStatsReason) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_flow_update_event
	OFPFMEInitial  = 0 // OFPFME_INITIAL
	OFPFMEAdded    = 1 // OFPFME_ADDED
	OFPFMERemoved  = 2 // OFPFME_REMOVED
	OFPFMEModified = 3 // OFPFME_MODIFIED
	OFPFMEAbbrev   = 4 // OFPFME_ABBREV
	OFPFMEPaused   = 5 // OFPFME_PAUSED
	OFPFMEResumed  = 6 // OFPFME_RESUMED
)

type FlowUpdateEvent uint16

func (self FlowUpdateEvent) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_group
	OFPGMax = 4294967040 // OFPG_MAX
	OFPGAll = 4294967292 // OFPG_ALL
	OFPGAny = 4294967295 // OFPG_ANY
)

type Group uint32

func (self Group) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_group_bucket
	OFPGBucketMax   = 4294967040 // OFPG_BUCKET_MAX
	OFPGBucketFirst = 4294967293 // OFPG_BUCKET_FIRST
	OFPGBucketLast  = 4294967294 // OFPG_BUCKET_LAST
	OFPGBucketAll   = 4294967295 // OFPG_BUCKET_ALL
)

type GroupBucket uint32

func (self GroupBucket) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_group_bucket_prop_type
	OFPGBPTWeight       = 0     // OFPGBPT_WEIGHT
	OFPGBPTWatchPort    = 1     // OFPGBPT_WATCH_PORT
	OFPGBPTWatchGroup   = 2     // OFPGBPT_WATCH_GROUP
	OFPGBPTExperimenter = 65535 // OFPGBPT_EXPERIMENTER
)

const (
	// Identifiers from group ofp_group_capabilities
	OFPGFCSelectWeight   = 1 // OFPGFC_SELECT_WEIGHT
	OFPGFCSelectLiveness = 2 // OFPGFC_SELECT_LIVENESS
	OFPGFCChaining       = 4 // OFPGFC_CHAINING
	OFPGFCChainingChecks = 8 // OFPGFC_CHAINING_CHECKS
)

type GroupCapabilities uint32

func (self GroupCapabilities) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPGFCSelectWeight == OFPGFCSelectWeight {
		flags = append(flags, "\"SelectWeight\": true")
	}
	if self&OFPGFCSelectLiveness == OFPGFCSelectLiveness {
		flags = append(flags, "\"SelectLiveness\": true")
	}
	if self&OFPGFCChaining == OFPGFCChaining {
		flags = append(flags, "\"Chaining\": true")
	}
	if self&OFPGFCChainingChecks == OFPGFCChainingChecks {
		flags = append(flags, "\"ChainingChecks\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_group_mod_command
	OFPGCAdd          = 0 // OFPGC_ADD
	OFPGCModify       = 1 // OFPGC_MODIFY
	OFPGCDelete       = 2 // OFPGC_DELETE
	OFPGCInsertBucket = 3 // OFPGC_INSERT_BUCKET
	OFPGCRemoveBucket = 5 // OFPGC_REMOVE_BUCKET
)

type GroupModCommand uint16

func (self GroupModCommand) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_group_mod_failed_code
	OFPGMFCGroupExists         = 0  // OFPGMFC_GROUP_EXISTS
	OFPGMFCInvalidGroup        = 1  // OFPGMFC_INVALID_GROUP
	OFPGMFCWeightUnsupported   = 2  // OFPGMFC_WEIGHT_UNSUPPORTED
	OFPGMFCOutOfGroups         = 3  // OFPGMFC_OUT_OF_GROUPS
	OFPGMFCOutOfBuckets        = 4  // OFPGMFC_OUT_OF_BUCKETS
	OFPGMFCChainingUnsupported = 5  // OFPGMFC_CHAINING_UNSUPPORTED
	OFPGMFCWatchUnsupported    = 6  // OFPGMFC_WATCH_UNSUPPORTED
	OFPGMFCLoop                = 7  // OFPGMFC_LOOP
	OFPGMFCUnknownGroup        = 8  // OFPGMFC_UNKNOWN_GROUP
	OFPGMFCChainedGroup        = 9  // OFPGMFC_CHAINED_GROUP
	OFPGMFCBadType             = 10 // OFPGMFC_BAD_TYPE
	OFPGMFCBadCommand          = 11 // OFPGMFC_BAD_COMMAND
	OFPGMFCBadBucket           = 12 // OFPGMFC_BAD_BUCKET
	OFPGMFCBadWatch            = 13 // OFPGMFC_BAD_WATCH
	OFPGMFCEperm               = 14 // OFPGMFC_EPERM
	OFPGMFCUnknownBucket       = 15 // OFPGMFC_UNKNOWN_BUCKET
	OFPGMFCBucketExists        = 16 // OFPGMFC_BUCKET_EXISTS
)

type GroupModFailedCode uint16

func (self GroupModFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_group_prop_type
	OFPGPTExperimenter = 65535 // OFPGPT_EXPERIMENTER
)

const (
	// Identifiers from group ofp_group_type
	OFPGTAll      = 0 // OFPGT_ALL
	OFPGTSelect   = 1 // OFPGT_SELECT
	OFPGTIndirect = 2 // OFPGT_INDIRECT
	OFPGTFf       = 3 // OFPGT_FF
)

type GroupType uint8

func (self GroupType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("\"%s\"", self)), nil
}

func (self GroupType) String() string {
	switch self {
	case OFPGTAll:
		return "all"
	case OFPGTSelect:
		return "select"
	case OFPGTIndirect:
		return "indirect"
	case OFPGTFf:
		return "ff"
	default:
		return fmt.Sprintf("%d", self)
	}
}

const (
	// Identifiers from group ofp_header_type_namespace
	OFPHTNOnf        = 0 // OFPHTN_ONF
	OFPHTNEthertype  = 1 // OFPHTN_ETHERTYPE
	OFPHTNIpProto    = 2 // OFPHTN_IP_PROTO
	OFPHTNUdpTCPPort = 3 // OFPHTN_UDP_TCP_PORT
	OFPHTNIpv4Option = 4 // OFPHTN_IPV4_OPTION
)

type HeaderTypeNamespace uint16

func (self HeaderTypeNamespace) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_header_type_onf
	OFPHTOEthernet        = 0     // OFPHTO_ETHERNET
	OFPHTONoHeader        = 1     // OFPHTO_NO_HEADER
	OFPHTOOXMExperimenter = 65535 // OFPHTO_OXM_EXPERIMENTER
)

type HeaderTypeOnf uint16

func (self HeaderTypeOnf) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_hello_elem_type
	OFPHETVersionbitmap = 1 // OFPHET_VERSIONBITMAP
)

type HelloElemType uint16

func (self HelloElemType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_hello_failed_code
	OFPHFCIncompatible = 0 // OFPHFC_INCOMPATIBLE
	OFPHFCEperm        = 1 // OFPHFC_EPERM
)

type HelloFailedCode uint16

func (self HelloFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_icmp_type
	IcmpEchoreply      = 0  // ICMP_ECHOREPLY
	IcmpDestUnreach    = 3  // ICMP_DEST_UNREACH
	IcmpSourceQuench   = 4  // ICMP_SOURCE_QUENCH
	IcmpRedirect       = 5  // ICMP_REDIRECT
	IcmpEcho           = 8  // ICMP_ECHO
	IcmpTimeExceeded   = 11 // ICMP_TIME_EXCEEDED
	IcmpParameterprob  = 12 // ICMP_PARAMETERPROB
	IcmpTimestamp      = 13 // ICMP_TIMESTAMP
	IcmpTimestampreply = 14 // ICMP_TIMESTAMPREPLY
	IcmpInfoRequest    = 15 // ICMP_INFO_REQUEST
	IcmpInfoReply      = 16 // ICMP_INFO_REPLY
	IcmpAddress        = 17 // ICMP_ADDRESS
	IcmpAddressreply   = 18 // ICMP_ADDRESSREPLY
)

type IcmpType uint8

func (self IcmpType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("\"%s\"", self)), nil
}

func (self IcmpType) String() string {
	switch self {
	case IcmpEchoreply:
		return "echoreply"
	case IcmpDestUnreach:
		return "dest_unreach"
	case IcmpSourceQuench:
		return "source_quench"
	case IcmpRedirect:
		return "redirect"
	case IcmpEcho:
		return "echo"
	case IcmpTimeExceeded:
		return "time_exceeded"
	case IcmpParameterprob:
		return "parameterprob"
	case IcmpTimestamp:
		return "timestamp"
	case IcmpTimestampreply:
		return "timestampreply"
	case IcmpInfoRequest:
		return "info_request"
	case IcmpInfoReply:
		return "info_reply"
	case IcmpAddress:
		return "address"
	case IcmpAddressreply:
		return "addressreply"
	default:
		return fmt.Sprintf("%d", self)
	}
}

const (
	// Identifiers from group ofp_icmpv6_type
	Icmpv6EchoRequest     = 128 // ICMPV6_ECHO_REQUEST
	Icmpv6EchoReply       = 129 // ICMPV6_ECHO_REPLY
	Icmpv6MgmQuery        = 130 // ICMPV6_MGM_QUERY
	Icmpv6MgmReport       = 131 // ICMPV6_MGM_REPORT
	Icmpv6MgmReduction    = 132 // ICMPV6_MGM_REDUCTION
	Icmpv6NiQuery         = 139 // ICMPV6_NI_QUERY
	Icmpv6NiReply         = 140 // ICMPV6_NI_REPLY
	Icmpv6Mld2Report      = 143 // ICMPV6_MLD2_REPORT
	Icmpv6DhaadRequest    = 144 // ICMPV6_DHAAD_REQUEST
	Icmpv6DhaadReply      = 145 // ICMPV6_DHAAD_REPLY
	Icmpv6MobilePrefixSol = 146 // ICMPV6_MOBILE_PREFIX_SOL
	Icmpv6MobilePrefixAdv = 147 // ICMPV6_MOBILE_PREFIX_ADV
)

type Icmpv6Type uint8

func (self Icmpv6Type) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("\"%s\"", self)), nil
}

func (self Icmpv6Type) String() string {
	switch self {
	case Icmpv6EchoRequest:
		return "echo_request"
	case Icmpv6EchoReply:
		return "echo_reply"
	case Icmpv6MgmQuery:
		return "mgm_query"
	case Icmpv6MgmReport:
		return "mgm_report"
	case Icmpv6MgmReduction:
		return "mgm_reduction"
	case Icmpv6NiQuery:
		return "ni_query"
	case Icmpv6NiReply:
		return "ni_reply"
	case Icmpv6Mld2Report:
		return "mld2_report"
	case Icmpv6DhaadRequest:
		return "dhaad_request"
	case Icmpv6DhaadReply:
		return "dhaad_reply"
	case Icmpv6MobilePrefixSol:
		return "mobile_prefix_sol"
	case Icmpv6MobilePrefixAdv:
		return "mobile_prefix_adv"
	default:
		return fmt.Sprintf("%d", self)
	}
}

const (
	// Identifiers from group ofp_instruction_type
	OFPITGotoTable     = 1     // OFPIT_GOTO_TABLE
	OFPITWriteMetadata = 2     // OFPIT_WRITE_METADATA
	OFPITWriteActions  = 3     // OFPIT_WRITE_ACTIONS
	OFPITApplyActions  = 4     // OFPIT_APPLY_ACTIONS
	OFPITClearActions  = 5     // OFPIT_CLEAR_ACTIONS
	OFPITDeprecated    = 6     // OFPIT_DEPRECATED
	OFPITStatTrigger   = 7     // OFPIT_STAT_TRIGGER
	OFPITExperimenter  = 65535 // OFPIT_EXPERIMENTER
)

type InstructionType uint16

func (self InstructionType) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPITGotoTable == OFPITGotoTable {
		flags = append(flags, "\"GotoTable\": true")
	}
	if self&OFPITWriteMetadata == OFPITWriteMetadata {
		flags = append(flags, "\"WriteMetadata\": true")
	}
	if self&OFPITWriteActions == OFPITWriteActions {
		flags = append(flags, "\"WriteActions\": true")
	}
	if self&OFPITApplyActions == OFPITApplyActions {
		flags = append(flags, "\"ApplyActions\": true")
	}
	if self&OFPITClearActions == OFPITClearActions {
		flags = append(flags, "\"ClearActions\": true")
	}
	if self&OFPITDeprecated == OFPITDeprecated {
		flags = append(flags, "\"Deprecated\": true")
	}
	if self&OFPITStatTrigger == OFPITStatTrigger {
		flags = append(flags, "\"StatTrigger\": true")
	}
	if self&OFPITExperimenter == OFPITExperimenter {
		flags = append(flags, "\"Experimenter\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_ip_prototype
	IpprotoIp       = 0   // IPPROTO_IP
	IpprotoICMP     = 1   // IPPROTO_ICMP
	IpprotoIgmp     = 2   // IPPROTO_IGMP
	IpprotoIpip     = 4   // IPPROTO_IPIP
	IpprotoTCP      = 6   // IPPROTO_TCP
	IpprotoEgp      = 8   // IPPROTO_EGP
	IpprotoPup      = 12  // IPPROTO_PUP
	IpprotoUdp      = 17  // IPPROTO_UDP
	IpprotoIdp      = 22  // IPPROTO_IDP
	IpprotoTp       = 29  // IPPROTO_TP
	IpprotoDccp     = 33  // IPPROTO_DCCP
	IpprotoIpv6     = 41  // IPPROTO_IPV6
	IpprotoRsvp     = 46  // IPPROTO_RSVP
	IpprotoGRE      = 47  // IPPROTO_GRE
	IpprotoEsp      = 50  // IPPROTO_ESP
	IpprotoAh       = 51  // IPPROTO_AH
	IpprotoMtp      = 92  // IPPROTO_MTP
	IpprotoBeetph   = 94  // IPPROTO_BEETPH
	IpprotoEncap    = 98  // IPPROTO_ENCAP
	IpprotoPim      = 103 // IPPROTO_PIM
	IpprotoComp     = 108 // IPPROTO_COMP
	IpprotoSctp     = 132 // IPPROTO_SCTP
	IpprotoUdplite  = 136 // IPPROTO_UDPLITE
	IpprotoMpls     = 137 // IPPROTO_MPLS
	IpprotoRaw      = 255 // IPPROTO_RAW
	IpprotoRouting  = 43  // IPPROTO_ROUTING
	IpprotoFragment = 44  // IPPROTO_FRAGMENT
	IpprotoIcmpv6   = 58  // IPPROTO_ICMPV6
	IpprotoNone     = 59  // IPPROTO_NONE
	IpprotoDstopts  = 60  // IPPROTO_DSTOPTS
	IpprotoMh       = 135 // IPPROTO_MH
	IpprotoL2Tp     = 115 // IPPROTO_L2TP
)

type IpPrototype uint8

func (self IpPrototype) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("\"%s\"", self)), nil
}

func (self IpPrototype) String() string {
	switch self {
	case IpprotoIp:
		return "ip"
	case IpprotoICMP:
		return "icmp"
	case IpprotoIgmp:
		return "igmp"
	case IpprotoIpip:
		return "ipip"
	case IpprotoTCP:
		return "tcp"
	case IpprotoEgp:
		return "egp"
	case IpprotoPup:
		return "pup"
	case IpprotoUdp:
		return "udp"
	case IpprotoIdp:
		return "idp"
	case IpprotoTp:
		return "tp"
	case IpprotoDccp:
		return "dccp"
	case IpprotoIpv6:
		return "ipv6"
	case IpprotoRsvp:
		return "rsvp"
	case IpprotoGRE:
		return "gre"
	case IpprotoEsp:
		return "esp"
	case IpprotoAh:
		return "ah"
	case IpprotoMtp:
		return "mtp"
	case IpprotoBeetph:
		return "beetph"
	case IpprotoEncap:
		return "encap"
	case IpprotoPim:
		return "pim"
	case IpprotoComp:
		return "comp"
	case IpprotoSctp:
		return "sctp"
	case IpprotoUdplite:
		return "udplite"
	case IpprotoMpls:
		return "mpls"
	case IpprotoRaw:
		return "raw"
	case IpprotoRouting:
		return "routing"
	case IpprotoFragment:
		return "fragment"
	case IpprotoIcmpv6:
		return "icmpv6"
	case IpprotoNone:
		return "none"
	case IpprotoDstopts:
		return "dstopts"
	case IpprotoMh:
		return "mh"
	case IpprotoL2Tp:
		return "l2tp"
	default:
		return fmt.Sprintf("%d", self)
	}
}

const (
	// Identifiers from group ofp_ipv6exthdr_flags
	OFPIEHNonext = 1   // OFPIEH_NONEXT
	OFPIEHEsp    = 2   // OFPIEH_ESP
	OFPIEHAuth   = 4   // OFPIEH_AUTH
	OFPIEHDest   = 8   // OFPIEH_DEST
	OFPIEHFrag   = 16  // OFPIEH_FRAG
	OFPIEHRouter = 32  // OFPIEH_ROUTER
	OFPIEHHop    = 64  // OFPIEH_HOP
	OFPIEHUnrep  = 128 // OFPIEH_UNREP
	OFPIEHUnseq  = 256 // OFPIEH_UNSEQ
)

type Ipv6ExthdrFlags uint16

func (self Ipv6ExthdrFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPIEHNonext == OFPIEHNonext {
		flags = append(flags, "\"Nonext\": true")
	}
	if self&OFPIEHEsp == OFPIEHEsp {
		flags = append(flags, "\"Esp\": true")
	}
	if self&OFPIEHAuth == OFPIEHAuth {
		flags = append(flags, "\"Auth\": true")
	}
	if self&OFPIEHDest == OFPIEHDest {
		flags = append(flags, "\"Dest\": true")
	}
	if self&OFPIEHFrag == OFPIEHFrag {
		flags = append(flags, "\"Frag\": true")
	}
	if self&OFPIEHRouter == OFPIEHRouter {
		flags = append(flags, "\"Router\": true")
	}
	if self&OFPIEHHop == OFPIEHHop {
		flags = append(flags, "\"Hop\": true")
	}
	if self&OFPIEHUnrep == OFPIEHUnrep {
		flags = append(flags, "\"Unrep\": true")
	}
	if self&OFPIEHUnseq == OFPIEHUnseq {
		flags = append(flags, "\"Unseq\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_match_type
	OFPMTStandard = 0 // OFPMT_STANDARD
	OFPMTOXM      = 1 // OFPMT_OXM
)

type MatchType uint16

func (self MatchType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_meter
	OFPMMax        = 4294901760 // OFPM_MAX
	OFPMSlowpath   = 4294967293 // OFPM_SLOWPATH
	OFPMController = 4294967294 // OFPM_CONTROLLER
	OFPMAll        = 4294967295 // OFPM_ALL
)

type Meter uint32

func (self Meter) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_meter_band_type
	OFPMBTDrop         = 1     // OFPMBT_DROP
	OFPMBTDSCPRemark   = 2     // OFPMBT_DSCP_REMARK
	OFPMBTExperimenter = 65535 // OFPMBT_EXPERIMENTER
)

type MeterBandType uint16

func (self MeterBandType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_meter_feature_flags
	OFPMFFActionSet   = 1 // OFPMFF_ACTION_SET
	OFPMFFAnyPosition = 2 // OFPMFF_ANY_POSITION
	OFPMFFMultiList   = 4 // OFPMFF_MULTI_LIST
)

type MeterFeatureFlags uint32

func (self MeterFeatureFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPMFFActionSet == OFPMFFActionSet {
		flags = append(flags, "\"ActionSet\": true")
	}
	if self&OFPMFFAnyPosition == OFPMFFAnyPosition {
		flags = append(flags, "\"AnyPosition\": true")
	}
	if self&OFPMFFMultiList == OFPMFFMultiList {
		flags = append(flags, "\"MultiList\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_meter_flags
	OFPMFKbps  = 1 // OFPMF_KBPS
	OFPMFPktps = 2 // OFPMF_PKTPS
	OFPMFBurst = 4 // OFPMF_BURST
	OFPMFStats = 8 // OFPMF_STATS
)

type MeterFlags uint16

func (self MeterFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPMFKbps == OFPMFKbps {
		flags = append(flags, "\"Kbps\": true")
	}
	if self&OFPMFPktps == OFPMFPktps {
		flags = append(flags, "\"Pktps\": true")
	}
	if self&OFPMFBurst == OFPMFBurst {
		flags = append(flags, "\"Burst\": true")
	}
	if self&OFPMFStats == OFPMFStats {
		flags = append(flags, "\"Stats\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_meter_mod_command
	OFPMCAdd    = 0 // OFPMC_ADD
	OFPMCModify = 1 // OFPMC_MODIFY
	OFPMCDelete = 2 // OFPMC_DELETE
)

type MeterModCommand uint16

func (self MeterModCommand) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_meter_mod_failed_code
	OFPMMFCUnknown      = 0  // OFPMMFC_UNKNOWN
	OFPMMFCMeterExists  = 1  // OFPMMFC_METER_EXISTS
	OFPMMFCInvalidMeter = 2  // OFPMMFC_INVALID_METER
	OFPMMFCUnknownMeter = 3  // OFPMMFC_UNKNOWN_METER
	OFPMMFCBadCommand   = 4  // OFPMMFC_BAD_COMMAND
	OFPMMFCBadFlags     = 5  // OFPMMFC_BAD_FLAGS
	OFPMMFCBadRate      = 6  // OFPMMFC_BAD_RATE
	OFPMMFCBadBurst     = 7  // OFPMMFC_BAD_BURST
	OFPMMFCBadBand      = 8  // OFPMMFC_BAD_BAND
	OFPMMFCBadBandValue = 9  // OFPMMFC_BAD_BAND_VALUE
	OFPMMFCOutOfMeters  = 10 // OFPMMFC_OUT_OF_METERS
	OFPMMFCOutOfBands   = 11 // OFPMMFC_OUT_OF_BANDS
)

type MeterModFailedCode uint16

func (self MeterModFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_optical_port_features
	OFPOPFRxTune  = 1 // OFPOPF_RX_TUNE
	OFPOPFTxTune  = 2 // OFPOPF_TX_TUNE
	OFPOPFTxPwr   = 4 // OFPOPF_TX_PWR
	OFPOPFUseFreq = 8 // OFPOPF_USE_FREQ
)

type OpticalPortFeatures uint32

func (self OpticalPortFeatures) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPOPFRxTune == OFPOPFRxTune {
		flags = append(flags, "\"RxTune\": true")
	}
	if self&OFPOPFTxTune == OFPOPFTxTune {
		flags = append(flags, "\"TxTune\": true")
	}
	if self&OFPOPFTxPwr == OFPOPFTxPwr {
		flags = append(flags, "\"TxPwr\": true")
	}
	if self&OFPOPFUseFreq == OFPOPFUseFreq {
		flags = append(flags, "\"UseFreq\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_ovs_tcp_flag
	OvsTCPFlagFin = 1   // OFP_OVS_TCP_FLAG_FIN
	OvsTCPFlagSyn = 2   // OFP_OVS_TCP_FLAG_SYN
	OvsTCPFlagRst = 4   // OFP_OVS_TCP_FLAG_RST
	OvsTCPFlagPsh = 8   // OFP_OVS_TCP_FLAG_PSH
	OvsTCPFlagAck = 16  // OFP_OVS_TCP_FLAG_ACK
	OvsTCPFlagUrg = 32  // OFP_OVS_TCP_FLAG_URG
	OvsTCPFlagEce = 64  // OFP_OVS_TCP_FLAG_ECE
	OvsTCPFlagCwr = 128 // OFP_OVS_TCP_FLAG_CWR
	OvsTCPFlagNs  = 256 // OFP_OVS_TCP_FLAG_NS
)

type OvsTcpFlag uint16

func (self OvsTcpFlag) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OvsTCPFlagFin == OvsTCPFlagFin {
		flags = append(flags, "\"Fin\": true")
	}
	if self&OvsTCPFlagSyn == OvsTCPFlagSyn {
		flags = append(flags, "\"Syn\": true")
	}
	if self&OvsTCPFlagRst == OvsTCPFlagRst {
		flags = append(flags, "\"Rst\": true")
	}
	if self&OvsTCPFlagPsh == OvsTCPFlagPsh {
		flags = append(flags, "\"Psh\": true")
	}
	if self&OvsTCPFlagAck == OvsTCPFlagAck {
		flags = append(flags, "\"Ack\": true")
	}
	if self&OvsTCPFlagUrg == OvsTCPFlagUrg {
		flags = append(flags, "\"Urg\": true")
	}
	if self&OvsTCPFlagEce == OvsTCPFlagEce {
		flags = append(flags, "\"Ece\": true")
	}
	if self&OvsTCPFlagCwr == OvsTCPFlagCwr {
		flags = append(flags, "\"Cwr\": true")
	}
	if self&OvsTCPFlagNs == OvsTCPFlagNs {
		flags = append(flags, "\"Ns\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_oxm_class
	OFPXMCNxm0          = 0     // OFPXMC_NXM_0
	OFPXMCNxm1          = 1     // OFPXMC_NXM_1
	OFPXMCOpenflowBasic = 32768 // OFPXMC_OPENFLOW_BASIC
	OFPXMCPacketRegs    = 32769 // OFPXMC_PACKET_REGS
	OFPXMCExperimenter  = 65535 // OFPXMC_EXPERIMENTER
)

type OxmClass uint16

func (self OxmClass) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_oxs_class
	OFPXSCOpenflowBasic = 32770 // OFPXSC_OPENFLOW_BASIC
	OFPXSCExperimenter  = 65535 // OFPXSC_EXPERIMENTER
)

type OxsClass uint16

func (self OxsClass) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_packet_in_reason
	OFPRNoMatch                     = 0   // OFPR_NO_MATCH
	OFPRAction                      = 1   // OFPR_ACTION
	OFPRInvalidTtl                  = 2   // OFPR_INVALID_TTL
	OFPRActionSet                   = 3   // OFPR_ACTION_SET
	OFPRGroup                       = 4   // OFPR_GROUP
	OFPRPacketOut                   = 5   // OFPR_PACKET_OUT
	OFPRBSNNewHost                  = 128 // OFPR_BSN_NEW_HOST
	OFPRBSNStationMove              = 129 // OFPR_BSN_STATION_MOVE
	OFPRBSNBadVLAN                  = 130 // OFPR_BSN_BAD_VLAN
	OFPRBSNDestinationLookupFailure = 131 // OFPR_BSN_DESTINATION_LOOKUP_FAILURE
	OFPRBSNNoRoute                  = 132 // OFPR_BSN_NO_ROUTE
	OFPRBSNICMPEchoRequest          = 133 // OFPR_BSN_ICMP_ECHO_REQUEST
	OFPRBSNDestNetworkUnreachable   = 134 // OFPR_BSN_DEST_NETWORK_UNREACHABLE
	OFPRBSNDestHostUnreachable      = 135 // OFPR_BSN_DEST_HOST_UNREACHABLE
	OFPRBSNDestPortUnreachable      = 136 // OFPR_BSN_DEST_PORT_UNREACHABLE
	OFPRBSNFragmentationRequired    = 137 // OFPR_BSN_FRAGMENTATION_REQUIRED
	OFPRBSNARP                      = 139 // OFPR_BSN_ARP
	OFPRBSNDhcp                     = 140 // OFPR_BSN_DHCP
	OFPRBSNDebug                    = 141 // OFPR_BSN_DEBUG
	OFPRBSNPacketOfDeath            = 142 // OFPR_BSN_PACKET_OF_DEATH
)

type PacketInReason uint8

func (self PacketInReason) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_packet_type
	PtEthernet     = 0          // OFP_PT_ETHERNET
	PtUseNextProto = 65534      // OFP_PT_USE_NEXT_PROTO
	PtIpv4         = 67584      // OFP_PT_IPV4
	PtMpls         = 100423     // OFP_PT_MPLS
	PtMplsMc       = 100424     // OFP_PT_MPLS_MC
	PtNsh          = 100687     // OFP_PT_NSH
	PtUnknown      = 4294967295 // OFP_PT_UNKNOWN
)

type PacketType uint32

func (self PacketType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("\"%s\"", self)), nil
}

func (self PacketType) String() string {
	switch self {
	case PtEthernet:
		return "ethernet"
	case PtUseNextProto:
		return "use_next_proto"
	case PtIpv4:
		return "ipv4"
	case PtMpls:
		return "mpls"
	case PtMplsMc:
		return "mpls_mc"
	case PtNsh:
		return "nsh"
	case PtUnknown:
		return "unknown"
	default:
		return fmt.Sprintf("%d", self)
	}
}

const (
	// Identifiers from group ofp_port
	OFPPMax        = 4294967040 // OFPP_MAX
	OFPPUnset      = 4294967287 // OFPP_UNSET
	OFPPInPort     = 4294967288 // OFPP_IN_PORT
	OFPPTable      = 4294967289 // OFPP_TABLE
	OFPPNormal     = 4294967290 // OFPP_NORMAL
	OFPPFlood      = 4294967291 // OFPP_FLOOD
	OFPPAll        = 4294967292 // OFPP_ALL
	OFPPController = 4294967293 // OFPP_CONTROLLER
	OFPPLocal      = 4294967294 // OFPP_LOCAL
	OFPPAny        = 4294967295 // OFPP_ANY
)

type Port uint32

func (self Port) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_port_config
	OFPPCPortDown      = 1          // OFPPC_PORT_DOWN
	OFPPCNoRecv        = 4          // OFPPC_NO_RECV
	OFPPCNoFwd         = 32         // OFPPC_NO_FWD
	OFPPCNoPacketIn    = 64         // OFPPC_NO_PACKET_IN
	OFPPCBSNMirrorDest = 2147483648 // OFPPC_BSN_MIRROR_DEST
)

type PortConfig uint32

func (self PortConfig) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPPCPortDown == OFPPCPortDown {
		flags = append(flags, "\"PortDown\": true")
	}
	if self&OFPPCNoRecv == OFPPCNoRecv {
		flags = append(flags, "\"NoRecv\": true")
	}
	if self&OFPPCNoFwd == OFPPCNoFwd {
		flags = append(flags, "\"NoFwd\": true")
	}
	if self&OFPPCNoPacketIn == OFPPCNoPacketIn {
		flags = append(flags, "\"NoPacketIn\": true")
	}
	if self&OFPPCBSNMirrorDest == OFPPCBSNMirrorDest {
		flags = append(flags, "\"BsnMirrorDest\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_port_desc_prop_type
	OFPPDPTEthernet       = 0     // OFPPDPT_ETHERNET
	OFPPDPTOptical        = 1     // OFPPDPT_OPTICAL
	OFPPDPTPipelineInput  = 2     // OFPPDPT_PIPELINE_INPUT
	OFPPDPTPipelineOutput = 3     // OFPPDPT_PIPELINE_OUTPUT
	OFPPDPTRecirculate    = 4     // OFPPDPT_RECIRCULATE
	OFPPDPTExperimenter   = 65535 // OFPPDPT_EXPERIMENTER
)

const (
	// Identifiers from group ofp_port_features
	OFPPF10MbHd             = 1          // OFPPF_10MB_HD
	OFPPF10MbFd             = 2          // OFPPF_10MB_FD
	OFPPF100MbHd            = 4          // OFPPF_100MB_HD
	OFPPF100MbFd            = 8          // OFPPF_100MB_FD
	OFPPF1GbHd              = 16         // OFPPF_1GB_HD
	OFPPF1GbFd              = 32         // OFPPF_1GB_FD
	OFPPF10GbFd             = 64         // OFPPF_10GB_FD
	OFPPF40GbFd             = 128        // OFPPF_40GB_FD
	OFPPF100GbFd            = 256        // OFPPF_100GB_FD
	OFPPF1TbFd              = 512        // OFPPF_1TB_FD
	OFPPFOther              = 1024       // OFPPF_OTHER
	OFPPFCopper             = 2048       // OFPPF_COPPER
	OFPPFFiber              = 4096       // OFPPF_FIBER
	OFPPFAutoneg            = 8192       // OFPPF_AUTONEG
	OFPPFPause              = 16384      // OFPPF_PAUSE
	OFPPFPauseAsym          = 32768      // OFPPF_PAUSE_ASYM
	OFPPFBSNBreakoutCapable = 2147483648 // OFPPF_BSN_BREAKOUT_CAPABLE
)

type PortFeatures uint32

func (self PortFeatures) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPPF10MbHd == OFPPF10MbHd {
		flags = append(flags, "\"10MbHd\": true")
	}
	if self&OFPPF10MbFd == OFPPF10MbFd {
		flags = append(flags, "\"10MbFd\": true")
	}
	if self&OFPPF100MbHd == OFPPF100MbHd {
		flags = append(flags, "\"100MbHd\": true")
	}
	if self&OFPPF100MbFd == OFPPF100MbFd {
		flags = append(flags, "\"100MbFd\": true")
	}
	if self&OFPPF1GbHd == OFPPF1GbHd {
		flags = append(flags, "\"1GbHd\": true")
	}
	if self&OFPPF1GbFd == OFPPF1GbFd {
		flags = append(flags, "\"1GbFd\": true")
	}
	if self&OFPPF10GbFd == OFPPF10GbFd {
		flags = append(flags, "\"10GbFd\": true")
	}
	if self&OFPPF40GbFd == OFPPF40GbFd {
		flags = append(flags, "\"40GbFd\": true")
	}
	if self&OFPPF100GbFd == OFPPF100GbFd {
		flags = append(flags, "\"100GbFd\": true")
	}
	if self&OFPPF1TbFd == OFPPF1TbFd {
		flags = append(flags, "\"1TbFd\": true")
	}
	if self&OFPPFOther == OFPPFOther {
		flags = append(flags, "\"Other\": true")
	}
	if self&OFPPFCopper == OFPPFCopper {
		flags = append(flags, "\"Copper\": true")
	}
	if self&OFPPFFiber == OFPPFFiber {
		flags = append(flags, "\"Fiber\": true")
	}
	if self&OFPPFAutoneg == OFPPFAutoneg {
		flags = append(flags, "\"Autoneg\": true")
	}
	if self&OFPPFPause == OFPPFPause {
		flags = append(flags, "\"Pause\": true")
	}
	if self&OFPPFPauseAsym == OFPPFPauseAsym {
		flags = append(flags, "\"PauseAsym\": true")
	}
	if self&OFPPFBSNBreakoutCapable == OFPPFBSNBreakoutCapable {
		flags = append(flags, "\"BsnBreakoutCapable\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_port_mod_failed_code
	OFPPMFCBadPort      = 0 // OFPPMFC_BAD_PORT
	OFPPMFCBadHwAddr    = 1 // OFPPMFC_BAD_HW_ADDR
	OFPPMFCBadConfig    = 2 // OFPPMFC_BAD_CONFIG
	OFPPMFCBadAdvertise = 3 // OFPPMFC_BAD_ADVERTISE
	OFPPMFCEperm        = 4 // OFPPMFC_EPERM
)

type PortModFailedCode uint16

func (self PortModFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_port_mod_prop_type
	OFPPMPTEthernet     = 0     // OFPPMPT_ETHERNET
	OFPPMPTOptical      = 1     // OFPPMPT_OPTICAL
	OFPPMPTExperimenter = 65535 // OFPPMPT_EXPERIMENTER
)

const (
	// Identifiers from group ofp_port_reason
	OFPPRAdd    = 0 // OFPPR_ADD
	OFPPRDelete = 1 // OFPPR_DELETE
	OFPPRModify = 2 // OFPPR_MODIFY
)

type PortReason uint8

func (self PortReason) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_port_state
	OFPPSLinkDown = 1 // OFPPS_LINK_DOWN
	OFPPSBlocked  = 2 // OFPPS_BLOCKED
	OFPPSLive     = 4 // OFPPS_LIVE
)

type PortState uint32

func (self PortState) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPPSLinkDown == OFPPSLinkDown {
		flags = append(flags, "\"LinkDown\": true")
	}
	if self&OFPPSBlocked == OFPPSBlocked {
		flags = append(flags, "\"Blocked\": true")
	}
	if self&OFPPSLive == OFPPSLive {
		flags = append(flags, "\"Live\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_port_stats_optical_flags
	OFPOSFRxTune = 1  // OFPOSF_RX_TUNE
	OFPOSFTxTune = 2  // OFPOSF_TX_TUNE
	OFPOSFTxPwr  = 4  // OFPOSF_TX_PWR
	OFPOSFRxPwr  = 16 // OFPOSF_RX_PWR
	OFPOSFTxBias = 32 // OFPOSF_TX_BIAS
	OFPOSFTxTemp = 64 // OFPOSF_TX_TEMP
)

type PortStatsOpticalFlags uint32

func (self PortStatsOpticalFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPOSFRxTune == OFPOSFRxTune {
		flags = append(flags, "\"RxTune\": true")
	}
	if self&OFPOSFTxTune == OFPOSFTxTune {
		flags = append(flags, "\"TxTune\": true")
	}
	if self&OFPOSFTxPwr == OFPOSFTxPwr {
		flags = append(flags, "\"TxPwr\": true")
	}
	if self&OFPOSFRxPwr == OFPOSFRxPwr {
		flags = append(flags, "\"RxPwr\": true")
	}
	if self&OFPOSFTxBias == OFPOSFTxBias {
		flags = append(flags, "\"TxBias\": true")
	}
	if self&OFPOSFTxTemp == OFPOSFTxTemp {
		flags = append(flags, "\"TxTemp\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_port_stats_prop_type
	OFPPSPTEthernet     = 0     // OFPPSPT_ETHERNET
	OFPPSPTOptical      = 1     // OFPPSPT_OPTICAL
	OFPPSPTExperimenter = 65535 // OFPPSPT_EXPERIMENTER
)

type PortStatsPropType uint16

func (self PortStatsPropType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_queue_desc_prop_type
	OFPQDPTMinRate      = 1     // OFPQDPT_MIN_RATE
	OFPQDPTMaxRate      = 2     // OFPQDPT_MAX_RATE
	OFPQDPTExperimenter = 65535 // OFPQDPT_EXPERIMENTER
)

const (
	// Identifiers from group ofp_queue_op_failed_code
	OFPQOFCBadPort  = 0 // OFPQOFC_BAD_PORT
	OFPQOFCBadQueue = 1 // OFPQOFC_BAD_QUEUE
	OFPQOFCEperm    = 2 // OFPQOFC_EPERM
)

type QueueOpFailedCode uint16

func (self QueueOpFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_queue_stats_prop_type
	OFPQSPTExperimenter = 65535 // OFPQSPT_EXPERIMENTER
)

const (
	// Identifiers from group ofp_requestforward_reason
	OFPRFRGroupMod = 0 // OFPRFR_GROUP_MOD
	OFPRFRMeterMod = 1 // OFPRFR_METER_MOD
)

const (
	// Identifiers from group ofp_role_prop_type
	OFPRPTExperimenter = 65535 // OFPRPT_EXPERIMENTER
)

const (
	// Identifiers from group ofp_role_request_failed_code
	OFPRRFCStale   = 0 // OFPRRFC_STALE
	OFPRRFCUnsup   = 1 // OFPRRFC_UNSUP
	OFPRRFCBadRole = 2 // OFPRRFC_BAD_ROLE
)

type RoleRequestFailedCode uint16

func (self RoleRequestFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_stat_trigger_flags
	OFPSTFPeriodic  = 1 // OFPSTF_PERIODIC
	OFPSTFOnlyFirst = 2 // OFPSTF_ONLY_FIRST
)

type StatTriggerFlags uint32

func (self StatTriggerFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPSTFPeriodic == OFPSTFPeriodic {
		flags = append(flags, "\"Periodic\": true")
	}
	if self&OFPSTFOnlyFirst == OFPSTFOnlyFirst {
		flags = append(flags, "\"OnlyFirst\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_stats_reply_flags
	OFPSFReplyMore = 1 // OFPSF_REPLY_MORE
)

type StatsReplyFlags uint16

func (self StatsReplyFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPSFReplyMore == OFPSFReplyMore {
		flags = append(flags, "\"OFPSFReplyMore\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_stats_request_flags
	OFPSFReqMore = 1 // OFPSF_REQ_MORE
)

type StatsRequestFlags uint16

func (self StatsRequestFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPSFReqMore == OFPSFReqMore {
		flags = append(flags, "\"OFPSFReqMore\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_stats_type
	OFPSTDesc             = 0     // OFPST_DESC
	OFPSTFlow             = 1     // OFPST_FLOW
	OFPSTAggregate        = 2     // OFPST_AGGREGATE
	OFPSTTable            = 3     // OFPST_TABLE
	OFPSTPort             = 4     // OFPST_PORT
	OFPSTQueue            = 5     // OFPST_QUEUE
	OFPSTGroup            = 6     // OFPST_GROUP
	OFPSTGroupDesc        = 7     // OFPST_GROUP_DESC
	OFPSTGroupFeatures    = 8     // OFPST_GROUP_FEATURES
	OFPSTMeter            = 9     // OFPST_METER
	OFPSTMeterConfig      = 10    // OFPST_METER_CONFIG
	OFPSTMeterFeatures    = 11    // OFPST_METER_FEATURES
	OFPSTTableFeatures    = 12    // OFPST_TABLE_FEATURES
	OFPSTPortDesc         = 13    // OFPST_PORT_DESC
	OFPMPTableDesc        = 14    // OFPMP_TABLE_DESC
	OFPMPQueueDesc        = 15    // OFPMP_QUEUE_DESC
	OFPMPFlowMonitor      = 16    // OFPMP_FLOW_MONITOR
	OFPMPFlowLightweight  = 17    // OFPMP_FLOW_LIGHTWEIGHT
	OFPMPControllerStatus = 18    // OFPMP_CONTROLLER_STATUS
	OFPMPBundleFeatures   = 19    // OFPMP_BUNDLE_FEATURES
	OFPSTExperimenter     = 65535 // OFPST_EXPERIMENTER
)

type StatsType uint16

func (self StatsType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_switch_config_failed_code
	OFPSCFCBadFlags = 0 // OFPSCFC_BAD_FLAGS
	OFPSCFCBadLen   = 1 // OFPSCFC_BAD_LEN
	OFPSCFCEperm    = 2 // OFPSCFC_EPERM
	OFPRRFCIDUnsup  = 3 // OFPRRFC_ID_UNSUP
	OFPRRFCIDInUse  = 4 // OFPRRFC_ID_IN_USE
)

type SwitchConfigFailedCode uint16

func (self SwitchConfigFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_table
	OFPTTMax = 254 // OFPTT_MAX
	OFPTTAll = 255 // OFPTT_ALL
)

type Table uint8

func (self Table) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_table_config
	OFPTCDeprecatedMask = 3 // OFPTC_DEPRECATED_MASK
	OFPTCEviction       = 4 // OFPTC_EVICTION
	OFPTCVacancyEvents  = 8 // OFPTC_VACANCY_EVENTS
)

type TableConfig uint32

func (self TableConfig) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPTCDeprecatedMask == OFPTCDeprecatedMask {
		flags = append(flags, "\"DeprecatedMask\": true")
	}
	if self&OFPTCEviction == OFPTCEviction {
		flags = append(flags, "\"Eviction\": true")
	}
	if self&OFPTCVacancyEvents == OFPTCVacancyEvents {
		flags = append(flags, "\"VacancyEvents\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_table_feature_flag
	OFPTFFIngressTable = 1  // OFPTFF_INGRESS_TABLE
	OFPTFFEgressTable  = 2  // OFPTFF_EGRESS_TABLE
	OFPTFFFirstEgress  = 16 // OFPTFF_FIRST_EGRESS
)

type TableFeatureFlag uint32

func (self TableFeatureFlag) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPTFFIngressTable == OFPTFFIngressTable {
		flags = append(flags, "\"IngressTable\": true")
	}
	if self&OFPTFFEgressTable == OFPTFFEgressTable {
		flags = append(flags, "\"EgressTable\": true")
	}
	if self&OFPTFFFirstEgress == OFPTFFFirstEgress {
		flags = append(flags, "\"FirstEgress\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_table_feature_prop_type
	OFPTFPTInstructions       = 0     // OFPTFPT_INSTRUCTIONS
	OFPTFPTInstructionsMiss   = 1     // OFPTFPT_INSTRUCTIONS_MISS
	OFPTFPTNextTables         = 2     // OFPTFPT_NEXT_TABLES
	OFPTFPTNextTablesMiss     = 3     // OFPTFPT_NEXT_TABLES_MISS
	OFPTFPTWriteActions       = 4     // OFPTFPT_WRITE_ACTIONS
	OFPTFPTWriteActionsMiss   = 5     // OFPTFPT_WRITE_ACTIONS_MISS
	OFPTFPTApplyActions       = 6     // OFPTFPT_APPLY_ACTIONS
	OFPTFPTApplyActionsMiss   = 7     // OFPTFPT_APPLY_ACTIONS_MISS
	OFPTFPTMatch              = 8     // OFPTFPT_MATCH
	OFPTFPTWildcards          = 10    // OFPTFPT_WILDCARDS
	OFPTFPTWriteSetfield      = 12    // OFPTFPT_WRITE_SETFIELD
	OFPTFPTWriteSetfieldMiss  = 13    // OFPTFPT_WRITE_SETFIELD_MISS
	OFPTFPTApplySetfield      = 14    // OFPTFPT_APPLY_SETFIELD
	OFPTFPTApplySetfieldMiss  = 15    // OFPTFPT_APPLY_SETFIELD_MISS
	OFPTFPTTableSyncFrom      = 16    // OFPTFPT_TABLE_SYNC_FROM
	OFPTFPTWriteCopyfield     = 18    // OFPTFPT_WRITE_COPYFIELD
	OFPTFPTWriteCopyfieldMiss = 19    // OFPTFPT_WRITE_COPYFIELD_MISS
	OFPTFPTApplyCopyfield     = 20    // OFPTFPT_APPLY_COPYFIELD
	OFPTFPTApplyCopyfieldMiss = 21    // OFPTFPT_APPLY_COPYFIELD_MISS
	OFPTFPTPacketTypes        = 22    // OFPTFPT_PACKET_TYPES
	OFPTFPTExperimenter       = 65534 // OFPTFPT_EXPERIMENTER
	OFPTFPTExperimenterMiss   = 65535 // OFPTFPT_EXPERIMENTER_MISS
)

type TableFeaturePropType uint16

func (self TableFeaturePropType) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_table_features_command
	OFPTFCReplace = 0 // OFPTFC_REPLACE
	OFPTFCModify  = 1 // OFPTFC_MODIFY
	OFPTFCEnable  = 2 // OFPTFC_ENABLE
	OFPTFCDisable = 3 // OFPTFC_DISABLE
)

type TableFeaturesCommand uint8

func (self TableFeaturesCommand) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_table_features_failed_code
	OFPTFFCBadTable    = 0  // OFPTFFC_BAD_TABLE
	OFPTFFCBadMetadata = 1  // OFPTFFC_BAD_METADATA
	OFPTFFCEperm       = 5  // OFPTFFC_EPERM
	OFPTFFCBadCapa     = 6  // OFPTFFC_BAD_CAPA
	OFPTFFCBadMaxEnt   = 7  // OFPTFFC_BAD_MAX_ENT
	OFPTFFCBadFeatures = 8  // OFPTFFC_BAD_FEATURES
	OFPTFFCBadCommand  = 9  // OFPTFFC_BAD_COMMAND
	OFPTFFCTooMany     = 10 // OFPTFFC_TOO_MANY
)

type TableFeaturesFailedCode uint16

func (self TableFeaturesFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_table_mod_failed_code
	OFPTMFCBadTable  = 0 // OFPTMFC_BAD_TABLE
	OFPTMFCBadConfig = 1 // OFPTMFC_BAD_CONFIG
	OFPTMFCEperm     = 2 // OFPTMFC_EPERM
)

type TableModFailedCode uint16

func (self TableModFailedCode) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_table_mod_prop_eviction_flag
	OFPTMPEFOther      = 1 // OFPTMPEF_OTHER
	OFPTMPEFImportance = 2 // OFPTMPEF_IMPORTANCE
	OFPTMPEFLifetime   = 4 // OFPTMPEF_LIFETIME
)

type TableModPropEvictionFlag uint32

func (self TableModPropEvictionFlag) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPTMPEFOther == OFPTMPEFOther {
		flags = append(flags, "\"Other\": true")
	}
	if self&OFPTMPEFImportance == OFPTMPEFImportance {
		flags = append(flags, "\"Importance\": true")
	}
	if self&OFPTMPEFLifetime == OFPTMPEFLifetime {
		flags = append(flags, "\"Lifetime\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_table_mod_prop_type
	OFPTMPTEviction     = 2     // OFPTMPT_EVICTION
	OFPTMPTVacancy      = 3     // OFPTMPT_VACANCY
	OFPTMPTExperimenter = 65535 // OFPTMPT_EXPERIMENTER
)

const (
	// Identifiers from group ofp_table_reason
	OFPTRVacancyDown = 3 // OFPTR_VACANCY_DOWN
	OFPTRVacancyUp   = 4 // OFPTR_VACANCY_UP
)

type TableReason uint8

func (self TableReason) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}

const (
	// Identifiers from group ofp_tcp_flags
	TcpFlagCwr = 128 // TCP_FLAG_CWR
	TcpFlagEce = 64  // TCP_FLAG_ECE
	TcpFlagUrg = 32  // TCP_FLAG_URG
	TcpFlagAck = 16  // TCP_FLAG_ACK
	TcpFlagPsh = 8   // TCP_FLAG_PSH
	TcpFlagRst = 4   // TCP_FLAG_RST
	TcpFlagSyn = 2   // TCP_FLAG_SYN
	TcpFlagFin = 1   // TCP_FLAG_FIN
)

type TcpFlags uint16

func (self TcpFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&TcpFlagCwr == TcpFlagCwr {
		flags = append(flags, "\"Cwr\": true")
	}
	if self&TcpFlagEce == TcpFlagEce {
		flags = append(flags, "\"Ece\": true")
	}
	if self&TcpFlagUrg == TcpFlagUrg {
		flags = append(flags, "\"Urg\": true")
	}
	if self&TcpFlagAck == TcpFlagAck {
		flags = append(flags, "\"Ack\": true")
	}
	if self&TcpFlagPsh == TcpFlagPsh {
		flags = append(flags, "\"Psh\": true")
	}
	if self&TcpFlagRst == TcpFlagRst {
		flags = append(flags, "\"Rst\": true")
	}
	if self&TcpFlagSyn == TcpFlagSyn {
		flags = append(flags, "\"Syn\": true")
	}
	if self&TcpFlagFin == TcpFlagFin {
		flags = append(flags, "\"Fin\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

const (
	// Identifiers from group ofp_type
	OFPTHello            = 0  // OFPT_HELLO
	OFPTError            = 1  // OFPT_ERROR
	OFPTEchoRequest      = 2  // OFPT_ECHO_REQUEST
	OFPTEchoReply        = 3  // OFPT_ECHO_REPLY
	OFPTExperimenter     = 4  // OFPT_EXPERIMENTER
	OFPTFeaturesRequest  = 5  // OFPT_FEATURES_REQUEST
	OFPTFeaturesReply    = 6  // OFPT_FEATURES_REPLY
	OFPTGetConfigRequest = 7  // OFPT_GET_CONFIG_REQUEST
	OFPTGetConfigReply   = 8  // OFPT_GET_CONFIG_REPLY
	OFPTSetConfig        = 9  // OFPT_SET_CONFIG
	OFPTPacketIn         = 10 // OFPT_PACKET_IN
	OFPTFlowRemoved      = 11 // OFPT_FLOW_REMOVED
	OFPTPortStatus       = 12 // OFPT_PORT_STATUS
	OFPTPacketOut        = 13 // OFPT_PACKET_OUT
	OFPTFlowMod          = 14 // OFPT_FLOW_MOD
	OFPTGroupMod         = 15 // OFPT_GROUP_MOD
	OFPTPortMod          = 16 // OFPT_PORT_MOD
	OFPTTableMod         = 17 // OFPT_TABLE_MOD
	OFPTStatsRequest     = 18 // OFPT_STATS_REQUEST
	OFPTStatsReply       = 19 // OFPT_STATS_REPLY
	OFPTBarrierRequest   = 20 // OFPT_BARRIER_REQUEST
	OFPTBarrierReply     = 21 // OFPT_BARRIER_REPLY
	OFPTRoleRequest      = 24 // OFPT_ROLE_REQUEST
	OFPTRoleReply        = 25 // OFPT_ROLE_REPLY
	OFPTGetAsyncRequest  = 26 // OFPT_GET_ASYNC_REQUEST
	OFPTGetAsyncReply    = 27 // OFPT_GET_ASYNC_REPLY
	OFPTSetAsync         = 28 // OFPT_SET_ASYNC
	OFPTMeterMod         = 29 // OFPT_METER_MOD
	OFPTRoleStatus       = 30 // OFPT_ROLE_STATUS
	OFPTTableStatus      = 31 // OFPT_TABLE_STATUS
	OFPTRequestforward   = 32 // OFPT_REQUESTFORWARD
	OFPTBundleControl    = 33 // OFPT_BUNDLE_CONTROL
	OFPTBundleAddMessage = 34 // OFPT_BUNDLE_ADD_MESSAGE
	OFPTControllerStatus = 35 // OFPT_CONTROLLER_STATUS
)

type Type uint8

func (self Type) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("\"%s\"", self)), nil
}

func (self Type) String() string {
	switch self {
	case OFPTHello:
		return "hello"
	case OFPTError:
		return "error"
	case OFPTEchoRequest:
		return "echo_request"
	case OFPTEchoReply:
		return "echo_reply"
	case OFPTExperimenter:
		return "experimenter"
	case OFPTFeaturesRequest:
		return "features_request"
	case OFPTFeaturesReply:
		return "features_reply"
	case OFPTGetConfigRequest:
		return "get_config_request"
	case OFPTGetConfigReply:
		return "get_config_reply"
	case OFPTSetConfig:
		return "set_config"
	case OFPTPacketIn:
		return "packet_in"
	case OFPTFlowRemoved:
		return "flow_removed"
	case OFPTPortStatus:
		return "port_status"
	case OFPTPacketOut:
		return "packet_out"
	case OFPTFlowMod:
		return "flow_mod"
	case OFPTGroupMod:
		return "group_mod"
	case OFPTPortMod:
		return "port_mod"
	case OFPTTableMod:
		return "table_mod"
	case OFPTStatsRequest:
		return "stats_request"
	case OFPTStatsReply:
		return "stats_reply"
	case OFPTBarrierRequest:
		return "barrier_request"
	case OFPTBarrierReply:
		return "barrier_reply"
	case OFPTRoleRequest:
		return "role_request"
	case OFPTRoleReply:
		return "role_reply"
	case OFPTGetAsyncRequest:
		return "get_async_request"
	case OFPTGetAsyncReply:
		return "get_async_reply"
	case OFPTSetAsync:
		return "set_async"
	case OFPTMeterMod:
		return "meter_mod"
	case OFPTRoleStatus:
		return "role_status"
	case OFPTTableStatus:
		return "table_status"
	case OFPTRequestforward:
		return "requestforward"
	case OFPTBundleControl:
		return "bundle_control"
	case OFPTBundleAddMessage:
		return "bundle_add_message"
	case OFPTControllerStatus:
		return "controller_status"
	default:
		return fmt.Sprintf("%d", self)
	}
}

const (
	// Identifiers from group ofp_vlan_id
	OFPVIDNone    = 0    // OFPVID_NONE
	OFPVIDPresent = 4096 // OFPVID_PRESENT
)

type VlanId uint16

func (self VlanId) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), nil
}
