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

package bbsim

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	openolt "github.com/opencord/voltha-protos/v4/go/openolt"
	tech_profile "github.com/opencord/voltha-protos/v4/go/tech_profile"
	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

type SubActionTypes int32

const (
	SubActionTypes_JOIN   SubActionTypes = 0
	SubActionTypes_LEAVE  SubActionTypes = 1
	SubActionTypes_JOINV3 SubActionTypes = 2
)

var SubActionTypes_name = map[int32]string{
	0: "JOIN",
	1: "LEAVE",
	2: "JOINV3",
}

var SubActionTypes_value = map[string]int32{
	"JOIN":   0,
	"LEAVE":  1,
	"JOINV3": 2,
}

func (x SubActionTypes) String() string {
	return proto.EnumName(SubActionTypes_name, int32(x))
}

func (SubActionTypes) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{0}
}

// These types correspond to the messages permitted in the oneof
// in AlarmIndication in the openolt protos
type AlarmType_Types int32

const (
	AlarmType_LOS                                   AlarmType_Types = 0
	AlarmType_DYING_GASP                            AlarmType_Types = 1
	AlarmType_ONU_ALARM                             AlarmType_Types = 2
	AlarmType_ONU_STARTUP_FAILURE                   AlarmType_Types = 3
	AlarmType_ONU_SIGNAL_DEGRADE                    AlarmType_Types = 4
	AlarmType_ONU_DRIFT_OF_WINDOW                   AlarmType_Types = 5
	AlarmType_ONU_LOSS_OF_OMCI_CHANNEL              AlarmType_Types = 6
	AlarmType_ONU_SIGNALS_FAILURE                   AlarmType_Types = 7
	AlarmType_ONU_TRANSMISSION_INTERFERENCE_WARNING AlarmType_Types = 8
	AlarmType_ONU_ACTIVATION_FAILURE                AlarmType_Types = 9
	AlarmType_ONU_PROCESSING_ERROR                  AlarmType_Types = 10
	AlarmType_ONU_LOSS_OF_KEY_SYNC_FAILURE          AlarmType_Types = 11
	AlarmType_ONU_ITU_PON_STATS                     AlarmType_Types = 12
	// These break out ONU_ALARM, which is a single message, but
	// includes statuses for these six alarms.
	AlarmType_ONU_ALARM_LOS            AlarmType_Types = 13
	AlarmType_ONU_ALARM_LOB            AlarmType_Types = 14
	AlarmType_ONU_ALARM_LOPC_MISS      AlarmType_Types = 15
	AlarmType_ONU_ALARM_LOPC_MIC_ERROR AlarmType_Types = 16
	AlarmType_ONU_ALARM_LOFI           AlarmType_Types = 17
	AlarmType_ONU_ALARM_LOAMI          AlarmType_Types = 18
)

var AlarmType_Types_name = map[int32]string{
	0:  "LOS",
	1:  "DYING_GASP",
	2:  "ONU_ALARM",
	3:  "ONU_STARTUP_FAILURE",
	4:  "ONU_SIGNAL_DEGRADE",
	5:  "ONU_DRIFT_OF_WINDOW",
	6:  "ONU_LOSS_OF_OMCI_CHANNEL",
	7:  "ONU_SIGNALS_FAILURE",
	8:  "ONU_TRANSMISSION_INTERFERENCE_WARNING",
	9:  "ONU_ACTIVATION_FAILURE",
	10: "ONU_PROCESSING_ERROR",
	11: "ONU_LOSS_OF_KEY_SYNC_FAILURE",
	12: "ONU_ITU_PON_STATS",
	13: "ONU_ALARM_LOS",
	14: "ONU_ALARM_LOB",
	15: "ONU_ALARM_LOPC_MISS",
	16: "ONU_ALARM_LOPC_MIC_ERROR",
	17: "ONU_ALARM_LOFI",
	18: "ONU_ALARM_LOAMI",
}

var AlarmType_Types_value = map[string]int32{
	"LOS":                                   0,
	"DYING_GASP":                            1,
	"ONU_ALARM":                             2,
	"ONU_STARTUP_FAILURE":                   3,
	"ONU_SIGNAL_DEGRADE":                    4,
	"ONU_DRIFT_OF_WINDOW":                   5,
	"ONU_LOSS_OF_OMCI_CHANNEL":              6,
	"ONU_SIGNALS_FAILURE":                   7,
	"ONU_TRANSMISSION_INTERFERENCE_WARNING": 8,
	"ONU_ACTIVATION_FAILURE":                9,
	"ONU_PROCESSING_ERROR":                  10,
	"ONU_LOSS_OF_KEY_SYNC_FAILURE":          11,
	"ONU_ITU_PON_STATS":                     12,
	"ONU_ALARM_LOS":                         13,
	"ONU_ALARM_LOB":                         14,
	"ONU_ALARM_LOPC_MISS":                   15,
	"ONU_ALARM_LOPC_MIC_ERROR":              16,
	"ONU_ALARM_LOFI":                        17,
	"ONU_ALARM_LOAMI":                       18,
}

