// Code generated by protoc-gen-go. DO NOT EDIT.
// source: voltha_protos/openflow_13.proto

package openflow_13 // import "github.com/opencord/voltha-protos/go/openflow_13"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import common "github.com/opencord/voltha-protos/go/common"
import _ "google.golang.org/genproto/googleapis/api/annotations"

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package

// InlineNode from public import voltha_protos/yang_options.proto
type InlineNode = common.InlineNode

// RpcReturnDef from public import voltha_protos/yang_options.proto
type RpcReturnDef = common.RpcReturnDef

// MessageParserOption from public import voltha_protos/yang_options.proto
type MessageParserOption = common.MessageParserOption

var MessageParserOption_name = common.MessageParserOption_name
var MessageParserOption_value = common.MessageParserOption_value

const MessageParserOption_MOVE_TO_PARENT_LEVEL = MessageParserOption(common.MessageParserOption_MOVE_TO_PARENT_LEVEL)
const MessageParserOption_CREATE_BOTH_GROUPING_AND_CONTAINER = MessageParserOption(common.MessageParserOption_CREATE_BOTH_GROUPING_AND_CONTAINER)

// yang_child_rule from public import voltha_protos/yang_options.proto
var E_YangChildRule = common.E_YangChildRule

// yang_message_rule from public import voltha_protos/yang_options.proto
var E_YangMessageRule = common.E_YangMessageRule

// yang_inline_node from public import voltha_protos/yang_options.proto
var E_YangInlineNode = common.E_YangInlineNode

// yang_xml_tag from public import voltha_protos/yang_options.proto
var E_YangXmlTag = common.E_YangXmlTag

// Port numbering. Ports are numbered starting from 1.
type OfpPortNo int32

const (
	OfpPortNo_OFPP_INVALID OfpPortNo = 0
	// Maximum number of physical and logical switch ports.
	OfpPortNo_OFPP_MAX OfpPortNo = 2147483392
	// Reserved OpenFlow Port (fake output "ports").
	OfpPortNo_OFPP_IN_PORT    OfpPortNo = 2147483640
	OfpPortNo_OFPP_TABLE      OfpPortNo = 2147483641
	OfpPortNo_OFPP_NORMAL     OfpPortNo = 2147483642
	OfpPortNo_OFPP_FLOOD      OfpPortNo = 2147483643
	OfpPortNo_OFPP_ALL        OfpPortNo = 2147483644
	OfpPortNo_OFPP_CONTROLLER OfpPortNo = 2147483645
	OfpPortNo_OFPP_LOCAL      OfpPortNo = 2147483646
	OfpPortNo_OFPP_ANY        OfpPortNo = 2147483647
)

var OfpPortNo_name = map[int32]string{
	0:          "OFPP_INVALID",
	2147483392: "OFPP_MAX",
	2147483640: "OFPP_IN_PORT",
	2147483641: "OFPP_TABLE",
	2147483642: "OFPP_NORMAL",
	2147483643: "OFPP_FLOOD",
	2147483644: "OFPP_ALL",
	2147483645: "OFPP_CONTROLLER",
	2147483646: "OFPP_LOCAL",
	2147483647: "OFPP_ANY",
}
var OfpPortNo_value = map[string]int32{
	"OFPP_INVALID":    0,
	"OFPP_MAX":        2147483392,
	"OFPP_IN_PORT":    2147483640,
	"OFPP_TABLE":      2147483641,
	"OFPP_NORMAL":     2147483642,
	"OFPP_FLOOD":      2147483643,
	"OFPP_ALL":        2147483644,
	"OFPP_CONTROLLER": 2147483645,
	"OFPP_LOCAL":      2147483646,
	"OFPP_ANY":        2147483647,
}

func (x OfpPortNo) String() string {
	return proto.EnumName(OfpPortNo_name, int32(x))
}
func (OfpPortNo) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{0}
}

type OfpType int32

const (
	// Immutable messages.
	OfpType_OFPT_HELLO        OfpType = 0
	OfpType_OFPT_ERROR        OfpType = 1
	OfpType_OFPT_ECHO_REQUEST OfpType = 2
	OfpType_OFPT_ECHO_REPLY   OfpType = 3
	OfpType_OFPT_EXPERIMENTER OfpType = 4
	// Switch configuration messages.
	OfpType_OFPT_FEATURES_REQUEST   OfpType = 5
	OfpType_OFPT_FEATURES_REPLY     OfpType = 6
	OfpType_OFPT_GET_CONFIG_REQUEST OfpType = 7
	OfpType_OFPT_GET_CONFIG_REPLY   OfpType = 8
	OfpType_OFPT_SET_CONFIG         OfpType = 9
	// Asynchronous messages.
	OfpType_OFPT_PACKET_IN    OfpType = 10
	OfpType_OFPT_FLOW_REMOVED OfpType = 11
	OfpType_OFPT_PORT_STATUS  OfpType = 12
	// Controller command messages.
	OfpType_OFPT_PACKET_OUT OfpType = 13
	OfpType_OFPT_FLOW_MOD   OfpType = 14
	OfpType_OFPT_GROUP_MOD  OfpType = 15
	OfpType_OFPT_PORT_MOD   OfpType = 16
	OfpType_OFPT_TABLE_MOD  OfpType = 17
	// Multipart messages.
	OfpType_OFPT_MULTIPART_REQUEST OfpType = 18
	OfpType_OFPT_MULTIPART_REPLY   OfpType = 19
	// Barrier messages.
	OfpType_OFPT_BARRIER_REQUEST OfpType = 20
	OfpType_OFPT_BARRIER_REPLY   OfpType = 21
	// Queue Configuration messages.
	OfpType_OFPT_QUEUE_GET_CONFIG_REQUEST OfpType = 22
	OfpType_OFPT_QUEUE_GET_CONFIG_REPLY   OfpType = 23
	// Controller role change request messages.
	OfpType_OFPT_ROLE_REQUEST OfpType = 24
	OfpType_OFPT_ROLE_REPLY   OfpType = 25
	// Asynchronous message configuration.
	OfpType_OFPT_GET_ASYNC_REQUEST OfpType = 26
	OfpType_OFPT_GET_ASYNC_REPLY   OfpType = 27
	OfpType_OFPT_SET_ASYNC         OfpType = 28
	// Meters and rate limiters configuration messages.
	OfpType_OFPT_METER_MOD OfpType = 29
)

var OfpType_name = map[int32]string{
	0:  "OFPT_HELLO",
	1:  "OFPT_ERROR",
	2:  "OFPT_ECHO_REQUEST",
	3:  "OFPT_ECHO_REPLY",
	4:  "OFPT_EXPERIMENTER",
	5:  "OFPT_FEATURES_REQUEST",
	6:  "OFPT_FEATURES_REPLY",
	7:  "OFPT_GET_CONFIG_REQUEST",
	8:  "OFPT_GET_CONFIG_REPLY",
	9:  "OFPT_SET_CONFIG",
	10: "OFPT_PACKET_IN",
	11: "OFPT_FLOW_REMOVED",
	12: "OFPT_PORT_STATUS",
	13: "OFPT_PACKET_OUT",
	14: "OFPT_FLOW_MOD",
	15: "OFPT_GROUP_MOD",
	16: "OFPT_PORT_MOD",
	17: "OFPT_TABLE_MOD",
	18: "OFPT_MULTIPART_REQUEST",
	19: "OFPT_MULTIPART_REPLY",
	20: "OFPT_BARRIER_REQUEST",
	21: "OFPT_BARRIER_REPLY",
	22: "OFPT_QUEUE_GET_CONFIG_REQUEST",
	23: "OFPT_QUEUE_GET_CONFIG_REPLY",
	24: "OFPT_ROLE_REQUEST",
	25: "OFPT_ROLE_REPLY",
	26: "OFPT_GET_ASYNC_REQUEST",
	27: "OFPT_GET_ASYNC_REPLY",
	28: "OFPT_SET_ASYNC",
	29: "OFPT_METER_MOD",
}
var OfpType_value = map[string]int32{
	"OFPT_HELLO":                    0,
	"OFPT_ERROR":                    1,
	"OFPT_ECHO_REQUEST":             2,
	"OFPT_ECHO_REPLY":               3,
	"OFPT_EXPERIMENTER":             4,
	"OFPT_FEATURES_REQUEST":         5,
	"OFPT_FEATURES_REPLY":           6,
	"OFPT_GET_CONFIG_REQUEST":       7,
	"OFPT_GET_CONFIG_REPLY":         8,
	"OFPT_SET_CONFIG":               9,
	"OFPT_PACKET_IN":                10,
	"OFPT_FLOW_REMOVED":             11,
	"OFPT_PORT_STATUS":              12,
	"OFPT_PACKET_OUT":               13,
	"OFPT_FLOW_MOD":                 14,
	"OFPT_GROUP_MOD":                15,
	"OFPT_PORT_MOD":                 16,
	"OFPT_TABLE_MOD":                17,
	"OFPT_MULTIPART_REQUEST":        18,
	"OFPT_MULTIPART_REPLY":          19,
	"OFPT_BARRIER_REQUEST":          20,
	"OFPT_BARRIER_REPLY":            21,
	"OFPT_QUEUE_GET_CONFIG_REQUEST": 22,
	"OFPT_QUEUE_GET_CONFIG_REPLY":   23,
	"OFPT_ROLE_REQUEST":             24,
	"OFPT_ROLE_REPLY":               25,
	"OFPT_GET_ASYNC_REQUEST":        26,
	"OFPT_GET_ASYNC_REPLY":          27,
	"OFPT_SET_ASYNC":                28,
	"OFPT_METER_MOD":                29,
}

func (x OfpType) String() string {
	return proto.EnumName(OfpType_name, int32(x))
}
func (OfpType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{1}
}

// Hello elements types.
type OfpHelloElemType int32

const (
	OfpHelloElemType_OFPHET_INVALID       OfpHelloElemType = 0
	OfpHelloElemType_OFPHET_VERSIONBITMAP OfpHelloElemType = 1
)

var OfpHelloElemType_name = map[int32]string{
	0: "OFPHET_INVALID",
	1: "OFPHET_VERSIONBITMAP",
}
var OfpHelloElemType_value = map[string]int32{
	"OFPHET_INVALID":       0,
	"OFPHET_VERSIONBITMAP": 1,
}

func (x OfpHelloElemType) String() string {
	return proto.EnumName(OfpHelloElemType_name, int32(x))
}
func (OfpHelloElemType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{2}
}

type OfpConfigFlags int32

const (
	// Handling of IP fragments.
	OfpConfigFlags_OFPC_FRAG_NORMAL OfpConfigFlags = 0
	OfpConfigFlags_OFPC_FRAG_DROP   OfpConfigFlags = 1
	OfpConfigFlags_OFPC_FRAG_REASM  OfpConfigFlags = 2
	OfpConfigFlags_OFPC_FRAG_MASK   OfpConfigFlags = 3
)

var OfpConfigFlags_name = map[int32]string{
	0: "OFPC_FRAG_NORMAL",
	1: "OFPC_FRAG_DROP",
	2: "OFPC_FRAG_REASM",
	3: "OFPC_FRAG_MASK",
}
var OfpConfigFlags_value = map[string]int32{
	"OFPC_FRAG_NORMAL": 0,
	"OFPC_FRAG_DROP":   1,
	"OFPC_FRAG_REASM":  2,
	"OFPC_FRAG_MASK":   3,
}

func (x OfpConfigFlags) String() string {
	return proto.EnumName(OfpConfigFlags_name, int32(x))
}
func (OfpConfigFlags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{3}
}

// Flags to configure the table. Reserved for future use.
type OfpTableConfig int32

const (
	OfpTableConfig_OFPTC_INVALID         OfpTableConfig = 0
	OfpTableConfig_OFPTC_DEPRECATED_MASK OfpTableConfig = 3
)

var OfpTableConfig_name = map[int32]string{
	0: "OFPTC_INVALID",
	3: "OFPTC_DEPRECATED_MASK",
}
var OfpTableConfig_value = map[string]int32{
	"OFPTC_INVALID":         0,
	"OFPTC_DEPRECATED_MASK": 3,
}

func (x OfpTableConfig) String() string {
	return proto.EnumName(OfpTableConfig_name, int32(x))
}
func (OfpTableConfig) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{4}
}

// Table numbering. Tables can use any number up to OFPT_MAX.
type OfpTable int32

const (
	OfpTable_OFPTT_INVALID OfpTable = 0
	// Last usable table number.
	OfpTable_OFPTT_MAX OfpTable = 254
	// Fake tables.
	OfpTable_OFPTT_ALL OfpTable = 255
)

var OfpTable_name = map[int32]string{
	0:   "OFPTT_INVALID",
	254: "OFPTT_MAX",
	255: "OFPTT_ALL",
}
var OfpTable_value = map[string]int32{
	"OFPTT_INVALID": 0,
	"OFPTT_MAX":     254,
	"OFPTT_ALL":     255,
}

func (x OfpTable) String() string {
	return proto.EnumName(OfpTable_name, int32(x))
}
func (OfpTable) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{5}
}

// Capabilities supported by the datapath.
type OfpCapabilities int32

const (
	OfpCapabilities_OFPC_INVALID      OfpCapabilities = 0
	OfpCapabilities_OFPC_FLOW_STATS   OfpCapabilities = 1
	OfpCapabilities_OFPC_TABLE_STATS  OfpCapabilities = 2
	OfpCapabilities_OFPC_PORT_STATS   OfpCapabilities = 4
	OfpCapabilities_OFPC_GROUP_STATS  OfpCapabilities = 8
	OfpCapabilities_OFPC_IP_REASM     OfpCapabilities = 32
	OfpCapabilities_OFPC_QUEUE_STATS  OfpCapabilities = 64
	OfpCapabilities_OFPC_PORT_BLOCKED OfpCapabilities = 256
)

var OfpCapabilities_name = map[int32]string{
	0:   "OFPC_INVALID",
	1:   "OFPC_FLOW_STATS",
	2:   "OFPC_TABLE_STATS",
	4:   "OFPC_PORT_STATS",
	8:   "OFPC_GROUP_STATS",
	32:  "OFPC_IP_REASM",
	64:  "OFPC_QUEUE_STATS",
	256: "OFPC_PORT_BLOCKED",
}
var OfpCapabilities_value = map[string]int32{
	"OFPC_INVALID":      0,
	"OFPC_FLOW_STATS":   1,
	"OFPC_TABLE_STATS":  2,
	"OFPC_PORT_STATS":   4,
	"OFPC_GROUP_STATS":  8,
	"OFPC_IP_REASM":     32,
	"OFPC_QUEUE_STATS":  64,
	"OFPC_PORT_BLOCKED": 256,
}

func (x OfpCapabilities) String() string {
	return proto.EnumName(OfpCapabilities_name, int32(x))
}
func (OfpCapabilities) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{6}
}

// Flags to indicate behavior of the physical port.  These flags are
// used in ofp_port to describe the current configuration.  They are
// used in the ofp_port_mod message to configure the port's behavior.
type OfpPortConfig int32

const (
	OfpPortConfig_OFPPC_INVALID      OfpPortConfig = 0
	OfpPortConfig_OFPPC_PORT_DOWN    OfpPortConfig = 1
	OfpPortConfig_OFPPC_NO_RECV      OfpPortConfig = 4
	OfpPortConfig_OFPPC_NO_FWD       OfpPortConfig = 32
	OfpPortConfig_OFPPC_NO_PACKET_IN OfpPortConfig = 64
)

var OfpPortConfig_name = map[int32]string{
	0:  "OFPPC_INVALID",
	1:  "OFPPC_PORT_DOWN",
	4:  "OFPPC_NO_RECV",
	32: "OFPPC_NO_FWD",
	64: "OFPPC_NO_PACKET_IN",
}
var OfpPortConfig_value = map[string]int32{
	"OFPPC_INVALID":      0,
	"OFPPC_PORT_DOWN":    1,
	"OFPPC_NO_RECV":      4,
	"OFPPC_NO_FWD":       32,
	"OFPPC_NO_PACKET_IN": 64,
}

func (x OfpPortConfig) String() string {
	return proto.EnumName(OfpPortConfig_name, int32(x))
}
func (OfpPortConfig) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{7}
}

// Current state of the physical port.  These are not configurable from
// the controller.
type OfpPortState int32

const (
	OfpPortState_OFPPS_INVALID   OfpPortState = 0
	OfpPortState_OFPPS_LINK_DOWN OfpPortState = 1
	OfpPortState_OFPPS_BLOCKED   OfpPortState = 2
	OfpPortState_OFPPS_LIVE      OfpPortState = 4
)

var OfpPortState_name = map[int32]string{
	0: "OFPPS_INVALID",
	1: "OFPPS_LINK_DOWN",
	2: "OFPPS_BLOCKED",
	4: "OFPPS_LIVE",
}
var OfpPortState_value = map[string]int32{
	"OFPPS_INVALID":   0,
	"OFPPS_LINK_DOWN": 1,
	"OFPPS_BLOCKED":   2,
	"OFPPS_LIVE":      4,
}

func (x OfpPortState) String() string {
	return proto.EnumName(OfpPortState_name, int32(x))
}
func (OfpPortState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{8}
}

// Features of ports available in a datapath.
type OfpPortFeatures int32

const (
	OfpPortFeatures_OFPPF_INVALID    OfpPortFeatures = 0
	OfpPortFeatures_OFPPF_10MB_HD    OfpPortFeatures = 1
	OfpPortFeatures_OFPPF_10MB_FD    OfpPortFeatures = 2
	OfpPortFeatures_OFPPF_100MB_HD   OfpPortFeatures = 4
	OfpPortFeatures_OFPPF_100MB_FD   OfpPortFeatures = 8
	OfpPortFeatures_OFPPF_1GB_HD     OfpPortFeatures = 16
	OfpPortFeatures_OFPPF_1GB_FD     OfpPortFeatures = 32
	OfpPortFeatures_OFPPF_10GB_FD    OfpPortFeatures = 64
	OfpPortFeatures_OFPPF_40GB_FD    OfpPortFeatures = 128
	OfpPortFeatures_OFPPF_100GB_FD   OfpPortFeatures = 256
	OfpPortFeatures_OFPPF_1TB_FD     OfpPortFeatures = 512
	OfpPortFeatures_OFPPF_OTHER      OfpPortFeatures = 1024
	OfpPortFeatures_OFPPF_COPPER     OfpPortFeatures = 2048
	OfpPortFeatures_OFPPF_FIBER      OfpPortFeatures = 4096
	OfpPortFeatures_OFPPF_AUTONEG    OfpPortFeatures = 8192
	OfpPortFeatures_OFPPF_PAUSE      OfpPortFeatures = 16384
	OfpPortFeatures_OFPPF_PAUSE_ASYM OfpPortFeatures = 32768
)

var OfpPortFeatures_name = map[int32]string{
	0:     "OFPPF_INVALID",
	1:     "OFPPF_10MB_HD",
	2:     "OFPPF_10MB_FD",
	4:     "OFPPF_100MB_HD",
	8:     "OFPPF_100MB_FD",
	16:    "OFPPF_1GB_HD",
	32:    "OFPPF_1GB_FD",
	64:    "OFPPF_10GB_FD",
	128:   "OFPPF_40GB_FD",
	256:   "OFPPF_100GB_FD",
	512:   "OFPPF_1TB_FD",
	1024:  "OFPPF_OTHER",
	2048:  "OFPPF_COPPER",
	4096:  "OFPPF_FIBER",
	8192:  "OFPPF_AUTONEG",
	16384: "OFPPF_PAUSE",
	32768: "OFPPF_PAUSE_ASYM",
}
var OfpPortFeatures_value = map[string]int32{
	"OFPPF_INVALID":    0,
	"OFPPF_10MB_HD":    1,
	"OFPPF_10MB_FD":    2,
	"OFPPF_100MB_HD":   4,
	"OFPPF_100MB_FD":   8,
	"OFPPF_1GB_HD":     16,
	"OFPPF_1GB_FD":     32,
	"OFPPF_10GB_FD":    64,
	"OFPPF_40GB_FD":    128,
	"OFPPF_100GB_FD":   256,
	"OFPPF_1TB_FD":     512,
	"OFPPF_OTHER":      1024,
	"OFPPF_COPPER":     2048,
	"OFPPF_FIBER":      4096,
	"OFPPF_AUTONEG":    8192,
	"OFPPF_PAUSE":      16384,
	"OFPPF_PAUSE_ASYM": 32768,
}

func (x OfpPortFeatures) String() string {
	return proto.EnumName(OfpPortFeatures_name, int32(x))
}
func (OfpPortFeatures) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{9}
}

// What changed about the physical port
type OfpPortReason int32

const (
	OfpPortReason_OFPPR_ADD    OfpPortReason = 0
	OfpPortReason_OFPPR_DELETE OfpPortReason = 1
	OfpPortReason_OFPPR_MODIFY OfpPortReason = 2
)

var OfpPortReason_name = map[int32]string{
	0: "OFPPR_ADD",
	1: "OFPPR_DELETE",
	2: "OFPPR_MODIFY",
}
var OfpPortReason_value = map[string]int32{
	"OFPPR_ADD":    0,
	"OFPPR_DELETE": 1,
	"OFPPR_MODIFY": 2,
}

func (x OfpPortReason) String() string {
	return proto.EnumName(OfpPortReason_name, int32(x))
}
func (OfpPortReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{10}
}

// The match type indicates the match structure (set of fields that compose the
// match) in use. The match type is placed in the type field at the beginning
// of all match structures. The "OpenFlow Extensible Match" type corresponds
// to OXM TLV format described below and must be supported by all OpenFlow
// switches. Extensions that define other match types may be published on the
// ONF wiki. Support for extensions is optional.
type OfpMatchType int32

const (
	OfpMatchType_OFPMT_STANDARD OfpMatchType = 0
	OfpMatchType_OFPMT_OXM      OfpMatchType = 1
)

var OfpMatchType_name = map[int32]string{
	0: "OFPMT_STANDARD",
	1: "OFPMT_OXM",
}
var OfpMatchType_value = map[string]int32{
	"OFPMT_STANDARD": 0,
	"OFPMT_OXM":      1,
}

func (x OfpMatchType) String() string {
	return proto.EnumName(OfpMatchType_name, int32(x))
}
func (OfpMatchType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{11}
}

// OXM Class IDs.
// The high order bit differentiate reserved classes from member classes.
// Classes 0x0000 to 0x7FFF are member classes, allocated by ONF.
// Classes 0x8000 to 0xFFFE are reserved classes, reserved for standardisation.
type OfpOxmClass int32

const (
	OfpOxmClass_OFPXMC_NXM_0          OfpOxmClass = 0
	OfpOxmClass_OFPXMC_NXM_1          OfpOxmClass = 1
	OfpOxmClass_OFPXMC_OPENFLOW_BASIC OfpOxmClass = 32768
	OfpOxmClass_OFPXMC_EXPERIMENTER   OfpOxmClass = 65535
)

var OfpOxmClass_name = map[int32]string{
	0:     "OFPXMC_NXM_0",
	1:     "OFPXMC_NXM_1",
	32768: "OFPXMC_OPENFLOW_BASIC",
	65535: "OFPXMC_EXPERIMENTER",
}
var OfpOxmClass_value = map[string]int32{
	"OFPXMC_NXM_0":          0,
	"OFPXMC_NXM_1":          1,
	"OFPXMC_OPENFLOW_BASIC": 32768,
	"OFPXMC_EXPERIMENTER":   65535,
}

func (x OfpOxmClass) String() string {
	return proto.EnumName(OfpOxmClass_name, int32(x))
}
func (OfpOxmClass) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{12}
}

// OXM Flow field types for OpenFlow basic class.
type OxmOfbFieldTypes int32

const (
	OxmOfbFieldTypes_OFPXMT_OFB_IN_PORT        OxmOfbFieldTypes = 0
	OxmOfbFieldTypes_OFPXMT_OFB_IN_PHY_PORT    OxmOfbFieldTypes = 1
	OxmOfbFieldTypes_OFPXMT_OFB_METADATA       OxmOfbFieldTypes = 2
	OxmOfbFieldTypes_OFPXMT_OFB_ETH_DST        OxmOfbFieldTypes = 3
	OxmOfbFieldTypes_OFPXMT_OFB_ETH_SRC        OxmOfbFieldTypes = 4
	OxmOfbFieldTypes_OFPXMT_OFB_ETH_TYPE       OxmOfbFieldTypes = 5
	OxmOfbFieldTypes_OFPXMT_OFB_VLAN_VID       OxmOfbFieldTypes = 6
	OxmOfbFieldTypes_OFPXMT_OFB_VLAN_PCP       OxmOfbFieldTypes = 7
	OxmOfbFieldTypes_OFPXMT_OFB_IP_DSCP        OxmOfbFieldTypes = 8
	OxmOfbFieldTypes_OFPXMT_OFB_IP_ECN         OxmOfbFieldTypes = 9
	OxmOfbFieldTypes_OFPXMT_OFB_IP_PROTO       OxmOfbFieldTypes = 10
	OxmOfbFieldTypes_OFPXMT_OFB_IPV4_SRC       OxmOfbFieldTypes = 11
	OxmOfbFieldTypes_OFPXMT_OFB_IPV4_DST       OxmOfbFieldTypes = 12
	OxmOfbFieldTypes_OFPXMT_OFB_TCP_SRC        OxmOfbFieldTypes = 13
	OxmOfbFieldTypes_OFPXMT_OFB_TCP_DST        OxmOfbFieldTypes = 14
	OxmOfbFieldTypes_OFPXMT_OFB_UDP_SRC        OxmOfbFieldTypes = 15
	OxmOfbFieldTypes_OFPXMT_OFB_UDP_DST        OxmOfbFieldTypes = 16
	OxmOfbFieldTypes_OFPXMT_OFB_SCTP_SRC       OxmOfbFieldTypes = 17
	OxmOfbFieldTypes_OFPXMT_OFB_SCTP_DST       OxmOfbFieldTypes = 18
	OxmOfbFieldTypes_OFPXMT_OFB_ICMPV4_TYPE    OxmOfbFieldTypes = 19
	OxmOfbFieldTypes_OFPXMT_OFB_ICMPV4_CODE    OxmOfbFieldTypes = 20
	OxmOfbFieldTypes_OFPXMT_OFB_ARP_OP         OxmOfbFieldTypes = 21
	OxmOfbFieldTypes_OFPXMT_OFB_ARP_SPA        OxmOfbFieldTypes = 22
	OxmOfbFieldTypes_OFPXMT_OFB_ARP_TPA        OxmOfbFieldTypes = 23
	OxmOfbFieldTypes_OFPXMT_OFB_ARP_SHA        OxmOfbFieldTypes = 24
	OxmOfbFieldTypes_OFPXMT_OFB_ARP_THA        OxmOfbFieldTypes = 25
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_SRC       OxmOfbFieldTypes = 26
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_DST       OxmOfbFieldTypes = 27
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_FLABEL    OxmOfbFieldTypes = 28
	OxmOfbFieldTypes_OFPXMT_OFB_ICMPV6_TYPE    OxmOfbFieldTypes = 29
	OxmOfbFieldTypes_OFPXMT_OFB_ICMPV6_CODE    OxmOfbFieldTypes = 30
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_ND_TARGET OxmOfbFieldTypes = 31
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_ND_SLL    OxmOfbFieldTypes = 32
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_ND_TLL    OxmOfbFieldTypes = 33
	OxmOfbFieldTypes_OFPXMT_OFB_MPLS_LABEL     OxmOfbFieldTypes = 34
	OxmOfbFieldTypes_OFPXMT_OFB_MPLS_TC        OxmOfbFieldTypes = 35
	OxmOfbFieldTypes_OFPXMT_OFB_MPLS_BOS       OxmOfbFieldTypes = 36
	OxmOfbFieldTypes_OFPXMT_OFB_PBB_ISID       OxmOfbFieldTypes = 37
	OxmOfbFieldTypes_OFPXMT_OFB_TUNNEL_ID      OxmOfbFieldTypes = 38
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_EXTHDR    OxmOfbFieldTypes = 39
)

var OxmOfbFieldTypes_name = map[int32]string{
	0:  "OFPXMT_OFB_IN_PORT",
	1:  "OFPXMT_OFB_IN_PHY_PORT",
	2:  "OFPXMT_OFB_METADATA",
	3:  "OFPXMT_OFB_ETH_DST",
	4:  "OFPXMT_OFB_ETH_SRC",
	5:  "OFPXMT_OFB_ETH_TYPE",
	6:  "OFPXMT_OFB_VLAN_VID",
	7:  "OFPXMT_OFB_VLAN_PCP",
	8:  "OFPXMT_OFB_IP_DSCP",
	9:  "OFPXMT_OFB_IP_ECN",
	10: "OFPXMT_OFB_IP_PROTO",
	11: "OFPXMT_OFB_IPV4_SRC",
	12: "OFPXMT_OFB_IPV4_DST",
	13: "OFPXMT_OFB_TCP_SRC",
	14: "OFPXMT_OFB_TCP_DST",
	15: "OFPXMT_OFB_UDP_SRC",
	16: "OFPXMT_OFB_UDP_DST",
	17: "OFPXMT_OFB_SCTP_SRC",
	18: "OFPXMT_OFB_SCTP_DST",
	19: "OFPXMT_OFB_ICMPV4_TYPE",
	20: "OFPXMT_OFB_ICMPV4_CODE",
	21: "OFPXMT_OFB_ARP_OP",
	22: "OFPXMT_OFB_ARP_SPA",
	23: "OFPXMT_OFB_ARP_TPA",
	24: "OFPXMT_OFB_ARP_SHA",
	25: "OFPXMT_OFB_ARP_THA",
	26: "OFPXMT_OFB_IPV6_SRC",
	27: "OFPXMT_OFB_IPV6_DST",
	28: "OFPXMT_OFB_IPV6_FLABEL",
	29: "OFPXMT_OFB_ICMPV6_TYPE",
	30: "OFPXMT_OFB_ICMPV6_CODE",
	31: "OFPXMT_OFB_IPV6_ND_TARGET",
	32: "OFPXMT_OFB_IPV6_ND_SLL",
	33: "OFPXMT_OFB_IPV6_ND_TLL",
	34: "OFPXMT_OFB_MPLS_LABEL",
	35: "OFPXMT_OFB_MPLS_TC",
	36: "OFPXMT_OFB_MPLS_BOS",
	37: "OFPXMT_OFB_PBB_ISID",
	38: "OFPXMT_OFB_TUNNEL_ID",
	39: "OFPXMT_OFB_IPV6_EXTHDR",
}
var OxmOfbFieldTypes_value = map[string]int32{
	"OFPXMT_OFB_IN_PORT":        0,
	"OFPXMT_OFB_IN_PHY_PORT":    1,
	"OFPXMT_OFB_METADATA":       2,
	"OFPXMT_OFB_ETH_DST":        3,
	"OFPXMT_OFB_ETH_SRC":        4,
	"OFPXMT_OFB_ETH_TYPE":       5,
	"OFPXMT_OFB_VLAN_VID":       6,
	"OFPXMT_OFB_VLAN_PCP":       7,
	"OFPXMT_OFB_IP_DSCP":        8,
	"OFPXMT_OFB_IP_ECN":         9,
	"OFPXMT_OFB_IP_PROTO":       10,
	"OFPXMT_OFB_IPV4_SRC":       11,
	"OFPXMT_OFB_IPV4_DST":       12,
	"OFPXMT_OFB_TCP_SRC":        13,
	"OFPXMT_OFB_TCP_DST":        14,
	"OFPXMT_OFB_UDP_SRC":        15,
	"OFPXMT_OFB_UDP_DST":        16,
	"OFPXMT_OFB_SCTP_SRC":       17,
	"OFPXMT_OFB_SCTP_DST":       18,
	"OFPXMT_OFB_ICMPV4_TYPE":    19,
	"OFPXMT_OFB_ICMPV4_CODE":    20,
	"OFPXMT_OFB_ARP_OP":         21,
	"OFPXMT_OFB_ARP_SPA":        22,
	"OFPXMT_OFB_ARP_TPA":        23,
	"OFPXMT_OFB_ARP_SHA":        24,
	"OFPXMT_OFB_ARP_THA":        25,
	"OFPXMT_OFB_IPV6_SRC":       26,
	"OFPXMT_OFB_IPV6_DST":       27,
	"OFPXMT_OFB_IPV6_FLABEL":    28,
	"OFPXMT_OFB_ICMPV6_TYPE":    29,
	"OFPXMT_OFB_ICMPV6_CODE":    30,
	"OFPXMT_OFB_IPV6_ND_TARGET": 31,
	"OFPXMT_OFB_IPV6_ND_SLL":    32,
	"OFPXMT_OFB_IPV6_ND_TLL":    33,
	"OFPXMT_OFB_MPLS_LABEL":     34,
	"OFPXMT_OFB_MPLS_TC":        35,
	"OFPXMT_OFB_MPLS_BOS":       36,
	"OFPXMT_OFB_PBB_ISID":       37,
	"OFPXMT_OFB_TUNNEL_ID":      38,
	"OFPXMT_OFB_IPV6_EXTHDR":    39,
}

func (x OxmOfbFieldTypes) String() string {
	return proto.EnumName(OxmOfbFieldTypes_name, int32(x))
}
func (OxmOfbFieldTypes) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{13}
}

// The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
// special conditions.
type OfpVlanId int32

const (
	OfpVlanId_OFPVID_NONE    OfpVlanId = 0
	OfpVlanId_OFPVID_PRESENT OfpVlanId = 4096
)

var OfpVlanId_name = map[int32]string{
	0:    "OFPVID_NONE",
	4096: "OFPVID_PRESENT",
}
var OfpVlanId_value = map[string]int32{
	"OFPVID_NONE":    0,
	"OFPVID_PRESENT": 4096,
}

func (x OfpVlanId) String() string {
	return proto.EnumName(OfpVlanId_name, int32(x))
}
func (OfpVlanId) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{14}
}

// Bit definitions for IPv6 Extension Header pseudo-field.
type OfpIpv6ExthdrFlags int32

const (
	OfpIpv6ExthdrFlags_OFPIEH_INVALID OfpIpv6ExthdrFlags = 0
	OfpIpv6ExthdrFlags_OFPIEH_NONEXT  OfpIpv6ExthdrFlags = 1
	OfpIpv6ExthdrFlags_OFPIEH_ESP     OfpIpv6ExthdrFlags = 2
	OfpIpv6ExthdrFlags_OFPIEH_AUTH    OfpIpv6ExthdrFlags = 4
	OfpIpv6ExthdrFlags_OFPIEH_DEST    OfpIpv6ExthdrFlags = 8
	OfpIpv6ExthdrFlags_OFPIEH_FRAG    OfpIpv6ExthdrFlags = 16
	OfpIpv6ExthdrFlags_OFPIEH_ROUTER  OfpIpv6ExthdrFlags = 32
	OfpIpv6ExthdrFlags_OFPIEH_HOP     OfpIpv6ExthdrFlags = 64
	OfpIpv6ExthdrFlags_OFPIEH_UNREP   OfpIpv6ExthdrFlags = 128
	OfpIpv6ExthdrFlags_OFPIEH_UNSEQ   OfpIpv6ExthdrFlags = 256
)

var OfpIpv6ExthdrFlags_name = map[int32]string{
	0:   "OFPIEH_INVALID",
	1:   "OFPIEH_NONEXT",
	2:   "OFPIEH_ESP",
	4:   "OFPIEH_AUTH",
	8:   "OFPIEH_DEST",
	16:  "OFPIEH_FRAG",
	32:  "OFPIEH_ROUTER",
	64:  "OFPIEH_HOP",
	128: "OFPIEH_UNREP",
	256: "OFPIEH_UNSEQ",
}
var OfpIpv6ExthdrFlags_value = map[string]int32{
	"OFPIEH_INVALID": 0,
	"OFPIEH_NONEXT":  1,
	"OFPIEH_ESP":     2,
	"OFPIEH_AUTH":    4,
	"OFPIEH_DEST":    8,
	"OFPIEH_FRAG":    16,
	"OFPIEH_ROUTER":  32,
	"OFPIEH_HOP":     64,
	"OFPIEH_UNREP":   128,
	"OFPIEH_UNSEQ":   256,
}

func (x OfpIpv6ExthdrFlags) String() string {
	return proto.EnumName(OfpIpv6ExthdrFlags_name, int32(x))
}
func (OfpIpv6ExthdrFlags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{15}
}

type OfpActionType int32

const (
	OfpActionType_OFPAT_OUTPUT       OfpActionType = 0
	OfpActionType_OFPAT_COPY_TTL_OUT OfpActionType = 11
	OfpActionType_OFPAT_COPY_TTL_IN  OfpActionType = 12
	OfpActionType_OFPAT_SET_MPLS_TTL OfpActionType = 15
	OfpActionType_OFPAT_DEC_MPLS_TTL OfpActionType = 16
	OfpActionType_OFPAT_PUSH_VLAN    OfpActionType = 17
	OfpActionType_OFPAT_POP_VLAN     OfpActionType = 18
	OfpActionType_OFPAT_PUSH_MPLS    OfpActionType = 19
	OfpActionType_OFPAT_POP_MPLS     OfpActionType = 20
	OfpActionType_OFPAT_SET_QUEUE    OfpActionType = 21
	OfpActionType_OFPAT_GROUP        OfpActionType = 22
	OfpActionType_OFPAT_SET_NW_TTL   OfpActionType = 23
	OfpActionType_OFPAT_DEC_NW_TTL   OfpActionType = 24
	OfpActionType_OFPAT_SET_FIELD    OfpActionType = 25
	OfpActionType_OFPAT_PUSH_PBB     OfpActionType = 26
	OfpActionType_OFPAT_POP_PBB      OfpActionType = 27
	OfpActionType_OFPAT_EXPERIMENTER OfpActionType = 65535
)

var OfpActionType_name = map[int32]string{
	0:     "OFPAT_OUTPUT",
	11:    "OFPAT_COPY_TTL_OUT",
	12:    "OFPAT_COPY_TTL_IN",
	15:    "OFPAT_SET_MPLS_TTL",
	16:    "OFPAT_DEC_MPLS_TTL",
	17:    "OFPAT_PUSH_VLAN",
	18:    "OFPAT_POP_VLAN",
	19:    "OFPAT_PUSH_MPLS",
	20:    "OFPAT_POP_MPLS",
	21:    "OFPAT_SET_QUEUE",
	22:    "OFPAT_GROUP",
	23:    "OFPAT_SET_NW_TTL",
	24:    "OFPAT_DEC_NW_TTL",
	25:    "OFPAT_SET_FIELD",
	26:    "OFPAT_PUSH_PBB",
	27:    "OFPAT_POP_PBB",
	65535: "OFPAT_EXPERIMENTER",
}
var OfpActionType_value = map[string]int32{
	"OFPAT_OUTPUT":       0,
	"OFPAT_COPY_TTL_OUT": 11,
	"OFPAT_COPY_TTL_IN":  12,
	"OFPAT_SET_MPLS_TTL": 15,
	"OFPAT_DEC_MPLS_TTL": 16,
	"OFPAT_PUSH_VLAN":    17,
	"OFPAT_POP_VLAN":     18,
	"OFPAT_PUSH_MPLS":    19,
	"OFPAT_POP_MPLS":     20,
	"OFPAT_SET_QUEUE":    21,
	"OFPAT_GROUP":        22,
	"OFPAT_SET_NW_TTL":   23,
	"OFPAT_DEC_NW_TTL":   24,
	"OFPAT_SET_FIELD":    25,
	"OFPAT_PUSH_PBB":     26,
	"OFPAT_POP_PBB":      27,
	"OFPAT_EXPERIMENTER": 65535,
}

func (x OfpActionType) String() string {
	return proto.EnumName(OfpActionType_name, int32(x))
}
func (OfpActionType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{16}
}

type OfpControllerMaxLen int32

const (
	OfpControllerMaxLen_OFPCML_INVALID   OfpControllerMaxLen = 0
	OfpControllerMaxLen_OFPCML_MAX       OfpControllerMaxLen = 65509
	OfpControllerMaxLen_OFPCML_NO_BUFFER OfpControllerMaxLen = 65535
)

var OfpControllerMaxLen_name = map[int32]string{
	0:     "OFPCML_INVALID",
	65509: "OFPCML_MAX",
	65535: "OFPCML_NO_BUFFER",
}
var OfpControllerMaxLen_value = map[string]int32{
	"OFPCML_INVALID":   0,
	"OFPCML_MAX":       65509,
	"OFPCML_NO_BUFFER": 65535,
}

func (x OfpControllerMaxLen) String() string {
	return proto.EnumName(OfpControllerMaxLen_name, int32(x))
}
func (OfpControllerMaxLen) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{17}
}

type OfpInstructionType int32

const (
	OfpInstructionType_OFPIT_INVALID        OfpInstructionType = 0
	OfpInstructionType_OFPIT_GOTO_TABLE     OfpInstructionType = 1
	OfpInstructionType_OFPIT_WRITE_METADATA OfpInstructionType = 2
	OfpInstructionType_OFPIT_WRITE_ACTIONS  OfpInstructionType = 3
	OfpInstructionType_OFPIT_APPLY_ACTIONS  OfpInstructionType = 4
	OfpInstructionType_OFPIT_CLEAR_ACTIONS  OfpInstructionType = 5
	OfpInstructionType_OFPIT_METER          OfpInstructionType = 6
	OfpInstructionType_OFPIT_EXPERIMENTER   OfpInstructionType = 65535
)

var OfpInstructionType_name = map[int32]string{
	0:     "OFPIT_INVALID",
	1:     "OFPIT_GOTO_TABLE",
	2:     "OFPIT_WRITE_METADATA",
	3:     "OFPIT_WRITE_ACTIONS",
	4:     "OFPIT_APPLY_ACTIONS",
	5:     "OFPIT_CLEAR_ACTIONS",
	6:     "OFPIT_METER",
	65535: "OFPIT_EXPERIMENTER",
}
var OfpInstructionType_value = map[string]int32{
	"OFPIT_INVALID":        0,
	"OFPIT_GOTO_TABLE":     1,
	"OFPIT_WRITE_METADATA": 2,
	"OFPIT_WRITE_ACTIONS":  3,
	"OFPIT_APPLY_ACTIONS":  4,
	"OFPIT_CLEAR_ACTIONS":  5,
	"OFPIT_METER":          6,
	"OFPIT_EXPERIMENTER":   65535,
}

func (x OfpInstructionType) String() string {
	return proto.EnumName(OfpInstructionType_name, int32(x))
}
func (OfpInstructionType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{18}
}

type OfpFlowModCommand int32

const (
	OfpFlowModCommand_OFPFC_ADD           OfpFlowModCommand = 0
	OfpFlowModCommand_OFPFC_MODIFY        OfpFlowModCommand = 1
	OfpFlowModCommand_OFPFC_MODIFY_STRICT OfpFlowModCommand = 2
	OfpFlowModCommand_OFPFC_DELETE        OfpFlowModCommand = 3
	OfpFlowModCommand_OFPFC_DELETE_STRICT OfpFlowModCommand = 4
)

var OfpFlowModCommand_name = map[int32]string{
	0: "OFPFC_ADD",
	1: "OFPFC_MODIFY",
	2: "OFPFC_MODIFY_STRICT",
	3: "OFPFC_DELETE",
	4: "OFPFC_DELETE_STRICT",
}
var OfpFlowModCommand_value = map[string]int32{
	"OFPFC_ADD":           0,
	"OFPFC_MODIFY":        1,
	"OFPFC_MODIFY_STRICT": 2,
	"OFPFC_DELETE":        3,
	"OFPFC_DELETE_STRICT": 4,
}

func (x OfpFlowModCommand) String() string {
	return proto.EnumName(OfpFlowModCommand_name, int32(x))
}
func (OfpFlowModCommand) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{19}
}

type OfpFlowModFlags int32

const (
	OfpFlowModFlags_OFPFF_INVALID       OfpFlowModFlags = 0
	OfpFlowModFlags_OFPFF_SEND_FLOW_REM OfpFlowModFlags = 1
	OfpFlowModFlags_OFPFF_CHECK_OVERLAP OfpFlowModFlags = 2
	OfpFlowModFlags_OFPFF_RESET_COUNTS  OfpFlowModFlags = 4
	OfpFlowModFlags_OFPFF_NO_PKT_COUNTS OfpFlowModFlags = 8
	OfpFlowModFlags_OFPFF_NO_BYT_COUNTS OfpFlowModFlags = 16
)

var OfpFlowModFlags_name = map[int32]string{
	0:  "OFPFF_INVALID",
	1:  "OFPFF_SEND_FLOW_REM",
	2:  "OFPFF_CHECK_OVERLAP",
	4:  "OFPFF_RESET_COUNTS",
	8:  "OFPFF_NO_PKT_COUNTS",
	16: "OFPFF_NO_BYT_COUNTS",
}
var OfpFlowModFlags_value = map[string]int32{
	"OFPFF_INVALID":       0,
	"OFPFF_SEND_FLOW_REM": 1,
	"OFPFF_CHECK_OVERLAP": 2,
	"OFPFF_RESET_COUNTS":  4,
	"OFPFF_NO_PKT_COUNTS": 8,
	"OFPFF_NO_BYT_COUNTS": 16,
}

func (x OfpFlowModFlags) String() string {
	return proto.EnumName(OfpFlowModFlags_name, int32(x))
}
func (OfpFlowModFlags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{20}
}

// Group numbering. Groups can use any number up to OFPG_MAX.
type OfpGroup int32

const (
	OfpGroup_OFPG_INVALID OfpGroup = 0
	// Last usable group number.
	OfpGroup_OFPG_MAX OfpGroup = 2147483392
	// Fake groups.
	OfpGroup_OFPG_ALL OfpGroup = 2147483644
	OfpGroup_OFPG_ANY OfpGroup = 2147483647
)

var OfpGroup_name = map[int32]string{
	0:          "OFPG_INVALID",
	2147483392: "OFPG_MAX",
	2147483644: "OFPG_ALL",
	2147483647: "OFPG_ANY",
}
var OfpGroup_value = map[string]int32{
	"OFPG_INVALID": 0,
	"OFPG_MAX":     2147483392,
	"OFPG_ALL":     2147483644,
	"OFPG_ANY":     2147483647,
}

func (x OfpGroup) String() string {
	return proto.EnumName(OfpGroup_name, int32(x))
}
func (OfpGroup) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{21}
}

// Group commands
type OfpGroupModCommand int32

const (
	OfpGroupModCommand_OFPGC_ADD    OfpGroupModCommand = 0
	OfpGroupModCommand_OFPGC_MODIFY OfpGroupModCommand = 1
	OfpGroupModCommand_OFPGC_DELETE OfpGroupModCommand = 2
)

var OfpGroupModCommand_name = map[int32]string{
	0: "OFPGC_ADD",
	1: "OFPGC_MODIFY",
	2: "OFPGC_DELETE",
}
var OfpGroupModCommand_value = map[string]int32{
	"OFPGC_ADD":    0,
	"OFPGC_MODIFY": 1,
	"OFPGC_DELETE": 2,
}

func (x OfpGroupModCommand) String() string {
	return proto.EnumName(OfpGroupModCommand_name, int32(x))
}
func (OfpGroupModCommand) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{22}
}

// Group types.  Values in the range [128; 255] are reserved for experimental
// use.
type OfpGroupType int32

const (
	OfpGroupType_OFPGT_ALL      OfpGroupType = 0
	OfpGroupType_OFPGT_SELECT   OfpGroupType = 1
	OfpGroupType_OFPGT_INDIRECT OfpGroupType = 2
	OfpGroupType_OFPGT_FF       OfpGroupType = 3
)

var OfpGroupType_name = map[int32]string{
	0: "OFPGT_ALL",
	1: "OFPGT_SELECT",
	2: "OFPGT_INDIRECT",
	3: "OFPGT_FF",
}
var OfpGroupType_value = map[string]int32{
	"OFPGT_ALL":      0,
	"OFPGT_SELECT":   1,
	"OFPGT_INDIRECT": 2,
	"OFPGT_FF":       3,
}

func (x OfpGroupType) String() string {
	return proto.EnumName(OfpGroupType_name, int32(x))
}
func (OfpGroupType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{23}
}

// Why is this packet being sent to the controller?
type OfpPacketInReason int32

const (
	OfpPacketInReason_OFPR_NO_MATCH    OfpPacketInReason = 0
	OfpPacketInReason_OFPR_ACTION      OfpPacketInReason = 1
	OfpPacketInReason_OFPR_INVALID_TTL OfpPacketInReason = 2
)

var OfpPacketInReason_name = map[int32]string{
	0: "OFPR_NO_MATCH",
	1: "OFPR_ACTION",
	2: "OFPR_INVALID_TTL",
}
var OfpPacketInReason_value = map[string]int32{
	"OFPR_NO_MATCH":    0,
	"OFPR_ACTION":      1,
	"OFPR_INVALID_TTL": 2,
}

func (x OfpPacketInReason) String() string {
	return proto.EnumName(OfpPacketInReason_name, int32(x))
}
func (OfpPacketInReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{24}
}

// Why was this flow removed?
type OfpFlowRemovedReason int32

const (
	OfpFlowRemovedReason_OFPRR_IDLE_TIMEOUT OfpFlowRemovedReason = 0
	OfpFlowRemovedReason_OFPRR_HARD_TIMEOUT OfpFlowRemovedReason = 1
	OfpFlowRemovedReason_OFPRR_DELETE       OfpFlowRemovedReason = 2
	OfpFlowRemovedReason_OFPRR_GROUP_DELETE OfpFlowRemovedReason = 3
	OfpFlowRemovedReason_OFPRR_METER_DELETE OfpFlowRemovedReason = 4
)

var OfpFlowRemovedReason_name = map[int32]string{
	0: "OFPRR_IDLE_TIMEOUT",
	1: "OFPRR_HARD_TIMEOUT",
	2: "OFPRR_DELETE",
	3: "OFPRR_GROUP_DELETE",
	4: "OFPRR_METER_DELETE",
}
var OfpFlowRemovedReason_value = map[string]int32{
	"OFPRR_IDLE_TIMEOUT": 0,
	"OFPRR_HARD_TIMEOUT": 1,
	"OFPRR_DELETE":       2,
	"OFPRR_GROUP_DELETE": 3,
	"OFPRR_METER_DELETE": 4,
}

func (x OfpFlowRemovedReason) String() string {
	return proto.EnumName(OfpFlowRemovedReason_name, int32(x))
}
func (OfpFlowRemovedReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{25}
}

// Meter numbering. Flow meters can use any number up to OFPM_MAX.
type OfpMeter int32

const (
	OfpMeter_OFPM_ZERO OfpMeter = 0
	// Last usable meter.
	OfpMeter_OFPM_MAX OfpMeter = 2147418112
	// Virtual meters.
	OfpMeter_OFPM_SLOWPATH   OfpMeter = 2147483645
	OfpMeter_OFPM_CONTROLLER OfpMeter = 2147483646
	OfpMeter_OFPM_ALL        OfpMeter = 2147483647
)

var OfpMeter_name = map[int32]string{
	0:          "OFPM_ZERO",
	2147418112: "OFPM_MAX",
	2147483645: "OFPM_SLOWPATH",
	2147483646: "OFPM_CONTROLLER",
	2147483647: "OFPM_ALL",
}
var OfpMeter_value = map[string]int32{
	"OFPM_ZERO":       0,
	"OFPM_MAX":        2147418112,
	"OFPM_SLOWPATH":   2147483645,
	"OFPM_CONTROLLER": 2147483646,
	"OFPM_ALL":        2147483647,
}

func (x OfpMeter) String() string {
	return proto.EnumName(OfpMeter_name, int32(x))
}
func (OfpMeter) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{26}
}

// Meter band types
type OfpMeterBandType int32

const (
	OfpMeterBandType_OFPMBT_INVALID      OfpMeterBandType = 0
	OfpMeterBandType_OFPMBT_DROP         OfpMeterBandType = 1
	OfpMeterBandType_OFPMBT_DSCP_REMARK  OfpMeterBandType = 2
	OfpMeterBandType_OFPMBT_EXPERIMENTER OfpMeterBandType = 65535
)

var OfpMeterBandType_name = map[int32]string{
	0:     "OFPMBT_INVALID",
	1:     "OFPMBT_DROP",
	2:     "OFPMBT_DSCP_REMARK",
	65535: "OFPMBT_EXPERIMENTER",
}
var OfpMeterBandType_value = map[string]int32{
	"OFPMBT_INVALID":      0,
	"OFPMBT_DROP":         1,
	"OFPMBT_DSCP_REMARK":  2,
	"OFPMBT_EXPERIMENTER": 65535,
}

func (x OfpMeterBandType) String() string {
	return proto.EnumName(OfpMeterBandType_name, int32(x))
}
func (OfpMeterBandType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{27}
}

// Meter commands
type OfpMeterModCommand int32

const (
	OfpMeterModCommand_OFPMC_ADD    OfpMeterModCommand = 0
	OfpMeterModCommand_OFPMC_MODIFY OfpMeterModCommand = 1
	OfpMeterModCommand_OFPMC_DELETE OfpMeterModCommand = 2
)

var OfpMeterModCommand_name = map[int32]string{
	0: "OFPMC_ADD",
	1: "OFPMC_MODIFY",
	2: "OFPMC_DELETE",
}
var OfpMeterModCommand_value = map[string]int32{
	"OFPMC_ADD":    0,
	"OFPMC_MODIFY": 1,
	"OFPMC_DELETE": 2,
}

func (x OfpMeterModCommand) String() string {
	return proto.EnumName(OfpMeterModCommand_name, int32(x))
}
func (OfpMeterModCommand) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{28}
}

// Meter configuration flags
type OfpMeterFlags int32

const (
	OfpMeterFlags_OFPMF_INVALID OfpMeterFlags = 0
	OfpMeterFlags_OFPMF_KBPS    OfpMeterFlags = 1
	OfpMeterFlags_OFPMF_PKTPS   OfpMeterFlags = 2
	OfpMeterFlags_OFPMF_BURST   OfpMeterFlags = 4
	OfpMeterFlags_OFPMF_STATS   OfpMeterFlags = 8
)

var OfpMeterFlags_name = map[int32]string{
	0: "OFPMF_INVALID",
	1: "OFPMF_KBPS",
	2: "OFPMF_PKTPS",
	4: "OFPMF_BURST",
	8: "OFPMF_STATS",
}
var OfpMeterFlags_value = map[string]int32{
	"OFPMF_INVALID": 0,
	"OFPMF_KBPS":    1,
	"OFPMF_PKTPS":   2,
	"OFPMF_BURST":   4,
	"OFPMF_STATS":   8,
}

func (x OfpMeterFlags) String() string {
	return proto.EnumName(OfpMeterFlags_name, int32(x))
}
func (OfpMeterFlags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{29}
}

// Values for 'type' in ofp_error_message.  These values are immutable: they
// will not change in future versions of the protocol (although new values may
// be added).
type OfpErrorType int32

const (
	OfpErrorType_OFPET_HELLO_FAILED          OfpErrorType = 0
	OfpErrorType_OFPET_BAD_REQUEST           OfpErrorType = 1
	OfpErrorType_OFPET_BAD_ACTION            OfpErrorType = 2
	OfpErrorType_OFPET_BAD_INSTRUCTION       OfpErrorType = 3
	OfpErrorType_OFPET_BAD_MATCH             OfpErrorType = 4
	OfpErrorType_OFPET_FLOW_MOD_FAILED       OfpErrorType = 5
	OfpErrorType_OFPET_GROUP_MOD_FAILED      OfpErrorType = 6
	OfpErrorType_OFPET_PORT_MOD_FAILED       OfpErrorType = 7
	OfpErrorType_OFPET_TABLE_MOD_FAILED      OfpErrorType = 8
	OfpErrorType_OFPET_QUEUE_OP_FAILED       OfpErrorType = 9
	OfpErrorType_OFPET_SWITCH_CONFIG_FAILED  OfpErrorType = 10
	OfpErrorType_OFPET_ROLE_REQUEST_FAILED   OfpErrorType = 11
	OfpErrorType_OFPET_METER_MOD_FAILED      OfpErrorType = 12
	OfpErrorType_OFPET_TABLE_FEATURES_FAILED OfpErrorType = 13
	OfpErrorType_OFPET_EXPERIMENTER          OfpErrorType = 65535
)

var OfpErrorType_name = map[int32]string{
	0:     "OFPET_HELLO_FAILED",
	1:     "OFPET_BAD_REQUEST",
	2:     "OFPET_BAD_ACTION",
	3:     "OFPET_BAD_INSTRUCTION",
	4:     "OFPET_BAD_MATCH",
	5:     "OFPET_FLOW_MOD_FAILED",
	6:     "OFPET_GROUP_MOD_FAILED",
	7:     "OFPET_PORT_MOD_FAILED",
	8:     "OFPET_TABLE_MOD_FAILED",
	9:     "OFPET_QUEUE_OP_FAILED",
	10:    "OFPET_SWITCH_CONFIG_FAILED",
	11:    "OFPET_ROLE_REQUEST_FAILED",
	12:    "OFPET_METER_MOD_FAILED",
	13:    "OFPET_TABLE_FEATURES_FAILED",
	65535: "OFPET_EXPERIMENTER",
}
var OfpErrorType_value = map[string]int32{
	"OFPET_HELLO_FAILED":          0,
	"OFPET_BAD_REQUEST":           1,
	"OFPET_BAD_ACTION":            2,
	"OFPET_BAD_INSTRUCTION":       3,
	"OFPET_BAD_MATCH":             4,
	"OFPET_FLOW_MOD_FAILED":       5,
	"OFPET_GROUP_MOD_FAILED":      6,
	"OFPET_PORT_MOD_FAILED":       7,
	"OFPET_TABLE_MOD_FAILED":      8,
	"OFPET_QUEUE_OP_FAILED":       9,
	"OFPET_SWITCH_CONFIG_FAILED":  10,
	"OFPET_ROLE_REQUEST_FAILED":   11,
	"OFPET_METER_MOD_FAILED":      12,
	"OFPET_TABLE_FEATURES_FAILED": 13,
	"OFPET_EXPERIMENTER":          65535,
}

func (x OfpErrorType) String() string {
	return proto.EnumName(OfpErrorType_name, int32(x))
}
func (OfpErrorType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{30}
}

// ofp_error_msg 'code' values for OFPET_HELLO_FAILED.  'data' contains an
// ASCII text string that may give failure details.
type OfpHelloFailedCode int32

const (
	OfpHelloFailedCode_OFPHFC_INCOMPATIBLE OfpHelloFailedCode = 0
	OfpHelloFailedCode_OFPHFC_EPERM        OfpHelloFailedCode = 1
)

var OfpHelloFailedCode_name = map[int32]string{
	0: "OFPHFC_INCOMPATIBLE",
	1: "OFPHFC_EPERM",
}
var OfpHelloFailedCode_value = map[string]int32{
	"OFPHFC_INCOMPATIBLE": 0,
	"OFPHFC_EPERM":        1,
}

func (x OfpHelloFailedCode) String() string {
	return proto.EnumName(OfpHelloFailedCode_name, int32(x))
}
func (OfpHelloFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{31}
}

// ofp_error_msg 'code' values for OFPET_BAD_REQUEST.  'data' contains at least
// the first 64 bytes of the failed request.
type OfpBadRequestCode int32

const (
	OfpBadRequestCode_OFPBRC_BAD_VERSION               OfpBadRequestCode = 0
	OfpBadRequestCode_OFPBRC_BAD_TYPE                  OfpBadRequestCode = 1
	OfpBadRequestCode_OFPBRC_BAD_MULTIPART             OfpBadRequestCode = 2
	OfpBadRequestCode_OFPBRC_BAD_EXPERIMENTER          OfpBadRequestCode = 3
	OfpBadRequestCode_OFPBRC_BAD_EXP_TYPE              OfpBadRequestCode = 4
	OfpBadRequestCode_OFPBRC_EPERM                     OfpBadRequestCode = 5
	OfpBadRequestCode_OFPBRC_BAD_LEN                   OfpBadRequestCode = 6
	OfpBadRequestCode_OFPBRC_BUFFER_EMPTY              OfpBadRequestCode = 7
	OfpBadRequestCode_OFPBRC_BUFFER_UNKNOWN            OfpBadRequestCode = 8
	OfpBadRequestCode_OFPBRC_BAD_TABLE_ID              OfpBadRequestCode = 9
	OfpBadRequestCode_OFPBRC_IS_SLAVE                  OfpBadRequestCode = 10
	OfpBadRequestCode_OFPBRC_BAD_PORT                  OfpBadRequestCode = 11
	OfpBadRequestCode_OFPBRC_BAD_PACKET                OfpBadRequestCode = 12
	OfpBadRequestCode_OFPBRC_MULTIPART_BUFFER_OVERFLOW OfpBadRequestCode = 13
)

var OfpBadRequestCode_name = map[int32]string{
	0:  "OFPBRC_BAD_VERSION",
	1:  "OFPBRC_BAD_TYPE",
	2:  "OFPBRC_BAD_MULTIPART",
	3:  "OFPBRC_BAD_EXPERIMENTER",
	4:  "OFPBRC_BAD_EXP_TYPE",
	5:  "OFPBRC_EPERM",
	6:  "OFPBRC_BAD_LEN",
	7:  "OFPBRC_BUFFER_EMPTY",
	8:  "OFPBRC_BUFFER_UNKNOWN",
	9:  "OFPBRC_BAD_TABLE_ID",
	10: "OFPBRC_IS_SLAVE",
	11: "OFPBRC_BAD_PORT",
	12: "OFPBRC_BAD_PACKET",
	13: "OFPBRC_MULTIPART_BUFFER_OVERFLOW",
}
var OfpBadRequestCode_value = map[string]int32{
	"OFPBRC_BAD_VERSION":               0,
	"OFPBRC_BAD_TYPE":                  1,
	"OFPBRC_BAD_MULTIPART":             2,
	"OFPBRC_BAD_EXPERIMENTER":          3,
	"OFPBRC_BAD_EXP_TYPE":              4,
	"OFPBRC_EPERM":                     5,
	"OFPBRC_BAD_LEN":                   6,
	"OFPBRC_BUFFER_EMPTY":              7,
	"OFPBRC_BUFFER_UNKNOWN":            8,
	"OFPBRC_BAD_TABLE_ID":              9,
	"OFPBRC_IS_SLAVE":                  10,
	"OFPBRC_BAD_PORT":                  11,
	"OFPBRC_BAD_PACKET":                12,
	"OFPBRC_MULTIPART_BUFFER_OVERFLOW": 13,
}

func (x OfpBadRequestCode) String() string {
	return proto.EnumName(OfpBadRequestCode_name, int32(x))
}
func (OfpBadRequestCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{32}
}

// ofp_error_msg 'code' values for OFPET_BAD_ACTION.  'data' contains at least
// the first 64 bytes of the failed request.
type OfpBadActionCode int32

const (
	OfpBadActionCode_OFPBAC_BAD_TYPE           OfpBadActionCode = 0
	OfpBadActionCode_OFPBAC_BAD_LEN            OfpBadActionCode = 1
	OfpBadActionCode_OFPBAC_BAD_EXPERIMENTER   OfpBadActionCode = 2
	OfpBadActionCode_OFPBAC_BAD_EXP_TYPE       OfpBadActionCode = 3
	OfpBadActionCode_OFPBAC_BAD_OUT_PORT       OfpBadActionCode = 4
	OfpBadActionCode_OFPBAC_BAD_ARGUMENT       OfpBadActionCode = 5
	OfpBadActionCode_OFPBAC_EPERM              OfpBadActionCode = 6
	OfpBadActionCode_OFPBAC_TOO_MANY           OfpBadActionCode = 7
	OfpBadActionCode_OFPBAC_BAD_QUEUE          OfpBadActionCode = 8
	OfpBadActionCode_OFPBAC_BAD_OUT_GROUP      OfpBadActionCode = 9
	OfpBadActionCode_OFPBAC_MATCH_INCONSISTENT OfpBadActionCode = 10
	OfpBadActionCode_OFPBAC_UNSUPPORTED_ORDER  OfpBadActionCode = 11
	OfpBadActionCode_OFPBAC_BAD_TAG            OfpBadActionCode = 12
	OfpBadActionCode_OFPBAC_BAD_SET_TYPE       OfpBadActionCode = 13
	OfpBadActionCode_OFPBAC_BAD_SET_LEN        OfpBadActionCode = 14
	OfpBadActionCode_OFPBAC_BAD_SET_ARGUMENT   OfpBadActionCode = 15
)

var OfpBadActionCode_name = map[int32]string{
	0:  "OFPBAC_BAD_TYPE",
	1:  "OFPBAC_BAD_LEN",
	2:  "OFPBAC_BAD_EXPERIMENTER",
	3:  "OFPBAC_BAD_EXP_TYPE",
	4:  "OFPBAC_BAD_OUT_PORT",
	5:  "OFPBAC_BAD_ARGUMENT",
	6:  "OFPBAC_EPERM",
	7:  "OFPBAC_TOO_MANY",
	8:  "OFPBAC_BAD_QUEUE",
	9:  "OFPBAC_BAD_OUT_GROUP",
	10: "OFPBAC_MATCH_INCONSISTENT",
	11: "OFPBAC_UNSUPPORTED_ORDER",
	12: "OFPBAC_BAD_TAG",
	13: "OFPBAC_BAD_SET_TYPE",
	14: "OFPBAC_BAD_SET_LEN",
	15: "OFPBAC_BAD_SET_ARGUMENT",
}
var OfpBadActionCode_value = map[string]int32{
	"OFPBAC_BAD_TYPE":           0,
	"OFPBAC_BAD_LEN":            1,
	"OFPBAC_BAD_EXPERIMENTER":   2,
	"OFPBAC_BAD_EXP_TYPE":       3,
	"OFPBAC_BAD_OUT_PORT":       4,
	"OFPBAC_BAD_ARGUMENT":       5,
	"OFPBAC_EPERM":              6,
	"OFPBAC_TOO_MANY":           7,
	"OFPBAC_BAD_QUEUE":          8,
	"OFPBAC_BAD_OUT_GROUP":      9,
	"OFPBAC_MATCH_INCONSISTENT": 10,
	"OFPBAC_UNSUPPORTED_ORDER":  11,
	"OFPBAC_BAD_TAG":            12,
	"OFPBAC_BAD_SET_TYPE":       13,
	"OFPBAC_BAD_SET_LEN":        14,
	"OFPBAC_BAD_SET_ARGUMENT":   15,
}

func (x OfpBadActionCode) String() string {
	return proto.EnumName(OfpBadActionCode_name, int32(x))
}
func (OfpBadActionCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{33}
}

// ofp_error_msg 'code' values for OFPET_BAD_INSTRUCTION.  'data' contains at
// least the first 64 bytes of the failed request.
type OfpBadInstructionCode int32

const (
	OfpBadInstructionCode_OFPBIC_UNKNOWN_INST        OfpBadInstructionCode = 0
	OfpBadInstructionCode_OFPBIC_UNSUP_INST          OfpBadInstructionCode = 1
	OfpBadInstructionCode_OFPBIC_BAD_TABLE_ID        OfpBadInstructionCode = 2
	OfpBadInstructionCode_OFPBIC_UNSUP_METADATA      OfpBadInstructionCode = 3
	OfpBadInstructionCode_OFPBIC_UNSUP_METADATA_MASK OfpBadInstructionCode = 4
	OfpBadInstructionCode_OFPBIC_BAD_EXPERIMENTER    OfpBadInstructionCode = 5
	OfpBadInstructionCode_OFPBIC_BAD_EXP_TYPE        OfpBadInstructionCode = 6
	OfpBadInstructionCode_OFPBIC_BAD_LEN             OfpBadInstructionCode = 7
	OfpBadInstructionCode_OFPBIC_EPERM               OfpBadInstructionCode = 8
)

var OfpBadInstructionCode_name = map[int32]string{
	0: "OFPBIC_UNKNOWN_INST",
	1: "OFPBIC_UNSUP_INST",
	2: "OFPBIC_BAD_TABLE_ID",
	3: "OFPBIC_UNSUP_METADATA",
	4: "OFPBIC_UNSUP_METADATA_MASK",
	5: "OFPBIC_BAD_EXPERIMENTER",
	6: "OFPBIC_BAD_EXP_TYPE",
	7: "OFPBIC_BAD_LEN",
	8: "OFPBIC_EPERM",
}
var OfpBadInstructionCode_value = map[string]int32{
	"OFPBIC_UNKNOWN_INST":        0,
	"OFPBIC_UNSUP_INST":          1,
	"OFPBIC_BAD_TABLE_ID":        2,
	"OFPBIC_UNSUP_METADATA":      3,
	"OFPBIC_UNSUP_METADATA_MASK": 4,
	"OFPBIC_BAD_EXPERIMENTER":    5,
	"OFPBIC_BAD_EXP_TYPE":        6,
	"OFPBIC_BAD_LEN":             7,
	"OFPBIC_EPERM":               8,
}

func (x OfpBadInstructionCode) String() string {
	return proto.EnumName(OfpBadInstructionCode_name, int32(x))
}
func (OfpBadInstructionCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{34}
}

// ofp_error_msg 'code' values for OFPET_BAD_MATCH.  'data' contains at least
// the first 64 bytes of the failed request.
type OfpBadMatchCode int32

const (
	OfpBadMatchCode_OFPBMC_BAD_TYPE         OfpBadMatchCode = 0
	OfpBadMatchCode_OFPBMC_BAD_LEN          OfpBadMatchCode = 1
	OfpBadMatchCode_OFPBMC_BAD_TAG          OfpBadMatchCode = 2
	OfpBadMatchCode_OFPBMC_BAD_DL_ADDR_MASK OfpBadMatchCode = 3
	OfpBadMatchCode_OFPBMC_BAD_NW_ADDR_MASK OfpBadMatchCode = 4
	OfpBadMatchCode_OFPBMC_BAD_WILDCARDS    OfpBadMatchCode = 5
	OfpBadMatchCode_OFPBMC_BAD_FIELD        OfpBadMatchCode = 6
	OfpBadMatchCode_OFPBMC_BAD_VALUE        OfpBadMatchCode = 7
	OfpBadMatchCode_OFPBMC_BAD_MASK         OfpBadMatchCode = 8
	OfpBadMatchCode_OFPBMC_BAD_PREREQ       OfpBadMatchCode = 9
	OfpBadMatchCode_OFPBMC_DUP_FIELD        OfpBadMatchCode = 10
	OfpBadMatchCode_OFPBMC_EPERM            OfpBadMatchCode = 11
)

var OfpBadMatchCode_name = map[int32]string{
	0:  "OFPBMC_BAD_TYPE",
	1:  "OFPBMC_BAD_LEN",
	2:  "OFPBMC_BAD_TAG",
	3:  "OFPBMC_BAD_DL_ADDR_MASK",
	4:  "OFPBMC_BAD_NW_ADDR_MASK",
	5:  "OFPBMC_BAD_WILDCARDS",
	6:  "OFPBMC_BAD_FIELD",
	7:  "OFPBMC_BAD_VALUE",
	8:  "OFPBMC_BAD_MASK",
	9:  "OFPBMC_BAD_PREREQ",
	10: "OFPBMC_DUP_FIELD",
	11: "OFPBMC_EPERM",
}
var OfpBadMatchCode_value = map[string]int32{
	"OFPBMC_BAD_TYPE":         0,
	"OFPBMC_BAD_LEN":          1,
	"OFPBMC_BAD_TAG":          2,
	"OFPBMC_BAD_DL_ADDR_MASK": 3,
	"OFPBMC_BAD_NW_ADDR_MASK": 4,
	"OFPBMC_BAD_WILDCARDS":    5,
	"OFPBMC_BAD_FIELD":        6,
	"OFPBMC_BAD_VALUE":        7,
	"OFPBMC_BAD_MASK":         8,
	"OFPBMC_BAD_PREREQ":       9,
	"OFPBMC_DUP_FIELD":        10,
	"OFPBMC_EPERM":            11,
}

func (x OfpBadMatchCode) String() string {
	return proto.EnumName(OfpBadMatchCode_name, int32(x))
}
func (OfpBadMatchCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{35}
}

// ofp_error_msg 'code' values for OFPET_FLOW_MOD_FAILED.  'data' contains
// at least the first 64 bytes of the failed request.
type OfpFlowModFailedCode int32

const (
	OfpFlowModFailedCode_OFPFMFC_UNKNOWN      OfpFlowModFailedCode = 0
	OfpFlowModFailedCode_OFPFMFC_TABLE_FULL   OfpFlowModFailedCode = 1
	OfpFlowModFailedCode_OFPFMFC_BAD_TABLE_ID OfpFlowModFailedCode = 2
	OfpFlowModFailedCode_OFPFMFC_OVERLAP      OfpFlowModFailedCode = 3
	OfpFlowModFailedCode_OFPFMFC_EPERM        OfpFlowModFailedCode = 4
	OfpFlowModFailedCode_OFPFMFC_BAD_TIMEOUT  OfpFlowModFailedCode = 5
	OfpFlowModFailedCode_OFPFMFC_BAD_COMMAND  OfpFlowModFailedCode = 6
	OfpFlowModFailedCode_OFPFMFC_BAD_FLAGS    OfpFlowModFailedCode = 7
)

var OfpFlowModFailedCode_name = map[int32]string{
	0: "OFPFMFC_UNKNOWN",
	1: "OFPFMFC_TABLE_FULL",
	2: "OFPFMFC_BAD_TABLE_ID",
	3: "OFPFMFC_OVERLAP",
	4: "OFPFMFC_EPERM",
	5: "OFPFMFC_BAD_TIMEOUT",
	6: "OFPFMFC_BAD_COMMAND",
	7: "OFPFMFC_BAD_FLAGS",
}
var OfpFlowModFailedCode_value = map[string]int32{
	"OFPFMFC_UNKNOWN":      0,
	"OFPFMFC_TABLE_FULL":   1,
	"OFPFMFC_BAD_TABLE_ID": 2,
	"OFPFMFC_OVERLAP":      3,
	"OFPFMFC_EPERM":        4,
	"OFPFMFC_BAD_TIMEOUT":  5,
	"OFPFMFC_BAD_COMMAND":  6,
	"OFPFMFC_BAD_FLAGS":    7,
}

func (x OfpFlowModFailedCode) String() string {
	return proto.EnumName(OfpFlowModFailedCode_name, int32(x))
}
func (OfpFlowModFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{36}
}

// ofp_error_msg 'code' values for OFPET_GROUP_MOD_FAILED.  'data' contains
// at least the first 64 bytes of the failed request.
type OfpGroupModFailedCode int32

const (
	OfpGroupModFailedCode_OFPGMFC_GROUP_EXISTS         OfpGroupModFailedCode = 0
	OfpGroupModFailedCode_OFPGMFC_INVALID_GROUP        OfpGroupModFailedCode = 1
	OfpGroupModFailedCode_OFPGMFC_WEIGHT_UNSUPPORTED   OfpGroupModFailedCode = 2
	OfpGroupModFailedCode_OFPGMFC_OUT_OF_GROUPS        OfpGroupModFailedCode = 3
	OfpGroupModFailedCode_OFPGMFC_OUT_OF_BUCKETS       OfpGroupModFailedCode = 4
	OfpGroupModFailedCode_OFPGMFC_CHAINING_UNSUPPORTED OfpGroupModFailedCode = 5
	OfpGroupModFailedCode_OFPGMFC_WATCH_UNSUPPORTED    OfpGroupModFailedCode = 6
	OfpGroupModFailedCode_OFPGMFC_LOOP                 OfpGroupModFailedCode = 7
	OfpGroupModFailedCode_OFPGMFC_UNKNOWN_GROUP        OfpGroupModFailedCode = 8
	OfpGroupModFailedCode_OFPGMFC_CHAINED_GROUP        OfpGroupModFailedCode = 9
	OfpGroupModFailedCode_OFPGMFC_BAD_TYPE             OfpGroupModFailedCode = 10
	OfpGroupModFailedCode_OFPGMFC_BAD_COMMAND          OfpGroupModFailedCode = 11
	OfpGroupModFailedCode_OFPGMFC_BAD_BUCKET           OfpGroupModFailedCode = 12
	OfpGroupModFailedCode_OFPGMFC_BAD_WATCH            OfpGroupModFailedCode = 13
	OfpGroupModFailedCode_OFPGMFC_EPERM                OfpGroupModFailedCode = 14
)

var OfpGroupModFailedCode_name = map[int32]string{
	0:  "OFPGMFC_GROUP_EXISTS",
	1:  "OFPGMFC_INVALID_GROUP",
	2:  "OFPGMFC_WEIGHT_UNSUPPORTED",
	3:  "OFPGMFC_OUT_OF_GROUPS",
	4:  "OFPGMFC_OUT_OF_BUCKETS",
	5:  "OFPGMFC_CHAINING_UNSUPPORTED",
	6:  "OFPGMFC_WATCH_UNSUPPORTED",
	7:  "OFPGMFC_LOOP",
	8:  "OFPGMFC_UNKNOWN_GROUP",
	9:  "OFPGMFC_CHAINED_GROUP",
	10: "OFPGMFC_BAD_TYPE",
	11: "OFPGMFC_BAD_COMMAND",
	12: "OFPGMFC_BAD_BUCKET",
	13: "OFPGMFC_BAD_WATCH",
	14: "OFPGMFC_EPERM",
}
var OfpGroupModFailedCode_value = map[string]int32{
	"OFPGMFC_GROUP_EXISTS":         0,
	"OFPGMFC_INVALID_GROUP":        1,
	"OFPGMFC_WEIGHT_UNSUPPORTED":   2,
	"OFPGMFC_OUT_OF_GROUPS":        3,
	"OFPGMFC_OUT_OF_BUCKETS":       4,
	"OFPGMFC_CHAINING_UNSUPPORTED": 5,
	"OFPGMFC_WATCH_UNSUPPORTED":    6,
	"OFPGMFC_LOOP":                 7,
	"OFPGMFC_UNKNOWN_GROUP":        8,
	"OFPGMFC_CHAINED_GROUP":        9,
	"OFPGMFC_BAD_TYPE":             10,
	"OFPGMFC_BAD_COMMAND":          11,
	"OFPGMFC_BAD_BUCKET":           12,
	"OFPGMFC_BAD_WATCH":            13,
	"OFPGMFC_EPERM":                14,
}

func (x OfpGroupModFailedCode) String() string {
	return proto.EnumName(OfpGroupModFailedCode_name, int32(x))
}
func (OfpGroupModFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{37}
}

// ofp_error_msg 'code' values for OFPET_PORT_MOD_FAILED.  'data' contains
// at least the first 64 bytes of the failed request.
type OfpPortModFailedCode int32

const (
	OfpPortModFailedCode_OFPPMFC_BAD_PORT      OfpPortModFailedCode = 0
	OfpPortModFailedCode_OFPPMFC_BAD_HW_ADDR   OfpPortModFailedCode = 1
	OfpPortModFailedCode_OFPPMFC_BAD_CONFIG    OfpPortModFailedCode = 2
	OfpPortModFailedCode_OFPPMFC_BAD_ADVERTISE OfpPortModFailedCode = 3
	OfpPortModFailedCode_OFPPMFC_EPERM         OfpPortModFailedCode = 4
)

var OfpPortModFailedCode_name = map[int32]string{
	0: "OFPPMFC_BAD_PORT",
	1: "OFPPMFC_BAD_HW_ADDR",
	2: "OFPPMFC_BAD_CONFIG",
	3: "OFPPMFC_BAD_ADVERTISE",
	4: "OFPPMFC_EPERM",
}
var OfpPortModFailedCode_value = map[string]int32{
	"OFPPMFC_BAD_PORT":      0,
	"OFPPMFC_BAD_HW_ADDR":   1,
	"OFPPMFC_BAD_CONFIG":    2,
	"OFPPMFC_BAD_ADVERTISE": 3,
	"OFPPMFC_EPERM":         4,
}

func (x OfpPortModFailedCode) String() string {
	return proto.EnumName(OfpPortModFailedCode_name, int32(x))
}
func (OfpPortModFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{38}
}

// ofp_error_msg 'code' values for OFPET_TABLE_MOD_FAILED.  'data' contains
// at least the first 64 bytes of the failed request.
type OfpTableModFailedCode int32

const (
	OfpTableModFailedCode_OFPTMFC_BAD_TABLE  OfpTableModFailedCode = 0
	OfpTableModFailedCode_OFPTMFC_BAD_CONFIG OfpTableModFailedCode = 1
	OfpTableModFailedCode_OFPTMFC_EPERM      OfpTableModFailedCode = 2
)

var OfpTableModFailedCode_name = map[int32]string{
	0: "OFPTMFC_BAD_TABLE",
	1: "OFPTMFC_BAD_CONFIG",
	2: "OFPTMFC_EPERM",
}
var OfpTableModFailedCode_value = map[string]int32{
	"OFPTMFC_BAD_TABLE":  0,
	"OFPTMFC_BAD_CONFIG": 1,
	"OFPTMFC_EPERM":      2,
}

func (x OfpTableModFailedCode) String() string {
	return proto.EnumName(OfpTableModFailedCode_name, int32(x))
}
func (OfpTableModFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{39}
}

// ofp_error msg 'code' values for OFPET_QUEUE_OP_FAILED. 'data' contains
// at least the first 64 bytes of the failed request
type OfpQueueOpFailedCode int32

const (
	OfpQueueOpFailedCode_OFPQOFC_BAD_PORT  OfpQueueOpFailedCode = 0
	OfpQueueOpFailedCode_OFPQOFC_BAD_QUEUE OfpQueueOpFailedCode = 1
	OfpQueueOpFailedCode_OFPQOFC_EPERM     OfpQueueOpFailedCode = 2
)

var OfpQueueOpFailedCode_name = map[int32]string{
	0: "OFPQOFC_BAD_PORT",
	1: "OFPQOFC_BAD_QUEUE",
	2: "OFPQOFC_EPERM",
}
var OfpQueueOpFailedCode_value = map[string]int32{
	"OFPQOFC_BAD_PORT":  0,
	"OFPQOFC_BAD_QUEUE": 1,
	"OFPQOFC_EPERM":     2,
}

func (x OfpQueueOpFailedCode) String() string {
	return proto.EnumName(OfpQueueOpFailedCode_name, int32(x))
}
func (OfpQueueOpFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{40}
}

// ofp_error_msg 'code' values for OFPET_SWITCH_CONFIG_FAILED. 'data' contains
// at least the first 64 bytes of the failed request.
type OfpSwitchConfigFailedCode int32

const (
	OfpSwitchConfigFailedCode_OFPSCFC_BAD_FLAGS OfpSwitchConfigFailedCode = 0
	OfpSwitchConfigFailedCode_OFPSCFC_BAD_LEN   OfpSwitchConfigFailedCode = 1
	OfpSwitchConfigFailedCode_OFPSCFC_EPERM     OfpSwitchConfigFailedCode = 2
)

var OfpSwitchConfigFailedCode_name = map[int32]string{
	0: "OFPSCFC_BAD_FLAGS",
	1: "OFPSCFC_BAD_LEN",
	2: "OFPSCFC_EPERM",
}
var OfpSwitchConfigFailedCode_value = map[string]int32{
	"OFPSCFC_BAD_FLAGS": 0,
	"OFPSCFC_BAD_LEN":   1,
	"OFPSCFC_EPERM":     2,
}

func (x OfpSwitchConfigFailedCode) String() string {
	return proto.EnumName(OfpSwitchConfigFailedCode_name, int32(x))
}
func (OfpSwitchConfigFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{41}
}

// ofp_error_msg 'code' values for OFPET_ROLE_REQUEST_FAILED. 'data' contains
// at least the first 64 bytes of the failed request.
type OfpRoleRequestFailedCode int32

const (
	OfpRoleRequestFailedCode_OFPRRFC_STALE    OfpRoleRequestFailedCode = 0
	OfpRoleRequestFailedCode_OFPRRFC_UNSUP    OfpRoleRequestFailedCode = 1
	OfpRoleRequestFailedCode_OFPRRFC_BAD_ROLE OfpRoleRequestFailedCode = 2
)

var OfpRoleRequestFailedCode_name = map[int32]string{
	0: "OFPRRFC_STALE",
	1: "OFPRRFC_UNSUP",
	2: "OFPRRFC_BAD_ROLE",
}
var OfpRoleRequestFailedCode_value = map[string]int32{
	"OFPRRFC_STALE":    0,
	"OFPRRFC_UNSUP":    1,
	"OFPRRFC_BAD_ROLE": 2,
}

func (x OfpRoleRequestFailedCode) String() string {
	return proto.EnumName(OfpRoleRequestFailedCode_name, int32(x))
}
func (OfpRoleRequestFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{42}
}

// ofp_error_msg 'code' values for OFPET_METER_MOD_FAILED.  'data' contains
// at least the first 64 bytes of the failed request.
type OfpMeterModFailedCode int32

const (
	OfpMeterModFailedCode_OFPMMFC_UNKNOWN        OfpMeterModFailedCode = 0
	OfpMeterModFailedCode_OFPMMFC_METER_EXISTS   OfpMeterModFailedCode = 1
	OfpMeterModFailedCode_OFPMMFC_INVALID_METER  OfpMeterModFailedCode = 2
	OfpMeterModFailedCode_OFPMMFC_UNKNOWN_METER  OfpMeterModFailedCode = 3
	OfpMeterModFailedCode_OFPMMFC_BAD_COMMAND    OfpMeterModFailedCode = 4
	OfpMeterModFailedCode_OFPMMFC_BAD_FLAGS      OfpMeterModFailedCode = 5
	OfpMeterModFailedCode_OFPMMFC_BAD_RATE       OfpMeterModFailedCode = 6
	OfpMeterModFailedCode_OFPMMFC_BAD_BURST      OfpMeterModFailedCode = 7
	OfpMeterModFailedCode_OFPMMFC_BAD_BAND       OfpMeterModFailedCode = 8
	OfpMeterModFailedCode_OFPMMFC_BAD_BAND_VALUE OfpMeterModFailedCode = 9
	OfpMeterModFailedCode_OFPMMFC_OUT_OF_METERS  OfpMeterModFailedCode = 10
	OfpMeterModFailedCode_OFPMMFC_OUT_OF_BANDS   OfpMeterModFailedCode = 11
)

var OfpMeterModFailedCode_name = map[int32]string{
	0:  "OFPMMFC_UNKNOWN",
	1:  "OFPMMFC_METER_EXISTS",
	2:  "OFPMMFC_INVALID_METER",
	3:  "OFPMMFC_UNKNOWN_METER",
	4:  "OFPMMFC_BAD_COMMAND",
	5:  "OFPMMFC_BAD_FLAGS",
	6:  "OFPMMFC_BAD_RATE",
	7:  "OFPMMFC_BAD_BURST",
	8:  "OFPMMFC_BAD_BAND",
	9:  "OFPMMFC_BAD_BAND_VALUE",
	10: "OFPMMFC_OUT_OF_METERS",
	11: "OFPMMFC_OUT_OF_BANDS",
}
var OfpMeterModFailedCode_value = map[string]int32{
	"OFPMMFC_UNKNOWN":        0,
	"OFPMMFC_METER_EXISTS":   1,
	"OFPMMFC_INVALID_METER":  2,
	"OFPMMFC_UNKNOWN_METER":  3,
	"OFPMMFC_BAD_COMMAND":    4,
	"OFPMMFC_BAD_FLAGS":      5,
	"OFPMMFC_BAD_RATE":       6,
	"OFPMMFC_BAD_BURST":      7,
	"OFPMMFC_BAD_BAND":       8,
	"OFPMMFC_BAD_BAND_VALUE": 9,
	"OFPMMFC_OUT_OF_METERS":  10,
	"OFPMMFC_OUT_OF_BANDS":   11,
}

func (x OfpMeterModFailedCode) String() string {
	return proto.EnumName(OfpMeterModFailedCode_name, int32(x))
}
func (OfpMeterModFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{43}
}

// ofp_error_msg 'code' values for OFPET_TABLE_FEATURES_FAILED. 'data' contains
// at least the first 64 bytes of the failed request.
type OfpTableFeaturesFailedCode int32

const (
	OfpTableFeaturesFailedCode_OFPTFFC_BAD_TABLE    OfpTableFeaturesFailedCode = 0
	OfpTableFeaturesFailedCode_OFPTFFC_BAD_METADATA OfpTableFeaturesFailedCode = 1
	OfpTableFeaturesFailedCode_OFPTFFC_BAD_TYPE     OfpTableFeaturesFailedCode = 2
	OfpTableFeaturesFailedCode_OFPTFFC_BAD_LEN      OfpTableFeaturesFailedCode = 3
	OfpTableFeaturesFailedCode_OFPTFFC_BAD_ARGUMENT OfpTableFeaturesFailedCode = 4
	OfpTableFeaturesFailedCode_OFPTFFC_EPERM        OfpTableFeaturesFailedCode = 5
)

var OfpTableFeaturesFailedCode_name = map[int32]string{
	0: "OFPTFFC_BAD_TABLE",
	1: "OFPTFFC_BAD_METADATA",
	2: "OFPTFFC_BAD_TYPE",
	3: "OFPTFFC_BAD_LEN",
	4: "OFPTFFC_BAD_ARGUMENT",
	5: "OFPTFFC_EPERM",
}
var OfpTableFeaturesFailedCode_value = map[string]int32{
	"OFPTFFC_BAD_TABLE":    0,
	"OFPTFFC_BAD_METADATA": 1,
	"OFPTFFC_BAD_TYPE":     2,
	"OFPTFFC_BAD_LEN":      3,
	"OFPTFFC_BAD_ARGUMENT": 4,
	"OFPTFFC_EPERM":        5,
}

func (x OfpTableFeaturesFailedCode) String() string {
	return proto.EnumName(OfpTableFeaturesFailedCode_name, int32(x))
}
func (OfpTableFeaturesFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{44}
}

type OfpMultipartType int32

const (
	// Description of this OpenFlow switch.
	// The request body is empty.
	// The reply body is struct ofp_desc.
	OfpMultipartType_OFPMP_DESC OfpMultipartType = 0
	// Individual flow statistics.
	// The request body is struct ofp_flow_stats_request.
	// The reply body is an array of struct ofp_flow_stats.
	OfpMultipartType_OFPMP_FLOW OfpMultipartType = 1
	// Aggregate flow statistics.
	// The request body is struct ofp_aggregate_stats_request.
	// The reply body is struct ofp_aggregate_stats_reply.
	OfpMultipartType_OFPMP_AGGREGATE OfpMultipartType = 2
	// Flow table statistics.
	// The request body is empty.
	// The reply body is an array of struct ofp_table_stats.
	OfpMultipartType_OFPMP_TABLE OfpMultipartType = 3
	// Port statistics.
	// The request body is struct ofp_port_stats_request.
	// The reply body is an array of struct ofp_port_stats.
	OfpMultipartType_OFPMP_PORT_STATS OfpMultipartType = 4
	// Queue statistics for a port
	// The request body is struct ofp_queue_stats_request.
	// The reply body is an array of struct ofp_queue_stats
	OfpMultipartType_OFPMP_QUEUE OfpMultipartType = 5
	// Group counter statistics.
	// The request body is struct ofp_group_stats_request.
	// The reply is an array of struct ofp_group_stats.
	OfpMultipartType_OFPMP_GROUP OfpMultipartType = 6
	// Group description.
	// The request body is empty.
	// The reply body is an array of struct ofp_group_desc.
	OfpMultipartType_OFPMP_GROUP_DESC OfpMultipartType = 7
	// Group features.
	// The request body is empty.
	// The reply body is struct ofp_group_features.
	OfpMultipartType_OFPMP_GROUP_FEATURES OfpMultipartType = 8
	// Meter statistics.
	// The request body is struct ofp_meter_multipart_requests.
	// The reply body is an array of struct ofp_meter_stats.
	OfpMultipartType_OFPMP_METER OfpMultipartType = 9
	// Meter configuration.
	// The request body is struct ofp_meter_multipart_requests.
	// The reply body is an array of struct ofp_meter_config.
	OfpMultipartType_OFPMP_METER_CONFIG OfpMultipartType = 10
	// Meter features.
	// The request body is empty.
	// The reply body is struct ofp_meter_features.
	OfpMultipartType_OFPMP_METER_FEATURES OfpMultipartType = 11
	// Table features.
	// The request body is either empty or contains an array of
	// struct ofp_table_features containing the controller's
	// desired view of the switch. If the switch is unable to
	// set the specified view an error is returned.
	// The reply body is an array of struct ofp_table_features.
	OfpMultipartType_OFPMP_TABLE_FEATURES OfpMultipartType = 12
	// Port description.
	// The request body is empty.
	// The reply body is an array of struct ofp_port.
	OfpMultipartType_OFPMP_PORT_DESC OfpMultipartType = 13
	// Experimenter extension.
	// The request and reply bodies begin with
	// struct ofp_experimenter_multipart_header.
	// The request and reply bodies are otherwise experimenter-defined.
	OfpMultipartType_OFPMP_EXPERIMENTER OfpMultipartType = 65535
)

var OfpMultipartType_name = map[int32]string{
	0:     "OFPMP_DESC",
	1:     "OFPMP_FLOW",
	2:     "OFPMP_AGGREGATE",
	3:     "OFPMP_TABLE",
	4:     "OFPMP_PORT_STATS",
	5:     "OFPMP_QUEUE",
	6:     "OFPMP_GROUP",
	7:     "OFPMP_GROUP_DESC",
	8:     "OFPMP_GROUP_FEATURES",
	9:     "OFPMP_METER",
	10:    "OFPMP_METER_CONFIG",
	11:    "OFPMP_METER_FEATURES",
	12:    "OFPMP_TABLE_FEATURES",
	13:    "OFPMP_PORT_DESC",
	65535: "OFPMP_EXPERIMENTER",
}
var OfpMultipartType_value = map[string]int32{
	"OFPMP_DESC":           0,
	"OFPMP_FLOW":           1,
	"OFPMP_AGGREGATE":      2,
	"OFPMP_TABLE":          3,
	"OFPMP_PORT_STATS":     4,
	"OFPMP_QUEUE":          5,
	"OFPMP_GROUP":          6,
	"OFPMP_GROUP_DESC":     7,
	"OFPMP_GROUP_FEATURES": 8,
	"OFPMP_METER":          9,
	"OFPMP_METER_CONFIG":   10,
	"OFPMP_METER_FEATURES": 11,
	"OFPMP_TABLE_FEATURES": 12,
	"OFPMP_PORT_DESC":      13,
	"OFPMP_EXPERIMENTER":   65535,
}

func (x OfpMultipartType) String() string {
	return proto.EnumName(OfpMultipartType_name, int32(x))
}
func (OfpMultipartType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{45}
}

type OfpMultipartRequestFlags int32

const (
	OfpMultipartRequestFlags_OFPMPF_REQ_INVALID OfpMultipartRequestFlags = 0
	OfpMultipartRequestFlags_OFPMPF_REQ_MORE    OfpMultipartRequestFlags = 1
)

var OfpMultipartRequestFlags_name = map[int32]string{
	0: "OFPMPF_REQ_INVALID",
	1: "OFPMPF_REQ_MORE",
}
var OfpMultipartRequestFlags_value = map[string]int32{
	"OFPMPF_REQ_INVALID": 0,
	"OFPMPF_REQ_MORE":    1,
}

func (x OfpMultipartRequestFlags) String() string {
	return proto.EnumName(OfpMultipartRequestFlags_name, int32(x))
}
func (OfpMultipartRequestFlags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{46}
}

type OfpMultipartReplyFlags int32

const (
	OfpMultipartReplyFlags_OFPMPF_REPLY_INVALID OfpMultipartReplyFlags = 0
	OfpMultipartReplyFlags_OFPMPF_REPLY_MORE    OfpMultipartReplyFlags = 1
)

var OfpMultipartReplyFlags_name = map[int32]string{
	0: "OFPMPF_REPLY_INVALID",
	1: "OFPMPF_REPLY_MORE",
}
var OfpMultipartReplyFlags_value = map[string]int32{
	"OFPMPF_REPLY_INVALID": 0,
	"OFPMPF_REPLY_MORE":    1,
}

func (x OfpMultipartReplyFlags) String() string {
	return proto.EnumName(OfpMultipartReplyFlags_name, int32(x))
}
func (OfpMultipartReplyFlags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{47}
}

// Table Feature property types.
// Low order bit cleared indicates a property for a regular Flow Entry.
// Low order bit set indicates a property for the Table-Miss Flow Entry.
type OfpTableFeaturePropType int32

const (
	OfpTableFeaturePropType_OFPTFPT_INSTRUCTIONS        OfpTableFeaturePropType = 0
	OfpTableFeaturePropType_OFPTFPT_INSTRUCTIONS_MISS   OfpTableFeaturePropType = 1
	OfpTableFeaturePropType_OFPTFPT_NEXT_TABLES         OfpTableFeaturePropType = 2
	OfpTableFeaturePropType_OFPTFPT_NEXT_TABLES_MISS    OfpTableFeaturePropType = 3
	OfpTableFeaturePropType_OFPTFPT_WRITE_ACTIONS       OfpTableFeaturePropType = 4
	OfpTableFeaturePropType_OFPTFPT_WRITE_ACTIONS_MISS  OfpTableFeaturePropType = 5
	OfpTableFeaturePropType_OFPTFPT_APPLY_ACTIONS       OfpTableFeaturePropType = 6
	OfpTableFeaturePropType_OFPTFPT_APPLY_ACTIONS_MISS  OfpTableFeaturePropType = 7
	OfpTableFeaturePropType_OFPTFPT_MATCH               OfpTableFeaturePropType = 8
	OfpTableFeaturePropType_OFPTFPT_WILDCARDS           OfpTableFeaturePropType = 10
	OfpTableFeaturePropType_OFPTFPT_WRITE_SETFIELD      OfpTableFeaturePropType = 12
	OfpTableFeaturePropType_OFPTFPT_WRITE_SETFIELD_MISS OfpTableFeaturePropType = 13
	OfpTableFeaturePropType_OFPTFPT_APPLY_SETFIELD      OfpTableFeaturePropType = 14
	OfpTableFeaturePropType_OFPTFPT_APPLY_SETFIELD_MISS OfpTableFeaturePropType = 15
	OfpTableFeaturePropType_OFPTFPT_EXPERIMENTER        OfpTableFeaturePropType = 65534
	OfpTableFeaturePropType_OFPTFPT_EXPERIMENTER_MISS   OfpTableFeaturePropType = 65535
)

var OfpTableFeaturePropType_name = map[int32]string{
	0:     "OFPTFPT_INSTRUCTIONS",
	1:     "OFPTFPT_INSTRUCTIONS_MISS",
	2:     "OFPTFPT_NEXT_TABLES",
	3:     "OFPTFPT_NEXT_TABLES_MISS",
	4:     "OFPTFPT_WRITE_ACTIONS",
	5:     "OFPTFPT_WRITE_ACTIONS_MISS",
	6:     "OFPTFPT_APPLY_ACTIONS",
	7:     "OFPTFPT_APPLY_ACTIONS_MISS",
	8:     "OFPTFPT_MATCH",
	10:    "OFPTFPT_WILDCARDS",
	12:    "OFPTFPT_WRITE_SETFIELD",
	13:    "OFPTFPT_WRITE_SETFIELD_MISS",
	14:    "OFPTFPT_APPLY_SETFIELD",
	15:    "OFPTFPT_APPLY_SETFIELD_MISS",
	65534: "OFPTFPT_EXPERIMENTER",
	65535: "OFPTFPT_EXPERIMENTER_MISS",
}
var OfpTableFeaturePropType_value = map[string]int32{
	"OFPTFPT_INSTRUCTIONS":        0,
	"OFPTFPT_INSTRUCTIONS_MISS":   1,
	"OFPTFPT_NEXT_TABLES":         2,
	"OFPTFPT_NEXT_TABLES_MISS":    3,
	"OFPTFPT_WRITE_ACTIONS":       4,
	"OFPTFPT_WRITE_ACTIONS_MISS":  5,
	"OFPTFPT_APPLY_ACTIONS":       6,
	"OFPTFPT_APPLY_ACTIONS_MISS":  7,
	"OFPTFPT_MATCH":               8,
	"OFPTFPT_WILDCARDS":           10,
	"OFPTFPT_WRITE_SETFIELD":      12,
	"OFPTFPT_WRITE_SETFIELD_MISS": 13,
	"OFPTFPT_APPLY_SETFIELD":      14,
	"OFPTFPT_APPLY_SETFIELD_MISS": 15,
	"OFPTFPT_EXPERIMENTER":        65534,
	"OFPTFPT_EXPERIMENTER_MISS":   65535,
}

func (x OfpTableFeaturePropType) String() string {
	return proto.EnumName(OfpTableFeaturePropType_name, int32(x))
}
func (OfpTableFeaturePropType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{48}
}

// Group configuration flags
type OfpGroupCapabilities int32

const (
	OfpGroupCapabilities_OFPGFC_INVALID         OfpGroupCapabilities = 0
	OfpGroupCapabilities_OFPGFC_SELECT_WEIGHT   OfpGroupCapabilities = 1
	OfpGroupCapabilities_OFPGFC_SELECT_LIVENESS OfpGroupCapabilities = 2
	OfpGroupCapabilities_OFPGFC_CHAINING        OfpGroupCapabilities = 4
	OfpGroupCapabilities_OFPGFC_CHAINING_CHECKS OfpGroupCapabilities = 8
)

var OfpGroupCapabilities_name = map[int32]string{
	0: "OFPGFC_INVALID",
	1: "OFPGFC_SELECT_WEIGHT",
	2: "OFPGFC_SELECT_LIVENESS",
	4: "OFPGFC_CHAINING",
	8: "OFPGFC_CHAINING_CHECKS",
}
var OfpGroupCapabilities_value = map[string]int32{
	"OFPGFC_INVALID":         0,
	"OFPGFC_SELECT_WEIGHT":   1,
	"OFPGFC_SELECT_LIVENESS": 2,
	"OFPGFC_CHAINING":        4,
	"OFPGFC_CHAINING_CHECKS": 8,
}

func (x OfpGroupCapabilities) String() string {
	return proto.EnumName(OfpGroupCapabilities_name, int32(x))
}
func (OfpGroupCapabilities) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{49}
}

type OfpQueueProperties int32

const (
	OfpQueueProperties_OFPQT_INVALID      OfpQueueProperties = 0
	OfpQueueProperties_OFPQT_MIN_RATE     OfpQueueProperties = 1
	OfpQueueProperties_OFPQT_MAX_RATE     OfpQueueProperties = 2
	OfpQueueProperties_OFPQT_EXPERIMENTER OfpQueueProperties = 65535
)

var OfpQueueProperties_name = map[int32]string{
	0:     "OFPQT_INVALID",
	1:     "OFPQT_MIN_RATE",
	2:     "OFPQT_MAX_RATE",
	65535: "OFPQT_EXPERIMENTER",
}
var OfpQueueProperties_value = map[string]int32{
	"OFPQT_INVALID":      0,
	"OFPQT_MIN_RATE":     1,
	"OFPQT_MAX_RATE":     2,
	"OFPQT_EXPERIMENTER": 65535,
}

func (x OfpQueueProperties) String() string {
	return proto.EnumName(OfpQueueProperties_name, int32(x))
}
func (OfpQueueProperties) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{50}
}

// Controller roles.
type OfpControllerRole int32

const (
	OfpControllerRole_OFPCR_ROLE_NOCHANGE OfpControllerRole = 0
	OfpControllerRole_OFPCR_ROLE_EQUAL    OfpControllerRole = 1
	OfpControllerRole_OFPCR_ROLE_MASTER   OfpControllerRole = 2
	OfpControllerRole_OFPCR_ROLE_SLAVE    OfpControllerRole = 3
)

var OfpControllerRole_name = map[int32]string{
	0: "OFPCR_ROLE_NOCHANGE",
	1: "OFPCR_ROLE_EQUAL",
	2: "OFPCR_ROLE_MASTER",
	3: "OFPCR_ROLE_SLAVE",
}
var OfpControllerRole_value = map[string]int32{
	"OFPCR_ROLE_NOCHANGE": 0,
	"OFPCR_ROLE_EQUAL":    1,
	"OFPCR_ROLE_MASTER":   2,
	"OFPCR_ROLE_SLAVE":    3,
}

func (x OfpControllerRole) String() string {
	return proto.EnumName(OfpControllerRole_name, int32(x))
}
func (OfpControllerRole) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{51}
}

// Header on all OpenFlow packets.
type OfpHeader struct {
	Version              uint32   `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
	Type                 OfpType  `protobuf:"varint,2,opt,name=type,proto3,enum=openflow_13.OfpType" json:"type,omitempty"`
	Xid                  uint32   `protobuf:"varint,3,opt,name=xid,proto3" json:"xid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpHeader) Reset()         { *m = OfpHeader{} }
func (m *OfpHeader) String() string { return proto.CompactTextString(m) }
func (*OfpHeader) ProtoMessage()    {}
func (*OfpHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{0}
}
func (m *OfpHeader) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpHeader.Unmarshal(m, b)
}
func (m *OfpHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpHeader.Marshal(b, m, deterministic)
}
func (dst *OfpHeader) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpHeader.Merge(dst, src)
}
func (m *OfpHeader) XXX_Size() int {
	return xxx_messageInfo_OfpHeader.Size(m)
}
func (m *OfpHeader) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpHeader.DiscardUnknown(m)
}

var xxx_messageInfo_OfpHeader proto.InternalMessageInfo

func (m *OfpHeader) GetVersion() uint32 {
	if m != nil {
		return m.Version
	}
	return 0
}

func (m *OfpHeader) GetType() OfpType {
	if m != nil {
		return m.Type
	}
	return OfpType_OFPT_HELLO
}

func (m *OfpHeader) GetXid() uint32 {
	if m != nil {
		return m.Xid
	}
	return 0
}

// Common header for all Hello Elements
type OfpHelloElemHeader struct {
	Type OfpHelloElemType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpHelloElemType" json:"type,omitempty"`
	// Types that are valid to be assigned to Element:
	//	*OfpHelloElemHeader_Versionbitmap
	Element              isOfpHelloElemHeader_Element `protobuf_oneof:"element"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

func (m *OfpHelloElemHeader) Reset()         { *m = OfpHelloElemHeader{} }
func (m *OfpHelloElemHeader) String() string { return proto.CompactTextString(m) }
func (*OfpHelloElemHeader) ProtoMessage()    {}
func (*OfpHelloElemHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{1}
}
func (m *OfpHelloElemHeader) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpHelloElemHeader.Unmarshal(m, b)
}
func (m *OfpHelloElemHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpHelloElemHeader.Marshal(b, m, deterministic)
}
func (dst *OfpHelloElemHeader) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpHelloElemHeader.Merge(dst, src)
}
func (m *OfpHelloElemHeader) XXX_Size() int {
	return xxx_messageInfo_OfpHelloElemHeader.Size(m)
}
func (m *OfpHelloElemHeader) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpHelloElemHeader.DiscardUnknown(m)
}

var xxx_messageInfo_OfpHelloElemHeader proto.InternalMessageInfo

func (m *OfpHelloElemHeader) GetType() OfpHelloElemType {
	if m != nil {
		return m.Type
	}
	return OfpHelloElemType_OFPHET_INVALID
}

type isOfpHelloElemHeader_Element interface {
	isOfpHelloElemHeader_Element()
}

type OfpHelloElemHeader_Versionbitmap struct {
	Versionbitmap *OfpHelloElemVersionbitmap `protobuf:"bytes,2,opt,name=versionbitmap,proto3,oneof"`
}

func (*OfpHelloElemHeader_Versionbitmap) isOfpHelloElemHeader_Element() {}

func (m *OfpHelloElemHeader) GetElement() isOfpHelloElemHeader_Element {
	if m != nil {
		return m.Element
	}
	return nil
}

func (m *OfpHelloElemHeader) GetVersionbitmap() *OfpHelloElemVersionbitmap {
	if x, ok := m.GetElement().(*OfpHelloElemHeader_Versionbitmap); ok {
		return x.Versionbitmap
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*OfpHelloElemHeader) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _OfpHelloElemHeader_OneofMarshaler, _OfpHelloElemHeader_OneofUnmarshaler, _OfpHelloElemHeader_OneofSizer, []interface{}{
		(*OfpHelloElemHeader_Versionbitmap)(nil),
	}
}

func _OfpHelloElemHeader_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*OfpHelloElemHeader)
	// element
	switch x := m.Element.(type) {
	case *OfpHelloElemHeader_Versionbitmap:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Versionbitmap); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("OfpHelloElemHeader.Element has unexpected type %T", x)
	}
	return nil
}

func _OfpHelloElemHeader_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*OfpHelloElemHeader)
	switch tag {
	case 2: // element.versionbitmap
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpHelloElemVersionbitmap)
		err := b.DecodeMessage(msg)
		m.Element = &OfpHelloElemHeader_Versionbitmap{msg}
		return true, err
	default:
		return false, nil
	}
}

func _OfpHelloElemHeader_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*OfpHelloElemHeader)
	// element
	switch x := m.Element.(type) {
	case *OfpHelloElemHeader_Versionbitmap:
		s := proto.Size(x.Versionbitmap)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Version bitmap Hello Element
type OfpHelloElemVersionbitmap struct {
	Bitmaps              []uint32 `protobuf:"varint,2,rep,packed,name=bitmaps,proto3" json:"bitmaps,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpHelloElemVersionbitmap) Reset()         { *m = OfpHelloElemVersionbitmap{} }
func (m *OfpHelloElemVersionbitmap) String() string { return proto.CompactTextString(m) }
func (*OfpHelloElemVersionbitmap) ProtoMessage()    {}
func (*OfpHelloElemVersionbitmap) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{2}
}
func (m *OfpHelloElemVersionbitmap) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpHelloElemVersionbitmap.Unmarshal(m, b)
}
func (m *OfpHelloElemVersionbitmap) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpHelloElemVersionbitmap.Marshal(b, m, deterministic)
}
func (dst *OfpHelloElemVersionbitmap) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpHelloElemVersionbitmap.Merge(dst, src)
}
func (m *OfpHelloElemVersionbitmap) XXX_Size() int {
	return xxx_messageInfo_OfpHelloElemVersionbitmap.Size(m)
}
func (m *OfpHelloElemVersionbitmap) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpHelloElemVersionbitmap.DiscardUnknown(m)
}

var xxx_messageInfo_OfpHelloElemVersionbitmap proto.InternalMessageInfo

func (m *OfpHelloElemVersionbitmap) GetBitmaps() []uint32 {
	if m != nil {
		return m.Bitmaps
	}
	return nil
}

// OFPT_HELLO.  This message includes zero or more hello elements having
// variable size. Unknown elements types must be ignored/skipped, to allow
// for future extensions.
type OfpHello struct {
	// Hello element list
	Elements             []*OfpHelloElemHeader `protobuf:"bytes,1,rep,name=elements,proto3" json:"elements,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *OfpHello) Reset()         { *m = OfpHello{} }
func (m *OfpHello) String() string { return proto.CompactTextString(m) }
func (*OfpHello) ProtoMessage()    {}
func (*OfpHello) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{3}
}
func (m *OfpHello) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpHello.Unmarshal(m, b)
}
func (m *OfpHello) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpHello.Marshal(b, m, deterministic)
}
func (dst *OfpHello) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpHello.Merge(dst, src)
}
func (m *OfpHello) XXX_Size() int {
	return xxx_messageInfo_OfpHello.Size(m)
}
func (m *OfpHello) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpHello.DiscardUnknown(m)
}

var xxx_messageInfo_OfpHello proto.InternalMessageInfo

func (m *OfpHello) GetElements() []*OfpHelloElemHeader {
	if m != nil {
		return m.Elements
	}
	return nil
}

// Switch configuration.
type OfpSwitchConfig struct {
	// ofp_header header;
	Flags                uint32   `protobuf:"varint,1,opt,name=flags,proto3" json:"flags,omitempty"`
	MissSendLen          uint32   `protobuf:"varint,2,opt,name=miss_send_len,json=missSendLen,proto3" json:"miss_send_len,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpSwitchConfig) Reset()         { *m = OfpSwitchConfig{} }
func (m *OfpSwitchConfig) String() string { return proto.CompactTextString(m) }
func (*OfpSwitchConfig) ProtoMessage()    {}
func (*OfpSwitchConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{4}
}
func (m *OfpSwitchConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpSwitchConfig.Unmarshal(m, b)
}
func (m *OfpSwitchConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpSwitchConfig.Marshal(b, m, deterministic)
}
func (dst *OfpSwitchConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpSwitchConfig.Merge(dst, src)
}
func (m *OfpSwitchConfig) XXX_Size() int {
	return xxx_messageInfo_OfpSwitchConfig.Size(m)
}
func (m *OfpSwitchConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpSwitchConfig.DiscardUnknown(m)
}

var xxx_messageInfo_OfpSwitchConfig proto.InternalMessageInfo

func (m *OfpSwitchConfig) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpSwitchConfig) GetMissSendLen() uint32 {
	if m != nil {
		return m.MissSendLen
	}
	return 0
}

// Configure/Modify behavior of a flow table
type OfpTableMod struct {
	// ofp_header header;
	TableId              uint32   `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	Config               uint32   `protobuf:"varint,2,opt,name=config,proto3" json:"config,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpTableMod) Reset()         { *m = OfpTableMod{} }
func (m *OfpTableMod) String() string { return proto.CompactTextString(m) }
func (*OfpTableMod) ProtoMessage()    {}
func (*OfpTableMod) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{5}
}
func (m *OfpTableMod) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpTableMod.Unmarshal(m, b)
}
func (m *OfpTableMod) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpTableMod.Marshal(b, m, deterministic)
}
func (dst *OfpTableMod) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpTableMod.Merge(dst, src)
}
func (m *OfpTableMod) XXX_Size() int {
	return xxx_messageInfo_OfpTableMod.Size(m)
}
func (m *OfpTableMod) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpTableMod.DiscardUnknown(m)
}

var xxx_messageInfo_OfpTableMod proto.InternalMessageInfo

func (m *OfpTableMod) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpTableMod) GetConfig() uint32 {
	if m != nil {
		return m.Config
	}
	return 0
}

// Description of a port
type OfpPort struct {
	PortNo uint32   `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	HwAddr []uint32 `protobuf:"varint,2,rep,packed,name=hw_addr,json=hwAddr,proto3" json:"hw_addr,omitempty"`
	Name   string   `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
	Config uint32   `protobuf:"varint,4,opt,name=config,proto3" json:"config,omitempty"`
	State  uint32   `protobuf:"varint,5,opt,name=state,proto3" json:"state,omitempty"`
	// Bitmaps of OFPPF_* that describe features.  All bits zeroed if
	// unsupported or unavailable.
	Curr                 uint32   `protobuf:"varint,6,opt,name=curr,proto3" json:"curr,omitempty"`
	Advertised           uint32   `protobuf:"varint,7,opt,name=advertised,proto3" json:"advertised,omitempty"`
	Supported            uint32   `protobuf:"varint,8,opt,name=supported,proto3" json:"supported,omitempty"`
	Peer                 uint32   `protobuf:"varint,9,opt,name=peer,proto3" json:"peer,omitempty"`
	CurrSpeed            uint32   `protobuf:"varint,10,opt,name=curr_speed,json=currSpeed,proto3" json:"curr_speed,omitempty"`
	MaxSpeed             uint32   `protobuf:"varint,11,opt,name=max_speed,json=maxSpeed,proto3" json:"max_speed,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpPort) Reset()         { *m = OfpPort{} }
func (m *OfpPort) String() string { return proto.CompactTextString(m) }
func (*OfpPort) ProtoMessage()    {}
func (*OfpPort) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{6}
}
func (m *OfpPort) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpPort.Unmarshal(m, b)
}
func (m *OfpPort) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpPort.Marshal(b, m, deterministic)
}
func (dst *OfpPort) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpPort.Merge(dst, src)
}
func (m *OfpPort) XXX_Size() int {
	return xxx_messageInfo_OfpPort.Size(m)
}
func (m *OfpPort) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpPort.DiscardUnknown(m)
}

var xxx_messageInfo_OfpPort proto.InternalMessageInfo

func (m *OfpPort) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *OfpPort) GetHwAddr() []uint32 {
	if m != nil {
		return m.HwAddr
	}
	return nil
}

func (m *OfpPort) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *OfpPort) GetConfig() uint32 {
	if m != nil {
		return m.Config
	}
	return 0
}

func (m *OfpPort) GetState() uint32 {
	if m != nil {
		return m.State
	}
	return 0
}

func (m *OfpPort) GetCurr() uint32 {
	if m != nil {
		return m.Curr
	}
	return 0
}

func (m *OfpPort) GetAdvertised() uint32 {
	if m != nil {
		return m.Advertised
	}
	return 0
}

func (m *OfpPort) GetSupported() uint32 {
	if m != nil {
		return m.Supported
	}
	return 0
}

func (m *OfpPort) GetPeer() uint32 {
	if m != nil {
		return m.Peer
	}
	return 0
}

func (m *OfpPort) GetCurrSpeed() uint32 {
	if m != nil {
		return m.CurrSpeed
	}
	return 0
}

func (m *OfpPort) GetMaxSpeed() uint32 {
	if m != nil {
		return m.MaxSpeed
	}
	return 0
}

// Switch features.
type OfpSwitchFeatures struct {
	// ofp_header header;
	DatapathId  uint64 `protobuf:"varint,1,opt,name=datapath_id,json=datapathId,proto3" json:"datapath_id,omitempty"`
	NBuffers    uint32 `protobuf:"varint,2,opt,name=n_buffers,json=nBuffers,proto3" json:"n_buffers,omitempty"`
	NTables     uint32 `protobuf:"varint,3,opt,name=n_tables,json=nTables,proto3" json:"n_tables,omitempty"`
	AuxiliaryId uint32 `protobuf:"varint,4,opt,name=auxiliary_id,json=auxiliaryId,proto3" json:"auxiliary_id,omitempty"`
	// Features.
	Capabilities         uint32   `protobuf:"varint,5,opt,name=capabilities,proto3" json:"capabilities,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpSwitchFeatures) Reset()         { *m = OfpSwitchFeatures{} }
func (m *OfpSwitchFeatures) String() string { return proto.CompactTextString(m) }
func (*OfpSwitchFeatures) ProtoMessage()    {}
func (*OfpSwitchFeatures) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{7}
}
func (m *OfpSwitchFeatures) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpSwitchFeatures.Unmarshal(m, b)
}
func (m *OfpSwitchFeatures) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpSwitchFeatures.Marshal(b, m, deterministic)
}
func (dst *OfpSwitchFeatures) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpSwitchFeatures.Merge(dst, src)
}
func (m *OfpSwitchFeatures) XXX_Size() int {
	return xxx_messageInfo_OfpSwitchFeatures.Size(m)
}
func (m *OfpSwitchFeatures) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpSwitchFeatures.DiscardUnknown(m)
}

var xxx_messageInfo_OfpSwitchFeatures proto.InternalMessageInfo

func (m *OfpSwitchFeatures) GetDatapathId() uint64 {
	if m != nil {
		return m.DatapathId
	}
	return 0
}

func (m *OfpSwitchFeatures) GetNBuffers() uint32 {
	if m != nil {
		return m.NBuffers
	}
	return 0
}

func (m *OfpSwitchFeatures) GetNTables() uint32 {
	if m != nil {
		return m.NTables
	}
	return 0
}

func (m *OfpSwitchFeatures) GetAuxiliaryId() uint32 {
	if m != nil {
		return m.AuxiliaryId
	}
	return 0
}

func (m *OfpSwitchFeatures) GetCapabilities() uint32 {
	if m != nil {
		return m.Capabilities
	}
	return 0
}

// A physical port has changed in the datapath
type OfpPortStatus struct {
	// ofp_header header;
	Reason               OfpPortReason `protobuf:"varint,1,opt,name=reason,proto3,enum=openflow_13.OfpPortReason" json:"reason,omitempty"`
	Desc                 *OfpPort      `protobuf:"bytes,2,opt,name=desc,proto3" json:"desc,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *OfpPortStatus) Reset()         { *m = OfpPortStatus{} }
func (m *OfpPortStatus) String() string { return proto.CompactTextString(m) }
func (*OfpPortStatus) ProtoMessage()    {}
func (*OfpPortStatus) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{8}
}
func (m *OfpPortStatus) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpPortStatus.Unmarshal(m, b)
}
func (m *OfpPortStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpPortStatus.Marshal(b, m, deterministic)
}
func (dst *OfpPortStatus) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpPortStatus.Merge(dst, src)
}
func (m *OfpPortStatus) XXX_Size() int {
	return xxx_messageInfo_OfpPortStatus.Size(m)
}
func (m *OfpPortStatus) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpPortStatus.DiscardUnknown(m)
}

var xxx_messageInfo_OfpPortStatus proto.InternalMessageInfo

func (m *OfpPortStatus) GetReason() OfpPortReason {
	if m != nil {
		return m.Reason
	}
	return OfpPortReason_OFPPR_ADD
}

func (m *OfpPortStatus) GetDesc() *OfpPort {
	if m != nil {
		return m.Desc
	}
	return nil
}

// Modify behavior of the physical port
type OfpPortMod struct {
	// ofp_header header;
	PortNo uint32   `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	HwAddr []uint32 `protobuf:"varint,2,rep,packed,name=hw_addr,json=hwAddr,proto3" json:"hw_addr,omitempty"`
	// The hardware address is not
	// configurable.  This is used to
	// sanity-check the request, so it must
	// be the same as returned in an
	// ofp_port struct.
	Config               uint32   `protobuf:"varint,3,opt,name=config,proto3" json:"config,omitempty"`
	Mask                 uint32   `protobuf:"varint,4,opt,name=mask,proto3" json:"mask,omitempty"`
	Advertise            uint32   `protobuf:"varint,5,opt,name=advertise,proto3" json:"advertise,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpPortMod) Reset()         { *m = OfpPortMod{} }
func (m *OfpPortMod) String() string { return proto.CompactTextString(m) }
func (*OfpPortMod) ProtoMessage()    {}
func (*OfpPortMod) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{9}
}
func (m *OfpPortMod) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpPortMod.Unmarshal(m, b)
}
func (m *OfpPortMod) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpPortMod.Marshal(b, m, deterministic)
}
func (dst *OfpPortMod) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpPortMod.Merge(dst, src)
}
func (m *OfpPortMod) XXX_Size() int {
	return xxx_messageInfo_OfpPortMod.Size(m)
}
func (m *OfpPortMod) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpPortMod.DiscardUnknown(m)
}

var xxx_messageInfo_OfpPortMod proto.InternalMessageInfo

func (m *OfpPortMod) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *OfpPortMod) GetHwAddr() []uint32 {
	if m != nil {
		return m.HwAddr
	}
	return nil
}

func (m *OfpPortMod) GetConfig() uint32 {
	if m != nil {
		return m.Config
	}
	return 0
}

func (m *OfpPortMod) GetMask() uint32 {
	if m != nil {
		return m.Mask
	}
	return 0
}

func (m *OfpPortMod) GetAdvertise() uint32 {
	if m != nil {
		return m.Advertise
	}
	return 0
}

// Fields to match against flows
type OfpMatch struct {
	Type                 OfpMatchType   `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpMatchType" json:"type,omitempty"`
	OxmFields            []*OfpOxmField `protobuf:"bytes,2,rep,name=oxm_fields,json=oxmFields,proto3" json:"oxm_fields,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *OfpMatch) Reset()         { *m = OfpMatch{} }
func (m *OfpMatch) String() string { return proto.CompactTextString(m) }
func (*OfpMatch) ProtoMessage()    {}
func (*OfpMatch) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{10}
}
func (m *OfpMatch) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMatch.Unmarshal(m, b)
}
func (m *OfpMatch) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMatch.Marshal(b, m, deterministic)
}
func (dst *OfpMatch) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMatch.Merge(dst, src)
}
func (m *OfpMatch) XXX_Size() int {
	return xxx_messageInfo_OfpMatch.Size(m)
}
func (m *OfpMatch) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMatch.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMatch proto.InternalMessageInfo

func (m *OfpMatch) GetType() OfpMatchType {
	if m != nil {
		return m.Type
	}
	return OfpMatchType_OFPMT_STANDARD
}

func (m *OfpMatch) GetOxmFields() []*OfpOxmField {
	if m != nil {
		return m.OxmFields
	}
	return nil
}

// OXM Flow match fields
type OfpOxmField struct {
	OxmClass OfpOxmClass `protobuf:"varint,1,opt,name=oxm_class,json=oxmClass,proto3,enum=openflow_13.OfpOxmClass" json:"oxm_class,omitempty"`
	// Types that are valid to be assigned to Field:
	//	*OfpOxmField_OfbField
	//	*OfpOxmField_ExperimenterField
	Field                isOfpOxmField_Field `protobuf_oneof:"field"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *OfpOxmField) Reset()         { *m = OfpOxmField{} }
func (m *OfpOxmField) String() string { return proto.CompactTextString(m) }
func (*OfpOxmField) ProtoMessage()    {}
func (*OfpOxmField) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{11}
}
func (m *OfpOxmField) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpOxmField.Unmarshal(m, b)
}
func (m *OfpOxmField) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpOxmField.Marshal(b, m, deterministic)
}
func (dst *OfpOxmField) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpOxmField.Merge(dst, src)
}
func (m *OfpOxmField) XXX_Size() int {
	return xxx_messageInfo_OfpOxmField.Size(m)
}
func (m *OfpOxmField) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpOxmField.DiscardUnknown(m)
}

var xxx_messageInfo_OfpOxmField proto.InternalMessageInfo

func (m *OfpOxmField) GetOxmClass() OfpOxmClass {
	if m != nil {
		return m.OxmClass
	}
	return OfpOxmClass_OFPXMC_NXM_0
}

type isOfpOxmField_Field interface {
	isOfpOxmField_Field()
}

type OfpOxmField_OfbField struct {
	OfbField *OfpOxmOfbField `protobuf:"bytes,4,opt,name=ofb_field,json=ofbField,proto3,oneof"`
}

type OfpOxmField_ExperimenterField struct {
	ExperimenterField *OfpOxmExperimenterField `protobuf:"bytes,5,opt,name=experimenter_field,json=experimenterField,proto3,oneof"`
}

func (*OfpOxmField_OfbField) isOfpOxmField_Field() {}

func (*OfpOxmField_ExperimenterField) isOfpOxmField_Field() {}

func (m *OfpOxmField) GetField() isOfpOxmField_Field {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *OfpOxmField) GetOfbField() *OfpOxmOfbField {
	if x, ok := m.GetField().(*OfpOxmField_OfbField); ok {
		return x.OfbField
	}
	return nil
}

func (m *OfpOxmField) GetExperimenterField() *OfpOxmExperimenterField {
	if x, ok := m.GetField().(*OfpOxmField_ExperimenterField); ok {
		return x.ExperimenterField
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*OfpOxmField) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _OfpOxmField_OneofMarshaler, _OfpOxmField_OneofUnmarshaler, _OfpOxmField_OneofSizer, []interface{}{
		(*OfpOxmField_OfbField)(nil),
		(*OfpOxmField_ExperimenterField)(nil),
	}
}

func _OfpOxmField_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*OfpOxmField)
	// field
	switch x := m.Field.(type) {
	case *OfpOxmField_OfbField:
		b.EncodeVarint(4<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.OfbField); err != nil {
			return err
		}
	case *OfpOxmField_ExperimenterField:
		b.EncodeVarint(5<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.ExperimenterField); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("OfpOxmField.Field has unexpected type %T", x)
	}
	return nil
}

func _OfpOxmField_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*OfpOxmField)
	switch tag {
	case 4: // field.ofb_field
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpOxmOfbField)
		err := b.DecodeMessage(msg)
		m.Field = &OfpOxmField_OfbField{msg}
		return true, err
	case 5: // field.experimenter_field
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpOxmExperimenterField)
		err := b.DecodeMessage(msg)
		m.Field = &OfpOxmField_ExperimenterField{msg}
		return true, err
	default:
		return false, nil
	}
}

func _OfpOxmField_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*OfpOxmField)
	// field
	switch x := m.Field.(type) {
	case *OfpOxmField_OfbField:
		s := proto.Size(x.OfbField)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpOxmField_ExperimenterField:
		s := proto.Size(x.ExperimenterField)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// OXM OpenFlow Basic Match Field
type OfpOxmOfbField struct {
	Type    OxmOfbFieldTypes `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OxmOfbFieldTypes" json:"type,omitempty"`
	HasMask bool             `protobuf:"varint,2,opt,name=has_mask,json=hasMask,proto3" json:"has_mask,omitempty"`
	// Types that are valid to be assigned to Value:
	//	*OfpOxmOfbField_Port
	//	*OfpOxmOfbField_PhysicalPort
	//	*OfpOxmOfbField_TableMetadata
	//	*OfpOxmOfbField_EthDst
	//	*OfpOxmOfbField_EthSrc
	//	*OfpOxmOfbField_EthType
	//	*OfpOxmOfbField_VlanVid
	//	*OfpOxmOfbField_VlanPcp
	//	*OfpOxmOfbField_IpDscp
	//	*OfpOxmOfbField_IpEcn
	//	*OfpOxmOfbField_IpProto
	//	*OfpOxmOfbField_Ipv4Src
	//	*OfpOxmOfbField_Ipv4Dst
	//	*OfpOxmOfbField_TcpSrc
	//	*OfpOxmOfbField_TcpDst
	//	*OfpOxmOfbField_UdpSrc
	//	*OfpOxmOfbField_UdpDst
	//	*OfpOxmOfbField_SctpSrc
	//	*OfpOxmOfbField_SctpDst
	//	*OfpOxmOfbField_Icmpv4Type
	//	*OfpOxmOfbField_Icmpv4Code
	//	*OfpOxmOfbField_ArpOp
	//	*OfpOxmOfbField_ArpSpa
	//	*OfpOxmOfbField_ArpTpa
	//	*OfpOxmOfbField_ArpSha
	//	*OfpOxmOfbField_ArpTha
	//	*OfpOxmOfbField_Ipv6Src
	//	*OfpOxmOfbField_Ipv6Dst
	//	*OfpOxmOfbField_Ipv6Flabel
	//	*OfpOxmOfbField_Icmpv6Type
	//	*OfpOxmOfbField_Icmpv6Code
	//	*OfpOxmOfbField_Ipv6NdTarget
	//	*OfpOxmOfbField_Ipv6NdSsl
	//	*OfpOxmOfbField_Ipv6NdTll
	//	*OfpOxmOfbField_MplsLabel
	//	*OfpOxmOfbField_MplsTc
	//	*OfpOxmOfbField_MplsBos
	//	*OfpOxmOfbField_PbbIsid
	//	*OfpOxmOfbField_TunnelId
	//	*OfpOxmOfbField_Ipv6Exthdr
	Value isOfpOxmOfbField_Value `protobuf_oneof:"value"`
	// Optional mask values (must be present when has_mask is true
	//
	// Types that are valid to be assigned to Mask:
	//	*OfpOxmOfbField_TableMetadataMask
	//	*OfpOxmOfbField_EthDstMask
	//	*OfpOxmOfbField_EthSrcMask
	//	*OfpOxmOfbField_VlanVidMask
	//	*OfpOxmOfbField_Ipv4SrcMask
	//	*OfpOxmOfbField_Ipv4DstMask
	//	*OfpOxmOfbField_ArpSpaMask
	//	*OfpOxmOfbField_ArpTpaMask
	//	*OfpOxmOfbField_Ipv6SrcMask
	//	*OfpOxmOfbField_Ipv6DstMask
	//	*OfpOxmOfbField_Ipv6FlabelMask
	//	*OfpOxmOfbField_PbbIsidMask
	//	*OfpOxmOfbField_TunnelIdMask
	//	*OfpOxmOfbField_Ipv6ExthdrMask
	Mask                 isOfpOxmOfbField_Mask `protobuf_oneof:"mask"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *OfpOxmOfbField) Reset()         { *m = OfpOxmOfbField{} }
func (m *OfpOxmOfbField) String() string { return proto.CompactTextString(m) }
func (*OfpOxmOfbField) ProtoMessage()    {}
func (*OfpOxmOfbField) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{12}
}
func (m *OfpOxmOfbField) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpOxmOfbField.Unmarshal(m, b)
}
func (m *OfpOxmOfbField) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpOxmOfbField.Marshal(b, m, deterministic)
}
func (dst *OfpOxmOfbField) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpOxmOfbField.Merge(dst, src)
}
func (m *OfpOxmOfbField) XXX_Size() int {
	return xxx_messageInfo_OfpOxmOfbField.Size(m)
}
func (m *OfpOxmOfbField) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpOxmOfbField.DiscardUnknown(m)
}

var xxx_messageInfo_OfpOxmOfbField proto.InternalMessageInfo

func (m *OfpOxmOfbField) GetType() OxmOfbFieldTypes {
	if m != nil {
		return m.Type
	}
	return OxmOfbFieldTypes_OFPXMT_OFB_IN_PORT
}

func (m *OfpOxmOfbField) GetHasMask() bool {
	if m != nil {
		return m.HasMask
	}
	return false
}

type isOfpOxmOfbField_Value interface {
	isOfpOxmOfbField_Value()
}

type OfpOxmOfbField_Port struct {
	Port uint32 `protobuf:"varint,3,opt,name=port,proto3,oneof"`
}

type OfpOxmOfbField_PhysicalPort struct {
	PhysicalPort uint32 `protobuf:"varint,4,opt,name=physical_port,json=physicalPort,proto3,oneof"`
}

type OfpOxmOfbField_TableMetadata struct {
	TableMetadata uint64 `protobuf:"varint,5,opt,name=table_metadata,json=tableMetadata,proto3,oneof"`
}

type OfpOxmOfbField_EthDst struct {
	EthDst []byte `protobuf:"bytes,6,opt,name=eth_dst,json=ethDst,proto3,oneof"`
}

type OfpOxmOfbField_EthSrc struct {
	EthSrc []byte `protobuf:"bytes,7,opt,name=eth_src,json=ethSrc,proto3,oneof"`
}

type OfpOxmOfbField_EthType struct {
	EthType uint32 `protobuf:"varint,8,opt,name=eth_type,json=ethType,proto3,oneof"`
}

type OfpOxmOfbField_VlanVid struct {
	VlanVid uint32 `protobuf:"varint,9,opt,name=vlan_vid,json=vlanVid,proto3,oneof"`
}

type OfpOxmOfbField_VlanPcp struct {
	VlanPcp uint32 `protobuf:"varint,10,opt,name=vlan_pcp,json=vlanPcp,proto3,oneof"`
}

type OfpOxmOfbField_IpDscp struct {
	IpDscp uint32 `protobuf:"varint,11,opt,name=ip_dscp,json=ipDscp,proto3,oneof"`
}

type OfpOxmOfbField_IpEcn struct {
	IpEcn uint32 `protobuf:"varint,12,opt,name=ip_ecn,json=ipEcn,proto3,oneof"`
}

type OfpOxmOfbField_IpProto struct {
	IpProto uint32 `protobuf:"varint,13,opt,name=ip_proto,json=ipProto,proto3,oneof"`
}

type OfpOxmOfbField_Ipv4Src struct {
	Ipv4Src uint32 `protobuf:"varint,14,opt,name=ipv4_src,json=ipv4Src,proto3,oneof"`
}

type OfpOxmOfbField_Ipv4Dst struct {
	Ipv4Dst uint32 `protobuf:"varint,15,opt,name=ipv4_dst,json=ipv4Dst,proto3,oneof"`
}

type OfpOxmOfbField_TcpSrc struct {
	TcpSrc uint32 `protobuf:"varint,16,opt,name=tcp_src,json=tcpSrc,proto3,oneof"`
}

type OfpOxmOfbField_TcpDst struct {
	TcpDst uint32 `protobuf:"varint,17,opt,name=tcp_dst,json=tcpDst,proto3,oneof"`
}

type OfpOxmOfbField_UdpSrc struct {
	UdpSrc uint32 `protobuf:"varint,18,opt,name=udp_src,json=udpSrc,proto3,oneof"`
}

type OfpOxmOfbField_UdpDst struct {
	UdpDst uint32 `protobuf:"varint,19,opt,name=udp_dst,json=udpDst,proto3,oneof"`
}

type OfpOxmOfbField_SctpSrc struct {
	SctpSrc uint32 `protobuf:"varint,20,opt,name=sctp_src,json=sctpSrc,proto3,oneof"`
}

type OfpOxmOfbField_SctpDst struct {
	SctpDst uint32 `protobuf:"varint,21,opt,name=sctp_dst,json=sctpDst,proto3,oneof"`
}

type OfpOxmOfbField_Icmpv4Type struct {
	Icmpv4Type uint32 `protobuf:"varint,22,opt,name=icmpv4_type,json=icmpv4Type,proto3,oneof"`
}

type OfpOxmOfbField_Icmpv4Code struct {
	Icmpv4Code uint32 `protobuf:"varint,23,opt,name=icmpv4_code,json=icmpv4Code,proto3,oneof"`
}

type OfpOxmOfbField_ArpOp struct {
	ArpOp uint32 `protobuf:"varint,24,opt,name=arp_op,json=arpOp,proto3,oneof"`
}

type OfpOxmOfbField_ArpSpa struct {
	ArpSpa uint32 `protobuf:"varint,25,opt,name=arp_spa,json=arpSpa,proto3,oneof"`
}

type OfpOxmOfbField_ArpTpa struct {
	ArpTpa uint32 `protobuf:"varint,26,opt,name=arp_tpa,json=arpTpa,proto3,oneof"`
}

type OfpOxmOfbField_ArpSha struct {
	ArpSha []byte `protobuf:"bytes,27,opt,name=arp_sha,json=arpSha,proto3,oneof"`
}

type OfpOxmOfbField_ArpTha struct {
	ArpTha []byte `protobuf:"bytes,28,opt,name=arp_tha,json=arpTha,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6Src struct {
	Ipv6Src []byte `protobuf:"bytes,29,opt,name=ipv6_src,json=ipv6Src,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6Dst struct {
	Ipv6Dst []byte `protobuf:"bytes,30,opt,name=ipv6_dst,json=ipv6Dst,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6Flabel struct {
	Ipv6Flabel uint32 `protobuf:"varint,31,opt,name=ipv6_flabel,json=ipv6Flabel,proto3,oneof"`
}

type OfpOxmOfbField_Icmpv6Type struct {
	Icmpv6Type uint32 `protobuf:"varint,32,opt,name=icmpv6_type,json=icmpv6Type,proto3,oneof"`
}

type OfpOxmOfbField_Icmpv6Code struct {
	Icmpv6Code uint32 `protobuf:"varint,33,opt,name=icmpv6_code,json=icmpv6Code,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6NdTarget struct {
	Ipv6NdTarget []byte `protobuf:"bytes,34,opt,name=ipv6_nd_target,json=ipv6NdTarget,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6NdSsl struct {
	Ipv6NdSsl []byte `protobuf:"bytes,35,opt,name=ipv6_nd_ssl,json=ipv6NdSsl,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6NdTll struct {
	Ipv6NdTll []byte `protobuf:"bytes,36,opt,name=ipv6_nd_tll,json=ipv6NdTll,proto3,oneof"`
}

type OfpOxmOfbField_MplsLabel struct {
	MplsLabel uint32 `protobuf:"varint,37,opt,name=mpls_label,json=mplsLabel,proto3,oneof"`
}

type OfpOxmOfbField_MplsTc struct {
	MplsTc uint32 `protobuf:"varint,38,opt,name=mpls_tc,json=mplsTc,proto3,oneof"`
}

type OfpOxmOfbField_MplsBos struct {
	MplsBos uint32 `protobuf:"varint,39,opt,name=mpls_bos,json=mplsBos,proto3,oneof"`
}

type OfpOxmOfbField_PbbIsid struct {
	PbbIsid uint32 `protobuf:"varint,40,opt,name=pbb_isid,json=pbbIsid,proto3,oneof"`
}

type OfpOxmOfbField_TunnelId struct {
	TunnelId uint64 `protobuf:"varint,41,opt,name=tunnel_id,json=tunnelId,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6Exthdr struct {
	Ipv6Exthdr uint32 `protobuf:"varint,42,opt,name=ipv6_exthdr,json=ipv6Exthdr,proto3,oneof"`
}

func (*OfpOxmOfbField_Port) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_PhysicalPort) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_TableMetadata) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_EthDst) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_EthSrc) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_EthType) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_VlanVid) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_VlanPcp) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_IpDscp) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_IpEcn) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_IpProto) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv4Src) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv4Dst) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_TcpSrc) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_TcpDst) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_UdpSrc) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_UdpDst) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_SctpSrc) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_SctpDst) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Icmpv4Type) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Icmpv4Code) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_ArpOp) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_ArpSpa) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_ArpTpa) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_ArpSha) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_ArpTha) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6Src) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6Dst) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6Flabel) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Icmpv6Type) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Icmpv6Code) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6NdTarget) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6NdSsl) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6NdTll) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_MplsLabel) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_MplsTc) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_MplsBos) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_PbbIsid) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_TunnelId) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6Exthdr) isOfpOxmOfbField_Value() {}

func (m *OfpOxmOfbField) GetValue() isOfpOxmOfbField_Value {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *OfpOxmOfbField) GetPort() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Port); ok {
		return x.Port
	}
	return 0
}

func (m *OfpOxmOfbField) GetPhysicalPort() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_PhysicalPort); ok {
		return x.PhysicalPort
	}
	return 0
}

func (m *OfpOxmOfbField) GetTableMetadata() uint64 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_TableMetadata); ok {
		return x.TableMetadata
	}
	return 0
}

func (m *OfpOxmOfbField) GetEthDst() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_EthDst); ok {
		return x.EthDst
	}
	return nil
}

func (m *OfpOxmOfbField) GetEthSrc() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_EthSrc); ok {
		return x.EthSrc
	}
	return nil
}

func (m *OfpOxmOfbField) GetEthType() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_EthType); ok {
		return x.EthType
	}
	return 0
}

func (m *OfpOxmOfbField) GetVlanVid() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_VlanVid); ok {
		return x.VlanVid
	}
	return 0
}

func (m *OfpOxmOfbField) GetVlanPcp() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_VlanPcp); ok {
		return x.VlanPcp
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpDscp() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_IpDscp); ok {
		return x.IpDscp
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpEcn() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_IpEcn); ok {
		return x.IpEcn
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpProto() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_IpProto); ok {
		return x.IpProto
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv4Src() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv4Src); ok {
		return x.Ipv4Src
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv4Dst() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv4Dst); ok {
		return x.Ipv4Dst
	}
	return 0
}

func (m *OfpOxmOfbField) GetTcpSrc() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_TcpSrc); ok {
		return x.TcpSrc
	}
	return 0
}

func (m *OfpOxmOfbField) GetTcpDst() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_TcpDst); ok {
		return x.TcpDst
	}
	return 0
}

func (m *OfpOxmOfbField) GetUdpSrc() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_UdpSrc); ok {
		return x.UdpSrc
	}
	return 0
}

func (m *OfpOxmOfbField) GetUdpDst() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_UdpDst); ok {
		return x.UdpDst
	}
	return 0
}

func (m *OfpOxmOfbField) GetSctpSrc() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_SctpSrc); ok {
		return x.SctpSrc
	}
	return 0
}

func (m *OfpOxmOfbField) GetSctpDst() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_SctpDst); ok {
		return x.SctpDst
	}
	return 0
}

func (m *OfpOxmOfbField) GetIcmpv4Type() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Icmpv4Type); ok {
		return x.Icmpv4Type
	}
	return 0
}

func (m *OfpOxmOfbField) GetIcmpv4Code() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Icmpv4Code); ok {
		return x.Icmpv4Code
	}
	return 0
}

func (m *OfpOxmOfbField) GetArpOp() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_ArpOp); ok {
		return x.ArpOp
	}
	return 0
}

func (m *OfpOxmOfbField) GetArpSpa() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_ArpSpa); ok {
		return x.ArpSpa
	}
	return 0
}

func (m *OfpOxmOfbField) GetArpTpa() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_ArpTpa); ok {
		return x.ArpTpa
	}
	return 0
}

func (m *OfpOxmOfbField) GetArpSha() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_ArpSha); ok {
		return x.ArpSha
	}
	return nil
}

func (m *OfpOxmOfbField) GetArpTha() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_ArpTha); ok {
		return x.ArpTha
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6Src() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6Src); ok {
		return x.Ipv6Src
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6Dst() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6Dst); ok {
		return x.Ipv6Dst
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6Flabel() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6Flabel); ok {
		return x.Ipv6Flabel
	}
	return 0
}

func (m *OfpOxmOfbField) GetIcmpv6Type() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Icmpv6Type); ok {
		return x.Icmpv6Type
	}
	return 0
}

func (m *OfpOxmOfbField) GetIcmpv6Code() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Icmpv6Code); ok {
		return x.Icmpv6Code
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv6NdTarget() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6NdTarget); ok {
		return x.Ipv6NdTarget
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6NdSsl() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6NdSsl); ok {
		return x.Ipv6NdSsl
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6NdTll() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6NdTll); ok {
		return x.Ipv6NdTll
	}
	return nil
}

func (m *OfpOxmOfbField) GetMplsLabel() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_MplsLabel); ok {
		return x.MplsLabel
	}
	return 0
}

func (m *OfpOxmOfbField) GetMplsTc() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_MplsTc); ok {
		return x.MplsTc
	}
	return 0
}

func (m *OfpOxmOfbField) GetMplsBos() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_MplsBos); ok {
		return x.MplsBos
	}
	return 0
}

func (m *OfpOxmOfbField) GetPbbIsid() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_PbbIsid); ok {
		return x.PbbIsid
	}
	return 0
}

func (m *OfpOxmOfbField) GetTunnelId() uint64 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_TunnelId); ok {
		return x.TunnelId
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv6Exthdr() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6Exthdr); ok {
		return x.Ipv6Exthdr
	}
	return 0
}

type isOfpOxmOfbField_Mask interface {
	isOfpOxmOfbField_Mask()
}

type OfpOxmOfbField_TableMetadataMask struct {
	TableMetadataMask uint64 `protobuf:"varint,105,opt,name=table_metadata_mask,json=tableMetadataMask,proto3,oneof"`
}

type OfpOxmOfbField_EthDstMask struct {
	EthDstMask []byte `protobuf:"bytes,106,opt,name=eth_dst_mask,json=ethDstMask,proto3,oneof"`
}

type OfpOxmOfbField_EthSrcMask struct {
	EthSrcMask []byte `protobuf:"bytes,107,opt,name=eth_src_mask,json=ethSrcMask,proto3,oneof"`
}

type OfpOxmOfbField_VlanVidMask struct {
	VlanVidMask uint32 `protobuf:"varint,109,opt,name=vlan_vid_mask,json=vlanVidMask,proto3,oneof"`
}

type OfpOxmOfbField_Ipv4SrcMask struct {
	Ipv4SrcMask uint32 `protobuf:"varint,114,opt,name=ipv4_src_mask,json=ipv4SrcMask,proto3,oneof"`
}

type OfpOxmOfbField_Ipv4DstMask struct {
	Ipv4DstMask uint32 `protobuf:"varint,115,opt,name=ipv4_dst_mask,json=ipv4DstMask,proto3,oneof"`
}

type OfpOxmOfbField_ArpSpaMask struct {
	ArpSpaMask uint32 `protobuf:"varint,125,opt,name=arp_spa_mask,json=arpSpaMask,proto3,oneof"`
}

type OfpOxmOfbField_ArpTpaMask struct {
	ArpTpaMask uint32 `protobuf:"varint,126,opt,name=arp_tpa_mask,json=arpTpaMask,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6SrcMask struct {
	Ipv6SrcMask []byte `protobuf:"bytes,129,opt,name=ipv6_src_mask,json=ipv6SrcMask,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6DstMask struct {
	Ipv6DstMask []byte `protobuf:"bytes,130,opt,name=ipv6_dst_mask,json=ipv6DstMask,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6FlabelMask struct {
	Ipv6FlabelMask uint32 `protobuf:"varint,131,opt,name=ipv6_flabel_mask,json=ipv6FlabelMask,proto3,oneof"`
}

type OfpOxmOfbField_PbbIsidMask struct {
	PbbIsidMask uint32 `protobuf:"varint,140,opt,name=pbb_isid_mask,json=pbbIsidMask,proto3,oneof"`
}

type OfpOxmOfbField_TunnelIdMask struct {
	TunnelIdMask uint64 `protobuf:"varint,141,opt,name=tunnel_id_mask,json=tunnelIdMask,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6ExthdrMask struct {
	Ipv6ExthdrMask uint32 `protobuf:"varint,142,opt,name=ipv6_exthdr_mask,json=ipv6ExthdrMask,proto3,oneof"`
}

func (*OfpOxmOfbField_TableMetadataMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_EthDstMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_EthSrcMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_VlanVidMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_Ipv4SrcMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_Ipv4DstMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_ArpSpaMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_ArpTpaMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_Ipv6SrcMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_Ipv6DstMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_Ipv6FlabelMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_PbbIsidMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_TunnelIdMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_Ipv6ExthdrMask) isOfpOxmOfbField_Mask() {}

func (m *OfpOxmOfbField) GetMask() isOfpOxmOfbField_Mask {
	if m != nil {
		return m.Mask
	}
	return nil
}

func (m *OfpOxmOfbField) GetTableMetadataMask() uint64 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_TableMetadataMask); ok {
		return x.TableMetadataMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetEthDstMask() []byte {
	if x, ok := m.GetMask().(*OfpOxmOfbField_EthDstMask); ok {
		return x.EthDstMask
	}
	return nil
}

func (m *OfpOxmOfbField) GetEthSrcMask() []byte {
	if x, ok := m.GetMask().(*OfpOxmOfbField_EthSrcMask); ok {
		return x.EthSrcMask
	}
	return nil
}

func (m *OfpOxmOfbField) GetVlanVidMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_VlanVidMask); ok {
		return x.VlanVidMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv4SrcMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_Ipv4SrcMask); ok {
		return x.Ipv4SrcMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv4DstMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_Ipv4DstMask); ok {
		return x.Ipv4DstMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetArpSpaMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_ArpSpaMask); ok {
		return x.ArpSpaMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetArpTpaMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_ArpTpaMask); ok {
		return x.ArpTpaMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv6SrcMask() []byte {
	if x, ok := m.GetMask().(*OfpOxmOfbField_Ipv6SrcMask); ok {
		return x.Ipv6SrcMask
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6DstMask() []byte {
	if x, ok := m.GetMask().(*OfpOxmOfbField_Ipv6DstMask); ok {
		return x.Ipv6DstMask
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6FlabelMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_Ipv6FlabelMask); ok {
		return x.Ipv6FlabelMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetPbbIsidMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_PbbIsidMask); ok {
		return x.PbbIsidMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetTunnelIdMask() uint64 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_TunnelIdMask); ok {
		return x.TunnelIdMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv6ExthdrMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_Ipv6ExthdrMask); ok {
		return x.Ipv6ExthdrMask
	}
	return 0
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*OfpOxmOfbField) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _OfpOxmOfbField_OneofMarshaler, _OfpOxmOfbField_OneofUnmarshaler, _OfpOxmOfbField_OneofSizer, []interface{}{
		(*OfpOxmOfbField_Port)(nil),
		(*OfpOxmOfbField_PhysicalPort)(nil),
		(*OfpOxmOfbField_TableMetadata)(nil),
		(*OfpOxmOfbField_EthDst)(nil),
		(*OfpOxmOfbField_EthSrc)(nil),
		(*OfpOxmOfbField_EthType)(nil),
		(*OfpOxmOfbField_VlanVid)(nil),
		(*OfpOxmOfbField_VlanPcp)(nil),
		(*OfpOxmOfbField_IpDscp)(nil),
		(*OfpOxmOfbField_IpEcn)(nil),
		(*OfpOxmOfbField_IpProto)(nil),
		(*OfpOxmOfbField_Ipv4Src)(nil),
		(*OfpOxmOfbField_Ipv4Dst)(nil),
		(*OfpOxmOfbField_TcpSrc)(nil),
		(*OfpOxmOfbField_TcpDst)(nil),
		(*OfpOxmOfbField_UdpSrc)(nil),
		(*OfpOxmOfbField_UdpDst)(nil),
		(*OfpOxmOfbField_SctpSrc)(nil),
		(*OfpOxmOfbField_SctpDst)(nil),
		(*OfpOxmOfbField_Icmpv4Type)(nil),
		(*OfpOxmOfbField_Icmpv4Code)(nil),
		(*OfpOxmOfbField_ArpOp)(nil),
		(*OfpOxmOfbField_ArpSpa)(nil),
		(*OfpOxmOfbField_ArpTpa)(nil),
		(*OfpOxmOfbField_ArpSha)(nil),
		(*OfpOxmOfbField_ArpTha)(nil),
		(*OfpOxmOfbField_Ipv6Src)(nil),
		(*OfpOxmOfbField_Ipv6Dst)(nil),
		(*OfpOxmOfbField_Ipv6Flabel)(nil),
		(*OfpOxmOfbField_Icmpv6Type)(nil),
		(*OfpOxmOfbField_Icmpv6Code)(nil),
		(*OfpOxmOfbField_Ipv6NdTarget)(nil),
		(*OfpOxmOfbField_Ipv6NdSsl)(nil),
		(*OfpOxmOfbField_Ipv6NdTll)(nil),
		(*OfpOxmOfbField_MplsLabel)(nil),
		(*OfpOxmOfbField_MplsTc)(nil),
		(*OfpOxmOfbField_MplsBos)(nil),
		(*OfpOxmOfbField_PbbIsid)(nil),
		(*OfpOxmOfbField_TunnelId)(nil),
		(*OfpOxmOfbField_Ipv6Exthdr)(nil),
		(*OfpOxmOfbField_TableMetadataMask)(nil),
		(*OfpOxmOfbField_EthDstMask)(nil),
		(*OfpOxmOfbField_EthSrcMask)(nil),
		(*OfpOxmOfbField_VlanVidMask)(nil),
		(*OfpOxmOfbField_Ipv4SrcMask)(nil),
		(*OfpOxmOfbField_Ipv4DstMask)(nil),
		(*OfpOxmOfbField_ArpSpaMask)(nil),
		(*OfpOxmOfbField_ArpTpaMask)(nil),
		(*OfpOxmOfbField_Ipv6SrcMask)(nil),
		(*OfpOxmOfbField_Ipv6DstMask)(nil),
		(*OfpOxmOfbField_Ipv6FlabelMask)(nil),
		(*OfpOxmOfbField_PbbIsidMask)(nil),
		(*OfpOxmOfbField_TunnelIdMask)(nil),
		(*OfpOxmOfbField_Ipv6ExthdrMask)(nil),
	}
}

func _OfpOxmOfbField_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*OfpOxmOfbField)
	// value
	switch x := m.Value.(type) {
	case *OfpOxmOfbField_Port:
		b.EncodeVarint(3<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Port))
	case *OfpOxmOfbField_PhysicalPort:
		b.EncodeVarint(4<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.PhysicalPort))
	case *OfpOxmOfbField_TableMetadata:
		b.EncodeVarint(5<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.TableMetadata))
	case *OfpOxmOfbField_EthDst:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.EthDst)
	case *OfpOxmOfbField_EthSrc:
		b.EncodeVarint(7<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.EthSrc)
	case *OfpOxmOfbField_EthType:
		b.EncodeVarint(8<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.EthType))
	case *OfpOxmOfbField_VlanVid:
		b.EncodeVarint(9<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.VlanVid))
	case *OfpOxmOfbField_VlanPcp:
		b.EncodeVarint(10<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.VlanPcp))
	case *OfpOxmOfbField_IpDscp:
		b.EncodeVarint(11<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.IpDscp))
	case *OfpOxmOfbField_IpEcn:
		b.EncodeVarint(12<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.IpEcn))
	case *OfpOxmOfbField_IpProto:
		b.EncodeVarint(13<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.IpProto))
	case *OfpOxmOfbField_Ipv4Src:
		b.EncodeVarint(14<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Ipv4Src))
	case *OfpOxmOfbField_Ipv4Dst:
		b.EncodeVarint(15<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Ipv4Dst))
	case *OfpOxmOfbField_TcpSrc:
		b.EncodeVarint(16<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.TcpSrc))
	case *OfpOxmOfbField_TcpDst:
		b.EncodeVarint(17<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.TcpDst))
	case *OfpOxmOfbField_UdpSrc:
		b.EncodeVarint(18<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.UdpSrc))
	case *OfpOxmOfbField_UdpDst:
		b.EncodeVarint(19<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.UdpDst))
	case *OfpOxmOfbField_SctpSrc:
		b.EncodeVarint(20<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.SctpSrc))
	case *OfpOxmOfbField_SctpDst:
		b.EncodeVarint(21<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.SctpDst))
	case *OfpOxmOfbField_Icmpv4Type:
		b.EncodeVarint(22<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Icmpv4Type))
	case *OfpOxmOfbField_Icmpv4Code:
		b.EncodeVarint(23<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Icmpv4Code))
	case *OfpOxmOfbField_ArpOp:
		b.EncodeVarint(24<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.ArpOp))
	case *OfpOxmOfbField_ArpSpa:
		b.EncodeVarint(25<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.ArpSpa))
	case *OfpOxmOfbField_ArpTpa:
		b.EncodeVarint(26<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.ArpTpa))
	case *OfpOxmOfbField_ArpSha:
		b.EncodeVarint(27<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.ArpSha)
	case *OfpOxmOfbField_ArpTha:
		b.EncodeVarint(28<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.ArpTha)
	case *OfpOxmOfbField_Ipv6Src:
		b.EncodeVarint(29<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.Ipv6Src)
	case *OfpOxmOfbField_Ipv6Dst:
		b.EncodeVarint(30<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.Ipv6Dst)
	case *OfpOxmOfbField_Ipv6Flabel:
		b.EncodeVarint(31<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Ipv6Flabel))
	case *OfpOxmOfbField_Icmpv6Type:
		b.EncodeVarint(32<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Icmpv6Type))
	case *OfpOxmOfbField_Icmpv6Code:
		b.EncodeVarint(33<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Icmpv6Code))
	case *OfpOxmOfbField_Ipv6NdTarget:
		b.EncodeVarint(34<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.Ipv6NdTarget)
	case *OfpOxmOfbField_Ipv6NdSsl:
		b.EncodeVarint(35<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.Ipv6NdSsl)
	case *OfpOxmOfbField_Ipv6NdTll:
		b.EncodeVarint(36<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.Ipv6NdTll)
	case *OfpOxmOfbField_MplsLabel:
		b.EncodeVarint(37<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.MplsLabel))
	case *OfpOxmOfbField_MplsTc:
		b.EncodeVarint(38<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.MplsTc))
	case *OfpOxmOfbField_MplsBos:
		b.EncodeVarint(39<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.MplsBos))
	case *OfpOxmOfbField_PbbIsid:
		b.EncodeVarint(40<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.PbbIsid))
	case *OfpOxmOfbField_TunnelId:
		b.EncodeVarint(41<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.TunnelId))
	case *OfpOxmOfbField_Ipv6Exthdr:
		b.EncodeVarint(42<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Ipv6Exthdr))
	case nil:
	default:
		return fmt.Errorf("OfpOxmOfbField.Value has unexpected type %T", x)
	}
	// mask
	switch x := m.Mask.(type) {
	case *OfpOxmOfbField_TableMetadataMask:
		b.EncodeVarint(105<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.TableMetadataMask))
	case *OfpOxmOfbField_EthDstMask:
		b.EncodeVarint(106<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.EthDstMask)
	case *OfpOxmOfbField_EthSrcMask:
		b.EncodeVarint(107<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.EthSrcMask)
	case *OfpOxmOfbField_VlanVidMask:
		b.EncodeVarint(109<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.VlanVidMask))
	case *OfpOxmOfbField_Ipv4SrcMask:
		b.EncodeVarint(114<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Ipv4SrcMask))
	case *OfpOxmOfbField_Ipv4DstMask:
		b.EncodeVarint(115<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Ipv4DstMask))
	case *OfpOxmOfbField_ArpSpaMask:
		b.EncodeVarint(125<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.ArpSpaMask))
	case *OfpOxmOfbField_ArpTpaMask:
		b.EncodeVarint(126<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.ArpTpaMask))
	case *OfpOxmOfbField_Ipv6SrcMask:
		b.EncodeVarint(129<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.Ipv6SrcMask)
	case *OfpOxmOfbField_Ipv6DstMask:
		b.EncodeVarint(130<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.Ipv6DstMask)
	case *OfpOxmOfbField_Ipv6FlabelMask:
		b.EncodeVarint(131<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Ipv6FlabelMask))
	case *OfpOxmOfbField_PbbIsidMask:
		b.EncodeVarint(140<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.PbbIsidMask))
	case *OfpOxmOfbField_TunnelIdMask:
		b.EncodeVarint(141<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.TunnelIdMask))
	case *OfpOxmOfbField_Ipv6ExthdrMask:
		b.EncodeVarint(142<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Ipv6ExthdrMask))
	case nil:
	default:
		return fmt.Errorf("OfpOxmOfbField.Mask has unexpected type %T", x)
	}
	return nil
}

func _OfpOxmOfbField_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*OfpOxmOfbField)
	switch tag {
	case 3: // value.port
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_Port{uint32(x)}
		return true, err
	case 4: // value.physical_port
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_PhysicalPort{uint32(x)}
		return true, err
	case 5: // value.table_metadata
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_TableMetadata{x}
		return true, err
	case 6: // value.eth_dst
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Value = &OfpOxmOfbField_EthDst{x}
		return true, err
	case 7: // value.eth_src
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Value = &OfpOxmOfbField_EthSrc{x}
		return true, err
	case 8: // value.eth_type
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_EthType{uint32(x)}
		return true, err
	case 9: // value.vlan_vid
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_VlanVid{uint32(x)}
		return true, err
	case 10: // value.vlan_pcp
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_VlanPcp{uint32(x)}
		return true, err
	case 11: // value.ip_dscp
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_IpDscp{uint32(x)}
		return true, err
	case 12: // value.ip_ecn
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_IpEcn{uint32(x)}
		return true, err
	case 13: // value.ip_proto
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_IpProto{uint32(x)}
		return true, err
	case 14: // value.ipv4_src
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_Ipv4Src{uint32(x)}
		return true, err
	case 15: // value.ipv4_dst
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_Ipv4Dst{uint32(x)}
		return true, err
	case 16: // value.tcp_src
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_TcpSrc{uint32(x)}
		return true, err
	case 17: // value.tcp_dst
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_TcpDst{uint32(x)}
		return true, err
	case 18: // value.udp_src
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_UdpSrc{uint32(x)}
		return true, err
	case 19: // value.udp_dst
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_UdpDst{uint32(x)}
		return true, err
	case 20: // value.sctp_src
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_SctpSrc{uint32(x)}
		return true, err
	case 21: // value.sctp_dst
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_SctpDst{uint32(x)}
		return true, err
	case 22: // value.icmpv4_type
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_Icmpv4Type{uint32(x)}
		return true, err
	case 23: // value.icmpv4_code
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_Icmpv4Code{uint32(x)}
		return true, err
	case 24: // value.arp_op
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_ArpOp{uint32(x)}
		return true, err
	case 25: // value.arp_spa
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_ArpSpa{uint32(x)}
		return true, err
	case 26: // value.arp_tpa
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_ArpTpa{uint32(x)}
		return true, err
	case 27: // value.arp_sha
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Value = &OfpOxmOfbField_ArpSha{x}
		return true, err
	case 28: // value.arp_tha
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Value = &OfpOxmOfbField_ArpTha{x}
		return true, err
	case 29: // value.ipv6_src
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Value = &OfpOxmOfbField_Ipv6Src{x}
		return true, err
	case 30: // value.ipv6_dst
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Value = &OfpOxmOfbField_Ipv6Dst{x}
		return true, err
	case 31: // value.ipv6_flabel
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_Ipv6Flabel{uint32(x)}
		return true, err
	case 32: // value.icmpv6_type
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_Icmpv6Type{uint32(x)}
		return true, err
	case 33: // value.icmpv6_code
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_Icmpv6Code{uint32(x)}
		return true, err
	case 34: // value.ipv6_nd_target
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Value = &OfpOxmOfbField_Ipv6NdTarget{x}
		return true, err
	case 35: // value.ipv6_nd_ssl
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Value = &OfpOxmOfbField_Ipv6NdSsl{x}
		return true, err
	case 36: // value.ipv6_nd_tll
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Value = &OfpOxmOfbField_Ipv6NdTll{x}
		return true, err
	case 37: // value.mpls_label
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_MplsLabel{uint32(x)}
		return true, err
	case 38: // value.mpls_tc
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_MplsTc{uint32(x)}
		return true, err
	case 39: // value.mpls_bos
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_MplsBos{uint32(x)}
		return true, err
	case 40: // value.pbb_isid
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_PbbIsid{uint32(x)}
		return true, err
	case 41: // value.tunnel_id
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_TunnelId{x}
		return true, err
	case 42: // value.ipv6_exthdr
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Value = &OfpOxmOfbField_Ipv6Exthdr{uint32(x)}
		return true, err
	case 105: // mask.table_metadata_mask
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Mask = &OfpOxmOfbField_TableMetadataMask{x}
		return true, err
	case 106: // mask.eth_dst_mask
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Mask = &OfpOxmOfbField_EthDstMask{x}
		return true, err
	case 107: // mask.eth_src_mask
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Mask = &OfpOxmOfbField_EthSrcMask{x}
		return true, err
	case 109: // mask.vlan_vid_mask
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Mask = &OfpOxmOfbField_VlanVidMask{uint32(x)}
		return true, err
	case 114: // mask.ipv4_src_mask
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Mask = &OfpOxmOfbField_Ipv4SrcMask{uint32(x)}
		return true, err
	case 115: // mask.ipv4_dst_mask
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Mask = &OfpOxmOfbField_Ipv4DstMask{uint32(x)}
		return true, err
	case 125: // mask.arp_spa_mask
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Mask = &OfpOxmOfbField_ArpSpaMask{uint32(x)}
		return true, err
	case 126: // mask.arp_tpa_mask
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Mask = &OfpOxmOfbField_ArpTpaMask{uint32(x)}
		return true, err
	case 129: // mask.ipv6_src_mask
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Mask = &OfpOxmOfbField_Ipv6SrcMask{x}
		return true, err
	case 130: // mask.ipv6_dst_mask
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Mask = &OfpOxmOfbField_Ipv6DstMask{x}
		return true, err
	case 131: // mask.ipv6_flabel_mask
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Mask = &OfpOxmOfbField_Ipv6FlabelMask{uint32(x)}
		return true, err
	case 140: // mask.pbb_isid_mask
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Mask = &OfpOxmOfbField_PbbIsidMask{uint32(x)}
		return true, err
	case 141: // mask.tunnel_id_mask
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Mask = &OfpOxmOfbField_TunnelIdMask{x}
		return true, err
	case 142: // mask.ipv6_exthdr_mask
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Mask = &OfpOxmOfbField_Ipv6ExthdrMask{uint32(x)}
		return true, err
	default:
		return false, nil
	}
}

func _OfpOxmOfbField_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*OfpOxmOfbField)
	// value
	switch x := m.Value.(type) {
	case *OfpOxmOfbField_Port:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.Port))
	case *OfpOxmOfbField_PhysicalPort:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.PhysicalPort))
	case *OfpOxmOfbField_TableMetadata:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.TableMetadata))
	case *OfpOxmOfbField_EthDst:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.EthDst)))
		n += len(x.EthDst)
	case *OfpOxmOfbField_EthSrc:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.EthSrc)))
		n += len(x.EthSrc)
	case *OfpOxmOfbField_EthType:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.EthType))
	case *OfpOxmOfbField_VlanVid:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.VlanVid))
	case *OfpOxmOfbField_VlanPcp:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.VlanPcp))
	case *OfpOxmOfbField_IpDscp:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.IpDscp))
	case *OfpOxmOfbField_IpEcn:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.IpEcn))
	case *OfpOxmOfbField_IpProto:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.IpProto))
	case *OfpOxmOfbField_Ipv4Src:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.Ipv4Src))
	case *OfpOxmOfbField_Ipv4Dst:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.Ipv4Dst))
	case *OfpOxmOfbField_TcpSrc:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.TcpSrc))
	case *OfpOxmOfbField_TcpDst:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.TcpDst))
	case *OfpOxmOfbField_UdpSrc:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.UdpSrc))
	case *OfpOxmOfbField_UdpDst:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.UdpDst))
	case *OfpOxmOfbField_SctpSrc:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.SctpSrc))
	case *OfpOxmOfbField_SctpDst:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.SctpDst))
	case *OfpOxmOfbField_Icmpv4Type:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.Icmpv4Type))
	case *OfpOxmOfbField_Icmpv4Code:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.Icmpv4Code))
	case *OfpOxmOfbField_ArpOp:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.ArpOp))
	case *OfpOxmOfbField_ArpSpa:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.ArpSpa))
	case *OfpOxmOfbField_ArpTpa:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.ArpTpa))
	case *OfpOxmOfbField_ArpSha:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(len(x.ArpSha)))
		n += len(x.ArpSha)
	case *OfpOxmOfbField_ArpTha:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(len(x.ArpTha)))
		n += len(x.ArpTha)
	case *OfpOxmOfbField_Ipv6Src:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(len(x.Ipv6Src)))
		n += len(x.Ipv6Src)
	case *OfpOxmOfbField_Ipv6Dst:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(len(x.Ipv6Dst)))
		n += len(x.Ipv6Dst)
	case *OfpOxmOfbField_Ipv6Flabel:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.Ipv6Flabel))
	case *OfpOxmOfbField_Icmpv6Type:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.Icmpv6Type))
	case *OfpOxmOfbField_Icmpv6Code:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.Icmpv6Code))
	case *OfpOxmOfbField_Ipv6NdTarget:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(len(x.Ipv6NdTarget)))
		n += len(x.Ipv6NdTarget)
	case *OfpOxmOfbField_Ipv6NdSsl:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(len(x.Ipv6NdSsl)))
		n += len(x.Ipv6NdSsl)
	case *OfpOxmOfbField_Ipv6NdTll:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(len(x.Ipv6NdTll)))
		n += len(x.Ipv6NdTll)
	case *OfpOxmOfbField_MplsLabel:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.MplsLabel))
	case *OfpOxmOfbField_MplsTc:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.MplsTc))
	case *OfpOxmOfbField_MplsBos:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.MplsBos))
	case *OfpOxmOfbField_PbbIsid:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.PbbIsid))
	case *OfpOxmOfbField_TunnelId:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.TunnelId))
	case *OfpOxmOfbField_Ipv6Exthdr:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.Ipv6Exthdr))
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	// mask
	switch x := m.Mask.(type) {
	case *OfpOxmOfbField_TableMetadataMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.TableMetadataMask))
	case *OfpOxmOfbField_EthDstMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(len(x.EthDstMask)))
		n += len(x.EthDstMask)
	case *OfpOxmOfbField_EthSrcMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(len(x.EthSrcMask)))
		n += len(x.EthSrcMask)
	case *OfpOxmOfbField_VlanVidMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.VlanVidMask))
	case *OfpOxmOfbField_Ipv4SrcMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.Ipv4SrcMask))
	case *OfpOxmOfbField_Ipv4DstMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.Ipv4DstMask))
	case *OfpOxmOfbField_ArpSpaMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.ArpSpaMask))
	case *OfpOxmOfbField_ArpTpaMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.ArpTpaMask))
	case *OfpOxmOfbField_Ipv6SrcMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(len(x.Ipv6SrcMask)))
		n += len(x.Ipv6SrcMask)
	case *OfpOxmOfbField_Ipv6DstMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(len(x.Ipv6DstMask)))
		n += len(x.Ipv6DstMask)
	case *OfpOxmOfbField_Ipv6FlabelMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.Ipv6FlabelMask))
	case *OfpOxmOfbField_PbbIsidMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.PbbIsidMask))
	case *OfpOxmOfbField_TunnelIdMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.TunnelIdMask))
	case *OfpOxmOfbField_Ipv6ExthdrMask:
		n += 2 // tag and wire
		n += proto.SizeVarint(uint64(x.Ipv6ExthdrMask))
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Header for OXM experimenter match fields.
// The experimenter class should not use OXM_HEADER() macros for defining
// fields due to this extra header.
type OfpOxmExperimenterField struct {
	OxmHeader            uint32   `protobuf:"varint,1,opt,name=oxm_header,json=oxmHeader,proto3" json:"oxm_header,omitempty"`
	Experimenter         uint32   `protobuf:"varint,2,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpOxmExperimenterField) Reset()         { *m = OfpOxmExperimenterField{} }
func (m *OfpOxmExperimenterField) String() string { return proto.CompactTextString(m) }
func (*OfpOxmExperimenterField) ProtoMessage()    {}
func (*OfpOxmExperimenterField) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{13}
}
func (m *OfpOxmExperimenterField) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpOxmExperimenterField.Unmarshal(m, b)
}
func (m *OfpOxmExperimenterField) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpOxmExperimenterField.Marshal(b, m, deterministic)
}
func (dst *OfpOxmExperimenterField) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpOxmExperimenterField.Merge(dst, src)
}
func (m *OfpOxmExperimenterField) XXX_Size() int {
	return xxx_messageInfo_OfpOxmExperimenterField.Size(m)
}
func (m *OfpOxmExperimenterField) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpOxmExperimenterField.DiscardUnknown(m)
}

var xxx_messageInfo_OfpOxmExperimenterField proto.InternalMessageInfo

func (m *OfpOxmExperimenterField) GetOxmHeader() uint32 {
	if m != nil {
		return m.OxmHeader
	}
	return 0
}

func (m *OfpOxmExperimenterField) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

// Action header that is common to all actions.  The length includes the
// header and any padding used to make the action 64-bit aligned.
// NB: The length of an action *must* always be a multiple of eight.
type OfpAction struct {
	Type OfpActionType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpActionType" json:"type,omitempty"`
	// Types that are valid to be assigned to Action:
	//	*OfpAction_Output
	//	*OfpAction_MplsTtl
	//	*OfpAction_Push
	//	*OfpAction_PopMpls
	//	*OfpAction_Group
	//	*OfpAction_NwTtl
	//	*OfpAction_SetField
	//	*OfpAction_Experimenter
	Action               isOfpAction_Action `protobuf_oneof:"action"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *OfpAction) Reset()         { *m = OfpAction{} }
func (m *OfpAction) String() string { return proto.CompactTextString(m) }
func (*OfpAction) ProtoMessage()    {}
func (*OfpAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{14}
}
func (m *OfpAction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpAction.Unmarshal(m, b)
}
func (m *OfpAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpAction.Marshal(b, m, deterministic)
}
func (dst *OfpAction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpAction.Merge(dst, src)
}
func (m *OfpAction) XXX_Size() int {
	return xxx_messageInfo_OfpAction.Size(m)
}
func (m *OfpAction) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpAction.DiscardUnknown(m)
}

var xxx_messageInfo_OfpAction proto.InternalMessageInfo

func (m *OfpAction) GetType() OfpActionType {
	if m != nil {
		return m.Type
	}
	return OfpActionType_OFPAT_OUTPUT
}

type isOfpAction_Action interface {
	isOfpAction_Action()
}

type OfpAction_Output struct {
	Output *OfpActionOutput `protobuf:"bytes,2,opt,name=output,proto3,oneof"`
}

type OfpAction_MplsTtl struct {
	MplsTtl *OfpActionMplsTtl `protobuf:"bytes,3,opt,name=mpls_ttl,json=mplsTtl,proto3,oneof"`
}

type OfpAction_Push struct {
	Push *OfpActionPush `protobuf:"bytes,4,opt,name=push,proto3,oneof"`
}

type OfpAction_PopMpls struct {
	PopMpls *OfpActionPopMpls `protobuf:"bytes,5,opt,name=pop_mpls,json=popMpls,proto3,oneof"`
}

type OfpAction_Group struct {
	Group *OfpActionGroup `protobuf:"bytes,6,opt,name=group,proto3,oneof"`
}

type OfpAction_NwTtl struct {
	NwTtl *OfpActionNwTtl `protobuf:"bytes,7,opt,name=nw_ttl,json=nwTtl,proto3,oneof"`
}

type OfpAction_SetField struct {
	SetField *OfpActionSetField `protobuf:"bytes,8,opt,name=set_field,json=setField,proto3,oneof"`
}

type OfpAction_Experimenter struct {
	Experimenter *OfpActionExperimenter `protobuf:"bytes,9,opt,name=experimenter,proto3,oneof"`
}

func (*OfpAction_Output) isOfpAction_Action() {}

func (*OfpAction_MplsTtl) isOfpAction_Action() {}

func (*OfpAction_Push) isOfpAction_Action() {}

func (*OfpAction_PopMpls) isOfpAction_Action() {}

func (*OfpAction_Group) isOfpAction_Action() {}

func (*OfpAction_NwTtl) isOfpAction_Action() {}

func (*OfpAction_SetField) isOfpAction_Action() {}

func (*OfpAction_Experimenter) isOfpAction_Action() {}

func (m *OfpAction) GetAction() isOfpAction_Action {
	if m != nil {
		return m.Action
	}
	return nil
}

func (m *OfpAction) GetOutput() *OfpActionOutput {
	if x, ok := m.GetAction().(*OfpAction_Output); ok {
		return x.Output
	}
	return nil
}

func (m *OfpAction) GetMplsTtl() *OfpActionMplsTtl {
	if x, ok := m.GetAction().(*OfpAction_MplsTtl); ok {
		return x.MplsTtl
	}
	return nil
}

func (m *OfpAction) GetPush() *OfpActionPush {
	if x, ok := m.GetAction().(*OfpAction_Push); ok {
		return x.Push
	}
	return nil
}

func (m *OfpAction) GetPopMpls() *OfpActionPopMpls {
	if x, ok := m.GetAction().(*OfpAction_PopMpls); ok {
		return x.PopMpls
	}
	return nil
}

func (m *OfpAction) GetGroup() *OfpActionGroup {
	if x, ok := m.GetAction().(*OfpAction_Group); ok {
		return x.Group
	}
	return nil
}

func (m *OfpAction) GetNwTtl() *OfpActionNwTtl {
	if x, ok := m.GetAction().(*OfpAction_NwTtl); ok {
		return x.NwTtl
	}
	return nil
}

func (m *OfpAction) GetSetField() *OfpActionSetField {
	if x, ok := m.GetAction().(*OfpAction_SetField); ok {
		return x.SetField
	}
	return nil
}

func (m *OfpAction) GetExperimenter() *OfpActionExperimenter {
	if x, ok := m.GetAction().(*OfpAction_Experimenter); ok {
		return x.Experimenter
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*OfpAction) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _OfpAction_OneofMarshaler, _OfpAction_OneofUnmarshaler, _OfpAction_OneofSizer, []interface{}{
		(*OfpAction_Output)(nil),
		(*OfpAction_MplsTtl)(nil),
		(*OfpAction_Push)(nil),
		(*OfpAction_PopMpls)(nil),
		(*OfpAction_Group)(nil),
		(*OfpAction_NwTtl)(nil),
		(*OfpAction_SetField)(nil),
		(*OfpAction_Experimenter)(nil),
	}
}

func _OfpAction_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*OfpAction)
	// action
	switch x := m.Action.(type) {
	case *OfpAction_Output:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Output); err != nil {
			return err
		}
	case *OfpAction_MplsTtl:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.MplsTtl); err != nil {
			return err
		}
	case *OfpAction_Push:
		b.EncodeVarint(4<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Push); err != nil {
			return err
		}
	case *OfpAction_PopMpls:
		b.EncodeVarint(5<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.PopMpls); err != nil {
			return err
		}
	case *OfpAction_Group:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Group); err != nil {
			return err
		}
	case *OfpAction_NwTtl:
		b.EncodeVarint(7<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.NwTtl); err != nil {
			return err
		}
	case *OfpAction_SetField:
		b.EncodeVarint(8<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.SetField); err != nil {
			return err
		}
	case *OfpAction_Experimenter:
		b.EncodeVarint(9<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Experimenter); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("OfpAction.Action has unexpected type %T", x)
	}
	return nil
}

func _OfpAction_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*OfpAction)
	switch tag {
	case 2: // action.output
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpActionOutput)
		err := b.DecodeMessage(msg)
		m.Action = &OfpAction_Output{msg}
		return true, err
	case 3: // action.mpls_ttl
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpActionMplsTtl)
		err := b.DecodeMessage(msg)
		m.Action = &OfpAction_MplsTtl{msg}
		return true, err
	case 4: // action.push
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpActionPush)
		err := b.DecodeMessage(msg)
		m.Action = &OfpAction_Push{msg}
		return true, err
	case 5: // action.pop_mpls
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpActionPopMpls)
		err := b.DecodeMessage(msg)
		m.Action = &OfpAction_PopMpls{msg}
		return true, err
	case 6: // action.group
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpActionGroup)
		err := b.DecodeMessage(msg)
		m.Action = &OfpAction_Group{msg}
		return true, err
	case 7: // action.nw_ttl
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpActionNwTtl)
		err := b.DecodeMessage(msg)
		m.Action = &OfpAction_NwTtl{msg}
		return true, err
	case 8: // action.set_field
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpActionSetField)
		err := b.DecodeMessage(msg)
		m.Action = &OfpAction_SetField{msg}
		return true, err
	case 9: // action.experimenter
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpActionExperimenter)
		err := b.DecodeMessage(msg)
		m.Action = &OfpAction_Experimenter{msg}
		return true, err
	default:
		return false, nil
	}
}

func _OfpAction_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*OfpAction)
	// action
	switch x := m.Action.(type) {
	case *OfpAction_Output:
		s := proto.Size(x.Output)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpAction_MplsTtl:
		s := proto.Size(x.MplsTtl)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpAction_Push:
		s := proto.Size(x.Push)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpAction_PopMpls:
		s := proto.Size(x.PopMpls)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpAction_Group:
		s := proto.Size(x.Group)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpAction_NwTtl:
		s := proto.Size(x.NwTtl)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpAction_SetField:
		s := proto.Size(x.SetField)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpAction_Experimenter:
		s := proto.Size(x.Experimenter)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Action structure for OFPAT_OUTPUT, which sends packets out 'port'.
// When the 'port' is the OFPP_CONTROLLER, 'max_len' indicates the max
// number of bytes to send.  A 'max_len' of zero means no bytes of the
// packet should be sent. A 'max_len' of OFPCML_NO_BUFFER means that
// the packet is not buffered and the complete packet is to be sent to
// the controller.
type OfpActionOutput struct {
	Port                 uint32   `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"`
	MaxLen               uint32   `protobuf:"varint,2,opt,name=max_len,json=maxLen,proto3" json:"max_len,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionOutput) Reset()         { *m = OfpActionOutput{} }
func (m *OfpActionOutput) String() string { return proto.CompactTextString(m) }
func (*OfpActionOutput) ProtoMessage()    {}
func (*OfpActionOutput) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{15}
}
func (m *OfpActionOutput) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpActionOutput.Unmarshal(m, b)
}
func (m *OfpActionOutput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpActionOutput.Marshal(b, m, deterministic)
}
func (dst *OfpActionOutput) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpActionOutput.Merge(dst, src)
}
func (m *OfpActionOutput) XXX_Size() int {
	return xxx_messageInfo_OfpActionOutput.Size(m)
}
func (m *OfpActionOutput) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpActionOutput.DiscardUnknown(m)
}

var xxx_messageInfo_OfpActionOutput proto.InternalMessageInfo

func (m *OfpActionOutput) GetPort() uint32 {
	if m != nil {
		return m.Port
	}
	return 0
}

func (m *OfpActionOutput) GetMaxLen() uint32 {
	if m != nil {
		return m.MaxLen
	}
	return 0
}

// Action structure for OFPAT_SET_MPLS_TTL.
type OfpActionMplsTtl struct {
	MplsTtl              uint32   `protobuf:"varint,1,opt,name=mpls_ttl,json=mplsTtl,proto3" json:"mpls_ttl,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionMplsTtl) Reset()         { *m = OfpActionMplsTtl{} }
func (m *OfpActionMplsTtl) String() string { return proto.CompactTextString(m) }
func (*OfpActionMplsTtl) ProtoMessage()    {}
func (*OfpActionMplsTtl) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{16}
}
func (m *OfpActionMplsTtl) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpActionMplsTtl.Unmarshal(m, b)
}
func (m *OfpActionMplsTtl) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpActionMplsTtl.Marshal(b, m, deterministic)
}
func (dst *OfpActionMplsTtl) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpActionMplsTtl.Merge(dst, src)
}
func (m *OfpActionMplsTtl) XXX_Size() int {
	return xxx_messageInfo_OfpActionMplsTtl.Size(m)
}
func (m *OfpActionMplsTtl) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpActionMplsTtl.DiscardUnknown(m)
}

var xxx_messageInfo_OfpActionMplsTtl proto.InternalMessageInfo

func (m *OfpActionMplsTtl) GetMplsTtl() uint32 {
	if m != nil {
		return m.MplsTtl
	}
	return 0
}

// Action structure for OFPAT_PUSH_VLAN/MPLS/PBB.
type OfpActionPush struct {
	Ethertype            uint32   `protobuf:"varint,1,opt,name=ethertype,proto3" json:"ethertype,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionPush) Reset()         { *m = OfpActionPush{} }
func (m *OfpActionPush) String() string { return proto.CompactTextString(m) }
func (*OfpActionPush) ProtoMessage()    {}
func (*OfpActionPush) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{17}
}
func (m *OfpActionPush) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpActionPush.Unmarshal(m, b)
}
func (m *OfpActionPush) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpActionPush.Marshal(b, m, deterministic)
}
func (dst *OfpActionPush) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpActionPush.Merge(dst, src)
}
func (m *OfpActionPush) XXX_Size() int {
	return xxx_messageInfo_OfpActionPush.Size(m)
}
func (m *OfpActionPush) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpActionPush.DiscardUnknown(m)
}

var xxx_messageInfo_OfpActionPush proto.InternalMessageInfo

func (m *OfpActionPush) GetEthertype() uint32 {
	if m != nil {
		return m.Ethertype
	}
	return 0
}

// Action structure for OFPAT_POP_MPLS.
type OfpActionPopMpls struct {
	Ethertype            uint32   `protobuf:"varint,1,opt,name=ethertype,proto3" json:"ethertype,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionPopMpls) Reset()         { *m = OfpActionPopMpls{} }
func (m *OfpActionPopMpls) String() string { return proto.CompactTextString(m) }
func (*OfpActionPopMpls) ProtoMessage()    {}
func (*OfpActionPopMpls) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{18}
}
func (m *OfpActionPopMpls) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpActionPopMpls.Unmarshal(m, b)
}
func (m *OfpActionPopMpls) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpActionPopMpls.Marshal(b, m, deterministic)
}
func (dst *OfpActionPopMpls) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpActionPopMpls.Merge(dst, src)
}
func (m *OfpActionPopMpls) XXX_Size() int {
	return xxx_messageInfo_OfpActionPopMpls.Size(m)
}
func (m *OfpActionPopMpls) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpActionPopMpls.DiscardUnknown(m)
}

var xxx_messageInfo_OfpActionPopMpls proto.InternalMessageInfo

func (m *OfpActionPopMpls) GetEthertype() uint32 {
	if m != nil {
		return m.Ethertype
	}
	return 0
}

// Action structure for OFPAT_GROUP.
type OfpActionGroup struct {
	GroupId              uint32   `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionGroup) Reset()         { *m = OfpActionGroup{} }
func (m *OfpActionGroup) String() string { return proto.CompactTextString(m) }
func (*OfpActionGroup) ProtoMessage()    {}
func (*OfpActionGroup) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{19}
}
func (m *OfpActionGroup) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpActionGroup.Unmarshal(m, b)
}
func (m *OfpActionGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpActionGroup.Marshal(b, m, deterministic)
}
func (dst *OfpActionGroup) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpActionGroup.Merge(dst, src)
}
func (m *OfpActionGroup) XXX_Size() int {
	return xxx_messageInfo_OfpActionGroup.Size(m)
}
func (m *OfpActionGroup) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpActionGroup.DiscardUnknown(m)
}

var xxx_messageInfo_OfpActionGroup proto.InternalMessageInfo

func (m *OfpActionGroup) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

// Action structure for OFPAT_SET_NW_TTL.
type OfpActionNwTtl struct {
	NwTtl                uint32   `protobuf:"varint,1,opt,name=nw_ttl,json=nwTtl,proto3" json:"nw_ttl,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionNwTtl) Reset()         { *m = OfpActionNwTtl{} }
func (m *OfpActionNwTtl) String() string { return proto.CompactTextString(m) }
func (*OfpActionNwTtl) ProtoMessage()    {}
func (*OfpActionNwTtl) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{20}
}
func (m *OfpActionNwTtl) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpActionNwTtl.Unmarshal(m, b)
}
func (m *OfpActionNwTtl) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpActionNwTtl.Marshal(b, m, deterministic)
}
func (dst *OfpActionNwTtl) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpActionNwTtl.Merge(dst, src)
}
func (m *OfpActionNwTtl) XXX_Size() int {
	return xxx_messageInfo_OfpActionNwTtl.Size(m)
}
func (m *OfpActionNwTtl) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpActionNwTtl.DiscardUnknown(m)
}

var xxx_messageInfo_OfpActionNwTtl proto.InternalMessageInfo

func (m *OfpActionNwTtl) GetNwTtl() uint32 {
	if m != nil {
		return m.NwTtl
	}
	return 0
}

// Action structure for OFPAT_SET_FIELD.
type OfpActionSetField struct {
	Field                *OfpOxmField `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *OfpActionSetField) Reset()         { *m = OfpActionSetField{} }
func (m *OfpActionSetField) String() string { return proto.CompactTextString(m) }
func (*OfpActionSetField) ProtoMessage()    {}
func (*OfpActionSetField) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{21}
}
func (m *OfpActionSetField) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpActionSetField.Unmarshal(m, b)
}
func (m *OfpActionSetField) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpActionSetField.Marshal(b, m, deterministic)
}
func (dst *OfpActionSetField) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpActionSetField.Merge(dst, src)
}
func (m *OfpActionSetField) XXX_Size() int {
	return xxx_messageInfo_OfpActionSetField.Size(m)
}
func (m *OfpActionSetField) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpActionSetField.DiscardUnknown(m)
}

var xxx_messageInfo_OfpActionSetField proto.InternalMessageInfo

func (m *OfpActionSetField) GetField() *OfpOxmField {
	if m != nil {
		return m.Field
	}
	return nil
}

// Action header for OFPAT_EXPERIMENTER.
// The rest of the body is experimenter-defined.
type OfpActionExperimenter struct {
	Experimenter         uint32   `protobuf:"varint,1,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	Data                 []byte   `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionExperimenter) Reset()         { *m = OfpActionExperimenter{} }
func (m *OfpActionExperimenter) String() string { return proto.CompactTextString(m) }
func (*OfpActionExperimenter) ProtoMessage()    {}
func (*OfpActionExperimenter) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{22}
}
func (m *OfpActionExperimenter) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpActionExperimenter.Unmarshal(m, b)
}
func (m *OfpActionExperimenter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpActionExperimenter.Marshal(b, m, deterministic)
}
func (dst *OfpActionExperimenter) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpActionExperimenter.Merge(dst, src)
}
func (m *OfpActionExperimenter) XXX_Size() int {
	return xxx_messageInfo_OfpActionExperimenter.Size(m)
}
func (m *OfpActionExperimenter) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpActionExperimenter.DiscardUnknown(m)
}

var xxx_messageInfo_OfpActionExperimenter proto.InternalMessageInfo

func (m *OfpActionExperimenter) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpActionExperimenter) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Instruction header that is common to all instructions.  The length includes
// the header and any padding used to make the instruction 64-bit aligned.
// NB: The length of an instruction *must* always be a multiple of eight.
type OfpInstruction struct {
	Type uint32 `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"`
	// Types that are valid to be assigned to Data:
	//	*OfpInstruction_GotoTable
	//	*OfpInstruction_WriteMetadata
	//	*OfpInstruction_Actions
	//	*OfpInstruction_Meter
	//	*OfpInstruction_Experimenter
	Data                 isOfpInstruction_Data `protobuf_oneof:"data"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *OfpInstruction) Reset()         { *m = OfpInstruction{} }
func (m *OfpInstruction) String() string { return proto.CompactTextString(m) }
func (*OfpInstruction) ProtoMessage()    {}
func (*OfpInstruction) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{23}
}
func (m *OfpInstruction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpInstruction.Unmarshal(m, b)
}
func (m *OfpInstruction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpInstruction.Marshal(b, m, deterministic)
}
func (dst *OfpInstruction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpInstruction.Merge(dst, src)
}
func (m *OfpInstruction) XXX_Size() int {
	return xxx_messageInfo_OfpInstruction.Size(m)
}
func (m *OfpInstruction) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpInstruction.DiscardUnknown(m)
}

var xxx_messageInfo_OfpInstruction proto.InternalMessageInfo

func (m *OfpInstruction) GetType() uint32 {
	if m != nil {
		return m.Type
	}
	return 0
}

type isOfpInstruction_Data interface {
	isOfpInstruction_Data()
}

type OfpInstruction_GotoTable struct {
	GotoTable *OfpInstructionGotoTable `protobuf:"bytes,2,opt,name=goto_table,json=gotoTable,proto3,oneof"`
}

type OfpInstruction_WriteMetadata struct {
	WriteMetadata *OfpInstructionWriteMetadata `protobuf:"bytes,3,opt,name=write_metadata,json=writeMetadata,proto3,oneof"`
}

type OfpInstruction_Actions struct {
	Actions *OfpInstructionActions `protobuf:"bytes,4,opt,name=actions,proto3,oneof"`
}

type OfpInstruction_Meter struct {
	Meter *OfpInstructionMeter `protobuf:"bytes,5,opt,name=meter,proto3,oneof"`
}

type OfpInstruction_Experimenter struct {
	Experimenter *OfpInstructionExperimenter `protobuf:"bytes,6,opt,name=experimenter,proto3,oneof"`
}

func (*OfpInstruction_GotoTable) isOfpInstruction_Data() {}

func (*OfpInstruction_WriteMetadata) isOfpInstruction_Data() {}

func (*OfpInstruction_Actions) isOfpInstruction_Data() {}

func (*OfpInstruction_Meter) isOfpInstruction_Data() {}

func (*OfpInstruction_Experimenter) isOfpInstruction_Data() {}

func (m *OfpInstruction) GetData() isOfpInstruction_Data {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *OfpInstruction) GetGotoTable() *OfpInstructionGotoTable {
	if x, ok := m.GetData().(*OfpInstruction_GotoTable); ok {
		return x.GotoTable
	}
	return nil
}

func (m *OfpInstruction) GetWriteMetadata() *OfpInstructionWriteMetadata {
	if x, ok := m.GetData().(*OfpInstruction_WriteMetadata); ok {
		return x.WriteMetadata
	}
	return nil
}

func (m *OfpInstruction) GetActions() *OfpInstructionActions {
	if x, ok := m.GetData().(*OfpInstruction_Actions); ok {
		return x.Actions
	}
	return nil
}

func (m *OfpInstruction) GetMeter() *OfpInstructionMeter {
	if x, ok := m.GetData().(*OfpInstruction_Meter); ok {
		return x.Meter
	}
	return nil
}

func (m *OfpInstruction) GetExperimenter() *OfpInstructionExperimenter {
	if x, ok := m.GetData().(*OfpInstruction_Experimenter); ok {
		return x.Experimenter
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*OfpInstruction) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _OfpInstruction_OneofMarshaler, _OfpInstruction_OneofUnmarshaler, _OfpInstruction_OneofSizer, []interface{}{
		(*OfpInstruction_GotoTable)(nil),
		(*OfpInstruction_WriteMetadata)(nil),
		(*OfpInstruction_Actions)(nil),
		(*OfpInstruction_Meter)(nil),
		(*OfpInstruction_Experimenter)(nil),
	}
}

func _OfpInstruction_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*OfpInstruction)
	// data
	switch x := m.Data.(type) {
	case *OfpInstruction_GotoTable:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.GotoTable); err != nil {
			return err
		}
	case *OfpInstruction_WriteMetadata:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.WriteMetadata); err != nil {
			return err
		}
	case *OfpInstruction_Actions:
		b.EncodeVarint(4<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Actions); err != nil {
			return err
		}
	case *OfpInstruction_Meter:
		b.EncodeVarint(5<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Meter); err != nil {
			return err
		}
	case *OfpInstruction_Experimenter:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Experimenter); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("OfpInstruction.Data has unexpected type %T", x)
	}
	return nil
}

func _OfpInstruction_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*OfpInstruction)
	switch tag {
	case 2: // data.goto_table
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpInstructionGotoTable)
		err := b.DecodeMessage(msg)
		m.Data = &OfpInstruction_GotoTable{msg}
		return true, err
	case 3: // data.write_metadata
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpInstructionWriteMetadata)
		err := b.DecodeMessage(msg)
		m.Data = &OfpInstruction_WriteMetadata{msg}
		return true, err
	case 4: // data.actions
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpInstructionActions)
		err := b.DecodeMessage(msg)
		m.Data = &OfpInstruction_Actions{msg}
		return true, err
	case 5: // data.meter
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpInstructionMeter)
		err := b.DecodeMessage(msg)
		m.Data = &OfpInstruction_Meter{msg}
		return true, err
	case 6: // data.experimenter
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpInstructionExperimenter)
		err := b.DecodeMessage(msg)
		m.Data = &OfpInstruction_Experimenter{msg}
		return true, err
	default:
		return false, nil
	}
}

func _OfpInstruction_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*OfpInstruction)
	// data
	switch x := m.Data.(type) {
	case *OfpInstruction_GotoTable:
		s := proto.Size(x.GotoTable)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpInstruction_WriteMetadata:
		s := proto.Size(x.WriteMetadata)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpInstruction_Actions:
		s := proto.Size(x.Actions)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpInstruction_Meter:
		s := proto.Size(x.Meter)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpInstruction_Experimenter:
		s := proto.Size(x.Experimenter)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Instruction structure for OFPIT_GOTO_TABLE
type OfpInstructionGotoTable struct {
	TableId              uint32   `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpInstructionGotoTable) Reset()         { *m = OfpInstructionGotoTable{} }
func (m *OfpInstructionGotoTable) String() string { return proto.CompactTextString(m) }
func (*OfpInstructionGotoTable) ProtoMessage()    {}
func (*OfpInstructionGotoTable) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{24}
}
func (m *OfpInstructionGotoTable) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpInstructionGotoTable.Unmarshal(m, b)
}
func (m *OfpInstructionGotoTable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpInstructionGotoTable.Marshal(b, m, deterministic)
}
func (dst *OfpInstructionGotoTable) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpInstructionGotoTable.Merge(dst, src)
}
func (m *OfpInstructionGotoTable) XXX_Size() int {
	return xxx_messageInfo_OfpInstructionGotoTable.Size(m)
}
func (m *OfpInstructionGotoTable) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpInstructionGotoTable.DiscardUnknown(m)
}

var xxx_messageInfo_OfpInstructionGotoTable proto.InternalMessageInfo

func (m *OfpInstructionGotoTable) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

// Instruction structure for OFPIT_WRITE_METADATA
type OfpInstructionWriteMetadata struct {
	Metadata             uint64   `protobuf:"varint,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
	MetadataMask         uint64   `protobuf:"varint,2,opt,name=metadata_mask,json=metadataMask,proto3" json:"metadata_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpInstructionWriteMetadata) Reset()         { *m = OfpInstructionWriteMetadata{} }
func (m *OfpInstructionWriteMetadata) String() string { return proto.CompactTextString(m) }
func (*OfpInstructionWriteMetadata) ProtoMessage()    {}
func (*OfpInstructionWriteMetadata) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{25}
}
func (m *OfpInstructionWriteMetadata) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpInstructionWriteMetadata.Unmarshal(m, b)
}
func (m *OfpInstructionWriteMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpInstructionWriteMetadata.Marshal(b, m, deterministic)
}
func (dst *OfpInstructionWriteMetadata) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpInstructionWriteMetadata.Merge(dst, src)
}
func (m *OfpInstructionWriteMetadata) XXX_Size() int {
	return xxx_messageInfo_OfpInstructionWriteMetadata.Size(m)
}
func (m *OfpInstructionWriteMetadata) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpInstructionWriteMetadata.DiscardUnknown(m)
}

var xxx_messageInfo_OfpInstructionWriteMetadata proto.InternalMessageInfo

func (m *OfpInstructionWriteMetadata) GetMetadata() uint64 {
	if m != nil {
		return m.Metadata
	}
	return 0
}

func (m *OfpInstructionWriteMetadata) GetMetadataMask() uint64 {
	if m != nil {
		return m.MetadataMask
	}
	return 0
}

// Instruction structure for OFPIT_WRITE/APPLY/CLEAR_ACTIONS
type OfpInstructionActions struct {
	Actions              []*OfpAction `protobuf:"bytes,1,rep,name=actions,proto3" json:"actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *OfpInstructionActions) Reset()         { *m = OfpInstructionActions{} }
func (m *OfpInstructionActions) String() string { return proto.CompactTextString(m) }
func (*OfpInstructionActions) ProtoMessage()    {}
func (*OfpInstructionActions) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{26}
}
func (m *OfpInstructionActions) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpInstructionActions.Unmarshal(m, b)
}
func (m *OfpInstructionActions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpInstructionActions.Marshal(b, m, deterministic)
}
func (dst *OfpInstructionActions) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpInstructionActions.Merge(dst, src)
}
func (m *OfpInstructionActions) XXX_Size() int {
	return xxx_messageInfo_OfpInstructionActions.Size(m)
}
func (m *OfpInstructionActions) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpInstructionActions.DiscardUnknown(m)
}

var xxx_messageInfo_OfpInstructionActions proto.InternalMessageInfo

func (m *OfpInstructionActions) GetActions() []*OfpAction {
	if m != nil {
		return m.Actions
	}
	return nil
}

// Instruction structure for OFPIT_METER
type OfpInstructionMeter struct {
	MeterId              uint32   `protobuf:"varint,1,opt,name=meter_id,json=meterId,proto3" json:"meter_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpInstructionMeter) Reset()         { *m = OfpInstructionMeter{} }
func (m *OfpInstructionMeter) String() string { return proto.CompactTextString(m) }
func (*OfpInstructionMeter) ProtoMessage()    {}
func (*OfpInstructionMeter) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{27}
}
func (m *OfpInstructionMeter) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpInstructionMeter.Unmarshal(m, b)
}
func (m *OfpInstructionMeter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpInstructionMeter.Marshal(b, m, deterministic)
}
func (dst *OfpInstructionMeter) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpInstructionMeter.Merge(dst, src)
}
func (m *OfpInstructionMeter) XXX_Size() int {
	return xxx_messageInfo_OfpInstructionMeter.Size(m)
}
func (m *OfpInstructionMeter) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpInstructionMeter.DiscardUnknown(m)
}

var xxx_messageInfo_OfpInstructionMeter proto.InternalMessageInfo

func (m *OfpInstructionMeter) GetMeterId() uint32 {
	if m != nil {
		return m.MeterId
	}
	return 0
}

// Instruction structure for experimental instructions
type OfpInstructionExperimenter struct {
	Experimenter uint32 `protobuf:"varint,1,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	// Experimenter-defined arbitrary additional data.
	Data                 []byte   `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpInstructionExperimenter) Reset()         { *m = OfpInstructionExperimenter{} }
func (m *OfpInstructionExperimenter) String() string { return proto.CompactTextString(m) }
func (*OfpInstructionExperimenter) ProtoMessage()    {}
func (*OfpInstructionExperimenter) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{28}
}
func (m *OfpInstructionExperimenter) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpInstructionExperimenter.Unmarshal(m, b)
}
func (m *OfpInstructionExperimenter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpInstructionExperimenter.Marshal(b, m, deterministic)
}
func (dst *OfpInstructionExperimenter) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpInstructionExperimenter.Merge(dst, src)
}
func (m *OfpInstructionExperimenter) XXX_Size() int {
	return xxx_messageInfo_OfpInstructionExperimenter.Size(m)
}
func (m *OfpInstructionExperimenter) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpInstructionExperimenter.DiscardUnknown(m)
}

var xxx_messageInfo_OfpInstructionExperimenter proto.InternalMessageInfo

func (m *OfpInstructionExperimenter) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpInstructionExperimenter) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Flow setup and teardown (controller -> datapath).
type OfpFlowMod struct {
	// ofp_header header;
	Cookie               uint64            `protobuf:"varint,1,opt,name=cookie,proto3" json:"cookie,omitempty"`
	CookieMask           uint64            `protobuf:"varint,2,opt,name=cookie_mask,json=cookieMask,proto3" json:"cookie_mask,omitempty"`
	TableId              uint32            `protobuf:"varint,3,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	Command              OfpFlowModCommand `protobuf:"varint,4,opt,name=command,proto3,enum=openflow_13.OfpFlowModCommand" json:"command,omitempty"`
	IdleTimeout          uint32            `protobuf:"varint,5,opt,name=idle_timeout,json=idleTimeout,proto3" json:"idle_timeout,omitempty"`
	HardTimeout          uint32            `protobuf:"varint,6,opt,name=hard_timeout,json=hardTimeout,proto3" json:"hard_timeout,omitempty"`
	Priority             uint32            `protobuf:"varint,7,opt,name=priority,proto3" json:"priority,omitempty"`
	BufferId             uint32            `protobuf:"varint,8,opt,name=buffer_id,json=bufferId,proto3" json:"buffer_id,omitempty"`
	OutPort              uint32            `protobuf:"varint,9,opt,name=out_port,json=outPort,proto3" json:"out_port,omitempty"`
	OutGroup             uint32            `protobuf:"varint,10,opt,name=out_group,json=outGroup,proto3" json:"out_group,omitempty"`
	Flags                uint32            `protobuf:"varint,11,opt,name=flags,proto3" json:"flags,omitempty"`
	Match                *OfpMatch         `protobuf:"bytes,12,opt,name=match,proto3" json:"match,omitempty"`
	Instructions         []*OfpInstruction `protobuf:"bytes,13,rep,name=instructions,proto3" json:"instructions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *OfpFlowMod) Reset()         { *m = OfpFlowMod{} }
func (m *OfpFlowMod) String() string { return proto.CompactTextString(m) }
func (*OfpFlowMod) ProtoMessage()    {}
func (*OfpFlowMod) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{29}
}
func (m *OfpFlowMod) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpFlowMod.Unmarshal(m, b)
}
func (m *OfpFlowMod) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpFlowMod.Marshal(b, m, deterministic)
}
func (dst *OfpFlowMod) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpFlowMod.Merge(dst, src)
}
func (m *OfpFlowMod) XXX_Size() int {
	return xxx_messageInfo_OfpFlowMod.Size(m)
}
func (m *OfpFlowMod) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpFlowMod.DiscardUnknown(m)
}

var xxx_messageInfo_OfpFlowMod proto.InternalMessageInfo

func (m *OfpFlowMod) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *OfpFlowMod) GetCookieMask() uint64 {
	if m != nil {
		return m.CookieMask
	}
	return 0
}

func (m *OfpFlowMod) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpFlowMod) GetCommand() OfpFlowModCommand {
	if m != nil {
		return m.Command
	}
	return OfpFlowModCommand_OFPFC_ADD
}

func (m *OfpFlowMod) GetIdleTimeout() uint32 {
	if m != nil {
		return m.IdleTimeout
	}
	return 0
}

func (m *OfpFlowMod) GetHardTimeout() uint32 {
	if m != nil {
		return m.HardTimeout
	}
	return 0
}

func (m *OfpFlowMod) GetPriority() uint32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *OfpFlowMod) GetBufferId() uint32 {
	if m != nil {
		return m.BufferId
	}
	return 0
}

func (m *OfpFlowMod) GetOutPort() uint32 {
	if m != nil {
		return m.OutPort
	}
	return 0
}

func (m *OfpFlowMod) GetOutGroup() uint32 {
	if m != nil {
		return m.OutGroup
	}
	return 0
}

func (m *OfpFlowMod) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpFlowMod) GetMatch() *OfpMatch {
	if m != nil {
		return m.Match
	}
	return nil
}

func (m *OfpFlowMod) GetInstructions() []*OfpInstruction {
	if m != nil {
		return m.Instructions
	}
	return nil
}

// Bucket for use in groups.
type OfpBucket struct {
	Weight               uint32       `protobuf:"varint,1,opt,name=weight,proto3" json:"weight,omitempty"`
	WatchPort            uint32       `protobuf:"varint,2,opt,name=watch_port,json=watchPort,proto3" json:"watch_port,omitempty"`
	WatchGroup           uint32       `protobuf:"varint,3,opt,name=watch_group,json=watchGroup,proto3" json:"watch_group,omitempty"`
	Actions              []*OfpAction `protobuf:"bytes,4,rep,name=actions,proto3" json:"actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *OfpBucket) Reset()         { *m = OfpBucket{} }
func (m *OfpBucket) String() string { return proto.CompactTextString(m) }
func (*OfpBucket) ProtoMessage()    {}
func (*OfpBucket) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{30}
}
func (m *OfpBucket) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpBucket.Unmarshal(m, b)
}
func (m *OfpBucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpBucket.Marshal(b, m, deterministic)
}
func (dst *OfpBucket) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpBucket.Merge(dst, src)
}
func (m *OfpBucket) XXX_Size() int {
	return xxx_messageInfo_OfpBucket.Size(m)
}
func (m *OfpBucket) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpBucket.DiscardUnknown(m)
}

var xxx_messageInfo_OfpBucket proto.InternalMessageInfo

func (m *OfpBucket) GetWeight() uint32 {
	if m != nil {
		return m.Weight
	}
	return 0
}

func (m *OfpBucket) GetWatchPort() uint32 {
	if m != nil {
		return m.WatchPort
	}
	return 0
}

func (m *OfpBucket) GetWatchGroup() uint32 {
	if m != nil {
		return m.WatchGroup
	}
	return 0
}

func (m *OfpBucket) GetActions() []*OfpAction {
	if m != nil {
		return m.Actions
	}
	return nil
}

// Group setup and teardown (controller -> datapath).
type OfpGroupMod struct {
	// ofp_header header;
	Command              OfpGroupModCommand `protobuf:"varint,1,opt,name=command,proto3,enum=openflow_13.OfpGroupModCommand" json:"command,omitempty"`
	Type                 OfpGroupType       `protobuf:"varint,2,opt,name=type,proto3,enum=openflow_13.OfpGroupType" json:"type,omitempty"`
	GroupId              uint32             `protobuf:"varint,3,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	Buckets              []*OfpBucket       `protobuf:"bytes,4,rep,name=buckets,proto3" json:"buckets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *OfpGroupMod) Reset()         { *m = OfpGroupMod{} }
func (m *OfpGroupMod) String() string { return proto.CompactTextString(m) }
func (*OfpGroupMod) ProtoMessage()    {}
func (*OfpGroupMod) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{31}
}
func (m *OfpGroupMod) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpGroupMod.Unmarshal(m, b)
}
func (m *OfpGroupMod) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpGroupMod.Marshal(b, m, deterministic)
}
func (dst *OfpGroupMod) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpGroupMod.Merge(dst, src)
}
func (m *OfpGroupMod) XXX_Size() int {
	return xxx_messageInfo_OfpGroupMod.Size(m)
}
func (m *OfpGroupMod) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpGroupMod.DiscardUnknown(m)
}

var xxx_messageInfo_OfpGroupMod proto.InternalMessageInfo

func (m *OfpGroupMod) GetCommand() OfpGroupModCommand {
	if m != nil {
		return m.Command
	}
	return OfpGroupModCommand_OFPGC_ADD
}

func (m *OfpGroupMod) GetType() OfpGroupType {
	if m != nil {
		return m.Type
	}
	return OfpGroupType_OFPGT_ALL
}

func (m *OfpGroupMod) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

func (m *OfpGroupMod) GetBuckets() []*OfpBucket {
	if m != nil {
		return m.Buckets
	}
	return nil
}

// Send packet (controller -> datapath).
type OfpPacketOut struct {
	// ofp_header header;
	BufferId uint32       `protobuf:"varint,1,opt,name=buffer_id,json=bufferId,proto3" json:"buffer_id,omitempty"`
	InPort   uint32       `protobuf:"varint,2,opt,name=in_port,json=inPort,proto3" json:"in_port,omitempty"`
	Actions  []*OfpAction `protobuf:"bytes,3,rep,name=actions,proto3" json:"actions,omitempty"`
	// The variable size action list is optionally followed by packet data.
	// This data is only present and meaningful if buffer_id == -1.
	Data                 []byte   `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpPacketOut) Reset()         { *m = OfpPacketOut{} }
func (m *OfpPacketOut) String() string { return proto.CompactTextString(m) }
func (*OfpPacketOut) ProtoMessage()    {}
func (*OfpPacketOut) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{32}
}
func (m *OfpPacketOut) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpPacketOut.Unmarshal(m, b)
}
func (m *OfpPacketOut) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpPacketOut.Marshal(b, m, deterministic)
}
func (dst *OfpPacketOut) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpPacketOut.Merge(dst, src)
}
func (m *OfpPacketOut) XXX_Size() int {
	return xxx_messageInfo_OfpPacketOut.Size(m)
}
func (m *OfpPacketOut) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpPacketOut.DiscardUnknown(m)
}

var xxx_messageInfo_OfpPacketOut proto.InternalMessageInfo

func (m *OfpPacketOut) GetBufferId() uint32 {
	if m != nil {
		return m.BufferId
	}
	return 0
}

func (m *OfpPacketOut) GetInPort() uint32 {
	if m != nil {
		return m.InPort
	}
	return 0
}

func (m *OfpPacketOut) GetActions() []*OfpAction {
	if m != nil {
		return m.Actions
	}
	return nil
}

func (m *OfpPacketOut) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Packet received on port (datapath -> controller).
type OfpPacketIn struct {
	// ofp_header header;
	BufferId             uint32            `protobuf:"varint,1,opt,name=buffer_id,json=bufferId,proto3" json:"buffer_id,omitempty"`
	Reason               OfpPacketInReason `protobuf:"varint,2,opt,name=reason,proto3,enum=openflow_13.OfpPacketInReason" json:"reason,omitempty"`
	TableId              uint32            `protobuf:"varint,3,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	Cookie               uint64            `protobuf:"varint,4,opt,name=cookie,proto3" json:"cookie,omitempty"`
	Match                *OfpMatch         `protobuf:"bytes,5,opt,name=match,proto3" json:"match,omitempty"`
	Data                 []byte            `protobuf:"bytes,6,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *OfpPacketIn) Reset()         { *m = OfpPacketIn{} }
func (m *OfpPacketIn) String() string { return proto.CompactTextString(m) }
func (*OfpPacketIn) ProtoMessage()    {}
func (*OfpPacketIn) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{33}
}
func (m *OfpPacketIn) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpPacketIn.Unmarshal(m, b)
}
func (m *OfpPacketIn) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpPacketIn.Marshal(b, m, deterministic)
}
func (dst *OfpPacketIn) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpPacketIn.Merge(dst, src)
}
func (m *OfpPacketIn) XXX_Size() int {
	return xxx_messageInfo_OfpPacketIn.Size(m)
}
func (m *OfpPacketIn) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpPacketIn.DiscardUnknown(m)
}

var xxx_messageInfo_OfpPacketIn proto.InternalMessageInfo

func (m *OfpPacketIn) GetBufferId() uint32 {
	if m != nil {
		return m.BufferId
	}
	return 0
}

func (m *OfpPacketIn) GetReason() OfpPacketInReason {
	if m != nil {
		return m.Reason
	}
	return OfpPacketInReason_OFPR_NO_MATCH
}

func (m *OfpPacketIn) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpPacketIn) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *OfpPacketIn) GetMatch() *OfpMatch {
	if m != nil {
		return m.Match
	}
	return nil
}

func (m *OfpPacketIn) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Flow removed (datapath -> controller).
type OfpFlowRemoved struct {
	// ofp_header header;
	Cookie               uint64               `protobuf:"varint,1,opt,name=cookie,proto3" json:"cookie,omitempty"`
	Priority             uint32               `protobuf:"varint,2,opt,name=priority,proto3" json:"priority,omitempty"`
	Reason               OfpFlowRemovedReason `protobuf:"varint,3,opt,name=reason,proto3,enum=openflow_13.OfpFlowRemovedReason" json:"reason,omitempty"`
	TableId              uint32               `protobuf:"varint,4,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	DurationSec          uint32               `protobuf:"varint,5,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	DurationNsec         uint32               `protobuf:"varint,6,opt,name=duration_nsec,json=durationNsec,proto3" json:"duration_nsec,omitempty"`
	IdleTimeout          uint32               `protobuf:"varint,7,opt,name=idle_timeout,json=idleTimeout,proto3" json:"idle_timeout,omitempty"`
	HardTimeout          uint32               `protobuf:"varint,8,opt,name=hard_timeout,json=hardTimeout,proto3" json:"hard_timeout,omitempty"`
	PacketCount          uint64               `protobuf:"varint,9,opt,name=packet_count,json=packetCount,proto3" json:"packet_count,omitempty"`
	ByteCount            uint64               `protobuf:"varint,10,opt,name=byte_count,json=byteCount,proto3" json:"byte_count,omitempty"`
	Match                *OfpMatch            `protobuf:"bytes,121,opt,name=match,proto3" json:"match,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *OfpFlowRemoved) Reset()         { *m = OfpFlowRemoved{} }
func (m *OfpFlowRemoved) String() string { return proto.CompactTextString(m) }
func (*OfpFlowRemoved) ProtoMessage()    {}
func (*OfpFlowRemoved) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{34}
}
func (m *OfpFlowRemoved) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpFlowRemoved.Unmarshal(m, b)
}
func (m *OfpFlowRemoved) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpFlowRemoved.Marshal(b, m, deterministic)
}
func (dst *OfpFlowRemoved) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpFlowRemoved.Merge(dst, src)
}
func (m *OfpFlowRemoved) XXX_Size() int {
	return xxx_messageInfo_OfpFlowRemoved.Size(m)
}
func (m *OfpFlowRemoved) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpFlowRemoved.DiscardUnknown(m)
}

var xxx_messageInfo_OfpFlowRemoved proto.InternalMessageInfo

func (m *OfpFlowRemoved) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *OfpFlowRemoved) GetPriority() uint32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *OfpFlowRemoved) GetReason() OfpFlowRemovedReason {
	if m != nil {
		return m.Reason
	}
	return OfpFlowRemovedReason_OFPRR_IDLE_TIMEOUT
}

func (m *OfpFlowRemoved) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpFlowRemoved) GetDurationSec() uint32 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *OfpFlowRemoved) GetDurationNsec() uint32 {
	if m != nil {
		return m.DurationNsec
	}
	return 0
}

func (m *OfpFlowRemoved) GetIdleTimeout() uint32 {
	if m != nil {
		return m.IdleTimeout
	}
	return 0
}

func (m *OfpFlowRemoved) GetHardTimeout() uint32 {
	if m != nil {
		return m.HardTimeout
	}
	return 0
}

func (m *OfpFlowRemoved) GetPacketCount() uint64 {
	if m != nil {
		return m.PacketCount
	}
	return 0
}

func (m *OfpFlowRemoved) GetByteCount() uint64 {
	if m != nil {
		return m.ByteCount
	}
	return 0
}

func (m *OfpFlowRemoved) GetMatch() *OfpMatch {
	if m != nil {
		return m.Match
	}
	return nil
}

// Common header for all meter bands
type OfpMeterBandHeader struct {
	Type      OfpMeterBandType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpMeterBandType" json:"type,omitempty"`
	Rate      uint32           `protobuf:"varint,2,opt,name=rate,proto3" json:"rate,omitempty"`
	BurstSize uint32           `protobuf:"varint,3,opt,name=burst_size,json=burstSize,proto3" json:"burst_size,omitempty"`
	// Types that are valid to be assigned to Data:
	//	*OfpMeterBandHeader_Drop
	//	*OfpMeterBandHeader_DscpRemark
	//	*OfpMeterBandHeader_Experimenter
	Data                 isOfpMeterBandHeader_Data `protobuf_oneof:"data"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *OfpMeterBandHeader) Reset()         { *m = OfpMeterBandHeader{} }
func (m *OfpMeterBandHeader) String() string { return proto.CompactTextString(m) }
func (*OfpMeterBandHeader) ProtoMessage()    {}
func (*OfpMeterBandHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{35}
}
func (m *OfpMeterBandHeader) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMeterBandHeader.Unmarshal(m, b)
}
func (m *OfpMeterBandHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMeterBandHeader.Marshal(b, m, deterministic)
}
func (dst *OfpMeterBandHeader) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMeterBandHeader.Merge(dst, src)
}
func (m *OfpMeterBandHeader) XXX_Size() int {
	return xxx_messageInfo_OfpMeterBandHeader.Size(m)
}
func (m *OfpMeterBandHeader) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMeterBandHeader.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMeterBandHeader proto.InternalMessageInfo

func (m *OfpMeterBandHeader) GetType() OfpMeterBandType {
	if m != nil {
		return m.Type
	}
	return OfpMeterBandType_OFPMBT_INVALID
}

func (m *OfpMeterBandHeader) GetRate() uint32 {
	if m != nil {
		return m.Rate
	}
	return 0
}

func (m *OfpMeterBandHeader) GetBurstSize() uint32 {
	if m != nil {
		return m.BurstSize
	}
	return 0
}

type isOfpMeterBandHeader_Data interface {
	isOfpMeterBandHeader_Data()
}

type OfpMeterBandHeader_Drop struct {
	Drop *OfpMeterBandDrop `protobuf:"bytes,4,opt,name=drop,proto3,oneof"`
}

type OfpMeterBandHeader_DscpRemark struct {
	DscpRemark *OfpMeterBandDscpRemark `protobuf:"bytes,5,opt,name=dscp_remark,json=dscpRemark,proto3,oneof"`
}

type OfpMeterBandHeader_Experimenter struct {
	Experimenter *OfpMeterBandExperimenter `protobuf:"bytes,6,opt,name=experimenter,proto3,oneof"`
}

func (*OfpMeterBandHeader_Drop) isOfpMeterBandHeader_Data() {}

func (*OfpMeterBandHeader_DscpRemark) isOfpMeterBandHeader_Data() {}

func (*OfpMeterBandHeader_Experimenter) isOfpMeterBandHeader_Data() {}

func (m *OfpMeterBandHeader) GetData() isOfpMeterBandHeader_Data {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *OfpMeterBandHeader) GetDrop() *OfpMeterBandDrop {
	if x, ok := m.GetData().(*OfpMeterBandHeader_Drop); ok {
		return x.Drop
	}
	return nil
}

func (m *OfpMeterBandHeader) GetDscpRemark() *OfpMeterBandDscpRemark {
	if x, ok := m.GetData().(*OfpMeterBandHeader_DscpRemark); ok {
		return x.DscpRemark
	}
	return nil
}

func (m *OfpMeterBandHeader) GetExperimenter() *OfpMeterBandExperimenter {
	if x, ok := m.GetData().(*OfpMeterBandHeader_Experimenter); ok {
		return x.Experimenter
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*OfpMeterBandHeader) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _OfpMeterBandHeader_OneofMarshaler, _OfpMeterBandHeader_OneofUnmarshaler, _OfpMeterBandHeader_OneofSizer, []interface{}{
		(*OfpMeterBandHeader_Drop)(nil),
		(*OfpMeterBandHeader_DscpRemark)(nil),
		(*OfpMeterBandHeader_Experimenter)(nil),
	}
}

func _OfpMeterBandHeader_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*OfpMeterBandHeader)
	// data
	switch x := m.Data.(type) {
	case *OfpMeterBandHeader_Drop:
		b.EncodeVarint(4<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Drop); err != nil {
			return err
		}
	case *OfpMeterBandHeader_DscpRemark:
		b.EncodeVarint(5<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.DscpRemark); err != nil {
			return err
		}
	case *OfpMeterBandHeader_Experimenter:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Experimenter); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("OfpMeterBandHeader.Data has unexpected type %T", x)
	}
	return nil
}

func _OfpMeterBandHeader_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*OfpMeterBandHeader)
	switch tag {
	case 4: // data.drop
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpMeterBandDrop)
		err := b.DecodeMessage(msg)
		m.Data = &OfpMeterBandHeader_Drop{msg}
		return true, err
	case 5: // data.dscp_remark
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpMeterBandDscpRemark)
		err := b.DecodeMessage(msg)
		m.Data = &OfpMeterBandHeader_DscpRemark{msg}
		return true, err
	case 6: // data.experimenter
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpMeterBandExperimenter)
		err := b.DecodeMessage(msg)
		m.Data = &OfpMeterBandHeader_Experimenter{msg}
		return true, err
	default:
		return false, nil
	}
}

func _OfpMeterBandHeader_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*OfpMeterBandHeader)
	// data
	switch x := m.Data.(type) {
	case *OfpMeterBandHeader_Drop:
		s := proto.Size(x.Drop)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpMeterBandHeader_DscpRemark:
		s := proto.Size(x.DscpRemark)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpMeterBandHeader_Experimenter:
		s := proto.Size(x.Experimenter)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// OFPMBT_DROP band - drop packets
type OfpMeterBandDrop struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpMeterBandDrop) Reset()         { *m = OfpMeterBandDrop{} }
func (m *OfpMeterBandDrop) String() string { return proto.CompactTextString(m) }
func (*OfpMeterBandDrop) ProtoMessage()    {}
func (*OfpMeterBandDrop) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{36}
}
func (m *OfpMeterBandDrop) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMeterBandDrop.Unmarshal(m, b)
}
func (m *OfpMeterBandDrop) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMeterBandDrop.Marshal(b, m, deterministic)
}
func (dst *OfpMeterBandDrop) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMeterBandDrop.Merge(dst, src)
}
func (m *OfpMeterBandDrop) XXX_Size() int {
	return xxx_messageInfo_OfpMeterBandDrop.Size(m)
}
func (m *OfpMeterBandDrop) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMeterBandDrop.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMeterBandDrop proto.InternalMessageInfo

// OFPMBT_DSCP_REMARK band - Remark DSCP in the IP header
type OfpMeterBandDscpRemark struct {
	PrecLevel            uint32   `protobuf:"varint,1,opt,name=prec_level,json=precLevel,proto3" json:"prec_level,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpMeterBandDscpRemark) Reset()         { *m = OfpMeterBandDscpRemark{} }
func (m *OfpMeterBandDscpRemark) String() string { return proto.CompactTextString(m) }
func (*OfpMeterBandDscpRemark) ProtoMessage()    {}
func (*OfpMeterBandDscpRemark) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{37}
}
func (m *OfpMeterBandDscpRemark) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMeterBandDscpRemark.Unmarshal(m, b)
}
func (m *OfpMeterBandDscpRemark) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMeterBandDscpRemark.Marshal(b, m, deterministic)
}
func (dst *OfpMeterBandDscpRemark) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMeterBandDscpRemark.Merge(dst, src)
}
func (m *OfpMeterBandDscpRemark) XXX_Size() int {
	return xxx_messageInfo_OfpMeterBandDscpRemark.Size(m)
}
func (m *OfpMeterBandDscpRemark) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMeterBandDscpRemark.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMeterBandDscpRemark proto.InternalMessageInfo

func (m *OfpMeterBandDscpRemark) GetPrecLevel() uint32 {
	if m != nil {
		return m.PrecLevel
	}
	return 0
}

// OFPMBT_EXPERIMENTER band - Experimenter type.
// The rest of the band is experimenter-defined.
type OfpMeterBandExperimenter struct {
	Experimenter         uint32   `protobuf:"varint,1,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpMeterBandExperimenter) Reset()         { *m = OfpMeterBandExperimenter{} }
func (m *OfpMeterBandExperimenter) String() string { return proto.CompactTextString(m) }
func (*OfpMeterBandExperimenter) ProtoMessage()    {}
func (*OfpMeterBandExperimenter) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{38}
}
func (m *OfpMeterBandExperimenter) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMeterBandExperimenter.Unmarshal(m, b)
}
func (m *OfpMeterBandExperimenter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMeterBandExperimenter.Marshal(b, m, deterministic)
}
func (dst *OfpMeterBandExperimenter) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMeterBandExperimenter.Merge(dst, src)
}
func (m *OfpMeterBandExperimenter) XXX_Size() int {
	return xxx_messageInfo_OfpMeterBandExperimenter.Size(m)
}
func (m *OfpMeterBandExperimenter) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMeterBandExperimenter.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMeterBandExperimenter proto.InternalMessageInfo

func (m *OfpMeterBandExperimenter) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

// Meter configuration. OFPT_METER_MOD.
type OfpMeterMod struct {
	Command              OfpMeterModCommand    `protobuf:"varint,1,opt,name=command,proto3,enum=openflow_13.OfpMeterModCommand" json:"command,omitempty"`
	Flags                uint32                `protobuf:"varint,2,opt,name=flags,proto3" json:"flags,omitempty"`
	MeterId              uint32                `protobuf:"varint,3,opt,name=meter_id,json=meterId,proto3" json:"meter_id,omitempty"`
	Bands                []*OfpMeterBandHeader `protobuf:"bytes,4,rep,name=bands,proto3" json:"bands,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *OfpMeterMod) Reset()         { *m = OfpMeterMod{} }
func (m *OfpMeterMod) String() string { return proto.CompactTextString(m) }
func (*OfpMeterMod) ProtoMessage()    {}
func (*OfpMeterMod) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{39}
}
func (m *OfpMeterMod) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMeterMod.Unmarshal(m, b)
}
func (m *OfpMeterMod) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMeterMod.Marshal(b, m, deterministic)
}
func (dst *OfpMeterMod) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMeterMod.Merge(dst, src)
}
func (m *OfpMeterMod) XXX_Size() int {
	return xxx_messageInfo_OfpMeterMod.Size(m)
}
func (m *OfpMeterMod) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMeterMod.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMeterMod proto.InternalMessageInfo

func (m *OfpMeterMod) GetCommand() OfpMeterModCommand {
	if m != nil {
		return m.Command
	}
	return OfpMeterModCommand_OFPMC_ADD
}

func (m *OfpMeterMod) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpMeterMod) GetMeterId() uint32 {
	if m != nil {
		return m.MeterId
	}
	return 0
}

func (m *OfpMeterMod) GetBands() []*OfpMeterBandHeader {
	if m != nil {
		return m.Bands
	}
	return nil
}

// OFPT_ERROR: Error message (datapath -> controller).
type OfpErrorMsg struct {
	// ofp_header header;
	Type                 uint32   `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"`
	Code                 uint32   `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
	Data                 []byte   `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpErrorMsg) Reset()         { *m = OfpErrorMsg{} }
func (m *OfpErrorMsg) String() string { return proto.CompactTextString(m) }
func (*OfpErrorMsg) ProtoMessage()    {}
func (*OfpErrorMsg) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{40}
}
func (m *OfpErrorMsg) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpErrorMsg.Unmarshal(m, b)
}
func (m *OfpErrorMsg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpErrorMsg.Marshal(b, m, deterministic)
}
func (dst *OfpErrorMsg) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpErrorMsg.Merge(dst, src)
}
func (m *OfpErrorMsg) XXX_Size() int {
	return xxx_messageInfo_OfpErrorMsg.Size(m)
}
func (m *OfpErrorMsg) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpErrorMsg.DiscardUnknown(m)
}

var xxx_messageInfo_OfpErrorMsg proto.InternalMessageInfo

func (m *OfpErrorMsg) GetType() uint32 {
	if m != nil {
		return m.Type
	}
	return 0
}

func (m *OfpErrorMsg) GetCode() uint32 {
	if m != nil {
		return m.Code
	}
	return 0
}

func (m *OfpErrorMsg) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// OFPET_EXPERIMENTER: Error message (datapath -> controller).
type OfpErrorExperimenterMsg struct {
	Type                 uint32   `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"`
	ExpType              uint32   `protobuf:"varint,2,opt,name=exp_type,json=expType,proto3" json:"exp_type,omitempty"`
	Experimenter         uint32   `protobuf:"varint,3,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	Data                 []byte   `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpErrorExperimenterMsg) Reset()         { *m = OfpErrorExperimenterMsg{} }
func (m *OfpErrorExperimenterMsg) String() string { return proto.CompactTextString(m) }
func (*OfpErrorExperimenterMsg) ProtoMessage()    {}
func (*OfpErrorExperimenterMsg) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{41}
}
func (m *OfpErrorExperimenterMsg) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpErrorExperimenterMsg.Unmarshal(m, b)
}
func (m *OfpErrorExperimenterMsg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpErrorExperimenterMsg.Marshal(b, m, deterministic)
}
func (dst *OfpErrorExperimenterMsg) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpErrorExperimenterMsg.Merge(dst, src)
}
func (m *OfpErrorExperimenterMsg) XXX_Size() int {
	return xxx_messageInfo_OfpErrorExperimenterMsg.Size(m)
}
func (m *OfpErrorExperimenterMsg) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpErrorExperimenterMsg.DiscardUnknown(m)
}

var xxx_messageInfo_OfpErrorExperimenterMsg proto.InternalMessageInfo

func (m *OfpErrorExperimenterMsg) GetType() uint32 {
	if m != nil {
		return m.Type
	}
	return 0
}

func (m *OfpErrorExperimenterMsg) GetExpType() uint32 {
	if m != nil {
		return m.ExpType
	}
	return 0
}

func (m *OfpErrorExperimenterMsg) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpErrorExperimenterMsg) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

type OfpMultipartRequest struct {
	// ofp_header header;
	Type                 OfpMultipartType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpMultipartType" json:"type,omitempty"`
	Flags                uint32           `protobuf:"varint,2,opt,name=flags,proto3" json:"flags,omitempty"`
	Body                 []byte           `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *OfpMultipartRequest) Reset()         { *m = OfpMultipartRequest{} }
func (m *OfpMultipartRequest) String() string { return proto.CompactTextString(m) }
func (*OfpMultipartRequest) ProtoMessage()    {}
func (*OfpMultipartRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{42}
}
func (m *OfpMultipartRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMultipartRequest.Unmarshal(m, b)
}
func (m *OfpMultipartRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMultipartRequest.Marshal(b, m, deterministic)
}
func (dst *OfpMultipartRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMultipartRequest.Merge(dst, src)
}
func (m *OfpMultipartRequest) XXX_Size() int {
	return xxx_messageInfo_OfpMultipartRequest.Size(m)
}
func (m *OfpMultipartRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMultipartRequest.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMultipartRequest proto.InternalMessageInfo

func (m *OfpMultipartRequest) GetType() OfpMultipartType {
	if m != nil {
		return m.Type
	}
	return OfpMultipartType_OFPMP_DESC
}

func (m *OfpMultipartRequest) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpMultipartRequest) GetBody() []byte {
	if m != nil {
		return m.Body
	}
	return nil
}

type OfpMultipartReply struct {
	// ofp_header header;
	Type                 OfpMultipartType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpMultipartType" json:"type,omitempty"`
	Flags                uint32           `protobuf:"varint,2,opt,name=flags,proto3" json:"flags,omitempty"`
	Body                 []byte           `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *OfpMultipartReply) Reset()         { *m = OfpMultipartReply{} }
func (m *OfpMultipartReply) String() string { return proto.CompactTextString(m) }
func (*OfpMultipartReply) ProtoMessage()    {}
func (*OfpMultipartReply) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{43}
}
func (m *OfpMultipartReply) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMultipartReply.Unmarshal(m, b)
}
func (m *OfpMultipartReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMultipartReply.Marshal(b, m, deterministic)
}
func (dst *OfpMultipartReply) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMultipartReply.Merge(dst, src)
}
func (m *OfpMultipartReply) XXX_Size() int {
	return xxx_messageInfo_OfpMultipartReply.Size(m)
}
func (m *OfpMultipartReply) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMultipartReply.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMultipartReply proto.InternalMessageInfo

func (m *OfpMultipartReply) GetType() OfpMultipartType {
	if m != nil {
		return m.Type
	}
	return OfpMultipartType_OFPMP_DESC
}

func (m *OfpMultipartReply) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpMultipartReply) GetBody() []byte {
	if m != nil {
		return m.Body
	}
	return nil
}

// Body of reply to OFPMP_DESC request.  Each entry is a NULL-terminated
// ASCII string.
type OfpDesc struct {
	MfrDesc              string   `protobuf:"bytes,1,opt,name=mfr_desc,json=mfrDesc,proto3" json:"mfr_desc,omitempty"`
	HwDesc               string   `protobuf:"bytes,2,opt,name=hw_desc,json=hwDesc,proto3" json:"hw_desc,omitempty"`
	SwDesc               string   `protobuf:"bytes,3,opt,name=sw_desc,json=swDesc,proto3" json:"sw_desc,omitempty"`
	SerialNum            string   `protobuf:"bytes,4,opt,name=serial_num,json=serialNum,proto3" json:"serial_num,omitempty"`
	DpDesc               string   `protobuf:"bytes,5,opt,name=dp_desc,json=dpDesc,proto3" json:"dp_desc,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpDesc) Reset()         { *m = OfpDesc{} }
func (m *OfpDesc) String() string { return proto.CompactTextString(m) }
func (*OfpDesc) ProtoMessage()    {}
func (*OfpDesc) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{44}
}
func (m *OfpDesc) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpDesc.Unmarshal(m, b)
}
func (m *OfpDesc) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpDesc.Marshal(b, m, deterministic)
}
func (dst *OfpDesc) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpDesc.Merge(dst, src)
}
func (m *OfpDesc) XXX_Size() int {
	return xxx_messageInfo_OfpDesc.Size(m)
}
func (m *OfpDesc) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpDesc.DiscardUnknown(m)
}

var xxx_messageInfo_OfpDesc proto.InternalMessageInfo

func (m *OfpDesc) GetMfrDesc() string {
	if m != nil {
		return m.MfrDesc
	}
	return ""
}

func (m *OfpDesc) GetHwDesc() string {
	if m != nil {
		return m.HwDesc
	}
	return ""
}

func (m *OfpDesc) GetSwDesc() string {
	if m != nil {
		return m.SwDesc
	}
	return ""
}

func (m *OfpDesc) GetSerialNum() string {
	if m != nil {
		return m.SerialNum
	}
	return ""
}

func (m *OfpDesc) GetDpDesc() string {
	if m != nil {
		return m.DpDesc
	}
	return ""
}

// Body for ofp_multipart_request of type OFPMP_FLOW.
type OfpFlowStatsRequest struct {
	TableId              uint32    `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	OutPort              uint32    `protobuf:"varint,2,opt,name=out_port,json=outPort,proto3" json:"out_port,omitempty"`
	OutGroup             uint32    `protobuf:"varint,3,opt,name=out_group,json=outGroup,proto3" json:"out_group,omitempty"`
	Cookie               uint64    `protobuf:"varint,4,opt,name=cookie,proto3" json:"cookie,omitempty"`
	CookieMask           uint64    `protobuf:"varint,5,opt,name=cookie_mask,json=cookieMask,proto3" json:"cookie_mask,omitempty"`
	Match                *OfpMatch `protobuf:"bytes,6,opt,name=match,proto3" json:"match,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *OfpFlowStatsRequest) Reset()         { *m = OfpFlowStatsRequest{} }
func (m *OfpFlowStatsRequest) String() string { return proto.CompactTextString(m) }
func (*OfpFlowStatsRequest) ProtoMessage()    {}
func (*OfpFlowStatsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{45}
}
func (m *OfpFlowStatsRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpFlowStatsRequest.Unmarshal(m, b)
}
func (m *OfpFlowStatsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpFlowStatsRequest.Marshal(b, m, deterministic)
}
func (dst *OfpFlowStatsRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpFlowStatsRequest.Merge(dst, src)
}
func (m *OfpFlowStatsRequest) XXX_Size() int {
	return xxx_messageInfo_OfpFlowStatsRequest.Size(m)
}
func (m *OfpFlowStatsRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpFlowStatsRequest.DiscardUnknown(m)
}

var xxx_messageInfo_OfpFlowStatsRequest proto.InternalMessageInfo

func (m *OfpFlowStatsRequest) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpFlowStatsRequest) GetOutPort() uint32 {
	if m != nil {
		return m.OutPort
	}
	return 0
}

func (m *OfpFlowStatsRequest) GetOutGroup() uint32 {
	if m != nil {
		return m.OutGroup
	}
	return 0
}

func (m *OfpFlowStatsRequest) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *OfpFlowStatsRequest) GetCookieMask() uint64 {
	if m != nil {
		return m.CookieMask
	}
	return 0
}

func (m *OfpFlowStatsRequest) GetMatch() *OfpMatch {
	if m != nil {
		return m.Match
	}
	return nil
}

// Body of reply to OFPMP_FLOW request.
type OfpFlowStats struct {
	Id                   uint64            `protobuf:"varint,14,opt,name=id,proto3" json:"id,omitempty"`
	TableId              uint32            `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	DurationSec          uint32            `protobuf:"varint,2,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	DurationNsec         uint32            `protobuf:"varint,3,opt,name=duration_nsec,json=durationNsec,proto3" json:"duration_nsec,omitempty"`
	Priority             uint32            `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"`
	IdleTimeout          uint32            `protobuf:"varint,5,opt,name=idle_timeout,json=idleTimeout,proto3" json:"idle_timeout,omitempty"`
	HardTimeout          uint32            `protobuf:"varint,6,opt,name=hard_timeout,json=hardTimeout,proto3" json:"hard_timeout,omitempty"`
	Flags                uint32            `protobuf:"varint,7,opt,name=flags,proto3" json:"flags,omitempty"`
	Cookie               uint64            `protobuf:"varint,8,opt,name=cookie,proto3" json:"cookie,omitempty"`
	PacketCount          uint64            `protobuf:"varint,9,opt,name=packet_count,json=packetCount,proto3" json:"packet_count,omitempty"`
	ByteCount            uint64            `protobuf:"varint,10,opt,name=byte_count,json=byteCount,proto3" json:"byte_count,omitempty"`
	Match                *OfpMatch         `protobuf:"bytes,12,opt,name=match,proto3" json:"match,omitempty"`
	Instructions         []*OfpInstruction `protobuf:"bytes,13,rep,name=instructions,proto3" json:"instructions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *OfpFlowStats) Reset()         { *m = OfpFlowStats{} }
func (m *OfpFlowStats) String() string { return proto.CompactTextString(m) }
func (*OfpFlowStats) ProtoMessage()    {}
func (*OfpFlowStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{46}
}
func (m *OfpFlowStats) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpFlowStats.Unmarshal(m, b)
}
func (m *OfpFlowStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpFlowStats.Marshal(b, m, deterministic)
}
func (dst *OfpFlowStats) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpFlowStats.Merge(dst, src)
}
func (m *OfpFlowStats) XXX_Size() int {
	return xxx_messageInfo_OfpFlowStats.Size(m)
}
func (m *OfpFlowStats) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpFlowStats.DiscardUnknown(m)
}

var xxx_messageInfo_OfpFlowStats proto.InternalMessageInfo

func (m *OfpFlowStats) GetId() uint64 {
	if m != nil {
		return m.Id
	}
	return 0
}

func (m *OfpFlowStats) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpFlowStats) GetDurationSec() uint32 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *OfpFlowStats) GetDurationNsec() uint32 {
	if m != nil {
		return m.DurationNsec
	}
	return 0
}

func (m *OfpFlowStats) GetPriority() uint32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *OfpFlowStats) GetIdleTimeout() uint32 {
	if m != nil {
		return m.IdleTimeout
	}
	return 0
}

func (m *OfpFlowStats) GetHardTimeout() uint32 {
	if m != nil {
		return m.HardTimeout
	}
	return 0
}

func (m *OfpFlowStats) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpFlowStats) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *OfpFlowStats) GetPacketCount() uint64 {
	if m != nil {
		return m.PacketCount
	}
	return 0
}

func (m *OfpFlowStats) GetByteCount() uint64 {
	if m != nil {
		return m.ByteCount
	}
	return 0
}

func (m *OfpFlowStats) GetMatch() *OfpMatch {
	if m != nil {
		return m.Match
	}
	return nil
}

func (m *OfpFlowStats) GetInstructions() []*OfpInstruction {
	if m != nil {
		return m.Instructions
	}
	return nil
}

// Body for ofp_multipart_request of type OFPMP_AGGREGATE.
type OfpAggregateStatsRequest struct {
	TableId              uint32    `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	OutPort              uint32    `protobuf:"varint,2,opt,name=out_port,json=outPort,proto3" json:"out_port,omitempty"`
	OutGroup             uint32    `protobuf:"varint,3,opt,name=out_group,json=outGroup,proto3" json:"out_group,omitempty"`
	Cookie               uint64    `protobuf:"varint,4,opt,name=cookie,proto3" json:"cookie,omitempty"`
	CookieMask           uint64    `protobuf:"varint,5,opt,name=cookie_mask,json=cookieMask,proto3" json:"cookie_mask,omitempty"`
	Match                *OfpMatch `protobuf:"bytes,6,opt,name=match,proto3" json:"match,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *OfpAggregateStatsRequest) Reset()         { *m = OfpAggregateStatsRequest{} }
func (m *OfpAggregateStatsRequest) String() string { return proto.CompactTextString(m) }
func (*OfpAggregateStatsRequest) ProtoMessage()    {}
func (*OfpAggregateStatsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{47}
}
func (m *OfpAggregateStatsRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpAggregateStatsRequest.Unmarshal(m, b)
}
func (m *OfpAggregateStatsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpAggregateStatsRequest.Marshal(b, m, deterministic)
}
func (dst *OfpAggregateStatsRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpAggregateStatsRequest.Merge(dst, src)
}
func (m *OfpAggregateStatsRequest) XXX_Size() int {
	return xxx_messageInfo_OfpAggregateStatsRequest.Size(m)
}
func (m *OfpAggregateStatsRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpAggregateStatsRequest.DiscardUnknown(m)
}

var xxx_messageInfo_OfpAggregateStatsRequest proto.InternalMessageInfo

func (m *OfpAggregateStatsRequest) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpAggregateStatsRequest) GetOutPort() uint32 {
	if m != nil {
		return m.OutPort
	}
	return 0
}

func (m *OfpAggregateStatsRequest) GetOutGroup() uint32 {
	if m != nil {
		return m.OutGroup
	}
	return 0
}

func (m *OfpAggregateStatsRequest) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *OfpAggregateStatsRequest) GetCookieMask() uint64 {
	if m != nil {
		return m.CookieMask
	}
	return 0
}

func (m *OfpAggregateStatsRequest) GetMatch() *OfpMatch {
	if m != nil {
		return m.Match
	}
	return nil
}

// Body of reply to OFPMP_AGGREGATE request.
type OfpAggregateStatsReply struct {
	PacketCount          uint64   `protobuf:"varint,1,opt,name=packet_count,json=packetCount,proto3" json:"packet_count,omitempty"`
	ByteCount            uint64   `protobuf:"varint,2,opt,name=byte_count,json=byteCount,proto3" json:"byte_count,omitempty"`
	FlowCount            uint32   `protobuf:"varint,3,opt,name=flow_count,json=flowCount,proto3" json:"flow_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpAggregateStatsReply) Reset()         { *m = OfpAggregateStatsReply{} }
func (m *OfpAggregateStatsReply) String() string { return proto.CompactTextString(m) }
func (*OfpAggregateStatsReply) ProtoMessage()    {}
func (*OfpAggregateStatsReply) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{48}
}
func (m *OfpAggregateStatsReply) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpAggregateStatsReply.Unmarshal(m, b)
}
func (m *OfpAggregateStatsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpAggregateStatsReply.Marshal(b, m, deterministic)
}
func (dst *OfpAggregateStatsReply) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpAggregateStatsReply.Merge(dst, src)
}
func (m *OfpAggregateStatsReply) XXX_Size() int {
	return xxx_messageInfo_OfpAggregateStatsReply.Size(m)
}
func (m *OfpAggregateStatsReply) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpAggregateStatsReply.DiscardUnknown(m)
}

var xxx_messageInfo_OfpAggregateStatsReply proto.InternalMessageInfo

func (m *OfpAggregateStatsReply) GetPacketCount() uint64 {
	if m != nil {
		return m.PacketCount
	}
	return 0
}

func (m *OfpAggregateStatsReply) GetByteCount() uint64 {
	if m != nil {
		return m.ByteCount
	}
	return 0
}

func (m *OfpAggregateStatsReply) GetFlowCount() uint32 {
	if m != nil {
		return m.FlowCount
	}
	return 0
}

// Common header for all Table Feature Properties
type OfpTableFeatureProperty struct {
	Type OfpTableFeaturePropType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpTableFeaturePropType" json:"type,omitempty"`
	// Types that are valid to be assigned to Value:
	//	*OfpTableFeatureProperty_Instructions
	//	*OfpTableFeatureProperty_NextTables
	//	*OfpTableFeatureProperty_Actions
	//	*OfpTableFeatureProperty_Oxm
	//	*OfpTableFeatureProperty_Experimenter
	Value                isOfpTableFeatureProperty_Value `protobuf_oneof:"value"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

func (m *OfpTableFeatureProperty) Reset()         { *m = OfpTableFeatureProperty{} }
func (m *OfpTableFeatureProperty) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeatureProperty) ProtoMessage()    {}
func (*OfpTableFeatureProperty) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{49}
}
func (m *OfpTableFeatureProperty) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpTableFeatureProperty.Unmarshal(m, b)
}
func (m *OfpTableFeatureProperty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpTableFeatureProperty.Marshal(b, m, deterministic)
}
func (dst *OfpTableFeatureProperty) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpTableFeatureProperty.Merge(dst, src)
}
func (m *OfpTableFeatureProperty) XXX_Size() int {
	return xxx_messageInfo_OfpTableFeatureProperty.Size(m)
}
func (m *OfpTableFeatureProperty) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpTableFeatureProperty.DiscardUnknown(m)
}

var xxx_messageInfo_OfpTableFeatureProperty proto.InternalMessageInfo

func (m *OfpTableFeatureProperty) GetType() OfpTableFeaturePropType {
	if m != nil {
		return m.Type
	}
	return OfpTableFeaturePropType_OFPTFPT_INSTRUCTIONS
}

type isOfpTableFeatureProperty_Value interface {
	isOfpTableFeatureProperty_Value()
}

type OfpTableFeatureProperty_Instructions struct {
	Instructions *OfpTableFeaturePropInstructions `protobuf:"bytes,2,opt,name=instructions,proto3,oneof"`
}

type OfpTableFeatureProperty_NextTables struct {
	NextTables *OfpTableFeaturePropNextTables `protobuf:"bytes,3,opt,name=next_tables,json=nextTables,proto3,oneof"`
}

type OfpTableFeatureProperty_Actions struct {
	Actions *OfpTableFeaturePropActions `protobuf:"bytes,4,opt,name=actions,proto3,oneof"`
}

type OfpTableFeatureProperty_Oxm struct {
	Oxm *OfpTableFeaturePropOxm `protobuf:"bytes,5,opt,name=oxm,proto3,oneof"`
}

type OfpTableFeatureProperty_Experimenter struct {
	Experimenter *OfpTableFeaturePropExperimenter `protobuf:"bytes,6,opt,name=experimenter,proto3,oneof"`
}

func (*OfpTableFeatureProperty_Instructions) isOfpTableFeatureProperty_Value() {}

func (*OfpTableFeatureProperty_NextTables) isOfpTableFeatureProperty_Value() {}

func (*OfpTableFeatureProperty_Actions) isOfpTableFeatureProperty_Value() {}

func (*OfpTableFeatureProperty_Oxm) isOfpTableFeatureProperty_Value() {}

func (*OfpTableFeatureProperty_Experimenter) isOfpTableFeatureProperty_Value() {}

func (m *OfpTableFeatureProperty) GetValue() isOfpTableFeatureProperty_Value {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *OfpTableFeatureProperty) GetInstructions() *OfpTableFeaturePropInstructions {
	if x, ok := m.GetValue().(*OfpTableFeatureProperty_Instructions); ok {
		return x.Instructions
	}
	return nil
}

func (m *OfpTableFeatureProperty) GetNextTables() *OfpTableFeaturePropNextTables {
	if x, ok := m.GetValue().(*OfpTableFeatureProperty_NextTables); ok {
		return x.NextTables
	}
	return nil
}

func (m *OfpTableFeatureProperty) GetActions() *OfpTableFeaturePropActions {
	if x, ok := m.GetValue().(*OfpTableFeatureProperty_Actions); ok {
		return x.Actions
	}
	return nil
}

func (m *OfpTableFeatureProperty) GetOxm() *OfpTableFeaturePropOxm {
	if x, ok := m.GetValue().(*OfpTableFeatureProperty_Oxm); ok {
		return x.Oxm
	}
	return nil
}

func (m *OfpTableFeatureProperty) GetExperimenter() *OfpTableFeaturePropExperimenter {
	if x, ok := m.GetValue().(*OfpTableFeatureProperty_Experimenter); ok {
		return x.Experimenter
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*OfpTableFeatureProperty) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _OfpTableFeatureProperty_OneofMarshaler, _OfpTableFeatureProperty_OneofUnmarshaler, _OfpTableFeatureProperty_OneofSizer, []interface{}{
		(*OfpTableFeatureProperty_Instructions)(nil),
		(*OfpTableFeatureProperty_NextTables)(nil),
		(*OfpTableFeatureProperty_Actions)(nil),
		(*OfpTableFeatureProperty_Oxm)(nil),
		(*OfpTableFeatureProperty_Experimenter)(nil),
	}
}

func _OfpTableFeatureProperty_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*OfpTableFeatureProperty)
	// value
	switch x := m.Value.(type) {
	case *OfpTableFeatureProperty_Instructions:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Instructions); err != nil {
			return err
		}
	case *OfpTableFeatureProperty_NextTables:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.NextTables); err != nil {
			return err
		}
	case *OfpTableFeatureProperty_Actions:
		b.EncodeVarint(4<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Actions); err != nil {
			return err
		}
	case *OfpTableFeatureProperty_Oxm:
		b.EncodeVarint(5<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Oxm); err != nil {
			return err
		}
	case *OfpTableFeatureProperty_Experimenter:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Experimenter); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("OfpTableFeatureProperty.Value has unexpected type %T", x)
	}
	return nil
}

func _OfpTableFeatureProperty_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*OfpTableFeatureProperty)
	switch tag {
	case 2: // value.instructions
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpTableFeaturePropInstructions)
		err := b.DecodeMessage(msg)
		m.Value = &OfpTableFeatureProperty_Instructions{msg}
		return true, err
	case 3: // value.next_tables
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpTableFeaturePropNextTables)
		err := b.DecodeMessage(msg)
		m.Value = &OfpTableFeatureProperty_NextTables{msg}
		return true, err
	case 4: // value.actions
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpTableFeaturePropActions)
		err := b.DecodeMessage(msg)
		m.Value = &OfpTableFeatureProperty_Actions{msg}
		return true, err
	case 5: // value.oxm
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpTableFeaturePropOxm)
		err := b.DecodeMessage(msg)
		m.Value = &OfpTableFeatureProperty_Oxm{msg}
		return true, err
	case 6: // value.experimenter
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpTableFeaturePropExperimenter)
		err := b.DecodeMessage(msg)
		m.Value = &OfpTableFeatureProperty_Experimenter{msg}
		return true, err
	default:
		return false, nil
	}
}

func _OfpTableFeatureProperty_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*OfpTableFeatureProperty)
	// value
	switch x := m.Value.(type) {
	case *OfpTableFeatureProperty_Instructions:
		s := proto.Size(x.Instructions)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpTableFeatureProperty_NextTables:
		s := proto.Size(x.NextTables)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpTableFeatureProperty_Actions:
		s := proto.Size(x.Actions)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpTableFeatureProperty_Oxm:
		s := proto.Size(x.Oxm)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *OfpTableFeatureProperty_Experimenter:
		s := proto.Size(x.Experimenter)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Instructions property
type OfpTableFeaturePropInstructions struct {
	// One of OFPTFPT_INSTRUCTIONS,
	// OFPTFPT_INSTRUCTIONS_MISS.
	Instructions         []*OfpInstruction `protobuf:"bytes,1,rep,name=instructions,proto3" json:"instructions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *OfpTableFeaturePropInstructions) Reset()         { *m = OfpTableFeaturePropInstructions{} }
func (m *OfpTableFeaturePropInstructions) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeaturePropInstructions) ProtoMessage()    {}
func (*OfpTableFeaturePropInstructions) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{50}
}
func (m *OfpTableFeaturePropInstructions) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpTableFeaturePropInstructions.Unmarshal(m, b)
}
func (m *OfpTableFeaturePropInstructions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpTableFeaturePropInstructions.Marshal(b, m, deterministic)
}
func (dst *OfpTableFeaturePropInstructions) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpTableFeaturePropInstructions.Merge(dst, src)
}
func (m *OfpTableFeaturePropInstructions) XXX_Size() int {
	return xxx_messageInfo_OfpTableFeaturePropInstructions.Size(m)
}
func (m *OfpTableFeaturePropInstructions) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpTableFeaturePropInstructions.DiscardUnknown(m)
}

var xxx_messageInfo_OfpTableFeaturePropInstructions proto.InternalMessageInfo

func (m *OfpTableFeaturePropInstructions) GetInstructions() []*OfpInstruction {
	if m != nil {
		return m.Instructions
	}
	return nil
}

// Next Tables property
type OfpTableFeaturePropNextTables struct {
	// One of OFPTFPT_NEXT_TABLES,
	// OFPTFPT_NEXT_TABLES_MISS.
	NextTableIds         []uint32 `protobuf:"varint,1,rep,packed,name=next_table_ids,json=nextTableIds,proto3" json:"next_table_ids,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpTableFeaturePropNextTables) Reset()         { *m = OfpTableFeaturePropNextTables{} }
func (m *OfpTableFeaturePropNextTables) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeaturePropNextTables) ProtoMessage()    {}
func (*OfpTableFeaturePropNextTables) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{51}
}
func (m *OfpTableFeaturePropNextTables) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpTableFeaturePropNextTables.Unmarshal(m, b)
}
func (m *OfpTableFeaturePropNextTables) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpTableFeaturePropNextTables.Marshal(b, m, deterministic)
}
func (dst *OfpTableFeaturePropNextTables) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpTableFeaturePropNextTables.Merge(dst, src)
}
func (m *OfpTableFeaturePropNextTables) XXX_Size() int {
	return xxx_messageInfo_OfpTableFeaturePropNextTables.Size(m)
}
func (m *OfpTableFeaturePropNextTables) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpTableFeaturePropNextTables.DiscardUnknown(m)
}

var xxx_messageInfo_OfpTableFeaturePropNextTables proto.InternalMessageInfo

func (m *OfpTableFeaturePropNextTables) GetNextTableIds() []uint32 {
	if m != nil {
		return m.NextTableIds
	}
	return nil
}

// Actions property
type OfpTableFeaturePropActions struct {
	// One of OFPTFPT_WRITE_ACTIONS,
	// OFPTFPT_WRITE_ACTIONS_MISS,
	// OFPTFPT_APPLY_ACTIONS,
	// OFPTFPT_APPLY_ACTIONS_MISS.
	Actions              []*OfpAction `protobuf:"bytes,1,rep,name=actions,proto3" json:"actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *OfpTableFeaturePropActions) Reset()         { *m = OfpTableFeaturePropActions{} }
func (m *OfpTableFeaturePropActions) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeaturePropActions) ProtoMessage()    {}
func (*OfpTableFeaturePropActions) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{52}
}
func (m *OfpTableFeaturePropActions) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpTableFeaturePropActions.Unmarshal(m, b)
}
func (m *OfpTableFeaturePropActions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpTableFeaturePropActions.Marshal(b, m, deterministic)
}
func (dst *OfpTableFeaturePropActions) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpTableFeaturePropActions.Merge(dst, src)
}
func (m *OfpTableFeaturePropActions) XXX_Size() int {
	return xxx_messageInfo_OfpTableFeaturePropActions.Size(m)
}
func (m *OfpTableFeaturePropActions) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpTableFeaturePropActions.DiscardUnknown(m)
}

var xxx_messageInfo_OfpTableFeaturePropActions proto.InternalMessageInfo

func (m *OfpTableFeaturePropActions) GetActions() []*OfpAction {
	if m != nil {
		return m.Actions
	}
	return nil
}

// Match, Wildcard or Set-Field property
type OfpTableFeaturePropOxm struct {
	// TODO is this a uint32???
	OxmIds               []uint32 `protobuf:"varint,3,rep,packed,name=oxm_ids,json=oxmIds,proto3" json:"oxm_ids,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpTableFeaturePropOxm) Reset()         { *m = OfpTableFeaturePropOxm{} }
func (m *OfpTableFeaturePropOxm) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeaturePropOxm) ProtoMessage()    {}
func (*OfpTableFeaturePropOxm) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{53}
}
func (m *OfpTableFeaturePropOxm) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpTableFeaturePropOxm.Unmarshal(m, b)
}
func (m *OfpTableFeaturePropOxm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpTableFeaturePropOxm.Marshal(b, m, deterministic)
}
func (dst *OfpTableFeaturePropOxm) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpTableFeaturePropOxm.Merge(dst, src)
}
func (m *OfpTableFeaturePropOxm) XXX_Size() int {
	return xxx_messageInfo_OfpTableFeaturePropOxm.Size(m)
}
func (m *OfpTableFeaturePropOxm) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpTableFeaturePropOxm.DiscardUnknown(m)
}

var xxx_messageInfo_OfpTableFeaturePropOxm proto.InternalMessageInfo

func (m *OfpTableFeaturePropOxm) GetOxmIds() []uint32 {
	if m != nil {
		return m.OxmIds
	}
	return nil
}

// Experimenter table feature property
type OfpTableFeaturePropExperimenter struct {
	// One of OFPTFPT_EXPERIMENTER,
	// OFPTFPT_EXPERIMENTER_MISS.
	Experimenter         uint32   `protobuf:"varint,2,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	ExpType              uint32   `protobuf:"varint,3,opt,name=exp_type,json=expType,proto3" json:"exp_type,omitempty"`
	ExperimenterData     []uint32 `protobuf:"varint,4,rep,packed,name=experimenter_data,json=experimenterData,proto3" json:"experimenter_data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpTableFeaturePropExperimenter) Reset()         { *m = OfpTableFeaturePropExperimenter{} }
func (m *OfpTableFeaturePropExperimenter) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeaturePropExperimenter) ProtoMessage()    {}
func (*OfpTableFeaturePropExperimenter) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{54}
}
func (m *OfpTableFeaturePropExperimenter) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpTableFeaturePropExperimenter.Unmarshal(m, b)
}
func (m *OfpTableFeaturePropExperimenter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpTableFeaturePropExperimenter.Marshal(b, m, deterministic)
}
func (dst *OfpTableFeaturePropExperimenter) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpTableFeaturePropExperimenter.Merge(dst, src)
}
func (m *OfpTableFeaturePropExperimenter) XXX_Size() int {
	return xxx_messageInfo_OfpTableFeaturePropExperimenter.Size(m)
}
func (m *OfpTableFeaturePropExperimenter) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpTableFeaturePropExperimenter.DiscardUnknown(m)
}

var xxx_messageInfo_OfpTableFeaturePropExperimenter proto.InternalMessageInfo

func (m *OfpTableFeaturePropExperimenter) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpTableFeaturePropExperimenter) GetExpType() uint32 {
	if m != nil {
		return m.ExpType
	}
	return 0
}

func (m *OfpTableFeaturePropExperimenter) GetExperimenterData() []uint32 {
	if m != nil {
		return m.ExperimenterData
	}
	return nil
}

// Body for ofp_multipart_request of type OFPMP_TABLE_FEATURES./
// Body of reply to OFPMP_TABLE_FEATURES request.
type OfpTableFeatures struct {
	TableId       uint32 `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	Name          string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	MetadataMatch uint64 `protobuf:"varint,3,opt,name=metadata_match,json=metadataMatch,proto3" json:"metadata_match,omitempty"`
	MetadataWrite uint64 `protobuf:"varint,4,opt,name=metadata_write,json=metadataWrite,proto3" json:"metadata_write,omitempty"`
	Config        uint32 `protobuf:"varint,5,opt,name=config,proto3" json:"config,omitempty"`
	MaxEntries    uint32 `protobuf:"varint,6,opt,name=max_entries,json=maxEntries,proto3" json:"max_entries,omitempty"`
	// Table Feature Property list
	Properties           []*OfpTableFeatureProperty `protobuf:"bytes,7,rep,name=properties,proto3" json:"properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *OfpTableFeatures) Reset()         { *m = OfpTableFeatures{} }
func (m *OfpTableFeatures) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeatures) ProtoMessage()    {}
func (*OfpTableFeatures) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{55}
}
func (m *OfpTableFeatures) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpTableFeatures.Unmarshal(m, b)
}
func (m *OfpTableFeatures) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpTableFeatures.Marshal(b, m, deterministic)
}
func (dst *OfpTableFeatures) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpTableFeatures.Merge(dst, src)
}
func (m *OfpTableFeatures) XXX_Size() int {
	return xxx_messageInfo_OfpTableFeatures.Size(m)
}
func (m *OfpTableFeatures) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpTableFeatures.DiscardUnknown(m)
}

var xxx_messageInfo_OfpTableFeatures proto.InternalMessageInfo

func (m *OfpTableFeatures) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpTableFeatures) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *OfpTableFeatures) GetMetadataMatch() uint64 {
	if m != nil {
		return m.MetadataMatch
	}
	return 0
}

func (m *OfpTableFeatures) GetMetadataWrite() uint64 {
	if m != nil {
		return m.MetadataWrite
	}
	return 0
}

func (m *OfpTableFeatures) GetConfig() uint32 {
	if m != nil {
		return m.Config
	}
	return 0
}

func (m *OfpTableFeatures) GetMaxEntries() uint32 {
	if m != nil {
		return m.MaxEntries
	}
	return 0
}

func (m *OfpTableFeatures) GetProperties() []*OfpTableFeatureProperty {
	if m != nil {
		return m.Properties
	}
	return nil
}

// Body of reply to OFPMP_TABLE request.
type OfpTableStats struct {
	TableId              uint32   `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	ActiveCount          uint32   `protobuf:"varint,2,opt,name=active_count,json=activeCount,proto3" json:"active_count,omitempty"`
	LookupCount          uint64   `protobuf:"varint,3,opt,name=lookup_count,json=lookupCount,proto3" json:"lookup_count,omitempty"`
	MatchedCount         uint64   `protobuf:"varint,4,opt,name=matched_count,json=matchedCount,proto3" json:"matched_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpTableStats) Reset()         { *m = OfpTableStats{} }
func (m *OfpTableStats) String() string { return proto.CompactTextString(m) }
func (*OfpTableStats) ProtoMessage()    {}
func (*OfpTableStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{56}
}
func (m *OfpTableStats) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpTableStats.Unmarshal(m, b)
}
func (m *OfpTableStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpTableStats.Marshal(b, m, deterministic)
}
func (dst *OfpTableStats) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpTableStats.Merge(dst, src)
}
func (m *OfpTableStats) XXX_Size() int {
	return xxx_messageInfo_OfpTableStats.Size(m)
}
func (m *OfpTableStats) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpTableStats.DiscardUnknown(m)
}

var xxx_messageInfo_OfpTableStats proto.InternalMessageInfo

func (m *OfpTableStats) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpTableStats) GetActiveCount() uint32 {
	if m != nil {
		return m.ActiveCount
	}
	return 0
}

func (m *OfpTableStats) GetLookupCount() uint64 {
	if m != nil {
		return m.LookupCount
	}
	return 0
}

func (m *OfpTableStats) GetMatchedCount() uint64 {
	if m != nil {
		return m.MatchedCount
	}
	return 0
}

// Body for ofp_multipart_request of type OFPMP_PORT.
type OfpPortStatsRequest struct {
	PortNo               uint32   `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpPortStatsRequest) Reset()         { *m = OfpPortStatsRequest{} }
func (m *OfpPortStatsRequest) String() string { return proto.CompactTextString(m) }
func (*OfpPortStatsRequest) ProtoMessage()    {}
func (*OfpPortStatsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{57}
}
func (m *OfpPortStatsRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpPortStatsRequest.Unmarshal(m, b)
}
func (m *OfpPortStatsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpPortStatsRequest.Marshal(b, m, deterministic)
}
func (dst *OfpPortStatsRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpPortStatsRequest.Merge(dst, src)
}
func (m *OfpPortStatsRequest) XXX_Size() int {
	return xxx_messageInfo_OfpPortStatsRequest.Size(m)
}
func (m *OfpPortStatsRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpPortStatsRequest.DiscardUnknown(m)
}

var xxx_messageInfo_OfpPortStatsRequest proto.InternalMessageInfo

func (m *OfpPortStatsRequest) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

// Body of reply to OFPMP_PORT request. If a counter is unsupported, set
// the field to all ones.
type OfpPortStats struct {
	PortNo               uint32   `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	RxPackets            uint64   `protobuf:"varint,2,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
	TxPackets            uint64   `protobuf:"varint,3,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
	RxBytes              uint64   `protobuf:"varint,4,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
	TxBytes              uint64   `protobuf:"varint,5,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
	RxDropped            uint64   `protobuf:"varint,6,opt,name=rx_dropped,json=rxDropped,proto3" json:"rx_dropped,omitempty"`
	TxDropped            uint64   `protobuf:"varint,7,opt,name=tx_dropped,json=txDropped,proto3" json:"tx_dropped,omitempty"`
	RxErrors             uint64   `protobuf:"varint,8,opt,name=rx_errors,json=rxErrors,proto3" json:"rx_errors,omitempty"`
	TxErrors             uint64   `protobuf:"varint,9,opt,name=tx_errors,json=txErrors,proto3" json:"tx_errors,omitempty"`
	RxFrameErr           uint64   `protobuf:"varint,10,opt,name=rx_frame_err,json=rxFrameErr,proto3" json:"rx_frame_err,omitempty"`
	RxOverErr            uint64   `protobuf:"varint,11,opt,name=rx_over_err,json=rxOverErr,proto3" json:"rx_over_err,omitempty"`
	RxCrcErr             uint64   `protobuf:"varint,12,opt,name=rx_crc_err,json=rxCrcErr,proto3" json:"rx_crc_err,omitempty"`
	Collisions           uint64   `protobuf:"varint,13,opt,name=collisions,proto3" json:"collisions,omitempty"`
	DurationSec          uint32   `protobuf:"varint,14,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	DurationNsec         uint32   `protobuf:"varint,15,opt,name=duration_nsec,json=durationNsec,proto3" json:"duration_nsec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpPortStats) Reset()         { *m = OfpPortStats{} }
func (m *OfpPortStats) String() string { return proto.CompactTextString(m) }
func (*OfpPortStats) ProtoMessage()    {}
func (*OfpPortStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{58}
}
func (m *OfpPortStats) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpPortStats.Unmarshal(m, b)
}
func (m *OfpPortStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpPortStats.Marshal(b, m, deterministic)
}
func (dst *OfpPortStats) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpPortStats.Merge(dst, src)
}
func (m *OfpPortStats) XXX_Size() int {
	return xxx_messageInfo_OfpPortStats.Size(m)
}
func (m *OfpPortStats) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpPortStats.DiscardUnknown(m)
}

var xxx_messageInfo_OfpPortStats proto.InternalMessageInfo

func (m *OfpPortStats) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *OfpPortStats) GetRxPackets() uint64 {
	if m != nil {
		return m.RxPackets
	}
	return 0
}

func (m *OfpPortStats) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *OfpPortStats) GetRxBytes() uint64 {
	if m != nil {
		return m.RxBytes
	}
	return 0
}

func (m *OfpPortStats) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *OfpPortStats) GetRxDropped() uint64 {
	if m != nil {
		return m.RxDropped
	}
	return 0
}

func (m *OfpPortStats) GetTxDropped() uint64 {
	if m != nil {
		return m.TxDropped
	}
	return 0
}

func (m *OfpPortStats) GetRxErrors() uint64 {
	if m != nil {
		return m.RxErrors
	}
	return 0
}

func (m *OfpPortStats) GetTxErrors() uint64 {
	if m != nil {
		return m.TxErrors
	}
	return 0
}

func (m *OfpPortStats) GetRxFrameErr() uint64 {
	if m != nil {
		return m.RxFrameErr
	}
	return 0
}

func (m *OfpPortStats) GetRxOverErr() uint64 {
	if m != nil {
		return m.RxOverErr
	}
	return 0
}

func (m *OfpPortStats) GetRxCrcErr() uint64 {
	if m != nil {
		return m.RxCrcErr
	}
	return 0
}

func (m *OfpPortStats) GetCollisions() uint64 {
	if m != nil {
		return m.Collisions
	}
	return 0
}

func (m *OfpPortStats) GetDurationSec() uint32 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *OfpPortStats) GetDurationNsec() uint32 {
	if m != nil {
		return m.DurationNsec
	}
	return 0
}

// Body of OFPMP_GROUP request.
type OfpGroupStatsRequest struct {
	GroupId              uint32   `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpGroupStatsRequest) Reset()         { *m = OfpGroupStatsRequest{} }
func (m *OfpGroupStatsRequest) String() string { return proto.CompactTextString(m) }
func (*OfpGroupStatsRequest) ProtoMessage()    {}
func (*OfpGroupStatsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{59}
}
func (m *OfpGroupStatsRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpGroupStatsRequest.Unmarshal(m, b)
}
func (m *OfpGroupStatsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpGroupStatsRequest.Marshal(b, m, deterministic)
}
func (dst *OfpGroupStatsRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpGroupStatsRequest.Merge(dst, src)
}
func (m *OfpGroupStatsRequest) XXX_Size() int {
	return xxx_messageInfo_OfpGroupStatsRequest.Size(m)
}
func (m *OfpGroupStatsRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpGroupStatsRequest.DiscardUnknown(m)
}

var xxx_messageInfo_OfpGroupStatsRequest proto.InternalMessageInfo

func (m *OfpGroupStatsRequest) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

// Used in group stats replies.
type OfpBucketCounter struct {
	PacketCount          uint64   `protobuf:"varint,1,opt,name=packet_count,json=packetCount,proto3" json:"packet_count,omitempty"`
	ByteCount            uint64   `protobuf:"varint,2,opt,name=byte_count,json=byteCount,proto3" json:"byte_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpBucketCounter) Reset()         { *m = OfpBucketCounter{} }
func (m *OfpBucketCounter) String() string { return proto.CompactTextString(m) }
func (*OfpBucketCounter) ProtoMessage()    {}
func (*OfpBucketCounter) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{60}
}
func (m *OfpBucketCounter) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpBucketCounter.Unmarshal(m, b)
}
func (m *OfpBucketCounter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpBucketCounter.Marshal(b, m, deterministic)
}
func (dst *OfpBucketCounter) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpBucketCounter.Merge(dst, src)
}
func (m *OfpBucketCounter) XXX_Size() int {
	return xxx_messageInfo_OfpBucketCounter.Size(m)
}
func (m *OfpBucketCounter) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpBucketCounter.DiscardUnknown(m)
}

var xxx_messageInfo_OfpBucketCounter proto.InternalMessageInfo

func (m *OfpBucketCounter) GetPacketCount() uint64 {
	if m != nil {
		return m.PacketCount
	}
	return 0
}

func (m *OfpBucketCounter) GetByteCount() uint64 {
	if m != nil {
		return m.ByteCount
	}
	return 0
}

// Body of reply to OFPMP_GROUP request.
type OfpGroupStats struct {
	GroupId              uint32              `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	RefCount             uint32              `protobuf:"varint,2,opt,name=ref_count,json=refCount,proto3" json:"ref_count,omitempty"`
	PacketCount          uint64              `protobuf:"varint,3,opt,name=packet_count,json=packetCount,proto3" json:"packet_count,omitempty"`
	ByteCount            uint64              `protobuf:"varint,4,opt,name=byte_count,json=byteCount,proto3" json:"byte_count,omitempty"`
	DurationSec          uint32              `protobuf:"varint,5,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	DurationNsec         uint32              `protobuf:"varint,6,opt,name=duration_nsec,json=durationNsec,proto3" json:"duration_nsec,omitempty"`
	BucketStats          []*OfpBucketCounter `protobuf:"bytes,7,rep,name=bucket_stats,json=bucketStats,proto3" json:"bucket_stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *OfpGroupStats) Reset()         { *m = OfpGroupStats{} }
func (m *OfpGroupStats) String() string { return proto.CompactTextString(m) }
func (*OfpGroupStats) ProtoMessage()    {}
func (*OfpGroupStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{61}
}
func (m *OfpGroupStats) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpGroupStats.Unmarshal(m, b)
}
func (m *OfpGroupStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpGroupStats.Marshal(b, m, deterministic)
}
func (dst *OfpGroupStats) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpGroupStats.Merge(dst, src)
}
func (m *OfpGroupStats) XXX_Size() int {
	return xxx_messageInfo_OfpGroupStats.Size(m)
}
func (m *OfpGroupStats) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpGroupStats.DiscardUnknown(m)
}

var xxx_messageInfo_OfpGroupStats proto.InternalMessageInfo

func (m *OfpGroupStats) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

func (m *OfpGroupStats) GetRefCount() uint32 {
	if m != nil {
		return m.RefCount
	}
	return 0
}

func (m *OfpGroupStats) GetPacketCount() uint64 {
	if m != nil {
		return m.PacketCount
	}
	return 0
}

func (m *OfpGroupStats) GetByteCount() uint64 {
	if m != nil {
		return m.ByteCount
	}
	return 0
}

func (m *OfpGroupStats) GetDurationSec() uint32 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *OfpGroupStats) GetDurationNsec() uint32 {
	if m != nil {
		return m.DurationNsec
	}
	return 0
}

func (m *OfpGroupStats) GetBucketStats() []*OfpBucketCounter {
	if m != nil {
		return m.BucketStats
	}
	return nil
}

// Body of reply to OFPMP_GROUP_DESC request.
type OfpGroupDesc struct {
	Type                 OfpGroupType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpGroupType" json:"type,omitempty"`
	GroupId              uint32       `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	Buckets              []*OfpBucket `protobuf:"bytes,3,rep,name=buckets,proto3" json:"buckets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *OfpGroupDesc) Reset()         { *m = OfpGroupDesc{} }
func (m *OfpGroupDesc) String() string { return proto.CompactTextString(m) }
func (*OfpGroupDesc) ProtoMessage()    {}
func (*OfpGroupDesc) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{62}
}
func (m *OfpGroupDesc) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpGroupDesc.Unmarshal(m, b)
}
func (m *OfpGroupDesc) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpGroupDesc.Marshal(b, m, deterministic)
}
func (dst *OfpGroupDesc) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpGroupDesc.Merge(dst, src)
}
func (m *OfpGroupDesc) XXX_Size() int {
	return xxx_messageInfo_OfpGroupDesc.Size(m)
}
func (m *OfpGroupDesc) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpGroupDesc.DiscardUnknown(m)
}

var xxx_messageInfo_OfpGroupDesc proto.InternalMessageInfo

func (m *OfpGroupDesc) GetType() OfpGroupType {
	if m != nil {
		return m.Type
	}
	return OfpGroupType_OFPGT_ALL
}

func (m *OfpGroupDesc) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

func (m *OfpGroupDesc) GetBuckets() []*OfpBucket {
	if m != nil {
		return m.Buckets
	}
	return nil
}

type OfpGroupEntry struct {
	Desc                 *OfpGroupDesc  `protobuf:"bytes,1,opt,name=desc,proto3" json:"desc,omitempty"`
	Stats                *OfpGroupStats `protobuf:"bytes,2,opt,name=stats,proto3" json:"stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *OfpGroupEntry) Reset()         { *m = OfpGroupEntry{} }
func (m *OfpGroupEntry) String() string { return proto.CompactTextString(m) }
func (*OfpGroupEntry) ProtoMessage()    {}
func (*OfpGroupEntry) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{63}
}
func (m *OfpGroupEntry) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpGroupEntry.Unmarshal(m, b)
}
func (m *OfpGroupEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpGroupEntry.Marshal(b, m, deterministic)
}
func (dst *OfpGroupEntry) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpGroupEntry.Merge(dst, src)
}
func (m *OfpGroupEntry) XXX_Size() int {
	return xxx_messageInfo_OfpGroupEntry.Size(m)
}
func (m *OfpGroupEntry) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpGroupEntry.DiscardUnknown(m)
}

var xxx_messageInfo_OfpGroupEntry proto.InternalMessageInfo

func (m *OfpGroupEntry) GetDesc() *OfpGroupDesc {
	if m != nil {
		return m.Desc
	}
	return nil
}

func (m *OfpGroupEntry) GetStats() *OfpGroupStats {
	if m != nil {
		return m.Stats
	}
	return nil
}

// Body of reply to OFPMP_GROUP_FEATURES request. Group features.
type OfpGroupFeatures struct {
	Types                uint32   `protobuf:"varint,1,opt,name=types,proto3" json:"types,omitempty"`
	Capabilities         uint32   `protobuf:"varint,2,opt,name=capabilities,proto3" json:"capabilities,omitempty"`
	MaxGroups            []uint32 `protobuf:"varint,3,rep,packed,name=max_groups,json=maxGroups,proto3" json:"max_groups,omitempty"`
	Actions              []uint32 `protobuf:"varint,4,rep,packed,name=actions,proto3" json:"actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpGroupFeatures) Reset()         { *m = OfpGroupFeatures{} }
func (m *OfpGroupFeatures) String() string { return proto.CompactTextString(m) }
func (*OfpGroupFeatures) ProtoMessage()    {}
func (*OfpGroupFeatures) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{64}
}
func (m *OfpGroupFeatures) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpGroupFeatures.Unmarshal(m, b)
}
func (m *OfpGroupFeatures) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpGroupFeatures.Marshal(b, m, deterministic)
}
func (dst *OfpGroupFeatures) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpGroupFeatures.Merge(dst, src)
}
func (m *OfpGroupFeatures) XXX_Size() int {
	return xxx_messageInfo_OfpGroupFeatures.Size(m)
}
func (m *OfpGroupFeatures) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpGroupFeatures.DiscardUnknown(m)
}

var xxx_messageInfo_OfpGroupFeatures proto.InternalMessageInfo

func (m *OfpGroupFeatures) GetTypes() uint32 {
	if m != nil {
		return m.Types
	}
	return 0
}

func (m *OfpGroupFeatures) GetCapabilities() uint32 {
	if m != nil {
		return m.Capabilities
	}
	return 0
}

func (m *OfpGroupFeatures) GetMaxGroups() []uint32 {
	if m != nil {
		return m.MaxGroups
	}
	return nil
}

func (m *OfpGroupFeatures) GetActions() []uint32 {
	if m != nil {
		return m.Actions
	}
	return nil
}

// Body of OFPMP_METER and OFPMP_METER_CONFIG requests.
type OfpMeterMultipartRequest struct {
	MeterId              uint32   `protobuf:"varint,1,opt,name=meter_id,json=meterId,proto3" json:"meter_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpMeterMultipartRequest) Reset()         { *m = OfpMeterMultipartRequest{} }
func (m *OfpMeterMultipartRequest) String() string { return proto.CompactTextString(m) }
func (*OfpMeterMultipartRequest) ProtoMessage()    {}
func (*OfpMeterMultipartRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{65}
}
func (m *OfpMeterMultipartRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMeterMultipartRequest.Unmarshal(m, b)
}
func (m *OfpMeterMultipartRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMeterMultipartRequest.Marshal(b, m, deterministic)
}
func (dst *OfpMeterMultipartRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMeterMultipartRequest.Merge(dst, src)
}
func (m *OfpMeterMultipartRequest) XXX_Size() int {
	return xxx_messageInfo_OfpMeterMultipartRequest.Size(m)
}
func (m *OfpMeterMultipartRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMeterMultipartRequest.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMeterMultipartRequest proto.InternalMessageInfo

func (m *OfpMeterMultipartRequest) GetMeterId() uint32 {
	if m != nil {
		return m.MeterId
	}
	return 0
}

// Statistics for each meter band
type OfpMeterBandStats struct {
	PacketBandCount      uint64   `protobuf:"varint,1,opt,name=packet_band_count,json=packetBandCount,proto3" json:"packet_band_count,omitempty"`
	ByteBandCount        uint64   `protobuf:"varint,2,opt,name=byte_band_count,json=byteBandCount,proto3" json:"byte_band_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpMeterBandStats) Reset()         { *m = OfpMeterBandStats{} }
func (m *OfpMeterBandStats) String() string { return proto.CompactTextString(m) }
func (*OfpMeterBandStats) ProtoMessage()    {}
func (*OfpMeterBandStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{66}
}
func (m *OfpMeterBandStats) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMeterBandStats.Unmarshal(m, b)
}
func (m *OfpMeterBandStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMeterBandStats.Marshal(b, m, deterministic)
}
func (dst *OfpMeterBandStats) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMeterBandStats.Merge(dst, src)
}
func (m *OfpMeterBandStats) XXX_Size() int {
	return xxx_messageInfo_OfpMeterBandStats.Size(m)
}
func (m *OfpMeterBandStats) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMeterBandStats.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMeterBandStats proto.InternalMessageInfo

func (m *OfpMeterBandStats) GetPacketBandCount() uint64 {
	if m != nil {
		return m.PacketBandCount
	}
	return 0
}

func (m *OfpMeterBandStats) GetByteBandCount() uint64 {
	if m != nil {
		return m.ByteBandCount
	}
	return 0
}

// Body of reply to OFPMP_METER request. Meter statistics.
type OfpMeterStats struct {
	MeterId              uint32               `protobuf:"varint,1,opt,name=meter_id,json=meterId,proto3" json:"meter_id,omitempty"`
	FlowCount            uint32               `protobuf:"varint,2,opt,name=flow_count,json=flowCount,proto3" json:"flow_count,omitempty"`
	PacketInCount        uint64               `protobuf:"varint,3,opt,name=packet_in_count,json=packetInCount,proto3" json:"packet_in_count,omitempty"`
	ByteInCount          uint64               `protobuf:"varint,4,opt,name=byte_in_count,json=byteInCount,proto3" json:"byte_in_count,omitempty"`
	DurationSec          uint32               `protobuf:"varint,5,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	DurationNsec         uint32               `protobuf:"varint,6,opt,name=duration_nsec,json=durationNsec,proto3" json:"duration_nsec,omitempty"`
	BandStats            []*OfpMeterBandStats `protobuf:"bytes,7,rep,name=band_stats,json=bandStats,proto3" json:"band_stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *OfpMeterStats) Reset()         { *m = OfpMeterStats{} }
func (m *OfpMeterStats) String() string { return proto.CompactTextString(m) }
func (*OfpMeterStats) ProtoMessage()    {}
func (*OfpMeterStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{67}
}
func (m *OfpMeterStats) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMeterStats.Unmarshal(m, b)
}
func (m *OfpMeterStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMeterStats.Marshal(b, m, deterministic)
}
func (dst *OfpMeterStats) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMeterStats.Merge(dst, src)
}
func (m *OfpMeterStats) XXX_Size() int {
	return xxx_messageInfo_OfpMeterStats.Size(m)
}
func (m *OfpMeterStats) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMeterStats.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMeterStats proto.InternalMessageInfo

func (m *OfpMeterStats) GetMeterId() uint32 {
	if m != nil {
		return m.MeterId
	}
	return 0
}

func (m *OfpMeterStats) GetFlowCount() uint32 {
	if m != nil {
		return m.FlowCount
	}
	return 0
}

func (m *OfpMeterStats) GetPacketInCount() uint64 {
	if m != nil {
		return m.PacketInCount
	}
	return 0
}

func (m *OfpMeterStats) GetByteInCount() uint64 {
	if m != nil {
		return m.ByteInCount
	}
	return 0
}

func (m *OfpMeterStats) GetDurationSec() uint32 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *OfpMeterStats) GetDurationNsec() uint32 {
	if m != nil {
		return m.DurationNsec
	}
	return 0
}

func (m *OfpMeterStats) GetBandStats() []*OfpMeterBandStats {
	if m != nil {
		return m.BandStats
	}
	return nil
}

// Body of reply to OFPMP_METER_CONFIG request. Meter configuration.
type OfpMeterConfig struct {
	Flags                uint32                `protobuf:"varint,1,opt,name=flags,proto3" json:"flags,omitempty"`
	MeterId              uint32                `protobuf:"varint,2,opt,name=meter_id,json=meterId,proto3" json:"meter_id,omitempty"`
	Bands                []*OfpMeterBandHeader `protobuf:"bytes,3,rep,name=bands,proto3" json:"bands,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *OfpMeterConfig) Reset()         { *m = OfpMeterConfig{} }
func (m *OfpMeterConfig) String() string { return proto.CompactTextString(m) }
func (*OfpMeterConfig) ProtoMessage()    {}
func (*OfpMeterConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{68}
}
func (m *OfpMeterConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMeterConfig.Unmarshal(m, b)
}
func (m *OfpMeterConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMeterConfig.Marshal(b, m, deterministic)
}
func (dst *OfpMeterConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMeterConfig.Merge(dst, src)
}
func (m *OfpMeterConfig) XXX_Size() int {
	return xxx_messageInfo_OfpMeterConfig.Size(m)
}
func (m *OfpMeterConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMeterConfig.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMeterConfig proto.InternalMessageInfo

func (m *OfpMeterConfig) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpMeterConfig) GetMeterId() uint32 {
	if m != nil {
		return m.MeterId
	}
	return 0
}

func (m *OfpMeterConfig) GetBands() []*OfpMeterBandHeader {
	if m != nil {
		return m.Bands
	}
	return nil
}

// Body of reply to OFPMP_METER_FEATURES request. Meter features.
type OfpMeterFeatures struct {
	MaxMeter             uint32   `protobuf:"varint,1,opt,name=max_meter,json=maxMeter,proto3" json:"max_meter,omitempty"`
	BandTypes            uint32   `protobuf:"varint,2,opt,name=band_types,json=bandTypes,proto3" json:"band_types,omitempty"`
	Capabilities         uint32   `protobuf:"varint,3,opt,name=capabilities,proto3" json:"capabilities,omitempty"`
	MaxBands             uint32   `protobuf:"varint,4,opt,name=max_bands,json=maxBands,proto3" json:"max_bands,omitempty"`
	MaxColor             uint32   `protobuf:"varint,5,opt,name=max_color,json=maxColor,proto3" json:"max_color,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpMeterFeatures) Reset()         { *m = OfpMeterFeatures{} }
func (m *OfpMeterFeatures) String() string { return proto.CompactTextString(m) }
func (*OfpMeterFeatures) ProtoMessage()    {}
func (*OfpMeterFeatures) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{69}
}
func (m *OfpMeterFeatures) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpMeterFeatures.Unmarshal(m, b)
}
func (m *OfpMeterFeatures) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpMeterFeatures.Marshal(b, m, deterministic)
}
func (dst *OfpMeterFeatures) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpMeterFeatures.Merge(dst, src)
}
func (m *OfpMeterFeatures) XXX_Size() int {
	return xxx_messageInfo_OfpMeterFeatures.Size(m)
}
func (m *OfpMeterFeatures) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpMeterFeatures.DiscardUnknown(m)
}

var xxx_messageInfo_OfpMeterFeatures proto.InternalMessageInfo

func (m *OfpMeterFeatures) GetMaxMeter() uint32 {
	if m != nil {
		return m.MaxMeter
	}
	return 0
}

func (m *OfpMeterFeatures) GetBandTypes() uint32 {
	if m != nil {
		return m.BandTypes
	}
	return 0
}

func (m *OfpMeterFeatures) GetCapabilities() uint32 {
	if m != nil {
		return m.Capabilities
	}
	return 0
}

func (m *OfpMeterFeatures) GetMaxBands() uint32 {
	if m != nil {
		return m.MaxBands
	}
	return 0
}

func (m *OfpMeterFeatures) GetMaxColor() uint32 {
	if m != nil {
		return m.MaxColor
	}
	return 0
}

// Body for ofp_multipart_request/reply of type OFPMP_EXPERIMENTER.
type OfpExperimenterMultipartHeader struct {
	Experimenter         uint32   `protobuf:"varint,1,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	ExpType              uint32   `protobuf:"varint,2,opt,name=exp_type,json=expType,proto3" json:"exp_type,omitempty"`
	Data                 []byte   `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpExperimenterMultipartHeader) Reset()         { *m = OfpExperimenterMultipartHeader{} }
func (m *OfpExperimenterMultipartHeader) String() string { return proto.CompactTextString(m) }
func (*OfpExperimenterMultipartHeader) ProtoMessage()    {}
func (*OfpExperimenterMultipartHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{70}
}
func (m *OfpExperimenterMultipartHeader) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpExperimenterMultipartHeader.Unmarshal(m, b)
}
func (m *OfpExperimenterMultipartHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpExperimenterMultipartHeader.Marshal(b, m, deterministic)
}
func (dst *OfpExperimenterMultipartHeader) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpExperimenterMultipartHeader.Merge(dst, src)
}
func (m *OfpExperimenterMultipartHeader) XXX_Size() int {
	return xxx_messageInfo_OfpExperimenterMultipartHeader.Size(m)
}
func (m *OfpExperimenterMultipartHeader) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpExperimenterMultipartHeader.DiscardUnknown(m)
}

var xxx_messageInfo_OfpExperimenterMultipartHeader proto.InternalMessageInfo

func (m *OfpExperimenterMultipartHeader) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpExperimenterMultipartHeader) GetExpType() uint32 {
	if m != nil {
		return m.ExpType
	}
	return 0
}

func (m *OfpExperimenterMultipartHeader) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Experimenter extension.
type OfpExperimenterHeader struct {
	// ofp_header header;  /* Type OFPT_EXPERIMENTER. */
	Experimenter         uint32   `protobuf:"varint,1,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	ExpType              uint32   `protobuf:"varint,2,opt,name=exp_type,json=expType,proto3" json:"exp_type,omitempty"`
	Data                 []byte   `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpExperimenterHeader) Reset()         { *m = OfpExperimenterHeader{} }
func (m *OfpExperimenterHeader) String() string { return proto.CompactTextString(m) }
func (*OfpExperimenterHeader) ProtoMessage()    {}
func (*OfpExperimenterHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{71}
}
func (m *OfpExperimenterHeader) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpExperimenterHeader.Unmarshal(m, b)
}
func (m *OfpExperimenterHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpExperimenterHeader.Marshal(b, m, deterministic)
}
func (dst *OfpExperimenterHeader) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpExperimenterHeader.Merge(dst, src)
}
func (m *OfpExperimenterHeader) XXX_Size() int {
	return xxx_messageInfo_OfpExperimenterHeader.Size(m)
}
func (m *OfpExperimenterHeader) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpExperimenterHeader.DiscardUnknown(m)
}

var xxx_messageInfo_OfpExperimenterHeader proto.InternalMessageInfo

func (m *OfpExperimenterHeader) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpExperimenterHeader) GetExpType() uint32 {
	if m != nil {
		return m.ExpType
	}
	return 0
}

func (m *OfpExperimenterHeader) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Common description for a queue.
type OfpQueuePropHeader struct {
	Property             uint32   `protobuf:"varint,1,opt,name=property,proto3" json:"property,omitempty"`
	Len                  uint32   `protobuf:"varint,2,opt,name=len,proto3" json:"len,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpQueuePropHeader) Reset()         { *m = OfpQueuePropHeader{} }
func (m *OfpQueuePropHeader) String() string { return proto.CompactTextString(m) }
func (*OfpQueuePropHeader) ProtoMessage()    {}
func (*OfpQueuePropHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{72}
}
func (m *OfpQueuePropHeader) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpQueuePropHeader.Unmarshal(m, b)
}
func (m *OfpQueuePropHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpQueuePropHeader.Marshal(b, m, deterministic)
}
func (dst *OfpQueuePropHeader) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpQueuePropHeader.Merge(dst, src)
}
func (m *OfpQueuePropHeader) XXX_Size() int {
	return xxx_messageInfo_OfpQueuePropHeader.Size(m)
}
func (m *OfpQueuePropHeader) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpQueuePropHeader.DiscardUnknown(m)
}

var xxx_messageInfo_OfpQueuePropHeader proto.InternalMessageInfo

func (m *OfpQueuePropHeader) GetProperty() uint32 {
	if m != nil {
		return m.Property
	}
	return 0
}

func (m *OfpQueuePropHeader) GetLen() uint32 {
	if m != nil {
		return m.Len
	}
	return 0
}

// Min-Rate queue property description.
type OfpQueuePropMinRate struct {
	PropHeader           *OfpQueuePropHeader `protobuf:"bytes,1,opt,name=prop_header,json=propHeader,proto3" json:"prop_header,omitempty"`
	Rate                 uint32              `protobuf:"varint,2,opt,name=rate,proto3" json:"rate,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *OfpQueuePropMinRate) Reset()         { *m = OfpQueuePropMinRate{} }
func (m *OfpQueuePropMinRate) String() string { return proto.CompactTextString(m) }
func (*OfpQueuePropMinRate) ProtoMessage()    {}
func (*OfpQueuePropMinRate) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{73}
}
func (m *OfpQueuePropMinRate) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpQueuePropMinRate.Unmarshal(m, b)
}
func (m *OfpQueuePropMinRate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpQueuePropMinRate.Marshal(b, m, deterministic)
}
func (dst *OfpQueuePropMinRate) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpQueuePropMinRate.Merge(dst, src)
}
func (m *OfpQueuePropMinRate) XXX_Size() int {
	return xxx_messageInfo_OfpQueuePropMinRate.Size(m)
}
func (m *OfpQueuePropMinRate) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpQueuePropMinRate.DiscardUnknown(m)
}

var xxx_messageInfo_OfpQueuePropMinRate proto.InternalMessageInfo

func (m *OfpQueuePropMinRate) GetPropHeader() *OfpQueuePropHeader {
	if m != nil {
		return m.PropHeader
	}
	return nil
}

func (m *OfpQueuePropMinRate) GetRate() uint32 {
	if m != nil {
		return m.Rate
	}
	return 0
}

// Max-Rate queue property description.
type OfpQueuePropMaxRate struct {
	PropHeader           *OfpQueuePropHeader `protobuf:"bytes,1,opt,name=prop_header,json=propHeader,proto3" json:"prop_header,omitempty"`
	Rate                 uint32              `protobuf:"varint,2,opt,name=rate,proto3" json:"rate,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *OfpQueuePropMaxRate) Reset()         { *m = OfpQueuePropMaxRate{} }
func (m *OfpQueuePropMaxRate) String() string { return proto.CompactTextString(m) }
func (*OfpQueuePropMaxRate) ProtoMessage()    {}
func (*OfpQueuePropMaxRate) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{74}
}
func (m *OfpQueuePropMaxRate) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpQueuePropMaxRate.Unmarshal(m, b)
}
func (m *OfpQueuePropMaxRate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpQueuePropMaxRate.Marshal(b, m, deterministic)
}
func (dst *OfpQueuePropMaxRate) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpQueuePropMaxRate.Merge(dst, src)
}
func (m *OfpQueuePropMaxRate) XXX_Size() int {
	return xxx_messageInfo_OfpQueuePropMaxRate.Size(m)
}
func (m *OfpQueuePropMaxRate) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpQueuePropMaxRate.DiscardUnknown(m)
}

var xxx_messageInfo_OfpQueuePropMaxRate proto.InternalMessageInfo

func (m *OfpQueuePropMaxRate) GetPropHeader() *OfpQueuePropHeader {
	if m != nil {
		return m.PropHeader
	}
	return nil
}

func (m *OfpQueuePropMaxRate) GetRate() uint32 {
	if m != nil {
		return m.Rate
	}
	return 0
}

// Experimenter queue property description.
type OfpQueuePropExperimenter struct {
	PropHeader           *OfpQueuePropHeader `protobuf:"bytes,1,opt,name=prop_header,json=propHeader,proto3" json:"prop_header,omitempty"`
	Experimenter         uint32              `protobuf:"varint,2,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	Data                 []byte              `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *OfpQueuePropExperimenter) Reset()         { *m = OfpQueuePropExperimenter{} }
func (m *OfpQueuePropExperimenter) String() string { return proto.CompactTextString(m) }
func (*OfpQueuePropExperimenter) ProtoMessage()    {}
func (*OfpQueuePropExperimenter) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{75}
}
func (m *OfpQueuePropExperimenter) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpQueuePropExperimenter.Unmarshal(m, b)
}
func (m *OfpQueuePropExperimenter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpQueuePropExperimenter.Marshal(b, m, deterministic)
}
func (dst *OfpQueuePropExperimenter) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpQueuePropExperimenter.Merge(dst, src)
}
func (m *OfpQueuePropExperimenter) XXX_Size() int {
	return xxx_messageInfo_OfpQueuePropExperimenter.Size(m)
}
func (m *OfpQueuePropExperimenter) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpQueuePropExperimenter.DiscardUnknown(m)
}

var xxx_messageInfo_OfpQueuePropExperimenter proto.InternalMessageInfo

func (m *OfpQueuePropExperimenter) GetPropHeader() *OfpQueuePropHeader {
	if m != nil {
		return m.PropHeader
	}
	return nil
}

func (m *OfpQueuePropExperimenter) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpQueuePropExperimenter) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Full description for a queue.
type OfpPacketQueue struct {
	QueueId              uint32                `protobuf:"varint,1,opt,name=queue_id,json=queueId,proto3" json:"queue_id,omitempty"`
	Port                 uint32                `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
	Properties           []*OfpQueuePropHeader `protobuf:"bytes,4,rep,name=properties,proto3" json:"properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *OfpPacketQueue) Reset()         { *m = OfpPacketQueue{} }
func (m *OfpPacketQueue) String() string { return proto.CompactTextString(m) }
func (*OfpPacketQueue) ProtoMessage()    {}
func (*OfpPacketQueue) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{76}
}
func (m *OfpPacketQueue) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpPacketQueue.Unmarshal(m, b)
}
func (m *OfpPacketQueue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpPacketQueue.Marshal(b, m, deterministic)
}
func (dst *OfpPacketQueue) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpPacketQueue.Merge(dst, src)
}
func (m *OfpPacketQueue) XXX_Size() int {
	return xxx_messageInfo_OfpPacketQueue.Size(m)
}
func (m *OfpPacketQueue) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpPacketQueue.DiscardUnknown(m)
}

var xxx_messageInfo_OfpPacketQueue proto.InternalMessageInfo

func (m *OfpPacketQueue) GetQueueId() uint32 {
	if m != nil {
		return m.QueueId
	}
	return 0
}

func (m *OfpPacketQueue) GetPort() uint32 {
	if m != nil {
		return m.Port
	}
	return 0
}

func (m *OfpPacketQueue) GetProperties() []*OfpQueuePropHeader {
	if m != nil {
		return m.Properties
	}
	return nil
}

// Query for port queue configuration.
type OfpQueueGetConfigRequest struct {
	// ofp_header header;
	Port                 uint32   `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpQueueGetConfigRequest) Reset()         { *m = OfpQueueGetConfigRequest{} }
func (m *OfpQueueGetConfigRequest) String() string { return proto.CompactTextString(m) }
func (*OfpQueueGetConfigRequest) ProtoMessage()    {}
func (*OfpQueueGetConfigRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{77}
}
func (m *OfpQueueGetConfigRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpQueueGetConfigRequest.Unmarshal(m, b)
}
func (m *OfpQueueGetConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpQueueGetConfigRequest.Marshal(b, m, deterministic)
}
func (dst *OfpQueueGetConfigRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpQueueGetConfigRequest.Merge(dst, src)
}
func (m *OfpQueueGetConfigRequest) XXX_Size() int {
	return xxx_messageInfo_OfpQueueGetConfigRequest.Size(m)
}
func (m *OfpQueueGetConfigRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpQueueGetConfigRequest.DiscardUnknown(m)
}

var xxx_messageInfo_OfpQueueGetConfigRequest proto.InternalMessageInfo

func (m *OfpQueueGetConfigRequest) GetPort() uint32 {
	if m != nil {
		return m.Port
	}
	return 0
}

// Queue configuration for a given port.
type OfpQueueGetConfigReply struct {
	// ofp_header header;
	Port                 uint32            `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"`
	Queues               []*OfpPacketQueue `protobuf:"bytes,2,rep,name=queues,proto3" json:"queues,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *OfpQueueGetConfigReply) Reset()         { *m = OfpQueueGetConfigReply{} }
func (m *OfpQueueGetConfigReply) String() string { return proto.CompactTextString(m) }
func (*OfpQueueGetConfigReply) ProtoMessage()    {}
func (*OfpQueueGetConfigReply) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{78}
}
func (m *OfpQueueGetConfigReply) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpQueueGetConfigReply.Unmarshal(m, b)
}
func (m *OfpQueueGetConfigReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpQueueGetConfigReply.Marshal(b, m, deterministic)
}
func (dst *OfpQueueGetConfigReply) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpQueueGetConfigReply.Merge(dst, src)
}
func (m *OfpQueueGetConfigReply) XXX_Size() int {
	return xxx_messageInfo_OfpQueueGetConfigReply.Size(m)
}
func (m *OfpQueueGetConfigReply) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpQueueGetConfigReply.DiscardUnknown(m)
}

var xxx_messageInfo_OfpQueueGetConfigReply proto.InternalMessageInfo

func (m *OfpQueueGetConfigReply) GetPort() uint32 {
	if m != nil {
		return m.Port
	}
	return 0
}

func (m *OfpQueueGetConfigReply) GetQueues() []*OfpPacketQueue {
	if m != nil {
		return m.Queues
	}
	return nil
}

// OFPAT_SET_QUEUE action struct: send packets to given queue on port.
type OfpActionSetQueue struct {
	Type                 uint32   `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"`
	QueueId              uint32   `protobuf:"varint,3,opt,name=queue_id,json=queueId,proto3" json:"queue_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionSetQueue) Reset()         { *m = OfpActionSetQueue{} }
func (m *OfpActionSetQueue) String() string { return proto.CompactTextString(m) }
func (*OfpActionSetQueue) ProtoMessage()    {}
func (*OfpActionSetQueue) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{79}
}
func (m *OfpActionSetQueue) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpActionSetQueue.Unmarshal(m, b)
}
func (m *OfpActionSetQueue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpActionSetQueue.Marshal(b, m, deterministic)
}
func (dst *OfpActionSetQueue) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpActionSetQueue.Merge(dst, src)
}
func (m *OfpActionSetQueue) XXX_Size() int {
	return xxx_messageInfo_OfpActionSetQueue.Size(m)
}
func (m *OfpActionSetQueue) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpActionSetQueue.DiscardUnknown(m)
}

var xxx_messageInfo_OfpActionSetQueue proto.InternalMessageInfo

func (m *OfpActionSetQueue) GetType() uint32 {
	if m != nil {
		return m.Type
	}
	return 0
}

func (m *OfpActionSetQueue) GetQueueId() uint32 {
	if m != nil {
		return m.QueueId
	}
	return 0
}

type OfpQueueStatsRequest struct {
	PortNo               uint32   `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	QueueId              uint32   `protobuf:"varint,2,opt,name=queue_id,json=queueId,proto3" json:"queue_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpQueueStatsRequest) Reset()         { *m = OfpQueueStatsRequest{} }
func (m *OfpQueueStatsRequest) String() string { return proto.CompactTextString(m) }
func (*OfpQueueStatsRequest) ProtoMessage()    {}
func (*OfpQueueStatsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{80}
}
func (m *OfpQueueStatsRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpQueueStatsRequest.Unmarshal(m, b)
}
func (m *OfpQueueStatsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpQueueStatsRequest.Marshal(b, m, deterministic)
}
func (dst *OfpQueueStatsRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpQueueStatsRequest.Merge(dst, src)
}
func (m *OfpQueueStatsRequest) XXX_Size() int {
	return xxx_messageInfo_OfpQueueStatsRequest.Size(m)
}
func (m *OfpQueueStatsRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpQueueStatsRequest.DiscardUnknown(m)
}

var xxx_messageInfo_OfpQueueStatsRequest proto.InternalMessageInfo

func (m *OfpQueueStatsRequest) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *OfpQueueStatsRequest) GetQueueId() uint32 {
	if m != nil {
		return m.QueueId
	}
	return 0
}

type OfpQueueStats struct {
	PortNo               uint32   `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	QueueId              uint32   `protobuf:"varint,2,opt,name=queue_id,json=queueId,proto3" json:"queue_id,omitempty"`
	TxBytes              uint64   `protobuf:"varint,3,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
	TxPackets            uint64   `protobuf:"varint,4,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
	TxErrors             uint64   `protobuf:"varint,5,opt,name=tx_errors,json=txErrors,proto3" json:"tx_errors,omitempty"`
	DurationSec          uint32   `protobuf:"varint,6,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	DurationNsec         uint32   `protobuf:"varint,7,opt,name=duration_nsec,json=durationNsec,proto3" json:"duration_nsec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpQueueStats) Reset()         { *m = OfpQueueStats{} }
func (m *OfpQueueStats) String() string { return proto.CompactTextString(m) }
func (*OfpQueueStats) ProtoMessage()    {}
func (*OfpQueueStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{81}
}
func (m *OfpQueueStats) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpQueueStats.Unmarshal(m, b)
}
func (m *OfpQueueStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpQueueStats.Marshal(b, m, deterministic)
}
func (dst *OfpQueueStats) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpQueueStats.Merge(dst, src)
}
func (m *OfpQueueStats) XXX_Size() int {
	return xxx_messageInfo_OfpQueueStats.Size(m)
}
func (m *OfpQueueStats) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpQueueStats.DiscardUnknown(m)
}

var xxx_messageInfo_OfpQueueStats proto.InternalMessageInfo

func (m *OfpQueueStats) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *OfpQueueStats) GetQueueId() uint32 {
	if m != nil {
		return m.QueueId
	}
	return 0
}

func (m *OfpQueueStats) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *OfpQueueStats) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *OfpQueueStats) GetTxErrors() uint64 {
	if m != nil {
		return m.TxErrors
	}
	return 0
}

func (m *OfpQueueStats) GetDurationSec() uint32 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *OfpQueueStats) GetDurationNsec() uint32 {
	if m != nil {
		return m.DurationNsec
	}
	return 0
}

// Role request and reply message.
type OfpRoleRequest struct {
	// ofp_header header;        /* Type OFPT_ROLE_REQUEST/OFPT_ROLE_REPLY. */
	Role                 OfpControllerRole `protobuf:"varint,1,opt,name=role,proto3,enum=openflow_13.OfpControllerRole" json:"role,omitempty"`
	GenerationId         uint64            `protobuf:"varint,2,opt,name=generation_id,json=generationId,proto3" json:"generation_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *OfpRoleRequest) Reset()         { *m = OfpRoleRequest{} }
func (m *OfpRoleRequest) String() string { return proto.CompactTextString(m) }
func (*OfpRoleRequest) ProtoMessage()    {}
func (*OfpRoleRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{82}
}
func (m *OfpRoleRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpRoleRequest.Unmarshal(m, b)
}
func (m *OfpRoleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpRoleRequest.Marshal(b, m, deterministic)
}
func (dst *OfpRoleRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpRoleRequest.Merge(dst, src)
}
func (m *OfpRoleRequest) XXX_Size() int {
	return xxx_messageInfo_OfpRoleRequest.Size(m)
}
func (m *OfpRoleRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpRoleRequest.DiscardUnknown(m)
}

var xxx_messageInfo_OfpRoleRequest proto.InternalMessageInfo

func (m *OfpRoleRequest) GetRole() OfpControllerRole {
	if m != nil {
		return m.Role
	}
	return OfpControllerRole_OFPCR_ROLE_NOCHANGE
}

func (m *OfpRoleRequest) GetGenerationId() uint64 {
	if m != nil {
		return m.GenerationId
	}
	return 0
}

// Asynchronous message configuration.
type OfpAsyncConfig struct {
	// ofp_header header;    /* OFPT_GET_ASYNC_REPLY or OFPT_SET_ASYNC. */
	PacketInMask         []uint32 `protobuf:"varint,1,rep,packed,name=packet_in_mask,json=packetInMask,proto3" json:"packet_in_mask,omitempty"`
	PortStatusMask       []uint32 `protobuf:"varint,2,rep,packed,name=port_status_mask,json=portStatusMask,proto3" json:"port_status_mask,omitempty"`
	FlowRemovedMask      []uint32 `protobuf:"varint,3,rep,packed,name=flow_removed_mask,json=flowRemovedMask,proto3" json:"flow_removed_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpAsyncConfig) Reset()         { *m = OfpAsyncConfig{} }
func (m *OfpAsyncConfig) String() string { return proto.CompactTextString(m) }
func (*OfpAsyncConfig) ProtoMessage()    {}
func (*OfpAsyncConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{83}
}
func (m *OfpAsyncConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OfpAsyncConfig.Unmarshal(m, b)
}
func (m *OfpAsyncConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OfpAsyncConfig.Marshal(b, m, deterministic)
}
func (dst *OfpAsyncConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OfpAsyncConfig.Merge(dst, src)
}
func (m *OfpAsyncConfig) XXX_Size() int {
	return xxx_messageInfo_OfpAsyncConfig.Size(m)
}
func (m *OfpAsyncConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_OfpAsyncConfig.DiscardUnknown(m)
}

var xxx_messageInfo_OfpAsyncConfig proto.InternalMessageInfo

func (m *OfpAsyncConfig) GetPacketInMask() []uint32 {
	if m != nil {
		return m.PacketInMask
	}
	return nil
}

func (m *OfpAsyncConfig) GetPortStatusMask() []uint32 {
	if m != nil {
		return m.PortStatusMask
	}
	return nil
}

func (m *OfpAsyncConfig) GetFlowRemovedMask() []uint32 {
	if m != nil {
		return m.FlowRemovedMask
	}
	return nil
}

type MeterModUpdate struct {
	Id                   string       `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	MeterMod             *OfpMeterMod `protobuf:"bytes,2,opt,name=meter_mod,json=meterMod,proto3" json:"meter_mod,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *MeterModUpdate) Reset()         { *m = MeterModUpdate{} }
func (m *MeterModUpdate) String() string { return proto.CompactTextString(m) }
func (*MeterModUpdate) ProtoMessage()    {}
func (*MeterModUpdate) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{84}
}
func (m *MeterModUpdate) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MeterModUpdate.Unmarshal(m, b)
}
func (m *MeterModUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MeterModUpdate.Marshal(b, m, deterministic)
}
func (dst *MeterModUpdate) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MeterModUpdate.Merge(dst, src)
}
func (m *MeterModUpdate) XXX_Size() int {
	return xxx_messageInfo_MeterModUpdate.Size(m)
}
func (m *MeterModUpdate) XXX_DiscardUnknown() {
	xxx_messageInfo_MeterModUpdate.DiscardUnknown(m)
}

var xxx_messageInfo_MeterModUpdate proto.InternalMessageInfo

func (m *MeterModUpdate) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *MeterModUpdate) GetMeterMod() *OfpMeterMod {
	if m != nil {
		return m.MeterMod
	}
	return nil
}

type MeterStatsReply struct {
	MeterStats           []*OfpMeterStats `protobuf:"bytes,1,rep,name=meter_stats,json=meterStats,proto3" json:"meter_stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *MeterStatsReply) Reset()         { *m = MeterStatsReply{} }
func (m *MeterStatsReply) String() string { return proto.CompactTextString(m) }
func (*MeterStatsReply) ProtoMessage()    {}
func (*MeterStatsReply) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{85}
}
func (m *MeterStatsReply) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MeterStatsReply.Unmarshal(m, b)
}
func (m *MeterStatsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MeterStatsReply.Marshal(b, m, deterministic)
}
func (dst *MeterStatsReply) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MeterStatsReply.Merge(dst, src)
}
func (m *MeterStatsReply) XXX_Size() int {
	return xxx_messageInfo_MeterStatsReply.Size(m)
}
func (m *MeterStatsReply) XXX_DiscardUnknown() {
	xxx_messageInfo_MeterStatsReply.DiscardUnknown(m)
}

var xxx_messageInfo_MeterStatsReply proto.InternalMessageInfo

func (m *MeterStatsReply) GetMeterStats() []*OfpMeterStats {
	if m != nil {
		return m.MeterStats
	}
	return nil
}

type FlowTableUpdate struct {
	Id                   string      `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	FlowMod              *OfpFlowMod `protobuf:"bytes,2,opt,name=flow_mod,json=flowMod,proto3" json:"flow_mod,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *FlowTableUpdate) Reset()         { *m = FlowTableUpdate{} }
func (m *FlowTableUpdate) String() string { return proto.CompactTextString(m) }
func (*FlowTableUpdate) ProtoMessage()    {}
func (*FlowTableUpdate) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{86}
}
func (m *FlowTableUpdate) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FlowTableUpdate.Unmarshal(m, b)
}
func (m *FlowTableUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FlowTableUpdate.Marshal(b, m, deterministic)
}
func (dst *FlowTableUpdate) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FlowTableUpdate.Merge(dst, src)
}
func (m *FlowTableUpdate) XXX_Size() int {
	return xxx_messageInfo_FlowTableUpdate.Size(m)
}
func (m *FlowTableUpdate) XXX_DiscardUnknown() {
	xxx_messageInfo_FlowTableUpdate.DiscardUnknown(m)
}

var xxx_messageInfo_FlowTableUpdate proto.InternalMessageInfo

func (m *FlowTableUpdate) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *FlowTableUpdate) GetFlowMod() *OfpFlowMod {
	if m != nil {
		return m.FlowMod
	}
	return nil
}

type FlowGroupTableUpdate struct {
	Id                   string       `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	GroupMod             *OfpGroupMod `protobuf:"bytes,2,opt,name=group_mod,json=groupMod,proto3" json:"group_mod,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *FlowGroupTableUpdate) Reset()         { *m = FlowGroupTableUpdate{} }
func (m *FlowGroupTableUpdate) String() string { return proto.CompactTextString(m) }
func (*FlowGroupTableUpdate) ProtoMessage()    {}
func (*FlowGroupTableUpdate) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{87}
}
func (m *FlowGroupTableUpdate) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FlowGroupTableUpdate.Unmarshal(m, b)
}
func (m *FlowGroupTableUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FlowGroupTableUpdate.Marshal(b, m, deterministic)
}
func (dst *FlowGroupTableUpdate) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FlowGroupTableUpdate.Merge(dst, src)
}
func (m *FlowGroupTableUpdate) XXX_Size() int {
	return xxx_messageInfo_FlowGroupTableUpdate.Size(m)
}
func (m *FlowGroupTableUpdate) XXX_DiscardUnknown() {
	xxx_messageInfo_FlowGroupTableUpdate.DiscardUnknown(m)
}

var xxx_messageInfo_FlowGroupTableUpdate proto.InternalMessageInfo

func (m *FlowGroupTableUpdate) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *FlowGroupTableUpdate) GetGroupMod() *OfpGroupMod {
	if m != nil {
		return m.GroupMod
	}
	return nil
}

type Flows struct {
	Items                []*OfpFlowStats `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *Flows) Reset()         { *m = Flows{} }
func (m *Flows) String() string { return proto.CompactTextString(m) }
func (*Flows) ProtoMessage()    {}
func (*Flows) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{88}
}
func (m *Flows) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Flows.Unmarshal(m, b)
}
func (m *Flows) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Flows.Marshal(b, m, deterministic)
}
func (dst *Flows) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Flows.Merge(dst, src)
}
func (m *Flows) XXX_Size() int {
	return xxx_messageInfo_Flows.Size(m)
}
func (m *Flows) XXX_DiscardUnknown() {
	xxx_messageInfo_Flows.DiscardUnknown(m)
}

var xxx_messageInfo_Flows proto.InternalMessageInfo

func (m *Flows) GetItems() []*OfpFlowStats {
	if m != nil {
		return m.Items
	}
	return nil
}

type Meters struct {
	Items                []*OfpMeterConfig `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *Meters) Reset()         { *m = Meters{} }
func (m *Meters) String() string { return proto.CompactTextString(m) }
func (*Meters) ProtoMessage()    {}
func (*Meters) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{89}
}
func (m *Meters) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Meters.Unmarshal(m, b)
}
func (m *Meters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Meters.Marshal(b, m, deterministic)
}
func (dst *Meters) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Meters.Merge(dst, src)
}
func (m *Meters) XXX_Size() int {
	return xxx_messageInfo_Meters.Size(m)
}
func (m *Meters) XXX_DiscardUnknown() {
	xxx_messageInfo_Meters.DiscardUnknown(m)
}

var xxx_messageInfo_Meters proto.InternalMessageInfo

func (m *Meters) GetItems() []*OfpMeterConfig {
	if m != nil {
		return m.Items
	}
	return nil
}

type FlowGroups struct {
	Items                []*OfpGroupEntry `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *FlowGroups) Reset()         { *m = FlowGroups{} }
func (m *FlowGroups) String() string { return proto.CompactTextString(m) }
func (*FlowGroups) ProtoMessage()    {}
func (*FlowGroups) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{90}
}
func (m *FlowGroups) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FlowGroups.Unmarshal(m, b)
}
func (m *FlowGroups) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FlowGroups.Marshal(b, m, deterministic)
}
func (dst *FlowGroups) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FlowGroups.Merge(dst, src)
}
func (m *FlowGroups) XXX_Size() int {
	return xxx_messageInfo_FlowGroups.Size(m)
}
func (m *FlowGroups) XXX_DiscardUnknown() {
	xxx_messageInfo_FlowGroups.DiscardUnknown(m)
}

var xxx_messageInfo_FlowGroups proto.InternalMessageInfo

func (m *FlowGroups) GetItems() []*OfpGroupEntry {
	if m != nil {
		return m.Items
	}
	return nil
}

type FlowChanges struct {
	ToAdd                *Flows   `protobuf:"bytes,1,opt,name=to_add,json=toAdd,proto3" json:"to_add,omitempty"`
	ToRemove             *Flows   `protobuf:"bytes,2,opt,name=to_remove,json=toRemove,proto3" json:"to_remove,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FlowChanges) Reset()         { *m = FlowChanges{} }
func (m *FlowChanges) String() string { return proto.CompactTextString(m) }
func (*FlowChanges) ProtoMessage()    {}
func (*FlowChanges) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{91}
}
func (m *FlowChanges) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FlowChanges.Unmarshal(m, b)
}
func (m *FlowChanges) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FlowChanges.Marshal(b, m, deterministic)
}
func (dst *FlowChanges) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FlowChanges.Merge(dst, src)
}
func (m *FlowChanges) XXX_Size() int {
	return xxx_messageInfo_FlowChanges.Size(m)
}
func (m *FlowChanges) XXX_DiscardUnknown() {
	xxx_messageInfo_FlowChanges.DiscardUnknown(m)
}

var xxx_messageInfo_FlowChanges proto.InternalMessageInfo

func (m *FlowChanges) GetToAdd() *Flows {
	if m != nil {
		return m.ToAdd
	}
	return nil
}

func (m *FlowChanges) GetToRemove() *Flows {
	if m != nil {
		return m.ToRemove
	}
	return nil
}

type FlowGroupChanges struct {
	ToAdd                *FlowGroups `protobuf:"bytes,1,opt,name=to_add,json=toAdd,proto3" json:"to_add,omitempty"`
	ToRemove             *FlowGroups `protobuf:"bytes,2,opt,name=to_remove,json=toRemove,proto3" json:"to_remove,omitempty"`
	ToUpdate             *FlowGroups `protobuf:"bytes,3,opt,name=to_update,json=toUpdate,proto3" json:"to_update,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *FlowGroupChanges) Reset()         { *m = FlowGroupChanges{} }
func (m *FlowGroupChanges) String() string { return proto.CompactTextString(m) }
func (*FlowGroupChanges) ProtoMessage()    {}
func (*FlowGroupChanges) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{92}
}
func (m *FlowGroupChanges) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FlowGroupChanges.Unmarshal(m, b)
}
func (m *FlowGroupChanges) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FlowGroupChanges.Marshal(b, m, deterministic)
}
func (dst *FlowGroupChanges) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FlowGroupChanges.Merge(dst, src)
}
func (m *FlowGroupChanges) XXX_Size() int {
	return xxx_messageInfo_FlowGroupChanges.Size(m)
}
func (m *FlowGroupChanges) XXX_DiscardUnknown() {
	xxx_messageInfo_FlowGroupChanges.DiscardUnknown(m)
}

var xxx_messageInfo_FlowGroupChanges proto.InternalMessageInfo

func (m *FlowGroupChanges) GetToAdd() *FlowGroups {
	if m != nil {
		return m.ToAdd
	}
	return nil
}

func (m *FlowGroupChanges) GetToRemove() *FlowGroups {
	if m != nil {
		return m.ToRemove
	}
	return nil
}

func (m *FlowGroupChanges) GetToUpdate() *FlowGroups {
	if m != nil {
		return m.ToUpdate
	}
	return nil
}

type PacketIn struct {
	Id                   string       `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	PacketIn             *OfpPacketIn `protobuf:"bytes,2,opt,name=packet_in,json=packetIn,proto3" json:"packet_in,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *PacketIn) Reset()         { *m = PacketIn{} }
func (m *PacketIn) String() string { return proto.CompactTextString(m) }
func (*PacketIn) ProtoMessage()    {}
func (*PacketIn) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{93}
}
func (m *PacketIn) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PacketIn.Unmarshal(m, b)
}
func (m *PacketIn) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PacketIn.Marshal(b, m, deterministic)
}
func (dst *PacketIn) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PacketIn.Merge(dst, src)
}
func (m *PacketIn) XXX_Size() int {
	return xxx_messageInfo_PacketIn.Size(m)
}
func (m *PacketIn) XXX_DiscardUnknown() {
	xxx_messageInfo_PacketIn.DiscardUnknown(m)
}

var xxx_messageInfo_PacketIn proto.InternalMessageInfo

func (m *PacketIn) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *PacketIn) GetPacketIn() *OfpPacketIn {
	if m != nil {
		return m.PacketIn
	}
	return nil
}

type PacketOut struct {
	Id                   string        `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	PacketOut            *OfpPacketOut `protobuf:"bytes,2,opt,name=packet_out,json=packetOut,proto3" json:"packet_out,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *PacketOut) Reset()         { *m = PacketOut{} }
func (m *PacketOut) String() string { return proto.CompactTextString(m) }
func (*PacketOut) ProtoMessage()    {}
func (*PacketOut) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{94}
}
func (m *PacketOut) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PacketOut.Unmarshal(m, b)
}
func (m *PacketOut) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PacketOut.Marshal(b, m, deterministic)
}
func (dst *PacketOut) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PacketOut.Merge(dst, src)
}
func (m *PacketOut) XXX_Size() int {
	return xxx_messageInfo_PacketOut.Size(m)
}
func (m *PacketOut) XXX_DiscardUnknown() {
	xxx_messageInfo_PacketOut.DiscardUnknown(m)
}

var xxx_messageInfo_PacketOut proto.InternalMessageInfo

func (m *PacketOut) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *PacketOut) GetPacketOut() *OfpPacketOut {
	if m != nil {
		return m.PacketOut
	}
	return nil
}

type ChangeEvent struct {
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// Types that are valid to be assigned to Event:
	//	*ChangeEvent_PortStatus
	Event                isChangeEvent_Event `protobuf_oneof:"event"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *ChangeEvent) Reset()         { *m = ChangeEvent{} }
func (m *ChangeEvent) String() string { return proto.CompactTextString(m) }
func (*ChangeEvent) ProtoMessage()    {}
func (*ChangeEvent) Descriptor() ([]byte, []int) {
	return fileDescriptor_openflow_13_2cee8de507cb270a, []int{95}
}
func (m *ChangeEvent) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ChangeEvent.Unmarshal(m, b)
}
func (m *ChangeEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ChangeEvent.Marshal(b, m, deterministic)
}
func (dst *ChangeEvent) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ChangeEvent.Merge(dst, src)
}
func (m *ChangeEvent) XXX_Size() int {
	return xxx_messageInfo_ChangeEvent.Size(m)
}
func (m *ChangeEvent) XXX_DiscardUnknown() {
	xxx_messageInfo_ChangeEvent.DiscardUnknown(m)
}

var xxx_messageInfo_ChangeEvent proto.InternalMessageInfo

func (m *ChangeEvent) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

type isChangeEvent_Event interface {
	isChangeEvent_Event()
}

type ChangeEvent_PortStatus struct {
	PortStatus *OfpPortStatus `protobuf:"bytes,2,opt,name=port_status,json=portStatus,proto3,oneof"`
}

func (*ChangeEvent_PortStatus) isChangeEvent_Event() {}

func (m *ChangeEvent) GetEvent() isChangeEvent_Event {
	if m != nil {
		return m.Event
	}
	return nil
}

func (m *ChangeEvent) GetPortStatus() *OfpPortStatus {
	if x, ok := m.GetEvent().(*ChangeEvent_PortStatus); ok {
		return x.PortStatus
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*ChangeEvent) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _ChangeEvent_OneofMarshaler, _ChangeEvent_OneofUnmarshaler, _ChangeEvent_OneofSizer, []interface{}{
		(*ChangeEvent_PortStatus)(nil),
	}
}

func _ChangeEvent_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*ChangeEvent)
	// event
	switch x := m.Event.(type) {
	case *ChangeEvent_PortStatus:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.PortStatus); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("ChangeEvent.Event has unexpected type %T", x)
	}
	return nil
}

func _ChangeEvent_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*ChangeEvent)
	switch tag {
	case 2: // event.port_status
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OfpPortStatus)
		err := b.DecodeMessage(msg)
		m.Event = &ChangeEvent_PortStatus{msg}
		return true, err
	default:
		return false, nil
	}
}

func _ChangeEvent_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*ChangeEvent)
	// event
	switch x := m.Event.(type) {
	case *ChangeEvent_PortStatus:
		s := proto.Size(x.PortStatus)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

func init() {
	proto.RegisterType((*OfpHeader)(nil), "openflow_13.ofp_header")
	proto.RegisterType((*OfpHelloElemHeader)(nil), "openflow_13.ofp_hello_elem_header")
	proto.RegisterType((*OfpHelloElemVersionbitmap)(nil), "openflow_13.ofp_hello_elem_versionbitmap")
	proto.RegisterType((*OfpHello)(nil), "openflow_13.ofp_hello")
	proto.RegisterType((*OfpSwitchConfig)(nil), "openflow_13.ofp_switch_config")
	proto.RegisterType((*OfpTableMod)(nil), "openflow_13.ofp_table_mod")
	proto.RegisterType((*OfpPort)(nil), "openflow_13.ofp_port")
	proto.RegisterType((*OfpSwitchFeatures)(nil), "openflow_13.ofp_switch_features")
	proto.RegisterType((*OfpPortStatus)(nil), "openflow_13.ofp_port_status")
	proto.RegisterType((*OfpPortMod)(nil), "openflow_13.ofp_port_mod")
	proto.RegisterType((*OfpMatch)(nil), "openflow_13.ofp_match")
	proto.RegisterType((*OfpOxmField)(nil), "openflow_13.ofp_oxm_field")
	proto.RegisterType((*OfpOxmOfbField)(nil), "openflow_13.ofp_oxm_ofb_field")
	proto.RegisterType((*OfpOxmExperimenterField)(nil), "openflow_13.ofp_oxm_experimenter_field")
	proto.RegisterType((*OfpAction)(nil), "openflow_13.ofp_action")
	proto.RegisterType((*OfpActionOutput)(nil), "openflow_13.ofp_action_output")
	proto.RegisterType((*OfpActionMplsTtl)(nil), "openflow_13.ofp_action_mpls_ttl")
	proto.RegisterType((*OfpActionPush)(nil), "openflow_13.ofp_action_push")
	proto.RegisterType((*OfpActionPopMpls)(nil), "openflow_13.ofp_action_pop_mpls")
	proto.RegisterType((*OfpActionGroup)(nil), "openflow_13.ofp_action_group")
	proto.RegisterType((*OfpActionNwTtl)(nil), "openflow_13.ofp_action_nw_ttl")
	proto.RegisterType((*OfpActionSetField)(nil), "openflow_13.ofp_action_set_field")
	proto.RegisterType((*OfpActionExperimenter)(nil), "openflow_13.ofp_action_experimenter")
	proto.RegisterType((*OfpInstruction)(nil), "openflow_13.ofp_instruction")
	proto.RegisterType((*OfpInstructionGotoTable)(nil), "openflow_13.ofp_instruction_goto_table")
	proto.RegisterType((*OfpInstructionWriteMetadata)(nil), "openflow_13.ofp_instruction_write_metadata")
	proto.RegisterType((*OfpInstructionActions)(nil), "openflow_13.ofp_instruction_actions")
	proto.RegisterType((*OfpInstructionMeter)(nil), "openflow_13.ofp_instruction_meter")
	proto.RegisterType((*OfpInstructionExperimenter)(nil), "openflow_13.ofp_instruction_experimenter")
	proto.RegisterType((*OfpFlowMod)(nil), "openflow_13.ofp_flow_mod")
	proto.RegisterType((*OfpBucket)(nil), "openflow_13.ofp_bucket")
	proto.RegisterType((*OfpGroupMod)(nil), "openflow_13.ofp_group_mod")
	proto.RegisterType((*OfpPacketOut)(nil), "openflow_13.ofp_packet_out")
	proto.RegisterType((*OfpPacketIn)(nil), "openflow_13.ofp_packet_in")
	proto.RegisterType((*OfpFlowRemoved)(nil), "openflow_13.ofp_flow_removed")
	proto.RegisterType((*OfpMeterBandHeader)(nil), "openflow_13.ofp_meter_band_header")
	proto.RegisterType((*OfpMeterBandDrop)(nil), "openflow_13.ofp_meter_band_drop")
	proto.RegisterType((*OfpMeterBandDscpRemark)(nil), "openflow_13.ofp_meter_band_dscp_remark")
	proto.RegisterType((*OfpMeterBandExperimenter)(nil), "openflow_13.ofp_meter_band_experimenter")
	proto.RegisterType((*OfpMeterMod)(nil), "openflow_13.ofp_meter_mod")
	proto.RegisterType((*OfpErrorMsg)(nil), "openflow_13.ofp_error_msg")
	proto.RegisterType((*OfpErrorExperimenterMsg)(nil), "openflow_13.ofp_error_experimenter_msg")
	proto.RegisterType((*OfpMultipartRequest)(nil), "openflow_13.ofp_multipart_request")
	proto.RegisterType((*OfpMultipartReply)(nil), "openflow_13.ofp_multipart_reply")
	proto.RegisterType((*OfpDesc)(nil), "openflow_13.ofp_desc")
	proto.RegisterType((*OfpFlowStatsRequest)(nil), "openflow_13.ofp_flow_stats_request")
	proto.RegisterType((*OfpFlowStats)(nil), "openflow_13.ofp_flow_stats")
	proto.RegisterType((*OfpAggregateStatsRequest)(nil), "openflow_13.ofp_aggregate_stats_request")
	proto.RegisterType((*OfpAggregateStatsReply)(nil), "openflow_13.ofp_aggregate_stats_reply")
	proto.RegisterType((*OfpTableFeatureProperty)(nil), "openflow_13.ofp_table_feature_property")
	proto.RegisterType((*OfpTableFeaturePropInstructions)(nil), "openflow_13.ofp_table_feature_prop_instructions")
	proto.RegisterType((*OfpTableFeaturePropNextTables)(nil), "openflow_13.ofp_table_feature_prop_next_tables")
	proto.RegisterType((*OfpTableFeaturePropActions)(nil), "openflow_13.ofp_table_feature_prop_actions")
	proto.RegisterType((*OfpTableFeaturePropOxm)(nil), "openflow_13.ofp_table_feature_prop_oxm")
	proto.RegisterType((*OfpTableFeaturePropExperimenter)(nil), "openflow_13.ofp_table_feature_prop_experimenter")
	proto.RegisterType((*OfpTableFeatures)(nil), "openflow_13.ofp_table_features")
	proto.RegisterType((*OfpTableStats)(nil), "openflow_13.ofp_table_stats")
	proto.RegisterType((*OfpPortStatsRequest)(nil), "openflow_13.ofp_port_stats_request")
	proto.RegisterType((*OfpPortStats)(nil), "openflow_13.ofp_port_stats")
	proto.RegisterType((*OfpGroupStatsRequest)(nil), "openflow_13.ofp_group_stats_request")
	proto.RegisterType((*OfpBucketCounter)(nil), "openflow_13.ofp_bucket_counter")
	proto.RegisterType((*OfpGroupStats)(nil), "openflow_13.ofp_group_stats")
	proto.RegisterType((*OfpGroupDesc)(nil), "openflow_13.ofp_group_desc")
	proto.RegisterType((*OfpGroupEntry)(nil), "openflow_13.ofp_group_entry")
	proto.RegisterType((*OfpGroupFeatures)(nil), "openflow_13.ofp_group_features")
	proto.RegisterType((*OfpMeterMultipartRequest)(nil), "openflow_13.ofp_meter_multipart_request")
	proto.RegisterType((*OfpMeterBandStats)(nil), "openflow_13.ofp_meter_band_stats")
	proto.RegisterType((*OfpMeterStats)(nil), "openflow_13.ofp_meter_stats")
	proto.RegisterType((*OfpMeterConfig)(nil), "openflow_13.ofp_meter_config")
	proto.RegisterType((*OfpMeterFeatures)(nil), "openflow_13.ofp_meter_features")
	proto.RegisterType((*OfpExperimenterMultipartHeader)(nil), "openflow_13.ofp_experimenter_multipart_header")
	proto.RegisterType((*OfpExperimenterHeader)(nil), "openflow_13.ofp_experimenter_header")
	proto.RegisterType((*OfpQueuePropHeader)(nil), "openflow_13.ofp_queue_prop_header")
	proto.RegisterType((*OfpQueuePropMinRate)(nil), "openflow_13.ofp_queue_prop_min_rate")
	proto.RegisterType((*OfpQueuePropMaxRate)(nil), "openflow_13.ofp_queue_prop_max_rate")
	proto.RegisterType((*OfpQueuePropExperimenter)(nil), "openflow_13.ofp_queue_prop_experimenter")
	proto.RegisterType((*OfpPacketQueue)(nil), "openflow_13.ofp_packet_queue")
	proto.RegisterType((*OfpQueueGetConfigRequest)(nil), "openflow_13.ofp_queue_get_config_request")
	proto.RegisterType((*OfpQueueGetConfigReply)(nil), "openflow_13.ofp_queue_get_config_reply")
	proto.RegisterType((*OfpActionSetQueue)(nil), "openflow_13.ofp_action_set_queue")
	proto.RegisterType((*OfpQueueStatsRequest)(nil), "openflow_13.ofp_queue_stats_request")
	proto.RegisterType((*OfpQueueStats)(nil), "openflow_13.ofp_queue_stats")
	proto.RegisterType((*OfpRoleRequest)(nil), "openflow_13.ofp_role_request")
	proto.RegisterType((*OfpAsyncConfig)(nil), "openflow_13.ofp_async_config")
	proto.RegisterType((*MeterModUpdate)(nil), "openflow_13.MeterModUpdate")
	proto.RegisterType((*MeterStatsReply)(nil), "openflow_13.MeterStatsReply")
	proto.RegisterType((*FlowTableUpdate)(nil), "openflow_13.FlowTableUpdate")
	proto.RegisterType((*FlowGroupTableUpdate)(nil), "openflow_13.FlowGroupTableUpdate")
	proto.RegisterType((*Flows)(nil), "openflow_13.Flows")
	proto.RegisterType((*Meters)(nil), "openflow_13.Meters")
	proto.RegisterType((*FlowGroups)(nil), "openflow_13.FlowGroups")
	proto.RegisterType((*FlowChanges)(nil), "openflow_13.FlowChanges")
	proto.RegisterType((*FlowGroupChanges)(nil), "openflow_13.FlowGroupChanges")
	proto.RegisterType((*PacketIn)(nil), "openflow_13.PacketIn")
	proto.RegisterType((*PacketOut)(nil), "openflow_13.PacketOut")
	proto.RegisterType((*ChangeEvent)(nil), "openflow_13.ChangeEvent")
	proto.RegisterEnum("openflow_13.OfpPortNo", OfpPortNo_name, OfpPortNo_value)
	proto.RegisterEnum("openflow_13.OfpType", OfpType_name, OfpType_value)
	proto.RegisterEnum("openflow_13.OfpHelloElemType", OfpHelloElemType_name, OfpHelloElemType_value)
	proto.RegisterEnum("openflow_13.OfpConfigFlags", OfpConfigFlags_name, OfpConfigFlags_value)
	proto.RegisterEnum("openflow_13.OfpTableConfig", OfpTableConfig_name, OfpTableConfig_value)
	proto.RegisterEnum("openflow_13.OfpTable", OfpTable_name, OfpTable_value)
	proto.RegisterEnum("openflow_13.OfpCapabilities", OfpCapabilities_name, OfpCapabilities_value)
	proto.RegisterEnum("openflow_13.OfpPortConfig", OfpPortConfig_name, OfpPortConfig_value)
	proto.RegisterEnum("openflow_13.OfpPortState", OfpPortState_name, OfpPortState_value)
	proto.RegisterEnum("openflow_13.OfpPortFeatures", OfpPortFeatures_name, OfpPortFeatures_value)
	proto.RegisterEnum("openflow_13.OfpPortReason", OfpPortReason_name, OfpPortReason_value)
	proto.RegisterEnum("openflow_13.OfpMatchType", OfpMatchType_name, OfpMatchType_value)
	proto.RegisterEnum("openflow_13.OfpOxmClass", OfpOxmClass_name, OfpOxmClass_value)
	proto.RegisterEnum("openflow_13.OxmOfbFieldTypes", OxmOfbFieldTypes_name, OxmOfbFieldTypes_value)
	proto.RegisterEnum("openflow_13.OfpVlanId", OfpVlanId_name, OfpVlanId_value)
	proto.RegisterEnum("openflow_13.OfpIpv6ExthdrFlags", OfpIpv6ExthdrFlags_name, OfpIpv6ExthdrFlags_value)
	proto.RegisterEnum("openflow_13.OfpActionType", OfpActionType_name, OfpActionType_value)
	proto.RegisterEnum("openflow_13.OfpControllerMaxLen", OfpControllerMaxLen_name, OfpControllerMaxLen_value)
	proto.RegisterEnum("openflow_13.OfpInstructionType", OfpInstructionType_name, OfpInstructionType_value)
	proto.RegisterEnum("openflow_13.OfpFlowModCommand", OfpFlowModCommand_name, OfpFlowModCommand_value)
	proto.RegisterEnum("openflow_13.OfpFlowModFlags", OfpFlowModFlags_name, OfpFlowModFlags_value)
	proto.RegisterEnum("openflow_13.OfpGroup", OfpGroup_name, OfpGroup_value)
	proto.RegisterEnum("openflow_13.OfpGroupModCommand", OfpGroupModCommand_name, OfpGroupModCommand_value)
	proto.RegisterEnum("openflow_13.OfpGroupType", OfpGroupType_name, OfpGroupType_value)
	proto.RegisterEnum("openflow_13.OfpPacketInReason", OfpPacketInReason_name, OfpPacketInReason_value)
	proto.RegisterEnum("openflow_13.OfpFlowRemovedReason", OfpFlowRemovedReason_name, OfpFlowRemovedReason_value)
	proto.RegisterEnum("openflow_13.OfpMeter", OfpMeter_name, OfpMeter_value)
	proto.RegisterEnum("openflow_13.OfpMeterBandType", OfpMeterBandType_name, OfpMeterBandType_value)
	proto.RegisterEnum("openflow_13.OfpMeterModCommand", OfpMeterModCommand_name, OfpMeterModCommand_value)
	proto.RegisterEnum("openflow_13.OfpMeterFlags", OfpMeterFlags_name, OfpMeterFlags_value)
	proto.RegisterEnum("openflow_13.OfpErrorType", OfpErrorType_name, OfpErrorType_value)
	proto.RegisterEnum("openflow_13.OfpHelloFailedCode", OfpHelloFailedCode_name, OfpHelloFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpBadRequestCode", OfpBadRequestCode_name, OfpBadRequestCode_value)
	proto.RegisterEnum("openflow_13.OfpBadActionCode", OfpBadActionCode_name, OfpBadActionCode_value)
	proto.RegisterEnum("openflow_13.OfpBadInstructionCode", OfpBadInstructionCode_name, OfpBadInstructionCode_value)
	proto.RegisterEnum("openflow_13.OfpBadMatchCode", OfpBadMatchCode_name, OfpBadMatchCode_value)
	proto.RegisterEnum("openflow_13.OfpFlowModFailedCode", OfpFlowModFailedCode_name, OfpFlowModFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpGroupModFailedCode", OfpGroupModFailedCode_name, OfpGroupModFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpPortModFailedCode", OfpPortModFailedCode_name, OfpPortModFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpTableModFailedCode", OfpTableModFailedCode_name, OfpTableModFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpQueueOpFailedCode", OfpQueueOpFailedCode_name, OfpQueueOpFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpSwitchConfigFailedCode", OfpSwitchConfigFailedCode_name, OfpSwitchConfigFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpRoleRequestFailedCode", OfpRoleRequestFailedCode_name, OfpRoleRequestFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpMeterModFailedCode", OfpMeterModFailedCode_name, OfpMeterModFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpTableFeaturesFailedCode", OfpTableFeaturesFailedCode_name, OfpTableFeaturesFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpMultipartType", OfpMultipartType_name, OfpMultipartType_value)
	proto.RegisterEnum("openflow_13.OfpMultipartRequestFlags", OfpMultipartRequestFlags_name, OfpMultipartRequestFlags_value)
	proto.RegisterEnum("openflow_13.OfpMultipartReplyFlags", OfpMultipartReplyFlags_name, OfpMultipartReplyFlags_value)
	proto.RegisterEnum("openflow_13.OfpTableFeaturePropType", OfpTableFeaturePropType_name, OfpTableFeaturePropType_value)
	proto.RegisterEnum("openflow_13.OfpGroupCapabilities", OfpGroupCapabilities_name, OfpGroupCapabilities_value)
	proto.RegisterEnum("openflow_13.OfpQueueProperties", OfpQueueProperties_name, OfpQueueProperties_value)
	proto.RegisterEnum("openflow_13.OfpControllerRole", OfpControllerRole_name, OfpControllerRole_value)
}

func init() {
	proto.RegisterFile("voltha_protos/openflow_13.proto", fileDescriptor_openflow_13_2cee8de507cb270a)
}

var fileDescriptor_openflow_13_2cee8de507cb270a = []byte{
	// 8420 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x7d, 0x5b, 0x8c, 0x1b, 0x59,
	0x76, 0x98, 0xf8, 0xe8, 0x6e, 0xf2, 0xb2, 0xbb, 0x55, 0x2a, 0xbd, 0x28, 0xb5, 0x34, 0x92, 0xb8,
	0x33, 0xbb, 0xb3, 0x5c, 0x7b, 0x67, 0x46, 0xa3, 0xd5, 0xae, 0x77, 0xbd, 0x8e, 0x8a, 0x64, 0xb1,
	0x9b, 0x23, 0x3e, 0x4a, 0x55, 0xd5, 0x2d, 0x69, 0x03, 0xa7, 0xc0, 0x26, 0x4b, 0xdd, 0xf4, 0x90,
	0x2c, 0x6e, 0x55, 0x75, 0xab, 0xe5, 0xc4, 0x81, 0x62, 0x23, 0x08, 0x90, 0xc4, 0x76, 0x02, 0x7f,
	0x2c, 0x10, 0x38, 0x40, 0x8c, 0x38, 0x1f, 0x41, 0x80, 0x7c, 0x04, 0x08, 0x10, 0x20, 0xbf, 0x09,
	0x90, 0x00, 0x79, 0x00, 0x06, 0x02, 0xff, 0xd8, 0x7f, 0xce, 0x4f, 0x00, 0x7f, 0x27, 0x71, 0x36,
	0xab, 0xe0, 0xdc, 0x73, 0xee, 0xad, 0x5b, 0x7c, 0xf4, 0xf4, 0x6e, 0x66, 0xf3, 0x91, 0x2f, 0xb1,
	0xce, 0xeb, 0x9e, 0x7b, 0xee, 0x39, 0xe7, 0x9e, 0x7b, 0xea, 0x56, 0x8b, 0xdd, 0x3b, 0x0d, 0xc6,
	0xf1, 0x71, 0xdf, 0x9b, 0x85, 0x41, 0x1c, 0x44, 0x1f, 0x05, 0x33, 0x7f, 0xfa, 0x6a, 0x1c, 0xbc,
	0xf6, 0x3e, 0xf9, 0xf4, 0x9b, 0x1c, 0xa4, 0x97, 0x14, 0xd0, 0xed, 0x3b, 0x47, 0x41, 0x70, 0x34,
	0xf6, 0x3f, 0xea, 0xcf, 0x46, 0x1f, 0xf5, 0xa7, 0xd3, 0x20, 0xee, 0xc7, 0xa3, 0x60, 0x1a, 0x21,
	0xe9, 0xed, 0xfb, 0x69, 0x59, 0x6f, 0xfa, 0xd3, 0x23, 0x2f, 0x98, 0x29, 0x14, 0x95, 0x01, 0x63,
	0xc1, 0xab, 0x99, 0x77, 0xec, 0xf7, 0x87, 0x7e, 0xa8, 0x97, 0xd9, 0xc6, 0xa9, 0x1f, 0x46, 0xa3,
	0x60, 0x5a, 0xce, 0xdc, 0xcf, 0x7c, 0xb8, 0x65, 0x8b, 0x47, 0xfd, 0xeb, 0x2c, 0x1f, 0xbf, 0x99,
	0xf9, 0xe5, 0xec, 0xfd, 0xcc, 0x87, 0xdb, 0x0f, 0xaf, 0x7f, 0x53, 0x55, 0x0b, 0x04, 0x00, 0xd2,
	0xe6, 0x24, 0xba, 0xc6, 0x72, 0x67, 0xa3, 0x61, 0x39, 0xc7, 0x05, 0xc0, 0xcf, 0xca, 0x3f, 0xcb,
	0xb0, 0xeb, 0x38, 0xca, 0x78, 0x1c, 0x78, 0xfe, 0xd8, 0x9f, 0x88, 0x01, 0x1f, 0x91, 0xd8, 0x0c,
	0x17, 0x7b, 0x7f, 0x41, 0xac, 0xc2, 0xa1, 0x8c, 0xf0, 0x8c, 0x6d, 0x91, 0x5e, 0x87, 0xa3, 0x78,
	0xd2, 0x9f, 0x71, 0xad, 0x4a, 0x0f, 0xbf, 0x7e, 0x1e, 0x7b, 0x8a, 0x61, 0xef, 0x92, 0x9d, 0x96,
	0x50, 0x2b, 0xb2, 0x0d, 0x20, 0xf3, 0xa7, 0x71, 0xe5, 0x3b, 0xec, 0xce, 0x79, 0xbc, 0x60, 0x24,
	0xfc, 0x15, 0x95, 0xb3, 0xf7, 0x73, 0x60, 0x24, 0x7a, 0xac, 0x3c, 0x65, 0x45, 0xc9, 0xa9, 0xff,
	0x0a, 0x2b, 0x90, 0xc4, 0xa8, 0x9c, 0xb9, 0x9f, 0xfb, 0xb0, 0xf4, 0xb0, 0x72, 0x9e, 0x7e, 0x68,
	0x10, 0x5b, 0xf2, 0x54, 0x3a, 0xec, 0x0a, 0x90, 0x44, 0xaf, 0x47, 0xf1, 0xe0, 0xd8, 0x1b, 0x04,
	0xd3, 0x57, 0xa3, 0x23, 0xfd, 0x1a, 0x5b, 0x7b, 0x35, 0xee, 0x1f, 0x45, 0xb4, 0x3c, 0xf8, 0xa0,
	0x57, 0xd8, 0xd6, 0x64, 0x14, 0x45, 0x5e, 0xe4, 0x4f, 0x87, 0xde, 0xd8, 0x9f, 0x72, 0x7b, 0x6c,
	0xd9, 0x25, 0x00, 0x3a, 0xfe, 0x74, 0xd8, 0xf6, 0xa7, 0x95, 0x1a, 0xdb, 0xe2, 0xeb, 0xd4, 0x3f,
	0x1c, 0xfb, 0xde, 0x24, 0x18, 0xea, 0xb7, 0x58, 0x01, 0x1f, 0x46, 0x43, 0xb1, 0xd8, 0xfc, 0xb9,
	0x35, 0xd4, 0x6f, 0xb0, 0x75, 0x1c, 0x8f, 0x04, 0xd1, 0x53, 0xe5, 0x1f, 0x65, 0x59, 0x01, 0x84,
	0xcc, 0x82, 0x30, 0xd6, 0x6f, 0xb2, 0x0d, 0xf8, 0xd7, 0x9b, 0x06, 0xc4, 0xbe, 0x0e, 0x8f, 0xdd,
	0x00, 0x10, 0xc7, 0xaf, 0xbd, 0xfe, 0x70, 0x18, 0x92, 0x7d, 0xd6, 0x8f, 0x5f, 0x1b, 0xc3, 0x61,
	0xa8, 0xeb, 0x2c, 0x3f, 0xed, 0x4f, 0x7c, 0xee, 0x19, 0x45, 0x9b, 0xff, 0x56, 0x86, 0xca, 0xab,
	0x43, 0xc1, 0x44, 0xa3, 0xb8, 0x1f, 0xfb, 0xe5, 0x35, 0x9c, 0x28, 0x7f, 0x00, 0x09, 0x83, 0x93,
	0x30, 0x2c, 0xaf, 0x73, 0x20, 0xff, 0xad, 0xbf, 0xc7, 0x58, 0x7f, 0x78, 0xea, 0x87, 0xf1, 0x28,
	0xf2, 0x87, 0xe5, 0x0d, 0x8e, 0x51, 0x20, 0xfa, 0x1d, 0x56, 0x8c, 0x4e, 0x66, 0xa0, 0x9b, 0x3f,
	0x2c, 0x17, 0x38, 0x3a, 0x01, 0x80, 0xc4, 0x99, 0xef, 0x87, 0xe5, 0x22, 0x4a, 0x84, 0xdf, 0xfa,
	0x5d, 0xc6, 0x40, 0xb2, 0x17, 0xcd, 0x7c, 0x7f, 0x58, 0x66, 0xc8, 0x02, 0x10, 0x07, 0x00, 0xfa,
	0x0e, 0x2b, 0x4e, 0xfa, 0x67, 0x84, 0x2d, 0x71, 0x6c, 0x61, 0xd2, 0x3f, 0xe3, 0xc8, 0xca, 0xbf,
	0xcc, 0xb0, 0xab, 0xca, 0xb2, 0xbd, 0xf2, 0xfb, 0xf1, 0x49, 0xe8, 0x47, 0xfa, 0x3d, 0x56, 0x1a,
	0xf6, 0xe3, 0xfe, 0xac, 0x1f, 0x1f, 0x0b, 0x83, 0xe7, 0x6d, 0x26, 0x40, 0x2d, 0x2e, 0x75, 0xea,
	0x1d, 0x9e, 0xbc, 0x7a, 0xe5, 0x87, 0x11, 0x99, 0xbd, 0x30, 0xad, 0xe1, 0x33, 0xac, 0xd5, 0x14,
	0x97, 0x2e, 0xa2, 0xb8, 0xda, 0x98, 0xba, 0xfc, 0x51, 0x7f, 0xc0, 0x36, 0xfb, 0x27, 0x67, 0xa3,
	0xf1, 0xa8, 0x1f, 0xbe, 0x01, 0xc9, 0x68, 0xc6, 0x92, 0x84, 0xb5, 0x86, 0x7a, 0x85, 0x6d, 0x0e,
	0xfa, 0xb3, 0xfe, 0xe1, 0x68, 0x3c, 0x8a, 0x47, 0x7e, 0x44, 0x26, 0x4d, 0xc1, 0x2a, 0x21, 0xbb,
	0x2c, 0x56, 0xd6, 0x03, 0x5b, 0x9f, 0x44, 0xfa, 0x23, 0xb6, 0x1e, 0xfa, 0xfd, 0x88, 0x72, 0xc1,
	0xf6, 0xc3, 0x3b, 0x0b, 0xee, 0xcb, 0xa9, 0x91, 0xc6, 0x26, 0x5a, 0x48, 0x14, 0x43, 0x3f, 0x1a,
	0x50, 0x48, 0x5e, 0x5f, 0xca, 0x63, 0x73, 0x92, 0xca, 0xdf, 0xce, 0xb0, 0x4d, 0x29, 0x06, 0x5c,
	0xf2, 0xa7, 0x77, 0xa9, 0xc4, 0x7d, 0x72, 0x29, 0xf7, 0xd1, 0x59, 0x7e, 0xd2, 0x8f, 0x3e, 0x27,
	0x6b, 0xf0, 0xdf, 0xe0, 0x08, 0xd2, 0x2d, 0xc8, 0x06, 0x09, 0xa0, 0xf2, 0x1a, 0x63, 0x77, 0xd2,
	0x8f, 0x07, 0xc7, 0xfa, 0x47, 0xa9, 0xb4, 0xb4, 0xb3, 0x30, 0x09, 0x4e, 0xa5, 0x66, 0xa4, 0x5f,
	0x62, 0x2c, 0x38, 0x9b, 0x78, 0xaf, 0x46, 0xfe, 0x78, 0x88, 0x69, 0xa1, 0xf4, 0xf0, 0xf6, 0x02,
	0x9b, 0x24, 0xb1, 0x8b, 0xc1, 0xd9, 0xa4, 0xc9, 0x89, 0x2b, 0xff, 0x2d, 0x83, 0x91, 0x29, 0x91,
	0xfa, 0xb7, 0x19, 0xa0, 0xbd, 0xc1, 0xb8, 0x1f, 0x45, 0xa4, 0xc2, 0x72, 0x59, 0x9c, 0xc2, 0x2e,
	0x04, 0x67, 0x93, 0x3a, 0xfc, 0xd2, 0xbf, 0x0f, 0x73, 0x38, 0x44, 0x29, 0x7c, 0xea, 0xa5, 0x87,
	0xef, 0x2d, 0x65, 0x94, 0x54, 0x7b, 0x97, 0xec, 0x42, 0xf0, 0xea, 0x90, 0xab, 0xa2, 0xbf, 0x60,
	0xba, 0x7f, 0x36, 0xf3, 0xc3, 0x11, 0x24, 0x20, 0x3f, 0x24, 0x39, 0x6b, 0x5c, 0xce, 0xd7, 0x96,
	0xca, 0x59, 0x24, 0xdf, 0xbb, 0x64, 0x5f, 0x51, 0xa1, 0x5c, 0x72, 0x6d, 0x83, 0xad, 0x71, 0x6c,
	0xe5, 0x8f, 0xb7, 0x31, 0xab, 0xa5, 0x94, 0x38, 0x7f, 0x17, 0x50, 0x29, 0xb9, 0xc9, 0x23, 0xb2,
	0xf9, 0x2d, 0x56, 0x38, 0xee, 0x47, 0x1e, 0x5f, 0x67, 0xf0, 0xb6, 0x82, 0xbd, 0x71, 0xdc, 0x8f,
	0x3a, 0xb0, 0xd4, 0xd7, 0x58, 0x1e, 0x3c, 0x07, 0x9d, 0x62, 0xef, 0x92, 0xcd, 0x9f, 0xf4, 0x0f,
	0xd8, 0xd6, 0xec, 0xf8, 0x4d, 0x34, 0x1a, 0xf4, 0xc7, 0xdc, 0xe7, 0xd0, 0x3b, 0xf6, 0x2e, 0xd9,
	0x9b, 0x02, 0x6c, 0x01, 0xd9, 0xd7, 0xd8, 0x36, 0x65, 0x49, 0x3f, 0xee, 0x43, 0x84, 0x72, 0x13,
	0xe4, 0x61, 0xcf, 0xe0, 0xf0, 0x0e, 0x81, 0xf5, 0x5b, 0x6c, 0xc3, 0x8f, 0x8f, 0xbd, 0x61, 0x14,
	0xf3, 0x84, 0xb4, 0xb9, 0x77, 0xc9, 0x5e, 0xf7, 0xe3, 0xe3, 0x46, 0x14, 0x0b, 0x54, 0x14, 0x0e,
	0x78, 0x46, 0x12, 0x28, 0x27, 0x1c, 0xe8, 0x3b, 0xac, 0x00, 0x28, 0x3e, 0xe1, 0x02, 0x29, 0x00,
	0xc4, 0x2e, 0xcc, 0x69, 0x87, 0x15, 0x4e, 0xc7, 0xfd, 0xa9, 0x77, 0x3a, 0x1a, 0x62, 0x4a, 0x02,
	0x24, 0x40, 0x0e, 0x46, 0x43, 0x89, 0x9c, 0x0d, 0x66, 0x98, 0x95, 0x04, 0xd2, 0x1a, 0xcc, 0x60,
	0xc4, 0xd1, 0xcc, 0x1b, 0x46, 0x83, 0x19, 0xe6, 0x24, 0x18, 0x71, 0x34, 0x6b, 0x44, 0x83, 0x99,
	0x7e, 0x93, 0xad, 0x8f, 0x66, 0x9e, 0x3f, 0x98, 0x96, 0x37, 0x09, 0xb3, 0x36, 0x9a, 0x99, 0x83,
	0x29, 0x08, 0x1c, 0xcd, 0xb0, 0x38, 0x28, 0x6f, 0x09, 0x81, 0xa3, 0x99, 0xc5, 0xcb, 0x0c, 0x8e,
	0x3c, 0x7d, 0xc4, 0xe7, 0xb0, 0x9d, 0x20, 0x4f, 0x1f, 0xd1, 0x24, 0x38, 0x12, 0xe6, 0x7e, 0x59,
	0x45, 0xd2, 0xe4, 0xe3, 0xc1, 0x8c, 0x33, 0x6a, 0x42, 0x95, 0x78, 0x30, 0x03, 0x3e, 0x42, 0x01,
	0xdb, 0x15, 0x05, 0x45, 0x5c, 0x27, 0x43, 0xe4, 0xd2, 0x05, 0xea, 0x64, 0x28, 0xb8, 0x00, 0x05,
	0x5c, 0x57, 0x15, 0x14, 0x70, 0xed, 0xb0, 0x42, 0x34, 0x88, 0x91, 0xed, 0x9a, 0x50, 0x04, 0x20,
	0xa4, 0x25, 0x47, 0x02, 0xe3, 0x75, 0x15, 0x09, 0x9c, 0x0f, 0x58, 0x69, 0x34, 0x98, 0xc0, 0x24,
	0xf8, 0x52, 0xdc, 0x20, 0x3c, 0x43, 0x20, 0x5f, 0x8d, 0x84, 0x64, 0x10, 0x0c, 0xfd, 0xf2, 0xcd,
	0x34, 0x49, 0x3d, 0x18, 0xfa, 0x60, 0xdb, 0x7e, 0x38, 0xf3, 0x82, 0x59, 0xb9, 0x2c, 0x6c, 0xdb,
	0x0f, 0x67, 0x3d, 0xbe, 0x1e, 0x80, 0x88, 0x66, 0xfd, 0xf2, 0x2d, 0xa1, 0x73, 0x3f, 0x9c, 0x39,
	0xb3, 0xbe, 0x40, 0xc5, 0xb3, 0x7e, 0xf9, 0xb6, 0x82, 0x72, 0x13, 0x54, 0x74, 0xdc, 0x2f, 0xef,
	0x08, 0xbf, 0x01, 0xae, 0xe3, 0x84, 0xeb, 0xb8, 0x5f, 0xbe, 0xa3, 0xa0, 0xdc, 0xe3, 0x3e, 0xad,
	0xc6, 0x63, 0x6e, 0x84, 0xbb, 0x84, 0x83, 0xd5, 0x78, 0x9c, 0x2c, 0xd5, 0x63, 0x6e, 0x84, 0xf7,
	0x54, 0xa4, 0x30, 0x02, 0x20, 0x5f, 0x8d, 0xfb, 0x87, 0xfe, 0xb8, 0x7c, 0x4f, 0xce, 0x70, 0x76,
	0xfa, 0xb8, 0xc9, 0x61, 0xd2, 0x08, 0x8f, 0xd1, 0x4e, 0xf7, 0x53, 0x46, 0x78, 0x9c, 0xb2, 0xd3,
	0x63, 0xb4, 0xd3, 0x83, 0x34, 0x09, 0xb7, 0xd3, 0x57, 0xd9, 0x36, 0x1f, 0x68, 0x3a, 0xf4, 0xe2,
	0x7e, 0x78, 0xe4, 0xc7, 0xe5, 0x0a, 0xe9, 0xb2, 0x09, 0xf0, 0xee, 0xd0, 0xe5, 0x50, 0xfd, 0x3e,
	0x29, 0x34, 0x1d, 0x7a, 0x51, 0x34, 0x2e, 0x7f, 0x85, 0x88, 0x8a, 0x48, 0xe4, 0x44, 0x63, 0x95,
	0x22, 0x1e, 0x8f, 0xcb, 0xef, 0xa7, 0x29, 0xdc, 0xf1, 0x58, 0xbf, 0xc7, 0xd8, 0x64, 0x36, 0x8e,
	0x3c, 0x9c, 0xd3, 0x07, 0xa4, 0x4d, 0x11, 0x60, 0x6d, 0x3e, 0xa5, 0x5b, 0x6c, 0x83, 0x13, 0xc4,
	0x83, 0xf2, 0x57, 0xc5, 0x02, 0x00, 0xc0, 0xe5, 0xd6, 0xe2, 0xa8, 0xc3, 0x20, 0x2a, 0x7f, 0x4d,
	0xb8, 0x0c, 0x40, 0x6a, 0x41, 0x04, 0xc8, 0xd9, 0xe1, 0xa1, 0x37, 0x8a, 0x46, 0xc3, 0xf2, 0x87,
	0x02, 0x39, 0x3b, 0x3c, 0x6c, 0x45, 0xa3, 0xa1, 0x7e, 0x97, 0x15, 0xe3, 0x93, 0xe9, 0xd4, 0x1f,
	0xc3, 0x2e, 0xfc, 0x75, 0xca, 0x18, 0x05, 0x04, 0xb5, 0x86, 0xd2, 0xd2, 0xfe, 0x59, 0x7c, 0x3c,
	0x0c, 0xcb, 0x55, 0xd5, 0xd2, 0x26, 0x87, 0xe9, 0x1f, 0xb3, 0xab, 0xe9, 0xc4, 0x83, 0xb9, 0x6d,
	0xc4, 0x65, 0x65, 0xec, 0x2b, 0xa9, 0xec, 0xc3, 0xf3, 0x5c, 0x85, 0x6d, 0x52, 0x06, 0x42, 0xd2,
	0x5f, 0xe3, 0xc6, 0xc8, 0xd8, 0x0c, 0xd3, 0x90, 0x4a, 0x13, 0x85, 0x03, 0xa4, 0xf9, 0x5c, 0xa1,
	0x71, 0xc2, 0x01, 0xa7, 0x79, 0x9f, 0x6d, 0x89, 0xb4, 0x83, 0x44, 0x13, 0xae, 0x5e, 0xc6, 0x2e,
	0x51, 0xee, 0x11, 0x54, 0x22, 0x23, 0x20, 0x55, 0x28, 0xa8, 0x28, 0x2d, 0xa4, 0xa8, 0xa4, 0x52,
	0x91, 0x4a, 0xa5, 0x68, 0x45, 0xe1, 0x81, 0x44, 0xbf, 0x41, 0x44, 0x0c, 0x63, 0x44, 0xa5, 0x89,
	0x05, 0xcd, 0x5f, 0x57, 0x68, 0x5c, 0xa2, 0xf9, 0x80, 0x8f, 0xf6, 0x38, 0xd1, 0xe9, 0x6f, 0x64,
	0x68, 0x7e, 0x25, 0x0a, 0x80, 0x14, 0x99, 0x54, 0xea, 0x37, 0x53, 0x64, 0x42, 0xab, 0x6f, 0x30,
	0x4d, 0x09, 0x07, 0xa4, 0xfc, 0xad, 0x0c, 0x0d, 0xbb, 0x9d, 0x04, 0x85, 0x90, 0x29, 0xbc, 0x01,
	0x29, 0xff, 0xae, 0xa0, 0x2c, 0x91, 0x4f, 0x70, 0x32, 0xd8, 0x4e, 0x84, 0x5f, 0x20, 0xdd, 0x6f,
	0x67, 0x68, 0x45, 0x37, 0x85, 0x77, 0xa4, 0x06, 0x47, 0x0f, 0x41, 0xd2, 0xdf, 0x49, 0x0d, 0x8e,
	0x7e, 0x02, 0xc4, 0xb0, 0xa3, 0x9e, 0xf6, 0xc7, 0x27, 0x7e, 0x6d, 0x1d, 0x2b, 0x9d, 0x8a, 0xc7,
	0x6e, 0xaf, 0xde, 0x95, 0xa1, 0xa4, 0x05, 0x0c, 0x1e, 0x32, 0xa8, 0xb8, 0x82, 0x22, 0x63, 0x0f,
	0x8f, 0x61, 0xe0, 0x23, 0x0a, 0x13, 0xd5, 0x9f, 0x29, 0x58, 0xe5, 0x5f, 0xe4, 0xf1, 0xa8, 0xd8,
	0x1f, 0xc0, 0xf9, 0x51, 0xff, 0x38, 0xb5, 0x67, 0x2f, 0xd6, 0x86, 0x48, 0xa6, 0xd6, 0x48, 0xdf,
	0x61, 0xeb, 0xc1, 0x49, 0x3c, 0x3b, 0x89, 0xa9, 0x36, 0x7c, 0x6f, 0x15, 0x0f, 0x52, 0x41, 0x50,
	0xe2, 0x2f, 0xfd, 0xfb, 0x14, 0x94, 0x71, 0x3c, 0xe6, 0x5b, 0x7a, 0x69, 0xc9, 0x49, 0x91, 0x78,
	0x05, 0x9d, 0x08, 0x5b, 0x37, 0x1e, 0xeb, 0x0f, 0x59, 0x7e, 0x76, 0x12, 0x1d, 0x53, 0x45, 0xb4,
	0x52, 0x55, 0xa0, 0xe1, 0xb5, 0xc2, 0x49, 0x74, 0x0c, 0x43, 0xce, 0x82, 0x19, 0x17, 0x47, 0x15,
	0xd0, 0xca, 0x21, 0x05, 0x1d, 0x4f, 0x06, 0xc1, 0xac, 0x33, 0x1b, 0x47, 0xfa, 0xb7, 0xd8, 0xda,
	0x51, 0x18, 0x9c, 0xcc, 0x78, 0x61, 0x50, 0x7a, 0x78, 0x77, 0x15, 0x2f, 0x27, 0x82, 0x4d, 0x83,
	0xff, 0xd0, 0xbf, 0xcd, 0xd6, 0xa7, 0xaf, 0xf9, 0x34, 0x37, 0xce, 0x37, 0x11, 0x52, 0x01, 0xe3,
	0xf4, 0x35, 0x4c, 0xf1, 0x09, 0x2b, 0x46, 0x7e, 0x4c, 0x15, 0x5b, 0x81, 0xf3, 0x3e, 0x58, 0xc5,
	0x2b, 0x09, 0x21, 0x3f, 0x45, 0x7e, 0x8c, 0xc5, 0xdf, 0x67, 0x73, 0x2e, 0x50, 0xe4, 0x42, 0xde,
	0x5f, 0x25, 0x44, 0xa5, 0x85, 0x24, 0xae, 0x3e, 0xd7, 0x0a, 0x6c, 0x1d, 0xc9, 0x2a, 0x4f, 0xb0,
	0xdc, 0x4b, 0x2d, 0x2c, 0x3f, 0x73, 0x41, 0xf9, 0x95, 0xa1, 0x33, 0x17, 0x9d, 0x26, 0xe1, 0x50,
	0x95, 0x1c, 0x5e, 0xd7, 0x27, 0xfd, 0x33, 0x38, 0xb7, 0x7e, 0x8c, 0xe7, 0xa9, 0xb9, 0xe5, 0x85,
	0xe2, 0x4f, 0xba, 0x04, 0x9d, 0x5e, 0x69, 0xb9, 0x2b, 0x1f, 0xe1, 0x51, 0x46, 0x59, 0x55, 0x28,
	0xfd, 0xfd, 0xf8, 0xd8, 0x0f, 0xa5, 0xc7, 0x6e, 0xd9, 0x09, 0xa0, 0xf2, 0x69, 0x6a, 0x08, 0xb1,
	0x9c, 0x5f, 0xc0, 0xf4, 0x8b, 0x4c, 0x9b, 0x5f, 0x47, 0x50, 0x8a, 0xff, 0x50, 0x8e, 0xd4, 0xfc,
	0xb9, 0x35, 0xac, 0x54, 0x53, 0x86, 0xc0, 0xe5, 0xd3, 0xaf, 0xcb, 0xe5, 0xa6, 0xe3, 0x3c, 0x5f,
	0xcc, 0xca, 0x1e, 0xbb, 0xb6, 0x6c, 0xb9, 0xf4, 0x8f, 0xa9, 0x8a, 0xe6, 0xd4, 0xe7, 0x9f, 0x2f,
	0xa8, 0xdc, 0x7e, 0xc6, 0x6e, 0xae, 0x58, 0xb3, 0x85, 0x90, 0xcf, 0x2c, 0x86, 0x3c, 0x2c, 0x14,
	0xaf, 0x7f, 0x61, 0x45, 0x36, 0x6d, 0xfe, 0xbb, 0xf2, 0xfb, 0x39, 0x34, 0xef, 0x68, 0x1a, 0xc5,
	0xe1, 0x09, 0xe6, 0x02, 0x5d, 0xc9, 0x05, 0x5b, 0x14, 0xed, 0x7b, 0x8c, 0x1d, 0x05, 0x71, 0x80,
	0xa7, 0x56, 0x8a, 0xf8, 0xc5, 0x43, 0x84, 0x22, 0xc5, 0x4b, 0xc8, 0x61, 0xb7, 0x86, 0x27, 0x7e,
	0xc4, 0xd5, 0x5d, 0xb6, 0xfd, 0x3a, 0x1c, 0xc5, 0x4a, 0x3d, 0x8e, 0x39, 0xe0, 0x1b, 0xe7, 0x4a,
	0x4b, 0xb3, 0x40, 0xf1, 0xce, 0x21, 0xb2, 0x78, 0x7f, 0xc2, 0x36, 0xd0, 0x2c, 0x11, 0xe5, 0x85,
	0xf7, 0xcf, 0x15, 0x47, 0xb4, 0x10, 0xe3, 0xf4, 0x53, 0xff, 0x2e, 0x5b, 0x9b, 0xf8, 0x60, 0x3a,
	0xcc, 0x0f, 0x95, 0x73, 0xf9, 0x39, 0x25, 0xc4, 0x2b, 0xff, 0xa1, 0xf7, 0xe6, 0xac, 0xbf, 0xbe,
	0xa2, 0x81, 0xa5, 0x8a, 0x38, 0x37, 0xe4, 0xd6, 0x71, 0xa9, 0x2a, 0xdf, 0xc6, 0x6d, 0x60, 0xb9,
	0x5d, 0xcf, 0xe9, 0xf9, 0x54, 0xfa, 0xec, 0xbd, 0xf3, 0x4d, 0xa8, 0xdf, 0x66, 0x05, 0xb9, 0x02,
	0xd8, 0xbf, 0x90, 0xcf, 0xfa, 0x57, 0xd8, 0x56, 0xba, 0x68, 0xc9, 0x72, 0x82, 0xcd, 0x89, 0x52,
	0xad, 0x54, 0xda, 0xe8, 0x8d, 0x4b, 0xcc, 0xaa, 0x7f, 0x92, 0xac, 0x06, 0xf6, 0xca, 0x6e, 0xae,
	0x48, 0x3c, 0xd2, 0xfc, 0x95, 0x87, 0xd8, 0x53, 0x5c, 0x30, 0x32, 0x4f, 0x0d, 0xf0, 0x43, 0x99,
	0x24, 0x7f, 0x6e, 0x0d, 0x2b, 0x07, 0xd8, 0xda, 0x5b, 0x65, 0xd5, 0x9f, 0x39, 0x28, 0xfe, 0x24,
	0x87, 0x9d, 0x0c, 0xae, 0xef, 0x24, 0xa0, 0x0e, 0x5a, 0xf0, 0xf9, 0xc8, 0x27, 0x4b, 0xd1, 0x93,
	0x7e, 0x8f, 0x95, 0xf0, 0x97, 0x6a, 0x25, 0x86, 0x20, 0x5e, 0x04, 0xa8, 0x2b, 0x94, 0x4b, 0x77,
	0xe5, 0xbe, 0xc7, 0x36, 0x06, 0xc1, 0x64, 0xd2, 0x9f, 0xe2, 0xd9, 0x7e, 0x7b, 0x49, 0x86, 0x17,
	0xe3, 0x7b, 0x44, 0x68, 0x0b, 0x0e, 0xfd, 0x01, 0xdb, 0x1c, 0x0d, 0xc7, 0xbe, 0x17, 0x8f, 0x26,
	0x7e, 0x70, 0x12, 0x53, 0xff, 0xa3, 0x04, 0x30, 0x17, 0x41, 0x40, 0x72, 0xdc, 0x0f, 0x87, 0x92,
	0x04, 0x9b, 0x6c, 0x25, 0x80, 0x09, 0x92, 0xdb, 0xac, 0x30, 0x0b, 0x47, 0x41, 0x38, 0x8a, 0xdf,
	0x50, 0xa7, 0x4d, 0x3e, 0xeb, 0x3b, 0xac, 0x88, 0xed, 0x2b, 0x50, 0x1d, 0xfb, 0x6c, 0x05, 0x04,
	0xb4, 0x78, 0xb3, 0x31, 0x38, 0x89, 0xf1, 0xd4, 0x8d, 0xad, 0xb6, 0x8d, 0xe0, 0x24, 0xe6, 0xc7,
	0xed, 0x1d, 0x56, 0x04, 0x14, 0x6e, 0x97, 0xd8, 0x6c, 0x03, 0xda, 0x5d, 0x9e, 0x51, 0x65, 0xbf,
	0xb3, 0xa4, 0xf6, 0x3b, 0x7f, 0x81, 0xad, 0xf1, 0x0e, 0x0c, 0x3f, 0xcf, 0x96, 0x1e, 0xde, 0x58,
	0xde, 0x9f, 0xb1, 0x91, 0x48, 0x7f, 0xc2, 0x36, 0x95, 0x05, 0x8f, 0xca, 0x5b, 0xdc, 0xc1, 0xee,
	0x9c, 0x17, 0x6b, 0x76, 0x8a, 0xa3, 0xf2, 0xa3, 0x0c, 0x96, 0x3e, 0x87, 0x27, 0x83, 0xcf, 0xfd,
	0x18, 0x16, 0xf7, 0xb5, 0x3f, 0x3a, 0x3a, 0x16, 0x3b, 0x18, 0x3d, 0x41, 0x91, 0xf5, 0x9a, 0x37,
	0x86, 0xf8, 0x34, 0x71, 0x1b, 0x2b, 0x72, 0x08, 0x9f, 0xe8, 0x3d, 0x56, 0x42, 0x34, 0x4e, 0x15,
	0x57, 0x17, 0x39, 0x70, 0xb2, 0x9f, 0xa8, 0x29, 0xe9, 0x62, 0x41, 0xf0, 0x1f, 0xa8, 0x79, 0x84,
	0xdb, 0x0e, 0x78, 0xde, 0x2f, 0x27, 0x5e, 0x82, 0xa5, 0xd9, 0x62, 0x5e, 0x92, 0xc4, 0x8b, 0x6e,
	0xf2, 0x51, 0xaa, 0xcd, 0xbf, 0xb3, 0x82, 0x55, 0x29, 0xea, 0xd4, 0x2d, 0x2f, 0x97, 0xda, 0xf2,
	0x60, 0x3a, 0x68, 0xb0, 0xd5, 0xd3, 0x41, 0xbc, 0x2d, 0xe8, 0x2a, 0xbf, 0x9d, 0x61, 0xdb, 0xbc,
	0x23, 0xd8, 0x87, 0x67, 0xa8, 0x17, 0xd2, 0x6e, 0x95, 0x99, 0x73, 0xab, 0x9b, 0x6c, 0x63, 0x34,
	0x55, 0xcd, 0xbd, 0x3e, 0x9a, 0x72, 0x5b, 0x2b, 0xa6, 0xcc, 0x5d, 0xcc, 0x94, 0x32, 0xae, 0xf3,
	0x6a, 0x5c, 0x93, 0x79, 0x49, 0x9f, 0xd1, 0xf4, 0x7c, 0x75, 0x7e, 0x49, 0x76, 0x4c, 0xb3, 0x2b,
	0x02, 0x54, 0x0a, 0x9a, 0x6f, 0x9b, 0x9e, 0x13, 0xf7, 0x49, 0x2e, 0xc9, 0xa7, 0x72, 0x89, 0x8c,
	0x82, 0xb5, 0x8b, 0x44, 0x81, 0x98, 0xde, 0xba, 0x32, 0xbd, 0x7f, 0x98, 0xc3, 0x22, 0x86, 0x33,
	0x85, 0xfe, 0x24, 0x38, 0xf5, 0x57, 0xa7, 0x2e, 0x35, 0xf6, 0xb3, 0x73, 0xb1, 0xff, 0xcb, 0x72,
	0xe2, 0x39, 0x3e, 0xf1, 0xf7, 0x97, 0x67, 0x26, 0x1a, 0xe2, 0xbc, 0xb9, 0xe7, 0xd3, 0x73, 0x7f,
	0xc0, 0x36, 0x87, 0x27, 0x61, 0x9f, 0x0a, 0xa1, 0x81, 0x48, 0x5b, 0x02, 0xe6, 0xf8, 0x03, 0xd8,
	0x7a, 0x24, 0xc9, 0x14, 0x68, 0x30, 0x6f, 0x49, 0xbe, 0x6e, 0xe4, 0x0f, 0x16, 0xd2, 0xdf, 0xc6,
	0x17, 0xa7, 0xbf, 0xc2, 0x62, 0xfa, 0x7b, 0xc0, 0x36, 0x69, 0x01, 0x07, 0xc1, 0xc9, 0x14, 0x33,
	0x59, 0xde, 0x2e, 0x21, 0xac, 0x0e, 0x20, 0xc8, 0x01, 0x87, 0x6f, 0x62, 0x9f, 0x08, 0x18, 0x27,
	0x28, 0x02, 0x04, 0xd1, 0x72, 0xcd, 0xde, 0x5c, 0x60, 0xcd, 0x2a, 0x7f, 0x92, 0xc5, 0x3d, 0x0e,
	0xb7, 0xb3, 0xc3, 0xfe, 0x74, 0x78, 0xd1, 0xf7, 0x66, 0x0a, 0x87, 0x12, 0xac, 0x3a, 0xcb, 0x87,
	0xfd, 0xd8, 0xa7, 0xe5, 0xe3, 0xbf, 0xb9, 0xc2, 0x27, 0x61, 0x14, 0x7b, 0xd1, 0xe8, 0xd7, 0x7d,
	0x72, 0xbd, 0x22, 0x87, 0x38, 0xa3, 0x5f, 0xf7, 0xf5, 0xc7, 0x2c, 0x3f, 0x0c, 0x83, 0x19, 0xd5,
	0x48, 0xe7, 0x0e, 0x04, 0x74, 0x70, 0x7e, 0x82, 0x7f, 0xf5, 0xcf, 0x58, 0x69, 0x18, 0x0d, 0x66,
	0xb0, 0xe4, 0xfd, 0xf0, 0xf3, 0x95, 0x4d, 0x64, 0x95, 0x3d, 0x21, 0xdf, 0xbb, 0x64, 0x33, 0x78,
	0xb4, 0xf9, 0x93, 0xde, 0x5d, 0x5a, 0x2c, 0x7d, 0x78, 0x9e, 0xb0, 0x0b, 0xd5, 0x4a, 0xd7, 0xb1,
	0xee, 0x9f, 0x9b, 0x42, 0xe5, 0x7b, 0x58, 0x42, 0x2d, 0x57, 0x0d, 0xec, 0x35, 0x0b, 0xfd, 0x81,
	0x37, 0xf6, 0x4f, 0x7d, 0x51, 0xb7, 0x17, 0x01, 0xd2, 0x06, 0x40, 0xc5, 0x60, 0x3b, 0xe7, 0xa8,
	0x72, 0x91, 0x02, 0xa3, 0xf2, 0xaf, 0x28, 0xe9, 0xa0, 0x8c, 0x0b, 0xe6, 0x74, 0x49, 0xbc, 0x98,
	0xd3, 0xe5, 0x1e, 0x9a, 0x55, 0xf7, 0x50, 0xb5, 0x4a, 0xca, 0xa5, 0xaa, 0x24, 0xfd, 0x3b, 0x6c,
	0x0d, 0x34, 0x17, 0x69, 0xbb, 0x72, 0x9e, 0xa1, 0xe9, 0xb5, 0x25, 0x32, 0x54, 0x9e, 0xa2, 0xe6,
	0x7e, 0x18, 0x06, 0xa1, 0x37, 0x89, 0x8e, 0x96, 0x9e, 0x0c, 0x74, 0x96, 0xe7, 0x6d, 0x42, 0xf2,
	0x42, 0xf8, 0x2d, 0xb3, 0x53, 0x4e, 0xc9, 0x4e, 0xbf, 0x95, 0xc1, 0x85, 0x40, 0x69, 0xa9, 0xa6,
	0xc6, 0x2a, 0xd1, 0xb7, 0x58, 0xc1, 0x3f, 0xc3, 0xfd, 0x89, 0xc4, 0x6f, 0xf8, 0x67, 0x33, 0xde,
	0xa3, 0x9c, 0xb7, 0x7c, 0xee, 0x9c, 0xd2, 0x4e, 0xdd, 0x02, 0x4e, 0x29, 0x04, 0x4f, 0xc6, 0xf1,
	0x68, 0xd6, 0xe7, 0xef, 0xbb, 0x7e, 0x78, 0xe2, 0x47, 0xb1, 0xfe, 0x69, 0x2a, 0x04, 0xef, 0x2d,
	0x1a, 0x49, 0x72, 0x28, 0x11, 0xb8, 0x7c, 0x2d, 0x74, 0x96, 0x3f, 0x0c, 0x86, 0x6f, 0xc4, 0xec,
	0xe1, 0x77, 0x25, 0x26, 0xe7, 0x54, 0xc6, 0x9d, 0x8d, 0xdf, 0xfc, 0xbc, 0x47, 0xfd, 0xdd, 0x0c,
	0xbe, 0xe1, 0x1d, 0xfa, 0xd1, 0x80, 0xbb, 0xc8, 0xab, 0x90, 0xff, 0xe6, 0xe3, 0x15, 0xed, 0x8d,
	0xc9, 0xab, 0xb0, 0x01, 0x28, 0x7c, 0x21, 0x27, 0x5f, 0xf4, 0x15, 0xed, 0xf5, 0xe3, 0xd7, 0x02,
	0x11, 0x11, 0x02, 0x5f, 0xf3, 0xae, 0x47, 0x88, 0xb8, 0xcb, 0x58, 0xe4, 0x87, 0xa3, 0xfe, 0xd8,
	0x9b, 0x9e, 0x4c, 0xb8, 0x85, 0x8b, 0x76, 0x11, 0x21, 0xdd, 0x93, 0x09, 0xf0, 0x0d, 0x71, 0x58,
	0x9e, 0x2b, 0x8a, 0xf6, 0xfa, 0x70, 0x06, 0x7c, 0x95, 0x3f, 0xca, 0xb0, 0x1b, 0x72, 0x03, 0x89,
	0xe2, 0x7e, 0x1c, 0xc9, 0x15, 0x38, 0xe7, 0x0d, 0xb6, 0x5a, 0x6f, 0x66, 0xcf, 0xa9, 0x37, 0x73,
	0x73, 0xf5, 0xe6, 0xaa, 0xbd, 0x76, 0xae, 0x6e, 0x5f, 0x5b, 0xa8, 0xdb, 0x65, 0x62, 0x5f, 0xbf,
	0x48, 0x62, 0xff, 0xb7, 0x39, 0xac, 0x73, 0x92, 0x49, 0xe9, 0xdb, 0x2c, 0x3b, 0x1a, 0xf2, 0x17,
	0x2d, 0x79, 0x3b, 0x3b, 0x3a, 0xf7, 0xf5, 0xfc, 0xfc, 0xa6, 0x98, 0xbd, 0xc0, 0xa6, 0x98, 0x5b,
	0xb2, 0x29, 0xaa, 0x3b, 0x7a, 0x7e, 0x6e, 0x47, 0xff, 0x72, 0xce, 0x0b, 0xd2, 0xf1, 0x36, 0x54,
	0xc7, 0x4b, 0x8c, 0x5c, 0x48, 0x19, 0xf9, 0x4b, 0xdc, 0x5e, 0xff, 0x1f, 0x1d, 0x0c, 0xfe, 0x38,
	0x83, 0xe9, 0xbe, 0x7f, 0x74, 0x14, 0xfa, 0x47, 0xfd, 0xd8, 0xff, 0xff, 0xc6, 0x43, 0xff, 0x1a,
	0xbb, 0xb5, 0x7c, 0x62, 0x90, 0x84, 0xe6, 0x17, 0x2a, 0xf3, 0x45, 0x0b, 0x95, 0x9d, 0x5f, 0xa8,
	0xbb, 0x8c, 0xf1, 0xa1, 0x11, 0x4d, 0x55, 0x07, 0x40, 0x38, 0xba, 0xf2, 0xe7, 0x39, 0x4c, 0xfd,
	0x68, 0x3c, 0xba, 0x44, 0xe1, 0xcd, 0xc2, 0x60, 0xe6, 0x87, 0xbc, 0xdc, 0x54, 0x93, 0xe0, 0x62,
	0x21, 0xb0, 0xc8, 0xa6, 0x66, 0xc3, 0x83, 0xb9, 0x65, 0xc7, 0xde, 0xd4, 0xc7, 0x17, 0x91, 0xa2,
	0xf2, 0xf1, 0x57, 0x57, 0xca, 0xb3, 0x6e, 0xb3, 0xd2, 0xd4, 0x3f, 0x8b, 0xd5, 0x7b, 0x1a, 0xa5,
	0x87, 0x1f, 0x5d, 0x44, 0xac, 0xc2, 0x06, 0xa5, 0x0f, 0x3c, 0xd2, 0xed, 0x8e, 0xdd, 0xf9, 0x2e,
	0xd5, 0x37, 0x2e, 0x22, 0x6f, 0x49, 0xb3, 0xea, 0x7b, 0x2c, 0x17, 0x9c, 0x4d, 0x56, 0xd6, 0x61,
	0x4b, 0x84, 0x04, 0x67, 0x93, 0xbd, 0x4b, 0x36, 0x70, 0x81, 0xc5, 0x96, 0x14, 0x60, 0x17, 0xb2,
	0xd8, 0xb9, 0x85, 0x98, 0x78, 0x89, 0x51, 0x39, 0x62, 0x5f, 0xb9, 0x80, 0xc5, 0x17, 0x02, 0x36,
	0xf3, 0x53, 0x07, 0xec, 0x67, 0xac, 0xf2, 0xc5, 0x6b, 0xa0, 0xbf, 0xcf, 0xb6, 0x93, 0x47, 0x6f,
	0x34, 0xc4, 0x91, 0xb6, 0xec, 0x4d, 0xb9, 0x32, 0xad, 0x61, 0x54, 0x71, 0xb0, 0x63, 0xb6, 0xda,
	0xfe, 0x3f, 0x4b, 0x57, 0xeb, 0x5b, 0xab, 0x1c, 0x1f, 0xd6, 0x03, 0x76, 0xc9, 0xe0, 0x6c, 0xc2,
	0x35, 0xca, 0xe1, 0x3d, 0x98, 0xe0, 0x6c, 0x02, 0xba, 0xfc, 0xfd, 0xcc, 0x4a, 0x0b, 0x9e, 0x5b,
	0x7f, 0x2e, 0x79, 0xd1, 0x93, 0x2a, 0xa2, 0x72, 0xe9, 0x22, 0xea, 0x1b, 0x2c, 0x75, 0xb9, 0xc3,
	0xa3, 0x6a, 0x09, 0x34, 0xd1, 0x54, 0x44, 0x03, 0x2a, 0xa7, 0xdf, 0xcb, 0x32, 0x7d, 0x41, 0xa7,
	0xe8, 0xbc, 0x9c, 0x28, 0x2e, 0x88, 0x65, 0x95, 0x0b, 0x62, 0x1f, 0xb0, 0x6d, 0xa5, 0xb3, 0x08,
	0xf9, 0x2b, 0xc7, 0x93, 0xc9, 0x56, 0xd2, 0x5a, 0x84, 0x5c, 0xae, 0x92, 0xf1, 0xbe, 0x25, 0xa5,
	0x47, 0x49, 0xf6, 0x1c, 0x80, 0xca, 0x7d, 0xa1, 0xb5, 0xd4, 0x7d, 0xa1, 0x7b, 0xac, 0x34, 0xe9,
	0x9f, 0x79, 0xfe, 0x34, 0x0e, 0x47, 0x7e, 0x44, 0x5b, 0x19, 0x9b, 0xf4, 0xcf, 0x4c, 0x84, 0xe8,
	0xbb, 0x50, 0xf6, 0xf3, 0xf4, 0x03, 0xf8, 0x0d, 0xbe, 0x9a, 0x17, 0x09, 0x23, 0xc8, 0x57, 0xb6,
	0xc2, 0x5a, 0xf9, 0x51, 0x06, 0xfb, 0xe7, 0x48, 0x8a, 0x7b, 0xff, 0xf9, 0x7b, 0x3d, 0xb8, 0xc6,
	0xa9, 0x9a, 0x49, 0xb7, 0xec, 0x12, 0xc2, 0x30, 0x97, 0x3e, 0x60, 0x9b, 0xe3, 0x20, 0xf8, 0xfc,
	0x64, 0xa6, 0x64, 0xd3, 0xbc, 0x5d, 0x42, 0x18, 0x92, 0x7c, 0x85, 0x6d, 0x71, 0xdb, 0xf9, 0x43,
	0xa2, 0xc9, 0x53, 0x7b, 0x16, 0x81, 0x98, 0x74, 0x3f, 0xc1, 0x42, 0x4b, 0x5e, 0x01, 0x4b, 0xb6,
	0xb1, 0x55, 0xf7, 0xb2, 0x2a, 0x7f, 0x4a, 0x75, 0x4c, 0xc2, 0xb3, 0xfa, 0x0e, 0xd7, 0x5d, 0xc6,
	0xc2, 0x33, 0x6a, 0x80, 0x44, 0x62, 0x47, 0x08, 0xcf, 0x2c, 0x04, 0x00, 0x3a, 0x4e, 0xd0, 0x38,
	0x87, 0x62, 0x2c, 0xd1, 0xb7, 0x58, 0x21, 0x3c, 0xf3, 0x60, 0x03, 0x89, 0x48, 0xf9, 0x8d, 0xf0,
	0xac, 0x06, 0x8f, 0xdc, 0x7a, 0x02, 0x85, 0xdb, 0xde, 0x46, 0x4c, 0x28, 0x1c, 0x13, 0x4e, 0x75,
	0x33, 0x7f, 0xc8, 0x57, 0x95, 0x8f, 0xd9, 0x40, 0x00, 0x8d, 0x29, 0xd0, 0x1b, 0x62, 0x4c, 0x81,
	0xde, 0x61, 0xc5, 0xf0, 0x0c, 0x8f, 0x1f, 0x11, 0x95, 0x2a, 0x85, 0xf0, 0xcc, 0xe4, 0xcf, 0x80,
	0x8c, 0x25, 0x12, 0x2b, 0x95, 0x42, 0x2c, 0x90, 0xf7, 0xd9, 0x66, 0x78, 0xe6, 0xbd, 0x0a, 0xfb,
	0x13, 0x1f, 0x48, 0xa8, 0x50, 0x61, 0xe1, 0x59, 0x13, 0x40, 0x26, 0xbf, 0xb5, 0x58, 0x0a, 0xcf,
	0xbc, 0xe0, 0xd4, 0x0f, 0x39, 0x41, 0x49, 0xa8, 0xd6, 0x3b, 0xf5, 0x43, 0xc0, 0xdf, 0xe1, 0x9a,
	0x0f, 0xc2, 0x01, 0x47, 0x6f, 0x8a, 0xc1, 0xeb, 0xe1, 0x00, 0xb9, 0xd9, 0x20, 0x18, 0x8f, 0x47,
	0x11, 0xd5, 0x2d, 0xb4, 0xd7, 0x0b, 0xc8, 0x42, 0x85, 0xb8, 0x7d, 0x81, 0x0a, 0xf1, 0xf2, 0x62,
	0x85, 0x58, 0x79, 0x84, 0x1d, 0x7b, 0xec, 0xf0, 0x2d, 0x94, 0x36, 0xab, 0xde, 0x75, 0x1d, 0x60,
	0xdc, 0x63, 0x53, 0x0f, 0x1d, 0xce, 0x0f, 0xff, 0xef, 0x8b, 0x86, 0xca, 0x8f, 0xb2, 0x18, 0x3a,
	0x8a, 0x3a, 0xe7, 0xa8, 0xc1, 0x97, 0xcf, 0x7f, 0x95, 0x8a, 0x9b, 0x42, 0xe8, 0xbf, 0x92, 0x41,
	0x93, 0xd2, 0x26, 0xf7, 0x45, 0xda, 0xe4, 0xe7, 0x4b, 0x98, 0x2f, 0xab, 0x35, 0x55, 0x63, 0x9b,
	0x64, 0x29, 0x3e, 0x23, 0xca, 0x2d, 0xf7, 0x56, 0xf4, 0x4a, 0x85, 0x39, 0xed, 0x12, 0x3e, 0x3b,
	0xc0, 0x03, 0xc7, 0xb6, 0xed, 0xc4, 0x32, 0xfc, 0xf0, 0xf6, 0x45, 0x57, 0x18, 0xcf, 0xed, 0xe4,
	0x66, 0x57, 0x76, 0x72, 0x73, 0x17, 0xec, 0xe4, 0xfe, 0x61, 0x46, 0x5d, 0x2b, 0xc8, 0xab, 0x6f,
	0xf4, 0x5f, 0xa5, 0xab, 0xa1, 0xf8, 0xfa, 0x72, 0x95, 0x4a, 0x40, 0x52, 0xfb, 0x85, 0xdf, 0xfc,
	0xef, 0xff, 0xf1, 0xee, 0x3a, 0xd2, 0xc3, 0xcf, 0x3b, 0xfa, 0x6d, 0x85, 0xfa, 0x17, 0xd3, 0xd4,
	0x78, 0x9d, 0x54, 0x7f, 0x88, 0x57, 0x86, 0x45, 0x41, 0x77, 0x67, 0x85, 0x7c, 0x4e, 0x83, 0x17,
	0x8a, 0xa3, 0xca, 0xdf, 0xca, 0xa0, 0xaf, 0x22, 0x4a, 0xee, 0x51, 0xd7, 0xd8, 0x1a, 0xbf, 0x69,
	0x28, 0xde, 0xcb, 0xf2, 0x87, 0x85, 0x7b, 0xb4, 0xd9, 0xc5, 0x7b, 0xb4, 0xe0, 0x34, 0xb0, 0x91,
	0x70, 0x79, 0x62, 0x93, 0x2e, 0x4e, 0xfa, 0x67, 0xbc, 0x78, 0x8f, 0xf4, 0x72, 0xba, 0xc5, 0xbf,
	0x95, 0x6c, 0xfc, 0xdf, 0x51, 0x1b, 0x47, 0x8b, 0xdd, 0x86, 0x73, 0x5e, 0x6a, 0xfd, 0x1a, 0xbe,
	0x2e, 0x56, 0x9a, 0x32, 0x18, 0x1a, 0x55, 0x76, 0x85, 0x5c, 0x9c, 0x03, 0xd5, 0xa8, 0xbb, 0x8c,
	0x88, 0x5a, 0x7f, 0x8a, 0xb9, 0x5f, 0xff, 0x2a, 0xbb, 0xcc, 0x7d, 0x5d, 0xa1, 0xc4, 0xf0, 0xdb,
	0x02, 0xb0, 0xa4, 0xab, 0xfc, 0x01, 0x85, 0x20, 0x0e, 0x26, 0x43, 0x70, 0x85, 0x6a, 0x73, 0x65,
	0x7e, 0x76, 0xae, 0xcc, 0x87, 0x51, 0x93, 0x86, 0xb8, 0x1a, 0x87, 0x5b, 0x08, 0x6e, 0x4d, 0x91,
	0xae, 0xc2, 0xb8, 0x1a, 0x09, 0x15, 0x06, 0x63, 0x09, 0x80, 0x82, 0xe6, 0xcb, 0x0a, 0xc7, 0x27,
	0x8c, 0x25, 0x36, 0xa4, 0x60, 0x7c, 0x70, 0x5e, 0x07, 0x0c, 0xfd, 0xa9, 0x08, 0xbf, 0x31, 0x18,
	0x7f, 0x03, 0x9b, 0xea, 0x48, 0x72, 0xee, 0xbd, 0x7d, 0xd5, 0x72, 0xd9, 0x15, 0x3d, 0xb8, 0xdc,
	0x4f, 0xdb, 0x83, 0xfb, 0xe7, 0xe4, 0xd2, 0x48, 0x20, 0x5d, 0x9a, 0x6e, 0xad, 0xe3, 0x1b, 0xeb,
	0x8c, 0xbc, 0xb5, 0xde, 0xe1, 0xaf, 0x4c, 0xef, 0xd2, 0xa4, 0xd1, 0xe9, 0x69, 0x9d, 0x00, 0xe2,
	0x2e, 0x75, 0xfc, 0xdc, 0x12, 0xc7, 0x27, 0xf9, 0xa2, 0x71, 0x28, 0xe4, 0x83, 0xeb, 0x48, 0xe4,
	0x20, 0x18, 0x07, 0x21, 0xad, 0x0c, 0x20, 0xeb, 0xf0, 0x5c, 0x39, 0x65, 0x0f, 0x78, 0x9b, 0x2f,
	0xd5, 0xe0, 0x93, 0x01, 0x70, 0xbc, 0xfc, 0x86, 0x52, 0xe6, 0x0b, 0x0a, 0xd7, 0xb9, 0xee, 0xdf,
	0xb2, 0xfe, 0xe2, 0x18, 0x37, 0xb7, 0xd4, 0xb8, 0x3f, 0xbf, 0xd1, 0x4c, 0xec, 0x23, 0xfe, 0xf0,
	0xc4, 0x3f, 0xa1, 0xc2, 0x9c, 0xc6, 0xe2, 0x5d, 0x18, 0x2c, 0x14, 0xc5, 0xba, 0xc8, 0x83, 0xae,
	0xc6, 0x72, 0xc9, 0x8d, 0x18, 0xf8, 0x59, 0x09, 0x51, 0x69, 0x45, 0xcc, 0x64, 0x34, 0xf5, 0x78,
	0x27, 0xbf, 0xce, 0x4a, 0x8a, 0x5c, 0xca, 0xb2, 0x8b, 0x8e, 0xb3, 0xa0, 0x01, 0x96, 0xa7, 0x74,
	0x13, 0x6c, 0xc9, 0x2b, 0x82, 0x65, 0x63, 0xf6, 0xcf, 0x7e, 0xce, 0x63, 0xfe, 0x03, 0xea, 0xac,
	0x28, 0x9c, 0x29, 0xeb, 0x7f, 0x29, 0x03, 0x5f, 0xe4, 0x34, 0xb4, 0x6c, 0x2d, 0xff, 0x66, 0x06,
	0x43, 0x9c, 0x92, 0x17, 0x1f, 0x04, 0xfc, 0x01, 0x47, 0x4b, 0xd2, 0x20, 0x7f, 0xc6, 0x73, 0x8d,
	0xd2, 0xe7, 0xc1, 0x0b, 0x4f, 0xb5, 0xd4, 0x81, 0x62, 0x55, 0xa7, 0x7d, 0x85, 0xfe, 0x74, 0x96,
	0x78, 0x88, 0xd7, 0x19, 0x90, 0xe8, 0x88, 0x17, 0x07, 0x90, 0x6d, 0xe4, 0xa6, 0xb1, 0xe4, 0xa2,
	0x55, 0xe5, 0x08, 0x0f, 0x98, 0x4b, 0x78, 0x66, 0xe3, 0x37, 0x4b, 0xaf, 0x66, 0x7d, 0x8b, 0xad,
	0x73, 0x6a, 0xf1, 0x5d, 0xc3, 0xdd, 0x55, 0x6f, 0x35, 0x39, 0x95, 0x4d, 0xc4, 0x15, 0x73, 0xe1,
	0x16, 0x13, 0xda, 0x69, 0x45, 0xdf, 0x5e, 0xda, 0x2e, 0x97, 0xb2, 0x5d, 0xa5, 0xa3, 0x3a, 0xdf,
	0xc5, 0x8e, 0x25, 0x29, 0x71, 0xd9, 0xb4, 0xb8, 0x3f, 0xa3, 0xba, 0x44, 0x91, 0xf7, 0xb3, 0xc8,
	0x49, 0x1d, 0x3a, 0x72, 0x0b, 0x87, 0x0e, 0xe5, 0x24, 0x93, 0x9f, 0x3f, 0xc9, 0xa4, 0x0e, 0x0e,
	0x6b, 0x73, 0x07, 0x87, 0xf9, 0x5d, 0x6c, 0xfd, 0x02, 0xbb, 0xd8, 0xc6, 0x92, 0xc2, 0x7d, 0x82,
	0x0e, 0x1a, 0x06, 0x63, 0x5f, 0x9a, 0xeb, 0x11, 0xcb, 0xc3, 0xf3, 0xca, 0x77, 0x86, 0x83, 0x60,
	0x1a, 0x87, 0xc1, 0x78, 0xec, 0x87, 0x9c, 0xcf, 0xe6, 0xd4, 0x30, 0xdc, 0x91, 0x3f, 0xf5, 0x69,
	0x40, 0x32, 0x44, 0xde, 0xde, 0x4c, 0x80, 0xad, 0x61, 0xe5, 0x77, 0x28, 0x20, 0xfa, 0xd1, 0x9b,
	0xe9, 0x40, 0xec, 0x79, 0xef, 0xb3, 0xed, 0x64, 0x77, 0xe7, 0x4d, 0x49, 0xea, 0xa2, 0x88, 0xcd,
	0x9d, 0xb7, 0x25, 0x3f, 0x64, 0x9a, 0xf2, 0xd1, 0x91, 0xb8, 0x16, 0x03, 0x74, 0xdb, 0x00, 0x77,
	0x38, 0x98, 0x53, 0x56, 0xd9, 0x95, 0xd4, 0x5b, 0x64, 0x4e, 0x8a, 0x15, 0xd6, 0x65, 0x40, 0xd8,
	0x08, 0xe7, 0x57, 0x8d, 0x5e, 0xb2, 0x6d, 0xbe, 0xb3, 0x75, 0x82, 0xe1, 0xfe, 0x6c, 0x08, 0x99,
	0x0a, 0xfb, 0xeb, 0xf8, 0x1a, 0x23, 0x3b, 0xe2, 0x1f, 0xd9, 0xc8, 0x77, 0x66, 0x54, 0x31, 0xde,
	0x5e, 0xfd, 0x56, 0xcd, 0xc6, 0x8d, 0xba, 0x13, 0x0c, 0x2b, 0x16, 0xbb, 0xcc, 0x45, 0xf3, 0xcd,
	0xde, 0xe6, 0x51, 0xf3, 0x7d, 0x56, 0x52, 0x0a, 0xa2, 0x95, 0x6d, 0x29, 0x85, 0xc6, 0x66, 0x13,
	0x29, 0xa3, 0xf2, 0x9c, 0x5d, 0x6e, 0x8e, 0x83, 0xd7, 0xbc, 0xb1, 0xb4, 0x42, 0xdb, 0x47, 0xac,
	0x20, 0xee, 0xf6, 0x90, 0xb2, 0xb7, 0x56, 0x5e, 0xfe, 0xb1, 0x37, 0xe0, 0x17, 0xa8, 0xea, 0xb1,
	0x6b, 0x20, 0x98, 0xd7, 0x9e, 0xe7, 0x49, 0xff, 0x36, 0x2b, 0xca, 0x3b, 0x21, 0x2b, 0x6d, 0x21,
	0x29, 0x6c, 0x3c, 0x27, 0xc0, 0x00, 0xdf, 0x65, 0x6b, 0x30, 0x40, 0xa4, 0x7f, 0xc2, 0xd6, 0x46,
	0xb1, 0x3f, 0x11, 0x73, 0xdf, 0x59, 0xae, 0x1c, 0x95, 0xde, 0x9c, 0xb2, 0xf2, 0x7d, 0xb6, 0xce,
	0xed, 0x18, 0xe9, 0x9f, 0xa6, 0x99, 0xef, 0xae, 0x30, 0x1c, 0xba, 0x95, 0x60, 0x7f, 0xc2, 0x98,
	0x9c, 0x5b, 0x04, 0xb5, 0xbf, 0x2a, 0x62, 0x55, 0xed, 0xcf, 0xcf, 0x21, 0x42, 0xc2, 0x88, 0x95,
	0x40, 0x42, 0xfd, 0xb8, 0x3f, 0x3d, 0xf2, 0x23, 0xfd, 0xeb, 0x6c, 0x3d, 0x0e, 0xbc, 0xfe, 0x50,
	0x5c, 0xaf, 0xd4, 0x53, 0x32, 0xf8, 0x34, 0xed, 0xb5, 0x38, 0x30, 0x86, 0x43, 0xfd, 0x23, 0x56,
	0x8c, 0x03, 0xf2, 0x43, 0xb2, 0xd7, 0x32, 0xea, 0x42, 0x1c, 0xa0, 0x4f, 0x42, 0x4d, 0xa6, 0x49,
	0x6d, 0xc5, 0x80, 0xdf, 0x9c, 0x1b, 0xf0, 0xe6, 0x82, 0x08, 0x9c, 0x9c, 0x18, 0xf5, 0xd1, 0xe2,
	0xa8, 0x2b, 0x59, 0xe4, 0xd0, 0xc4, 0x75, 0xc2, 0x17, 0x9e, 0x7a, 0xd2, 0xe7, 0x71, 0xa1, 0x87,
	0x54, 0x1c, 0x56, 0xb0, 0x28, 0x4a, 0x97, 0x79, 0x8b, 0x8c, 0xeb, 0x95, 0xde, 0x22, 0x29, 0xec,
	0x82, 0x08, 0xf7, 0xca, 0x73, 0x56, 0x44, 0xa1, 0xbd, 0x93, 0x78, 0x41, 0xea, 0x77, 0x19, 0x4b,
	0x6e, 0xfd, 0x90, 0xd8, 0x9d, 0x55, 0x62, 0x83, 0x93, 0xd8, 0x26, 0x25, 0x7a, 0x27, 0xb0, 0xa7,
	0x95, 0xd0, 0xa8, 0xe6, 0xa9, 0x3f, 0x5d, 0x14, 0xfd, 0x97, 0x58, 0x49, 0x49, 0x31, 0x2b, 0x8f,
	0x87, 0x0a, 0xcd, 0xde, 0x25, 0x9b, 0x25, 0xd9, 0xa7, 0xb6, 0xc1, 0xd6, 0x7c, 0x90, 0x5c, 0xfd,
	0x2f, 0x19, 0x56, 0x92, 0xa4, 0xd3, 0x40, 0xd7, 0xd8, 0x66, 0xaf, 0x69, 0x59, 0x5e, 0xab, 0x7b,
	0x60, 0xb4, 0x5b, 0x0d, 0xed, 0x92, 0xae, 0xb1, 0x02, 0x87, 0x74, 0x8c, 0x17, 0xda, 0xdb, 0x9f,
	0xbc, 0x7b, 0xb7, 0xa1, 0x5f, 0x93, 0x34, 0x9e, 0xd5, 0xb3, 0x5d, 0xed, 0x7f, 0xbc, 0x03, 0xa8,
	0xce, 0x18, 0x87, 0xba, 0x46, 0xad, 0x6d, 0x6a, 0xff, 0x93, 0xc3, 0xae, 0xb2, 0x12, 0x87, 0x75,
	0x7b, 0x76, 0xc7, 0x68, 0x6b, 0x7f, 0x91, 0x22, 0x6c, 0xb6, 0x7b, 0xbd, 0x86, 0xf6, 0xbf, 0x38,
	0x4c, 0x0c, 0x62, 0xb4, 0xdb, 0xda, 0x8f, 0x39, 0xe4, 0x26, 0xbb, 0xcc, 0x21, 0xf5, 0x5e, 0xd7,
	0xb5, 0x7b, 0xed, 0xb6, 0x69, 0x6b, 0xff, 0x3b, 0xc5, 0xde, 0xee, 0xd5, 0x8d, 0xb6, 0xf6, 0x93,
	0x34, 0x7b, 0xf7, 0xa5, 0xf6, 0x0e, 0x20, 0xd5, 0x7f, 0xb7, 0x86, 0xaf, 0x7d, 0xf9, 0x66, 0xbc,
	0xcd, 0x59, 0x5c, 0x6f, 0xcf, 0x6c, 0xb7, 0x7b, 0xda, 0x25, 0xf9, 0x6c, 0xda, 0x76, 0xcf, 0xd6,
	0x32, 0xfa, 0x75, 0x76, 0x05, 0x9f, 0xeb, 0x7b, 0x3d, 0xcf, 0x36, 0x9f, 0xed, 0x9b, 0x8e, 0xab,
	0x65, 0xf5, 0xab, 0x5c, 0x05, 0x09, 0xb6, 0xda, 0x2f, 0xb5, 0x5c, 0x42, 0xfb, 0xc2, 0x32, 0xed,
	0x56, 0xc7, 0xec, 0xba, 0xa6, 0xad, 0xe5, 0xf5, 0x5b, 0xec, 0x3a, 0x07, 0x37, 0x4d, 0xc3, 0xdd,
	0xb7, 0x4d, 0x47, 0x8a, 0x59, 0xd3, 0x6f, 0xb2, 0xab, 0xf3, 0x28, 0x10, 0xb5, 0xae, 0xef, 0xb0,
	0x9b, 0x1c, 0xb1, 0x6b, 0xba, 0x30, 0xcd, 0x66, 0x6b, 0x57, 0x72, 0x6d, 0x48, 0x81, 0x29, 0x24,
	0xf0, 0x15, 0xa4, 0x5e, 0x8e, 0x44, 0x69, 0x45, 0x5d, 0x67, 0xdb, 0x1c, 0x68, 0x19, 0xf5, 0xa7,
	0xa6, 0xeb, 0xb5, 0xba, 0x1a, 0x93, 0xba, 0x36, 0xdb, 0xbd, 0xe7, 0x9e, 0x6d, 0x76, 0x7a, 0x07,
	0x66, 0x43, 0x2b, 0xe9, 0xd7, 0x98, 0x86, 0xa4, 0x3d, 0xdb, 0xf5, 0x1c, 0xd7, 0x70, 0xf7, 0x1d,
	0x6d, 0x53, 0x4a, 0x25, 0x01, 0xbd, 0x7d, 0x57, 0xdb, 0xd2, 0xaf, 0xb0, 0xad, 0x44, 0x42, 0xa7,
	0xd7, 0xd0, 0xb6, 0xe5, 0x40, 0xbb, 0x76, 0x6f, 0xdf, 0xe2, 0xb0, 0xcb, 0x92, 0x8c, 0x4b, 0x04,
	0x90, 0x26, 0xc9, 0xb8, 0x3b, 0x70, 0xd8, 0x15, 0xfd, 0x36, 0xbb, 0xc1, 0x61, 0x9d, 0xfd, 0xb6,
	0xdb, 0xb2, 0x0c, 0xdb, 0x95, 0xf3, 0xd5, 0xf5, 0x32, 0xbb, 0xb6, 0x80, 0x83, 0xe9, 0x5e, 0x95,
	0x98, 0x9a, 0x61, 0xdb, 0x2d, 0xd3, 0x96, 0x3c, 0xd7, 0xf4, 0x1b, 0x4c, 0x9f, 0xc3, 0x00, 0xc7,
	0x75, 0xfd, 0x01, 0xbb, 0xcb, 0xe1, 0xcf, 0xf6, 0xcd, 0x7d, 0x73, 0x99, 0x79, 0x6f, 0xe8, 0xf7,
	0xd8, 0xce, 0x2a, 0x12, 0x90, 0x71, 0x53, 0xda, 0xce, 0xee, 0xb5, 0x4d, 0xc9, 0x57, 0x96, 0x56,
	0x22, 0x30, 0xd0, 0xde, 0x92, 0xf3, 0x02, 0x31, 0x86, 0xf3, 0xb2, 0x5b, 0x97, 0x0c, 0xb7, 0xa5,
	0xf6, 0x2a, 0x0e, 0xb8, 0x76, 0xa4, 0x85, 0x1c, 0x81, 0xd1, 0xee, 0x48, 0x58, 0xc7, 0x74, 0x4d,
	0x9b, 0x5b, 0xed, 0x6e, 0xb5, 0x8e, 0xf7, 0x26, 0xe6, 0xfe, 0x70, 0x00, 0x91, 0xee, 0xf1, 0xb5,
	0x16, 0xb1, 0x8a, 0x83, 0x01, 0xec, 0xc0, 0xb4, 0x9d, 0x56, 0xaf, 0x5b, 0x6b, 0xb9, 0x1d, 0xc3,
	0xd2, 0x32, 0x55, 0x1f, 0xcb, 0x19, 0x2a, 0x8d, 0xf1, 0xb0, 0x8e, 0x7e, 0x50, 0xf7, 0x9a, 0xb6,
	0xb1, 0x2b, 0x42, 0xf4, 0x12, 0xc9, 0x25, 0x68, 0xc3, 0xee, 0x59, 0x5a, 0x86, 0x66, 0x4d, 0x30,
	0xdb, 0x34, 0x9c, 0x8e, 0x96, 0x4d, 0x13, 0x76, 0x0c, 0xe7, 0xa9, 0x96, 0xab, 0x3e, 0xc1, 0x61,
	0xb0, 0xf7, 0x4f, 0x55, 0x13, 0x39, 0x47, 0x5d, 0xd1, 0x93, 0x9c, 0xbb, 0xee, 0x35, 0x4c, 0xcb,
	0x36, 0xeb, 0x86, 0x6b, 0x36, 0x84, 0x84, 0x5f, 0xc1, 0xaf, 0x96, 0xf1, 0x76, 0x37, 0xb1, 0xaa,
	0x53, 0xdc, 0x66, 0x45, 0x04, 0x41, 0x3e, 0xfa, 0x49, 0x26, 0x79, 0x86, 0xd4, 0xf1, 0x2e, 0x53,
	0xfd, 0xd7, 0x54, 0xb8, 0xa5, 0x8e, 0xf2, 0x98, 0xd5, 0x54, 0x0d, 0xe4, 0x8c, 0xc0, 0xb1, 0x21,
	0x06, 0x1c, 0x2d, 0x23, 0x0d, 0x82, 0x3e, 0x8b, 0xd0, 0xac, 0x24, 0x95, 0xe1, 0xe2, 0x68, 0x79,
	0x49, 0x8a, 0x51, 0x80, 0xd0, 0x02, 0xe9, 0x5b, 0xf7, 0x5a, 0x16, 0x59, 0xe9, 0xbe, 0x24, 0x44,
	0x47, 0x43, 0xc2, 0x27, 0xfa, 0x0d, 0xee, 0x5d, 0x24, 0xb3, 0xd6, 0xee, 0xd5, 0x9f, 0x9a, 0x0d,
	0xed, 0x6d, 0xb6, 0x7a, 0xaa, 0x7c, 0xb4, 0x9e, 0x32, 0xdf, 0x12, 0xe5, 0x05, 0x7b, 0xa3, 0xf7,
	0xbc, 0xab, 0x65, 0x12, 0xba, 0x2e, 0x24, 0xab, 0xfa, 0x81, 0x96, 0x17, 0xc9, 0x9c, 0x83, 0x9a,
	0xcf, 0x1b, 0xda, 0x7d, 0x8a, 0x18, 0x84, 0x24, 0x99, 0xe2, 0x49, 0xf5, 0x2f, 0xcf, 0xbd, 0xf5,
	0x10, 0xa6, 0xb7, 0x9c, 0xc5, 0x61, 0x1d, 0xaf, 0xdd, 0xea, 0x3e, 0x9d, 0x1b, 0xd6, 0x91, 0xb3,
	0xc8, 0x52, 0x7a, 0xe5, 0x74, 0x07, 0xa6, 0x96, 0xaf, 0xfe, 0x69, 0x16, 0x3f, 0x15, 0xe1, 0xd2,
	0x65, 0xfb, 0x86, 0x18, 0x9b, 0xca, 0x00, 0x12, 0xf4, 0xc9, 0xc7, 0x9d, 0x9a, 0xb7, 0xd7, 0x48,
	0xc4, 0x13, 0xa8, 0xd9, 0x90, 0x7e, 0xc7, 0x41, 0x44, 0x96, 0x9f, 0x87, 0x35, 0x1b, 0x5a, 0x41,
	0xcc, 0xbe, 0xe9, 0x7d, 0xb2, 0xcb, 0xa9, 0xb4, 0x34, 0xa4, 0x09, 0xf6, 0x50, 0xc4, 0x23, 0xe8,
	0x89, 0xae, 0x0b, 0xd0, 0x23, 0x02, 0xbd, 0x05, 0xff, 0x4f, 0xc4, 0x13, 0x30, 0xab, 0x5f, 0x91,
	0xd2, 0x5c, 0x04, 0x81, 0xc1, 0x4b, 0x08, 0xea, 0xb9, 0x7b, 0xa6, 0xad, 0xbd, 0x2d, 0x24, 0x44,
	0xf5, 0x9e, 0x65, 0x01, 0x48, 0x4b, 0x88, 0x9a, 0xad, 0x1a, 0x40, 0xee, 0x27, 0x43, 0x1a, 0xfb,
	0x6e, 0xaf, 0x6b, 0xee, 0x6a, 0x6f, 0x9f, 0xe8, 0x57, 0x04, 0x95, 0x65, 0xec, 0x3b, 0xa6, 0xf6,
	0xf6, 0x6d, 0x46, 0xbf, 0xc1, 0x5d, 0x49, 0x80, 0x20, 0x67, 0x74, 0xb4, 0xb7, 0x6f, 0xb3, 0xd5,
	0x86, 0xe2, 0x34, 0x74, 0x01, 0x75, 0x8b, 0x47, 0x85, 0x65, 0x7b, 0x46, 0x03, 0xf7, 0xf0, 0x4d,
	0x7c, 0x6c, 0x98, 0x6d, 0xd3, 0x35, 0xb5, 0x4c, 0x02, 0xe9, 0xf4, 0x1a, 0xad, 0xe6, 0x4b, 0x2d,
	0x5b, 0xfd, 0x14, 0x5d, 0x20, 0xf9, 0x43, 0x00, 0x64, 0xd4, 0x0e, 0x77, 0xfa, 0x6e, 0xc3, 0xb0,
	0x41, 0x12, 0x0a, 0xee, 0xb8, 0x5e, 0xef, 0x45, 0x47, 0xcb, 0x54, 0x3f, 0x4f, 0xbe, 0xf4, 0xe7,
	0x9f, 0xee, 0x93, 0xdc, 0x17, 0x9d, 0xba, 0xd7, 0x7d, 0xd1, 0xf1, 0x3e, 0x96, 0x63, 0x0b, 0xc8,
	0x27, 0x5a, 0x46, 0xdf, 0xe1, 0xd1, 0x0f, 0x90, 0x9e, 0x65, 0x76, 0x79, 0x04, 0xd6, 0x0c, 0xa7,
	0x55, 0x87, 0xc9, 0xe8, 0xb7, 0xf8, 0x6e, 0x09, 0xc8, 0xd4, 0x0e, 0xfb, 0xee, 0x5d, 0xae, 0xfa,
	0xf7, 0x0a, 0xec, 0xea, 0x92, 0x8f, 0xe7, 0xc9, 0xa9, 0x5f, 0x80, 0x52, 0xcd, 0x9a, 0xac, 0x4a,
	0x2e, 0x51, 0x5a, 0x56, 0xe1, 0x7b, 0x2f, 0x11, 0x97, 0xa1, 0x4d, 0x59, 0xe0, 0x3a, 0xa6, 0x6b,
	0x34, 0x0c, 0xd7, 0xd0, 0xb2, 0x73, 0xc2, 0x4c, 0x77, 0xcf, 0x6b, 0x38, 0xae, 0x96, 0x5b, 0x02,
	0x77, 0xec, 0xba, 0x96, 0x9f, 0x13, 0x04, 0x70, 0xf7, 0xa5, 0x65, 0xca, 0x6d, 0x5f, 0x20, 0x0e,
	0xda, 0x46, 0xd7, 0x3b, 0x68, 0x35, 0xb4, 0xf5, 0x65, 0x08, 0xab, 0x6e, 0x69, 0x1b, 0xf3, 0xf3,
	0xb0, 0xbc, 0x86, 0x53, 0xb7, 0xb4, 0x02, 0x6d, 0x45, 0x0a, 0xdc, 0xac, 0x77, 0xb5, 0xe2, 0x9c,
	0x9c, 0x96, 0xe5, 0x59, 0x76, 0xcf, 0xed, 0x69, 0x6c, 0x01, 0x71, 0xf0, 0x88, 0xeb, 0x5a, 0x5a,
	0x86, 0x80, 0xc9, 0x6d, 0xce, 0x8d, 0xec, 0xd6, 0x2d, 0xce, 0xb0, 0xb5, 0x04, 0x0e, 0xf4, 0xdb,
	0x73, 0xf0, 0xfd, 0x06, 0xd2, 0x5f, 0x5e, 0x02, 0x07, 0x7a, 0x6d, 0x6e, 0x60, 0xa7, 0xee, 0x22,
	0xc3, 0x95, 0x65, 0x88, 0x06, 0x2f, 0x07, 0xe6, 0xd6, 0xae, 0xde, 0x01, 0x65, 0xb9, 0x65, 0xaf,
	0x2e, 0xc7, 0xd5, 0x7b, 0x0d, 0x53, 0xbb, 0x36, 0x67, 0x2b, 0xc3, 0xb6, 0xbc, 0x9e, 0xa5, 0x5d,
	0x9f, 0x53, 0x0c, 0xc0, 0x8e, 0x65, 0x68, 0x37, 0x96, 0xc0, 0x5d, 0xcb, 0xd0, 0x6e, 0x2e, 0xa3,
	0xdf, 0x33, 0xb4, 0xf2, 0x32, 0xfa, 0x3d, 0x43, 0xbb, 0xb5, 0x68, 0xd9, 0xc7, 0x7c, 0x82, 0xb7,
	0x97, 0x21, 0x60, 0x82, 0x3b, 0xf3, 0x93, 0x00, 0x44, 0xb3, 0x6d, 0xd4, 0xcc, 0xb6, 0x76, 0x67,
	0xd9, 0x04, 0x1f, 0xe3, 0xe4, 0xef, 0x2e, 0xc7, 0xf1, 0xc9, 0xbf, 0xa7, 0xdf, 0x65, 0xb7, 0xe6,
	0x65, 0x76, 0x1b, 0x9e, 0x6b, 0xd8, 0xbb, 0xa6, 0xab, 0xdd, 0x5b, 0x36, 0x64, 0xb7, 0xe1, 0x39,
	0xed, 0xb6, 0x76, 0x7f, 0x05, 0xce, 0x6d, 0xb7, 0xb5, 0x07, 0xb4, 0x5b, 0xcb, 0x58, 0xb1, 0xda,
	0x8e, 0x87, 0x9a, 0x56, 0xe6, 0xec, 0xc1, 0x51, 0x6e, 0x5d, 0xfb, 0xca, 0x7c, 0x78, 0x01, 0xbc,
	0xd6, 0x73, 0xb4, 0xf7, 0xe7, 0x10, 0x56, 0xad, 0xe6, 0xb5, 0x9c, 0x56, 0x43, 0xfb, 0x80, 0x4a,
	0x17, 0xe9, 0x6a, 0xfb, 0xdd, 0xae, 0xd9, 0xf6, 0x5a, 0x0d, 0xed, 0xab, 0xcb, 0x54, 0x33, 0x5f,
	0xb8, 0x7b, 0x0d, 0x5b, 0xfb, 0x5a, 0xf5, 0x53, 0x3c, 0xbd, 0xf0, 0x4f, 0xbd, 0x47, 0x43, 0xfd,
	0x32, 0x4f, 0x9a, 0x07, 0xad, 0x86, 0xd7, 0xed, 0x75, 0x4d, 0xbe, 0x65, 0x6d, 0x13, 0xc0, 0xb2,
	0x4d, 0xc7, 0xec, 0xba, 0xda, 0xdb, 0xfb, 0xd5, 0x7f, 0x9f, 0xc1, 0x46, 0xde, 0x68, 0x76, 0xfa,
	0x98, 0x3e, 0x4d, 0x16, 0xf7, 0x47, 0x81, 0xba, 0x65, 0xee, 0x2d, 0xec, 0x49, 0x00, 0x03, 0x91,
	0x2f, 0x20, 0x77, 0xe0, 0xfe, 0x06, 0x20, 0xd3, 0xb1, 0xb4, 0x2c, 0x8d, 0x0a, 0xcf, 0xc6, 0xbe,
	0xbb, 0xa7, 0xe5, 0x15, 0x40, 0x03, 0x8a, 0xc0, 0x82, 0x02, 0x80, 0x62, 0x49, 0xd3, 0x14, 0xa9,
	0x76, 0x6f, 0x1f, 0xf2, 0xdb, 0x7d, 0x45, 0xea, 0x5e, 0xcf, 0xd2, 0x9e, 0xd0, 0xce, 0x01, 0xcf,
	0xfb, 0x5d, 0xdb, 0xb4, 0x60, 0x1b, 0x52, 0x41, 0x8e, 0xf9, 0x0c, 0x0a, 0x86, 0x1f, 0x67, 0x53,
	0xdf, 0x86, 0xd2, 0x9f, 0xab, 0x02, 0x32, 0x83, 0xd7, 0xf0, 0xd6, 0x3e, 0x64, 0x42, 0x5c, 0x26,
	0x03, 0x8a, 0x5c, 0xeb, 0xa5, 0xe7, 0xba, 0x6d, 0x5e, 0xde, 0x97, 0x28, 0x5a, 0x54, 0x78, 0xab,
	0x2b, 0xd3, 0x81, 0x81, 0xa5, 0x29, 0x2e, 0xaa, 0xdb, 0x96, 0xe1, 0x6d, 0xb8, 0x5e, 0xc3, 0xac,
	0x27, 0x70, 0x8d, 0x0a, 0x03, 0xc3, 0xf5, 0xac, 0x7d, 0x67, 0x8f, 0x67, 0x34, 0xed, 0x0a, 0x19,
	0x13, 0x80, 0x3d, 0x0b, 0x61, 0xfa, 0x1c, 0x21, 0x48, 0xd0, 0xae, 0xa6, 0x09, 0x39, 0xec, 0x5a,
	0x42, 0x08, 0x1a, 0xf0, 0xd2, 0x49, 0xbb, 0x4e, 0x56, 0x34, 0xe8, 0xe8, 0xa1, 0xdd, 0xa0, 0xda,
	0x8a, 0xa8, 0xba, 0xcf, 0xb9, 0x36, 0x37, 0x13, 0x28, 0x68, 0x49, 0xd0, 0x72, 0x5a, 0x62, 0xb3,
	0x65, 0xb6, 0x1b, 0xda, 0x2d, 0x65, 0x68, 0xd0, 0xc7, 0xaa, 0xd5, 0xb4, 0xdb, 0xb4, 0x34, 0xa4,
	0x0e, 0x80, 0x76, 0xf4, 0xb2, 0x98, 0xf7, 0xc2, 0x96, 0x74, 0x80, 0x37, 0x4c, 0x94, 0x46, 0x23,
	0x7d, 0xf3, 0x2b, 0xaa, 0xe3, 0x4e, 0x3b, 0x75, 0x94, 0x66, 0x04, 0x83, 0xe2, 0xf5, 0xbf, 0xbe,
	0xcb, 0xd1, 0x96, 0x0e, 0x90, 0x6e, 0xcf, 0xab, 0xed, 0x37, 0x9b, 0x24, 0xf7, 0x3f, 0x0b, 0x17,
	0x55, 0xbe, 0xeb, 0xe3, 0x6b, 0x4b, 0x8e, 0xa3, 0x56, 0xc4, 0x38, 0xdf, 0x96, 0xeb, 0xed, 0xf6,
	0xdc, 0x1e, 0x1d, 0xbf, 0x33, 0x14, 0x4f, 0x2d, 0xd7, 0x7b, 0x6e, 0xb7, 0x5c, 0x53, 0xdd, 0xe1,
	0x30, 0x04, 0x25, 0xc6, 0xa8, 0xbb, 0xad, 0x5e, 0xd7, 0xd1, 0x72, 0x09, 0xc2, 0xb0, 0xac, 0xf6,
	0x4b, 0x89, 0xc8, 0x27, 0x88, 0x7a, 0xdb, 0x34, 0x6c, 0x89, 0x58, 0x13, 0x7e, 0x4d, 0xe7, 0x15,
	0x6d, 0x9d, 0x2c, 0xd5, 0x5a, 0x62, 0xa9, 0xbf, 0x8a, 0x13, 0x9a, 0xff, 0x9e, 0x8f, 0x0a, 0x8a,
	0x66, 0x3d, 0x55, 0xa9, 0x34, 0xeb, 0xa2, 0x2e, 0x11, 0x3b, 0xb5, 0x84, 0x78, 0x8e, 0x6b, 0xb7,
	0xea, 0x70, 0x3c, 0x97, 0xa4, 0x54, 0xd4, 0xe4, 0x12, 0x52, 0x84, 0x08, 0xd2, 0x7c, 0xf5, 0x1f,
	0xd3, 0x1b, 0x44, 0x39, 0x3a, 0xc6, 0x3b, 0x1a, 0xb3, 0xa9, 0x96, 0xa0, 0x24, 0xa2, 0xe9, 0x39,
	0x66, 0xb7, 0x21, 0x0f, 0xce, 0x89, 0x1a, 0x4d, 0xaf, 0xbe, 0x67, 0xd6, 0x9f, 0x7a, 0xbd, 0x03,
	0xd3, 0x6e, 0x1b, 0x96, 0x2c, 0x18, 0x9a, 0x4d, 0x0f, 0x12, 0x0c, 0x44, 0xd2, 0x7e, 0xd7, 0x4d,
	0x8c, 0xd6, 0x6c, 0xf2, 0x52, 0xfb, 0xa9, 0x44, 0x14, 0x52, 0x88, 0xda, 0x4b, 0x89, 0xd0, 0xaa,
	0x0e, 0x1e, 0x7d, 0xf0, 0xcb, 0x6b, 0x9c, 0xdd, 0xee, 0x42, 0x23, 0x66, 0x57, 0x69, 0xc4, 0x08,
	0x48, 0xd2, 0x35, 0x91, 0x10, 0xd9, 0x08, 0xf9, 0x0c, 0xdf, 0xd2, 0x2d, 0x7c, 0x21, 0x47, 0x86,
	0xdf, 0x4d, 0x1b, 0x7e, 0x57, 0x31, 0xbc, 0x84, 0x90, 0x7d, 0xb3, 0x55, 0x47, 0xbd, 0x93, 0xc1,
	0xdd, 0x91, 0x84, 0xe0, 0xe9, 0x4b, 0x0a, 0x81, 0x20, 0x6b, 0x9b, 0x75, 0xc8, 0x95, 0x18, 0x06,
	0xbb, 0xe0, 0xaf, 0x8d, 0x96, 0x6d, 0xf2, 0x85, 0xdb, 0x44, 0x25, 0x5d, 0xaf, 0xd9, 0xd4, 0x72,
	0x55, 0x0b, 0x1d, 0x63, 0xfe, 0x3b, 0x32, 0x5a, 0x1c, 0x1b, 0xac, 0xd4, 0x31, 0xdc, 0xfa, 0x9e,
	0x76, 0x89, 0xdc, 0x4d, 0x38, 0xa0, 0x3c, 0xb0, 0xd9, 0xc2, 0x48, 0x3c, 0xd4, 0xb3, 0xd5, 0xbf,
	0x93, 0xc1, 0x37, 0x2c, 0x4b, 0xbe, 0xd0, 0xa2, 0xd5, 0xb2, 0x6d, 0xaf, 0xd5, 0x68, 0x9b, 0x9e,
	0xdb, 0xea, 0x98, 0x3d, 0x25, 0x43, 0xda, 0xb6, 0xb7, 0x67, 0xd8, 0x0d, 0x09, 0x17, 0x46, 0xb0,
	0x65, 0xe5, 0x9c, 0x4d, 0x28, 0xf1, 0xe8, 0x27, 0x9d, 0x4f, 0xc2, 0xf1, 0xec, 0x4e, 0xf0, 0x7c,
	0x75, 0x4a, 0x7f, 0x86, 0x8b, 0xbf, 0x96, 0xa6, 0xf2, 0xd9, 0xfb, 0x81, 0x69, 0xf7, 0xe4, 0x92,
	0x76, 0x70, 0x49, 0xdf, 0xfe, 0xf8, 0xdd, 0x86, 0x7e, 0x9d, 0xcf, 0xba, 0xe3, 0x39, 0xed, 0xde,
	0x73, 0xcb, 0x70, 0xf7, 0xa8, 0xe9, 0x85, 0xdd, 0xb0, 0x8e, 0xda, 0x0d, 0x53, 0x3b, 0x5f, 0x1d,
	0x3c, 0xfd, 0xf2, 0x05, 0x9f, 0x2c, 0x7c, 0x03, 0xa4, 0x16, 0xf3, 0x35, 0x35, 0x73, 0xa0, 0x3d,
	0x01, 0x46, 0xe7, 0x7c, 0x9c, 0x03, 0x07, 0x38, 0x75, 0x38, 0xc3, 0x76, 0x0c, 0xfb, 0xa9, 0x26,
	0x8a, 0x72, 0x80, 0x2f, 0xc4, 0xf5, 0x67, 0xea, 0x07, 0x5d, 0x8b, 0xfe, 0xd5, 0x49, 0xfb, 0x57,
	0x67, 0xc1, 0xbf, 0x3a, 0x8a, 0x7f, 0x1d, 0xa9, 0x57, 0x31, 0xd4, 0x10, 0xed, 0x34, 0x53, 0x1d,
	0x00, 0x86, 0xa0, 0xa7, 0x35, 0x0b, 0x4e, 0xed, 0x34, 0x8b, 0x26, 0x44, 0x99, 0xe5, 0xc8, 0xfd,
	0xb8, 0xd3, 0xf4, 0x6a, 0xfb, 0xb6, 0xe3, 0xca, 0xfd, 0xb8, 0xd3, 0x14, 0xe7, 0xf4, 0xea, 0x1f,
	0xd2, 0x2d, 0x3f, 0xfc, 0x10, 0x87, 0xdb, 0x07, 0xa7, 0x6e, 0x52, 0x93, 0xd0, 0x6b, 0x1a, 0xad,
	0xb6, 0x09, 0xa3, 0xe1, 0x16, 0x69, 0xba, 0x5e, 0xcd, 0x68, 0xc8, 0xb6, 0x8e, 0xf0, 0x3c, 0x02,
	0x93, 0x3f, 0x66, 0xa9, 0x52, 0x22, 0x68, 0xab, 0xeb, 0xb8, 0xf6, 0x3e, 0xa2, 0x72, 0xb4, 0xff,
	0x10, 0x0a, 0x1d, 0x3a, 0x9f, 0xd0, 0x8b, 0xfe, 0x9a, 0x18, 0x77, 0x8d, 0xaa, 0x1e, 0x53, 0xe9,
	0xb3, 0x09, 0xdc, 0x7a, 0xc2, 0x26, 0xfa, 0x6d, 0x02, 0xb5, 0x91, 0xb0, 0xc9, 0xbe, 0x9b, 0xc0,
	0x15, 0x12, 0x36, 0xec, 0x45, 0xf4, 0x2c, 0x81, 0x2a, 0xea, 0xef, 0xb1, 0xdb, 0x88, 0x72, 0x9e,
	0xb7, 0xdc, 0xfa, 0x9e, 0x68, 0x86, 0x11, 0x9e, 0x51, 0x65, 0x69, 0xa6, 0xdb, 0x61, 0x02, 0x5d,
	0x4a, 0x46, 0x95, 0x7d, 0x2b, 0x81, 0xdb, 0xa4, 0x4e, 0x9b, 0xd4, 0x48, 0x76, 0x41, 0x89, 0x60,
	0x8b, 0xf6, 0x0c, 0x73, 0x89, 0x6f, 0xd5, 0xd4, 0x3f, 0xb2, 0xf9, 0xaa, 0x3f, 0x1a, 0xf3, 0xdb,
	0x9e, 0xfc, 0x6f, 0x54, 0x81, 0x3f, 0xee, 0x35, 0xeb, 0x5e, 0xab, 0x5b, 0xef, 0x75, 0x2c, 0xc3,
	0x6d, 0xc1, 0xae, 0x27, 0xbc, 0x0c, 0x10, 0xa6, 0x65, 0xda, 0x70, 0x42, 0xfd, 0xf3, 0x2c, 0xe6,
	0x97, 0xc3, 0xfe, 0x50, 0xbc, 0x37, 0x44, 0x19, 0xb8, 0xe0, 0x35, 0xbb, 0xce, 0x57, 0x84, 0xfa,
	0x65, 0xb2, 0xcb, 0x21, 0xe0, 0xbc, 0xea, 0x16, 0xbb, 0xa9, 0x00, 0xca, 0x1e, 0xa5, 0x96, 0xa5,
	0x26, 0xae, 0xc0, 0xa4, 0xa6, 0x20, 0x36, 0x24, 0x05, 0x89, 0xf2, 0x44, 0x67, 0x06, 0x10, 0xa8,
	0xe7, 0x1a, 0xc5, 0xa7, 0x20, 0x6d, 0x9b, 0x5d, 0x79, 0x52, 0xe4, 0x30, 0x5e, 0x1a, 0x78, 0x66,
	0xc7, 0x72, 0x5f, 0xca, 0xe6, 0xb0, 0x82, 0xd8, 0xef, 0x3e, 0xed, 0xf6, 0x9e, 0x77, 0xe5, 0xee,
	0x22, 0xd5, 0xe7, 0x36, 0x6f, 0xc1, 0x12, 0x27, 0xf3, 0x6a, 0x39, 0x9e, 0xd3, 0x36, 0x0e, 0x4c,
	0x8d, 0xcd, 0x4d, 0x96, 0x9f, 0x8d, 0x45, 0x55, 0x28, 0x81, 0xbc, 0x4d, 0xa4, 0x6d, 0xea, 0xef,
	0xb3, 0xfb, 0x04, 0x4e, 0x7a, 0xb4, 0x34, 0x3c, 0xec, 0x86, 0xe0, 0xc2, 0xda, 0x56, 0xf5, 0xf7,
	0x73, 0x98, 0x7f, 0xc0, 0xde, 0x54, 0x94, 0x72, 0x73, 0xd3, 0x48, 0x86, 0x62, 0x56, 0xd1, 0x6b,
	0x14, 0x40, 0x98, 0x74, 0x46, 0x18, 0xd4, 0x58, 0x62, 0x50, 0x51, 0xbb, 0x28, 0x48, 0x94, 0x94,
	0x9b, 0x43, 0xf4, 0xf6, 0x31, 0x36, 0xe4, 0x36, 0x2c, 0x10, 0x86, 0xbd, 0xbb, 0x0f, 0xc2, 0xb4,
	0x35, 0xb1, 0x04, 0x86, 0x58, 0x82, 0x75, 0x45, 0x45, 0xb7, 0x07, 0x9b, 0x4e, 0x17, 0x4c, 0x8d,
	0x81, 0x2e, 0xf8, 0xb1, 0x14, 0x2d, 0x08, 0x7f, 0x50, 0x86, 0xc3, 0x9a, 0xb4, 0x48, 0x91, 0x02,
	0x18, 0x1e, 0xe4, 0xdc, 0x41, 0xbb, 0x4e, 0xcb, 0x71, 0x61, 0x54, 0xa6, 0xdf, 0x61, 0x65, 0x42,
	0xef, 0x77, 0x9d, 0x7d, 0x0b, 0x94, 0x34, 0x1b, 0x5e, 0xcf, 0x6e, 0x98, 0xb6, 0x56, 0x9a, 0xb3,
	0x87, 0x6b, 0xec, 0x6a, 0x9b, 0x73, 0x13, 0x80, 0x12, 0x83, 0x4f, 0x59, 0x1c, 0xce, 0x55, 0x04,
	0x18, 0x70, 0x7b, 0xce, 0x80, 0xbc, 0xbb, 0x2c, 0x66, 0x7d, 0xb9, 0xfa, 0x17, 0x19, 0x56, 0x16,
	0xcb, 0xa3, 0x16, 0x97, 0x4a, 0x58, 0xd5, 0x5a, 0x75, 0xe1, 0x4f, 0x3c, 0x87, 0xc9, 0x24, 0x88,
	0x08, 0x67, 0xdf, 0x42, 0x70, 0x46, 0xa1, 0x4f, 0xf9, 0x9a, 0xc8, 0x83, 0x09, 0xbd, 0xac, 0x3e,
	0x73, 0x94, 0x69, 0x16, 0x51, 0xd8, 0xff, 0xcd, 0x0b, 0xed, 0x5b, 0x4b, 0x96, 0x7f, 0x6d, 0x6e,
	0x40, 0xb9, 0xfc, 0xeb, 0xc2, 0x70, 0xad, 0xc4, 0x91, 0x36, 0xc4, 0x02, 0xb7, 0xc4, 0x02, 0x17,
	0xaa, 0xff, 0x84, 0xee, 0xef, 0xc3, 0xe4, 0xb1, 0xcf, 0xa5, 0xba, 0x66, 0x67, 0x99, 0x6b, 0x76,
	0x54, 0xd7, 0x4c, 0xc3, 0x60, 0x79, 0x64, 0xfc, 0x13, 0xac, 0xd1, 0x86, 0xed, 0xce, 0xa6, 0x66,
	0xf6, 0x1c, 0xb2, 0xfb, 0x5c, 0x41, 0xe6, 0x85, 0x0f, 0x11, 0xf2, 0x79, 0xab, 0xdd, 0xa8, 0x1b,
	0x76, 0x03, 0xca, 0x6a, 0xf2, 0x39, 0xc2, 0xe0, 0x61, 0x65, 0x7d, 0x0e, 0x7a, 0x60, 0xb4, 0xf7,
	0x4d, 0x6d, 0x63, 0x4e, 0x79, 0x2e, 0x5a, 0x74, 0x8c, 0x04, 0xd0, 0xb2, 0x4d, 0xdb, 0x7c, 0xa6,
	0x15, 0x15, 0x09, 0x8d, 0x7d, 0x8b, 0xe4, 0x32, 0x61, 0xa7, 0x8e, 0xb0, 0x53, 0xa9, 0xfa, 0x47,
	0xe4, 0x24, 0x49, 0xb9, 0xac, 0xe4, 0x5e, 0x1c, 0xb0, 0xd9, 0x69, 0x4a, 0x2f, 0x91, 0xe5, 0x13,
	0x07, 0x52, 0x9a, 0xdf, 0x6f, 0xb7, 0x65, 0xde, 0xe4, 0xf0, 0x39, 0x17, 0x51, 0xc4, 0x88, 0x5a,
	0x3a, 0x27, 0x0a, 0xf2, 0x8e, 0xcc, 0xdf, 0xb2, 0x8c, 0x96, 0x12, 0xa8, 0x32, 0x5b, 0x9b, 0x47,
	0xd4, 0x7b, 0x9d, 0x8e, 0xd1, 0x05, 0x3b, 0xe1, 0xe4, 0x25, 0xa2, 0xd9, 0x36, 0x76, 0x1d, 0x6d,
	0xa3, 0xfa, 0x07, 0x39, 0xfc, 0x00, 0x2c, 0xa9, 0x84, 0xd5, 0x59, 0xa1, 0xa2, 0xbb, 0xc0, 0x84,
	0x1b, 0xae, 0xf9, 0xa2, 0xe5, 0xb8, 0x8e, 0x7c, 0x57, 0xc1, 0x31, 0xa2, 0xcc, 0xc4, 0x58, 0xcf,
	0x90, 0x2f, 0x73, 0xd4, 0x73, 0xb3, 0xb5, 0xbb, 0xe7, 0xaa, 0x41, 0x2d, 0xc3, 0x80, 0xe3, 0x21,
	0x45, 0xf4, 0x9a, 0xc8, 0x09, 0x67, 0x2d, 0xdc, 0x31, 0x55, 0x54, 0x6d, 0x1f, 0xf2, 0x2c, 0x9c,
	0x1c, 0xee, 0xb3, 0x3b, 0x02, 0x57, 0xdf, 0x33, 0x5a, 0xdd, 0x56, 0x77, 0x37, 0x25, 0x78, 0x8d,
	0x92, 0x0c, 0x0e, 0xcc, 0xb3, 0x8c, 0x8a, 0x5e, 0x17, 0x65, 0x38, 0xa0, 0xdb, 0xbd, 0x9e, 0x25,
	0x37, 0x8c, 0x5d, 0x65, 0xd1, 0x68, 0x12, 0x05, 0x15, 0xc5, 0x47, 0x33, 0x1b, 0x32, 0x97, 0xa1,
	0xbf, 0xec, 0x4a, 0xdb, 0x43, 0x64, 0x88, 0xf6, 0xe2, 0xee, 0xbc, 0xe1, 0x4b, 0xe4, 0x04, 0x12,
	0x81, 0x13, 0xd2, 0x36, 0x69, 0x41, 0x24, 0x9c, 0x6b, 0x2c, 0xdf, 0x2d, 0xee, 0x26, 0x8b, 0xbd,
	0x5d, 0xfd, 0x5d, 0x72, 0x3c, 0xf1, 0xf7, 0x73, 0x53, 0x4b, 0x84, 0xda, 0x58, 0x42, 0x0c, 0x35,
	0x79, 0x51, 0x1b, 0x09, 0xdd, 0xc3, 0x18, 0x93, 0xb5, 0xac, 0x95, 0xa8, 0xc9, 0x5f, 0x94, 0x8a,
	0x45, 0x91, 0x70, 0xa3, 0x71, 0x60, 0xda, 0x6e, 0xcb, 0x31, 0xa5, 0xfb, 0x59, 0x8a, 0xfb, 0x55,
	0x7f, 0x15, 0x9d, 0x46, 0xfe, 0x91, 0xe9, 0x94, 0x46, 0xf4, 0x8e, 0x30, 0xe5, 0xdd, 0x32, 0x18,
	0xdc, 0xb9, 0x91, 0xc5, 0xbb, 0x0c, 0x37, 0x11, 0x9f, 0xad, 0xfe, 0x00, 0xe7, 0x8b, 0x77, 0xb2,
	0x82, 0xd9, 0x92, 0xf9, 0x3e, 0xeb, 0xa5, 0xe7, 0x8b, 0x63, 0x4a, 0x28, 0x6e, 0x48, 0x42, 0x36,
	0x07, 0x0b, 0xd9, 0x7f, 0x85, 0xdd, 0x5d, 0xf8, 0x73, 0xdb, 0x4b, 0xd4, 0x77, 0xea, 0xa9, 0x40,
	0x11, 0x05, 0x90, 0x04, 0x63, 0xea, 0x43, 0xf9, 0x1c, 0x98, 0xe8, 0x7e, 0x67, 0xfe, 0x46, 0x56,
	0x4a, 0x3c, 0x1d, 0xe0, 0xec, 0x66, 0x1d, 0xea, 0x6e, 0x6e, 0x19, 0x05, 0xc4, 0x3d, 0x36, 0x39,
	0xc2, 0xd9, 0x34, 0x1a, 0xd4, 0x97, 0x5a, 0xb6, 0xfa, 0x6f, 0xb2, 0x68, 0xf7, 0xe4, 0x58, 0xb1,
	0x98, 0x82, 0x3a, 0xe9, 0x14, 0x84, 0x11, 0xcc, 0x81, 0x58, 0x85, 0x52, 0x04, 0x67, 0x68, 0xc5,
	0x3b, 0x6a, 0x04, 0x63, 0xbf, 0x22, 0xab, 0xa2, 0x44, 0x5c, 0x20, 0x4a, 0x54, 0x14, 0x9d, 0x79,
	0x37, 0xcf, 0x93, 0xd9, 0x3a, 0xe9, 0xfc, 0x22, 0x92, 0xb6, 0x04, 0xdb, 0x86, 0x6b, 0xca, 0x64,
	0xd4, 0x49, 0x62, 0xc2, 0xe6, 0x6f, 0xf7, 0xe7, 0x88, 0x6b, 0x20, 0xb9, 0x40, 0x49, 0x21, 0x05,
	0xa5, 0x3c, 0x5f, 0x54, 0x35, 0xa5, 0x84, 0xc1, 0x15, 0x75, 0x34, 0xa6, 0xce, 0x5c, 0xe4, 0x12,
	0xa3, 0xdb, 0x70, 0xb4, 0x52, 0xf5, 0x9f, 0x66, 0x96, 0x7c, 0xd1, 0x17, 0x2d, 0xf3, 0xe1, 0xe6,
	0x9c, 0x0f, 0xd3, 0x6b, 0x6b, 0x01, 0x96, 0x1b, 0xb8, 0x58, 0xb0, 0x84, 0x01, 0x92, 0x82, 0xbc,
	0x2b, 0xd1, 0x54, 0x9c, 0x26, 0x37, 0x2f, 0x44, 0x96, 0x21, 0x79, 0x11, 0x0a, 0x4d, 0xe9, 0x4e,
	0x6b, 0xd5, 0xff, 0x44, 0x9b, 0x73, 0xfa, 0x7b, 0x7f, 0x71, 0xda, 0x83, 0x83, 0xb6, 0x53, 0x4f,
	0x4e, 0x7f, 0xfc, 0xfa, 0xc8, 0x73, 0xf9, 0x6a, 0xba, 0x63, 0x79, 0xc6, 0xee, 0xae, 0x6d, 0xee,
	0x1a, 0xfc, 0x8c, 0x4e, 0x07, 0x3e, 0x71, 0x19, 0x25, 0x27, 0xec, 0x6d, 0xa5, 0x5f, 0xe2, 0x4a,
	0x32, 0x8c, 0xa2, 0xb5, 0x04, 0x80, 0x19, 0x70, 0x3d, 0xe1, 0x13, 0x87, 0x7d, 0xa7, 0xae, 0x6d,
	0x08, 0x83, 0x0b, 0xa8, 0x38, 0xd2, 0xc8, 0x46, 0x6f, 0xc7, 0x22, 0x2f, 0x2a, 0x8a, 0x13, 0x35,
	0x01, 0x44, 0x2e, 0x60, 0x89, 0x08, 0x84, 0x4b, 0x11, 0xa5, 0x04, 0x93, 0x3e, 0x2f, 0xc9, 0x1b,
	0x1a, 0x62, 0x12, 0x5c, 0x17, 0x71, 0x7a, 0xea, 0x58, 0xcb, 0x4e, 0xe6, 0x3b, 0x4b, 0xff, 0xce,
	0x83, 0x27, 0xbe, 0x59, 0x47, 0xc6, 0x26, 0x1c, 0xe7, 0x16, 0xde, 0xf2, 0x0a, 0x78, 0xa7, 0x67,
	0x9b, 0x5a, 0xa6, 0xda, 0xa6, 0x70, 0x4c, 0xff, 0xed, 0x06, 0x92, 0x24, 0x34, 0x6e, 0xe2, 0xd5,
	0x06, 0x45, 0x16, 0x79, 0xbf, 0xc4, 0x90, 0xb4, 0x3f, 0xcb, 0xa1, 0x6a, 0x2b, 0xbe, 0x6a, 0x96,
	0x7e, 0x63, 0xb9, 0xea, 0x21, 0x1a, 0x72, 0x13, 0x6e, 0x7c, 0x0b, 0x18, 0xaf, 0xd3, 0x72, 0x1c,
	0x59, 0x90, 0x72, 0x74, 0xd7, 0x7c, 0x41, 0x47, 0x4e, 0x47, 0xcb, 0x52, 0xd9, 0x3d, 0x8f, 0x40,
	0xb6, 0x9c, 0xb8, 0x8e, 0x00, 0xd8, 0x74, 0x4f, 0x34, 0x4f, 0x5b, 0xfc, 0x22, 0x0a, 0x59, 0xd7,
	0x54, 0xd6, 0x74, 0xd7, 0x74, 0x5d, 0x65, 0x4d, 0xa1, 0x90, 0x75, 0x43, 0xc6, 0x80, 0xe5, 0x52,
	0x3f, 0xa0, 0x20, 0x83, 0x11, 0x46, 0x93, 0xf5, 0x20, 0x13, 0xf7, 0x4b, 0x12, 0x25, 0x1c, 0xd3,
	0xc5, 0xea, 0x4d, 0x1c, 0xaf, 0x97, 0xe0, 0x70, 0x98, 0x2d, 0x95, 0x19, 0xd5, 0x90, 0xcc, 0xdb,
	0x2a, 0x73, 0x1a, 0x87, 0xcc, 0x97, 0xf5, 0xdb, 0xc9, 0x4a, 0xa4, 0xfc, 0xeb, 0x27, 0xef, 0x72,
	0xfa, 0xbd, 0x64, 0x2d, 0x54, 0x1c, 0xb2, 0x82, 0x03, 0xfe, 0x1e, 0xfd, 0xa1, 0x0b, 0xac, 0xb8,
	0x52, 0x17, 0x32, 0xa8, 0x2d, 0xd8, 0xac, 0x2f, 0x5c, 0x5e, 0x01, 0x18, 0x76, 0x0f, 0xa9, 0xa6,
	0xd2, 0x32, 0xa2, 0x58, 0x4a, 0x30, 0xed, 0xd6, 0x81, 0xd9, 0x35, 0x9d, 0xe4, 0x76, 0xc6, 0xae,
	0x52, 0x2b, 0x69, 0x79, 0x85, 0x41, 0x16, 0x50, 0xbc, 0x6d, 0xeb, 0x68, 0x85, 0xea, 0xe7, 0xd8,
	0x0f, 0x48, 0xee, 0xa1, 0xe3, 0xd5, 0x73, 0xb1, 0x83, 0xaa, 0xfd, 0x31, 0xd4, 0xf2, 0x99, 0xeb,
	0x75, 0x5a, 0x5d, 0x4c, 0xe8, 0x19, 0x05, 0x66, 0xbc, 0x40, 0x58, 0x96, 0x62, 0xf0, 0xd9, 0x92,
	0x0e, 0xc6, 0x0f, 0xf1, 0x30, 0x3c, 0x77, 0x11, 0x99, 0xfc, 0xb4, 0x6e, 0x63, 0x3b, 0xa5, 0xdb,
	0xab, 0xef, 0x19, 0xdd, 0x5d, 0x53, 0xf6, 0xf2, 0x05, 0xc2, 0x7c, 0xb6, 0x6f, 0xb4, 0xe5, 0xfd,
	0x34, 0x01, 0xed, 0x18, 0x0e, 0x6e, 0x5e, 0x69, 0x62, 0x3c, 0xd2, 0xe7, 0x6a, 0x0f, 0x7f, 0xf0,
	0xf1, 0xd1, 0x28, 0x3e, 0x3e, 0x39, 0xfc, 0xe6, 0x20, 0x98, 0xf0, 0xff, 0x6c, 0x65, 0x10, 0x84,
	0xc3, 0x8f, 0xf0, 0xff, 0x4d, 0xf9, 0x45, 0xfa, 0x7f, 0x53, 0x8e, 0x02, 0xf5, 0xbf, 0x61, 0xb1,
	0x32, 0x87, 0xeb, 0x1c, 0xf1, 0xe9, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x85, 0xd1, 0xb4, 0x8d,
	0xac, 0x65, 0x00, 0x00,
}
