// Code generated by protoc-gen-go. DO NOT EDIT.
// source: api/legacy/bbsim.proto

package legacy

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	_ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options"
	openolt "github.com/opencord/voltha-protos/v2/go/openolt"
	tech_profile "github.com/opencord/voltha-protos/v2/go/tech_profile"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	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

// OLT information
// This supports the older format of the REST APIs (still used from some clients)
// Please refer to the protos in api/bbsim/bbsim.proto for the latest available version
type OLTInfo struct {
	OltId                int64    `protobuf:"varint,1,opt,name=olt_id,json=oltId,proto3" json:"olt_id,omitempty"`
	OltSerial            string   `protobuf:"bytes,2,opt,name=olt_serial,json=oltSerial,proto3" json:"olt_serial,omitempty"`
	OltIp                string   `protobuf:"bytes,3,opt,name=olt_ip,json=oltIp,proto3" json:"olt_ip,omitempty"`
	OltState             string   `protobuf:"bytes,4,opt,name=olt_state,json=oltState,proto3" json:"olt_state,omitempty"`
	OltVendor            string   `protobuf:"bytes,5,opt,name=olt_vendor,json=oltVendor,proto3" json:"olt_vendor,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_OLTInfo proto.InternalMessageInfo

func (m *OLTInfo) GetOltId() int64 {
	if m != nil {
		return m.OltId
	}
	return 0
}

func (m *OLTInfo) GetOltSerial() string {
	if m != nil {
		return m.OltSerial
	}
	return ""
}

func (m *OLTInfo) GetOltIp() string {
	if m != nil {
		return m.OltIp
	}
	return ""
}

func (m *OLTInfo) GetOltState() string {
	if m != nil {
		return m.OltState
	}
	return ""
}

func (m *OLTInfo) GetOltVendor() string {
	if m != nil {
		return m.OltVendor
	}
	return ""
}

// ONU information
type ONUInfo struct {
	OnuId     uint32 `protobuf:"varint,1,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	PonPortId uint32 `protobuf:"varint,2,opt,name=pon_port_id,json=ponPortId,proto3" json:"pon_port_id,omitempty"`
	// ONU serial number
	OnuSerial string `protobuf:"bytes,3,opt,name=onu_serial,json=onuSerial,proto3" json:"onu_serial,omitempty"`
	// ONU oper state
	OperState string `protobuf:"bytes,4,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"`
	// ONU internal state
	OnuState             string   `protobuf:"bytes,5,opt,name=onu_state,json=onuState,proto3" json:"onu_state,omitempty"`
	Gemports             []uint32 `protobuf:"varint,6,rep,packed,name=gemports,proto3" json:"gemports,omitempty"`
	Tconts               *Tconts  `protobuf:"bytes,7,opt,name=tconts,proto3" json:"tconts,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ONUInfo proto.InternalMessageInfo

func (m *ONUInfo) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *ONUInfo) GetPonPortId() uint32 {
	if m != nil {
		return m.PonPortId
	}
	return 0
}

func (m *ONUInfo) GetOnuSerial() string {
	if m != nil {
		return m.OnuSerial
	}
	return ""
}

func (m *ONUInfo) GetOperState() string {
	if m != nil {
		return m.OperState
	}
	return ""
}

func (m *ONUInfo) GetOnuState() string {
	if m != nil {
		return m.OnuState
	}
	return ""
}

func (m *ONUInfo) GetGemports() []uint32 {
	if m != nil {
		return m.Gemports
	}
	return nil
}

func (m *ONUInfo) GetTconts() *Tconts {
	if m != nil {
		return m.Tconts
	}
	return nil
}

// Bulk ONU operations
type ONUs struct {
	Onus                 []*ONUInfo `protobuf:"bytes,1,rep,name=onus,proto3" json:"onus,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_ONUs proto.InternalMessageInfo

func (m *ONUs) GetOnus() []*ONUInfo {
	if m != nil {
		return m.Onus
	}
	return nil
}

type ONURequest struct {
	Onu                  *ONUInfo `protobuf:"bytes,1,opt,name=onu,proto3" json:"onu,omitempty"`
	OnusBatch            *ONUs    `protobuf:"bytes,2,opt,name=onus_batch,json=onusBatch,proto3" json:"onus_batch,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ONURequest proto.InternalMessageInfo

func (m *ONURequest) GetOnu() *ONUInfo {
	if m != nil {
		return m.Onu
	}
	return nil
}

func (m *ONURequest) GetOnusBatch() *ONUs {
	if m != nil {
		return m.OnusBatch
	}
	return nil
}

// Port information
type PortInfo struct {
	PortType             string   `protobuf:"bytes,1,opt,name=port_type,json=portType,proto3" json:"port_type,omitempty"`
	PortId               uint32   `protobuf:"varint,2,opt,name=port_id,json=portId,proto3" json:"port_id,omitempty"`
	PonPortMaxOnus       uint32   `protobuf:"varint,3,opt,name=pon_port_max_onus,json=ponPortMaxOnus,proto3" json:"pon_port_max_onus,omitempty"`
	PonPortActiveOnus    uint32   `protobuf:"varint,4,opt,name=pon_port_active_onus,json=ponPortActiveOnus,proto3" json:"pon_port_active_onus,omitempty"`
	PortState            string   `protobuf:"bytes,5,opt,name=port_state,json=portState,proto3" json:"port_state,omitempty"`
	AlarmState           string   `protobuf:"bytes,6,opt,name=alarm_state,json=alarmState,proto3" json:"alarm_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PortInfo proto.InternalMessageInfo

func (m *PortInfo) GetPortType() string {
	if m != nil {
		return m.PortType
	}
	return ""
}

func (m *PortInfo) GetPortId() uint32 {
	if m != nil {
		return m.PortId
	}
	return 0
}

func (m *PortInfo) GetPonPortMaxOnus() uint32 {
	if m != nil {
		return m.PonPortMaxOnus
	}
	return 0
}

func (m *PortInfo) GetPonPortActiveOnus() uint32 {
	if m != nil {
		return m.PonPortActiveOnus
	}
	return 0
}

func (m *PortInfo) GetPortState() string {
	if m != nil {
		return m.PortState
	}
	return ""
}

func (m *PortInfo) GetAlarmState() string {
	if m != nil {
		return m.AlarmState
	}
	return ""
}

// Bulk port information
type Ports struct {
	Ports                []*PortInfo `protobuf:"bytes,1,rep,name=ports,proto3" json:"ports,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Ports) Reset()         { *m = Ports{} }
func (m *Ports) String() string { return proto.CompactTextString(m) }
func (*Ports) ProtoMessage()    {}
func (*Ports) Descriptor() ([]byte, []int) {
	return fileDescriptor_6ea2bed57327b60e, []int{5}
}

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

var xxx_messageInfo_Ports proto.InternalMessageInfo

func (m *Ports) GetPorts() []*PortInfo {
	if m != nil {
		return m.Ports
	}
	return nil
}

// BBSim status
type OLTStatusResponse struct {
	Olt                  *OLTInfo    `protobuf:"bytes,1,opt,name=olt,proto3" json:"olt,omitempty"`
	Ports                []*PortInfo `protobuf:"bytes,2,rep,name=ports,proto3" json:"ports,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *OLTStatusResponse) Reset()         { *m = OLTStatusResponse{} }
func (m *OLTStatusResponse) String() string { return proto.CompactTextString(m) }
func (*OLTStatusResponse) ProtoMessage()    {}
func (*OLTStatusResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6ea2bed57327b60e, []int{6}
}

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

var xxx_messageInfo_OLTStatusResponse proto.InternalMessageInfo

func (m *OLTStatusResponse) GetOlt() *OLTInfo {
	if m != nil {
		return m.Olt
	}
	return nil
}

func (m *OLTStatusResponse) GetPorts() []*PortInfo {
	if m != nil {
		return m.Ports
	}
	return nil
}

// BBSim response message
type BBSimResponse struct {
	StatusMsg            string   `protobuf:"bytes,1,opt,name=status_msg,json=statusMsg,proto3" json:"status_msg,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BBSimResponse) Reset()         { *m = BBSimResponse{} }
func (m *BBSimResponse) String() string { return proto.CompactTextString(m) }
func (*BBSimResponse) ProtoMessage()    {}
func (*BBSimResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6ea2bed57327b60e, []int{7}
}

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

var xxx_messageInfo_BBSimResponse proto.InternalMessageInfo

func (m *BBSimResponse) GetStatusMsg() string {
	if m != nil {
		return m.StatusMsg
	}
	return ""
}

// ONU alarm request
type ONUAlarmRequest struct {
	// ONU serial number
	OnuSerial string `protobuf:"bytes,1,opt,name=onu_serial,json=onuSerial,proto3" json:"onu_serial,omitempty"`
	// Alarm types are:
	//   "signaldegrade"
	//   "lossofomcichannel"
	//   "lossofploam"
	AlarmType string `protobuf:"bytes,2,opt,name=alarm_type,json=alarmType,proto3" json:"alarm_type,omitempty"`
	// "on"/"off" indicates raised or cleared alarm
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ONUAlarmRequest) Reset()         { *m = ONUAlarmRequest{} }
func (m *ONUAlarmRequest) String() string { return proto.CompactTextString(m) }
func (*ONUAlarmRequest) ProtoMessage()    {}
func (*ONUAlarmRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6ea2bed57327b60e, []int{8}
}

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

var xxx_messageInfo_ONUAlarmRequest proto.InternalMessageInfo

func (m *ONUAlarmRequest) GetOnuSerial() string {
	if m != nil {
		return m.OnuSerial
	}
	return ""
}

func (m *ONUAlarmRequest) GetAlarmType() string {
	if m != nil {
		return m.AlarmType
	}
	return ""
}

func (m *ONUAlarmRequest) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

// OLT alarm request
type OLTAlarmRequest struct {
	PortId               uint32   `protobuf:"varint,1,opt,name=port_id,json=portId,proto3" json:"port_id,omitempty"`
	PortType             string   `protobuf:"bytes,2,opt,name=port_type,json=portType,proto3" json:"port_type,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OLTAlarmRequest) Reset()         { *m = OLTAlarmRequest{} }
func (m *OLTAlarmRequest) String() string { return proto.CompactTextString(m) }
func (*OLTAlarmRequest) ProtoMessage()    {}
func (*OLTAlarmRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6ea2bed57327b60e, []int{9}
}

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

var xxx_messageInfo_OLTAlarmRequest proto.InternalMessageInfo

func (m *OLTAlarmRequest) GetPortId() uint32 {
	if m != nil {
		return m.PortId
	}
	return 0
}

func (m *OLTAlarmRequest) GetPortType() string {
	if m != nil {
		return m.PortType
	}
	return ""
}

func (m *OLTAlarmRequest) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

// Device action
type DeviceAction struct {
	DeviceType           string   `protobuf:"bytes,1,opt,name=device_type,json=deviceType,proto3" json:"device_type,omitempty"`
	SerialNumber         string   `protobuf:"bytes,2,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
	Action               string   `protobuf:"bytes,3,opt,name=action,proto3" json:"action,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeviceAction) Reset()         { *m = DeviceAction{} }
func (m *DeviceAction) String() string { return proto.CompactTextString(m) }
func (*DeviceAction) ProtoMessage()    {}
func (*DeviceAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_6ea2bed57327b60e, []int{10}
}

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

var xxx_messageInfo_DeviceAction proto.InternalMessageInfo

func (m *DeviceAction) GetDeviceType() string {
	if m != nil {
		return m.DeviceType
	}
	return ""
}

func (m *DeviceAction) GetSerialNumber() string {
	if m != nil {
		return m.SerialNumber
	}
	return ""
}

func (m *DeviceAction) GetAction() string {
	if m != nil {
		return m.Action
	}
	return ""
}

type Tconts struct {
	UniId                uint32                           `protobuf:"fixed32,4,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
	PortNo               uint32                           `protobuf:"fixed32,5,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	Tconts               []*tech_profile.TrafficScheduler `protobuf:"bytes,3,rep,name=tconts,proto3" json:"tconts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
	XXX_unrecognized     []byte                           `json:"-"`
	XXX_sizecache        int32                            `json:"-"`
}

func (m *Tconts) Reset()         { *m = Tconts{} }
func (m *Tconts) String() string { return proto.CompactTextString(m) }
func (*Tconts) ProtoMessage()    {}
func (*Tconts) Descriptor() ([]byte, []int) {
	return fileDescriptor_6ea2bed57327b60e, []int{11}
}

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

var xxx_messageInfo_Tconts proto.InternalMessageInfo

func (m *Tconts) GetUniId() uint32 {
	if m != nil {
		return m.UniId
	}
	return 0
}

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

func (m *Tconts) GetTconts() []*tech_profile.TrafficScheduler {
	if m != nil {
		return m.Tconts
	}
	return nil
}

type Flows struct {
	Flows                []*openolt.Flow `protobuf:"bytes,1,rep,name=flows,proto3" json:"flows,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_6ea2bed57327b60e, []int{12}
}

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 (m *Flows) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Flows.Merge(m, 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) GetFlows() []*openolt.Flow {
	if m != nil {
		return m.Flows
	}
	return nil
}

type Empty struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Empty) Reset()         { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage()    {}
func (*Empty) Descriptor() ([]byte, []int) {
	return fileDescriptor_6ea2bed57327b60e, []int{13}
}

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

var xxx_messageInfo_Empty proto.InternalMessageInfo

func init() {
	proto.RegisterType((*OLTInfo)(nil), "legacy.OLTInfo")
	proto.RegisterType((*ONUInfo)(nil), "legacy.ONUInfo")
	proto.RegisterType((*ONUs)(nil), "legacy.ONUs")
	proto.RegisterType((*ONURequest)(nil), "legacy.ONURequest")
	proto.RegisterType((*PortInfo)(nil), "legacy.PortInfo")
	proto.RegisterType((*Ports)(nil), "legacy.Ports")
	proto.RegisterType((*OLTStatusResponse)(nil), "legacy.OLTStatusResponse")
	proto.RegisterType((*BBSimResponse)(nil), "legacy.BBSimResponse")
	proto.RegisterType((*ONUAlarmRequest)(nil), "legacy.ONUAlarmRequest")
	proto.RegisterType((*OLTAlarmRequest)(nil), "legacy.OLTAlarmRequest")
	proto.RegisterType((*DeviceAction)(nil), "legacy.DeviceAction")
	proto.RegisterType((*Tconts)(nil), "legacy.Tconts")
	proto.RegisterType((*Flows)(nil), "legacy.Flows")
	proto.RegisterType((*Empty)(nil), "legacy.Empty")
}

func init() { proto.RegisterFile("api/legacy/bbsim.proto", fileDescriptor_6ea2bed57327b60e) }

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

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// BBSimServiceClient is the client API for BBSimService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type BBSimServiceClient interface {
	// Get current status of OLT
	OLTStatus(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*OLTStatusResponse, error)
	// Get status of a PON/NNI port
	PortStatus(ctx context.Context, in *PortInfo, opts ...grpc.CallOption) (*Ports, error)
	// Get status of all or specific ONUs
	ONUStatus(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*ONUs, error)
	// Single/bulk activate ONU(s) for specific PON port(s)
	ONUActivate(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*BBSimResponse, error)
	// Deactivate ONU(s) for specific PON port(s) specified by
	// a given onu_serial, onu_id, or pon_port_id
	ONUDeactivate(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*BBSimResponse, error)
	// Generate ONU related alarms
	GenerateONUAlarm(ctx context.Context, in *ONUAlarmRequest, opts ...grpc.CallOption) (*BBSimResponse, error)
	// Generate OLT related alarms
	GenerateOLTAlarm(ctx context.Context, in *OLTAlarmRequest, opts ...grpc.CallOption) (*BBSimResponse, error)
	// Perform actions on OLT/ONU devices (e.g. reboot)
	PerformDeviceAction(ctx context.Context, in *DeviceAction, opts ...grpc.CallOption) (*BBSimResponse, error)
	// Get flows
	GetFlows(ctx context.Context, in *ONUInfo, opts ...grpc.CallOption) (*Flows, error)
}

type bBSimServiceClient struct {
	cc *grpc.ClientConn
}

func NewBBSimServiceClient(cc *grpc.ClientConn) BBSimServiceClient {
	return &bBSimServiceClient{cc}
}

// Deprecated: Do not use.
func (c *bBSimServiceClient) OLTStatus(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*OLTStatusResponse, error) {
	out := new(OLTStatusResponse)
	err := c.cc.Invoke(ctx, "/legacy.BBSimService/OLTStatus", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// Deprecated: Do not use.
func (c *bBSimServiceClient) PortStatus(ctx context.Context, in *PortInfo, opts ...grpc.CallOption) (*Ports, error) {
	out := new(Ports)
	err := c.cc.Invoke(ctx, "/legacy.BBSimService/PortStatus", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// Deprecated: Do not use.
func (c *bBSimServiceClient) ONUStatus(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*ONUs, error) {
	out := new(ONUs)
	err := c.cc.Invoke(ctx, "/legacy.BBSimService/ONUStatus", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// Deprecated: Do not use.
func (c *bBSimServiceClient) ONUActivate(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*BBSimResponse, error) {
	out := new(BBSimResponse)
	err := c.cc.Invoke(ctx, "/legacy.BBSimService/ONUActivate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// Deprecated: Do not use.
func (c *bBSimServiceClient) ONUDeactivate(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*BBSimResponse, error) {
	out := new(BBSimResponse)
	err := c.cc.Invoke(ctx, "/legacy.BBSimService/ONUDeactivate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// Deprecated: Do not use.
func (c *bBSimServiceClient) GenerateONUAlarm(ctx context.Context, in *ONUAlarmRequest, opts ...grpc.CallOption) (*BBSimResponse, error) {
	out := new(BBSimResponse)
	err := c.cc.Invoke(ctx, "/legacy.BBSimService/GenerateONUAlarm", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// Deprecated: Do not use.
func (c *bBSimServiceClient) GenerateOLTAlarm(ctx context.Context, in *OLTAlarmRequest, opts ...grpc.CallOption) (*BBSimResponse, error) {
	out := new(BBSimResponse)
	err := c.cc.Invoke(ctx, "/legacy.BBSimService/GenerateOLTAlarm", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// Deprecated: Do not use.
func (c *bBSimServiceClient) PerformDeviceAction(ctx context.Context, in *DeviceAction, opts ...grpc.CallOption) (*BBSimResponse, error) {
	out := new(BBSimResponse)
	err := c.cc.Invoke(ctx, "/legacy.BBSimService/PerformDeviceAction", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// Deprecated: Do not use.
func (c *bBSimServiceClient) GetFlows(ctx context.Context, in *ONUInfo, opts ...grpc.CallOption) (*Flows, error) {
	out := new(Flows)
	err := c.cc.Invoke(ctx, "/legacy.BBSimService/GetFlows", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// BBSimServiceServer is the server API for BBSimService service.
type BBSimServiceServer interface {
	// Get current status of OLT
	OLTStatus(context.Context, *Empty) (*OLTStatusResponse, error)
	// Get status of a PON/NNI port
	PortStatus(context.Context, *PortInfo) (*Ports, error)
	// Get status of all or specific ONUs
	ONUStatus(context.Context, *ONURequest) (*ONUs, error)
	// Single/bulk activate ONU(s) for specific PON port(s)
	ONUActivate(context.Context, *ONURequest) (*BBSimResponse, error)
	// Deactivate ONU(s) for specific PON port(s) specified by
	// a given onu_serial, onu_id, or pon_port_id
	ONUDeactivate(context.Context, *ONURequest) (*BBSimResponse, error)
	// Generate ONU related alarms
	GenerateONUAlarm(context.Context, *ONUAlarmRequest) (*BBSimResponse, error)
	// Generate OLT related alarms
	GenerateOLTAlarm(context.Context, *OLTAlarmRequest) (*BBSimResponse, error)
	// Perform actions on OLT/ONU devices (e.g. reboot)
	PerformDeviceAction(context.Context, *DeviceAction) (*BBSimResponse, error)
	// Get flows
	GetFlows(context.Context, *ONUInfo) (*Flows, error)
}

// UnimplementedBBSimServiceServer can be embedded to have forward compatible implementations.
type UnimplementedBBSimServiceServer struct {
}

func (*UnimplementedBBSimServiceServer) OLTStatus(ctx context.Context, req *Empty) (*OLTStatusResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method OLTStatus not implemented")
}
func (*UnimplementedBBSimServiceServer) PortStatus(ctx context.Context, req *PortInfo) (*Ports, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PortStatus not implemented")
}
func (*UnimplementedBBSimServiceServer) ONUStatus(ctx context.Context, req *ONURequest) (*ONUs, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ONUStatus not implemented")
}
func (*UnimplementedBBSimServiceServer) ONUActivate(ctx context.Context, req *ONURequest) (*BBSimResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ONUActivate not implemented")
}
func (*UnimplementedBBSimServiceServer) ONUDeactivate(ctx context.Context, req *ONURequest) (*BBSimResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ONUDeactivate not implemented")
}
func (*UnimplementedBBSimServiceServer) GenerateONUAlarm(ctx context.Context, req *ONUAlarmRequest) (*BBSimResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GenerateONUAlarm not implemented")
}
func (*UnimplementedBBSimServiceServer) GenerateOLTAlarm(ctx context.Context, req *OLTAlarmRequest) (*BBSimResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GenerateOLTAlarm not implemented")
}
func (*UnimplementedBBSimServiceServer) PerformDeviceAction(ctx context.Context, req *DeviceAction) (*BBSimResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PerformDeviceAction not implemented")
}
func (*UnimplementedBBSimServiceServer) GetFlows(ctx context.Context, req *ONUInfo) (*Flows, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetFlows not implemented")
}

func RegisterBBSimServiceServer(s *grpc.Server, srv BBSimServiceServer) {
	s.RegisterService(&_BBSimService_serviceDesc, srv)
}

func _BBSimService_OLTStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServiceServer).OLTStatus(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/legacy.BBSimService/OLTStatus",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServiceServer).OLTStatus(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSimService_PortStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PortInfo)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServiceServer).PortStatus(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/legacy.BBSimService/PortStatus",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServiceServer).PortStatus(ctx, req.(*PortInfo))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSimService_ONUStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONURequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServiceServer).ONUStatus(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/legacy.BBSimService/ONUStatus",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServiceServer).ONUStatus(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSimService_ONUActivate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONURequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServiceServer).ONUActivate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/legacy.BBSimService/ONUActivate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServiceServer).ONUActivate(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSimService_ONUDeactivate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONURequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServiceServer).ONUDeactivate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/legacy.BBSimService/ONUDeactivate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServiceServer).ONUDeactivate(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSimService_GenerateONUAlarm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONUAlarmRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServiceServer).GenerateONUAlarm(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/legacy.BBSimService/GenerateONUAlarm",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServiceServer).GenerateONUAlarm(ctx, req.(*ONUAlarmRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSimService_GenerateOLTAlarm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(OLTAlarmRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServiceServer).GenerateOLTAlarm(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/legacy.BBSimService/GenerateOLTAlarm",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServiceServer).GenerateOLTAlarm(ctx, req.(*OLTAlarmRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSimService_PerformDeviceAction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeviceAction)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServiceServer).PerformDeviceAction(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/legacy.BBSimService/PerformDeviceAction",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServiceServer).PerformDeviceAction(ctx, req.(*DeviceAction))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSimService_GetFlows_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ONUInfo)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServiceServer).GetFlows(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/legacy.BBSimService/GetFlows",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServiceServer).GetFlows(ctx, req.(*ONUInfo))
	}
	return interceptor(ctx, in, info, handler)
}

var _BBSimService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "legacy.BBSimService",
	HandlerType: (*BBSimServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "OLTStatus",
			Handler:    _BBSimService_OLTStatus_Handler,
		},
		{
			MethodName: "PortStatus",
			Handler:    _BBSimService_PortStatus_Handler,
		},
		{
			MethodName: "ONUStatus",
			Handler:    _BBSimService_ONUStatus_Handler,
		},
		{
			MethodName: "ONUActivate",
			Handler:    _BBSimService_ONUActivate_Handler,
		},
		{
			MethodName: "ONUDeactivate",
			Handler:    _BBSimService_ONUDeactivate_Handler,
		},
		{
			MethodName: "GenerateONUAlarm",
			Handler:    _BBSimService_GenerateONUAlarm_Handler,
		},
		{
			MethodName: "GenerateOLTAlarm",
			Handler:    _BBSimService_GenerateOLTAlarm_Handler,
		},
		{
			MethodName: "PerformDeviceAction",
			Handler:    _BBSimService_PerformDeviceAction_Handler,
		},
		{
			MethodName: "GetFlows",
			Handler:    _BBSimService_GetFlows_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "api/legacy/bbsim.proto",
}
