// Code generated by protoc-gen-go. DO NOT EDIT.
// source: voltha_protos/openolt.proto

package openolt

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	tech_profile "github.com/opencord/voltha-protos/go/tech_profile"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	grpc "google.golang.org/grpc"
	math "math"
)

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

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

// SchedulerConfig from public import voltha_protos/tech_profile.proto
type SchedulerConfig = tech_profile.SchedulerConfig

// TrafficShapingInfo from public import voltha_protos/tech_profile.proto
type TrafficShapingInfo = tech_profile.TrafficShapingInfo

// TrafficScheduler from public import voltha_protos/tech_profile.proto
type TrafficScheduler = tech_profile.TrafficScheduler

// TrafficSchedulers from public import voltha_protos/tech_profile.proto
type TrafficSchedulers = tech_profile.TrafficSchedulers

// TailDropDiscardConfig from public import voltha_protos/tech_profile.proto
type TailDropDiscardConfig = tech_profile.TailDropDiscardConfig

// RedDiscardConfig from public import voltha_protos/tech_profile.proto
type RedDiscardConfig = tech_profile.RedDiscardConfig

// WRedDiscardConfig from public import voltha_protos/tech_profile.proto
type WRedDiscardConfig = tech_profile.WRedDiscardConfig

// DiscardConfig from public import voltha_protos/tech_profile.proto
type DiscardConfig = tech_profile.DiscardConfig
type DiscardConfig_TailDropDiscardConfig = tech_profile.DiscardConfig_TailDropDiscardConfig
type DiscardConfig_RedDiscardConfig = tech_profile.DiscardConfig_RedDiscardConfig
type DiscardConfig_WredDiscardConfig = tech_profile.DiscardConfig_WredDiscardConfig

// TrafficQueue from public import voltha_protos/tech_profile.proto
type TrafficQueue = tech_profile.TrafficQueue

// TrafficQueues from public import voltha_protos/tech_profile.proto
type TrafficQueues = tech_profile.TrafficQueues

// Direction from public import voltha_protos/tech_profile.proto
type Direction = tech_profile.Direction

var Direction_name = tech_profile.Direction_name
var Direction_value = tech_profile.Direction_value

const Direction_UPSTREAM = Direction(tech_profile.Direction_UPSTREAM)
const Direction_DOWNSTREAM = Direction(tech_profile.Direction_DOWNSTREAM)
const Direction_BIDIRECTIONAL = Direction(tech_profile.Direction_BIDIRECTIONAL)

// SchedulingPolicy from public import voltha_protos/tech_profile.proto
type SchedulingPolicy = tech_profile.SchedulingPolicy

var SchedulingPolicy_name = tech_profile.SchedulingPolicy_name
var SchedulingPolicy_value = tech_profile.SchedulingPolicy_value

const SchedulingPolicy_WRR = SchedulingPolicy(tech_profile.SchedulingPolicy_WRR)
const SchedulingPolicy_StrictPriority = SchedulingPolicy(tech_profile.SchedulingPolicy_StrictPriority)
const SchedulingPolicy_Hybrid = SchedulingPolicy(tech_profile.SchedulingPolicy_Hybrid)

// AdditionalBW from public import voltha_protos/tech_profile.proto
type AdditionalBW = tech_profile.AdditionalBW

var AdditionalBW_name = tech_profile.AdditionalBW_name
var AdditionalBW_value = tech_profile.AdditionalBW_value

const AdditionalBW_AdditionalBW_None = AdditionalBW(tech_profile.AdditionalBW_AdditionalBW_None)
const AdditionalBW_AdditionalBW_NA = AdditionalBW(tech_profile.AdditionalBW_AdditionalBW_NA)
const AdditionalBW_AdditionalBW_BestEffort = AdditionalBW(tech_profile.AdditionalBW_AdditionalBW_BestEffort)
const AdditionalBW_AdditionalBW_Auto = AdditionalBW(tech_profile.AdditionalBW_AdditionalBW_Auto)

// DiscardPolicy from public import voltha_protos/tech_profile.proto
type DiscardPolicy = tech_profile.DiscardPolicy

var DiscardPolicy_name = tech_profile.DiscardPolicy_name
var DiscardPolicy_value = tech_profile.DiscardPolicy_value

const DiscardPolicy_TailDrop = DiscardPolicy(tech_profile.DiscardPolicy_TailDrop)
const DiscardPolicy_WTailDrop = DiscardPolicy(tech_profile.DiscardPolicy_WTailDrop)
const DiscardPolicy_Red = DiscardPolicy(tech_profile.DiscardPolicy_Red)
const DiscardPolicy_WRed = DiscardPolicy(tech_profile.DiscardPolicy_WRed)

// InferredAdditionBWIndication from public import voltha_protos/tech_profile.proto
type InferredAdditionBWIndication = tech_profile.InferredAdditionBWIndication

var InferredAdditionBWIndication_name = tech_profile.InferredAdditionBWIndication_name
var InferredAdditionBWIndication_value = tech_profile.InferredAdditionBWIndication_value

const InferredAdditionBWIndication_InferredAdditionBWIndication_None = InferredAdditionBWIndication(tech_profile.InferredAdditionBWIndication_InferredAdditionBWIndication_None)
const InferredAdditionBWIndication_InferredAdditionBWIndication_Assured = InferredAdditionBWIndication(tech_profile.InferredAdditionBWIndication_InferredAdditionBWIndication_Assured)
const InferredAdditionBWIndication_InferredAdditionBWIndication_BestEffort = InferredAdditionBWIndication(tech_profile.InferredAdditionBWIndication_InferredAdditionBWIndication_BestEffort)

type DeviceInfo_DeviceResourceRanges_Pool_PoolType int32

const (
	DeviceInfo_DeviceResourceRanges_Pool_ONU_ID     DeviceInfo_DeviceResourceRanges_Pool_PoolType = 0
	DeviceInfo_DeviceResourceRanges_Pool_ALLOC_ID   DeviceInfo_DeviceResourceRanges_Pool_PoolType = 1
	DeviceInfo_DeviceResourceRanges_Pool_GEMPORT_ID DeviceInfo_DeviceResourceRanges_Pool_PoolType = 2
	DeviceInfo_DeviceResourceRanges_Pool_FLOW_ID    DeviceInfo_DeviceResourceRanges_Pool_PoolType = 3
)

var DeviceInfo_DeviceResourceRanges_Pool_PoolType_name = map[int32]string{
	0: "ONU_ID",
	1: "ALLOC_ID",
	2: "GEMPORT_ID",
	3: "FLOW_ID",
}

var DeviceInfo_DeviceResourceRanges_Pool_PoolType_value = map[string]int32{
	"ONU_ID":     0,
	"ALLOC_ID":   1,
	"GEMPORT_ID": 2,
	"FLOW_ID":    3,
}

func (x DeviceInfo_DeviceResourceRanges_Pool_PoolType) String() string {
	return proto.EnumName(DeviceInfo_DeviceResourceRanges_Pool_PoolType_name, int32(x))
}

func (DeviceInfo_DeviceResourceRanges_Pool_PoolType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{15, 0, 0, 0}
}

type DeviceInfo_DeviceResourceRanges_Pool_SharingType int32

const (
	DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF           DeviceInfo_DeviceResourceRanges_Pool_SharingType = 0
	DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH  DeviceInfo_DeviceResourceRanges_Pool_SharingType = 1
	DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_SAME_TECH DeviceInfo_DeviceResourceRanges_Pool_SharingType = 2
)

var DeviceInfo_DeviceResourceRanges_Pool_SharingType_name = map[int32]string{
	0: "DEDICATED_PER_INTF",
	1: "SHARED_BY_ALL_INTF_ALL_TECH",
	2: "SHARED_BY_ALL_INTF_SAME_TECH",
}

var DeviceInfo_DeviceResourceRanges_Pool_SharingType_value = map[string]int32{
	"DEDICATED_PER_INTF":           0,
	"SHARED_BY_ALL_INTF_ALL_TECH":  1,
	"SHARED_BY_ALL_INTF_SAME_TECH": 2,
}

func (x DeviceInfo_DeviceResourceRanges_Pool_SharingType) String() string {
	return proto.EnumName(DeviceInfo_DeviceResourceRanges_Pool_SharingType_name, int32(x))
}

func (DeviceInfo_DeviceResourceRanges_Pool_SharingType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{15, 0, 0, 1}
}

