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

package bbsim

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

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

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

type SubActionTypes int32

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

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

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

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

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

type OltAllocatedResourceType_Type int32

const (
	OltAllocatedResourceType_UNKNOWN  OltAllocatedResourceType_Type = 0
	OltAllocatedResourceType_ALLOC_ID OltAllocatedResourceType_Type = 1
	OltAllocatedResourceType_GEM_PORT OltAllocatedResourceType_Type = 2
)

var OltAllocatedResourceType_Type_name = map[int32]string{
	0: "UNKNOWN",
	1: "ALLOC_ID",
	2: "GEM_PORT",
}

var OltAllocatedResourceType_Type_value = map[string]int32{
	"UNKNOWN":  0,
	"ALLOC_ID": 1,
	"GEM_PORT": 2,
}

func (x OltAllocatedResourceType_Type) String() string {
	return proto.EnumName(OltAllocatedResourceType_Type_name, int32(x))
}

func (OltAllocatedResourceType_Type) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_ef7750073d18011b, []int{4, 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{14, 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"`
	InternalState string `protobuf:"bytes,3,opt,name=InternalState,proto3" json:"InternalState,omitempty"`
	PacketCount   uint64 `protobuf:"varint,4,opt,name=PacketCount,proto3" json:"PacketCount,omitempty"`
	// ONU ID are reported by VOLTHA in the ActivateOnu call
	AllocatedOnuIds []*PonAllocatedResources `protobuf:"bytes,5,rep,name=AllocatedOnuIds,proto3" json:"AllocatedOnuIds,omitempty"`
	// these are the stored resource IDs as reported via OMCI
	AllocatedGemPorts    []*PonAllocatedResources `protobuf:"bytes,6,rep,name=AllocatedGemPorts,proto3" json:"AllocatedGemPorts,omitempty"`
	AllocatedAllocIds    []*PonAllocatedResources `protobuf:"bytes,7,rep,name=AllocatedAllocIds,proto3" json:"AllocatedAllocIds,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 ""
}

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

func (m *PONPort) GetPacketCount() uint64 {
	if m != nil {
		return m.PacketCount
	}
	return 0
}

func (m *PONPort) GetAllocatedOnuIds() []*PonAllocatedResources {
	if m != nil {
		return m.AllocatedOnuIds
	}
	return nil
}

func (m *PONPort) GetAllocatedGemPorts() []*PonAllocatedResources {
	if m != nil {
		return m.AllocatedGemPorts
	}
	return nil
}

func (m *PONPort) GetAllocatedAllocIds() []*PonAllocatedResources {
	if m != nil {
		return m.AllocatedAllocIds
	}
	return nil
}

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

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

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

var xxx_messageInfo_PonAllocatedResources proto.InternalMessageInfo

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

func (m *PonAllocatedResources) GetId() int32 {
	if m != nil {
		return m.Id
	}
	return 0
}

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

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

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 OltAllocatedResourceType struct {
	Type                 OltAllocatedResourceType_Type `protobuf:"varint,1,opt,name=type,proto3,enum=bbsim.OltAllocatedResourceType_Type" json:"type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

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

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

var xxx_messageInfo_OltAllocatedResourceType proto.InternalMessageInfo

func (m *OltAllocatedResourceType) GetType() OltAllocatedResourceType_Type {
	if m != nil {
		return m.Type
	}
	return OltAllocatedResourceType_UNKNOWN
}

type OltAllocatedResource struct {
	Type                 string   `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"`
	PonPortId            uint32   `protobuf:"varint,2,opt,name=PonPortId,proto3" json:"PonPortId,omitempty"`
	OnuId                uint32   `protobuf:"varint,3,opt,name=OnuId,proto3" json:"OnuId,omitempty"`
	PortNo               uint32   `protobuf:"varint,4,opt,name=PortNo,proto3" json:"PortNo,omitempty"`
	ResourceId           int32    `protobuf:"varint,5,opt,name=ResourceId,proto3" json:"ResourceId,omitempty"`
	FlowId               uint64   `protobuf:"varint,6,opt,name=FlowId,proto3" json:"FlowId,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_OltAllocatedResource proto.InternalMessageInfo

func (m *OltAllocatedResource) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

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

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

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

func (m *OltAllocatedResource) GetResourceId() int32 {
	if m != nil {
		return m.ResourceId
	}
	return 0
}

func (m *OltAllocatedResource) GetFlowId() uint64 {
	if m != nil {
		return m.FlowId
	}
	return 0
}

type OltAllocatedResources struct {
	Resources            []*OltAllocatedResource `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_OltAllocatedResources proto.InternalMessageInfo

func (m *OltAllocatedResources) GetResources() []*OltAllocatedResource {
	if m != nil {
		return m.Resources
	}
	return nil
}

type ONU struct {
	ID                            int32      `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"`
	SerialNumber                  string     `protobuf:"bytes,2,opt,name=SerialNumber,proto3" json:"SerialNumber,omitempty"`
	OperState                     string     `protobuf:"bytes,3,opt,name=OperState,proto3" json:"OperState,omitempty"`
	InternalState                 string     `protobuf:"bytes,4,opt,name=InternalState,proto3" json:"InternalState,omitempty"`
	PonPortID                     int32      `protobuf:"varint,5,opt,name=PonPortID,proto3" json:"PonPortID,omitempty"`
	HwAddress                     string     `protobuf:"bytes,8,opt,name=HwAddress,proto3" json:"HwAddress,omitempty"`
	PortNo                        int32      `protobuf:"varint,9,opt,name=PortNo,proto3" json:"PortNo,omitempty"`
	Services                      []*Service `protobuf:"bytes,10,rep,name=services,proto3" json:"services,omitempty"`
	ImageSoftwareExpectedSections int32      `protobuf:"varint,11,opt,name=ImageSoftwareExpectedSections,proto3" json:"ImageSoftwareExpectedSections,omitempty"`
	ImageSoftwareReceivedSections int32      `protobuf:"varint,12,opt,name=ImageSoftwareReceivedSections,proto3" json:"ImageSoftwareReceivedSections,omitempty"`
	ActiveImageEntityId           int32      `protobuf:"varint,13,opt,name=ActiveImageEntityId,proto3" json:"ActiveImageEntityId,omitempty"`
	CommittedImageEntityId        int32      `protobuf:"varint,14,opt,name=CommittedImageEntityId,proto3" json:"CommittedImageEntityId,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{7}
}

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

var xxx_messageInfo_ONU proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

var xxx_messageInfo_Service proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

var xxx_messageInfo_ONUs proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_Services proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

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

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

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"`
	GroupAddress         string         `protobuf:"bytes,3,opt,name=GroupAddress,proto3" json:"GroupAddress,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{21}
}

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
}

func (m *IgmpRequest) GetGroupAddress() string {
	if m != nil {
		return m.GroupAddress
	}
	return ""
}

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

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

var xxx_messageInfo_Flows proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_Timeout proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// BBSimServer is the server API for BBSim service.
type BBSimServer interface {
	// Get BBSim version
	Version(context.Context, *Empty) (*VersionNumber, error)
	// Set BBSim log level
	SetLogLevel(context.Context, *LogLevel) (*LogLevel, error)
	// Get current status of OLT
	GetOlt(context.Context, *Empty) (*Olt, error)
	GetOltAllocatedResources(context.Context, *OltAllocatedResourceType) (*OltAllocatedResources, error)
	// Poweron OLT
	PoweronOlt(context.Context, *Empty) (*Response, error)
	// Shutdown OLT
	ShutdownOlt(context.Context, *Empty) (*Response, error)
	// Reboot OLT
	RebootOlt(context.Context, *Empty) (*Response, error)
	// Closes the Openolt gRPC server
	StopgRPCServer(context.Context, *Empty) (*Response, error)
	// Start the Openolt gRPC server
	StartgRPCServer(context.Context, *Empty) (*Response, error)
	// Restart the Openolt gRPC server after the given timeout
	RestartgRPCServer(context.Context, *Timeout) (*Response, error)
	// Get status of an ONU by serial number
	GetONU(context.Context, *ONURequest) (*ONU, error)
	// Get status of all ONUs
	GetONUs(context.Context, *Empty) (*ONUs, error)
	// Get all the Services
	GetServices(context.Context, *Empty) (*Services, error)
	// Get all the Services of an ONU by serial number
	GetOnuServices(context.Context, *ONURequest) (*Services, error)
	// Shutdown an ONU by serial number
	ShutdownONU(context.Context, *ONURequest) (*Response, error)
	// Shutdown all ONUs in OLT
	ShutdownAllONUs(context.Context, *Empty) (*Response, error)
	// Shutdown all ONUs under a PON by pon-port-ID
	ShutdownONUsOnPON(context.Context, *PONRequest) (*Response, error)
	// Poweron an ONU by serial number
	PoweronONU(context.Context, *ONURequest) (*Response, error)
	// Poweron all ONUs in OLT
	PoweronAllONUs(context.Context, *Empty) (*Response, error)
	// Poweron all ONUs under a PON by pon-port-ID
	PoweronONUsOnPON(context.Context, *PONRequest) (*Response, error)
	// Restart EAPOL for ONU
	RestartEapol(context.Context, *ONURequest) (*Response, error)
	// Restart 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)
	// Change 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) GetOltAllocatedResources(ctx context.Context, req *OltAllocatedResourceType) (*OltAllocatedResources, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetOltAllocatedResources not implemented")
}
func (*UnimplementedBBSimServer) PoweronOlt(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronOlt not implemented")
}
func (*UnimplementedBBSimServer) ShutdownOlt(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownOlt not implemented")
}
func (*UnimplementedBBSimServer) RebootOlt(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RebootOlt not implemented")
}
func (*UnimplementedBBSimServer) StopgRPCServer(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method StopgRPCServer not implemented")
}
func (*UnimplementedBBSimServer) StartgRPCServer(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method StartgRPCServer not implemented")
}
func (*UnimplementedBBSimServer) RestartgRPCServer(ctx context.Context, req *Timeout) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RestartgRPCServer not implemented")
}
func (*UnimplementedBBSimServer) GetONU(ctx context.Context, req *ONURequest) (*ONU, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetONU not implemented")
}
func (*UnimplementedBBSimServer) GetONUs(ctx context.Context, req *Empty) (*ONUs, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetONUs not implemented")
}
func (*UnimplementedBBSimServer) GetServices(ctx context.Context, req *Empty) (*Services, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetServices not implemented")
}
func (*UnimplementedBBSimServer) GetOnuServices(ctx context.Context, req *ONURequest) (*Services, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetOnuServices not implemented")
}
func (*UnimplementedBBSimServer) ShutdownONU(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownONU not implemented")
}
func (*UnimplementedBBSimServer) ShutdownAllONUs(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownAllONUs not implemented")
}
func (*UnimplementedBBSimServer) ShutdownONUsOnPON(ctx context.Context, req *PONRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ShutdownONUsOnPON not implemented")
}
func (*UnimplementedBBSimServer) PoweronONU(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronONU not implemented")
}
func (*UnimplementedBBSimServer) PoweronAllONUs(ctx context.Context, req *Empty) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronAllONUs not implemented")
}
func (*UnimplementedBBSimServer) PoweronONUsOnPON(ctx context.Context, req *PONRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PoweronONUsOnPON not implemented")
}
func (*UnimplementedBBSimServer) RestartEapol(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RestartEapol not implemented")
}
func (*UnimplementedBBSimServer) RestartDhcp(ctx context.Context, req *ONURequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RestartDhcp not implemented")
}
func (*UnimplementedBBSimServer) SetOnuAlarmIndication(ctx context.Context, req *ONUAlarmRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetOnuAlarmIndication not implemented")
}
func (*UnimplementedBBSimServer) SetOltAlarmIndication(ctx context.Context, req *OLTAlarmRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SetOltAlarmIndication not implemented")
}
func (*UnimplementedBBSimServer) GetFlows(ctx context.Context, req *ONURequest) (*Flows, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetFlows not implemented")
}
func (*UnimplementedBBSimServer) ChangeIgmpState(ctx context.Context, req *IgmpRequest) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ChangeIgmpState not implemented")
}
func (*UnimplementedBBSimServer) GetOnuTrafficSchedulers(ctx context.Context, req *ONURequest) (*ONUTrafficSchedulers, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetOnuTrafficSchedulers not implemented")
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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