// 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/v4/go/common"
	openflow_13 "github.com/opencord/voltha-protos/v4/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, 0x3a, 0x3d, 0xb4, 0x87, 0x1e, 0x1a, 0x42, 0xc0, 0x50, 0xda, 0xb2, 0x85, 0x1e,
	0x7a, 0x11, 0x1b, 0xed, 0x5a, 0x5e, 0x90, 0x35, 0x42, 0xbb, 0x71, 0x5e, 0xb6, 0x4f, 0xd1, 0x27,
	0x28, 0x3b, 0xbb, 0x6a, 0xa5, 0x38, 0x47, 0xfd, 0xf3, 0xcd, 0xcc, 0x3f, 0xff, 0x8a, 0x24, 0x3b,
	0xa8, 0xf4, 0x86, 0xe5, 0x4d, 0x0b, 0x1a, 0x54, 0x56, 0x41, 0x29, 0x0b, 0x56, 0xe5, 0x5c, 0xec,
	0x64, 0x21, 0x52, 0x54, 0xc3, 0xa9, 0x65, 0xce, 0x5f, 0x96, 0x00, 0x65, 0x25, 0x32, 0xd6, 0xc8,
	0x8c, 0xd5, 0x35, 0x68, 0xa6, 0x25, 0xd4, 0xca, 0x52, 0xe7, 0xd1, 0x70, 0xd2, 0x56, 0x68, 0xe6,
	0x2a, 0x97, 0xc3, 0x0a, 0x34, 0xa2, 0x5e, 0x57, 0xf0, 0x98, 0xbf, 0xbb, 0xb6, 0x40, 0xf2, 0x81,
	0x1c, 0x7f, 0xb1, 0x8b, 0xbf, 0x43, 0xab, 0x57, 0x3c, 0x0c, 0xc8, 0x48, 0xf2, 0xc8, 0x8b, 0xbd,
	0xc5, 0x11, 0x1d, 0x49, 0x1e, 0xbe, 0x20, 0x87, 0x0d, 0xb4, 0x3a, 0x97, 0x3c, 0x1a, 0xa1, 0x38,
	0x6d, 0x10, 0x4c, 0xfe, 0x78, 0xc4, 0xef, 0xb5, 0xee, 0x35, 0xbe, 0x25, 0x33, 0x58, 0x37, 0xb9,
	0xa1, 0xb1, 0xd3, 0x5f, 0x9e, 0xa5, 0xfd, 0xfd, 0x5d, 0x91, 0x1e, 0xc2, 0xba, 0xc1, 0x09, 0x17,
	0xe4, 0xc8, 0x1e, 0x6f, 0x96, 0x1d, 0xe0, 0xa0, 0x99, 0x15, 0x56, 0x3c, 0x7c, 0x45, 0x02, 0x57,
	0x44, 0x3b, 0x35, 0x44, 0xe3, 0xd8, 0x5b, 0x1c, 0xd3, 0xb9, 0x55, 0xcd, 0x80, 0xaf, 0x60, 0x46,
	0xb4, 0x00, 0xda, 0x6e, 0x9d, 0xc4, 0xde, 0x62, 0x46, 0x67, 0x46, 0xc0, 0xf9, 0x9f, 0x49, 0xd0,
	0x2d, 0xcd, 0x95, 0x66, 0x5a, 0x45, 0x53, 0xf4, 0x75, 0xf1, 0xac, 0x2f, 0x8b, 0xd0, 0xb9, 0x73,
	0xf7, 0xc3, 0x7c, 0x25, 0x1f, 0xc9, 0xbc, 0x77, 0xb3, 0x0a, 0xaf, 0xc8, 0x44, 0x6a, 0xb1, 0x55,
	0x91, 0x17, 0x1f, 0x2c, 0xfc, 0xe5, 0x69, 0x6a, 0xf3, 0x4e, 0x7b, 0x10, 0xb5, 0x44, 0xf2, 0xdb,
	0xfb, 0x17, 0xf5, 0x2d, 0x5a, 0xde, 0x4b, 0xec, 0x92, 0xf8, 0x9c, 0x69, 0xd6, 0x30, 0xbd, 0xe9,
	0xe2, 0x1e, 0x53, 0xd2, 0x49, 0x2b, 0x1e, 0x5e, 0x91, 0x31, 0x17, 0xaa, 0xc0, 0x6c, 0x9e, 0x8b,
	0xd3, 0x14, 0x29, 0x22, 0xe1, 0x8a, 0x9c, 0xa8, 0x47, 0xa9, 0x8b, 0x4d, 0xbe, 0x16, 0x4c, 0x3f,
	0xb4, 0x42, 0x61, 0x5e, 0xfe, 0x32, 0xde, 0xeb, 0x7a, 0xc2, 0xd1, 0xc0, 0x0a, 0x77, 0xee, 0xdb,
	0x24, 0x8f, 0x99, 0xfe, 0x7f, 0x9b, 0x09, 0x5a, 0x9e, 0x1b, 0xf5, 0xd6, 0xbd, 0x4f, 0xf2, 0x89,
	0x04, 0x83, 0xeb, 0x54, 0xf8, 0x7a, 0x98, 0xcd, 0xd9, 0x93, 0x6c, 0x2c, 0xe6, 0xd2, 0xb9, 0xf9,
	0x49, 0x4e, 0xa1, 0x2d, 0xd1, 0x5b, 0x01, 0x2d, 0x77, 0xec, 0xcd, 0xc9, 0xb7, 0xbb, 0x01, 0xfe,
	0x2b, 0x2d, 0xa5, 0xde, 0x3c, 0xdc, 0xa7, 0x05, 0x6c, 0xb3, 0x0e, 0xce, 0x2c, 0xfc, 0xc6, 0xfd,
	0xe4, 0xbb, 0xf7, 0x59, 0x09, 0x4e, 0xbb, 0x9f, 0xa2, 0x78, 0xfd, 0x37, 0x00, 0x00, 0xff, 0xff,
	0xda, 0x87, 0xca, 0xb8, 0x6d, 0x03, 0x00, 0x00,
}