type Indication struct {
	// Types that are valid to be assigned to Data:
	//	*Indication_OltInd
	//	*Indication_IntfInd
	//	*Indication_IntfOperInd
	//	*Indication_OnuDiscInd
	//	*Indication_OnuInd
	//	*Indication_OmciInd
	//	*Indication_PktInd
	//	*Indication_PortStats
	//	*Indication_FlowStats
	//	*Indication_AlarmInd
	Data                 isIndication_Data `protobuf_oneof:"data"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_Indication proto.InternalMessageInfo

type isIndication_Data interface {
	isIndication_Data()
}

type Indication_OltInd struct {
	OltInd *OltIndication `protobuf:"bytes,1,opt,name=olt_ind,json=oltInd,proto3,oneof"`
}

type Indication_IntfInd struct {
	IntfInd *IntfIndication `protobuf:"bytes,2,opt,name=intf_ind,json=intfInd,proto3,oneof"`
}

type Indication_IntfOperInd struct {
	IntfOperInd *IntfOperIndication `protobuf:"bytes,3,opt,name=intf_oper_ind,json=intfOperInd,proto3,oneof"`
}

type Indication_OnuDiscInd struct {
	OnuDiscInd *OnuDiscIndication `protobuf:"bytes,4,opt,name=onu_disc_ind,json=onuDiscInd,proto3,oneof"`
}

type Indication_OnuInd struct {
	OnuInd *OnuIndication `protobuf:"bytes,5,opt,name=onu_ind,json=onuInd,proto3,oneof"`
}

type Indication_OmciInd struct {
	OmciInd *OmciIndication `protobuf:"bytes,6,opt,name=omci_ind,json=omciInd,proto3,oneof"`
}

type Indication_PktInd struct {
	PktInd *PacketIndication `protobuf:"bytes,7,opt,name=pkt_ind,json=pktInd,proto3,oneof"`
}

type Indication_PortStats struct {
	PortStats *PortStatistics `protobuf:"bytes,8,opt,name=port_stats,json=portStats,proto3,oneof"`
}

type Indication_FlowStats struct {
	FlowStats *FlowStatistics `protobuf:"bytes,9,opt,name=flow_stats,json=flowStats,proto3,oneof"`
}

type Indication_AlarmInd struct {
	AlarmInd *AlarmIndication `protobuf:"bytes,10,opt,name=alarm_ind,json=alarmInd,proto3,oneof"`
}

func (*Indication_OltInd) isIndication_Data() {}

func (*Indication_IntfInd) isIndication_Data() {}

func (*Indication_IntfOperInd) isIndication_Data() {}

func (*Indication_OnuDiscInd) isIndication_Data() {}

func (*Indication_OnuInd) isIndication_Data() {}

func (*Indication_OmciInd) isIndication_Data() {}

func (*Indication_PktInd) isIndication_Data() {}

func (*Indication_PortStats) isIndication_Data() {}

func (*Indication_FlowStats) isIndication_Data() {}

func (*Indication_AlarmInd) isIndication_Data() {}

func (m *Indication) GetData() isIndication_Data {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *Indication) GetOltInd() *OltIndication {
	if x, ok := m.GetData().(*Indication_OltInd); ok {
		return x.OltInd
	}
	return nil
}

func (m *Indication) GetIntfInd() *IntfIndication {
	if x, ok := m.GetData().(*Indication_IntfInd); ok {
		return x.IntfInd
	}
	return nil
}

func (m *Indication) GetIntfOperInd() *IntfOperIndication {
	if x, ok := m.GetData().(*Indication_IntfOperInd); ok {
		return x.IntfOperInd
	}
	return nil
}

func (m *Indication) GetOnuDiscInd() *OnuDiscIndication {
	if x, ok := m.GetData().(*Indication_OnuDiscInd); ok {
		return x.OnuDiscInd
	}
	return nil
}

func (m *Indication) GetOnuInd() *OnuIndication {
	if x, ok := m.GetData().(*Indication_OnuInd); ok {
		return x.OnuInd
	}
	return nil
}

func (m *Indication) GetOmciInd() *OmciIndication {
	if x, ok := m.GetData().(*Indication_OmciInd); ok {
		return x.OmciInd
	}
	return nil
}

func (m *Indication) GetPktInd() *PacketIndication {
	if x, ok := m.GetData().(*Indication_PktInd); ok {
		return x.PktInd
	}
	return nil
}

func (m *Indication) GetPortStats() *PortStatistics {
	if x, ok := m.GetData().(*Indication_PortStats); ok {
		return x.PortStats
	}
	return nil
}

func (m *Indication) GetFlowStats() *FlowStatistics {
	if x, ok := m.GetData().(*Indication_FlowStats); ok {
		return x.FlowStats
	}
	return nil
}

func (m *Indication) GetAlarmInd() *AlarmIndication {
	if x, ok := m.GetData().(*Indication_AlarmInd); ok {
		return x.AlarmInd
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Indication) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Indication_OltInd)(nil),
		(*Indication_IntfInd)(nil),
		(*Indication_IntfOperInd)(nil),
		(*Indication_OnuDiscInd)(nil),
		(*Indication_OnuInd)(nil),
		(*Indication_OmciInd)(nil),
		(*Indication_PktInd)(nil),
		(*Indication_PortStats)(nil),
		(*Indication_FlowStats)(nil),
		(*Indication_AlarmInd)(nil),
	}
}

type AlarmIndication struct {
	// Types that are valid to be assigned to Data:
	//	*AlarmIndication_LosInd
	//	*AlarmIndication_DyingGaspInd
	//	*AlarmIndication_OnuAlarmInd
	//	*AlarmIndication_OnuStartupFailInd
	//	*AlarmIndication_OnuSignalDegradeInd
	//	*AlarmIndication_OnuDriftOfWindowInd
	//	*AlarmIndication_OnuLossOmciInd
	//	*AlarmIndication_OnuSignalsFailInd
	//	*AlarmIndication_OnuTiwiInd
	//	*AlarmIndication_OnuActivationFailInd
	//	*AlarmIndication_OnuProcessingErrorInd
	Data                 isAlarmIndication_Data `protobuf_oneof:"data"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

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

var xxx_messageInfo_AlarmIndication proto.InternalMessageInfo

type isAlarmIndication_Data interface {
	isAlarmIndication_Data()
}

type AlarmIndication_LosInd struct {
	LosInd *LosIndication `protobuf:"bytes,1,opt,name=los_ind,json=losInd,proto3,oneof"`
}

type AlarmIndication_DyingGaspInd struct {
	DyingGaspInd *DyingGaspIndication `protobuf:"bytes,2,opt,name=dying_gasp_ind,json=dyingGaspInd,proto3,oneof"`
}

type AlarmIndication_OnuAlarmInd struct {
	OnuAlarmInd *OnuAlarmIndication `protobuf:"bytes,3,opt,name=onu_alarm_ind,json=onuAlarmInd,proto3,oneof"`
}

type AlarmIndication_OnuStartupFailInd struct {
	OnuStartupFailInd *OnuStartupFailureIndication `protobuf:"bytes,4,opt,name=onu_startup_fail_ind,json=onuStartupFailInd,proto3,oneof"`
}

type AlarmIndication_OnuSignalDegradeInd struct {
	OnuSignalDegradeInd *OnuSignalDegradeIndication `protobuf:"bytes,5,opt,name=onu_signal_degrade_ind,json=onuSignalDegradeInd,proto3,oneof"`
}

type AlarmIndication_OnuDriftOfWindowInd struct {
	OnuDriftOfWindowInd *OnuDriftOfWindowIndication `protobuf:"bytes,6,opt,name=onu_drift_of_window_ind,json=onuDriftOfWindowInd,proto3,oneof"`
}

type AlarmIndication_OnuLossOmciInd struct {
	OnuLossOmciInd *OnuLossOfOmciChannelIndication `protobuf:"bytes,7,opt,name=onu_loss_omci_ind,json=onuLossOmciInd,proto3,oneof"`
}

type AlarmIndication_OnuSignalsFailInd struct {
	OnuSignalsFailInd *OnuSignalsFailureIndication `protobuf:"bytes,8,opt,name=onu_signals_fail_ind,json=onuSignalsFailInd,proto3,oneof"`
}

type AlarmIndication_OnuTiwiInd struct {
	OnuTiwiInd *OnuTransmissionInterferenceWarning `protobuf:"bytes,9,opt,name=onu_tiwi_ind,json=onuTiwiInd,proto3,oneof"`
}

type AlarmIndication_OnuActivationFailInd struct {
	OnuActivationFailInd *OnuActivationFailureIndication `protobuf:"bytes,10,opt,name=onu_activation_fail_ind,json=onuActivationFailInd,proto3,oneof"`
}

type AlarmIndication_OnuProcessingErrorInd struct {
	OnuProcessingErrorInd *OnuProcessingErrorIndication `protobuf:"bytes,11,opt,name=onu_processing_error_ind,json=onuProcessingErrorInd,proto3,oneof"`
}

func (*AlarmIndication_LosInd) isAlarmIndication_Data() {}

func (*AlarmIndication_DyingGaspInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuAlarmInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuStartupFailInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuSignalDegradeInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuDriftOfWindowInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuLossOmciInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuSignalsFailInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuTiwiInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuActivationFailInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuProcessingErrorInd) isAlarmIndication_Data() {}

func (m *AlarmIndication) GetData() isAlarmIndication_Data {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *AlarmIndication) GetLosInd() *LosIndication {
	if x, ok := m.GetData().(*AlarmIndication_LosInd); ok {
		return x.LosInd
	}
	return nil
}

func (m *AlarmIndication) GetDyingGaspInd() *DyingGaspIndication {
	if x, ok := m.GetData().(*AlarmIndication_DyingGaspInd); ok {
		return x.DyingGaspInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuAlarmInd() *OnuAlarmIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuAlarmInd); ok {
		return x.OnuAlarmInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuStartupFailInd() *OnuStartupFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuStartupFailInd); ok {
		return x.OnuStartupFailInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuSignalDegradeInd() *OnuSignalDegradeIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuSignalDegradeInd); ok {
		return x.OnuSignalDegradeInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuDriftOfWindowInd() *OnuDriftOfWindowIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuDriftOfWindowInd); ok {
		return x.OnuDriftOfWindowInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuLossOmciInd() *OnuLossOfOmciChannelIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuLossOmciInd); ok {
		return x.OnuLossOmciInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuSignalsFailInd() *OnuSignalsFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuSignalsFailInd); ok {
		return x.OnuSignalsFailInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuTiwiInd() *OnuTransmissionInterferenceWarning {
	if x, ok := m.GetData().(*AlarmIndication_OnuTiwiInd); ok {
		return x.OnuTiwiInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuActivationFailInd() *OnuActivationFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuActivationFailInd); ok {
		return x.OnuActivationFailInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuProcessingErrorInd() *OnuProcessingErrorIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuProcessingErrorInd); ok {
		return x.OnuProcessingErrorInd
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*AlarmIndication) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*AlarmIndication_LosInd)(nil),
		(*AlarmIndication_DyingGaspInd)(nil),
		(*AlarmIndication_OnuAlarmInd)(nil),
		(*AlarmIndication_OnuStartupFailInd)(nil),
		(*AlarmIndication_OnuSignalDegradeInd)(nil),
		(*AlarmIndication_OnuDriftOfWindowInd)(nil),
		(*AlarmIndication_OnuLossOmciInd)(nil),
		(*AlarmIndication_OnuSignalsFailInd)(nil),
		(*AlarmIndication_OnuTiwiInd)(nil),
		(*AlarmIndication_OnuActivationFailInd)(nil),
		(*AlarmIndication_OnuProcessingErrorInd)(nil),
	}
}

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

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

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

var xxx_messageInfo_OltIndication proto.InternalMessageInfo

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

type IntfIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OperState            string   `protobuf:"bytes,2,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_IntfIndication proto.InternalMessageInfo

func (m *IntfIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

type OnuDiscIndication struct {
	IntfId               uint32        `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	SerialNumber         *SerialNumber `protobuf:"bytes,2,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

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

var xxx_messageInfo_OnuDiscIndication proto.InternalMessageInfo

func (m *OnuDiscIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuDiscIndication) GetSerialNumber() *SerialNumber {
	if m != nil {
		return m.SerialNumber
	}
	return nil
}

type OnuIndication struct {
	IntfId               uint32        `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32        `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	OperState            string        `protobuf:"bytes,3,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"`
	AdminState           string        `protobuf:"bytes,5,opt,name=admin_state,json=adminState,proto3" json:"admin_state,omitempty"`
	SerialNumber         *SerialNumber `protobuf:"bytes,4,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

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

var xxx_messageInfo_OnuIndication proto.InternalMessageInfo

func (m *OnuIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuIndication) GetAdminState() string {
	if m != nil {
		return m.AdminState
	}
	return ""
}

func (m *OnuIndication) GetSerialNumber() *SerialNumber {
	if m != nil {
		return m.SerialNumber
	}
	return nil
}

type IntfOperIndication struct {
	Type                 string   `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	IntfId               uint32   `protobuf:"fixed32,2,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OperState            string   `protobuf:"bytes,3,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_IntfOperIndication proto.InternalMessageInfo

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

func (m *IntfOperIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

type OmciIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,3,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_OmciIndication proto.InternalMessageInfo

func (m *OmciIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

func (m *OmciIndication) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type PacketIndication struct {
	IntfType             string   `protobuf:"bytes,5,opt,name=intf_type,json=intfType,proto3" json:"intf_type,omitempty"`
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	GemportId            uint32   `protobuf:"fixed32,2,opt,name=gemport_id,json=gemportId,proto3" json:"gemport_id,omitempty"`
	FlowId               uint32   `protobuf:"fixed32,3,opt,name=flow_id,json=flowId,proto3" json:"flow_id,omitempty"`
	PortNo               uint32   `protobuf:"fixed32,6,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	Cookie               uint64   `protobuf:"fixed64,7,opt,name=cookie,proto3" json:"cookie,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,4,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PacketIndication proto.InternalMessageInfo

func (m *PacketIndication) GetIntfType() string {
	if m != nil {
		return m.IntfType
	}
	return ""
}

func (m *PacketIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *PacketIndication) GetGemportId() uint32 {
	if m != nil {
		return m.GemportId
	}
	return 0
}

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

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

func (m *PacketIndication) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *PacketIndication) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type Interface struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Interface proto.InternalMessageInfo

func (m *Interface) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

type Heartbeat struct {
	HeartbeatSignature   uint32   `protobuf:"fixed32,1,opt,name=heartbeat_signature,json=heartbeatSignature,proto3" json:"heartbeat_signature,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Heartbeat proto.InternalMessageInfo

func (m *Heartbeat) GetHeartbeatSignature() uint32 {
	if m != nil {
		return m.HeartbeatSignature
	}
	return 0
}

type Onu struct {
	IntfId               uint32        `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32        `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	SerialNumber         *SerialNumber `protobuf:"bytes,3,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
	Pir                  uint32        `protobuf:"fixed32,4,opt,name=pir,proto3" json:"pir,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_c072e7aa0dfd74d5, []int{11}
}

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

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

func (m *Onu) GetSerialNumber() *SerialNumber {
	if m != nil {
		return m.SerialNumber
	}
	return nil
}

func (m *Onu) GetPir() uint32 {
	if m != nil {
		return m.Pir
	}
	return 0
}

type OmciMsg struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,3,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_OmciMsg proto.InternalMessageInfo

func (m *OmciMsg) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

func (m *OmciMsg) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type OnuPacket struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	PortNo               uint32   `protobuf:"fixed32,4,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	GemportId            uint32   `protobuf:"fixed32,5,opt,name=gemport_id,json=gemportId,proto3" json:"gemport_id,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,3,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuPacket) Reset()         { *m = OnuPacket{} }
func (m *OnuPacket) String() string { return proto.CompactTextString(m) }
func (*OnuPacket) ProtoMessage()    {}
func (*OnuPacket) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{13}
}

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

var xxx_messageInfo_OnuPacket proto.InternalMessageInfo

func (m *OnuPacket) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuPacket) GetGemportId() uint32 {
	if m != nil {
		return m.GemportId
	}
	return 0
}

func (m *OnuPacket) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type UplinkPacket struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,2,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UplinkPacket proto.InternalMessageInfo

func (m *UplinkPacket) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *UplinkPacket) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type DeviceInfo struct {
	Vendor             string `protobuf:"bytes,1,opt,name=vendor,proto3" json:"vendor,omitempty"`
	Model              string `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"`
	HardwareVersion    string `protobuf:"bytes,3,opt,name=hardware_version,json=hardwareVersion,proto3" json:"hardware_version,omitempty"`
	FirmwareVersion    string `protobuf:"bytes,4,opt,name=firmware_version,json=firmwareVersion,proto3" json:"firmware_version,omitempty"`
	DeviceId           string `protobuf:"bytes,16,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
	DeviceSerialNumber string `protobuf:"bytes,17,opt,name=device_serial_number,json=deviceSerialNumber,proto3" json:"device_serial_number,omitempty"`
	// Total number of pon intf ports on the device
	PonPorts uint32 `protobuf:"fixed32,12,opt,name=pon_ports,json=ponPorts,proto3" json:"pon_ports,omitempty"`
	// If using global per-device technology profile. To be deprecated
	Technology           string                             `protobuf:"bytes,5,opt,name=technology,proto3" json:"technology,omitempty"`
	OnuIdStart           uint32                             `protobuf:"fixed32,6,opt,name=onu_id_start,json=onuIdStart,proto3" json:"onu_id_start,omitempty"`
	OnuIdEnd             uint32                             `protobuf:"fixed32,7,opt,name=onu_id_end,json=onuIdEnd,proto3" json:"onu_id_end,omitempty"`
	AllocIdStart         uint32                             `protobuf:"fixed32,8,opt,name=alloc_id_start,json=allocIdStart,proto3" json:"alloc_id_start,omitempty"`
	AllocIdEnd           uint32                             `protobuf:"fixed32,9,opt,name=alloc_id_end,json=allocIdEnd,proto3" json:"alloc_id_end,omitempty"`
	GemportIdStart       uint32                             `protobuf:"fixed32,10,opt,name=gemport_id_start,json=gemportIdStart,proto3" json:"gemport_id_start,omitempty"`
	GemportIdEnd         uint32                             `protobuf:"fixed32,11,opt,name=gemport_id_end,json=gemportIdEnd,proto3" json:"gemport_id_end,omitempty"`
	FlowIdStart          uint32                             `protobuf:"fixed32,13,opt,name=flow_id_start,json=flowIdStart,proto3" json:"flow_id_start,omitempty"`
	FlowIdEnd            uint32                             `protobuf:"fixed32,14,opt,name=flow_id_end,json=flowIdEnd,proto3" json:"flow_id_end,omitempty"`
	Ranges               []*DeviceInfo_DeviceResourceRanges `protobuf:"bytes,15,rep,name=ranges,proto3" json:"ranges,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
	XXX_unrecognized     []byte                             `json:"-"`
	XXX_sizecache        int32                              `json:"-"`
}

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

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

var xxx_messageInfo_DeviceInfo proto.InternalMessageInfo

func (m *DeviceInfo) GetVendor() string {
	if m != nil {
		return m.Vendor
	}
	return ""
}

func (m *DeviceInfo) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

func (m *DeviceInfo) GetHardwareVersion() string {
	if m != nil {
		return m.HardwareVersion
	}
	return ""
}

func (m *DeviceInfo) GetFirmwareVersion() string {
	if m != nil {
		return m.FirmwareVersion
	}
	return ""
}

func (m *DeviceInfo) GetDeviceId() string {
	if m != nil {
		return m.DeviceId
	}
	return ""
}

func (m *DeviceInfo) GetDeviceSerialNumber() string {
	if m != nil {
		return m.DeviceSerialNumber
	}
	return ""
}

func (m *DeviceInfo) GetPonPorts() uint32 {
	if m != nil {
		return m.PonPorts
	}
	return 0
}

func (m *DeviceInfo) GetTechnology() string {
	if m != nil {
		return m.Technology
	}
	return ""
}

func (m *DeviceInfo) GetOnuIdStart() uint32 {
	if m != nil {
		return m.OnuIdStart
	}
	return 0
}

func (m *DeviceInfo) GetOnuIdEnd() uint32 {
	if m != nil {
		return m.OnuIdEnd
	}
	return 0
}

func (m *DeviceInfo) GetAllocIdStart() uint32 {
	if m != nil {
		return m.AllocIdStart
	}
	return 0
}

func (m *DeviceInfo) GetAllocIdEnd() uint32 {
	if m != nil {
		return m.AllocIdEnd
	}
	return 0
}

func (m *DeviceInfo) GetGemportIdStart() uint32 {
	if m != nil {
		return m.GemportIdStart
	}
	return 0
}

func (m *DeviceInfo) GetGemportIdEnd() uint32 {
	if m != nil {
		return m.GemportIdEnd
	}
	return 0
}

func (m *DeviceInfo) GetFlowIdStart() uint32 {
	if m != nil {
		return m.FlowIdStart
	}
	return 0
}

func (m *DeviceInfo) GetFlowIdEnd() uint32 {
	if m != nil {
		return m.FlowIdEnd
	}
	return 0
}

func (m *DeviceInfo) GetRanges() []*DeviceInfo_DeviceResourceRanges {
	if m != nil {
		return m.Ranges
	}
	return nil
}

type DeviceInfo_DeviceResourceRanges struct {
	// List of 0 or more intf_ids that use the same technology and pools.
	// If 0 intf_ids supplied, it implies ALL interfaces
	IntfIds []uint32 `protobuf:"fixed32,1,rep,packed,name=intf_ids,json=intfIds,proto3" json:"intf_ids,omitempty"`
	// Technology profile for this pool
	Technology           string                                  `protobuf:"bytes,2,opt,name=technology,proto3" json:"technology,omitempty"`
	Pools                []*DeviceInfo_DeviceResourceRanges_Pool `protobuf:"bytes,3,rep,name=pools,proto3" json:"pools,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

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

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

var xxx_messageInfo_DeviceInfo_DeviceResourceRanges proto.InternalMessageInfo

func (m *DeviceInfo_DeviceResourceRanges) GetIntfIds() []uint32 {
	if m != nil {
		return m.IntfIds
	}
	return nil
}

func (m *DeviceInfo_DeviceResourceRanges) GetTechnology() string {
	if m != nil {
		return m.Technology
	}
	return ""
}

func (m *DeviceInfo_DeviceResourceRanges) GetPools() []*DeviceInfo_DeviceResourceRanges_Pool {
	if m != nil {
		return m.Pools
	}
	return nil
}

type DeviceInfo_DeviceResourceRanges_Pool struct {
	Type                 DeviceInfo_DeviceResourceRanges_Pool_PoolType    `protobuf:"varint,1,opt,name=type,proto3,enum=openolt.DeviceInfo_DeviceResourceRanges_Pool_PoolType" json:"type,omitempty"`
	Sharing              DeviceInfo_DeviceResourceRanges_Pool_SharingType `protobuf:"varint,2,opt,name=sharing,proto3,enum=openolt.DeviceInfo_DeviceResourceRanges_Pool_SharingType" json:"sharing,omitempty"`
	Start                uint32                                           `protobuf:"fixed32,3,opt,name=start,proto3" json:"start,omitempty"`
	End                  uint32                                           `protobuf:"fixed32,4,opt,name=end,proto3" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                         `json:"-"`
	XXX_unrecognized     []byte                                           `json:"-"`
	XXX_sizecache        int32                                            `json:"-"`
}

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

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

var xxx_messageInfo_DeviceInfo_DeviceResourceRanges_Pool proto.InternalMessageInfo

func (m *DeviceInfo_DeviceResourceRanges_Pool) GetType() DeviceInfo_DeviceResourceRanges_Pool_PoolType {
	if m != nil {
		return m.Type
	}
	return DeviceInfo_DeviceResourceRanges_Pool_ONU_ID
}

func (m *DeviceInfo_DeviceResourceRanges_Pool) GetSharing() DeviceInfo_DeviceResourceRanges_Pool_SharingType {
	if m != nil {
		return m.Sharing
	}
	return DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF
}

func (m *DeviceInfo_DeviceResourceRanges_Pool) GetStart() uint32 {
	if m != nil {
		return m.Start
	}
	return 0
}

func (m *DeviceInfo_DeviceResourceRanges_Pool) GetEnd() uint32 {
	if m != nil {
		return m.End
	}
	return 0
}

type Classifier struct {
	OTpid                uint32   `protobuf:"fixed32,1,opt,name=o_tpid,json=oTpid,proto3" json:"o_tpid,omitempty"`
	OVid                 uint32   `protobuf:"fixed32,2,opt,name=o_vid,json=oVid,proto3" json:"o_vid,omitempty"`
	ITpid                uint32   `protobuf:"fixed32,3,opt,name=i_tpid,json=iTpid,proto3" json:"i_tpid,omitempty"`
	IVid                 uint32   `protobuf:"fixed32,4,opt,name=i_vid,json=iVid,proto3" json:"i_vid,omitempty"`
	OPbits               uint32   `protobuf:"fixed32,5,opt,name=o_pbits,json=oPbits,proto3" json:"o_pbits,omitempty"`
	IPbits               uint32   `protobuf:"fixed32,6,opt,name=i_pbits,json=iPbits,proto3" json:"i_pbits,omitempty"`
	EthType              uint32   `protobuf:"fixed32,7,opt,name=eth_type,json=ethType,proto3" json:"eth_type,omitempty"`
	DstMac               []byte   `protobuf:"bytes,8,opt,name=dst_mac,json=dstMac,proto3" json:"dst_mac,omitempty"`
	SrcMac               []byte   `protobuf:"bytes,9,opt,name=src_mac,json=srcMac,proto3" json:"src_mac,omitempty"`
	IpProto              uint32   `protobuf:"fixed32,10,opt,name=ip_proto,json=ipProto,proto3" json:"ip_proto,omitempty"`
	DstIp                uint32   `protobuf:"fixed32,11,opt,name=dst_ip,json=dstIp,proto3" json:"dst_ip,omitempty"`
	SrcIp                uint32   `protobuf:"fixed32,12,opt,name=src_ip,json=srcIp,proto3" json:"src_ip,omitempty"`
	SrcPort              uint32   `protobuf:"fixed32,13,opt,name=src_port,json=srcPort,proto3" json:"src_port,omitempty"`
	DstPort              uint32   `protobuf:"fixed32,14,opt,name=dst_port,json=dstPort,proto3" json:"dst_port,omitempty"`
	PktTagType           string   `protobuf:"bytes,15,opt,name=pkt_tag_type,json=pktTagType,proto3" json:"pkt_tag_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Classifier proto.InternalMessageInfo

func (m *Classifier) GetOTpid() uint32 {
	if m != nil {
		return m.OTpid
	}
	return 0
}

func (m *Classifier) GetOVid() uint32 {
	if m != nil {
		return m.OVid
	}
	return 0
}

func (m *Classifier) GetITpid() uint32 {
	if m != nil {
		return m.ITpid
	}
	return 0
}

func (m *Classifier) GetIVid() uint32 {
	if m != nil {
		return m.IVid
	}
	return 0
}

func (m *Classifier) GetOPbits() uint32 {
	if m != nil {
		return m.OPbits
	}
	return 0
}

func (m *Classifier) GetIPbits() uint32 {
	if m != nil {
		return m.IPbits
	}
	return 0
}

func (m *Classifier) GetEthType() uint32 {
	if m != nil {
		return m.EthType
	}
	return 0
}

func (m *Classifier) GetDstMac() []byte {
	if m != nil {
		return m.DstMac
	}
	return nil
}

func (m *Classifier) GetSrcMac() []byte {
	if m != nil {
		return m.SrcMac
	}
	return nil
}

func (m *Classifier) GetIpProto() uint32 {
	if m != nil {
		return m.IpProto
	}
	return 0
}

func (m *Classifier) GetDstIp() uint32 {
	if m != nil {
		return m.DstIp
	}
	return 0
}

func (m *Classifier) GetSrcIp() uint32 {
	if m != nil {
		return m.SrcIp
	}
	return 0
}

func (m *Classifier) GetSrcPort() uint32 {
	if m != nil {
		return m.SrcPort
	}
	return 0
}

func (m *Classifier) GetDstPort() uint32 {
	if m != nil {
		return m.DstPort
	}
	return 0
}

func (m *Classifier) GetPktTagType() string {
	if m != nil {
		return m.PktTagType
	}
	return ""
}

type ActionCmd struct {
	AddOuterTag          bool     `protobuf:"varint,1,opt,name=add_outer_tag,json=addOuterTag,proto3" json:"add_outer_tag,omitempty"`
	RemoveOuterTag       bool     `protobuf:"varint,2,opt,name=remove_outer_tag,json=removeOuterTag,proto3" json:"remove_outer_tag,omitempty"`
	TrapToHost           bool     `protobuf:"varint,3,opt,name=trap_to_host,json=trapToHost,proto3" json:"trap_to_host,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ActionCmd proto.InternalMessageInfo

func (m *ActionCmd) GetAddOuterTag() bool {
	if m != nil {
		return m.AddOuterTag
	}
	return false
}

func (m *ActionCmd) GetRemoveOuterTag() bool {
	if m != nil {
		return m.RemoveOuterTag
	}
	return false
}

func (m *ActionCmd) GetTrapToHost() bool {
	if m != nil {
		return m.TrapToHost
	}
	return false
}

type Action struct {
	Cmd                  *ActionCmd `protobuf:"bytes,1,opt,name=cmd,proto3" json:"cmd,omitempty"`
	OVid                 uint32     `protobuf:"fixed32,2,opt,name=o_vid,json=oVid,proto3" json:"o_vid,omitempty"`
	OPbits               uint32     `protobuf:"fixed32,3,opt,name=o_pbits,json=oPbits,proto3" json:"o_pbits,omitempty"`
	OTpid                uint32     `protobuf:"fixed32,4,opt,name=o_tpid,json=oTpid,proto3" json:"o_tpid,omitempty"`
	IVid                 uint32     `protobuf:"fixed32,5,opt,name=i_vid,json=iVid,proto3" json:"i_vid,omitempty"`
	IPbits               uint32     `protobuf:"fixed32,6,opt,name=i_pbits,json=iPbits,proto3" json:"i_pbits,omitempty"`
	ITpid                uint32     `protobuf:"fixed32,7,opt,name=i_tpid,json=iTpid,proto3" json:"i_tpid,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *Action) Reset()         { *m = Action{} }
func (m *Action) String() string { return proto.CompactTextString(m) }
func (*Action) ProtoMessage()    {}
func (*Action) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{18}
}

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

var xxx_messageInfo_Action proto.InternalMessageInfo

func (m *Action) GetCmd() *ActionCmd {
	if m != nil {
		return m.Cmd
	}
	return nil
}

func (m *Action) GetOVid() uint32 {
	if m != nil {
		return m.OVid
	}
	return 0
}

func (m *Action) GetOPbits() uint32 {
	if m != nil {
		return m.OPbits
	}
	return 0
}

func (m *Action) GetOTpid() uint32 {
	if m != nil {
		return m.OTpid
	}
	return 0
}

func (m *Action) GetIVid() uint32 {
	if m != nil {
		return m.IVid
	}
	return 0
}

func (m *Action) GetIPbits() uint32 {
	if m != nil {
		return m.IPbits
	}
	return 0
}

func (m *Action) GetITpid() uint32 {
	if m != nil {
		return m.ITpid
	}
	return 0
}

type Flow struct {
	AccessIntfId         int32       `protobuf:"fixed32,1,opt,name=access_intf_id,json=accessIntfId,proto3" json:"access_intf_id,omitempty"`
	OnuId                int32       `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	UniId                int32       `protobuf:"fixed32,11,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
	FlowId               uint32      `protobuf:"fixed32,3,opt,name=flow_id,json=flowId,proto3" json:"flow_id,omitempty"`
	FlowType             string      `protobuf:"bytes,4,opt,name=flow_type,json=flowType,proto3" json:"flow_type,omitempty"`
	AllocId              int32       `protobuf:"fixed32,10,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"`
	NetworkIntfId        int32       `protobuf:"fixed32,5,opt,name=network_intf_id,json=networkIntfId,proto3" json:"network_intf_id,omitempty"`
	GemportId            int32       `protobuf:"fixed32,6,opt,name=gemport_id,json=gemportId,proto3" json:"gemport_id,omitempty"`
	Classifier           *Classifier `protobuf:"bytes,7,opt,name=classifier,proto3" json:"classifier,omitempty"`
	Action               *Action     `protobuf:"bytes,8,opt,name=action,proto3" json:"action,omitempty"`
	Priority             int32       `protobuf:"fixed32,9,opt,name=priority,proto3" json:"priority,omitempty"`
	Cookie               uint64      `protobuf:"fixed64,12,opt,name=cookie,proto3" json:"cookie,omitempty"`
	PortNo               uint32      `protobuf:"fixed32,13,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	GroupId              uint32      `protobuf:"fixed32,14,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_Flow proto.InternalMessageInfo

func (m *Flow) GetAccessIntfId() int32 {
	if m != nil {
		return m.AccessIntfId
	}
	return 0
}

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

func (m *Flow) GetUniId() int32 {
	if m != nil {
		return m.UniId
	}
	return 0
}

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

func (m *Flow) GetFlowType() string {
	if m != nil {
		return m.FlowType
	}
	return ""
}

func (m *Flow) GetAllocId() int32 {
	if m != nil {
		return m.AllocId
	}
	return 0
}

func (m *Flow) GetNetworkIntfId() int32 {
	if m != nil {
		return m.NetworkIntfId
	}
	return 0
}

func (m *Flow) GetGemportId() int32 {
	if m != nil {
		return m.GemportId
	}
	return 0
}

func (m *Flow) GetClassifier() *Classifier {
	if m != nil {
		return m.Classifier
	}
	return nil
}

func (m *Flow) GetAction() *Action {
	if m != nil {
		return m.Action
	}
	return nil
}

func (m *Flow) GetPriority() int32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *Flow) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

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

func (m *Flow) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

type SerialNumber struct {
	VendorId             []byte   `protobuf:"bytes,1,opt,name=vendor_id,json=vendorId,proto3" json:"vendor_id,omitempty"`
	VendorSpecific       []byte   `protobuf:"bytes,2,opt,name=vendor_specific,json=vendorSpecific,proto3" json:"vendor_specific,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SerialNumber) Reset()         { *m = SerialNumber{} }
func (m *SerialNumber) String() string { return proto.CompactTextString(m) }
func (*SerialNumber) ProtoMessage()    {}
func (*SerialNumber) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{20}
}

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

var xxx_messageInfo_SerialNumber proto.InternalMessageInfo

func (m *SerialNumber) GetVendorId() []byte {
	if m != nil {
		return m.VendorId
	}
	return nil
}

func (m *SerialNumber) GetVendorSpecific() []byte {
	if m != nil {
		return m.VendorSpecific
	}
	return nil
}

type PortStatistics struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	RxBytes              uint64   `protobuf:"fixed64,2,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
	RxPackets            uint64   `protobuf:"fixed64,3,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
	RxUcastPackets       uint64   `protobuf:"fixed64,4,opt,name=rx_ucast_packets,json=rxUcastPackets,proto3" json:"rx_ucast_packets,omitempty"`
	RxMcastPackets       uint64   `protobuf:"fixed64,5,opt,name=rx_mcast_packets,json=rxMcastPackets,proto3" json:"rx_mcast_packets,omitempty"`
	RxBcastPackets       uint64   `protobuf:"fixed64,6,opt,name=rx_bcast_packets,json=rxBcastPackets,proto3" json:"rx_bcast_packets,omitempty"`
	RxErrorPackets       uint64   `protobuf:"fixed64,7,opt,name=rx_error_packets,json=rxErrorPackets,proto3" json:"rx_error_packets,omitempty"`
	TxBytes              uint64   `protobuf:"fixed64,8,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
	TxPackets            uint64   `protobuf:"fixed64,9,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
	TxUcastPackets       uint64   `protobuf:"fixed64,10,opt,name=tx_ucast_packets,json=txUcastPackets,proto3" json:"tx_ucast_packets,omitempty"`
	TxMcastPackets       uint64   `protobuf:"fixed64,11,opt,name=tx_mcast_packets,json=txMcastPackets,proto3" json:"tx_mcast_packets,omitempty"`
	TxBcastPackets       uint64   `protobuf:"fixed64,12,opt,name=tx_bcast_packets,json=txBcastPackets,proto3" json:"tx_bcast_packets,omitempty"`
	TxErrorPackets       uint64   `protobuf:"fixed64,13,opt,name=tx_error_packets,json=txErrorPackets,proto3" json:"tx_error_packets,omitempty"`
	RxCrcErrors          uint64   `protobuf:"fixed64,14,opt,name=rx_crc_errors,json=rxCrcErrors,proto3" json:"rx_crc_errors,omitempty"`
	BipErrors            uint64   `protobuf:"fixed64,15,opt,name=bip_errors,json=bipErrors,proto3" json:"bip_errors,omitempty"`
	Timestamp            uint32   `protobuf:"fixed32,16,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PortStatistics) Reset()         { *m = PortStatistics{} }
func (m *PortStatistics) String() string { return proto.CompactTextString(m) }
func (*PortStatistics) ProtoMessage()    {}
func (*PortStatistics) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{21}
}

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

var xxx_messageInfo_PortStatistics proto.InternalMessageInfo

func (m *PortStatistics) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *PortStatistics) GetRxBytes() uint64 {
	if m != nil {
		return m.RxBytes
	}
	return 0
}

func (m *PortStatistics) GetRxPackets() uint64 {
	if m != nil {
		return m.RxPackets
	}
	return 0
}

func (m *PortStatistics) GetRxUcastPackets() uint64 {
	if m != nil {
		return m.RxUcastPackets
	}
	return 0
}

func (m *PortStatistics) GetRxMcastPackets() uint64 {
	if m != nil {
		return m.RxMcastPackets
	}
	return 0
}

func (m *PortStatistics) GetRxBcastPackets() uint64 {
	if m != nil {
		return m.RxBcastPackets
	}
	return 0
}

func (m *PortStatistics) GetRxErrorPackets() uint64 {
	if m != nil {
		return m.RxErrorPackets
	}
	return 0
}

func (m *PortStatistics) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *PortStatistics) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *PortStatistics) GetTxUcastPackets() uint64 {
	if m != nil {
		return m.TxUcastPackets
	}
	return 0
}