func (x AlarmType_Types) String() string {
	return proto.EnumName(AlarmType_Types_name, int32(x))
}

func (AlarmType_Types) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{10, 0}
}

type PONPort struct {
	ID                   int32    `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"`
	OperState            string   `protobuf:"bytes,2,opt,name=OperState,proto3" json:"OperState,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PONPort proto.InternalMessageInfo

func (m *PONPort) GetID() int32 {
	if m != nil {
		return m.ID
	}
	return 0
}

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

type NNIPort struct {
	ID                   int32    `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"`
	OperState            string   `protobuf:"bytes,2,opt,name=OperState,proto3" json:"OperState,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_NNIPort proto.InternalMessageInfo

func (m *NNIPort) GetID() int32 {
	if m != nil {
		return m.ID
	}
	return 0
}

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

type Olt struct {
	ID                   int32      `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"`
	SerialNumber         string     `protobuf:"bytes,2,opt,name=SerialNumber,proto3" json:"SerialNumber,omitempty"`
	OperState            string     `protobuf:"bytes,3,opt,name=OperState,proto3" json:"OperState,omitempty"`
	InternalState        string     `protobuf:"bytes,4,opt,name=InternalState,proto3" json:"InternalState,omitempty"`
	IP                   string     `protobuf:"bytes,7,opt,name=IP,proto3" json:"IP,omitempty"`
	NNIPorts             []*NNIPort `protobuf:"bytes,5,rep,name=NNIPorts,proto3" json:"NNIPorts,omitempty"`
	PONPorts             []*PONPort `protobuf:"bytes,6,rep,name=PONPorts,proto3" json:"PONPorts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_Olt proto.InternalMessageInfo

func (m *Olt) GetID() int32 {
	if m != nil {
		return m.ID
	}
	return 0
}

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

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

func (m *Olt) GetInternalState() string {
	if m != nil {
		return m.InternalState
	}
	return ""
}

func (m *Olt) GetIP() string {
	if m != nil {
		return m.IP
	}
	return ""
}

func (m *Olt) GetNNIPorts() []*NNIPort {
	if m != nil {
		return m.NNIPorts
	}
	return nil
}

func (m *Olt) GetPONPorts() []*PONPort {
	if m != nil {
		return m.PONPorts
	}
	return nil
}

type ONU struct {
	ID                   int32      `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"`
	SerialNumber         string     `protobuf:"bytes,2,opt,name=SerialNumber,proto3" json:"SerialNumber,omitempty"`
	OperState            string     `protobuf:"bytes,3,opt,name=OperState,proto3" json:"OperState,omitempty"`
	InternalState        string     `protobuf:"bytes,4,opt,name=InternalState,proto3" json:"InternalState,omitempty"`
	PonPortID            int32      `protobuf:"varint,5,opt,name=PonPortID,proto3" json:"PonPortID,omitempty"`
	HwAddress            string     `protobuf:"bytes,8,opt,name=HwAddress,proto3" json:"HwAddress,omitempty"`
	PortNo               int32      `protobuf:"varint,9,opt,name=PortNo,proto3" json:"PortNo,omitempty"`
	Services             []*Service `protobuf:"bytes,10,rep,name=services,proto3" json:"services,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_ONU proto.InternalMessageInfo

func (m *ONU) GetID() int32 {
	if m != nil {
		return m.ID
	}
	return 0
}

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

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

func (m *ONU) GetInternalState() string {
	if m != nil {
		return m.InternalState
	}
	return ""
}

func (m *ONU) GetPonPortID() int32 {
	if m != nil {
		return m.PonPortID
	}
	return 0
}

func (m *ONU) GetHwAddress() string {
	if m != nil {
		return m.HwAddress
	}
	return ""
}

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

func (m *ONU) GetServices() []*Service {
	if m != nil {
		return m.Services
	}
	return nil
}

type Service struct {
	Name                 string   `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"`
	HwAddress            string   `protobuf:"bytes,2,opt,name=HwAddress,proto3" json:"HwAddress,omitempty"`
	OnuSn                string   `protobuf:"bytes,3,opt,name=OnuSn,proto3" json:"OnuSn,omitempty"`
	STag                 int32    `protobuf:"varint,4,opt,name=STag,proto3" json:"STag,omitempty"`
	CTag                 int32    `protobuf:"varint,5,opt,name=CTag,proto3" json:"CTag,omitempty"`
	NeedsEapol           bool     `protobuf:"varint,6,opt,name=NeedsEapol,proto3" json:"NeedsEapol,omitempty"`
	NeedsDhcp            bool     `protobuf:"varint,7,opt,name=NeedsDhcp,proto3" json:"NeedsDhcp,omitempty"`
	NeedsIgmp            bool     `protobuf:"varint,8,opt,name=NeedsIgmp,proto3" json:"NeedsIgmp,omitempty"`
	GemPort              int32    `protobuf:"varint,9,opt,name=GemPort,proto3" json:"GemPort,omitempty"`
	EapolState           string   `protobuf:"bytes,10,opt,name=EapolState,proto3" json:"EapolState,omitempty"`
	DhcpState            string   `protobuf:"bytes,11,opt,name=DhcpState,proto3" json:"DhcpState,omitempty"`
	InternalState        string   `protobuf:"bytes,12,opt,name=InternalState,proto3" json:"InternalState,omitempty"`
	IGMPState            string   `protobuf:"bytes,13,opt,name=IGMPState,proto3" json:"IGMPState,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Service proto.InternalMessageInfo

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

func (m *Service) GetHwAddress() string {
	if m != nil {
		return m.HwAddress
	}
	return ""
}

func (m *Service) GetOnuSn() string {
	if m != nil {
		return m.OnuSn
	}
	return ""
}

func (m *Service) GetSTag() int32 {
	if m != nil {
		return m.STag
	}
	return 0
}

func (m *Service) GetCTag() int32 {
	if m != nil {
		return m.CTag
	}
	return 0
}

func (m *Service) GetNeedsEapol() bool {
	if m != nil {
		return m.NeedsEapol
	}
	return false
}

func (m *Service) GetNeedsDhcp() bool {
	if m != nil {
		return m.NeedsDhcp
	}
	return false
}

func (m *Service) GetNeedsIgmp() bool {
	if m != nil {
		return m.NeedsIgmp
	}
	return false
}

func (m *Service) GetGemPort() int32 {
	if m != nil {
		return m.GemPort
	}
	return 0
}

func (m *Service) GetEapolState() string {
	if m != nil {
		return m.EapolState
	}
	return ""
}

func (m *Service) GetDhcpState() string {
	if m != nil {
		return m.DhcpState
	}
	return ""
}

func (m *Service) GetInternalState() string {
	if m != nil {
		return m.InternalState
	}
	return ""
}

func (m *Service) GetIGMPState() string {
	if m != nil {
		return m.IGMPState
	}
	return ""
}

type ONUTrafficSchedulers struct {
	TraffSchedulers      *tech_profile.TrafficSchedulers `protobuf:"bytes,1,opt,name=traffSchedulers,proto3" json:"traffSchedulers,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

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

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

var xxx_messageInfo_ONUTrafficSchedulers proto.InternalMessageInfo

func (m *ONUTrafficSchedulers) GetTraffSchedulers() *tech_profile.TrafficSchedulers {
	if m != nil {
		return m.TraffSchedulers
	}
	return nil
}

type ONUs struct {
	Items                []*ONU   `protobuf:"bytes,1,rep,name=items,proto3" json:"items,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_ef7750073d18011b, []int{6}
}

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) GetItems() []*ONU {
	if m != nil {
		return m.Items
	}
	return nil
}

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

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

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

var xxx_messageInfo_Services proto.InternalMessageInfo

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

type ONURequest struct {
	SerialNumber         string   `protobuf:"bytes,1,opt,name=SerialNumber,proto3" json:"SerialNumber,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_ef7750073d18011b, []int{8}
}

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) GetSerialNumber() string {
	if m != nil {
		return m.SerialNumber
	}
	return ""
}

