diff --git a/vendor/github.com/skydive-project/goloxi/of13/const.go b/vendor/github.com/skydive-project/goloxi/of13/const.go
new file mode 100644
index 0000000..f1e830e
--- /dev/null
+++ b/vendor/github.com/skydive-project/goloxi/of13/const.go
@@ -0,0 +1,3016 @@
+/*
+ * 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 of13
+
+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
+	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
+	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
+)
+
+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
+)
+
+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_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
+)
+
+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_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_controller_role_reason
+	BSNControllerRoleReasonMasterRequest = 0 // OFP_BSN_CONTROLLER_ROLE_REASON_MASTER_REQUEST
+	BSNControllerRoleReasonConfig        = 1 // OFP_BSN_CONTROLLER_ROLE_REASON_CONFIG
+	BSNControllerRoleReasonExperimenter  = 2 // OFP_BSN_CONTROLLER_ROLE_REASON_EXPERIMENTER
+)
+
+type BsnControllerRoleReason uint8
+
+func (self BsnControllerRoleReason) 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_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_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_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
+)
+
+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")
+	}
+	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_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
+)
+
+type BsnTunnelType uint64
+
+func (self BsnTunnelType) MarshalJSON() ([]byte, error) {
+	var flags []string
+	if self&BSNTunnelL2Gre == BSNTunnelL2Gre {
+		flags = append(flags, "\"BSNTunnelL2Gre\": 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_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
+)
+
+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")
+	}
+	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_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_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
+	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
+)
+
+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_removed_reason
+	OFPRRIdleTimeout = 0 // OFPRR_IDLE_TIMEOUT
+	OFPRRHardTimeout = 1 // OFPRR_HARD_TIMEOUT
+	OFPRRDelete      = 2 // OFPRR_DELETE
+	OFPRRGroupDelete = 3 // OFPRR_GROUP_DELETE
+)
+
+type FlowRemovedReason uint8
+
+func (self FlowRemovedReason) 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_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
+)
+
+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
+)
+
+type GroupModFailedCode uint16
+
+func (self GroupModFailedCode) MarshalJSON() ([]byte, error) {
+	return []byte(fmt.Sprintf("%d", self)), nil
+}
+
+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_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
+	OFPITMeter         = 6     // OFPIT_METER
+	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&OFPITMeter == OFPITMeter {
+		flags = append(flags, "\"Meter\": 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_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_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
+	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_packet_in_reason
+	OFPRNoMatch                     = 0   // OFPR_NO_MATCH
+	OFPRAction                      = 1   // OFPR_ACTION
+	OFPRInvalidTtl                  = 2   // OFPR_INVALID_TTL
+	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
+	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_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_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_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
+	OFPQTMinRate      = 1     // OFPQT_MIN_RATE
+	OFPQTMaxRate      = 2     // OFPQT_MAX_RATE
+	OFPQTExperimenter = 65535 // OFPQT_EXPERIMENTER
+)
+
+type QueueProperties uint16
+
+func (self QueueProperties) MarshalJSON() ([]byte, error) {
+	return []byte(fmt.Sprintf("%d", self)), nil
+}
+
+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_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
+	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
+)
+
+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
+)
+
+type TableConfig uint32
+
+func (self TableConfig) MarshalJSON() ([]byte, error) {
+	var flags []string
+	if self&OFPTCDeprecatedMask == OFPTCDeprecatedMask {
+		flags = append(flags, "\"OFPTCDeprecatedMask\": 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
+	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_failed_code
+	OFPTFFCBadTable    = 0 // OFPTFFC_BAD_TABLE
+	OFPTFFCBadMetadata = 1 // OFPTFFC_BAD_METADATA
+	OFPTFFCBadType     = 2 // OFPTFFC_BAD_TYPE
+	OFPTFFCBadLen      = 3 // OFPTFFC_BAD_LEN
+	OFPTFFCBadArgument = 4 // OFPTFFC_BAD_ARGUMENT
+	OFPTFFCEperm       = 5 // OFPTFFC_EPERM
+)
+
+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_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
+	OFPTQueueGetConfigRequest = 22 // OFPT_QUEUE_GET_CONFIG_REQUEST
+	OFPTQueueGetConfigReply   = 23 // OFPT_QUEUE_GET_CONFIG_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
+)
+
+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 OFPTQueueGetConfigRequest:
+		return "queue_get_config_request"
+	case OFPTQueueGetConfigReply:
+		return "queue_get_config_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"
+	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
+}
