// 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"
	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
)

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

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

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

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

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

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

var xxx_messageInfo_Empty proto.InternalMessageInfo

func init() {
	proto.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((*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((*IgmpRequest)(nil), "bbsim.IgmpRequest")
	proto.RegisterType((*Empty)(nil), "bbsim.Empty")
}

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

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

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

// 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.SupportPackageIsVersion6

// 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)
	ChangeIgmpState(ctx context.Context, in *IgmpRequest, opts ...grpc.CallOption) (*Response, error)
}

type bBSimClient struct {
	cc grpc.ClientConnInterface
}

func NewBBSimClient(cc grpc.ClientConnInterface) 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
}

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
}

// 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)
	ChangeIgmpState(context.Context, *IgmpRequest) (*Response, 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) 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) GetONUs(ctx context.Context, req *Empty) (*ONUs, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetONUs not implemented")
}
func (*UnimplementedBBSimServer) GetONU(ctx context.Context, req *ONURequest) (*ONU, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetONU not implemented")
}
func (*UnimplementedBBSimServer) SetLogLevel(ctx context.Context, req *LogLevel) (*LogLevel, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetLogLevel not implemented")
}
func (*UnimplementedBBSimServer) ShutdownONU(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownONU not implemented")
}
func (*UnimplementedBBSimServer) PoweronONU(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronONU 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) SetAlarmIndication(ctx context.Context, req *AlarmRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetAlarmIndication not implemented")
}
func (*UnimplementedBBSimServer) ChangeIgmpState(ctx context.Context, req *IgmpRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ChangeIgmpState 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_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)
}

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

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,
		},
		{
			MethodName: "ChangeIgmpState",
			Handler:    _BBSim_ChangeIgmpState_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "api/bbsim/bbsim.proto",
}