type PONRequest struct {
	PonPortId            uint32   `protobuf:"varint,1,opt,name=PonPortId,proto3" json:"PonPortId,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PONRequest proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_AlarmType proto.InternalMessageInfo

type AlarmParameter struct {
	Key                  string   `protobuf:"bytes,1,opt,name=Key,proto3" json:"Key,omitempty"`
	Value                string   `protobuf:"bytes,2,opt,name=Value,proto3" json:"Value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AlarmParameter proto.InternalMessageInfo

func (m *AlarmParameter) GetKey() string {
	if m != nil {
		return m.Key
	}
	return ""
}

func (m *AlarmParameter) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

// ONUAlarmRequest includes fields common to every Onu alarm,
// plus an optional list of AlarmParameter list that can be used
// to set additional fields in alarms that support them.
type ONUAlarmRequest struct {
	AlarmType            string            `protobuf:"bytes,1,opt,name=AlarmType,proto3" json:"AlarmType,omitempty"`
	SerialNumber         string            `protobuf:"bytes,2,opt,name=SerialNumber,proto3" json:"SerialNumber,omitempty"`
	Status               string            `protobuf:"bytes,3,opt,name=Status,proto3" json:"Status,omitempty"`
	Parameters           []*AlarmParameter `protobuf:"bytes,4,rep,name=Parameters,proto3" json:"Parameters,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_ef7750073d18011b, []int{12}
}

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) GetAlarmType() string {
	if m != nil {
		return m.AlarmType
	}
	return ""
}

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

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

func (m *ONUAlarmRequest) GetParameters() []*AlarmParameter {
	if m != nil {
		return m.Parameters
	}
	return nil
}

// OLT alarm request
type OLTAlarmRequest struct {
	InterfaceID          uint32   `protobuf:"varint,1,opt,name=InterfaceID,proto3" json:"InterfaceID,omitempty"`
	InterfaceType        string   `protobuf:"bytes,2,opt,name=InterfaceType,proto3" json:"InterfaceType,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_ef7750073d18011b, []int{13}
}

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) GetInterfaceID() uint32 {
	if m != nil {
		return m.InterfaceID
	}
	return 0
}

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

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

