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

package bbsim

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	openolt "github.com/opencord/voltha-protos/v2/go/openolt"
	tech_profile "github.com/opencord/voltha-protos/v2/go/tech_profile"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type SubActionTypes int32

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

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

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

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

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

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

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

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

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

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

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

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

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

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

var xxx_messageInfo_PONPort proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_NNIPort proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_Olt proto.InternalMessageInfo

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

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

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

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

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

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

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

type ONU struct {
	ID                   int32    `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"`
	SerialNumber         string   `protobuf:"bytes,2,opt,name=SerialNumber,proto3" json:"SerialNumber,omitempty"`
	OperState            string   `protobuf:"bytes,3,opt,name=OperState,proto3" json:"OperState,omitempty"`
	InternalState        string   `protobuf:"bytes,4,opt,name=InternalState,proto3" json:"InternalState,omitempty"`
	PonPortID            int32    `protobuf:"varint,5,opt,name=PonPortID,proto3" json:"PonPortID,omitempty"`
	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 ONUTrafficSchedulers struct {
	TraffSchedulers      *tech_profile.TrafficSchedulers `protobuf:"bytes,1,opt,name=traffSchedulers,proto3" json:"traffSchedulers,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

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

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

var xxx_messageInfo_ONUTrafficSchedulers proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_ONURequest proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_PONRequest proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_AlarmParameter proto.InternalMessageInfo

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

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

// ONUAlarmRequest includes fields common to every Onu alarm,
// plus an optional list of AlarmParameter list that can be used
// to set additional fields in alarms that support them.
type ONUAlarmRequest struct {
	AlarmType            string            `protobuf:"bytes,1,opt,name=AlarmType,proto3" json:"AlarmType,omitempty"`
	SerialNumber         string            `protobuf:"bytes,2,opt,name=SerialNumber,proto3" json:"SerialNumber,omitempty"`
	Status               string            `protobuf:"bytes,3,opt,name=Status,proto3" json:"Status,omitempty"`
	Parameters           []*AlarmParameter `protobuf:"bytes,4,rep,name=Parameters,proto3" json:"Parameters,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_ONUAlarmRequest proto.InternalMessageInfo

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

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

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

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

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

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

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

var xxx_messageInfo_OLTAlarmRequest proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

var xxx_messageInfo_IgmpRequest proto.InternalMessageInfo

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

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

type Flows struct {
	FlowCount            uint32          `protobuf:"varint,1,opt,name=flow_count,json=flowCount,proto3" json:"flow_count,omitempty"`
	Flows                []*openolt.Flow `protobuf:"bytes,2,rep,name=flows,proto3" json:"flows,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_Flows proto.InternalMessageInfo

func (m *Flows) GetFlowCount() uint32 {
	if m != nil {
		return m.FlowCount
	}
	return 0
}

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

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

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((*ONUTrafficSchedulers)(nil), "bbsim.ONUTrafficSchedulers")
	proto.RegisterType((*ONUs)(nil), "bbsim.ONUs")
	proto.RegisterType((*ONURequest)(nil), "bbsim.ONURequest")
	proto.RegisterType((*PONRequest)(nil), "bbsim.PONRequest")
	proto.RegisterType((*AlarmType)(nil), "bbsim.AlarmType")
	proto.RegisterType((*AlarmParameter)(nil), "bbsim.AlarmParameter")
	proto.RegisterType((*ONUAlarmRequest)(nil), "bbsim.ONUAlarmRequest")
	proto.RegisterType((*OLTAlarmRequest)(nil), "bbsim.OLTAlarmRequest")
	proto.RegisterType((*VersionNumber)(nil), "bbsim.VersionNumber")
	proto.RegisterType((*LogLevel)(nil), "bbsim.LogLevel")
	proto.RegisterType((*Response)(nil), "bbsim.Response")
	proto.RegisterType((*IgmpRequest)(nil), "bbsim.IgmpRequest")
	proto.RegisterType((*Flows)(nil), "bbsim.Flows")
	proto.RegisterType((*Empty)(nil), "bbsim.Empty")
}

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

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

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

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

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

type bBSimClient struct {
	cc *grpc.ClientConn
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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