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

package voltha

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

// 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.ProtoPackageIsVersion3 // please upgrade the proto package

type LogicalPortId struct {
	// unique id of logical device
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// id of the port on the logical device
	PortId               string   `protobuf:"bytes,2,opt,name=port_id,json=portId,proto3" json:"port_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LogicalPortId) Reset()         { *m = LogicalPortId{} }
func (m *LogicalPortId) String() string { return proto.CompactTextString(m) }
func (*LogicalPortId) ProtoMessage()    {}
func (*LogicalPortId) Descriptor() ([]byte, []int) {
	return fileDescriptor_caf139ab3abc8240, []int{0}
}

func (m *LogicalPortId) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LogicalPortId.Unmarshal(m, b)
}
func (m *LogicalPortId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LogicalPortId.Marshal(b, m, deterministic)
}
func (m *LogicalPortId) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LogicalPortId.Merge(m, src)
}
func (m *LogicalPortId) XXX_Size() int {
	return xxx_messageInfo_LogicalPortId.Size(m)
}
func (m *LogicalPortId) XXX_DiscardUnknown() {
	xxx_messageInfo_LogicalPortId.DiscardUnknown(m)
}

var xxx_messageInfo_LogicalPortId proto.InternalMessageInfo

func (m *LogicalPortId) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *LogicalPortId) GetPortId() string {
	if m != nil {
		return m.PortId
	}
	return ""
}

type LogicalPort struct {
	Id                   string                    `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	OfpPort              *openflow_13.OfpPort      `protobuf:"bytes,2,opt,name=ofp_port,json=ofpPort,proto3" json:"ofp_port,omitempty"`
	DeviceId             string                    `protobuf:"bytes,3,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
	DevicePortNo         uint32                    `protobuf:"varint,4,opt,name=device_port_no,json=devicePortNo,proto3" json:"device_port_no,omitempty"`
	RootPort             bool                      `protobuf:"varint,5,opt,name=root_port,json=rootPort,proto3" json:"root_port,omitempty"`
	OfpPortStats         *openflow_13.OfpPortStats `protobuf:"bytes,6,opt,name=ofp_port_stats,json=ofpPortStats,proto3" json:"ofp_port_stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *LogicalPort) Reset()         { *m = LogicalPort{} }
func (m *LogicalPort) String() string { return proto.CompactTextString(m) }
func (*LogicalPort) ProtoMessage()    {}
func (*LogicalPort) Descriptor() ([]byte, []int) {
	return fileDescriptor_caf139ab3abc8240, []int{1}
}

func (m *LogicalPort) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LogicalPort.Unmarshal(m, b)
}
func (m *LogicalPort) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LogicalPort.Marshal(b, m, deterministic)
}
func (m *LogicalPort) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LogicalPort.Merge(m, src)
}
func (m *LogicalPort) XXX_Size() int {
	return xxx_messageInfo_LogicalPort.Size(m)
}
func (m *LogicalPort) XXX_DiscardUnknown() {
	xxx_messageInfo_LogicalPort.DiscardUnknown(m)
}

var xxx_messageInfo_LogicalPort proto.InternalMessageInfo

func (m *LogicalPort) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *LogicalPort) GetOfpPort() *openflow_13.OfpPort {
	if m != nil {
		return m.OfpPort
	}
	return nil
}

func (m *LogicalPort) GetDeviceId() string {
	if m != nil {
		return m.DeviceId
	}
	return ""
}

func (m *LogicalPort) GetDevicePortNo() uint32 {
	if m != nil {
		return m.DevicePortNo
	}
	return 0
}

func (m *LogicalPort) GetRootPort() bool {
	if m != nil {
		return m.RootPort
	}
	return false
}

func (m *LogicalPort) GetOfpPortStats() *openflow_13.OfpPortStats {
	if m != nil {
		return m.OfpPortStats
	}
	return nil
}