type VersionNumber struct {
	Version              string   `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
	BuildTime            string   `protobuf:"bytes,2,opt,name=buildTime,proto3" json:"buildTime,omitempty"`
	CommitHash           string   `protobuf:"bytes,3,opt,name=commitHash,proto3" json:"commitHash,omitempty"`
	GitStatus            string   `protobuf:"bytes,4,opt,name=gitStatus,proto3" json:"gitStatus,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *VersionNumber) Reset()         { *m = VersionNumber{} }
func (m *VersionNumber) String() string { return proto.CompactTextString(m) }
func (*VersionNumber) ProtoMessage()    {}
func (*VersionNumber) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{14}
}

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

var xxx_messageInfo_VersionNumber proto.InternalMessageInfo

func (m *VersionNumber) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

func (m *VersionNumber) GetBuildTime() string {
	if m != nil {
		return m.BuildTime
	}
	return ""
}

func (m *VersionNumber) GetCommitHash() string {
	if m != nil {
		return m.CommitHash
	}
	return ""
}

func (m *VersionNumber) GetGitStatus() string {
	if m != nil {
		return m.GitStatus
	}
	return ""
}

type LogLevel struct {
	Level                string   `protobuf:"bytes,1,opt,name=level,proto3" json:"level,omitempty"`
	Caller               bool     `protobuf:"varint,2,opt,name=caller,proto3" json:"caller,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LogLevel) Reset()         { *m = LogLevel{} }
func (m *LogLevel) String() string { return proto.CompactTextString(m) }
func (*LogLevel) ProtoMessage()    {}
func (*LogLevel) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{15}
}

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

var xxx_messageInfo_LogLevel proto.InternalMessageInfo

func (m *LogLevel) GetLevel() string {
	if m != nil {
		return m.Level
	}
	return ""
}

func (m *LogLevel) GetCaller() bool {
	if m != nil {
		return m.Caller
	}
	return false
}

type Response struct {
	StatusCode           int32    `protobuf:"varint,1,opt,name=status_code,json=statusCode,proto3" json:"status_code,omitempty"`
	Message              string   `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Response) Reset()         { *m = Response{} }
func (m *Response) String() string { return proto.CompactTextString(m) }
func (*Response) ProtoMessage()    {}
func (*Response) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{16}
}

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

var xxx_messageInfo_Response proto.InternalMessageInfo

func (m *Response) GetStatusCode() int32 {
	if m != nil {
		return m.StatusCode
	}
	return 0
}

func (m *Response) GetMessage() string {
	if m != nil {
		return m.Message
	}
	return ""
}

type IgmpRequest struct {
	OnuReq               *ONURequest    `protobuf:"bytes,1,opt,name=OnuReq,proto3" json:"OnuReq,omitempty"`
	SubActionVal         SubActionTypes `protobuf:"varint,2,opt,name=SubActionVal,proto3,enum=bbsim.SubActionTypes" json:"SubActionVal,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *IgmpRequest) Reset()         { *m = IgmpRequest{} }
func (m *IgmpRequest) String() string { return proto.CompactTextString(m) }
func (*IgmpRequest) ProtoMessage()    {}
func (*IgmpRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{17}
}

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

var xxx_messageInfo_IgmpRequest proto.InternalMessageInfo

func (m *IgmpRequest) GetOnuReq() *ONURequest {
	if m != nil {
		return m.OnuReq
	}
	return nil
}

func (m *IgmpRequest) GetSubActionVal() SubActionTypes {
	if m != nil {
		return m.SubActionVal
	}
	return SubActionTypes_JOIN
}

type Flows struct {
	FlowCount            uint32          `protobuf:"varint,1,opt,name=flow_count,json=flowCount,proto3" json:"flow_count,omitempty"`
	Flows                []*openolt.Flow `protobuf:"bytes,2,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_ef7750073d18011b, []int{18}
}

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) GetFlowCount() uint32 {
	if m != nil {
		return m.FlowCount
	}
	return 0
}

func (m *Flows) GetFlows() []*openolt.Flow {
	if m != nil {
		return m.Flows
	}
	return nil
}