func (m *PortStatistics) GetTxMcastPackets() uint64 {
	if m != nil {
		return m.TxMcastPackets
	}
	return 0
}

func (m *PortStatistics) GetTxBcastPackets() uint64 {
	if m != nil {
		return m.TxBcastPackets
	}
	return 0
}

func (m *PortStatistics) GetTxErrorPackets() uint64 {
	if m != nil {
		return m.TxErrorPackets
	}
	return 0
}

func (m *PortStatistics) GetRxCrcErrors() uint64 {
	if m != nil {
		return m.RxCrcErrors
	}
	return 0
}

func (m *PortStatistics) GetBipErrors() uint64 {
	if m != nil {
		return m.BipErrors
	}
	return 0
}

func (m *PortStatistics) GetTimestamp() uint32 {
	if m != nil {
		return m.Timestamp
	}
	return 0
}

type FlowStatistics struct {
	FlowId               uint32   `protobuf:"fixed32,1,opt,name=flow_id,json=flowId,proto3" json:"flow_id,omitempty"`
	RxBytes              uint64   `protobuf:"fixed64,2,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
	RxPackets            uint64   `protobuf:"fixed64,3,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
	TxBytes              uint64   `protobuf:"fixed64,8,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
	TxPackets            uint64   `protobuf:"fixed64,9,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
	Timestamp            uint32   `protobuf:"fixed32,16,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FlowStatistics) Reset()         { *m = FlowStatistics{} }
func (m *FlowStatistics) String() string { return proto.CompactTextString(m) }
func (*FlowStatistics) ProtoMessage()    {}
func (*FlowStatistics) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{22}
}

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

var xxx_messageInfo_FlowStatistics proto.InternalMessageInfo

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

func (m *FlowStatistics) GetRxBytes() uint64 {
	if m != nil {
		return m.RxBytes
	}
	return 0
}

func (m *FlowStatistics) GetRxPackets() uint64 {
	if m != nil {
		return m.RxPackets
	}
	return 0
}

func (m *FlowStatistics) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *FlowStatistics) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *FlowStatistics) GetTimestamp() uint32 {
	if m != nil {
		return m.Timestamp
	}
	return 0
}

type LosIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	Status               string   `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LosIndication proto.InternalMessageInfo

func (m *LosIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

type DyingGaspIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,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 *DyingGaspIndication) Reset()         { *m = DyingGaspIndication{} }
func (m *DyingGaspIndication) String() string { return proto.CompactTextString(m) }
func (*DyingGaspIndication) ProtoMessage()    {}
func (*DyingGaspIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{24}
}

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

var xxx_messageInfo_DyingGaspIndication proto.InternalMessageInfo

func (m *DyingGaspIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

type OnuAlarmIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	LosStatus            string   `protobuf:"bytes,3,opt,name=los_status,json=losStatus,proto3" json:"los_status,omitempty"`
	LobStatus            string   `protobuf:"bytes,4,opt,name=lob_status,json=lobStatus,proto3" json:"lob_status,omitempty"`
	LopcMissStatus       string   `protobuf:"bytes,5,opt,name=lopc_miss_status,json=lopcMissStatus,proto3" json:"lopc_miss_status,omitempty"`
	LopcMicErrorStatus   string   `protobuf:"bytes,6,opt,name=lopc_mic_error_status,json=lopcMicErrorStatus,proto3" json:"lopc_mic_error_status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuAlarmIndication) Reset()         { *m = OnuAlarmIndication{} }
func (m *OnuAlarmIndication) String() string { return proto.CompactTextString(m) }
func (*OnuAlarmIndication) ProtoMessage()    {}
func (*OnuAlarmIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{25}
}

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

var xxx_messageInfo_OnuAlarmIndication proto.InternalMessageInfo

func (m *OnuAlarmIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

func (m *OnuAlarmIndication) GetLosStatus() string {
	if m != nil {
		return m.LosStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLobStatus() string {
	if m != nil {
		return m.LobStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLopcMissStatus() string {
	if m != nil {
		return m.LopcMissStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLopcMicErrorStatus() string {
	if m != nil {
		return m.LopcMicErrorStatus
	}
	return ""
}

type OnuStartupFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,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 *OnuStartupFailureIndication) Reset()         { *m = OnuStartupFailureIndication{} }
func (m *OnuStartupFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuStartupFailureIndication) ProtoMessage()    {}
func (*OnuStartupFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{26}
}

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

var xxx_messageInfo_OnuStartupFailureIndication proto.InternalMessageInfo

func (m *OnuStartupFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

type OnuSignalDegradeIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	InverseBitErrorRate  uint32   `protobuf:"fixed32,4,opt,name=inverse_bit_error_rate,json=inverseBitErrorRate,proto3" json:"inverse_bit_error_rate,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuSignalDegradeIndication) Reset()         { *m = OnuSignalDegradeIndication{} }
func (m *OnuSignalDegradeIndication) String() string { return proto.CompactTextString(m) }
func (*OnuSignalDegradeIndication) ProtoMessage()    {}
func (*OnuSignalDegradeIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{27}
}

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

var xxx_messageInfo_OnuSignalDegradeIndication proto.InternalMessageInfo

func (m *OnuSignalDegradeIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuSignalDegradeIndication) GetInverseBitErrorRate() uint32 {
	if m != nil {
		return m.InverseBitErrorRate
	}
	return 0
}

type OnuDriftOfWindowIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	Drift                uint32   `protobuf:"fixed32,4,opt,name=drift,proto3" json:"drift,omitempty"`
	NewEqd               uint32   `protobuf:"fixed32,5,opt,name=new_eqd,json=newEqd,proto3" json:"new_eqd,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuDriftOfWindowIndication) Reset()         { *m = OnuDriftOfWindowIndication{} }
func (m *OnuDriftOfWindowIndication) String() string { return proto.CompactTextString(m) }
func (*OnuDriftOfWindowIndication) ProtoMessage()    {}
func (*OnuDriftOfWindowIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{28}
}

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

var xxx_messageInfo_OnuDriftOfWindowIndication proto.InternalMessageInfo

func (m *OnuDriftOfWindowIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuDriftOfWindowIndication) GetDrift() uint32 {
	if m != nil {
		return m.Drift
	}
	return 0
}

func (m *OnuDriftOfWindowIndication) GetNewEqd() uint32 {
	if m != nil {
		return m.NewEqd
	}
	return 0
}

type OnuLossOfOmciChannelIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,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 *OnuLossOfOmciChannelIndication) Reset()         { *m = OnuLossOfOmciChannelIndication{} }
func (m *OnuLossOfOmciChannelIndication) String() string { return proto.CompactTextString(m) }
func (*OnuLossOfOmciChannelIndication) ProtoMessage()    {}
func (*OnuLossOfOmciChannelIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{29}
}

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

var xxx_messageInfo_OnuLossOfOmciChannelIndication proto.InternalMessageInfo

func (m *OnuLossOfOmciChannelIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

type OnuSignalsFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	InverseBitErrorRate  uint32   `protobuf:"fixed32,4,opt,name=inverse_bit_error_rate,json=inverseBitErrorRate,proto3" json:"inverse_bit_error_rate,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuSignalsFailureIndication) Reset()         { *m = OnuSignalsFailureIndication{} }
func (m *OnuSignalsFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuSignalsFailureIndication) ProtoMessage()    {}
func (*OnuSignalsFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{30}
}

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

var xxx_messageInfo_OnuSignalsFailureIndication proto.InternalMessageInfo

func (m *OnuSignalsFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuSignalsFailureIndication) GetInverseBitErrorRate() uint32 {
	if m != nil {
		return m.InverseBitErrorRate
	}
	return 0
}

type OnuTransmissionInterferenceWarning struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	Drift                uint32   `protobuf:"fixed32,4,opt,name=drift,proto3" json:"drift,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuTransmissionInterferenceWarning) Reset()         { *m = OnuTransmissionInterferenceWarning{} }
func (m *OnuTransmissionInterferenceWarning) String() string { return proto.CompactTextString(m) }
func (*OnuTransmissionInterferenceWarning) ProtoMessage()    {}
func (*OnuTransmissionInterferenceWarning) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{31}
}

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

var xxx_messageInfo_OnuTransmissionInterferenceWarning proto.InternalMessageInfo

func (m *OnuTransmissionInterferenceWarning) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

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

func (m *OnuTransmissionInterferenceWarning) GetDrift() uint32 {
	if m != nil {
		return m.Drift
	}
	return 0
}

type OnuActivationFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuActivationFailureIndication) Reset()         { *m = OnuActivationFailureIndication{} }
func (m *OnuActivationFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuActivationFailureIndication) ProtoMessage()    {}
func (*OnuActivationFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{32}
}

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

var xxx_messageInfo_OnuActivationFailureIndication proto.InternalMessageInfo

func (m *OnuActivationFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

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

type OnuProcessingErrorIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuProcessingErrorIndication) Reset()         { *m = OnuProcessingErrorIndication{} }
func (m *OnuProcessingErrorIndication) String() string { return proto.CompactTextString(m) }
func (*OnuProcessingErrorIndication) ProtoMessage()    {}
func (*OnuProcessingErrorIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{33}
}

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

var xxx_messageInfo_OnuProcessingErrorIndication proto.InternalMessageInfo

func (m *OnuProcessingErrorIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuProcessingErrorIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	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_c072e7aa0dfd74d5, []int{34}
}

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("openolt.DeviceInfo_DeviceResourceRanges_Pool_PoolType", DeviceInfo_DeviceResourceRanges_Pool_PoolType_name, DeviceInfo_DeviceResourceRanges_Pool_PoolType_value)
	proto.RegisterEnum("openolt.DeviceInfo_DeviceResourceRanges_Pool_SharingType", DeviceInfo_DeviceResourceRanges_Pool_SharingType_name, DeviceInfo_DeviceResourceRanges_Pool_SharingType_value)
	proto.RegisterType((*Indication)(nil), "openolt.Indication")
	proto.RegisterType((*AlarmIndication)(nil), "openolt.AlarmIndication")
	proto.RegisterType((*OltIndication)(nil), "openolt.OltIndication")
	proto.RegisterType((*IntfIndication)(nil), "openolt.IntfIndication")
	proto.RegisterType((*OnuDiscIndication)(nil), "openolt.OnuDiscIndication")
	proto.RegisterType((*OnuIndication)(nil), "openolt.OnuIndication")
	proto.RegisterType((*IntfOperIndication)(nil), "openolt.IntfOperIndication")
	proto.RegisterType((*OmciIndication)(nil), "openolt.OmciIndication")
	proto.RegisterType((*PacketIndication)(nil), "openolt.PacketIndication")
	proto.RegisterType((*Interface)(nil), "openolt.Interface")
	proto.RegisterType((*Heartbeat)(nil), "openolt.Heartbeat")
	proto.RegisterType((*Onu)(nil), "openolt.Onu")
	proto.RegisterType((*OmciMsg)(nil), "openolt.OmciMsg")
	proto.RegisterType((*OnuPacket)(nil), "openolt.OnuPacket")
	proto.RegisterType((*UplinkPacket)(nil), "openolt.UplinkPacket")
	proto.RegisterType((*DeviceInfo)(nil), "openolt.DeviceInfo")
	proto.RegisterType((*DeviceInfo_DeviceResourceRanges)(nil), "openolt.DeviceInfo.DeviceResourceRanges")
	proto.RegisterType((*DeviceInfo_DeviceResourceRanges_Pool)(nil), "openolt.DeviceInfo.DeviceResourceRanges.Pool")
	proto.RegisterType((*Classifier)(nil), "openolt.Classifier")
	proto.RegisterType((*ActionCmd)(nil), "openolt.ActionCmd")
	proto.RegisterType((*Action)(nil), "openolt.Action")
	proto.RegisterType((*Flow)(nil), "openolt.Flow")
	proto.RegisterType((*SerialNumber)(nil), "openolt.SerialNumber")
	proto.RegisterType((*PortStatistics)(nil), "openolt.PortStatistics")
	proto.RegisterType((*FlowStatistics)(nil), "openolt.FlowStatistics")
	proto.RegisterType((*LosIndication)(nil), "openolt.LosIndication")
	proto.RegisterType((*DyingGaspIndication)(nil), "openolt.DyingGaspIndication")
	proto.RegisterType((*OnuAlarmIndication)(nil), "openolt.OnuAlarmIndication")
	proto.RegisterType((*OnuStartupFailureIndication)(nil), "openolt.OnuStartupFailureIndication")
	proto.RegisterType((*OnuSignalDegradeIndication)(nil), "openolt.OnuSignalDegradeIndication")
	proto.RegisterType((*OnuDriftOfWindowIndication)(nil), "openolt.OnuDriftOfWindowIndication")
	proto.RegisterType((*OnuLossOfOmciChannelIndication)(nil), "openolt.OnuLossOfOmciChannelIndication")
	proto.RegisterType((*OnuSignalsFailureIndication)(nil), "openolt.OnuSignalsFailureIndication")
	proto.RegisterType((*OnuTransmissionInterferenceWarning)(nil), "openolt.OnuTransmissionInterferenceWarning")
	proto.RegisterType((*OnuActivationFailureIndication)(nil), "openolt.OnuActivationFailureIndication")
	proto.RegisterType((*OnuProcessingErrorIndication)(nil), "openolt.OnuProcessingErrorIndication")
	proto.RegisterType((*Empty)(nil), "openolt.Empty")
}

func init() { proto.RegisterFile("voltha_protos/openolt.proto", fileDescriptor_c072e7aa0dfd74d5) }

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

// OpenoltClient is the client API for Openolt service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type OpenoltClient interface {
	DisableOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	ReenableOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	ActivateOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error)
	DeactivateOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error)
	DeleteOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error)
	OmciMsgOut(ctx context.Context, in *OmciMsg, opts ...grpc.CallOption) (*Empty, error)
	OnuPacketOut(ctx context.Context, in *OnuPacket, opts ...grpc.CallOption) (*Empty, error)
	UplinkPacketOut(ctx context.Context, in *UplinkPacket, opts ...grpc.CallOption) (*Empty, error)
	FlowAdd(ctx context.Context, in *Flow, opts ...grpc.CallOption) (*Empty, error)
	FlowRemove(ctx context.Context, in *Flow, opts ...grpc.CallOption) (*Empty, error)
	HeartbeatCheck(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Heartbeat, error)
	EnablePonIf(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*Empty, error)
	DisablePonIf(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*Empty, error)
	GetDeviceInfo(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DeviceInfo, error)
	Reboot(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	CollectStatistics(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	CreateTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error)
	RemoveTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error)
	CreateTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error)
	RemoveTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error)
	EnableIndication(ctx context.Context, in *Empty, opts ...grpc.CallOption) (Openolt_EnableIndicationClient, error)
}

type openoltClient struct {
	cc *grpc.ClientConn
}

func NewOpenoltClient(cc *grpc.ClientConn) OpenoltClient {
	return &openoltClient{cc}
}

func (c *openoltClient) DisableOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DisableOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) ReenableOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/ReenableOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) ActivateOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/ActivateOnu", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) DeactivateOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DeactivateOnu", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) DeleteOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DeleteOnu", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) OmciMsgOut(ctx context.Context, in *OmciMsg, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/OmciMsgOut", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) OnuPacketOut(ctx context.Context, in *OnuPacket, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/OnuPacketOut", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) UplinkPacketOut(ctx context.Context, in *UplinkPacket, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/UplinkPacketOut", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) FlowAdd(ctx context.Context, in *Flow, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/FlowAdd", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) FlowRemove(ctx context.Context, in *Flow, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/FlowRemove", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) HeartbeatCheck(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Heartbeat, error) {
	out := new(Heartbeat)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/HeartbeatCheck", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) EnablePonIf(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/EnablePonIf", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) DisablePonIf(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DisablePonIf", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetDeviceInfo(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DeviceInfo, error) {
	out := new(DeviceInfo)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetDeviceInfo", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) Reboot(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/Reboot", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) CollectStatistics(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/CollectStatistics", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) CreateTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/CreateTrafficSchedulers", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) RemoveTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/RemoveTrafficSchedulers", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) CreateTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/CreateTrafficQueues", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) RemoveTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/RemoveTrafficQueues", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) EnableIndication(ctx context.Context, in *Empty, opts ...grpc.CallOption) (Openolt_EnableIndicationClient, error) {
	stream, err := c.cc.NewStream(ctx, &_Openolt_serviceDesc.Streams[0], "/openolt.Openolt/EnableIndication", opts...)
	if err != nil {
		return nil, err
	}
	x := &openoltEnableIndicationClient{stream}
	if err := x.ClientStream.SendMsg(in); err != nil {
		return nil, err
	}
	if err := x.ClientStream.CloseSend(); err != nil {
		return nil, err
	}
	return x, nil
}

type Openolt_EnableIndicationClient interface {
	Recv() (*Indication, error)
	grpc.ClientStream
}

type openoltEnableIndicationClient struct {
	grpc.ClientStream
}

func (x *openoltEnableIndicationClient) Recv() (*Indication, error) {
	m := new(Indication)
	if err := x.ClientStream.RecvMsg(m); err != nil {
		return nil, err
	}
	return m, nil
}

// OpenoltServer is the server API for Openolt service.
type OpenoltServer interface {
	DisableOlt(context.Context, *Empty) (*Empty, error)
	ReenableOlt(context.Context, *Empty) (*Empty, error)
	ActivateOnu(context.Context, *Onu) (*Empty, error)
	DeactivateOnu(context.Context, *Onu) (*Empty, error)
	DeleteOnu(context.Context, *Onu) (*Empty, error)
	OmciMsgOut(context.Context, *OmciMsg) (*Empty, error)
	OnuPacketOut(context.Context, *OnuPacket) (*Empty, error)
	UplinkPacketOut(context.Context, *UplinkPacket) (*Empty, error)
	FlowAdd(context.Context, *Flow) (*Empty, error)
	FlowRemove(context.Context, *Flow) (*Empty, error)
	HeartbeatCheck(context.Context, *Empty) (*Heartbeat, error)
	EnablePonIf(context.Context, *Interface) (*Empty, error)
	DisablePonIf(context.Context, *Interface) (*Empty, error)
	GetDeviceInfo(context.Context, *Empty) (*DeviceInfo, error)
	Reboot(context.Context, *Empty) (*Empty, error)
	CollectStatistics(context.Context, *Empty) (*Empty, error)
	CreateTrafficSchedulers(context.Context, *tech_profile.TrafficSchedulers) (*Empty, error)
	RemoveTrafficSchedulers(context.Context, *tech_profile.TrafficSchedulers) (*Empty, error)
	CreateTrafficQueues(context.Context, *tech_profile.TrafficQueues) (*Empty, error)
	RemoveTrafficQueues(context.Context, *tech_profile.TrafficQueues) (*Empty, error)
	EnableIndication(*Empty, Openolt_EnableIndicationServer) error
}

func RegisterOpenoltServer(s *grpc.Server, srv OpenoltServer) {
	s.RegisterService(&_Openolt_serviceDesc, srv)
}

func _Openolt_DisableOlt_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.(OpenoltServer).DisableOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DisableOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DisableOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_ReenableOlt_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.(OpenoltServer).ReenableOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/ReenableOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).ReenableOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_ActivateOnu_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).ActivateOnu(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/ActivateOnu",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).ActivateOnu(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_DeactivateOnu_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).DeactivateOnu(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DeactivateOnu",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DeactivateOnu(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_DeleteOnu_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).DeleteOnu(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DeleteOnu",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DeleteOnu(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_OmciMsgOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(OmciMsg)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).OmciMsgOut(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/OmciMsgOut",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).OmciMsgOut(ctx, req.(*OmciMsg))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_OnuPacketOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(OnuPacket)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).OnuPacketOut(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/OnuPacketOut",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).OnuPacketOut(ctx, req.(*OnuPacket))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_UplinkPacketOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UplinkPacket)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).UplinkPacketOut(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/UplinkPacketOut",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).UplinkPacketOut(ctx, req.(*UplinkPacket))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_FlowAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Flow)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).FlowAdd(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/FlowAdd",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).FlowAdd(ctx, req.(*Flow))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_FlowRemove_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Flow)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).FlowRemove(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/FlowRemove",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).FlowRemove(ctx, req.(*Flow))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_HeartbeatCheck_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.(OpenoltServer).HeartbeatCheck(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/HeartbeatCheck",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).HeartbeatCheck(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_EnablePonIf_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Interface)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).EnablePonIf(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/EnablePonIf",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).EnablePonIf(ctx, req.(*Interface))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_DisablePonIf_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Interface)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).DisablePonIf(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DisablePonIf",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DisablePonIf(ctx, req.(*Interface))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetDeviceInfo_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.(OpenoltServer).GetDeviceInfo(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetDeviceInfo",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetDeviceInfo(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_Reboot_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.(OpenoltServer).Reboot(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/Reboot",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).Reboot(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_CollectStatistics_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.(OpenoltServer).CollectStatistics(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/CollectStatistics",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).CollectStatistics(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_CreateTrafficSchedulers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(tech_profile.TrafficSchedulers)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).CreateTrafficSchedulers(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/CreateTrafficSchedulers",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).CreateTrafficSchedulers(ctx, req.(*tech_profile.TrafficSchedulers))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_RemoveTrafficSchedulers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(tech_profile.TrafficSchedulers)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).RemoveTrafficSchedulers(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/RemoveTrafficSchedulers",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).RemoveTrafficSchedulers(ctx, req.(*tech_profile.TrafficSchedulers))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_CreateTrafficQueues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(tech_profile.TrafficQueues)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).CreateTrafficQueues(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/CreateTrafficQueues",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).CreateTrafficQueues(ctx, req.(*tech_profile.TrafficQueues))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_RemoveTrafficQueues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(tech_profile.TrafficQueues)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).RemoveTrafficQueues(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/RemoveTrafficQueues",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).RemoveTrafficQueues(ctx, req.(*tech_profile.TrafficQueues))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_EnableIndication_Handler(srv interface{}, stream grpc.ServerStream) error {
	m := new(Empty)
	if err := stream.RecvMsg(m); err != nil {
		return err
	}
	return srv.(OpenoltServer).EnableIndication(m, &openoltEnableIndicationServer{stream})
}

type Openolt_EnableIndicationServer interface {
	Send(*Indication) error
	grpc.ServerStream
}

type openoltEnableIndicationServer struct {
	grpc.ServerStream
}

func (x *openoltEnableIndicationServer) Send(m *Indication) error {
	return x.ServerStream.SendMsg(m)
}

var _Openolt_serviceDesc = grpc.ServiceDesc{
	ServiceName: "openolt.Openolt",
	HandlerType: (*OpenoltServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "DisableOlt",
			Handler:    _Openolt_DisableOlt_Handler,
		},
		{
			MethodName: "ReenableOlt",
			Handler:    _Openolt_ReenableOlt_Handler,
		},
		{
			MethodName: "ActivateOnu",
			Handler:    _Openolt_ActivateOnu_Handler,
		},
		{
			MethodName: "DeactivateOnu",
			Handler:    _Openolt_DeactivateOnu_Handler,
		},
		{
			MethodName: "DeleteOnu",
			Handler:    _Openolt_DeleteOnu_Handler,
		},
		{
			MethodName: "OmciMsgOut",
			Handler:    _Openolt_OmciMsgOut_Handler,
		},
		{
			MethodName: "OnuPacketOut",
			Handler:    _Openolt_OnuPacketOut_Handler,
		},
		{
			MethodName: "UplinkPacketOut",
			Handler:    _Openolt_UplinkPacketOut_Handler,
		},
		{
			MethodName: "FlowAdd",
			Handler:    _Openolt_FlowAdd_Handler,
		},
		{
			MethodName: "FlowRemove",
			Handler:    _Openolt_FlowRemove_Handler,
		},
		{
			MethodName: "HeartbeatCheck",
			Handler:    _Openolt_HeartbeatCheck_Handler,
		},
		{
			MethodName: "EnablePonIf",
			Handler:    _Openolt_EnablePonIf_Handler,
		},
		{
			MethodName: "DisablePonIf",
			Handler:    _Openolt_DisablePonIf_Handler,
		},
		{
			MethodName: "GetDeviceInfo",
			Handler:    _Openolt_GetDeviceInfo_Handler,
		},
		{
			MethodName: "Reboot",
			Handler:    _Openolt_Reboot_Handler,
		},
		{
			MethodName: "CollectStatistics",
			Handler:    _Openolt_CollectStatistics_Handler,
		},
		{
			MethodName: "CreateTrafficSchedulers",
			Handler:    _Openolt_CreateTrafficSchedulers_Handler,
		},
		{
			MethodName: "RemoveTrafficSchedulers",
			Handler:    _Openolt_RemoveTrafficSchedulers_Handler,
		},
		{
			MethodName: "CreateTrafficQueues",
			Handler:    _Openolt_CreateTrafficQueues_Handler,
		},
		{
			MethodName: "RemoveTrafficQueues",
			Handler:    _Openolt_RemoveTrafficQueues_Handler,
		},
	},
	Streams: []grpc.StreamDesc{
		{
			StreamName:    "EnableIndication",
			Handler:       _Openolt_EnableIndication_Handler,
			ServerStreams: true,
		},
	},
	Metadata: "voltha_protos/openolt.proto",
}
