// 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"
	grpc "google.golang.org/grpc"
	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

// 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{6, 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"`
	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) 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"`
	STag                 int32    `protobuf:"varint,6,opt,name=STag,proto3" json:"STag,omitempty"`
	CTag                 int32    `protobuf:"varint,7,opt,name=CTag,proto3" json:"CTag,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"`
	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) GetSTag() int32 {
	if m != nil {
		return m.STag
	}
	return 0
}

func (m *ONU) GetCTag() int32 {
	if m != nil {
		return m.CTag
	}
	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
}

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{4}
}

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 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{5}
}

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 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{6}
}

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{7}
}

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 ""
}

// AlarmRequest includes fields common to every alarm,
// plus an optional list of AlarmParemter list that can be used
// to set additional fields in alarms that support them.
type AlarmRequest struct {
	AlarmType            AlarmType_Types   `protobuf:"varint,1,opt,name=AlarmType,proto3,enum=bbsim.AlarmType_Types" 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 *AlarmRequest) Reset()         { *m = AlarmRequest{} }
func (m *AlarmRequest) String() string { return proto.CompactTextString(m) }
func (*AlarmRequest) ProtoMessage()    {}
func (*AlarmRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{8}
}

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

var xxx_messageInfo_AlarmRequest proto.InternalMessageInfo

func (m *AlarmRequest) GetAlarmType() AlarmType_Types {
	if m != nil {
		return m.AlarmType
	}
	return AlarmType_LOS
}

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

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

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

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{9}
}

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{10}
}

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{11}
}

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 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{12}
}

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.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((*ONUs)(nil), "bbsim.ONUs")
	proto.RegisterType((*ONURequest)(nil), "bbsim.ONURequest")
	proto.RegisterType((*AlarmType)(nil), "bbsim.AlarmType")
	proto.RegisterType((*AlarmParameter)(nil), "bbsim.AlarmParameter")
	proto.RegisterType((*AlarmRequest)(nil), "bbsim.AlarmRequest")
	proto.RegisterType((*VersionNumber)(nil), "bbsim.VersionNumber")
	proto.RegisterType((*LogLevel)(nil), "bbsim.LogLevel")
	proto.RegisterType((*Response)(nil), "bbsim.Response")
	proto.RegisterType((*Empty)(nil), "bbsim.Empty")
}

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

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

// BBSimServer is the server API for BBSim service.
type BBSimServer interface {
	Version(context.Context, *Empty) (*VersionNumber, error)
	GetOlt(context.Context, *Empty) (*Olt, error)
	PoweronOlt(context.Context, *Empty) (*Response, error)
	ShutdownOlt(context.Context, *Empty) (*Response, error)
	RebootOlt(context.Context, *Empty) (*Response, error)
	GetONUs(context.Context, *Empty) (*ONUs, error)
	GetONU(context.Context, *ONURequest) (*ONU, error)
	SetLogLevel(context.Context, *LogLevel) (*LogLevel, error)
	ShutdownONU(context.Context, *ONURequest) (*Response, error)
	PoweronONU(context.Context, *ONURequest) (*Response, error)
	RestartEapol(context.Context, *ONURequest) (*Response, error)
	RestartDhcp(context.Context, *ONURequest) (*Response, error)
	SetAlarmIndication(context.Context, *AlarmRequest) (*Response, error)
}

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_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_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_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_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_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_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_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_SetAlarmIndication_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AlarmRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BBSimServer).SetAlarmIndication(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/bbsim.BBSim/SetAlarmIndication",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BBSimServer).SetAlarmIndication(ctx, req.(*AlarmRequest))
	}
	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: "GetOlt",
			Handler:    _BBSim_GetOlt_Handler,
		},
		{
			MethodName: "PoweronOlt",
			Handler:    _BBSim_PoweronOlt_Handler,
		},
		{
			MethodName: "ShutdownOlt",
			Handler:    _BBSim_ShutdownOlt_Handler,
		},
		{
			MethodName: "RebootOlt",
			Handler:    _BBSim_RebootOlt_Handler,
		},
		{
			MethodName: "GetONUs",
			Handler:    _BBSim_GetONUs_Handler,
		},
		{
			MethodName: "GetONU",
			Handler:    _BBSim_GetONU_Handler,
		},
		{
			MethodName: "SetLogLevel",
			Handler:    _BBSim_SetLogLevel_Handler,
		},
		{
			MethodName: "ShutdownONU",
			Handler:    _BBSim_ShutdownONU_Handler,
		},
		{
			MethodName: "PoweronONU",
			Handler:    _BBSim_PoweronONU_Handler,
		},
		{
			MethodName: "RestartEapol",
			Handler:    _BBSim_RestartEapol_Handler,
		},
		{
			MethodName: "RestartDhcp",
			Handler:    _BBSim_RestartDhcp_Handler,
		},
		{
			MethodName: "SetAlarmIndication",
			Handler:    _BBSim_SetAlarmIndication_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "api/bbsim/bbsim.proto",
}