type Timeout struct {
	Delay                uint32   `protobuf:"varint,1,opt,name=delay,proto3" json:"delay,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Timeout) Reset()         { *m = Timeout{} }
func (m *Timeout) String() string { return proto.CompactTextString(m) }
func (*Timeout) ProtoMessage()    {}
func (*Timeout) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{19}
}

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

var xxx_messageInfo_Timeout proto.InternalMessageInfo

func (m *Timeout) GetDelay() uint32 {
	if m != nil {
		return m.Delay
	}
	return 0
}

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_ef7750073d18011b, []int{20}
}

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.RegisterEnum("bbsim.SubActionTypes", SubActionTypes_name, SubActionTypes_value)
	proto.RegisterEnum("bbsim.AlarmType_Types", AlarmType_Types_name, AlarmType_Types_value)
	proto.RegisterType((*PONPort)(nil), "bbsim.PONPort")
	proto.RegisterType((*NNIPort)(nil), "bbsim.NNIPort")
	proto.RegisterType((*Olt)(nil), "bbsim.Olt")
	proto.RegisterType((*ONU)(nil), "bbsim.ONU")
	proto.RegisterType((*Service)(nil), "bbsim.Service")
	proto.RegisterType((*ONUTrafficSchedulers)(nil), "bbsim.ONUTrafficSchedulers")
	proto.RegisterType((*ONUs)(nil), "bbsim.ONUs")
	proto.RegisterType((*Services)(nil), "bbsim.Services")
	proto.RegisterType((*ONURequest)(nil), "bbsim.ONURequest")
	proto.RegisterType((*PONRequest)(nil), "bbsim.PONRequest")
	proto.RegisterType((*AlarmType)(nil), "bbsim.AlarmType")
	proto.RegisterType((*AlarmParameter)(nil), "bbsim.AlarmParameter")
	proto.RegisterType((*ONUAlarmRequest)(nil), "bbsim.ONUAlarmRequest")
	proto.RegisterType((*OLTAlarmRequest)(nil), "bbsim.OLTAlarmRequest")
	proto.RegisterType((*VersionNumber)(nil), "bbsim.VersionNumber")
	proto.RegisterType((*LogLevel)(nil), "bbsim.LogLevel")
	proto.RegisterType((*Response)(nil), "bbsim.Response")
	proto.RegisterType((*IgmpRequest)(nil), "bbsim.IgmpRequest")
	proto.RegisterType((*Flows)(nil), "bbsim.Flows")
	proto.RegisterType((*Timeout)(nil), "bbsim.Timeout")
	proto.RegisterType((*Empty)(nil), "bbsim.Empty")
}

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

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

// BBSimClient is the client API for BBSim service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type BBSimClient interface {
	// Get BBSim version
	Version(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*VersionNumber, error)
	// Set BBSim log level
	SetLogLevel(ctx context.Context, in *LogLevel, opts ...grpc.CallOption) (*LogLevel, error)
	// Get current status of OLT
	GetOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Olt, error)
	// Poweron OLT
	PoweronOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Shutdown OLT
	ShutdownOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Reboot OLT
	RebootOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Closes the Openolt gRPC server
	StopgRPCServer(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Start the Openolt gRPC server
	StartgRPCServer(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Restart the Openolt gRPC server after the given timeout
	RestartgRPCServer(ctx context.Context, in *Timeout, opts ...grpc.CallOption) (*Response, error)
	// Get status of an ONU by serial number
	GetONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*ONU, error)
	// Get status of all ONUs
	GetONUs(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ONUs, error)
	// Get all the Services
	GetServices(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Services, error)
	// Get all the Services of an ONU by serial number
	GetOnuServices(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Services, error)
	// Shutdown an ONU by serial number
	ShutdownONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error)
	// Shutdown all ONUs in OLT
	ShutdownAllONUs(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Shutdown all ONUs under a PON by pon-port-ID
	ShutdownONUsOnPON(ctx context.Context, in *PONRequest, opts ...grpc.CallOption) (*Response, error)
	// Poweron an ONU by serial number
	PoweronONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error)
	// Poweron all ONUs in OLT
	PoweronAllONUs(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error)
	// Poweron all ONUs under a PON by pon-port-ID
	PoweronONUsOnPON(ctx context.Context, in *PONRequest, opts ...grpc.CallOption) (*Response, error)
	// Restart EAPOL for ONU
	RestartEapol(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error)
	// Resatrt DHCP for ONU
	RestartDhcp(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error)
	// Send ONU alarm indication
	SetOnuAlarmIndication(ctx context.Context, in *ONUAlarmRequest, opts ...grpc.CallOption) (*Response, error)
	// Send OLT alarm indication for Interface type NNI or PON
	SetOltAlarmIndication(ctx context.Context, in *OLTAlarmRequest, opts ...grpc.CallOption) (*Response, error)
	// Get all flows or ONU specific flows
	GetFlows(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Flows, error)
	// Chnage IGMP state
	ChangeIgmpState(ctx context.Context, in *IgmpRequest, opts ...grpc.CallOption) (*Response, error)
	// Get Traffic scheduler information for ONU
	GetOnuTrafficSchedulers(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*ONUTrafficSchedulers, error)
}

type bBSimClient struct {
	cc *grpc.ClientConn
}

func NewBBSimClient(cc *grpc.ClientConn) BBSimClient {
	return &bBSimClient{cc}
}

func (c *bBSimClient) Version(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*VersionNumber, error) {
	out := new(VersionNumber)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/Version", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) SetLogLevel(ctx context.Context, in *LogLevel, opts ...grpc.CallOption) (*LogLevel, error) {
	out := new(LogLevel)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/SetLogLevel", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Olt, error) {
	out := new(Olt)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) PoweronOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/PoweronOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) ShutdownOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/ShutdownOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) RebootOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/RebootOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) StopgRPCServer(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/StopgRPCServer", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) StartgRPCServer(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/StartgRPCServer", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) RestartgRPCServer(ctx context.Context, in *Timeout, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/RestartgRPCServer", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*ONU, error) {
	out := new(ONU)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetONU", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetONUs(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ONUs, error) {
	out := new(ONUs)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetONUs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetServices(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Services, error) {
	out := new(Services)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetServices", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetOnuServices(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Services, error) {
	out := new(Services)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetOnuServices", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) ShutdownONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/ShutdownONU", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) ShutdownAllONUs(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/ShutdownAllONUs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) ShutdownONUsOnPON(ctx context.Context, in *PONRequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/ShutdownONUsOnPON", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) PoweronONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/PoweronONU", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) PoweronAllONUs(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/PoweronAllONUs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) PoweronONUsOnPON(ctx context.Context, in *PONRequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/PoweronONUsOnPON", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) RestartEapol(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/RestartEapol", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) RestartDhcp(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/RestartDhcp", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) SetOnuAlarmIndication(ctx context.Context, in *ONUAlarmRequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/SetOnuAlarmIndication", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) SetOltAlarmIndication(ctx context.Context, in *OLTAlarmRequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/SetOltAlarmIndication", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetFlows(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Flows, error) {
	out := new(Flows)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetFlows", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) ChangeIgmpState(ctx context.Context, in *IgmpRequest, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/ChangeIgmpState", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bBSimClient) GetOnuTrafficSchedulers(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*ONUTrafficSchedulers, error) {
	out := new(ONUTrafficSchedulers)
	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetOnuTrafficSchedulers", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// BBSimServer is the server API for BBSim service.
type BBSimServer interface {
	// Get BBSim version
	Version(context.Context, *Empty) (*VersionNumber, error)
	// Set BBSim log level
	SetLogLevel(context.Context, *LogLevel) (*LogLevel, error)
	// Get current status of OLT
	GetOlt(context.Context, *Empty) (*Olt, error)
	// Poweron OLT
	PoweronOlt(context.Context, *Empty) (*Response, error)
	// Shutdown OLT
	ShutdownOlt(context.Context, *Empty) (*Response, error)
	// Reboot OLT
	RebootOlt(context.Context, *Empty) (*Response, error)
	// Closes the Openolt gRPC server
	StopgRPCServer(context.Context, *Empty) (*Response, error)
	// Start the Openolt gRPC server
	StartgRPCServer(context.Context, *Empty) (*Response, error)
	// Restart the Openolt gRPC server after the given timeout
	RestartgRPCServer(context.Context, *Timeout) (*Response, error)
	// Get status of an ONU by serial number
	GetONU(context.Context, *ONURequest) (*ONU, error)
	// Get status of all ONUs
	GetONUs(context.Context, *Empty) (*ONUs, error)
	// Get all the Services
	GetServices(context.Context, *Empty) (*Services, error)
	// Get all the Services of an ONU by serial number
	GetOnuServices(context.Context, *ONURequest) (*Services, error)
	// Shutdown an ONU by serial number
	ShutdownONU(context.Context, *ONURequest) (*Response, error)
	// Shutdown all ONUs in OLT
	ShutdownAllONUs(context.Context, *Empty) (*Response, error)
	// Shutdown all ONUs under a PON by pon-port-ID
	ShutdownONUsOnPON(context.Context, *PONRequest) (*Response, error)
	// Poweron an ONU by serial number
	PoweronONU(context.Context, *ONURequest) (*Response, error)
	// Poweron all ONUs in OLT
	PoweronAllONUs(context.Context, *Empty) (*Response, error)
	// Poweron all ONUs under a PON by pon-port-ID
	PoweronONUsOnPON(context.Context, *PONRequest) (*Response, error)
	// Restart EAPOL for ONU
	RestartEapol(context.Context, *ONURequest) (*Response, error)
	// Resatrt DHCP for ONU
	RestartDhcp(context.Context, *ONURequest) (*Response, error)
	// Send ONU alarm indication
	SetOnuAlarmIndication(context.Context, *ONUAlarmRequest) (*Response, error)
	// Send OLT alarm indication for Interface type NNI or PON
	SetOltAlarmIndication(context.Context, *OLTAlarmRequest) (*Response, error)
	// Get all flows or ONU specific flows
	GetFlows(context.Context, *ONURequest) (*Flows, error)
	// Chnage IGMP state
	ChangeIgmpState(context.Context, *IgmpRequest) (*Response, error)
	// Get Traffic scheduler information for ONU
	GetOnuTrafficSchedulers(context.Context, *ONURequest) (*ONUTrafficSchedulers, error)
}

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

func (*UnimplementedBBSimServer) Version(ctx context.Context, req *Empty) (*VersionNumber, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Version not implemented")
}
func (*UnimplementedBBSimServer) SetLogLevel(ctx context.Context, req *LogLevel) (*LogLevel, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetLogLevel not implemented")
}
func (*UnimplementedBBSimServer) GetOlt(ctx context.Context, req *Empty) (*Olt, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetOlt not implemented")
}
func (*UnimplementedBBSimServer) PoweronOlt(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronOlt not implemented")
}
func (*UnimplementedBBSimServer) ShutdownOlt(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownOlt not implemented")
}
func (*UnimplementedBBSimServer) RebootOlt(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RebootOlt not implemented")
}
func (*UnimplementedBBSimServer) StopgRPCServer(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method StopgRPCServer not implemented")
}
func (*UnimplementedBBSimServer) StartgRPCServer(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method StartgRPCServer not implemented")
}
func (*UnimplementedBBSimServer) RestartgRPCServer(ctx context.Context, req *Timeout) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RestartgRPCServer not implemented")
}
func (*UnimplementedBBSimServer) GetONU(ctx context.Context, req *ONURequest) (*ONU, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetONU not implemented")
}
func (*UnimplementedBBSimServer) GetONUs(ctx context.Context, req *Empty) (*ONUs, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetONUs not implemented")
}
func (*UnimplementedBBSimServer) GetServices(ctx context.Context, req *Empty) (*Services, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetServices not implemented")
}
func (*UnimplementedBBSimServer) GetOnuServices(ctx context.Context, req *ONURequest) (*Services, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetOnuServices not implemented")
}
func (*UnimplementedBBSimServer) ShutdownONU(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownONU not implemented")
}
func (*UnimplementedBBSimServer) ShutdownAllONUs(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownAllONUs not implemented")
}
func (*UnimplementedBBSimServer) ShutdownONUsOnPON(ctx context.Context, req *PONRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownONUsOnPON not implemented")
}
func (*UnimplementedBBSimServer) PoweronONU(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronONU not implemented")
}
func (*UnimplementedBBSimServer) PoweronAllONUs(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronAllONUs not implemented")
}
func (*UnimplementedBBSimServer) PoweronONUsOnPON(ctx context.Context, req *PONRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronONUsOnPON not implemented")
}
func (*UnimplementedBBSimServer) RestartEapol(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RestartEapol not implemented")
}
func (*UnimplementedBBSimServer) RestartDhcp(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RestartDhcp not implemented")
}
func (*UnimplementedBBSimServer) SetOnuAlarmIndication(ctx context.Context, req *ONUAlarmRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetOnuAlarmIndication not implemented")
}
func (*UnimplementedBBSimServer) SetOltAlarmIndication(ctx context.Context, req *OLTAlarmRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetOltAlarmIndication not implemented")
}
func (*UnimplementedBBSimServer) GetFlows(ctx context.Context, req *ONURequest) (*Flows, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetFlows not implemented")
}
func (*UnimplementedBBSimServer) ChangeIgmpState(ctx context.Context, req *IgmpRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ChangeIgmpState not implemented")
}
func (*UnimplementedBBSimServer) GetOnuTrafficSchedulers(ctx context.Context, req *ONURequest) (*ONUTrafficSchedulers, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetOnuTrafficSchedulers not implemented")
}

func RegisterBBSimServer(s *grpc.Server, srv BBSimServer) {
	s.RegisterService(&_BBSim_serviceDesc, srv)
}

func _BBSim_Version_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.(BBSimServer).Version(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/Version",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).Version(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_SetLogLevel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(LogLevel)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).SetLogLevel(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/SetLogLevel",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).SetLogLevel(ctx, req.(*LogLevel))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetOlt_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.(BBSimServer).GetOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_PoweronOlt_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.(BBSimServer).PoweronOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/PoweronOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).PoweronOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_ShutdownOlt_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.(BBSimServer).ShutdownOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/ShutdownOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).ShutdownOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_RebootOlt_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.(BBSimServer).RebootOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/RebootOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).RebootOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_StopgRPCServer_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.(BBSimServer).StopgRPCServer(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/StopgRPCServer",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).StopgRPCServer(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_StartgRPCServer_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.(BBSimServer).StartgRPCServer(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/StartgRPCServer",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).StartgRPCServer(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_RestartgRPCServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Timeout)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).RestartgRPCServer(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/RestartgRPCServer",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).RestartgRPCServer(ctx, req.(*Timeout))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetONU_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.(BBSimServer).GetONU(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetONU",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetONU(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetONUs_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.(BBSimServer).GetONUs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetONUs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetONUs(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetServices_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.(BBSimServer).GetServices(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetServices",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetServices(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetOnuServices_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.(BBSimServer).GetOnuServices(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetOnuServices",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetOnuServices(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_ShutdownONU_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.(BBSimServer).ShutdownONU(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/ShutdownONU",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).ShutdownONU(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_ShutdownAllONUs_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.(BBSimServer).ShutdownAllONUs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/ShutdownAllONUs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).ShutdownAllONUs(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_ShutdownONUsOnPON_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PONRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).ShutdownONUsOnPON(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/ShutdownONUsOnPON",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).ShutdownONUsOnPON(ctx, req.(*PONRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_PoweronONU_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.(BBSimServer).PoweronONU(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/PoweronONU",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).PoweronONU(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_PoweronAllONUs_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.(BBSimServer).PoweronAllONUs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/PoweronAllONUs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).PoweronAllONUs(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_PoweronONUsOnPON_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PONRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).PoweronONUsOnPON(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/PoweronONUsOnPON",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).PoweronONUsOnPON(ctx, req.(*PONRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_RestartEapol_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.(BBSimServer).RestartEapol(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/RestartEapol",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).RestartEapol(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_RestartDhcp_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.(BBSimServer).RestartDhcp(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/RestartDhcp",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).RestartDhcp(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_SetOnuAlarmIndication_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.(BBSimServer).SetOnuAlarmIndication(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/SetOnuAlarmIndication",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).SetOnuAlarmIndication(ctx, req.(*ONUAlarmRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_SetOltAlarmIndication_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.(BBSimServer).SetOltAlarmIndication(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/SetOltAlarmIndication",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).SetOltAlarmIndication(ctx, req.(*OLTAlarmRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetFlows_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.(BBSimServer).GetFlows(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetFlows",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetFlows(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_ChangeIgmpState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(IgmpRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).ChangeIgmpState(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/ChangeIgmpState",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).ChangeIgmpState(ctx, req.(*IgmpRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BBSim_GetOnuTrafficSchedulers_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.(BBSimServer).GetOnuTrafficSchedulers(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/GetOnuTrafficSchedulers",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).GetOnuTrafficSchedulers(ctx, req.(*ONURequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _BBSim_serviceDesc = grpc.ServiceDesc{
	ServiceName: "bbsim.BBSim",
	HandlerType: (*BBSimServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "Version",
			Handler:    _BBSim_Version_Handler,
		},
		{
			MethodName: "SetLogLevel",
			Handler:    _BBSim_SetLogLevel_Handler,
		},
		{
			MethodName: "GetOlt",
			Handler:    _BBSim_GetOlt_Handler,
		},
		{
			MethodName: "PoweronOlt",
			Handler:    _BBSim_PoweronOlt_Handler,
		},
		{
			MethodName: "ShutdownOlt",
			Handler:    _BBSim_ShutdownOlt_Handler,
		},
		{
			MethodName: "RebootOlt",
			Handler:    _BBSim_RebootOlt_Handler,
		},
		{
			MethodName: "StopgRPCServer",
			Handler:    _BBSim_StopgRPCServer_Handler,
		},
		{
			MethodName: "StartgRPCServer",
			Handler:    _BBSim_StartgRPCServer_Handler,
		},
		{
			MethodName: "RestartgRPCServer",
			Handler:    _BBSim_RestartgRPCServer_Handler,
		},
		{
			MethodName: "GetONU",
			Handler:    _BBSim_GetONU_Handler,
		},
		{
			MethodName: "GetONUs",
			Handler:    _BBSim_GetONUs_Handler,
		},
		{
			MethodName: "GetServices",
			Handler:    _BBSim_GetServices_Handler,
		},
		{
			MethodName: "GetOnuServices",
			Handler:    _BBSim_GetOnuServices_Handler,
		},
		{
			MethodName: "ShutdownONU",
			Handler:    _BBSim_ShutdownONU_Handler,
		},
		{
			MethodName: "ShutdownAllONUs",
			Handler:    _BBSim_ShutdownAllONUs_Handler,
		},
		{
			MethodName: "ShutdownONUsOnPON",
			Handler:    _BBSim_ShutdownONUsOnPON_Handler,
		},
		{
			MethodName: "PoweronONU",
			Handler:    _BBSim_PoweronONU_Handler,
		},
		{
			MethodName: "PoweronAllONUs",
			Handler:    _BBSim_PoweronAllONUs_Handler,
		},
		{
			MethodName: "PoweronONUsOnPON",
			Handler:    _BBSim_PoweronONUsOnPON_Handler,
		},
		{
			MethodName: "RestartEapol",
			Handler:    _BBSim_RestartEapol_Handler,
		},
		{
			MethodName: "RestartDhcp",
			Handler:    _BBSim_RestartDhcp_Handler,
		},
		{
			MethodName: "SetOnuAlarmIndication",
			Handler:    _BBSim_SetOnuAlarmIndication_Handler,
		},
		{
			MethodName: "SetOltAlarmIndication",
			Handler:    _BBSim_SetOltAlarmIndication_Handler,
		},
		{
			MethodName: "GetFlows",
			Handler:    _BBSim_GetFlows_Handler,
		},
		{
			MethodName: "ChangeIgmpState",
			Handler:    _BBSim_ChangeIgmpState_Handler,
		},
		{
			MethodName: "GetOnuTrafficSchedulers",
			Handler:    _BBSim_GetOnuTrafficSchedulers_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "api/bbsim/bbsim.proto",
}