type LogicalPorts struct {
	Items                []*LogicalPort `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *LogicalPorts) Reset()         { *m = LogicalPorts{} }
func (m *LogicalPorts) String() string { return proto.CompactTextString(m) }
func (*LogicalPorts) ProtoMessage()    {}
func (*LogicalPorts) Descriptor() ([]byte, []int) {
	return fileDescriptor_caf139ab3abc8240, []int{2}
}

func (m *LogicalPorts) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LogicalPorts.Unmarshal(m, b)
}
func (m *LogicalPorts) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LogicalPorts.Marshal(b, m, deterministic)
}
func (m *LogicalPorts) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LogicalPorts.Merge(m, src)
}
func (m *LogicalPorts) XXX_Size() int {
	return xxx_messageInfo_LogicalPorts.Size(m)
}
func (m *LogicalPorts) XXX_DiscardUnknown() {
	xxx_messageInfo_LogicalPorts.DiscardUnknown(m)
}

var xxx_messageInfo_LogicalPorts proto.InternalMessageInfo

func (m *LogicalPorts) GetItems() []*LogicalPort {
	if m != nil {
		return m.Items
	}
	return nil
}

type LogicalDevice struct {
	// unique id of logical device
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// unique datapath id for the logical device (used by the SDN controller)
	DatapathId uint64 `protobuf:"varint,2,opt,name=datapath_id,json=datapathId,proto3" json:"datapath_id,omitempty"`
	// device description
	Desc *openflow_13.OfpDesc `protobuf:"bytes,3,opt,name=desc,proto3" json:"desc,omitempty"`
	// device features
	SwitchFeatures *openflow_13.OfpSwitchFeatures `protobuf:"bytes,4,opt,name=switch_features,json=switchFeatures,proto3" json:"switch_features,omitempty"`
	// name of the root device anchoring logical device
	RootDeviceId         string   `protobuf:"bytes,5,opt,name=root_device_id,json=rootDeviceId,proto3" json:"root_device_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LogicalDevice) Reset()         { *m = LogicalDevice{} }
func (m *LogicalDevice) String() string { return proto.CompactTextString(m) }
func (*LogicalDevice) ProtoMessage()    {}
func (*LogicalDevice) Descriptor() ([]byte, []int) {
	return fileDescriptor_caf139ab3abc8240, []int{3}
}

func (m *LogicalDevice) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LogicalDevice.Unmarshal(m, b)
}
func (m *LogicalDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LogicalDevice.Marshal(b, m, deterministic)
}
func (m *LogicalDevice) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LogicalDevice.Merge(m, src)
}
func (m *LogicalDevice) XXX_Size() int {
	return xxx_messageInfo_LogicalDevice.Size(m)
}
func (m *LogicalDevice) XXX_DiscardUnknown() {
	xxx_messageInfo_LogicalDevice.DiscardUnknown(m)
}

var xxx_messageInfo_LogicalDevice proto.InternalMessageInfo

func (m *LogicalDevice) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

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

func (m *LogicalDevice) GetDesc() *openflow_13.OfpDesc {
	if m != nil {
		return m.Desc
	}
	return nil
}

func (m *LogicalDevice) GetSwitchFeatures() *openflow_13.OfpSwitchFeatures {
	if m != nil {
		return m.SwitchFeatures
	}
	return nil
}

func (m *LogicalDevice) GetRootDeviceId() string {
	if m != nil {
		return m.RootDeviceId
	}
	return ""
}

