/*
 * 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 of10

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           = 65535      // OFP_VLAN_NONE
	OFPFWICMPType      = 64         // OFPFW_ICMP_TYPE
	OFPFWICMPCode      = 128        // OFPFW_ICMP_CODE
	DlTypeEth2Cutoff   = 1536       // OFP_DL_TYPE_ETH2_CUTOFF
	DlTypeNotEthType   = 1535       // OFP_DL_TYPE_NOT_ETH_TYPE
	FlowPermanent      = 0          // OFP_FLOW_PERMANENT
	DefaultPriority    = 32768      // OFP_DEFAULT_PRIORITY
	DescStrLen         = 256        // DESC_STR_LEN
	SerialNumLen       = 32         // SERIAL_NUM_LEN
	OFPQAll            = 4294967295 // OFPQ_ALL
	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_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_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
	OFPATSetVLANVid   = 1     // OFPAT_SET_VLAN_VID
	OFPATSetVLANPCP   = 2     // OFPAT_SET_VLAN_PCP
	OFPATStripVLAN    = 3     // OFPAT_STRIP_VLAN
	OFPATSetDlSrc     = 4     // OFPAT_SET_DL_SRC
	OFPATSetDlDst     = 5     // OFPAT_SET_DL_DST
	OFPATSetNwSrc     = 6     // OFPAT_SET_NW_SRC
	OFPATSetNwDst     = 7     // OFPAT_SET_NW_DST
	OFPATSetNwTos     = 8     // OFPAT_SET_NW_TOS
	OFPATSetTpSrc     = 9     // OFPAT_SET_TP_SRC
	OFPATSetTpDst     = 10    // OFPAT_SET_TP_DST
	OFPATEnqueue      = 11    // OFPAT_ENQUEUE
	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_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
)

type BadActionCode uint16

func (self BadActionCode) 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
	OFPBRCBadSubtype      = 4 // OFPBRC_BAD_SUBTYPE
	OFPBRCEperm           = 5 // OFPBRC_EPERM
	OFPBRCBadLen          = 6 // OFPBRC_BAD_LEN
	OFPBRCBufferEmpty     = 7 // OFPBRC_BUFFER_EMPTY
	OFPBRCBufferUnknown   = 8 // OFPBRC_BUFFER_UNKNOWN
)

type BadRequestCode uint16

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

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_capabilities
	OFPCFlowStats  = 1   // OFPC_FLOW_STATS
	OFPCTableStats = 2   // OFPC_TABLE_STATS
	OFPCPortStats  = 4   // OFPC_PORT_STATS
	OFPCSTP        = 8   // OFPC_STP
	OFPCReserved   = 16  // OFPC_RESERVED
	OFPCIpReasm    = 32  // OFPC_IP_REASM
	OFPCQueueStats = 64  // OFPC_QUEUE_STATS
	OFPCARPMatchIp = 128 // OFPC_ARP_MATCH_IP
)

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&OFPCSTP == OFPCSTP {
		flags = append(flags, "\"Stp\": true")
	}
	if self&OFPCReserved == OFPCReserved {
		flags = append(flags, "\"Reserved\": true")
	}
	if self&OFPCIpReasm == OFPCIpReasm {
		flags = append(flags, "\"IpReasm\": true")
	}
	if self&OFPCQueueStats == OFPCQueueStats {
		flags = append(flags, "\"QueueStats\": true")
	}
	if self&OFPCARPMatchIp == OFPCARPMatchIp {
		flags = append(flags, "\"ArpMatchIp\": 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_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
	OFPETFlowModFailed = 3 // OFPET_FLOW_MOD_FAILED
	OFPETPortModFailed = 4 // OFPET_PORT_MOD_FAILED
	OFPETQueueOpFailed = 5 // OFPET_QUEUE_OP_FAILED
)

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 uint16

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

const (
	// Identifiers from group ofp_flow_mod_failed_code
	OFPFMFCAllTablesFull   = 0 // OFPFMFC_ALL_TABLES_FULL
	OFPFMFCOverlap         = 1 // OFPFMFC_OVERLAP
	OFPFMFCEperm           = 2 // OFPFMFC_EPERM
	OFPFMFCBadEmergTimeout = 3 // OFPFMFC_BAD_EMERG_TIMEOUT
	OFPFMFCBadCommand      = 4 // OFPFMFC_BAD_COMMAND
	OFPFMFCUnsupported     = 5 // OFPFMFC_UNSUPPORTED
)

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
	OFPFFEmerg        = 4 // OFPFF_EMERG
)

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&OFPFFEmerg == OFPFFEmerg {
		flags = append(flags, "\"Emerg\": 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
)

type FlowRemovedReason uint8

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

const (
	// Identifiers from group ofp_flow_wildcards
	OFPFWInPort     = 1       // OFPFW_IN_PORT
	OFPFWDlVLAN     = 2       // OFPFW_DL_VLAN
	OFPFWDlSrc      = 4       // OFPFW_DL_SRC
	OFPFWNwDstBits  = 6       // OFPFW_NW_DST_BITS
	OFPFWNwSrcBits  = 6       // OFPFW_NW_SRC_BITS
	OFPFWNwSrcShift = 8       // OFPFW_NW_SRC_SHIFT
	OFPFWDlDst      = 8       // OFPFW_DL_DST
	OFPFWNwDstShift = 14      // OFPFW_NW_DST_SHIFT
	OFPFWDlType     = 16      // OFPFW_DL_TYPE
	OFPFWNwProto    = 32      // OFPFW_NW_PROTO
	OFPFWTpSrc      = 64      // OFPFW_TP_SRC
	OFPFWTpDst      = 128     // OFPFW_TP_DST
	OFPFWNwSrcAll   = 8192    // OFPFW_NW_SRC_ALL
	OFPFWNwSrcMask  = 16128   // OFPFW_NW_SRC_MASK
	OFPFWNwDstAll   = 524288  // OFPFW_NW_DST_ALL
	OFPFWNwDstMask  = 1032192 // OFPFW_NW_DST_MASK
	OFPFWDlVLANPCP  = 1048576 // OFPFW_DL_VLAN_PCP
	OFPFWNwTos      = 2097152 // OFPFW_NW_TOS
	OFPFWAll        = 4194303 // OFPFW_ALL
)

type FlowWildcards uint32

func (self FlowWildcards) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPFWInPort == OFPFWInPort {
		flags = append(flags, "\"InPort\": true")
	}
	if self&OFPFWDlVLAN == OFPFWDlVLAN {
		flags = append(flags, "\"DlVLAN\": true")
	}
	if self&OFPFWDlSrc == OFPFWDlSrc {
		flags = append(flags, "\"DlSrc\": true")
	}
	if self&OFPFWNwDstBits == OFPFWNwDstBits {
		flags = append(flags, "\"NwDstBits\": true")
	}
	if self&OFPFWNwSrcBits == OFPFWNwSrcBits {
		flags = append(flags, "\"NwSrcBits\": true")
	}
	if self&OFPFWNwSrcShift == OFPFWNwSrcShift {
		flags = append(flags, "\"NwSrcShift\": true")
	}
	if self&OFPFWDlDst == OFPFWDlDst {
		flags = append(flags, "\"DlDst\": true")
	}
	if self&OFPFWNwDstShift == OFPFWNwDstShift {
		flags = append(flags, "\"NwDstShift\": true")
	}
	if self&OFPFWDlType == OFPFWDlType {
		flags = append(flags, "\"DlType\": true")
	}
	if self&OFPFWNwProto == OFPFWNwProto {
		flags = append(flags, "\"NwProto\": true")
	}
	if self&OFPFWTpSrc == OFPFWTpSrc {
		flags = append(flags, "\"TpSrc\": true")
	}
	if self&OFPFWTpDst == OFPFWTpDst {
		flags = append(flags, "\"TpDst\": true")
	}
	if self&OFPFWNwSrcAll == OFPFWNwSrcAll {
		flags = append(flags, "\"NwSrcAll\": true")
	}
	if self&OFPFWNwSrcMask == OFPFWNwSrcMask {
		flags = append(flags, "\"NwSrcMask\": true")
	}
	if self&OFPFWNwDstAll == OFPFWNwDstAll {
		flags = append(flags, "\"NwDstAll\": true")
	}
	if self&OFPFWNwDstMask == OFPFWNwDstMask {
		flags = append(flags, "\"NwDstMask\": true")
	}
	if self&OFPFWDlVLANPCP == OFPFWDlVLANPCP {
		flags = append(flags, "\"DlVLANPCP\": true")
	}
	if self&OFPFWNwTos == OFPFWNwTos {
		flags = append(flags, "\"NwTos\": true")
	}
	if self&OFPFWAll == OFPFWAll {
		flags = append(flags, "\"All\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), 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_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_nicira_controller_role
	NxRoleOther  = 0 // NX_ROLE_OTHER
	NxRoleMaster = 1 // NX_ROLE_MASTER
	NxRoleSlave  = 2 // NX_ROLE_SLAVE
)

type NiciraControllerRole uint32

func (self NiciraControllerRole) 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
)

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        = 0xff00 // OFPP_MAX
	OFPPInPort     = 0xfff8 // OFPP_IN_PORT
	OFPPTable      = 0xfff9 // OFPP_TABLE
	OFPPNormal     = 0xfffa // OFPP_NORMAL
	OFPPFlood      = 0xfffb // OFPP_FLOOD
	OFPPAll        = 0xfffc // OFPP_ALL
	OFPPController = 0xfffd // OFPP_CONTROLLER
	OFPPLocal      = 0xfffe // OFPP_LOCAL
	OFPPNone       = 0xffff // OFPP_NONE
)

type Port uint16

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
	OFPPCNoSTP         = 2          // OFPPC_NO_STP
	OFPPCNoRecv        = 4          // OFPPC_NO_RECV
	OFPPCNoRecvSTP     = 8          // OFPPC_NO_RECV_STP
	OFPPCNoFlood       = 16         // OFPPC_NO_FLOOD
	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&OFPPCNoSTP == OFPPCNoSTP {
		flags = append(flags, "\"NoSTP\": true")
	}
	if self&OFPPCNoRecv == OFPPCNoRecv {
		flags = append(flags, "\"NoRecv\": true")
	}
	if self&OFPPCNoRecvSTP == OFPPCNoRecvSTP {
		flags = append(flags, "\"NoRecvSTP\": true")
	}
	if self&OFPPCNoFlood == OFPPCNoFlood {
		flags = append(flags, "\"NoFlood\": 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_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
	OFPPFCopper    = 128  // OFPPF_COPPER
	OFPPFFiber     = 256  // OFPPF_FIBER
	OFPPFAutoneg   = 512  // OFPPF_AUTONEG
	OFPPFPause     = 1024 // OFPPF_PAUSE
	OFPPFPauseAsym = 2048 // OFPPF_PAUSE_ASYM
)

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&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")
	}
	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
)

type PortModFailedCode uint16

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

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
	OFPPSSTPListen  = 0   // OFPPS_STP_LISTEN
	OFPPSSTPLearn   = 256 // OFPPS_STP_LEARN
	OFPPSSTPForward = 512 // OFPPS_STP_FORWARD
	OFPPSSTPBlock   = 768 // OFPPS_STP_BLOCK
	OFPPSSTPMask    = 768 // OFPPS_STP_MASK
)

type PortState uint32

func (self PortState) MarshalJSON() ([]byte, error) {
	var flags []string
	if self&OFPPSLinkDown == OFPPSLinkDown {
		flags = append(flags, "\"LinkDown\": true")
	}
	if self&OFPPSSTPListen == OFPPSSTPListen {
		flags = append(flags, "\"StpListen\": true")
	}
	if self&OFPPSSTPLearn == OFPPSSTPLearn {
		flags = append(flags, "\"StpLearn\": true")
	}
	if self&OFPPSSTPForward == OFPPSSTPForward {
		flags = append(flags, "\"StpForward\": true")
	}
	if self&OFPPSSTPBlock == OFPPSSTPBlock {
		flags = append(flags, "\"StpBlock\": true")
	}
	if self&OFPPSSTPMask == OFPPSSTPMask {
		flags = append(flags, "\"StpMask\": true")
	}
	return []byte("{" + strings.Join(flags, ", ") + "}"), nil
}

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_properties
	OFPQTNone    = 0 // OFPQT_NONE
	OFPQTMinRate = 1 // OFPQT_MIN_RATE
)

type QueueProperties uint32

func (self QueueProperties) MarshalJSON() ([]byte, error) {
	return []byte(fmt.Sprintf("%d", self)), 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
)

type StatsRequestFlags uint16

func (self StatsRequestFlags) MarshalJSON() ([]byte, error) {
	var flags []string
	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
	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_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
	OFPTPortMod               = 15 // OFPT_PORT_MOD
	OFPTStatsRequest          = 16 // OFPT_STATS_REQUEST
	OFPTStatsReply            = 17 // OFPT_STATS_REPLY
	OFPTBarrierRequest        = 18 // OFPT_BARRIER_REQUEST
	OFPTBarrierReply          = 19 // OFPT_BARRIER_REPLY
	OFPTQueueGetConfigRequest = 20 // OFPT_QUEUE_GET_CONFIG_REQUEST
	OFPTQueueGetConfigReply   = 21 // OFPT_QUEUE_GET_CONFIG_REPLY
)

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 OFPTPortMod:
		return "port_mod"
	case OFPTStatsRequest:
		return "stats_request"
	case OFPTStatsReply:
		return "stats_reply"
	case OFPTBarrierRequest:
		return "barrier_request"
	case OFPTBarrierReply:
		return "barrier_reply"
	case OFPTQueueGetConfigRequest:
		return "queue_get_config_request"
	case OFPTQueueGetConfigReply:
		return "queue_get_config_reply"
	default:
		return fmt.Sprintf("%d", self)
	}
}