type LogicalDevices struct {
	Items                []*LogicalDevice `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *LogicalDevices) Reset()         { *m = LogicalDevices{} }
func (m *LogicalDevices) String() string { return proto.CompactTextString(m) }
func (*LogicalDevices) ProtoMessage()    {}
func (*LogicalDevices) Descriptor() ([]byte, []int) {
	return fileDescriptor_caf139ab3abc8240, []int{4}
}

func (m *LogicalDevices) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LogicalDevices.Unmarshal(m, b)
}
func (m *LogicalDevices) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LogicalDevices.Marshal(b, m, deterministic)
}
func (m *LogicalDevices) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LogicalDevices.Merge(m, src)
}
func (m *LogicalDevices) XXX_Size() int {
	return xxx_messageInfo_LogicalDevices.Size(m)
}
func (m *LogicalDevices) XXX_DiscardUnknown() {
	xxx_messageInfo_LogicalDevices.DiscardUnknown(m)
}

var xxx_messageInfo_LogicalDevices proto.InternalMessageInfo

func (m *LogicalDevices) GetItems() []*LogicalDevice {
	if m != nil {
		return m.Items
	}
	return nil
}

func init() {
	proto.RegisterType((*LogicalPortId)(nil), "voltha.LogicalPortId")
	proto.RegisterType((*LogicalPort)(nil), "voltha.LogicalPort")
	proto.RegisterType((*LogicalPorts)(nil), "voltha.LogicalPorts")
	proto.RegisterType((*LogicalDevice)(nil), "voltha.LogicalDevice")
	proto.RegisterType((*LogicalDevices)(nil), "voltha.LogicalDevices")
}

func init() { proto.RegisterFile("voltha_protos/logical_device.proto", fileDescriptor_caf139ab3abc8240) }

var fileDescriptor_caf139ab3abc8240 = []byte{
	// 456 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xc1, 0x6a, 0xdb, 0x40,
	0x10, 0x86, 0x91, 0x63, 0x3b, 0xce, 0xca, 0x51, 0x40, 0x21, 0x54, 0x24, 0x85, 0x08, 0xd1, 0x83,
	0x43, 0xa9, 0xd4, 0xda, 0x97, 0xf6, 0xd0, 0x43, 0x43, 0x08, 0x18, 0x4a, 0x5b, 0xb6, 0xd0, 0x43,
	0x2f, 0x62, 0xa3, 0x5d, 0xcb, 0x0b, 0xb2, 0x46, 0x68, 0x37, 0xce, 0xcb, 0xf6, 0x29, 0xfa, 0x04,
	0x65, 0x67, 0x57, 0x8d, 0x15, 0xfb, 0xa8, 0x7f, 0xbe, 0x99, 0xf9, 0xe7, 0x5f, 0x91, 0x64, 0x0b,
	0x95, 0x5e, 0xb3, 0xbc, 0x69, 0x41, 0x83, 0xca, 0x2a, 0x28, 0x65, 0xc1, 0xaa, 0x9c, 0x8b, 0xad,
	0x2c, 0x44, 0x8a, 0x6a, 0x38, 0xb6, 0xcc, 0xe5, 0xeb, 0x12, 0xa0, 0xac, 0x44, 0xc6, 0x1a, 0x99,
	0xb1, 0xba, 0x06, 0xcd, 0xb4, 0x84, 0x5a, 0x59, 0xea, 0x32, 0xea, 0x4f, 0xda, 0x08, 0xcd, 0x5c,
	0xe5, 0xba, 0x5f, 0x81, 0x46, 0xd4, 0xab, 0x0a, 0x9e, 0xf2, 0x0f, 0x0b, 0x0b, 0x24, 0x1f, 0xc9,
	0xe9, 0x57, 0xbb, 0xf8, 0x07, 0xb4, 0x7a, 0xc9, 0xc3, 0x80, 0x0c, 0x24, 0x8f, 0xbc, 0xd8, 0x9b,
	0x9d, 0xd0, 0x81, 0xe4, 0xe1, 0x2b, 0x72, 0xdc, 0x40, 0xab, 0x73, 0xc9, 0xa3, 0x01, 0x8a, 0xe3,
	0x06, 0xc1, 0xe4, 0xaf, 0x47, 0xfc, 0x9d, 0xd6, 0xbd, 0xc6, 0xf7, 0x64, 0x02, 0xab, 0x26, 0x37,
	0x34, 0x76, 0xfa, 0xf3, 0x8b, 0x74, 0x77, 0x7f, 0x57, 0xa4, 0xc7, 0xb0, 0x6a, 0x70, 0xc2, 0x15,
	0x39, 0xb1, 0xc7, 0x9b, 0x65, 0x47, 0x38, 0x68, 0x62, 0x85, 0x25, 0x0f, 0xdf, 0x90, 0xc0, 0x15,
	0xd1, 0x4e, 0x0d, 0xd1, 0x30, 0xf6, 0x66, 0xa7, 0x74, 0x6a, 0x55, 0x33, 0xe0, 0x1b, 0x98, 0x11,
	0x2d, 0x80, 0xb6, 0x5b, 0x47, 0xb1, 0x37, 0x9b, 0xd0, 0x89, 0x11, 0x70, 0xfe, 0x17, 0x12, 0x74,
	0x4b, 0x73, 0xa5, 0x99, 0x56, 0xd1, 0x18, 0x7d, 0x5d, 0x1d, 0xf4, 0x65, 0x11, 0x3a, 0x75, 0xee,
	0x7e, 0x9a, 0xaf, 0xe4, 0x13, 0x99, 0xee, 0xdc, 0xac, 0xc2, 0x1b, 0x32, 0x92, 0x5a, 0x6c, 0x54,
	0xe4, 0xc5, 0x47, 0x33, 0x7f, 0x7e, 0x9e, 0xda, 0xbc, 0xd3, 0x1d, 0x88, 0x5a, 0x22, 0xf9, 0xe3,
	0xfd, 0x8f, 0xfa, 0x0e, 0x2d, 0xef, 0x25, 0x76, 0x4d, 0x7c, 0xce, 0x34, 0x6b, 0x98, 0x5e, 0x77,
	0x71, 0x0f, 0x29, 0xe9, 0xa4, 0x25, 0x0f, 0x6f, 0xc8, 0x90, 0x0b, 0x55, 0x60, 0x36, 0x87, 0xe2,
	0x34, 0x45, 0x8a, 0x48, 0xb8, 0x24, 0x67, 0xea, 0x49, 0xea, 0x62, 0x9d, 0xaf, 0x04, 0xd3, 0x8f,
	0xad, 0x50, 0x98, 0x97, 0x3f, 0x8f, 0xf7, 0xba, 0x5e, 0x70, 0x34, 0xb0, 0xc2, 0xbd, 0xfb, 0x36,
	0xc9, 0x63, 0xa6, 0xcf, 0x6f, 0x33, 0x42, 0xcb, 0x53, 0xa3, 0xde, 0xb9, 0xf7, 0x49, 0x3e, 0x93,
	0xa0, 0x77, 0x9d, 0x0a, 0xdf, 0xf6, 0xb3, 0xb9, 0x78, 0x91, 0x8d, 0xc5, 0x5c, 0x3a, 0xb7, 0xbf,
	0xc8, 0x39, 0xb4, 0x25, 0x7a, 0x2b, 0xa0, 0xe5, 0x8e, 0xbd, 0x3d, 0xfb, 0x7e, 0xdf, 0xc3, 0x7f,
	0xa7, 0xa5, 0xd4, 0xeb, 0xc7, 0x87, 0xb4, 0x80, 0x4d, 0xd6, 0xc1, 0x99, 0x85, 0xdf, 0xb9, 0x9f,
	0x7c, 0xbb, 0xc8, 0x4a, 0x70, 0xda, 0xc3, 0x18, 0xc5, 0xc5, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff,
	0x91, 0x0c, 0xf4, 0xf2, 0x6d, 0x03, 0x00, 0x00,
}
