diff --git a/go/openolt/openolt.pb.go b/go/openolt/openolt.pb.go
index 106ca11..dd16a41 100644
--- a/go/openolt/openolt.pb.go
+++ b/go/openolt/openolt.pb.go
@@ -1,33 +1,44 @@
+// Copyright 2018-2024 Open Networking Foundation (ONF) and the ONF Contributors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at:
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 // Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.36.11
+// 	protoc        v4.25.8
 // source: voltha_protos/openolt.proto
 
 package openolt
 
 import (
-	context "context"
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
 	common "github.com/opencord/voltha-protos/v5/go/common"
 	config "github.com/opencord/voltha-protos/v5/go/ext/config"
 	extension "github.com/opencord/voltha-protos/v5/go/extension"
 	tech_profile "github.com/opencord/voltha-protos/v5/go/tech_profile"
 	_ "google.golang.org/genproto/googleapis/api/annotations"
-	grpc "google.golang.org/grpc"
-	codes "google.golang.org/grpc/codes"
-	status "google.golang.org/grpc/status"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+	unsafe "unsafe"
 )
 
-// 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
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
 type AlarmState int32
 
@@ -36,60 +47,102 @@
 	AlarmState_ON  AlarmState = 1
 )
 
-var AlarmState_name = map[int32]string{
-	0: "OFF",
-	1: "ON",
-}
+// Enum value maps for AlarmState.
+var (
+	AlarmState_name = map[int32]string{
+		0: "OFF",
+		1: "ON",
+	}
+	AlarmState_value = map[string]int32{
+		"OFF": 0,
+		"ON":  1,
+	}
+)
 
-var AlarmState_value = map[string]int32{
-	"OFF": 0,
-	"ON":  1,
+func (x AlarmState) Enum() *AlarmState {
+	p := new(AlarmState)
+	*p = x
+	return p
 }
 
 func (x AlarmState) String() string {
-	return proto.EnumName(AlarmState_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (AlarmState) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_openolt_proto_enumTypes[0].Descriptor()
+}
+
+func (AlarmState) Type() protoreflect.EnumType {
+	return &file_voltha_protos_openolt_proto_enumTypes[0]
+}
+
+func (x AlarmState) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use AlarmState.Descriptor instead.
 func (AlarmState) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{0}
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{0}
 }
 
-//* activation fail reason.
+// * activation fail reason.
 type OnuIndication_ActivationFailReason int32
 
 const (
 	OnuIndication_ONU_ACTIVATION_FAIL_REASON_NONE                    OnuIndication_ActivationFailReason = 0
-	OnuIndication_ONU_ACTIVATION_FAIL_REASON_RANGING                 OnuIndication_ActivationFailReason = 1
-	OnuIndication_ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION OnuIndication_ActivationFailReason = 2
-	OnuIndication_ONU_ACTIVATION_FAIL_REASON_LOS                     OnuIndication_ActivationFailReason = 3
-	OnuIndication_ONU_ACTIVATION_FAIL_ONU_ALARM                      OnuIndication_ActivationFailReason = 4
-	OnuIndication_ONU_ACTIVATION_FAIL_SWITCH_OVER                    OnuIndication_ActivationFailReason = 5
+	OnuIndication_ONU_ACTIVATION_FAIL_REASON_RANGING                 OnuIndication_ActivationFailReason = 1 //Ranging Failure
+	OnuIndication_ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION OnuIndication_ActivationFailReason = 2 //Password authentication
+	OnuIndication_ONU_ACTIVATION_FAIL_REASON_LOS                     OnuIndication_ActivationFailReason = 3 //LOS
+	OnuIndication_ONU_ACTIVATION_FAIL_ONU_ALARM                      OnuIndication_ActivationFailReason = 4 // ONU Alarm
+	OnuIndication_ONU_ACTIVATION_FAIL_SWITCH_OVER                    OnuIndication_ActivationFailReason = 5 //protection switch over
 )
 
-var OnuIndication_ActivationFailReason_name = map[int32]string{
-	0: "ONU_ACTIVATION_FAIL_REASON_NONE",
-	1: "ONU_ACTIVATION_FAIL_REASON_RANGING",
-	2: "ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION",
-	3: "ONU_ACTIVATION_FAIL_REASON_LOS",
-	4: "ONU_ACTIVATION_FAIL_ONU_ALARM",
-	5: "ONU_ACTIVATION_FAIL_SWITCH_OVER",
-}
+// Enum value maps for OnuIndication_ActivationFailReason.
+var (
+	OnuIndication_ActivationFailReason_name = map[int32]string{
+		0: "ONU_ACTIVATION_FAIL_REASON_NONE",
+		1: "ONU_ACTIVATION_FAIL_REASON_RANGING",
+		2: "ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION",
+		3: "ONU_ACTIVATION_FAIL_REASON_LOS",
+		4: "ONU_ACTIVATION_FAIL_ONU_ALARM",
+		5: "ONU_ACTIVATION_FAIL_SWITCH_OVER",
+	}
+	OnuIndication_ActivationFailReason_value = map[string]int32{
+		"ONU_ACTIVATION_FAIL_REASON_NONE":                    0,
+		"ONU_ACTIVATION_FAIL_REASON_RANGING":                 1,
+		"ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION": 2,
+		"ONU_ACTIVATION_FAIL_REASON_LOS":                     3,
+		"ONU_ACTIVATION_FAIL_ONU_ALARM":                      4,
+		"ONU_ACTIVATION_FAIL_SWITCH_OVER":                    5,
+	}
+)
 
-var OnuIndication_ActivationFailReason_value = map[string]int32{
-	"ONU_ACTIVATION_FAIL_REASON_NONE":                    0,
-	"ONU_ACTIVATION_FAIL_REASON_RANGING":                 1,
-	"ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION": 2,
-	"ONU_ACTIVATION_FAIL_REASON_LOS":                     3,
-	"ONU_ACTIVATION_FAIL_ONU_ALARM":                      4,
-	"ONU_ACTIVATION_FAIL_SWITCH_OVER":                    5,
+func (x OnuIndication_ActivationFailReason) Enum() *OnuIndication_ActivationFailReason {
+	p := new(OnuIndication_ActivationFailReason)
+	*p = x
+	return p
 }
 
 func (x OnuIndication_ActivationFailReason) String() string {
-	return proto.EnumName(OnuIndication_ActivationFailReason_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (OnuIndication_ActivationFailReason) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_openolt_proto_enumTypes[1].Descriptor()
+}
+
+func (OnuIndication_ActivationFailReason) Type() protoreflect.EnumType {
+	return &file_voltha_protos_openolt_proto_enumTypes[1]
+}
+
+func (x OnuIndication_ActivationFailReason) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use OnuIndication_ActivationFailReason.Descriptor instead.
 func (OnuIndication_ActivationFailReason) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{5, 0}
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{5, 0}
 }
 
 type IntfOperIndication_PONResourceRanges_Pool_PoolType int32
@@ -101,26 +154,47 @@
 	IntfOperIndication_PONResourceRanges_Pool_FLOW_ID    IntfOperIndication_PONResourceRanges_Pool_PoolType = 3
 )
 
-var IntfOperIndication_PONResourceRanges_Pool_PoolType_name = map[int32]string{
-	0: "ONU_ID",
-	1: "ALLOC_ID",
-	2: "GEMPORT_ID",
-	3: "FLOW_ID",
-}
+// Enum value maps for IntfOperIndication_PONResourceRanges_Pool_PoolType.
+var (
+	IntfOperIndication_PONResourceRanges_Pool_PoolType_name = map[int32]string{
+		0: "ONU_ID",
+		1: "ALLOC_ID",
+		2: "GEMPORT_ID",
+		3: "FLOW_ID",
+	}
+	IntfOperIndication_PONResourceRanges_Pool_PoolType_value = map[string]int32{
+		"ONU_ID":     0,
+		"ALLOC_ID":   1,
+		"GEMPORT_ID": 2,
+		"FLOW_ID":    3,
+	}
+)
 
-var IntfOperIndication_PONResourceRanges_Pool_PoolType_value = map[string]int32{
-	"ONU_ID":     0,
-	"ALLOC_ID":   1,
-	"GEMPORT_ID": 2,
-	"FLOW_ID":    3,
+func (x IntfOperIndication_PONResourceRanges_Pool_PoolType) Enum() *IntfOperIndication_PONResourceRanges_Pool_PoolType {
+	p := new(IntfOperIndication_PONResourceRanges_Pool_PoolType)
+	*p = x
+	return p
 }
 
 func (x IntfOperIndication_PONResourceRanges_Pool_PoolType) String() string {
-	return proto.EnumName(IntfOperIndication_PONResourceRanges_Pool_PoolType_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (IntfOperIndication_PONResourceRanges_Pool_PoolType) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_openolt_proto_enumTypes[2].Descriptor()
+}
+
+func (IntfOperIndication_PONResourceRanges_Pool_PoolType) Type() protoreflect.EnumType {
+	return &file_voltha_protos_openolt_proto_enumTypes[2]
+}
+
+func (x IntfOperIndication_PONResourceRanges_Pool_PoolType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use IntfOperIndication_PONResourceRanges_Pool_PoolType.Descriptor instead.
 func (IntfOperIndication_PONResourceRanges_Pool_PoolType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{8, 0, 0, 0}
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{8, 0, 0, 0}
 }
 
 type DeviceInfo_DeviceResourceRanges_Pool_PoolType int32
@@ -132,54 +206,96 @@
 	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",
-}
+// Enum value maps for DeviceInfo_DeviceResourceRanges_Pool_PoolType.
+var (
+	DeviceInfo_DeviceResourceRanges_Pool_PoolType_name = map[int32]string{
+		0: "ONU_ID",
+		1: "ALLOC_ID",
+		2: "GEMPORT_ID",
+		3: "FLOW_ID",
+	}
+	DeviceInfo_DeviceResourceRanges_Pool_PoolType_value = map[string]int32{
+		"ONU_ID":     0,
+		"ALLOC_ID":   1,
+		"GEMPORT_ID": 2,
+		"FLOW_ID":    3,
+	}
+)
 
-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) Enum() *DeviceInfo_DeviceResourceRanges_Pool_PoolType {
+	p := new(DeviceInfo_DeviceResourceRanges_Pool_PoolType)
+	*p = x
+	return p
 }
 
 func (x DeviceInfo_DeviceResourceRanges_Pool_PoolType) String() string {
-	return proto.EnumName(DeviceInfo_DeviceResourceRanges_Pool_PoolType_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (DeviceInfo_DeviceResourceRanges_Pool_PoolType) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_openolt_proto_enumTypes[3].Descriptor()
+}
+
+func (DeviceInfo_DeviceResourceRanges_Pool_PoolType) Type() protoreflect.EnumType {
+	return &file_voltha_protos_openolt_proto_enumTypes[3]
+}
+
+func (x DeviceInfo_DeviceResourceRanges_Pool_PoolType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use DeviceInfo_DeviceResourceRanges_Pool_PoolType.Descriptor instead.
 func (DeviceInfo_DeviceResourceRanges_Pool_PoolType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{18, 0, 0, 0}
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{18, 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
+	DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH  DeviceInfo_DeviceResourceRanges_Pool_SharingType = 1 // Shared across all interfaces in all technologies in all ranges
+	DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_SAME_TECH DeviceInfo_DeviceResourceRanges_Pool_SharingType = 2 // Shared across all interfaces of the same technology used in this range
 )
 
-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",
-}
+// Enum value maps for DeviceInfo_DeviceResourceRanges_Pool_SharingType.
+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",
+	}
+	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,
+	}
+)
 
-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) Enum() *DeviceInfo_DeviceResourceRanges_Pool_SharingType {
+	p := new(DeviceInfo_DeviceResourceRanges_Pool_SharingType)
+	*p = x
+	return p
 }
 
 func (x DeviceInfo_DeviceResourceRanges_Pool_SharingType) String() string {
-	return proto.EnumName(DeviceInfo_DeviceResourceRanges_Pool_SharingType_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (DeviceInfo_DeviceResourceRanges_Pool_SharingType) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_openolt_proto_enumTypes[4].Descriptor()
+}
+
+func (DeviceInfo_DeviceResourceRanges_Pool_SharingType) Type() protoreflect.EnumType {
+	return &file_voltha_protos_openolt_proto_enumTypes[4]
+}
+
+func (x DeviceInfo_DeviceResourceRanges_Pool_SharingType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use DeviceInfo_DeviceResourceRanges_Pool_SharingType.Descriptor instead.
 func (DeviceInfo_DeviceResourceRanges_Pool_SharingType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{18, 0, 0, 1}
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{18, 0, 0, 1}
 }
 
 type GroupMember_InterfaceType int32
@@ -190,24 +306,45 @@
 	GroupMember_EPON_10G_PATH GroupMember_InterfaceType = 2
 )
 
-var GroupMember_InterfaceType_name = map[int32]string{
-	0: "PON",
-	1: "EPON_1G_PATH",
-	2: "EPON_10G_PATH",
-}
+// Enum value maps for GroupMember_InterfaceType.
+var (
+	GroupMember_InterfaceType_name = map[int32]string{
+		0: "PON",
+		1: "EPON_1G_PATH",
+		2: "EPON_10G_PATH",
+	}
+	GroupMember_InterfaceType_value = map[string]int32{
+		"PON":           0,
+		"EPON_1G_PATH":  1,
+		"EPON_10G_PATH": 2,
+	}
+)
 
-var GroupMember_InterfaceType_value = map[string]int32{
-	"PON":           0,
-	"EPON_1G_PATH":  1,
-	"EPON_10G_PATH": 2,
+func (x GroupMember_InterfaceType) Enum() *GroupMember_InterfaceType {
+	p := new(GroupMember_InterfaceType)
+	*p = x
+	return p
 }
 
 func (x GroupMember_InterfaceType) String() string {
-	return proto.EnumName(GroupMember_InterfaceType_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (GroupMember_InterfaceType) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_openolt_proto_enumTypes[5].Descriptor()
+}
+
+func (GroupMember_InterfaceType) Type() protoreflect.EnumType {
+	return &file_voltha_protos_openolt_proto_enumTypes[5]
+}
+
+func (x GroupMember_InterfaceType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use GroupMember_InterfaceType.Descriptor instead.
 func (GroupMember_InterfaceType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{47, 0}
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{47, 0}
 }
 
 type Group_GroupMembersCommand int32
@@ -218,24 +355,45 @@
 	Group_SET_MEMBERS    Group_GroupMembersCommand = 2
 )
 
-var Group_GroupMembersCommand_name = map[int32]string{
-	0: "ADD_MEMBERS",
-	1: "REMOVE_MEMBERS",
-	2: "SET_MEMBERS",
-}
+// Enum value maps for Group_GroupMembersCommand.
+var (
+	Group_GroupMembersCommand_name = map[int32]string{
+		0: "ADD_MEMBERS",
+		1: "REMOVE_MEMBERS",
+		2: "SET_MEMBERS",
+	}
+	Group_GroupMembersCommand_value = map[string]int32{
+		"ADD_MEMBERS":    0,
+		"REMOVE_MEMBERS": 1,
+		"SET_MEMBERS":    2,
+	}
+)
 
-var Group_GroupMembersCommand_value = map[string]int32{
-	"ADD_MEMBERS":    0,
-	"REMOVE_MEMBERS": 1,
-	"SET_MEMBERS":    2,
+func (x Group_GroupMembersCommand) Enum() *Group_GroupMembersCommand {
+	p := new(Group_GroupMembersCommand)
+	*p = x
+	return p
 }
 
 func (x Group_GroupMembersCommand) String() string {
-	return proto.EnumName(Group_GroupMembersCommand_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (Group_GroupMembersCommand) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_openolt_proto_enumTypes[6].Descriptor()
+}
+
+func (Group_GroupMembersCommand) Type() protoreflect.EnumType {
+	return &file_voltha_protos_openolt_proto_enumTypes[6]
+}
+
+func (x Group_GroupMembersCommand) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Group_GroupMembersCommand.Descriptor instead.
 func (Group_GroupMembersCommand) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{48, 0}
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{48, 0}
 }
 
 type PonRxPowerData_RssiMeasurementFailReason int32
@@ -246,30 +404,50 @@
 	PonRxPowerData_FAIL_REASON_NO_ACCESS    PonRxPowerData_RssiMeasurementFailReason = 2
 )
 
-var PonRxPowerData_RssiMeasurementFailReason_name = map[int32]string{
-	0: "FAIL_REASON_NONE",
-	1: "FAIL_REASON_NO_DELIMITER",
-	2: "FAIL_REASON_NO_ACCESS",
-}
+// Enum value maps for PonRxPowerData_RssiMeasurementFailReason.
+var (
+	PonRxPowerData_RssiMeasurementFailReason_name = map[int32]string{
+		0: "FAIL_REASON_NONE",
+		1: "FAIL_REASON_NO_DELIMITER",
+		2: "FAIL_REASON_NO_ACCESS",
+	}
+	PonRxPowerData_RssiMeasurementFailReason_value = map[string]int32{
+		"FAIL_REASON_NONE":         0,
+		"FAIL_REASON_NO_DELIMITER": 1,
+		"FAIL_REASON_NO_ACCESS":    2,
+	}
+)
 
-var PonRxPowerData_RssiMeasurementFailReason_value = map[string]int32{
-	"FAIL_REASON_NONE":         0,
-	"FAIL_REASON_NO_DELIMITER": 1,
-	"FAIL_REASON_NO_ACCESS":    2,
+func (x PonRxPowerData_RssiMeasurementFailReason) Enum() *PonRxPowerData_RssiMeasurementFailReason {
+	p := new(PonRxPowerData_RssiMeasurementFailReason)
+	*p = x
+	return p
 }
 
 func (x PonRxPowerData_RssiMeasurementFailReason) String() string {
-	return proto.EnumName(PonRxPowerData_RssiMeasurementFailReason_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (PonRxPowerData_RssiMeasurementFailReason) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_openolt_proto_enumTypes[7].Descriptor()
+}
+
+func (PonRxPowerData_RssiMeasurementFailReason) Type() protoreflect.EnumType {
+	return &file_voltha_protos_openolt_proto_enumTypes[7]
+}
+
+func (x PonRxPowerData_RssiMeasurementFailReason) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use PonRxPowerData_RssiMeasurementFailReason.Descriptor instead.
 func (PonRxPowerData_RssiMeasurementFailReason) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{50, 0}
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{50, 0}
 }
 
 type OnuInfo_OnuState int32
 
 const (
-	//
 	// There are other states in BAL for ONU, which voltha is not interested as of now.
 	// UNKNOWN is to be filled for the rest of the states other than NOT_CONFIGURED/ACTIVE/INACTIVE/DISABLED
 	OnuInfo_UNKNOWN        OnuInfo_OnuState = 0
@@ -279,28 +457,49 @@
 	OnuInfo_DISABLED       OnuInfo_OnuState = 4
 )
 
-var OnuInfo_OnuState_name = map[int32]string{
-	0: "UNKNOWN",
-	1: "NOT_CONFIGURED",
-	2: "ACTIVE",
-	3: "INACTIVE",
-	4: "DISABLED",
-}
+// Enum value maps for OnuInfo_OnuState.
+var (
+	OnuInfo_OnuState_name = map[int32]string{
+		0: "UNKNOWN",
+		1: "NOT_CONFIGURED",
+		2: "ACTIVE",
+		3: "INACTIVE",
+		4: "DISABLED",
+	}
+	OnuInfo_OnuState_value = map[string]int32{
+		"UNKNOWN":        0,
+		"NOT_CONFIGURED": 1,
+		"ACTIVE":         2,
+		"INACTIVE":       3,
+		"DISABLED":       4,
+	}
+)
 
-var OnuInfo_OnuState_value = map[string]int32{
-	"UNKNOWN":        0,
-	"NOT_CONFIGURED": 1,
-	"ACTIVE":         2,
-	"INACTIVE":       3,
-	"DISABLED":       4,
+func (x OnuInfo_OnuState) Enum() *OnuInfo_OnuState {
+	p := new(OnuInfo_OnuState)
+	*p = x
+	return p
 }
 
 func (x OnuInfo_OnuState) String() string {
-	return proto.EnumName(OnuInfo_OnuState_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (OnuInfo_OnuState) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_openolt_proto_enumTypes[8].Descriptor()
+}
+
+func (OnuInfo_OnuState) Type() protoreflect.EnumType {
+	return &file_voltha_protos_openolt_proto_enumTypes[8]
+}
+
+func (x OnuInfo_OnuState) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use OnuInfo_OnuState.Descriptor instead.
 func (OnuInfo_OnuState) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{52, 0}
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{52, 0}
 }
 
 type PonIntfInfo_PonIntfState int32
@@ -313,32 +512,55 @@
 	PonIntfInfo_DISABLED       PonIntfInfo_PonIntfState = 4
 )
 
-var PonIntfInfo_PonIntfState_name = map[int32]string{
-	0: "UNKNOWN",
-	1: "ACTIVE_WORKING",
-	2: "ACTIVE_STANDBY",
-	3: "INACTIVE",
-	4: "DISABLED",
-}
+// Enum value maps for PonIntfInfo_PonIntfState.
+var (
+	PonIntfInfo_PonIntfState_name = map[int32]string{
+		0: "UNKNOWN",
+		1: "ACTIVE_WORKING",
+		2: "ACTIVE_STANDBY",
+		3: "INACTIVE",
+		4: "DISABLED",
+	}
+	PonIntfInfo_PonIntfState_value = map[string]int32{
+		"UNKNOWN":        0,
+		"ACTIVE_WORKING": 1,
+		"ACTIVE_STANDBY": 2,
+		"INACTIVE":       3,
+		"DISABLED":       4,
+	}
+)
 
-var PonIntfInfo_PonIntfState_value = map[string]int32{
-	"UNKNOWN":        0,
-	"ACTIVE_WORKING": 1,
-	"ACTIVE_STANDBY": 2,
-	"INACTIVE":       3,
-	"DISABLED":       4,
+func (x PonIntfInfo_PonIntfState) Enum() *PonIntfInfo_PonIntfState {
+	p := new(PonIntfInfo_PonIntfState)
+	*p = x
+	return p
 }
 
 func (x PonIntfInfo_PonIntfState) String() string {
-	return proto.EnumName(PonIntfInfo_PonIntfState_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (PonIntfInfo_PonIntfState) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_openolt_proto_enumTypes[9].Descriptor()
+}
+
+func (PonIntfInfo_PonIntfState) Type() protoreflect.EnumType {
+	return &file_voltha_protos_openolt_proto_enumTypes[9]
+}
+
+func (x PonIntfInfo_PonIntfState) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use PonIntfInfo_PonIntfState.Descriptor instead.
 func (PonIntfInfo_PonIntfState) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{53, 0}
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{53, 0}
 }
 
 type Indication struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Types that are valid to be assigned to Data:
+	//
 	//	*Indication_OltInd
 	//	*Indication_IntfInd
 	//	*Indication_IntfOperInd
@@ -351,36 +573,155 @@
 	//	*Indication_AlarmInd
 	//	*Indication_OnuDisabledInd
 	//	*Indication_OnuEnabledInd
-	Data                 isIndication_Data `protobuf_oneof:"data"`
-	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
-	XXX_unrecognized     []byte            `json:"-"`
-	XXX_sizecache        int32             `json:"-"`
+	Data          isIndication_Data `protobuf_oneof:"data"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *Indication) Reset()         { *m = Indication{} }
-func (m *Indication) String() string { return proto.CompactTextString(m) }
-func (*Indication) ProtoMessage()    {}
+func (x *Indication) Reset() {
+	*x = Indication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *Indication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Indication) ProtoMessage() {}
+
+func (x *Indication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[0]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Indication.ProtoReflect.Descriptor instead.
 func (*Indication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{0}
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []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)
+func (x *Indication) GetData() isIndication_Data {
+	if x != nil {
+		return x.Data
+	}
+	return nil
 }
 
-var xxx_messageInfo_Indication proto.InternalMessageInfo
+func (x *Indication) GetOltInd() *OltIndication {
+	if x != nil {
+		if x, ok := x.Data.(*Indication_OltInd); ok {
+			return x.OltInd
+		}
+	}
+	return nil
+}
+
+func (x *Indication) GetIntfInd() *IntfIndication {
+	if x != nil {
+		if x, ok := x.Data.(*Indication_IntfInd); ok {
+			return x.IntfInd
+		}
+	}
+	return nil
+}
+
+func (x *Indication) GetIntfOperInd() *IntfOperIndication {
+	if x != nil {
+		if x, ok := x.Data.(*Indication_IntfOperInd); ok {
+			return x.IntfOperInd
+		}
+	}
+	return nil
+}
+
+func (x *Indication) GetOnuDiscInd() *OnuDiscIndication {
+	if x != nil {
+		if x, ok := x.Data.(*Indication_OnuDiscInd); ok {
+			return x.OnuDiscInd
+		}
+	}
+	return nil
+}
+
+func (x *Indication) GetOnuInd() *OnuIndication {
+	if x != nil {
+		if x, ok := x.Data.(*Indication_OnuInd); ok {
+			return x.OnuInd
+		}
+	}
+	return nil
+}
+
+func (x *Indication) GetOmciInd() *OmciIndication {
+	if x != nil {
+		if x, ok := x.Data.(*Indication_OmciInd); ok {
+			return x.OmciInd
+		}
+	}
+	return nil
+}
+
+func (x *Indication) GetPktInd() *PacketIndication {
+	if x != nil {
+		if x, ok := x.Data.(*Indication_PktInd); ok {
+			return x.PktInd
+		}
+	}
+	return nil
+}
+
+func (x *Indication) GetPortStats() *common.PortStatistics {
+	if x != nil {
+		if x, ok := x.Data.(*Indication_PortStats); ok {
+			return x.PortStats
+		}
+	}
+	return nil
+}
+
+func (x *Indication) GetFlowStats() *FlowStatistics {
+	if x != nil {
+		if x, ok := x.Data.(*Indication_FlowStats); ok {
+			return x.FlowStats
+		}
+	}
+	return nil
+}
+
+func (x *Indication) GetAlarmInd() *AlarmIndication {
+	if x != nil {
+		if x, ok := x.Data.(*Indication_AlarmInd); ok {
+			return x.AlarmInd
+		}
+	}
+	return nil
+}
+
+func (x *Indication) GetOnuDisabledInd() *OnuDisabledIndication {
+	if x != nil {
+		if x, ok := x.Data.(*Indication_OnuDisabledInd); ok {
+			return x.OnuDisabledInd
+		}
+	}
+	return nil
+}
+
+func (x *Indication) GetOnuEnabledInd() *OnuEnabledIndication {
+	if x != nil {
+		if x, ok := x.Data.(*Indication_OnuEnabledInd); ok {
+			return x.OnuEnabledInd
+		}
+	}
+	return nil
+}
 
 type isIndication_Data interface {
 	isIndication_Data()
@@ -458,117 +799,10 @@
 
 func (*Indication_OnuEnabledInd) 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() *common.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
-}
-
-func (m *Indication) GetOnuDisabledInd() *OnuDisabledIndication {
-	if x, ok := m.GetData().(*Indication_OnuDisabledInd); ok {
-		return x.OnuDisabledInd
-	}
-	return nil
-}
-
-func (m *Indication) GetOnuEnabledInd() *OnuEnabledIndication {
-	if x, ok := m.GetData().(*Indication_OnuEnabledInd); ok {
-		return x.OnuEnabledInd
-	}
-	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),
-		(*Indication_OnuDisabledInd)(nil),
-		(*Indication_OnuEnabledInd)(nil),
-	}
-}
-
 type AlarmIndication struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Types that are valid to be assigned to Data:
+	//
 	//	*AlarmIndication_LosInd
 	//	*AlarmIndication_DyingGaspInd
 	//	*AlarmIndication_OnuAlarmInd
@@ -588,36 +822,218 @@
 	//	*AlarmIndication_OnuPhysicalEquipmentErrorInd
 	//	*AlarmIndication_OnuLossOfAckInd
 	//	*AlarmIndication_OnuDiffReachExceededInd
-	Data                 isAlarmIndication_Data `protobuf_oneof:"data"`
-	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
-	XXX_unrecognized     []byte                 `json:"-"`
-	XXX_sizecache        int32                  `json:"-"`
+	Data          isAlarmIndication_Data `protobuf_oneof:"data"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *AlarmIndication) Reset()         { *m = AlarmIndication{} }
-func (m *AlarmIndication) String() string { return proto.CompactTextString(m) }
-func (*AlarmIndication) ProtoMessage()    {}
+func (x *AlarmIndication) Reset() {
+	*x = AlarmIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *AlarmIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AlarmIndication) ProtoMessage() {}
+
+func (x *AlarmIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[1]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use AlarmIndication.ProtoReflect.Descriptor instead.
 func (*AlarmIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{1}
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []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)
+func (x *AlarmIndication) GetData() isAlarmIndication_Data {
+	if x != nil {
+		return x.Data
+	}
+	return nil
 }
 
-var xxx_messageInfo_AlarmIndication proto.InternalMessageInfo
+func (x *AlarmIndication) GetLosInd() *LosIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_LosInd); ok {
+			return x.LosInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetDyingGaspInd() *DyingGaspIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_DyingGaspInd); ok {
+			return x.DyingGaspInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuAlarmInd() *OnuAlarmIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuAlarmInd); ok {
+			return x.OnuAlarmInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuStartupFailInd() *OnuStartupFailureIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuStartupFailInd); ok {
+			return x.OnuStartupFailInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuSignalDegradeInd() *OnuSignalDegradeIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuSignalDegradeInd); ok {
+			return x.OnuSignalDegradeInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuDriftOfWindowInd() *OnuDriftOfWindowIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuDriftOfWindowInd); ok {
+			return x.OnuDriftOfWindowInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuLossOmciInd() *OnuLossOfOmciChannelIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuLossOmciInd); ok {
+			return x.OnuLossOmciInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuSignalsFailInd() *OnuSignalsFailureIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuSignalsFailInd); ok {
+			return x.OnuSignalsFailInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuTiwiInd() *OnuTransmissionInterferenceWarning {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuTiwiInd); ok {
+			return x.OnuTiwiInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuActivationFailInd() *OnuActivationFailureIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuActivationFailInd); ok {
+			return x.OnuActivationFailInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuProcessingErrorInd() *OnuProcessingErrorIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuProcessingErrorInd); ok {
+			return x.OnuProcessingErrorInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuLossOfSyncFailInd() *OnuLossOfKeySyncFailureIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuLossOfSyncFailInd); ok {
+			return x.OnuLossOfSyncFailInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuItuPonStatsInd() *OnuItuPonStatsIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuItuPonStatsInd); ok {
+			return x.OnuItuPonStatsInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuDeactivationFailureInd() *OnuDeactivationFailureIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuDeactivationFailureInd); ok {
+			return x.OnuDeactivationFailureInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuRemoteDefectInd() *OnuRemoteDefectIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuRemoteDefectInd); ok {
+			return x.OnuRemoteDefectInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuLossGemDelineationInd() *OnuLossOfGEMChannelDelineationIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuLossGemDelineationInd); ok {
+			return x.OnuLossGemDelineationInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuPhysicalEquipmentErrorInd() *OnuPhysicalEquipmentErrorIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuPhysicalEquipmentErrorInd); ok {
+			return x.OnuPhysicalEquipmentErrorInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuLossOfAckInd() *OnuLossOfAcknowledgementIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuLossOfAckInd); ok {
+			return x.OnuLossOfAckInd
+		}
+	}
+	return nil
+}
+
+func (x *AlarmIndication) GetOnuDiffReachExceededInd() *OnuDifferentialReachExceededIndication {
+	if x != nil {
+		if x, ok := x.Data.(*AlarmIndication_OnuDiffReachExceededInd); ok {
+			return x.OnuDiffReachExceededInd
+		}
+	}
+	return nil
+}
 
 type isAlarmIndication_Data interface {
 	isAlarmIndication_Data()
@@ -737,149 +1153,5103 @@
 
 func (*AlarmIndication_OnuDiffReachExceededInd) isAlarmIndication_Data() {}
 
-func (m *AlarmIndication) GetData() isAlarmIndication_Data {
-	if m != nil {
-		return m.Data
+type OltIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	OperState     string                 `protobuf:"bytes,1,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"` // up, down
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OltIndication) Reset() {
+	*x = OltIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OltIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OltIndication) ProtoMessage() {}
+
+func (x *OltIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[2]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OltIndication.ProtoReflect.Descriptor instead.
+func (*OltIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *OltIndication) GetOperState() string {
+	if x != nil {
+		return x.OperState
+	}
+	return ""
+}
+
+type IntfIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"` // up, down
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *IntfIndication) Reset() {
+	*x = IntfIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *IntfIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IntfIndication) ProtoMessage() {}
+
+func (x *IntfIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[3]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IntfIndication.ProtoReflect.Descriptor instead.
+func (*IntfIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *IntfIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *IntfIndication) GetOperState() string {
+	if x != nil {
+		return x.OperState
+	}
+	return ""
+}
+
+type OnuDiscIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuDiscIndication) Reset() {
+	*x = OnuDiscIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuDiscIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuDiscIndication) ProtoMessage() {}
+
+func (x *OnuDiscIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[4]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuDiscIndication.ProtoReflect.Descriptor instead.
+func (*OnuDiscIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *OnuDiscIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuDiscIndication) GetSerialNumber() *SerialNumber {
+	if x != nil {
+		return x.SerialNumber
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetLosInd() *LosIndication {
-	if x, ok := m.GetData().(*AlarmIndication_LosInd); ok {
-		return x.LosInd
+type OnuIndication struct {
+	state         protoimpl.MessageState             `protogen:"open.v1"`
+	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"`    // up, down
+	AdminState    string                             `protobuf:"bytes,5,opt,name=admin_state,json=adminState,proto3" json:"admin_state,omitempty"` // up, down
+	SerialNumber  *SerialNumber                      `protobuf:"bytes,4,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
+	FailReason    OnuIndication_ActivationFailReason `protobuf:"varint,6,opt,name=fail_reason,json=failReason,proto3,enum=openolt.OnuIndication_ActivationFailReason" json:"fail_reason,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuIndication) Reset() {
+	*x = OnuIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuIndication) ProtoMessage() {}
+
+func (x *OnuIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[5]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuIndication.ProtoReflect.Descriptor instead.
+func (*OnuIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *OnuIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuIndication) GetOperState() string {
+	if x != nil {
+		return x.OperState
+	}
+	return ""
+}
+
+func (x *OnuIndication) GetAdminState() string {
+	if x != nil {
+		return x.AdminState
+	}
+	return ""
+}
+
+func (x *OnuIndication) GetSerialNumber() *SerialNumber {
+	if x != nil {
+		return x.SerialNumber
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetDyingGaspInd() *DyingGaspIndication {
-	if x, ok := m.GetData().(*AlarmIndication_DyingGaspInd); ok {
-		return x.DyingGaspInd
+func (x *OnuIndication) GetFailReason() OnuIndication_ActivationFailReason {
+	if x != nil {
+		return x.FailReason
+	}
+	return OnuIndication_ONU_ACTIVATION_FAIL_REASON_NONE
+}
+
+type OnuDisabledIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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,4,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuDisabledIndication) Reset() {
+	*x = OnuDisabledIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuDisabledIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuDisabledIndication) ProtoMessage() {}
+
+func (x *OnuDisabledIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[6]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuDisabledIndication.ProtoReflect.Descriptor instead.
+func (*OnuDisabledIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *OnuDisabledIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuDisabledIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuDisabledIndication) GetSerialNumber() *SerialNumber {
+	if x != nil {
+		return x.SerialNumber
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuAlarmInd() *OnuAlarmIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuAlarmInd); ok {
-		return x.OnuAlarmInd
+type OnuEnabledIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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,4,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuEnabledIndication) Reset() {
+	*x = OnuEnabledIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuEnabledIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuEnabledIndication) ProtoMessage() {}
+
+func (x *OnuEnabledIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[7]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuEnabledIndication.ProtoReflect.Descriptor instead.
+func (*OnuEnabledIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *OnuEnabledIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuEnabledIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuEnabledIndication) GetSerialNumber() *SerialNumber {
+	if x != nil {
+		return x.SerialNumber
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuStartupFailInd() *OnuStartupFailureIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuStartupFailInd); ok {
-		return x.OnuStartupFailInd
+type IntfOperIndication struct {
+	state         protoimpl.MessageState                `protogen:"open.v1"`
+	Type          string                                `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // nni, pon
+	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"` // up, down
+	Speed         uint32                                `protobuf:"fixed32,4,opt,name=speed,proto3" json:"speed,omitempty"`                        // measured in Mbps
+	Technology    string                                `protobuf:"bytes,5,opt,name=technology,proto3" json:"technology,omitempty"`
+	Ranges        *IntfOperIndication_PONResourceRanges `protobuf:"bytes,6,opt,name=ranges,proto3" json:"ranges,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *IntfOperIndication) Reset() {
+	*x = IntfOperIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *IntfOperIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IntfOperIndication) ProtoMessage() {}
+
+func (x *IntfOperIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[8]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IntfOperIndication.ProtoReflect.Descriptor instead.
+func (*IntfOperIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *IntfOperIndication) GetType() string {
+	if x != nil {
+		return x.Type
+	}
+	return ""
+}
+
+func (x *IntfOperIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *IntfOperIndication) GetOperState() string {
+	if x != nil {
+		return x.OperState
+	}
+	return ""
+}
+
+func (x *IntfOperIndication) GetSpeed() uint32 {
+	if x != nil {
+		return x.Speed
+	}
+	return 0
+}
+
+func (x *IntfOperIndication) GetTechnology() string {
+	if x != nil {
+		return x.Technology
+	}
+	return ""
+}
+
+func (x *IntfOperIndication) GetRanges() *IntfOperIndication_PONResourceRanges {
+	if x != nil {
+		return x.Ranges
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuSignalDegradeInd() *OnuSignalDegradeIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuSignalDegradeInd); ok {
-		return x.OnuSignalDegradeInd
+type OmciIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OmciIndication) Reset() {
+	*x = OmciIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OmciIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OmciIndication) ProtoMessage() {}
+
+func (x *OmciIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[9]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OmciIndication.ProtoReflect.Descriptor instead.
+func (*OmciIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *OmciIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OmciIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OmciIndication) GetPkt() []byte {
+	if x != nil {
+		return x.Pkt
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuDriftOfWindowInd() *OnuDriftOfWindowIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuDriftOfWindowInd); ok {
-		return x.OnuDriftOfWindowInd
+type PacketIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	IntfType      string                 `protobuf:"bytes,5,opt,name=intf_type,json=intfType,proto3" json:"intf_type,omitempty"` // nni, pon, unknown
+	IntfId        uint32                 `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
+	OnuId         uint32                 `protobuf:"fixed32,8,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
+	UniId         uint32                 `protobuf:"fixed32,9,opt,name=uni_id,json=uniId,proto3" json:"uni_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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *PacketIndication) Reset() {
+	*x = PacketIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *PacketIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PacketIndication) ProtoMessage() {}
+
+func (x *PacketIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[10]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PacketIndication.ProtoReflect.Descriptor instead.
+func (*PacketIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *PacketIndication) GetIntfType() string {
+	if x != nil {
+		return x.IntfType
+	}
+	return ""
+}
+
+func (x *PacketIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *PacketIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *PacketIndication) GetUniId() uint32 {
+	if x != nil {
+		return x.UniId
+	}
+	return 0
+}
+
+func (x *PacketIndication) GetGemportId() uint32 {
+	if x != nil {
+		return x.GemportId
+	}
+	return 0
+}
+
+func (x *PacketIndication) GetFlowId() uint32 {
+	if x != nil {
+		return x.FlowId
+	}
+	return 0
+}
+
+func (x *PacketIndication) GetPortNo() uint32 {
+	if x != nil {
+		return x.PortNo
+	}
+	return 0
+}
+
+func (x *PacketIndication) GetCookie() uint64 {
+	if x != nil {
+		return x.Cookie
+	}
+	return 0
+}
+
+func (x *PacketIndication) GetPkt() []byte {
+	if x != nil {
+		return x.Pkt
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuLossOmciInd() *OnuLossOfOmciChannelIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuLossOmciInd); ok {
-		return x.OnuLossOmciInd
+type Interface struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	IntfId        uint32                 `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
+	IntfType      uint32                 `protobuf:"fixed32,2,opt,name=intf_type,json=intfType,proto3" json:"intf_type,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *Interface) Reset() {
+	*x = Interface{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *Interface) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interface) ProtoMessage() {}
+
+func (x *Interface) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[11]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Interface.ProtoReflect.Descriptor instead.
+func (*Interface) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *Interface) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *Interface) GetIntfType() uint32 {
+	if x != nil {
+		return x.IntfType
+	}
+	return 0
+}
+
+type Heartbeat struct {
+	state              protoimpl.MessageState `protogen:"open.v1"`
+	HeartbeatSignature uint32                 `protobuf:"fixed32,1,opt,name=heartbeat_signature,json=heartbeatSignature,proto3" json:"heartbeat_signature,omitempty"`
+	unknownFields      protoimpl.UnknownFields
+	sizeCache          protoimpl.SizeCache
+}
+
+func (x *Heartbeat) Reset() {
+	*x = Heartbeat{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *Heartbeat) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Heartbeat) ProtoMessage() {}
+
+func (x *Heartbeat) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[12]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Heartbeat.ProtoReflect.Descriptor instead.
+func (*Heartbeat) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *Heartbeat) GetHeartbeatSignature() uint32 {
+	if x != nil {
+		return x.HeartbeatSignature
+	}
+	return 0
+}
+
+type Onu struct {
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	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"` // peak information rate assigned to onu
+	OmccEncryption bool                   `protobuf:"varint,5,opt,name=omcc_encryption,json=omccEncryption,proto3" json:"omcc_encryption,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
+}
+
+func (x *Onu) Reset() {
+	*x = Onu{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *Onu) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Onu) ProtoMessage() {}
+
+func (x *Onu) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[13]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Onu.ProtoReflect.Descriptor instead.
+func (*Onu) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *Onu) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *Onu) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *Onu) GetSerialNumber() *SerialNumber {
+	if x != nil {
+		return x.SerialNumber
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuSignalsFailInd() *OnuSignalsFailureIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuSignalsFailInd); ok {
-		return x.OnuSignalsFailInd
+func (x *Onu) GetPir() uint32 {
+	if x != nil {
+		return x.Pir
+	}
+	return 0
+}
+
+func (x *Onu) GetOmccEncryption() bool {
+	if x != nil {
+		return x.OmccEncryption
+	}
+	return false
+}
+
+type OnuLogicalDistance struct {
+	state                  protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	LogicalOnuDistanceZero uint32                 `protobuf:"fixed32,3,opt,name=logical_onu_distance_zero,json=logicalOnuDistanceZero,proto3" json:"logical_onu_distance_zero,omitempty"` //0km logical distance
+	LogicalOnuDistance     uint32                 `protobuf:"fixed32,4,opt,name=logical_onu_distance,json=logicalOnuDistance,proto3" json:"logical_onu_distance,omitempty"`
+	unknownFields          protoimpl.UnknownFields
+	sizeCache              protoimpl.SizeCache
+}
+
+func (x *OnuLogicalDistance) Reset() {
+	*x = OnuLogicalDistance{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[14]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuLogicalDistance) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuLogicalDistance) ProtoMessage() {}
+
+func (x *OnuLogicalDistance) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[14]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuLogicalDistance.ProtoReflect.Descriptor instead.
+func (*OnuLogicalDistance) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *OnuLogicalDistance) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuLogicalDistance) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuLogicalDistance) GetLogicalOnuDistanceZero() uint32 {
+	if x != nil {
+		return x.LogicalOnuDistanceZero
+	}
+	return 0
+}
+
+func (x *OnuLogicalDistance) GetLogicalOnuDistance() uint32 {
+	if x != nil {
+		return x.LogicalOnuDistance
+	}
+	return 0
+}
+
+type OmciMsg struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OmciMsg) Reset() {
+	*x = OmciMsg{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[15]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OmciMsg) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OmciMsg) ProtoMessage() {}
+
+func (x *OmciMsg) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[15]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OmciMsg.ProtoReflect.Descriptor instead.
+func (*OmciMsg) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *OmciMsg) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OmciMsg) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OmciMsg) GetPkt() []byte {
+	if x != nil {
+		return x.Pkt
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuTiwiInd() *OnuTransmissionInterferenceWarning {
-	if x, ok := m.GetData().(*AlarmIndication_OnuTiwiInd); ok {
-		return x.OnuTiwiInd
+type OnuPacket struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	AllocId       uint32                 `protobuf:"fixed32,6,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"`
+	Pkt           []byte                 `protobuf:"bytes,3,opt,name=pkt,proto3" json:"pkt,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuPacket) Reset() {
+	*x = OnuPacket{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[16]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuPacket) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuPacket) ProtoMessage() {}
+
+func (x *OnuPacket) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[16]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuPacket.ProtoReflect.Descriptor instead.
+func (*OnuPacket) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *OnuPacket) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuPacket) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuPacket) GetPortNo() uint32 {
+	if x != nil {
+		return x.PortNo
+	}
+	return 0
+}
+
+func (x *OnuPacket) GetGemportId() uint32 {
+	if x != nil {
+		return x.GemportId
+	}
+	return 0
+}
+
+func (x *OnuPacket) GetAllocId() uint32 {
+	if x != nil {
+		return x.AllocId
+	}
+	return 0
+}
+
+func (x *OnuPacket) GetPkt() []byte {
+	if x != nil {
+		return x.Pkt
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuActivationFailInd() *OnuActivationFailureIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuActivationFailInd); ok {
-		return x.OnuActivationFailInd
+type UplinkPacket struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *UplinkPacket) Reset() {
+	*x = UplinkPacket{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[17]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *UplinkPacket) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UplinkPacket) ProtoMessage() {}
+
+func (x *UplinkPacket) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[17]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UplinkPacket.ProtoReflect.Descriptor instead.
+func (*UplinkPacket) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *UplinkPacket) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *UplinkPacket) GetPkt() []byte {
+	if x != nil {
+		return x.Pkt
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuProcessingErrorInd() *OnuProcessingErrorIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuProcessingErrorInd); ok {
-		return x.OnuProcessingErrorInd
+type DeviceInfo struct {
+	state               protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	PreviouslyConnected bool                   `protobuf:"varint,19,opt,name=previously_connected,json=previouslyConnected,proto3" json:"previously_connected,omitempty"` // used to indicate agent reconcile status
+	// 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"`
+	// Total number of nni intf ports on the device
+	NniPorts      uint32                             `protobuf:"fixed32,20,opt,name=nni_ports,json=nniPorts,proto3" json:"nni_ports,omitempty"`
+	Ranges        []*DeviceInfo_DeviceResourceRanges `protobuf:"bytes,15,rep,name=ranges,proto3" json:"ranges,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *DeviceInfo) Reset() {
+	*x = DeviceInfo{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[18]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DeviceInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeviceInfo) ProtoMessage() {}
+
+func (x *DeviceInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[18]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeviceInfo.ProtoReflect.Descriptor instead.
+func (*DeviceInfo) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *DeviceInfo) GetVendor() string {
+	if x != nil {
+		return x.Vendor
+	}
+	return ""
+}
+
+func (x *DeviceInfo) GetModel() string {
+	if x != nil {
+		return x.Model
+	}
+	return ""
+}
+
+func (x *DeviceInfo) GetHardwareVersion() string {
+	if x != nil {
+		return x.HardwareVersion
+	}
+	return ""
+}
+
+func (x *DeviceInfo) GetFirmwareVersion() string {
+	if x != nil {
+		return x.FirmwareVersion
+	}
+	return ""
+}
+
+func (x *DeviceInfo) GetDeviceId() string {
+	if x != nil {
+		return x.DeviceId
+	}
+	return ""
+}
+
+func (x *DeviceInfo) GetDeviceSerialNumber() string {
+	if x != nil {
+		return x.DeviceSerialNumber
+	}
+	return ""
+}
+
+func (x *DeviceInfo) GetPreviouslyConnected() bool {
+	if x != nil {
+		return x.PreviouslyConnected
+	}
+	return false
+}
+
+func (x *DeviceInfo) GetPonPorts() uint32 {
+	if x != nil {
+		return x.PonPorts
+	}
+	return 0
+}
+
+func (x *DeviceInfo) GetNniPorts() uint32 {
+	if x != nil {
+		return x.NniPorts
+	}
+	return 0
+}
+
+func (x *DeviceInfo) GetRanges() []*DeviceInfo_DeviceResourceRanges {
+	if x != nil {
+		return x.Ranges
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuLossOfSyncFailInd() *OnuLossOfKeySyncFailureIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuLossOfSyncFailInd); ok {
-		return x.OnuLossOfSyncFailInd
+type Classifier struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"` // untagged, single_tag, double_tag
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *Classifier) Reset() {
+	*x = Classifier{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[19]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *Classifier) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Classifier) ProtoMessage() {}
+
+func (x *Classifier) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[19]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Classifier.ProtoReflect.Descriptor instead.
+func (*Classifier) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *Classifier) GetOTpid() uint32 {
+	if x != nil {
+		return x.OTpid
+	}
+	return 0
+}
+
+func (x *Classifier) GetOVid() uint32 {
+	if x != nil {
+		return x.OVid
+	}
+	return 0
+}
+
+func (x *Classifier) GetITpid() uint32 {
+	if x != nil {
+		return x.ITpid
+	}
+	return 0
+}
+
+func (x *Classifier) GetIVid() uint32 {
+	if x != nil {
+		return x.IVid
+	}
+	return 0
+}
+
+func (x *Classifier) GetOPbits() uint32 {
+	if x != nil {
+		return x.OPbits
+	}
+	return 0
+}
+
+func (x *Classifier) GetIPbits() uint32 {
+	if x != nil {
+		return x.IPbits
+	}
+	return 0
+}
+
+func (x *Classifier) GetEthType() uint32 {
+	if x != nil {
+		return x.EthType
+	}
+	return 0
+}
+
+func (x *Classifier) GetDstMac() []byte {
+	if x != nil {
+		return x.DstMac
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuItuPonStatsInd() *OnuItuPonStatsIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuItuPonStatsInd); ok {
-		return x.OnuItuPonStatsInd
+func (x *Classifier) GetSrcMac() []byte {
+	if x != nil {
+		return x.SrcMac
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuDeactivationFailureInd() *OnuDeactivationFailureIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuDeactivationFailureInd); ok {
-		return x.OnuDeactivationFailureInd
+func (x *Classifier) GetIpProto() uint32 {
+	if x != nil {
+		return x.IpProto
+	}
+	return 0
+}
+
+func (x *Classifier) GetDstIp() uint32 {
+	if x != nil {
+		return x.DstIp
+	}
+	return 0
+}
+
+func (x *Classifier) GetSrcIp() uint32 {
+	if x != nil {
+		return x.SrcIp
+	}
+	return 0
+}
+
+func (x *Classifier) GetSrcPort() uint32 {
+	if x != nil {
+		return x.SrcPort
+	}
+	return 0
+}
+
+func (x *Classifier) GetDstPort() uint32 {
+	if x != nil {
+		return x.DstPort
+	}
+	return 0
+}
+
+func (x *Classifier) GetPktTagType() string {
+	if x != nil {
+		return x.PktTagType
+	}
+	return ""
+}
+
+type ActionCmd struct {
+	state             protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	RemarkOuterPbits  bool                   `protobuf:"varint,4,opt,name=remark_outer_pbits,json=remarkOuterPbits,proto3" json:"remark_outer_pbits,omitempty"`
+	RemarkInnerPbits  bool                   `protobuf:"varint,5,opt,name=remark_inner_pbits,json=remarkInnerPbits,proto3" json:"remark_inner_pbits,omitempty"`
+	AddInnerTag       bool                   `protobuf:"varint,6,opt,name=add_inner_tag,json=addInnerTag,proto3" json:"add_inner_tag,omitempty"`
+	RemoveInnerTag    bool                   `protobuf:"varint,7,opt,name=remove_inner_tag,json=removeInnerTag,proto3" json:"remove_inner_tag,omitempty"`
+	TranslateInnerTag bool                   `protobuf:"varint,8,opt,name=translate_inner_tag,json=translateInnerTag,proto3" json:"translate_inner_tag,omitempty"`
+	TranslateOuterTag bool                   `protobuf:"varint,9,opt,name=translate_outer_tag,json=translateOuterTag,proto3" json:"translate_outer_tag,omitempty"`
+	unknownFields     protoimpl.UnknownFields
+	sizeCache         protoimpl.SizeCache
+}
+
+func (x *ActionCmd) Reset() {
+	*x = ActionCmd{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[20]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ActionCmd) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ActionCmd) ProtoMessage() {}
+
+func (x *ActionCmd) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[20]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ActionCmd.ProtoReflect.Descriptor instead.
+func (*ActionCmd) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *ActionCmd) GetAddOuterTag() bool {
+	if x != nil {
+		return x.AddOuterTag
+	}
+	return false
+}
+
+func (x *ActionCmd) GetRemoveOuterTag() bool {
+	if x != nil {
+		return x.RemoveOuterTag
+	}
+	return false
+}
+
+func (x *ActionCmd) GetTrapToHost() bool {
+	if x != nil {
+		return x.TrapToHost
+	}
+	return false
+}
+
+func (x *ActionCmd) GetRemarkOuterPbits() bool {
+	if x != nil {
+		return x.RemarkOuterPbits
+	}
+	return false
+}
+
+func (x *ActionCmd) GetRemarkInnerPbits() bool {
+	if x != nil {
+		return x.RemarkInnerPbits
+	}
+	return false
+}
+
+func (x *ActionCmd) GetAddInnerTag() bool {
+	if x != nil {
+		return x.AddInnerTag
+	}
+	return false
+}
+
+func (x *ActionCmd) GetRemoveInnerTag() bool {
+	if x != nil {
+		return x.RemoveInnerTag
+	}
+	return false
+}
+
+func (x *ActionCmd) GetTranslateInnerTag() bool {
+	if x != nil {
+		return x.TranslateInnerTag
+	}
+	return false
+}
+
+func (x *ActionCmd) GetTranslateOuterTag() bool {
+	if x != nil {
+		return x.TranslateOuterTag
+	}
+	return false
+}
+
+type Action struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *Action) Reset() {
+	*x = Action{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[21]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *Action) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Action) ProtoMessage() {}
+
+func (x *Action) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[21]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Action.ProtoReflect.Descriptor instead.
+func (*Action) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *Action) GetCmd() *ActionCmd {
+	if x != nil {
+		return x.Cmd
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuRemoteDefectInd() *OnuRemoteDefectIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuRemoteDefectInd); ok {
-		return x.OnuRemoteDefectInd
+func (x *Action) GetOVid() uint32 {
+	if x != nil {
+		return x.OVid
+	}
+	return 0
+}
+
+func (x *Action) GetOPbits() uint32 {
+	if x != nil {
+		return x.OPbits
+	}
+	return 0
+}
+
+func (x *Action) GetOTpid() uint32 {
+	if x != nil {
+		return x.OTpid
+	}
+	return 0
+}
+
+func (x *Action) GetIVid() uint32 {
+	if x != nil {
+		return x.IVid
+	}
+	return 0
+}
+
+func (x *Action) GetIPbits() uint32 {
+	if x != nil {
+		return x.IPbits
+	}
+	return 0
+}
+
+func (x *Action) GetITpid() uint32 {
+	if x != nil {
+		return x.ITpid
+	}
+	return 0
+}
+
+type Flow struct {
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	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          uint64                 `protobuf:"fixed64,3,opt,name=flow_id,json=flowId,proto3" json:"flow_id,omitempty"`                               // voltha flow-id. 0 is not a valid flow_id
+	SymmetricFlowId uint64                 `protobuf:"fixed64,18,opt,name=symmetric_flow_id,json=symmetricFlowId,proto3" json:"symmetric_flow_id,omitempty"` // symmetric voltha flow-id, if applicable. All data path flows generally have a symmetric flow,
+	FlowType        string                 `protobuf:"bytes,4,opt,name=flow_type,json=flowType,proto3" json:"flow_type,omitempty"`                           // upstream, downstream, broadcast, multicast
+	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"` // When 'replicate_flow' field is true, this field is obsolete.
+	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"`               // must be provided for any flow with trap_to_host action. Returned in PacketIndication
+	PortNo          uint32                 `protobuf:"fixed32,13,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"` // must be provided for any flow with trap_to_host action. Returned in PacketIndication
+	GroupId         uint32                 `protobuf:"fixed32,14,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
+	TechProfileId   uint32                 `protobuf:"fixed32,15,opt,name=tech_profile_id,json=techProfileId,proto3" json:"tech_profile_id,omitempty"`
+	ReplicateFlow   bool                   `protobuf:"varint,16,opt,name=replicate_flow,json=replicateFlow,proto3" json:"replicate_flow,omitempty"`                                                                                // When this field is true, use pbitToGemPortID to know which p-bit needs to be classfied to which gem port.
+	PbitToGemport   map[uint32]uint32      `protobuf:"bytes,17,rep,name=pbit_to_gemport,json=pbitToGemport,proto3" json:"pbit_to_gemport,omitempty" protobuf_key:"fixed32,1,opt,name=key" protobuf_val:"fixed32,2,opt,name=value"` // Map of p-bit to gem port ID
+	GemportToAes    map[uint32]bool        `protobuf:"bytes,19,rep,name=gemport_to_aes,json=gemportToAes,proto3" json:"gemport_to_aes,omitempty" protobuf_key:"fixed32,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`     // Map of gem port ID to aes encryption
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *Flow) Reset() {
+	*x = Flow{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[22]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *Flow) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Flow) ProtoMessage() {}
+
+func (x *Flow) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[22]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Flow.ProtoReflect.Descriptor instead.
+func (*Flow) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *Flow) GetAccessIntfId() int32 {
+	if x != nil {
+		return x.AccessIntfId
+	}
+	return 0
+}
+
+func (x *Flow) GetOnuId() int32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *Flow) GetUniId() int32 {
+	if x != nil {
+		return x.UniId
+	}
+	return 0
+}
+
+func (x *Flow) GetFlowId() uint64 {
+	if x != nil {
+		return x.FlowId
+	}
+	return 0
+}
+
+func (x *Flow) GetSymmetricFlowId() uint64 {
+	if x != nil {
+		return x.SymmetricFlowId
+	}
+	return 0
+}
+
+func (x *Flow) GetFlowType() string {
+	if x != nil {
+		return x.FlowType
+	}
+	return ""
+}
+
+func (x *Flow) GetAllocId() int32 {
+	if x != nil {
+		return x.AllocId
+	}
+	return 0
+}
+
+func (x *Flow) GetNetworkIntfId() int32 {
+	if x != nil {
+		return x.NetworkIntfId
+	}
+	return 0
+}
+
+func (x *Flow) GetGemportId() int32 {
+	if x != nil {
+		return x.GemportId
+	}
+	return 0
+}
+
+func (x *Flow) GetClassifier() *Classifier {
+	if x != nil {
+		return x.Classifier
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuLossGemDelineationInd() *OnuLossOfGEMChannelDelineationIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuLossGemDelineationInd); ok {
-		return x.OnuLossGemDelineationInd
+func (x *Flow) GetAction() *Action {
+	if x != nil {
+		return x.Action
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuPhysicalEquipmentErrorInd() *OnuPhysicalEquipmentErrorIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuPhysicalEquipmentErrorInd); ok {
-		return x.OnuPhysicalEquipmentErrorInd
+func (x *Flow) GetPriority() int32 {
+	if x != nil {
+		return x.Priority
+	}
+	return 0
+}
+
+func (x *Flow) GetCookie() uint64 {
+	if x != nil {
+		return x.Cookie
+	}
+	return 0
+}
+
+func (x *Flow) GetPortNo() uint32 {
+	if x != nil {
+		return x.PortNo
+	}
+	return 0
+}
+
+func (x *Flow) GetGroupId() uint32 {
+	if x != nil {
+		return x.GroupId
+	}
+	return 0
+}
+
+func (x *Flow) GetTechProfileId() uint32 {
+	if x != nil {
+		return x.TechProfileId
+	}
+	return 0
+}
+
+func (x *Flow) GetReplicateFlow() bool {
+	if x != nil {
+		return x.ReplicateFlow
+	}
+	return false
+}
+
+func (x *Flow) GetPbitToGemport() map[uint32]uint32 {
+	if x != nil {
+		return x.PbitToGemport
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuLossOfAckInd() *OnuLossOfAcknowledgementIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuLossOfAckInd); ok {
-		return x.OnuLossOfAckInd
+func (x *Flow) GetGemportToAes() map[uint32]bool {
+	if x != nil {
+		return x.GemportToAes
 	}
 	return nil
 }
 
-func (m *AlarmIndication) GetOnuDiffReachExceededInd() *OnuDifferentialReachExceededIndication {
-	if x, ok := m.GetData().(*AlarmIndication_OnuDiffReachExceededInd); ok {
-		return x.OnuDiffReachExceededInd
+type SerialNumber struct {
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
+}
+
+func (x *SerialNumber) Reset() {
+	*x = SerialNumber{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[23]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SerialNumber) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SerialNumber) ProtoMessage() {}
+
+func (x *SerialNumber) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[23]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SerialNumber.ProtoReflect.Descriptor instead.
+func (*SerialNumber) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *SerialNumber) GetVendorId() []byte {
+	if x != nil {
+		return x.VendorId
 	}
 	return nil
 }
 
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*AlarmIndication) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
+func (x *SerialNumber) GetVendorSpecific() []byte {
+	if x != nil {
+		return x.VendorSpecific
+	}
+	return nil
+}
+
+type OnuStatistics struct {
+	state                     protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	PositiveDrift             uint64                 `protobuf:"fixed64,3,opt,name=positive_drift,json=positiveDrift,proto3" json:"positive_drift,omitempty"`
+	NegativeDrift             uint64                 `protobuf:"fixed64,4,opt,name=negative_drift,json=negativeDrift,proto3" json:"negative_drift,omitempty"`
+	DelimiterMissDetection    uint64                 `protobuf:"fixed64,5,opt,name=delimiter_miss_detection,json=delimiterMissDetection,proto3" json:"delimiter_miss_detection,omitempty"`
+	BipErrors                 uint64                 `protobuf:"fixed64,6,opt,name=bip_errors,json=bipErrors,proto3" json:"bip_errors,omitempty"`
+	BipUnits                  uint64                 `protobuf:"fixed64,7,opt,name=bip_units,json=bipUnits,proto3" json:"bip_units,omitempty"`
+	FecCorrectedSymbols       uint64                 `protobuf:"fixed64,8,opt,name=fec_corrected_symbols,json=fecCorrectedSymbols,proto3" json:"fec_corrected_symbols,omitempty"`
+	FecCodewordsCorrected     uint64                 `protobuf:"fixed64,9,opt,name=fec_codewords_corrected,json=fecCodewordsCorrected,proto3" json:"fec_codewords_corrected,omitempty"`
+	FecCodewordsUncorrectable uint64                 `protobuf:"fixed64,10,opt,name=fec_codewords_uncorrectable,json=fecCodewordsUncorrectable,proto3" json:"fec_codewords_uncorrectable,omitempty"`
+	FecCodewords              uint64                 `protobuf:"fixed64,11,opt,name=fec_codewords,json=fecCodewords,proto3" json:"fec_codewords,omitempty"`
+	FecCorrectedUnits         uint64                 `protobuf:"fixed64,12,opt,name=fec_corrected_units,json=fecCorrectedUnits,proto3" json:"fec_corrected_units,omitempty"`
+	XgemKeyErrors             uint64                 `protobuf:"fixed64,13,opt,name=xgem_key_errors,json=xgemKeyErrors,proto3" json:"xgem_key_errors,omitempty"`
+	XgemLoss                  uint64                 `protobuf:"fixed64,14,opt,name=xgem_loss,json=xgemLoss,proto3" json:"xgem_loss,omitempty"`
+	RxPloamsError             uint64                 `protobuf:"fixed64,15,opt,name=rx_ploams_error,json=rxPloamsError,proto3" json:"rx_ploams_error,omitempty"`
+	RxPloamsNonIdle           uint64                 `protobuf:"fixed64,16,opt,name=rx_ploams_non_idle,json=rxPloamsNonIdle,proto3" json:"rx_ploams_non_idle,omitempty"`
+	RxOmci                    uint64                 `protobuf:"fixed64,17,opt,name=rx_omci,json=rxOmci,proto3" json:"rx_omci,omitempty"`
+	RxOmciPacketsCrcError     uint64                 `protobuf:"fixed64,18,opt,name=rx_omci_packets_crc_error,json=rxOmciPacketsCrcError,proto3" json:"rx_omci_packets_crc_error,omitempty"`
+	RxBytes                   uint64                 `protobuf:"fixed64,19,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
+	RxPackets                 uint64                 `protobuf:"fixed64,20,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
+	TxBytes                   uint64                 `protobuf:"fixed64,21,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
+	TxPackets                 uint64                 `protobuf:"fixed64,22,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
+	BerReported               uint64                 `protobuf:"fixed64,23,opt,name=ber_reported,json=berReported,proto3" json:"ber_reported,omitempty"`
+	LcdgErrors                uint64                 `protobuf:"fixed64,24,opt,name=lcdg_errors,json=lcdgErrors,proto3" json:"lcdg_errors,omitempty"`
+	RdiErrors                 uint64                 `protobuf:"fixed64,25,opt,name=rdi_errors,json=rdiErrors,proto3" json:"rdi_errors,omitempty"`
+	Timestamp                 uint32                 `protobuf:"fixed32,26,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	unknownFields             protoimpl.UnknownFields
+	sizeCache                 protoimpl.SizeCache
+}
+
+func (x *OnuStatistics) Reset() {
+	*x = OnuStatistics{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[24]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuStatistics) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuStatistics) ProtoMessage() {}
+
+func (x *OnuStatistics) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[24]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuStatistics.ProtoReflect.Descriptor instead.
+func (*OnuStatistics) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *OnuStatistics) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetPositiveDrift() uint64 {
+	if x != nil {
+		return x.PositiveDrift
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetNegativeDrift() uint64 {
+	if x != nil {
+		return x.NegativeDrift
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetDelimiterMissDetection() uint64 {
+	if x != nil {
+		return x.DelimiterMissDetection
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetBipErrors() uint64 {
+	if x != nil {
+		return x.BipErrors
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetBipUnits() uint64 {
+	if x != nil {
+		return x.BipUnits
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetFecCorrectedSymbols() uint64 {
+	if x != nil {
+		return x.FecCorrectedSymbols
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetFecCodewordsCorrected() uint64 {
+	if x != nil {
+		return x.FecCodewordsCorrected
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetFecCodewordsUncorrectable() uint64 {
+	if x != nil {
+		return x.FecCodewordsUncorrectable
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetFecCodewords() uint64 {
+	if x != nil {
+		return x.FecCodewords
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetFecCorrectedUnits() uint64 {
+	if x != nil {
+		return x.FecCorrectedUnits
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetXgemKeyErrors() uint64 {
+	if x != nil {
+		return x.XgemKeyErrors
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetXgemLoss() uint64 {
+	if x != nil {
+		return x.XgemLoss
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetRxPloamsError() uint64 {
+	if x != nil {
+		return x.RxPloamsError
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetRxPloamsNonIdle() uint64 {
+	if x != nil {
+		return x.RxPloamsNonIdle
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetRxOmci() uint64 {
+	if x != nil {
+		return x.RxOmci
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetRxOmciPacketsCrcError() uint64 {
+	if x != nil {
+		return x.RxOmciPacketsCrcError
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetRxBytes() uint64 {
+	if x != nil {
+		return x.RxBytes
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetRxPackets() uint64 {
+	if x != nil {
+		return x.RxPackets
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetTxBytes() uint64 {
+	if x != nil {
+		return x.TxBytes
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetTxPackets() uint64 {
+	if x != nil {
+		return x.TxPackets
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetBerReported() uint64 {
+	if x != nil {
+		return x.BerReported
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetLcdgErrors() uint64 {
+	if x != nil {
+		return x.LcdgErrors
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetRdiErrors() uint64 {
+	if x != nil {
+		return x.RdiErrors
+	}
+	return 0
+}
+
+func (x *OnuStatistics) GetTimestamp() uint32 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+type GemPortStatistics struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	RxPackets     uint64                 `protobuf:"fixed64,3,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
+	RxBytes       uint64                 `protobuf:"fixed64,4,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
+	TxPackets     uint64                 `protobuf:"fixed64,5,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
+	TxBytes       uint64                 `protobuf:"fixed64,6,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
+	Timestamp     uint32                 `protobuf:"fixed32,26,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *GemPortStatistics) Reset() {
+	*x = GemPortStatistics{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[25]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GemPortStatistics) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GemPortStatistics) ProtoMessage() {}
+
+func (x *GemPortStatistics) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[25]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GemPortStatistics.ProtoReflect.Descriptor instead.
+func (*GemPortStatistics) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *GemPortStatistics) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *GemPortStatistics) GetGemportId() uint32 {
+	if x != nil {
+		return x.GemportId
+	}
+	return 0
+}
+
+func (x *GemPortStatistics) GetRxPackets() uint64 {
+	if x != nil {
+		return x.RxPackets
+	}
+	return 0
+}
+
+func (x *GemPortStatistics) GetRxBytes() uint64 {
+	if x != nil {
+		return x.RxBytes
+	}
+	return 0
+}
+
+func (x *GemPortStatistics) GetTxPackets() uint64 {
+	if x != nil {
+		return x.TxPackets
+	}
+	return 0
+}
+
+func (x *GemPortStatistics) GetTxBytes() uint64 {
+	if x != nil {
+		return x.TxBytes
+	}
+	return 0
+}
+
+func (x *GemPortStatistics) GetTimestamp() uint32 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+type FlowStatistics struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *FlowStatistics) Reset() {
+	*x = FlowStatistics{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[26]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *FlowStatistics) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FlowStatistics) ProtoMessage() {}
+
+func (x *FlowStatistics) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[26]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use FlowStatistics.ProtoReflect.Descriptor instead.
+func (*FlowStatistics) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *FlowStatistics) GetFlowId() uint32 {
+	if x != nil {
+		return x.FlowId
+	}
+	return 0
+}
+
+func (x *FlowStatistics) GetRxBytes() uint64 {
+	if x != nil {
+		return x.RxBytes
+	}
+	return 0
+}
+
+func (x *FlowStatistics) GetRxPackets() uint64 {
+	if x != nil {
+		return x.RxPackets
+	}
+	return 0
+}
+
+func (x *FlowStatistics) GetTxBytes() uint64 {
+	if x != nil {
+		return x.TxBytes
+	}
+	return 0
+}
+
+func (x *FlowStatistics) GetTxPackets() uint64 {
+	if x != nil {
+		return x.TxPackets
+	}
+	return 0
+}
+
+func (x *FlowStatistics) GetTimestamp() uint32 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+type LosIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *LosIndication) Reset() {
+	*x = LosIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[27]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *LosIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LosIndication) ProtoMessage() {}
+
+func (x *LosIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[27]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LosIndication.ProtoReflect.Descriptor instead.
+func (*LosIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *LosIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *LosIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+type DyingGaspIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *DyingGaspIndication) Reset() {
+	*x = DyingGaspIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[28]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DyingGaspIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DyingGaspIndication) ProtoMessage() {}
+
+func (x *DyingGaspIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[28]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DyingGaspIndication.ProtoReflect.Descriptor instead.
+func (*DyingGaspIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *DyingGaspIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *DyingGaspIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *DyingGaspIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+type OnuAlarmIndication struct {
+	state              protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	LofiStatus         string                 `protobuf:"bytes,7,opt,name=lofi_status,json=lofiStatus,proto3" json:"lofi_status,omitempty"`
+	LoamiStatus        string                 `protobuf:"bytes,8,opt,name=loami_status,json=loamiStatus,proto3" json:"loami_status,omitempty"`
+	unknownFields      protoimpl.UnknownFields
+	sizeCache          protoimpl.SizeCache
+}
+
+func (x *OnuAlarmIndication) Reset() {
+	*x = OnuAlarmIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[29]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuAlarmIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuAlarmIndication) ProtoMessage() {}
+
+func (x *OnuAlarmIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[29]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuAlarmIndication.ProtoReflect.Descriptor instead.
+func (*OnuAlarmIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *OnuAlarmIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuAlarmIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuAlarmIndication) GetLosStatus() string {
+	if x != nil {
+		return x.LosStatus
+	}
+	return ""
+}
+
+func (x *OnuAlarmIndication) GetLobStatus() string {
+	if x != nil {
+		return x.LobStatus
+	}
+	return ""
+}
+
+func (x *OnuAlarmIndication) GetLopcMissStatus() string {
+	if x != nil {
+		return x.LopcMissStatus
+	}
+	return ""
+}
+
+func (x *OnuAlarmIndication) GetLopcMicErrorStatus() string {
+	if x != nil {
+		return x.LopcMicErrorStatus
+	}
+	return ""
+}
+
+func (x *OnuAlarmIndication) GetLofiStatus() string {
+	if x != nil {
+		return x.LofiStatus
+	}
+	return ""
+}
+
+func (x *OnuAlarmIndication) GetLoamiStatus() string {
+	if x != nil {
+		return x.LoamiStatus
+	}
+	return ""
+}
+
+type OnuStartupFailureIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuStartupFailureIndication) Reset() {
+	*x = OnuStartupFailureIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[30]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuStartupFailureIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuStartupFailureIndication) ProtoMessage() {}
+
+func (x *OnuStartupFailureIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[30]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuStartupFailureIndication.ProtoReflect.Descriptor instead.
+func (*OnuStartupFailureIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{30}
+}
+
+func (x *OnuStartupFailureIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuStartupFailureIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuStartupFailureIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+type OnuSignalDegradeIndication struct {
+	state               protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields       protoimpl.UnknownFields
+	sizeCache           protoimpl.SizeCache
+}
+
+func (x *OnuSignalDegradeIndication) Reset() {
+	*x = OnuSignalDegradeIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[31]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuSignalDegradeIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuSignalDegradeIndication) ProtoMessage() {}
+
+func (x *OnuSignalDegradeIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[31]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuSignalDegradeIndication.ProtoReflect.Descriptor instead.
+func (*OnuSignalDegradeIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{31}
+}
+
+func (x *OnuSignalDegradeIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuSignalDegradeIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuSignalDegradeIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+func (x *OnuSignalDegradeIndication) GetInverseBitErrorRate() uint32 {
+	if x != nil {
+		return x.InverseBitErrorRate
+	}
+	return 0
+}
+
+type OnuDriftOfWindowIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuDriftOfWindowIndication) Reset() {
+	*x = OnuDriftOfWindowIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[32]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuDriftOfWindowIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuDriftOfWindowIndication) ProtoMessage() {}
+
+func (x *OnuDriftOfWindowIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[32]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuDriftOfWindowIndication.ProtoReflect.Descriptor instead.
+func (*OnuDriftOfWindowIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{32}
+}
+
+func (x *OnuDriftOfWindowIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuDriftOfWindowIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuDriftOfWindowIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+func (x *OnuDriftOfWindowIndication) GetDrift() uint32 {
+	if x != nil {
+		return x.Drift
+	}
+	return 0
+}
+
+func (x *OnuDriftOfWindowIndication) GetNewEqd() uint32 {
+	if x != nil {
+		return x.NewEqd
+	}
+	return 0
+}
+
+type OnuLossOfOmciChannelIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuLossOfOmciChannelIndication) Reset() {
+	*x = OnuLossOfOmciChannelIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[33]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuLossOfOmciChannelIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuLossOfOmciChannelIndication) ProtoMessage() {}
+
+func (x *OnuLossOfOmciChannelIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[33]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuLossOfOmciChannelIndication.ProtoReflect.Descriptor instead.
+func (*OnuLossOfOmciChannelIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{33}
+}
+
+func (x *OnuLossOfOmciChannelIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuLossOfOmciChannelIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuLossOfOmciChannelIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+type OnuSignalsFailureIndication struct {
+	state               protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields       protoimpl.UnknownFields
+	sizeCache           protoimpl.SizeCache
+}
+
+func (x *OnuSignalsFailureIndication) Reset() {
+	*x = OnuSignalsFailureIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[34]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuSignalsFailureIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuSignalsFailureIndication) ProtoMessage() {}
+
+func (x *OnuSignalsFailureIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[34]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuSignalsFailureIndication.ProtoReflect.Descriptor instead.
+func (*OnuSignalsFailureIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{34}
+}
+
+func (x *OnuSignalsFailureIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuSignalsFailureIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuSignalsFailureIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+func (x *OnuSignalsFailureIndication) GetInverseBitErrorRate() uint32 {
+	if x != nil {
+		return x.InverseBitErrorRate
+	}
+	return 0
+}
+
+type OnuTransmissionInterferenceWarning struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuTransmissionInterferenceWarning) Reset() {
+	*x = OnuTransmissionInterferenceWarning{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[35]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuTransmissionInterferenceWarning) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuTransmissionInterferenceWarning) ProtoMessage() {}
+
+func (x *OnuTransmissionInterferenceWarning) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[35]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuTransmissionInterferenceWarning.ProtoReflect.Descriptor instead.
+func (*OnuTransmissionInterferenceWarning) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{35}
+}
+
+func (x *OnuTransmissionInterferenceWarning) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuTransmissionInterferenceWarning) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuTransmissionInterferenceWarning) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+func (x *OnuTransmissionInterferenceWarning) GetDrift() uint32 {
+	if x != nil {
+		return x.Drift
+	}
+	return 0
+}
+
+type OnuActivationFailureIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	FailReason    uint32                 `protobuf:"fixed32,3,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuActivationFailureIndication) Reset() {
+	*x = OnuActivationFailureIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[36]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuActivationFailureIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuActivationFailureIndication) ProtoMessage() {}
+
+func (x *OnuActivationFailureIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[36]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuActivationFailureIndication.ProtoReflect.Descriptor instead.
+func (*OnuActivationFailureIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{36}
+}
+
+func (x *OnuActivationFailureIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuActivationFailureIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuActivationFailureIndication) GetFailReason() uint32 {
+	if x != nil {
+		return x.FailReason
+	}
+	return 0
+}
+
+type OnuLossOfKeySyncFailureIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuLossOfKeySyncFailureIndication) Reset() {
+	*x = OnuLossOfKeySyncFailureIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[37]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuLossOfKeySyncFailureIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuLossOfKeySyncFailureIndication) ProtoMessage() {}
+
+func (x *OnuLossOfKeySyncFailureIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[37]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuLossOfKeySyncFailureIndication.ProtoReflect.Descriptor instead.
+func (*OnuLossOfKeySyncFailureIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{37}
+}
+
+func (x *OnuLossOfKeySyncFailureIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuLossOfKeySyncFailureIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuLossOfKeySyncFailureIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+type RdiErrorIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	RdiErrorCount uint64                 `protobuf:"fixed64,1,opt,name=rdi_error_count,json=rdiErrorCount,proto3" json:"rdi_error_count,omitempty"` // RDI Error count
+	Status        string                 `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`                                        // on/off based on configured reporting condition
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *RdiErrorIndication) Reset() {
+	*x = RdiErrorIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[38]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *RdiErrorIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RdiErrorIndication) ProtoMessage() {}
+
+func (x *RdiErrorIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[38]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RdiErrorIndication.ProtoReflect.Descriptor instead.
+func (*RdiErrorIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{38}
+}
+
+func (x *RdiErrorIndication) GetRdiErrorCount() uint64 {
+	if x != nil {
+		return x.RdiErrorCount
+	}
+	return 0
+}
+
+func (x *RdiErrorIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+type OnuItuPonStatsIndication struct {
+	state  protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	// Types that are valid to be assigned to Stats:
+	//
+	//	*OnuItuPonStatsIndication_RdiErrorInd
+	Stats         isOnuItuPonStatsIndication_Stats `protobuf_oneof:"stats"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuItuPonStatsIndication) Reset() {
+	*x = OnuItuPonStatsIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[39]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuItuPonStatsIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuItuPonStatsIndication) ProtoMessage() {}
+
+func (x *OnuItuPonStatsIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[39]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuItuPonStatsIndication.ProtoReflect.Descriptor instead.
+func (*OnuItuPonStatsIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{39}
+}
+
+func (x *OnuItuPonStatsIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuItuPonStatsIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuItuPonStatsIndication) GetStats() isOnuItuPonStatsIndication_Stats {
+	if x != nil {
+		return x.Stats
+	}
+	return nil
+}
+
+func (x *OnuItuPonStatsIndication) GetRdiErrorInd() *RdiErrorIndication {
+	if x != nil {
+		if x, ok := x.Stats.(*OnuItuPonStatsIndication_RdiErrorInd); ok {
+			return x.RdiErrorInd
+		}
+	}
+	return nil
+}
+
+type isOnuItuPonStatsIndication_Stats interface {
+	isOnuItuPonStatsIndication_Stats()
+}
+
+type OnuItuPonStatsIndication_RdiErrorInd struct {
+	RdiErrorInd *RdiErrorIndication `protobuf:"bytes,3,opt,name=rdi_error_ind,json=rdiErrorInd,proto3,oneof"` // add more here
+}
+
+func (*OnuItuPonStatsIndication_RdiErrorInd) isOnuItuPonStatsIndication_Stats() {}
+
+type OnuProcessingErrorIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuProcessingErrorIndication) Reset() {
+	*x = OnuProcessingErrorIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[40]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuProcessingErrorIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuProcessingErrorIndication) ProtoMessage() {}
+
+func (x *OnuProcessingErrorIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[40]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuProcessingErrorIndication.ProtoReflect.Descriptor instead.
+func (*OnuProcessingErrorIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{40}
+}
+
+func (x *OnuProcessingErrorIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuProcessingErrorIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+type OnuDeactivationFailureIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuDeactivationFailureIndication) Reset() {
+	*x = OnuDeactivationFailureIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[41]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuDeactivationFailureIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuDeactivationFailureIndication) ProtoMessage() {}
+
+func (x *OnuDeactivationFailureIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[41]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuDeactivationFailureIndication.ProtoReflect.Descriptor instead.
+func (*OnuDeactivationFailureIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{41}
+}
+
+func (x *OnuDeactivationFailureIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuDeactivationFailureIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuDeactivationFailureIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+type OnuRemoteDefectIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	RdiErrors     uint64                 `protobuf:"fixed64,3,opt,name=rdi_errors,json=rdiErrors,proto3" json:"rdi_errors,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuRemoteDefectIndication) Reset() {
+	*x = OnuRemoteDefectIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[42]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuRemoteDefectIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuRemoteDefectIndication) ProtoMessage() {}
+
+func (x *OnuRemoteDefectIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[42]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuRemoteDefectIndication.ProtoReflect.Descriptor instead.
+func (*OnuRemoteDefectIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{42}
+}
+
+func (x *OnuRemoteDefectIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuRemoteDefectIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuRemoteDefectIndication) GetRdiErrors() uint64 {
+	if x != nil {
+		return x.RdiErrors
+	}
+	return 0
+}
+
+type OnuLossOfGEMChannelDelineationIndication struct {
+	state             protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	DelineationErrors uint32                 `protobuf:"fixed32,4,opt,name=delineation_errors,json=delineationErrors,proto3" json:"delineation_errors,omitempty"`
+	unknownFields     protoimpl.UnknownFields
+	sizeCache         protoimpl.SizeCache
+}
+
+func (x *OnuLossOfGEMChannelDelineationIndication) Reset() {
+	*x = OnuLossOfGEMChannelDelineationIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[43]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuLossOfGEMChannelDelineationIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuLossOfGEMChannelDelineationIndication) ProtoMessage() {}
+
+func (x *OnuLossOfGEMChannelDelineationIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[43]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuLossOfGEMChannelDelineationIndication.ProtoReflect.Descriptor instead.
+func (*OnuLossOfGEMChannelDelineationIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{43}
+}
+
+func (x *OnuLossOfGEMChannelDelineationIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuLossOfGEMChannelDelineationIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuLossOfGEMChannelDelineationIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+func (x *OnuLossOfGEMChannelDelineationIndication) GetDelineationErrors() uint32 {
+	if x != nil {
+		return x.DelineationErrors
+	}
+	return 0
+}
+
+type OnuPhysicalEquipmentErrorIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuPhysicalEquipmentErrorIndication) Reset() {
+	*x = OnuPhysicalEquipmentErrorIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[44]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuPhysicalEquipmentErrorIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuPhysicalEquipmentErrorIndication) ProtoMessage() {}
+
+func (x *OnuPhysicalEquipmentErrorIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[44]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuPhysicalEquipmentErrorIndication.ProtoReflect.Descriptor instead.
+func (*OnuPhysicalEquipmentErrorIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{44}
+}
+
+func (x *OnuPhysicalEquipmentErrorIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuPhysicalEquipmentErrorIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuPhysicalEquipmentErrorIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+type OnuLossOfAcknowledgementIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuLossOfAcknowledgementIndication) Reset() {
+	*x = OnuLossOfAcknowledgementIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[45]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuLossOfAcknowledgementIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuLossOfAcknowledgementIndication) ProtoMessage() {}
+
+func (x *OnuLossOfAcknowledgementIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[45]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuLossOfAcknowledgementIndication.ProtoReflect.Descriptor instead.
+func (*OnuLossOfAcknowledgementIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{45}
+}
+
+func (x *OnuLossOfAcknowledgementIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuLossOfAcknowledgementIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuLossOfAcknowledgementIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+type OnuDifferentialReachExceededIndication struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	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"`
+	Distance      uint32                 `protobuf:"fixed32,4,opt,name=distance,proto3" json:"distance,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuDifferentialReachExceededIndication) Reset() {
+	*x = OnuDifferentialReachExceededIndication{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[46]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuDifferentialReachExceededIndication) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuDifferentialReachExceededIndication) ProtoMessage() {}
+
+func (x *OnuDifferentialReachExceededIndication) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[46]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuDifferentialReachExceededIndication.ProtoReflect.Descriptor instead.
+func (*OnuDifferentialReachExceededIndication) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{46}
+}
+
+func (x *OnuDifferentialReachExceededIndication) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuDifferentialReachExceededIndication) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuDifferentialReachExceededIndication) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+func (x *OnuDifferentialReachExceededIndication) GetDistance() uint32 {
+	if x != nil {
+		return x.Distance
+	}
+	return 0
+}
+
+type GroupMember struct {
+	state         protoimpl.MessageState    `protogen:"open.v1"`
+	InterfaceId   uint32                    `protobuf:"varint,1,opt,name=interface_id,json=interfaceId,proto3" json:"interface_id,omitempty"`
+	InterfaceType GroupMember_InterfaceType `protobuf:"varint,2,opt,name=interface_type,json=interfaceType,proto3,enum=openolt.GroupMember_InterfaceType" json:"interface_type,omitempty"`
+	GemPortId     uint32                    `protobuf:"varint,3,opt,name=gem_port_id,json=gemPortId,proto3" json:"gem_port_id,omitempty"`
+	Priority      uint32                    `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"` // Priority (and also the ID) of the default fixed queue for the multicast traffic.
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *GroupMember) Reset() {
+	*x = GroupMember{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[47]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GroupMember) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GroupMember) ProtoMessage() {}
+
+func (x *GroupMember) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[47]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GroupMember.ProtoReflect.Descriptor instead.
+func (*GroupMember) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{47}
+}
+
+func (x *GroupMember) GetInterfaceId() uint32 {
+	if x != nil {
+		return x.InterfaceId
+	}
+	return 0
+}
+
+func (x *GroupMember) GetInterfaceType() GroupMember_InterfaceType {
+	if x != nil {
+		return x.InterfaceType
+	}
+	return GroupMember_PON
+}
+
+func (x *GroupMember) GetGemPortId() uint32 {
+	if x != nil {
+		return x.GemPortId
+	}
+	return 0
+}
+
+func (x *GroupMember) GetPriority() uint32 {
+	if x != nil {
+		return x.Priority
+	}
+	return 0
+}
+
+type Group struct {
+	state         protoimpl.MessageState    `protogen:"open.v1"`
+	GroupId       uint32                    `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
+	Command       Group_GroupMembersCommand `protobuf:"varint,2,opt,name=command,proto3,enum=openolt.Group_GroupMembersCommand" json:"command,omitempty"`
+	Members       []*GroupMember            `protobuf:"bytes,3,rep,name=members,proto3" json:"members,omitempty"`
+	Action        *Action                   `protobuf:"bytes,4,opt,name=action,proto3" json:"action,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *Group) Reset() {
+	*x = Group{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[48]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *Group) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Group) ProtoMessage() {}
+
+func (x *Group) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[48]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Group.ProtoReflect.Descriptor instead.
+func (*Group) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{48}
+}
+
+func (x *Group) GetGroupId() uint32 {
+	if x != nil {
+		return x.GroupId
+	}
+	return 0
+}
+
+func (x *Group) GetCommand() Group_GroupMembersCommand {
+	if x != nil {
+		return x.Command
+	}
+	return Group_ADD_MEMBERS
+}
+
+func (x *Group) GetMembers() []*GroupMember {
+	if x != nil {
+		return x.Members
+	}
+	return nil
+}
+
+func (x *Group) GetAction() *Action {
+	if x != nil {
+		return x.Action
+	}
+	return nil
+}
+
+type ValueParam struct {
+	state         protoimpl.MessageState   `protogen:"open.v1"`
+	Onu           *Onu                     `protobuf:"bytes,1,opt,name=onu,proto3" json:"onu,omitempty"`
+	Value         extension.ValueType_Type `protobuf:"varint,2,opt,name=value,proto3,enum=extension.ValueType_Type" json:"value,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *ValueParam) Reset() {
+	*x = ValueParam{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[49]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ValueParam) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ValueParam) ProtoMessage() {}
+
+func (x *ValueParam) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[49]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ValueParam.ProtoReflect.Descriptor instead.
+func (*ValueParam) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{49}
+}
+
+func (x *ValueParam) GetOnu() *Onu {
+	if x != nil {
+		return x.Onu
+	}
+	return nil
+}
+
+func (x *ValueParam) GetValue() extension.ValueType_Type {
+	if x != nil {
+		return x.Value
+	}
+	return extension.ValueType_Type(0)
+}
+
+type PonRxPowerData struct {
+	state          protoimpl.MessageState                   `protogen:"open.v1"`
+	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"`
+	FailReason     PonRxPowerData_RssiMeasurementFailReason `protobuf:"varint,4,opt,name=fail_reason,json=failReason,proto3,enum=openolt.PonRxPowerData_RssiMeasurementFailReason" json:"fail_reason,omitempty"`
+	RxPowerMeanDbm float64                                  `protobuf:"fixed64,5,opt,name=rx_power_mean_dbm,json=rxPowerMeanDbm,proto3" json:"rx_power_mean_dbm,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
+}
+
+func (x *PonRxPowerData) Reset() {
+	*x = PonRxPowerData{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[50]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *PonRxPowerData) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PonRxPowerData) ProtoMessage() {}
+
+func (x *PonRxPowerData) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[50]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PonRxPowerData.ProtoReflect.Descriptor instead.
+func (*PonRxPowerData) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{50}
+}
+
+func (x *PonRxPowerData) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *PonRxPowerData) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *PonRxPowerData) GetStatus() string {
+	if x != nil {
+		return x.Status
+	}
+	return ""
+}
+
+func (x *PonRxPowerData) GetFailReason() PonRxPowerData_RssiMeasurementFailReason {
+	if x != nil {
+		return x.FailReason
+	}
+	return PonRxPowerData_FAIL_REASON_NONE
+}
+
+func (x *PonRxPowerData) GetRxPowerMeanDbm() float64 {
+	if x != nil {
+		return x.RxPowerMeanDbm
+	}
+	return 0
+}
+
+type OnuAllocIdStatistics struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	IntfId        uint32                 `protobuf:"fixed32,1,opt,name=intfId,proto3" json:"intfId,omitempty"`
+	AllocId       uint32                 `protobuf:"fixed32,2,opt,name=allocId,proto3" json:"allocId,omitempty"`
+	RxBytes       uint64                 `protobuf:"fixed64,3,opt,name=rxBytes,proto3" json:"rxBytes,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuAllocIdStatistics) Reset() {
+	*x = OnuAllocIdStatistics{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[51]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuAllocIdStatistics) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuAllocIdStatistics) ProtoMessage() {}
+
+func (x *OnuAllocIdStatistics) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[51]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuAllocIdStatistics.ProtoReflect.Descriptor instead.
+func (*OnuAllocIdStatistics) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{51}
+}
+
+func (x *OnuAllocIdStatistics) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *OnuAllocIdStatistics) GetAllocId() uint32 {
+	if x != nil {
+		return x.AllocId
+	}
+	return 0
+}
+
+func (x *OnuAllocIdStatistics) GetRxBytes() uint64 {
+	if x != nil {
+		return x.RxBytes
+	}
+	return 0
+}
+
+// contains the onu id, state of the onu and the information about the alarms on the onu.
+// As of now only few alarms are added, any further information needed can be added to the structure.
+type OnuInfo struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	OnuId         uint32                 `protobuf:"fixed32,1,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
+	State         OnuInfo_OnuState       `protobuf:"varint,2,opt,name=state,proto3,enum=openolt.OnuInfo_OnuState" json:"state,omitempty"`
+	Losi          AlarmState             `protobuf:"varint,3,opt,name=losi,proto3,enum=openolt.AlarmState" json:"losi,omitempty"`
+	Lofi          AlarmState             `protobuf:"varint,4,opt,name=lofi,proto3,enum=openolt.AlarmState" json:"lofi,omitempty"`
+	Loami         AlarmState             `protobuf:"varint,5,opt,name=loami,proto3,enum=openolt.AlarmState" json:"loami,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OnuInfo) Reset() {
+	*x = OnuInfo{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[52]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuInfo) ProtoMessage() {}
+
+func (x *OnuInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[52]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuInfo.ProtoReflect.Descriptor instead.
+func (*OnuInfo) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{52}
+}
+
+func (x *OnuInfo) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+func (x *OnuInfo) GetState() OnuInfo_OnuState {
+	if x != nil {
+		return x.State
+	}
+	return OnuInfo_UNKNOWN
+}
+
+func (x *OnuInfo) GetLosi() AlarmState {
+	if x != nil {
+		return x.Losi
+	}
+	return AlarmState_OFF
+}
+
+func (x *OnuInfo) GetLofi() AlarmState {
+	if x != nil {
+		return x.Lofi
+	}
+	return AlarmState_OFF
+}
+
+func (x *OnuInfo) GetLoami() AlarmState {
+	if x != nil {
+		return x.Loami
+	}
+	return AlarmState_OFF
+}
+
+// IntfInfo has the interface Id and if there are any alarms active on that interface.
+// Any further information needed from the interface object can be added to the structure.
+type PonIntfInfo struct {
+	state         protoimpl.MessageState   `protogen:"open.v1"`
+	IntfId        uint32                   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
+	State         PonIntfInfo_PonIntfState `protobuf:"varint,3,opt,name=state,proto3,enum=openolt.PonIntfInfo_PonIntfState" json:"state,omitempty"`
+	Los           AlarmState               `protobuf:"varint,4,opt,name=los,proto3,enum=openolt.AlarmState" json:"los,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *PonIntfInfo) Reset() {
+	*x = PonIntfInfo{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[53]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *PonIntfInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PonIntfInfo) ProtoMessage() {}
+
+func (x *PonIntfInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[53]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PonIntfInfo.ProtoReflect.Descriptor instead.
+func (*PonIntfInfo) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{53}
+}
+
+func (x *PonIntfInfo) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *PonIntfInfo) GetState() PonIntfInfo_PonIntfState {
+	if x != nil {
+		return x.State
+	}
+	return PonIntfInfo_UNKNOWN
+}
+
+func (x *PonIntfInfo) GetLos() AlarmState {
+	if x != nil {
+		return x.Los
+	}
+	return AlarmState_OFF
+}
+
+// Message used for disabling device by serialnumber, disable at PLOAM
+type InterfaceOnuSerialNumberOnuId struct {
+	state           protoimpl.MessageState    `protogen:"open.v1"`
+	IntfIdSerialNum *InterfaceOnuSerialNumber `protobuf:"bytes,1,opt,name=intf_id_serial_num,json=intfIdSerialNum,proto3" json:"intf_id_serial_num,omitempty"`
+	OnuId           uint32                    `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *InterfaceOnuSerialNumberOnuId) Reset() {
+	*x = InterfaceOnuSerialNumberOnuId{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[54]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *InterfaceOnuSerialNumberOnuId) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InterfaceOnuSerialNumberOnuId) ProtoMessage() {}
+
+func (x *InterfaceOnuSerialNumberOnuId) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[54]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use InterfaceOnuSerialNumberOnuId.ProtoReflect.Descriptor instead.
+func (*InterfaceOnuSerialNumberOnuId) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{54}
+}
+
+func (x *InterfaceOnuSerialNumberOnuId) GetIntfIdSerialNum() *InterfaceOnuSerialNumber {
+	if x != nil {
+		return x.IntfIdSerialNum
+	}
+	return nil
+}
+
+func (x *InterfaceOnuSerialNumberOnuId) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
+	}
+	return 0
+}
+
+type InterfaceOnuSerialNumber struct {
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	IntfId          uint32                 `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
+	OnuSerialNumber *SerialNumber          `protobuf:"bytes,2,opt,name=onu_serial_number,json=onuSerialNumber,proto3" json:"onu_serial_number,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *InterfaceOnuSerialNumber) Reset() {
+	*x = InterfaceOnuSerialNumber{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[55]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *InterfaceOnuSerialNumber) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InterfaceOnuSerialNumber) ProtoMessage() {}
+
+func (x *InterfaceOnuSerialNumber) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[55]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use InterfaceOnuSerialNumber.ProtoReflect.Descriptor instead.
+func (*InterfaceOnuSerialNumber) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{55}
+}
+
+func (x *InterfaceOnuSerialNumber) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
+	}
+	return 0
+}
+
+func (x *InterfaceOnuSerialNumber) GetOnuSerialNumber() *SerialNumber {
+	if x != nil {
+		return x.OnuSerialNumber
+	}
+	return nil
+}
+
+type Empty struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *Empty) Reset() {
+	*x = Empty{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[56]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *Empty) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Empty) ProtoMessage() {}
+
+func (x *Empty) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[56]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Empty.ProtoReflect.Descriptor instead.
+func (*Empty) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{56}
+}
+
+type IntfOperIndication_PONResourceRanges struct {
+	state         protoimpl.MessageState                       `protogen:"open.v1"`
+	Pools         []*IntfOperIndication_PONResourceRanges_Pool `protobuf:"bytes,3,rep,name=pools,proto3" json:"pools,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *IntfOperIndication_PONResourceRanges) Reset() {
+	*x = IntfOperIndication_PONResourceRanges{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[57]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *IntfOperIndication_PONResourceRanges) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IntfOperIndication_PONResourceRanges) ProtoMessage() {}
+
+func (x *IntfOperIndication_PONResourceRanges) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[57]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IntfOperIndication_PONResourceRanges.ProtoReflect.Descriptor instead.
+func (*IntfOperIndication_PONResourceRanges) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{8, 0}
+}
+
+func (x *IntfOperIndication_PONResourceRanges) GetPools() []*IntfOperIndication_PONResourceRanges_Pool {
+	if x != nil {
+		return x.Pools
+	}
+	return nil
+}
+
+type IntfOperIndication_PONResourceRanges_Pool struct {
+	state         protoimpl.MessageState                             `protogen:"open.v1"`
+	Type          IntfOperIndication_PONResourceRanges_Pool_PoolType `protobuf:"varint,1,opt,name=type,proto3,enum=openolt.IntfOperIndication_PONResourceRanges_Pool_PoolType" json:"type,omitempty"`
+	Start         uint32                                             `protobuf:"fixed32,3,opt,name=start,proto3" json:"start,omitempty"` // lower bound on IDs allocated from this pool
+	End           uint32                                             `protobuf:"fixed32,4,opt,name=end,proto3" json:"end,omitempty"`     // upper bound on IDs allocated from this pool
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *IntfOperIndication_PONResourceRanges_Pool) Reset() {
+	*x = IntfOperIndication_PONResourceRanges_Pool{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[58]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *IntfOperIndication_PONResourceRanges_Pool) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IntfOperIndication_PONResourceRanges_Pool) ProtoMessage() {}
+
+func (x *IntfOperIndication_PONResourceRanges_Pool) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[58]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IntfOperIndication_PONResourceRanges_Pool.ProtoReflect.Descriptor instead.
+func (*IntfOperIndication_PONResourceRanges_Pool) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{8, 0, 0}
+}
+
+func (x *IntfOperIndication_PONResourceRanges_Pool) GetType() IntfOperIndication_PONResourceRanges_Pool_PoolType {
+	if x != nil {
+		return x.Type
+	}
+	return IntfOperIndication_PONResourceRanges_Pool_ONU_ID
+}
+
+func (x *IntfOperIndication_PONResourceRanges_Pool) GetStart() uint32 {
+	if x != nil {
+		return x.Start
+	}
+	return 0
+}
+
+func (x *IntfOperIndication_PONResourceRanges_Pool) GetEnd() uint32 {
+	if x != nil {
+		return x.End
+	}
+	return 0
+}
+
+type DeviceInfo_DeviceResourceRanges struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// 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"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *DeviceInfo_DeviceResourceRanges) Reset() {
+	*x = DeviceInfo_DeviceResourceRanges{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[59]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DeviceInfo_DeviceResourceRanges) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeviceInfo_DeviceResourceRanges) ProtoMessage() {}
+
+func (x *DeviceInfo_DeviceResourceRanges) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[59]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeviceInfo_DeviceResourceRanges.ProtoReflect.Descriptor instead.
+func (*DeviceInfo_DeviceResourceRanges) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{18, 0}
+}
+
+func (x *DeviceInfo_DeviceResourceRanges) GetIntfIds() []uint32 {
+	if x != nil {
+		return x.IntfIds
+	}
+	return nil
+}
+
+func (x *DeviceInfo_DeviceResourceRanges) GetTechnology() string {
+	if x != nil {
+		return x.Technology
+	}
+	return ""
+}
+
+func (x *DeviceInfo_DeviceResourceRanges) GetPools() []*DeviceInfo_DeviceResourceRanges_Pool {
+	if x != nil {
+		return x.Pools
+	}
+	return nil
+}
+
+type DeviceInfo_DeviceResourceRanges_Pool struct {
+	state         protoimpl.MessageState                           `protogen:"open.v1"`
+	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"` // lower bound on IDs allocated from this pool
+	End           uint32                                           `protobuf:"fixed32,4,opt,name=end,proto3" json:"end,omitempty"`     // upper bound on IDs allocated from this pool
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *DeviceInfo_DeviceResourceRanges_Pool) Reset() {
+	*x = DeviceInfo_DeviceResourceRanges_Pool{}
+	mi := &file_voltha_protos_openolt_proto_msgTypes[60]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DeviceInfo_DeviceResourceRanges_Pool) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeviceInfo_DeviceResourceRanges_Pool) ProtoMessage() {}
+
+func (x *DeviceInfo_DeviceResourceRanges_Pool) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_openolt_proto_msgTypes[60]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeviceInfo_DeviceResourceRanges_Pool.ProtoReflect.Descriptor instead.
+func (*DeviceInfo_DeviceResourceRanges_Pool) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_openolt_proto_rawDescGZIP(), []int{18, 0, 0}
+}
+
+func (x *DeviceInfo_DeviceResourceRanges_Pool) GetType() DeviceInfo_DeviceResourceRanges_Pool_PoolType {
+	if x != nil {
+		return x.Type
+	}
+	return DeviceInfo_DeviceResourceRanges_Pool_ONU_ID
+}
+
+func (x *DeviceInfo_DeviceResourceRanges_Pool) GetSharing() DeviceInfo_DeviceResourceRanges_Pool_SharingType {
+	if x != nil {
+		return x.Sharing
+	}
+	return DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF
+}
+
+func (x *DeviceInfo_DeviceResourceRanges_Pool) GetStart() uint32 {
+	if x != nil {
+		return x.Start
+	}
+	return 0
+}
+
+func (x *DeviceInfo_DeviceResourceRanges_Pool) GetEnd() uint32 {
+	if x != nil {
+		return x.End
+	}
+	return 0
+}
+
+var File_voltha_protos_openolt_proto protoreflect.FileDescriptor
+
+const file_voltha_protos_openolt_proto_rawDesc = "" +
+	"\n" +
+	"\x1bvoltha_protos/openolt.proto\x12\aopenolt\x1a\x1cgoogle/api/annotations.proto\x1a voltha_protos/tech_profile.proto\x1a\x1evoltha_protos/ext_config.proto\x1a\x1evoltha_protos/extensions.proto\x1a\x1avoltha_protos/common.proto\"\xe0\x05\n" +
+	"\n" +
+	"Indication\x121\n" +
+	"\aolt_ind\x18\x01 \x01(\v2\x16.openolt.OltIndicationH\x00R\x06oltInd\x124\n" +
+	"\bintf_ind\x18\x02 \x01(\v2\x17.openolt.IntfIndicationH\x00R\aintfInd\x12A\n" +
+	"\rintf_oper_ind\x18\x03 \x01(\v2\x1b.openolt.IntfOperIndicationH\x00R\vintfOperInd\x12>\n" +
+	"\fonu_disc_ind\x18\x04 \x01(\v2\x1a.openolt.OnuDiscIndicationH\x00R\n" +
+	"onuDiscInd\x121\n" +
+	"\aonu_ind\x18\x05 \x01(\v2\x16.openolt.OnuIndicationH\x00R\x06onuInd\x124\n" +
+	"\bomci_ind\x18\x06 \x01(\v2\x17.openolt.OmciIndicationH\x00R\aomciInd\x124\n" +
+	"\apkt_ind\x18\a \x01(\v2\x19.openolt.PacketIndicationH\x00R\x06pktInd\x127\n" +
+	"\n" +
+	"port_stats\x18\b \x01(\v2\x16.common.PortStatisticsH\x00R\tportStats\x128\n" +
+	"\n" +
+	"flow_stats\x18\t \x01(\v2\x17.openolt.FlowStatisticsH\x00R\tflowStats\x127\n" +
+	"\talarm_ind\x18\n" +
+	" \x01(\v2\x18.openolt.AlarmIndicationH\x00R\balarmInd\x12J\n" +
+	"\x10onu_disabled_ind\x18\v \x01(\v2\x1e.openolt.OnuDisabledIndicationH\x00R\x0eonuDisabledInd\x12G\n" +
+	"\x0fonu_enabled_ind\x18\f \x01(\v2\x1d.openolt.OnuEnabledIndicationH\x00R\ronuEnabledIndB\x06\n" +
+	"\x04data\"\xeb\r\n" +
+	"\x0fAlarmIndication\x121\n" +
+	"\alos_ind\x18\x01 \x01(\v2\x16.openolt.LosIndicationH\x00R\x06losInd\x12D\n" +
+	"\x0edying_gasp_ind\x18\x02 \x01(\v2\x1c.openolt.DyingGaspIndicationH\x00R\fdyingGaspInd\x12A\n" +
+	"\ronu_alarm_ind\x18\x03 \x01(\v2\x1b.openolt.OnuAlarmIndicationH\x00R\vonuAlarmInd\x12W\n" +
+	"\x14onu_startup_fail_ind\x18\x04 \x01(\v2$.openolt.OnuStartupFailureIndicationH\x00R\x11onuStartupFailInd\x12Z\n" +
+	"\x16onu_signal_degrade_ind\x18\x05 \x01(\v2#.openolt.OnuSignalDegradeIndicationH\x00R\x13onuSignalDegradeInd\x12[\n" +
+	"\x17onu_drift_of_window_ind\x18\x06 \x01(\v2#.openolt.OnuDriftOfWindowIndicationH\x00R\x13onuDriftOfWindowInd\x12T\n" +
+	"\x11onu_loss_omci_ind\x18\a \x01(\v2'.openolt.OnuLossOfOmciChannelIndicationH\x00R\x0eonuLossOmciInd\x12W\n" +
+	"\x14onu_signals_fail_ind\x18\b \x01(\v2$.openolt.OnuSignalsFailureIndicationH\x00R\x11onuSignalsFailInd\x12O\n" +
+	"\fonu_tiwi_ind\x18\t \x01(\v2+.openolt.OnuTransmissionInterferenceWarningH\x00R\n" +
+	"onuTiwiInd\x12`\n" +
+	"\x17onu_activation_fail_ind\x18\n" +
+	" \x01(\v2'.openolt.OnuActivationFailureIndicationH\x00R\x14onuActivationFailInd\x12`\n" +
+	"\x18onu_processing_error_ind\x18\v \x01(\v2%.openolt.OnuProcessingErrorIndicationH\x00R\x15onuProcessingErrorInd\x12e\n" +
+	"\x19onu_loss_of_sync_fail_ind\x18\f \x01(\v2*.openolt.OnuLossOfKeySyncFailureIndicationH\x00R\x14onuLossOfSyncFailInd\x12U\n" +
+	"\x15onu_itu_pon_stats_ind\x18\r \x01(\v2!.openolt.OnuItuPonStatsIndicationH\x00R\x11onuItuPonStatsInd\x12l\n" +
+	"\x1conu_deactivation_failure_ind\x18\x0e \x01(\v2).openolt.OnuDeactivationFailureIndicationH\x00R\x19onuDeactivationFailureInd\x12W\n" +
+	"\x15onu_remote_defect_ind\x18\x0f \x01(\v2\".openolt.OnuRemoteDefectIndicationH\x00R\x12onuRemoteDefectInd\x12s\n" +
+	"\x1conu_loss_gem_delineation_ind\x18\x10 \x01(\v21.openolt.OnuLossOfGEMChannelDelineationIndicationH\x00R\x18onuLossGemDelineationInd\x12v\n" +
+	" onu_physical_equipment_error_ind\x18\x11 \x01(\v2,.openolt.OnuPhysicalEquipmentErrorIndicationH\x00R\x1conuPhysicalEquipmentErrorInd\x12[\n" +
+	"\x13onu_loss_of_ack_ind\x18\x12 \x01(\v2+.openolt.OnuLossOfAcknowledgementIndicationH\x00R\x0fonuLossOfAckInd\x12o\n" +
+	"\x1bonu_diff_reach_exceeded_ind\x18\x13 \x01(\v2/.openolt.OnuDifferentialReachExceededIndicationH\x00R\x17onuDiffReachExceededIndB\x06\n" +
+	"\x04data\".\n" +
+	"\rOltIndication\x12\x1d\n" +
+	"\n" +
+	"oper_state\x18\x01 \x01(\tR\toperState\"H\n" +
+	"\x0eIntfIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x1d\n" +
+	"\n" +
+	"oper_state\x18\x02 \x01(\tR\toperState\"h\n" +
+	"\x11OnuDiscIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12:\n" +
+	"\rserial_number\x18\x02 \x01(\v2\x15.openolt.SerialNumberR\fserialNumber\"\x93\x04\n" +
+	"\rOnuIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x1d\n" +
+	"\n" +
+	"oper_state\x18\x03 \x01(\tR\toperState\x12\x1f\n" +
+	"\vadmin_state\x18\x05 \x01(\tR\n" +
+	"adminState\x12:\n" +
+	"\rserial_number\x18\x04 \x01(\v2\x15.openolt.SerialNumberR\fserialNumber\x12L\n" +
+	"\vfail_reason\x18\x06 \x01(\x0e2+.openolt.OnuIndication.ActivationFailReasonR\n" +
+	"failReason\"\x87\x02\n" +
+	"\x14ActivationFailReason\x12#\n" +
+	"\x1fONU_ACTIVATION_FAIL_REASON_NONE\x10\x00\x12&\n" +
+	"\"ONU_ACTIVATION_FAIL_REASON_RANGING\x10\x01\x126\n" +
+	"2ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION\x10\x02\x12\"\n" +
+	"\x1eONU_ACTIVATION_FAIL_REASON_LOS\x10\x03\x12!\n" +
+	"\x1dONU_ACTIVATION_FAIL_ONU_ALARM\x10\x04\x12#\n" +
+	"\x1fONU_ACTIVATION_FAIL_SWITCH_OVER\x10\x05\"\x83\x01\n" +
+	"\x15OnuDisabledIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12:\n" +
+	"\rserial_number\x18\x04 \x01(\v2\x15.openolt.SerialNumberR\fserialNumber\"\x82\x01\n" +
+	"\x14OnuEnabledIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12:\n" +
+	"\rserial_number\x18\x04 \x01(\v2\x15.openolt.SerialNumberR\fserialNumber\"\x82\x04\n" +
+	"\x12IntfOperIndication\x12\x12\n" +
+	"\x04type\x18\x01 \x01(\tR\x04type\x12\x17\n" +
+	"\aintf_id\x18\x02 \x01(\aR\x06intfId\x12\x1d\n" +
+	"\n" +
+	"oper_state\x18\x03 \x01(\tR\toperState\x12\x14\n" +
+	"\x05speed\x18\x04 \x01(\aR\x05speed\x12\x1e\n" +
+	"\n" +
+	"technology\x18\x05 \x01(\tR\n" +
+	"technology\x12E\n" +
+	"\x06ranges\x18\x06 \x01(\v2-.openolt.IntfOperIndication.PONResourceRangesR\x06ranges\x1a\xa2\x02\n" +
+	"\x11PONResourceRanges\x12H\n" +
+	"\x05pools\x18\x03 \x03(\v22.openolt.IntfOperIndication.PONResourceRanges.PoolR\x05pools\x1a\xc2\x01\n" +
+	"\x04Pool\x12O\n" +
+	"\x04type\x18\x01 \x01(\x0e2;.openolt.IntfOperIndication.PONResourceRanges.Pool.PoolTypeR\x04type\x12\x14\n" +
+	"\x05start\x18\x03 \x01(\aR\x05start\x12\x10\n" +
+	"\x03end\x18\x04 \x01(\aR\x03end\"A\n" +
+	"\bPoolType\x12\n" +
+	"\n" +
+	"\x06ONU_ID\x10\x00\x12\f\n" +
+	"\bALLOC_ID\x10\x01\x12\x0e\n" +
+	"\n" +
+	"GEMPORT_ID\x10\x02\x12\v\n" +
+	"\aFLOW_ID\x10\x03\"R\n" +
+	"\x0eOmciIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x10\n" +
+	"\x03pkt\x18\x03 \x01(\fR\x03pkt\"\xf1\x01\n" +
+	"\x10PacketIndication\x12\x1b\n" +
+	"\tintf_type\x18\x05 \x01(\tR\bintfType\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\b \x01(\aR\x05onuId\x12\x15\n" +
+	"\x06uni_id\x18\t \x01(\aR\x05uniId\x12\x1d\n" +
+	"\n" +
+	"gemport_id\x18\x02 \x01(\aR\tgemportId\x12\x17\n" +
+	"\aflow_id\x18\x03 \x01(\aR\x06flowId\x12\x17\n" +
+	"\aport_no\x18\x06 \x01(\aR\x06portNo\x12\x16\n" +
+	"\x06cookie\x18\a \x01(\x06R\x06cookie\x12\x10\n" +
+	"\x03pkt\x18\x04 \x01(\fR\x03pkt\"A\n" +
+	"\tInterface\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x1b\n" +
+	"\tintf_type\x18\x02 \x01(\aR\bintfType\"<\n" +
+	"\tHeartbeat\x12/\n" +
+	"\x13heartbeat_signature\x18\x01 \x01(\aR\x12heartbeatSignature\"\xac\x01\n" +
+	"\x03Onu\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12:\n" +
+	"\rserial_number\x18\x03 \x01(\v2\x15.openolt.SerialNumberR\fserialNumber\x12\x10\n" +
+	"\x03pir\x18\x04 \x01(\aR\x03pir\x12'\n" +
+	"\x0fomcc_encryption\x18\x05 \x01(\bR\x0eomccEncryption\"\xb1\x01\n" +
+	"\x12OnuLogicalDistance\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x129\n" +
+	"\x19logical_onu_distance_zero\x18\x03 \x01(\aR\x16logicalOnuDistanceZero\x120\n" +
+	"\x14logical_onu_distance\x18\x04 \x01(\aR\x12logicalOnuDistance\"K\n" +
+	"\aOmciMsg\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x10\n" +
+	"\x03pkt\x18\x03 \x01(\fR\x03pkt\"\xa0\x01\n" +
+	"\tOnuPacket\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x17\n" +
+	"\aport_no\x18\x04 \x01(\aR\x06portNo\x12\x1d\n" +
+	"\n" +
+	"gemport_id\x18\x05 \x01(\aR\tgemportId\x12\x19\n" +
+	"\balloc_id\x18\x06 \x01(\aR\aallocId\x12\x10\n" +
+	"\x03pkt\x18\x03 \x01(\fR\x03pkt\"9\n" +
+	"\fUplinkPacket\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x10\n" +
+	"\x03pkt\x18\x02 \x01(\fR\x03pkt\"\xb8\a\n" +
+	"\n" +
+	"DeviceInfo\x12\x16\n" +
+	"\x06vendor\x18\x01 \x01(\tR\x06vendor\x12\x14\n" +
+	"\x05model\x18\x02 \x01(\tR\x05model\x12)\n" +
+	"\x10hardware_version\x18\x03 \x01(\tR\x0fhardwareVersion\x12)\n" +
+	"\x10firmware_version\x18\x04 \x01(\tR\x0ffirmwareVersion\x12\x1b\n" +
+	"\tdevice_id\x18\x10 \x01(\tR\bdeviceId\x120\n" +
+	"\x14device_serial_number\x18\x11 \x01(\tR\x12deviceSerialNumber\x121\n" +
+	"\x14previously_connected\x18\x13 \x01(\bR\x13previouslyConnected\x12\x1b\n" +
+	"\tpon_ports\x18\f \x01(\aR\bponPorts\x12\x1b\n" +
+	"\tnni_ports\x18\x14 \x01(\aR\bnniPorts\x12@\n" +
+	"\x06ranges\x18\x0f \x03(\v2(.openolt.DeviceInfo.DeviceResourceRangesR\x06ranges\x1a\x95\x04\n" +
+	"\x14DeviceResourceRanges\x12\x19\n" +
+	"\bintf_ids\x18\x01 \x03(\aR\aintfIds\x12\x1e\n" +
+	"\n" +
+	"technology\x18\x02 \x01(\tR\n" +
+	"technology\x12C\n" +
+	"\x05pools\x18\x03 \x03(\v2-.openolt.DeviceInfo.DeviceResourceRanges.PoolR\x05pools\x1a\xfc\x02\n" +
+	"\x04Pool\x12J\n" +
+	"\x04type\x18\x01 \x01(\x0e26.openolt.DeviceInfo.DeviceResourceRanges.Pool.PoolTypeR\x04type\x12S\n" +
+	"\asharing\x18\x02 \x01(\x0e29.openolt.DeviceInfo.DeviceResourceRanges.Pool.SharingTypeR\asharing\x12\x14\n" +
+	"\x05start\x18\x03 \x01(\aR\x05start\x12\x10\n" +
+	"\x03end\x18\x04 \x01(\aR\x03end\"A\n" +
+	"\bPoolType\x12\n" +
+	"\n" +
+	"\x06ONU_ID\x10\x00\x12\f\n" +
+	"\bALLOC_ID\x10\x01\x12\x0e\n" +
+	"\n" +
+	"GEMPORT_ID\x10\x02\x12\v\n" +
+	"\aFLOW_ID\x10\x03\"h\n" +
+	"\vSharingType\x12\x16\n" +
+	"\x12DEDICATED_PER_INTF\x10\x00\x12\x1f\n" +
+	"\x1bSHARED_BY_ALL_INTF_ALL_TECH\x10\x01\x12 \n" +
+	"\x1cSHARED_BY_ALL_INTF_SAME_TECH\x10\x02J\x04\b\x05\x10\fJ\x04\b\r\x10\x0eJ\x04\b\x0e\x10\x0f\"\x84\x03\n" +
+	"\n" +
+	"Classifier\x12\x15\n" +
+	"\x06o_tpid\x18\x01 \x01(\aR\x05oTpid\x12\x13\n" +
+	"\x05o_vid\x18\x02 \x01(\aR\x04oVid\x12\x15\n" +
+	"\x06i_tpid\x18\x03 \x01(\aR\x05iTpid\x12\x13\n" +
+	"\x05i_vid\x18\x04 \x01(\aR\x04iVid\x12\x17\n" +
+	"\ao_pbits\x18\x05 \x01(\aR\x06oPbits\x12\x17\n" +
+	"\ai_pbits\x18\x06 \x01(\aR\x06iPbits\x12\x19\n" +
+	"\beth_type\x18\a \x01(\aR\aethType\x12\x17\n" +
+	"\adst_mac\x18\b \x01(\fR\x06dstMac\x12\x17\n" +
+	"\asrc_mac\x18\t \x01(\fR\x06srcMac\x12\x19\n" +
+	"\bip_proto\x18\n" +
+	" \x01(\aR\aipProto\x12\x15\n" +
+	"\x06dst_ip\x18\v \x01(\aR\x05dstIp\x12\x15\n" +
+	"\x06src_ip\x18\f \x01(\aR\x05srcIp\x12\x19\n" +
+	"\bsrc_port\x18\r \x01(\aR\asrcPort\x12\x19\n" +
+	"\bdst_port\x18\x0e \x01(\aR\adstPort\x12 \n" +
+	"\fpkt_tag_type\x18\x0f \x01(\tR\n" +
+	"pktTagType\"\x85\x03\n" +
+	"\tActionCmd\x12\"\n" +
+	"\radd_outer_tag\x18\x01 \x01(\bR\vaddOuterTag\x12(\n" +
+	"\x10remove_outer_tag\x18\x02 \x01(\bR\x0eremoveOuterTag\x12 \n" +
+	"\ftrap_to_host\x18\x03 \x01(\bR\n" +
+	"trapToHost\x12,\n" +
+	"\x12remark_outer_pbits\x18\x04 \x01(\bR\x10remarkOuterPbits\x12,\n" +
+	"\x12remark_inner_pbits\x18\x05 \x01(\bR\x10remarkInnerPbits\x12\"\n" +
+	"\radd_inner_tag\x18\x06 \x01(\bR\vaddInnerTag\x12(\n" +
+	"\x10remove_inner_tag\x18\a \x01(\bR\x0eremoveInnerTag\x12.\n" +
+	"\x13translate_inner_tag\x18\b \x01(\bR\x11translateInnerTag\x12.\n" +
+	"\x13translate_outer_tag\x18\t \x01(\bR\x11translateOuterTag\"\xb8\x01\n" +
+	"\x06Action\x12$\n" +
+	"\x03cmd\x18\x01 \x01(\v2\x12.openolt.ActionCmdR\x03cmd\x12\x13\n" +
+	"\x05o_vid\x18\x02 \x01(\aR\x04oVid\x12\x17\n" +
+	"\ao_pbits\x18\x03 \x01(\aR\x06oPbits\x12\x15\n" +
+	"\x06o_tpid\x18\x04 \x01(\aR\x05oTpid\x12\x13\n" +
+	"\x05i_vid\x18\x05 \x01(\aR\x04iVid\x12\x17\n" +
+	"\ai_pbits\x18\x06 \x01(\aR\x06iPbits\x12\x15\n" +
+	"\x06i_tpid\x18\a \x01(\aR\x05iTpid\"\xc7\x06\n" +
+	"\x04Flow\x12$\n" +
+	"\x0eaccess_intf_id\x18\x01 \x01(\x0fR\faccessIntfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\x0fR\x05onuId\x12\x15\n" +
+	"\x06uni_id\x18\v \x01(\x0fR\x05uniId\x12\x17\n" +
+	"\aflow_id\x18\x03 \x01(\x06R\x06flowId\x12*\n" +
+	"\x11symmetric_flow_id\x18\x12 \x01(\x06R\x0fsymmetricFlowId\x12\x1b\n" +
+	"\tflow_type\x18\x04 \x01(\tR\bflowType\x12\x19\n" +
+	"\balloc_id\x18\n" +
+	" \x01(\x0fR\aallocId\x12&\n" +
+	"\x0fnetwork_intf_id\x18\x05 \x01(\x0fR\rnetworkIntfId\x12\x1d\n" +
+	"\n" +
+	"gemport_id\x18\x06 \x01(\x0fR\tgemportId\x123\n" +
+	"\n" +
+	"classifier\x18\a \x01(\v2\x13.openolt.ClassifierR\n" +
+	"classifier\x12'\n" +
+	"\x06action\x18\b \x01(\v2\x0f.openolt.ActionR\x06action\x12\x1a\n" +
+	"\bpriority\x18\t \x01(\x0fR\bpriority\x12\x16\n" +
+	"\x06cookie\x18\f \x01(\x06R\x06cookie\x12\x17\n" +
+	"\aport_no\x18\r \x01(\aR\x06portNo\x12\x19\n" +
+	"\bgroup_id\x18\x0e \x01(\aR\agroupId\x12&\n" +
+	"\x0ftech_profile_id\x18\x0f \x01(\aR\rtechProfileId\x12%\n" +
+	"\x0ereplicate_flow\x18\x10 \x01(\bR\rreplicateFlow\x12H\n" +
+	"\x0fpbit_to_gemport\x18\x11 \x03(\v2 .openolt.Flow.PbitToGemportEntryR\rpbitToGemport\x12E\n" +
+	"\x0egemport_to_aes\x18\x13 \x03(\v2\x1f.openolt.Flow.GemportToAesEntryR\fgemportToAes\x1a@\n" +
+	"\x12PbitToGemportEntry\x12\x10\n" +
+	"\x03key\x18\x01 \x01(\aR\x03key\x12\x14\n" +
+	"\x05value\x18\x02 \x01(\aR\x05value:\x028\x01\x1a?\n" +
+	"\x11GemportToAesEntry\x12\x10\n" +
+	"\x03key\x18\x01 \x01(\aR\x03key\x12\x14\n" +
+	"\x05value\x18\x02 \x01(\bR\x05value:\x028\x01\"T\n" +
+	"\fSerialNumber\x12\x1b\n" +
+	"\tvendor_id\x18\x01 \x01(\fR\bvendorId\x12'\n" +
+	"\x0fvendor_specific\x18\x02 \x01(\fR\x0evendorSpecific\"\xe6\a\n" +
+	"\rOnuStatistics\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12%\n" +
+	"\x0epositive_drift\x18\x03 \x01(\x06R\rpositiveDrift\x12%\n" +
+	"\x0enegative_drift\x18\x04 \x01(\x06R\rnegativeDrift\x128\n" +
+	"\x18delimiter_miss_detection\x18\x05 \x01(\x06R\x16delimiterMissDetection\x12\x1d\n" +
+	"\n" +
+	"bip_errors\x18\x06 \x01(\x06R\tbipErrors\x12\x1b\n" +
+	"\tbip_units\x18\a \x01(\x06R\bbipUnits\x122\n" +
+	"\x15fec_corrected_symbols\x18\b \x01(\x06R\x13fecCorrectedSymbols\x126\n" +
+	"\x17fec_codewords_corrected\x18\t \x01(\x06R\x15fecCodewordsCorrected\x12>\n" +
+	"\x1bfec_codewords_uncorrectable\x18\n" +
+	" \x01(\x06R\x19fecCodewordsUncorrectable\x12#\n" +
+	"\rfec_codewords\x18\v \x01(\x06R\ffecCodewords\x12.\n" +
+	"\x13fec_corrected_units\x18\f \x01(\x06R\x11fecCorrectedUnits\x12&\n" +
+	"\x0fxgem_key_errors\x18\r \x01(\x06R\rxgemKeyErrors\x12\x1b\n" +
+	"\txgem_loss\x18\x0e \x01(\x06R\bxgemLoss\x12&\n" +
+	"\x0frx_ploams_error\x18\x0f \x01(\x06R\rrxPloamsError\x12+\n" +
+	"\x12rx_ploams_non_idle\x18\x10 \x01(\x06R\x0frxPloamsNonIdle\x12\x17\n" +
+	"\arx_omci\x18\x11 \x01(\x06R\x06rxOmci\x128\n" +
+	"\x19rx_omci_packets_crc_error\x18\x12 \x01(\x06R\x15rxOmciPacketsCrcError\x12\x19\n" +
+	"\brx_bytes\x18\x13 \x01(\x06R\arxBytes\x12\x1d\n" +
+	"\n" +
+	"rx_packets\x18\x14 \x01(\x06R\trxPackets\x12\x19\n" +
+	"\btx_bytes\x18\x15 \x01(\x06R\atxBytes\x12\x1d\n" +
+	"\n" +
+	"tx_packets\x18\x16 \x01(\x06R\ttxPackets\x12!\n" +
+	"\fber_reported\x18\x17 \x01(\x06R\vberReported\x12\x1f\n" +
+	"\vlcdg_errors\x18\x18 \x01(\x06R\n" +
+	"lcdgErrors\x12\x1d\n" +
+	"\n" +
+	"rdi_errors\x18\x19 \x01(\x06R\trdiErrors\x12\x1c\n" +
+	"\ttimestamp\x18\x1a \x01(\aR\ttimestamp\"\xdd\x01\n" +
+	"\x11GemPortStatistics\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x1d\n" +
+	"\n" +
+	"gemport_id\x18\x02 \x01(\aR\tgemportId\x12\x1d\n" +
+	"\n" +
+	"rx_packets\x18\x03 \x01(\x06R\trxPackets\x12\x19\n" +
+	"\brx_bytes\x18\x04 \x01(\x06R\arxBytes\x12\x1d\n" +
+	"\n" +
+	"tx_packets\x18\x05 \x01(\x06R\ttxPackets\x12\x19\n" +
+	"\btx_bytes\x18\x06 \x01(\x06R\atxBytes\x12\x1c\n" +
+	"\ttimestamp\x18\x1a \x01(\aR\ttimestamp\"\xbb\x01\n" +
+	"\x0eFlowStatistics\x12\x17\n" +
+	"\aflow_id\x18\x01 \x01(\aR\x06flowId\x12\x19\n" +
+	"\brx_bytes\x18\x02 \x01(\x06R\arxBytes\x12\x1d\n" +
+	"\n" +
+	"rx_packets\x18\x03 \x01(\x06R\trxPackets\x12\x19\n" +
+	"\btx_bytes\x18\b \x01(\x06R\atxBytes\x12\x1d\n" +
+	"\n" +
+	"tx_packets\x18\t \x01(\x06R\ttxPackets\x12\x1c\n" +
+	"\ttimestamp\x18\x10 \x01(\aR\ttimestamp\"@\n" +
+	"\rLosIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x16\n" +
+	"\x06status\x18\x02 \x01(\tR\x06status\"]\n" +
+	"\x13DyingGaspIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\"\xa3\x02\n" +
+	"\x12OnuAlarmIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x1d\n" +
+	"\n" +
+	"los_status\x18\x03 \x01(\tR\tlosStatus\x12\x1d\n" +
+	"\n" +
+	"lob_status\x18\x04 \x01(\tR\tlobStatus\x12(\n" +
+	"\x10lopc_miss_status\x18\x05 \x01(\tR\x0elopcMissStatus\x121\n" +
+	"\x15lopc_mic_error_status\x18\x06 \x01(\tR\x12lopcMicErrorStatus\x12\x1f\n" +
+	"\vlofi_status\x18\a \x01(\tR\n" +
+	"lofiStatus\x12!\n" +
+	"\floami_status\x18\b \x01(\tR\vloamiStatus\"e\n" +
+	"\x1bOnuStartupFailureIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\"\x99\x01\n" +
+	"\x1aOnuSignalDegradeIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\x123\n" +
+	"\x16inverse_bit_error_rate\x18\x04 \x01(\aR\x13inverseBitErrorRate\"\x93\x01\n" +
+	"\x1aOnuDriftOfWindowIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\x12\x14\n" +
+	"\x05drift\x18\x04 \x01(\aR\x05drift\x12\x17\n" +
+	"\anew_eqd\x18\x05 \x01(\aR\x06newEqd\"h\n" +
+	"\x1eOnuLossOfOmciChannelIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\"\x9a\x01\n" +
+	"\x1bOnuSignalsFailureIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\x123\n" +
+	"\x16inverse_bit_error_rate\x18\x04 \x01(\aR\x13inverseBitErrorRate\"\x82\x01\n" +
+	"\"OnuTransmissionInterferenceWarning\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\x12\x14\n" +
+	"\x05drift\x18\x04 \x01(\aR\x05drift\"q\n" +
+	"\x1eOnuActivationFailureIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x1f\n" +
+	"\vfail_reason\x18\x03 \x01(\aR\n" +
+	"failReason\"k\n" +
+	"!OnuLossOfKeySyncFailureIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\"T\n" +
+	"\x12RdiErrorIndication\x12&\n" +
+	"\x0frdi_error_count\x18\x01 \x01(\x06R\rrdiErrorCount\x12\x16\n" +
+	"\x06status\x18\x02 \x01(\tR\x06status\"\x96\x01\n" +
+	"\x18OnuItuPonStatsIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12A\n" +
+	"\rrdi_error_ind\x18\x03 \x01(\v2\x1b.openolt.RdiErrorIndicationH\x00R\vrdiErrorIndB\a\n" +
+	"\x05stats\"N\n" +
+	"\x1cOnuProcessingErrorIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\"j\n" +
+	" OnuDeactivationFailureIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\"j\n" +
+	"\x19OnuRemoteDefectIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x1d\n" +
+	"\n" +
+	"rdi_errors\x18\x03 \x01(\x06R\trdiErrors\"\xa1\x01\n" +
+	"(OnuLossOfGEMChannelDelineationIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\x12-\n" +
+	"\x12delineation_errors\x18\x04 \x01(\aR\x11delineationErrors\"m\n" +
+	"#OnuPhysicalEquipmentErrorIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\"l\n" +
+	"\"OnuLossOfAcknowledgementIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\"\x8c\x01\n" +
+	"&OnuDifferentialReachExceededIndication\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\x12\x1a\n" +
+	"\bdistance\x18\x04 \x01(\aR\bdistance\"\xf6\x01\n" +
+	"\vGroupMember\x12!\n" +
+	"\finterface_id\x18\x01 \x01(\rR\vinterfaceId\x12I\n" +
+	"\x0einterface_type\x18\x02 \x01(\x0e2\".openolt.GroupMember.InterfaceTypeR\rinterfaceType\x12\x1e\n" +
+	"\vgem_port_id\x18\x03 \x01(\rR\tgemPortId\x12\x1a\n" +
+	"\bpriority\x18\x04 \x01(\rR\bpriority\"=\n" +
+	"\rInterfaceType\x12\a\n" +
+	"\x03PON\x10\x00\x12\x10\n" +
+	"\fEPON_1G_PATH\x10\x01\x12\x11\n" +
+	"\rEPON_10G_PATH\x10\x02\"\x86\x02\n" +
+	"\x05Group\x12\x19\n" +
+	"\bgroup_id\x18\x01 \x01(\rR\agroupId\x12<\n" +
+	"\acommand\x18\x02 \x01(\x0e2\".openolt.Group.GroupMembersCommandR\acommand\x12.\n" +
+	"\amembers\x18\x03 \x03(\v2\x14.openolt.GroupMemberR\amembers\x12'\n" +
+	"\x06action\x18\x04 \x01(\v2\x0f.openolt.ActionR\x06action\"K\n" +
+	"\x13GroupMembersCommand\x12\x0f\n" +
+	"\vADD_MEMBERS\x10\x00\x12\x12\n" +
+	"\x0eREMOVE_MEMBERS\x10\x01\x12\x0f\n" +
+	"\vSET_MEMBERS\x10\x02\"]\n" +
+	"\n" +
+	"ValueParam\x12\x1e\n" +
+	"\x03onu\x18\x01 \x01(\v2\f.openolt.OnuR\x03onu\x12/\n" +
+	"\x05value\x18\x02 \x01(\x0e2\x19.extension.ValueType.TypeR\x05value\"\xc3\x02\n" +
+	"\x0ePonRxPowerData\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\x12\x16\n" +
+	"\x06status\x18\x03 \x01(\tR\x06status\x12R\n" +
+	"\vfail_reason\x18\x04 \x01(\x0e21.openolt.PonRxPowerData.RssiMeasurementFailReasonR\n" +
+	"failReason\x12)\n" +
+	"\x11rx_power_mean_dbm\x18\x05 \x01(\x01R\x0erxPowerMeanDbm\"j\n" +
+	"\x19RssiMeasurementFailReason\x12\x14\n" +
+	"\x10FAIL_REASON_NONE\x10\x00\x12\x1c\n" +
+	"\x18FAIL_REASON_NO_DELIMITER\x10\x01\x12\x19\n" +
+	"\x15FAIL_REASON_NO_ACCESS\x10\x02\"b\n" +
+	"\x14OnuAllocIdStatistics\x12\x16\n" +
+	"\x06intfId\x18\x01 \x01(\aR\x06intfId\x12\x18\n" +
+	"\aallocId\x18\x02 \x01(\aR\aallocId\x12\x18\n" +
+	"\arxBytes\x18\x03 \x01(\x06R\arxBytes\"\xa3\x02\n" +
+	"\aOnuInfo\x12\x15\n" +
+	"\x06onu_id\x18\x01 \x01(\aR\x05onuId\x12/\n" +
+	"\x05state\x18\x02 \x01(\x0e2\x19.openolt.OnuInfo.OnuStateR\x05state\x12'\n" +
+	"\x04losi\x18\x03 \x01(\x0e2\x13.openolt.AlarmStateR\x04losi\x12'\n" +
+	"\x04lofi\x18\x04 \x01(\x0e2\x13.openolt.AlarmStateR\x04lofi\x12)\n" +
+	"\x05loami\x18\x05 \x01(\x0e2\x13.openolt.AlarmStateR\x05loami\"S\n" +
+	"\bOnuState\x12\v\n" +
+	"\aUNKNOWN\x10\x00\x12\x12\n" +
+	"\x0eNOT_CONFIGURED\x10\x01\x12\n" +
+	"\n" +
+	"\x06ACTIVE\x10\x02\x12\f\n" +
+	"\bINACTIVE\x10\x03\x12\f\n" +
+	"\bDISABLED\x10\x04\"\xe7\x01\n" +
+	"\vPonIntfInfo\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x127\n" +
+	"\x05state\x18\x03 \x01(\x0e2!.openolt.PonIntfInfo.PonIntfStateR\x05state\x12%\n" +
+	"\x03los\x18\x04 \x01(\x0e2\x13.openolt.AlarmStateR\x03los\"_\n" +
+	"\fPonIntfState\x12\v\n" +
+	"\aUNKNOWN\x10\x00\x12\x12\n" +
+	"\x0eACTIVE_WORKING\x10\x01\x12\x12\n" +
+	"\x0eACTIVE_STANDBY\x10\x02\x12\f\n" +
+	"\bINACTIVE\x10\x03\x12\f\n" +
+	"\bDISABLED\x10\x04\"\x86\x01\n" +
+	"\x1dInterfaceOnuSerialNumberOnuId\x12N\n" +
+	"\x12intf_id_serial_num\x18\x01 \x01(\v2!.openolt.InterfaceOnuSerialNumberR\x0fintfIdSerialNum\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\"v\n" +
+	"\x18InterfaceOnuSerialNumber\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12A\n" +
+	"\x11onu_serial_number\x18\x02 \x01(\v2\x15.openolt.SerialNumberR\x0fonuSerialNumber\"\a\n" +
+	"\x05Empty*\x1d\n" +
+	"\n" +
+	"AlarmState\x12\a\n" +
+	"\x03OFF\x10\x00\x12\x06\n" +
+	"\x02ON\x10\x012\xa6\x1b\n" +
+	"\aOpenolt\x12D\n" +
+	"\n" +
+	"DisableOlt\x12\x0e.openolt.Empty\x1a\x0e.openolt.Empty\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\"\v/v1/Disable\x12F\n" +
+	"\vReenableOlt\x12\x0e.openolt.Empty\x1a\x0e.openolt.Empty\"\x17\x82\xd3\xe4\x93\x02\x11:\x01*\"\f/v1/Reenable\x12E\n" +
+	"\vActivateOnu\x12\f.openolt.Onu\x1a\x0e.openolt.Empty\"\x18\x82\xd3\xe4\x93\x02\x12:\x01*\"\r/v1/EnableOnu\x12H\n" +
+	"\rDeactivateOnu\x12\f.openolt.Onu\x1a\x0e.openolt.Empty\"\x19\x82\xd3\xe4\x93\x02\x13:\x01*\"\x0e/v1/DisableOnu\x12C\n" +
+	"\tDeleteOnu\x12\f.openolt.Onu\x1a\x0e.openolt.Empty\"\x18\x82\xd3\xe4\x93\x02\x12:\x01*\"\r/v1/DeleteOnu\x12I\n" +
+	"\n" +
+	"OmciMsgOut\x12\x10.openolt.OmciMsg\x1a\x0e.openolt.Empty\"\x19\x82\xd3\xe4\x93\x02\x13:\x01*\"\x0e/v1/OmciMsgOut\x12O\n" +
+	"\fOnuPacketOut\x12\x12.openolt.OnuPacket\x1a\x0e.openolt.Empty\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\"\x10/v1/OnuPacketOut\x12X\n" +
+	"\x0fUplinkPacketOut\x12\x15.openolt.UplinkPacket\x1a\x0e.openolt.Empty\"\x1e\x82\xd3\xe4\x93\x02\x18:\x01*\"\x13/v1/UplinkPacketOut\x12@\n" +
+	"\aFlowAdd\x12\r.openolt.Flow\x1a\x0e.openolt.Empty\"\x16\x82\xd3\xe4\x93\x02\x10:\x01*\"\v/v1/FlowAdd\x12F\n" +
+	"\n" +
+	"FlowRemove\x12\r.openolt.Flow\x1a\x0e.openolt.Empty\"\x19\x82\xd3\xe4\x93\x02\x13:\x01*\"\x0e/v1/FlowRemove\x12S\n" +
+	"\x0eHeartbeatCheck\x12\x0e.openolt.Empty\x1a\x12.openolt.Heartbeat\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/v1/HeartbeatCheck\x12M\n" +
+	"\vEnablePonIf\x12\x12.openolt.Interface\x1a\x0e.openolt.Empty\"\x1a\x82\xd3\xe4\x93\x02\x14:\x01*\"\x0f/v1/EnablePonIf\x12O\n" +
+	"\fDisablePonIf\x12\x12.openolt.Interface\x1a\x0e.openolt.Empty\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\"\x10/v1/DisablePonIf\x12R\n" +
+	"\rGetDeviceInfo\x12\x0e.openolt.Empty\x1a\x13.openolt.DeviceInfo\"\x1c\x82\xd3\xe4\x93\x02\x16:\x01*\"\x11/v1/GetDeviceInfo\x12?\n" +
+	"\x06Reboot\x12\x0e.openolt.Empty\x1a\x0e.openolt.Empty\"\x15\x82\xd3\xe4\x93\x02\x0f:\x01*\"\n" +
+	"/v1/Reboot\x12U\n" +
+	"\x11CollectStatistics\x12\x0e.openolt.Empty\x1a\x0e.openolt.Empty\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/v1/CollectStatistics\x12Y\n" +
+	"\x10GetOnuStatistics\x12\f.openolt.Onu\x1a\x16.openolt.OnuStatistics\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\"\x14/v1/GetOnuStatistics\x12k\n" +
+	"\x14GetGemPortStatistics\x12\x12.openolt.OnuPacket\x1a\x1a.openolt.GemPortStatistics\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v1/GetGemPortStatistics\x12r\n" +
+	"\x17CreateTrafficSchedulers\x12\x1f.tech_profile.TrafficSchedulers\x1a\x0e.openolt.Empty\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/v1/CreateTrafficSchedulers\x12r\n" +
+	"\x17RemoveTrafficSchedulers\x12\x1f.tech_profile.TrafficSchedulers\x1a\x0e.openolt.Empty\"&\x82\xd3\xe4\x93\x02 :\x01*\"\x1b/v1/RemoveTrafficSchedulers\x12f\n" +
+	"\x13CreateTrafficQueues\x12\x1b.tech_profile.TrafficQueues\x1a\x0e.openolt.Empty\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v1/CreateTrafficQueues\x12f\n" +
+	"\x13RemoveTrafficQueues\x12\x1b.tech_profile.TrafficQueues\x1a\x0e.openolt.Empty\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/v1/RemoveTrafficQueues\x12;\n" +
+	"\x10EnableIndication\x12\x0e.openolt.Empty\x1a\x13.openolt.Indication\"\x000\x01\x12]\n" +
+	"\x15PerformGroupOperation\x12\x0e.openolt.Group\x1a\x0e.openolt.Empty\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/v1/PerformGroupOperation\x12I\n" +
+	"\vDeleteGroup\x12\x0e.openolt.Group\x1a\x0e.openolt.Empty\"\x1a\x82\xd3\xe4\x93\x02\x14:\x01*\"\x0f/v1/DeleteGroup\x12W\n" +
+	"\vGetExtValue\x12\x13.openolt.ValueParam\x1a\x17.extension.ReturnValues\"\x1a\x82\xd3\xe4\x93\x02\x14:\x01*\"\x0f/v1/GetExtValue\x12]\n" +
+	"\x11OnuItuPonAlarmSet\x12\x16.config.OnuItuPonAlarm\x1a\x0e.openolt.Empty\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/v1/OnuItuPonAlarmSet\x12p\n" +
+	"\x19GetLogicalOnuDistanceZero\x12\f.openolt.Onu\x1a\x1b.openolt.OnuLogicalDistance\"(\x82\xd3\xe4\x93\x02\":\x01*\"\x1d/v1/GetLogicalOnuDistanceZero\x12h\n" +
+	"\x15GetLogicalOnuDistance\x12\f.openolt.Onu\x1a\x1b.openolt.OnuLogicalDistance\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/v1/GetLogicalOnuDistance\x12T\n" +
+	"\rGetPonRxPower\x12\f.openolt.Onu\x1a\x17.openolt.PonRxPowerData\"\x1c\x82\xd3\xe4\x93\x02\x16:\x01*\"\x11/v1/GetPonRxPower\x12G\n" +
+	"\n" +
+	"GetOnuInfo\x12\f.openolt.Onu\x1a\x10.openolt.OnuInfo\"\x19\x82\xd3\xe4\x93\x02\x13:\x01*\"\x0e/v1/GetOnuInfo\x12`\n" +
+	"\x13GetPonInterfaceInfo\x12\x12.openolt.Interface\x1a\x14.openolt.PonIntfInfo\"\x1f\x82\xd3\xe4\x93\x02\x19:\x01*\"\x14/v1/GetInterfaceInfo\x12n\n" +
+	"\x14GetAllocIdStatistics\x12\x12.openolt.OnuPacket\x1a\x1d.openolt.OnuAllocIdStatistics\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v1/GetAllocIdStatistics\x12g\n" +
+	"\x14GetPonPortStatistics\x12\x12.openolt.Interface\x1a\x16.common.PortStatistics\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v1/GetPonPortStatistics\x12g\n" +
+	"\x14GetNniPortStatistics\x12\x12.openolt.Interface\x1a\x16.common.PortStatistics\"#\x82\xd3\xe4\x93\x02\x1d:\x01*\"\x18/v1/GetNniPortStatistics\x12\\\n" +
+	"\n" +
+	"DisableOnu\x12&.openolt.InterfaceOnuSerialNumberOnuId\x1a\x0e.openolt.Empty\"\x16\x82\xd3\xe4\x93\x02\x10\"\x0e/v1/DisableOnu\x12Z\n" +
+	"\tEnableOnu\x12&.openolt.InterfaceOnuSerialNumberOnuId\x1a\x0e.openolt.Empty\"\x15\x82\xd3\xe4\x93\x02\x0f\"\r/v1/EnableOnu\x12o\n" +
+	"\x16DisableOnuSerialNumber\x12!.openolt.InterfaceOnuSerialNumber\x1a\x0e.openolt.Empty\"\"\x82\xd3\xe4\x93\x02\x1c\"\x1a/v1/DisableOnuSerialNumber\x12m\n" +
+	"\x15EnableOnuSerialNumber\x12!.openolt.InterfaceOnuSerialNumber\x1a\x0e.openolt.Empty\"!\x82\xd3\xe4\x93\x02\x1b\"\x19/v1/EnableOnuSerialNumberB]\n" +
+	"\x1borg.opencord.voltha.openoltB\rVolthaOpenOLTZ/github.com/opencord/voltha-protos/v5/go/openoltb\x06proto3"
+
+var (
+	file_voltha_protos_openolt_proto_rawDescOnce sync.Once
+	file_voltha_protos_openolt_proto_rawDescData []byte
+)
+
+func file_voltha_protos_openolt_proto_rawDescGZIP() []byte {
+	file_voltha_protos_openolt_proto_rawDescOnce.Do(func() {
+		file_voltha_protos_openolt_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_voltha_protos_openolt_proto_rawDesc), len(file_voltha_protos_openolt_proto_rawDesc)))
+	})
+	return file_voltha_protos_openolt_proto_rawDescData
+}
+
+var file_voltha_protos_openolt_proto_enumTypes = make([]protoimpl.EnumInfo, 10)
+var file_voltha_protos_openolt_proto_msgTypes = make([]protoimpl.MessageInfo, 63)
+var file_voltha_protos_openolt_proto_goTypes = []any{
+	(AlarmState)(0),                                         // 0: openolt.AlarmState
+	(OnuIndication_ActivationFailReason)(0),                 // 1: openolt.OnuIndication.ActivationFailReason
+	(IntfOperIndication_PONResourceRanges_Pool_PoolType)(0), // 2: openolt.IntfOperIndication.PONResourceRanges.Pool.PoolType
+	(DeviceInfo_DeviceResourceRanges_Pool_PoolType)(0),      // 3: openolt.DeviceInfo.DeviceResourceRanges.Pool.PoolType
+	(DeviceInfo_DeviceResourceRanges_Pool_SharingType)(0),   // 4: openolt.DeviceInfo.DeviceResourceRanges.Pool.SharingType
+	(GroupMember_InterfaceType)(0),                          // 5: openolt.GroupMember.InterfaceType
+	(Group_GroupMembersCommand)(0),                          // 6: openolt.Group.GroupMembersCommand
+	(PonRxPowerData_RssiMeasurementFailReason)(0),           // 7: openolt.PonRxPowerData.RssiMeasurementFailReason
+	(OnuInfo_OnuState)(0),                                   // 8: openolt.OnuInfo.OnuState
+	(PonIntfInfo_PonIntfState)(0),                           // 9: openolt.PonIntfInfo.PonIntfState
+	(*Indication)(nil),                                      // 10: openolt.Indication
+	(*AlarmIndication)(nil),                                 // 11: openolt.AlarmIndication
+	(*OltIndication)(nil),                                   // 12: openolt.OltIndication
+	(*IntfIndication)(nil),                                  // 13: openolt.IntfIndication
+	(*OnuDiscIndication)(nil),                               // 14: openolt.OnuDiscIndication
+	(*OnuIndication)(nil),                                   // 15: openolt.OnuIndication
+	(*OnuDisabledIndication)(nil),                           // 16: openolt.OnuDisabledIndication
+	(*OnuEnabledIndication)(nil),                            // 17: openolt.OnuEnabledIndication
+	(*IntfOperIndication)(nil),                              // 18: openolt.IntfOperIndication
+	(*OmciIndication)(nil),                                  // 19: openolt.OmciIndication
+	(*PacketIndication)(nil),                                // 20: openolt.PacketIndication
+	(*Interface)(nil),                                       // 21: openolt.Interface
+	(*Heartbeat)(nil),                                       // 22: openolt.Heartbeat
+	(*Onu)(nil),                                             // 23: openolt.Onu
+	(*OnuLogicalDistance)(nil),                              // 24: openolt.OnuLogicalDistance
+	(*OmciMsg)(nil),                                         // 25: openolt.OmciMsg
+	(*OnuPacket)(nil),                                       // 26: openolt.OnuPacket
+	(*UplinkPacket)(nil),                                    // 27: openolt.UplinkPacket
+	(*DeviceInfo)(nil),                                      // 28: openolt.DeviceInfo
+	(*Classifier)(nil),                                      // 29: openolt.Classifier
+	(*ActionCmd)(nil),                                       // 30: openolt.ActionCmd
+	(*Action)(nil),                                          // 31: openolt.Action
+	(*Flow)(nil),                                            // 32: openolt.Flow
+	(*SerialNumber)(nil),                                    // 33: openolt.SerialNumber
+	(*OnuStatistics)(nil),                                   // 34: openolt.OnuStatistics
+	(*GemPortStatistics)(nil),                               // 35: openolt.GemPortStatistics
+	(*FlowStatistics)(nil),                                  // 36: openolt.FlowStatistics
+	(*LosIndication)(nil),                                   // 37: openolt.LosIndication
+	(*DyingGaspIndication)(nil),                             // 38: openolt.DyingGaspIndication
+	(*OnuAlarmIndication)(nil),                              // 39: openolt.OnuAlarmIndication
+	(*OnuStartupFailureIndication)(nil),                     // 40: openolt.OnuStartupFailureIndication
+	(*OnuSignalDegradeIndication)(nil),                      // 41: openolt.OnuSignalDegradeIndication
+	(*OnuDriftOfWindowIndication)(nil),                      // 42: openolt.OnuDriftOfWindowIndication
+	(*OnuLossOfOmciChannelIndication)(nil),                  // 43: openolt.OnuLossOfOmciChannelIndication
+	(*OnuSignalsFailureIndication)(nil),                     // 44: openolt.OnuSignalsFailureIndication
+	(*OnuTransmissionInterferenceWarning)(nil),              // 45: openolt.OnuTransmissionInterferenceWarning
+	(*OnuActivationFailureIndication)(nil),                  // 46: openolt.OnuActivationFailureIndication
+	(*OnuLossOfKeySyncFailureIndication)(nil),               // 47: openolt.OnuLossOfKeySyncFailureIndication
+	(*RdiErrorIndication)(nil),                              // 48: openolt.RdiErrorIndication
+	(*OnuItuPonStatsIndication)(nil),                        // 49: openolt.OnuItuPonStatsIndication
+	(*OnuProcessingErrorIndication)(nil),                    // 50: openolt.OnuProcessingErrorIndication
+	(*OnuDeactivationFailureIndication)(nil),                // 51: openolt.OnuDeactivationFailureIndication
+	(*OnuRemoteDefectIndication)(nil),                       // 52: openolt.OnuRemoteDefectIndication
+	(*OnuLossOfGEMChannelDelineationIndication)(nil),        // 53: openolt.OnuLossOfGEMChannelDelineationIndication
+	(*OnuPhysicalEquipmentErrorIndication)(nil),             // 54: openolt.OnuPhysicalEquipmentErrorIndication
+	(*OnuLossOfAcknowledgementIndication)(nil),              // 55: openolt.OnuLossOfAcknowledgementIndication
+	(*OnuDifferentialReachExceededIndication)(nil),          // 56: openolt.OnuDifferentialReachExceededIndication
+	(*GroupMember)(nil),                                     // 57: openolt.GroupMember
+	(*Group)(nil),                                           // 58: openolt.Group
+	(*ValueParam)(nil),                                      // 59: openolt.ValueParam
+	(*PonRxPowerData)(nil),                                  // 60: openolt.PonRxPowerData
+	(*OnuAllocIdStatistics)(nil),                            // 61: openolt.OnuAllocIdStatistics
+	(*OnuInfo)(nil),                                         // 62: openolt.OnuInfo
+	(*PonIntfInfo)(nil),                                     // 63: openolt.PonIntfInfo
+	(*InterfaceOnuSerialNumberOnuId)(nil),                   // 64: openolt.InterfaceOnuSerialNumberOnuId
+	(*InterfaceOnuSerialNumber)(nil),                        // 65: openolt.InterfaceOnuSerialNumber
+	(*Empty)(nil),                                           // 66: openolt.Empty
+	(*IntfOperIndication_PONResourceRanges)(nil),            // 67: openolt.IntfOperIndication.PONResourceRanges
+	(*IntfOperIndication_PONResourceRanges_Pool)(nil),       // 68: openolt.IntfOperIndication.PONResourceRanges.Pool
+	(*DeviceInfo_DeviceResourceRanges)(nil),                 // 69: openolt.DeviceInfo.DeviceResourceRanges
+	(*DeviceInfo_DeviceResourceRanges_Pool)(nil),            // 70: openolt.DeviceInfo.DeviceResourceRanges.Pool
+	nil,                                    // 71: openolt.Flow.PbitToGemportEntry
+	nil,                                    // 72: openolt.Flow.GemportToAesEntry
+	(*common.PortStatistics)(nil),          // 73: common.PortStatistics
+	(extension.ValueType_Type)(0),          // 74: extension.ValueType.Type
+	(*tech_profile.TrafficSchedulers)(nil), // 75: tech_profile.TrafficSchedulers
+	(*tech_profile.TrafficQueues)(nil),     // 76: tech_profile.TrafficQueues
+	(*config.OnuItuPonAlarm)(nil),          // 77: config.OnuItuPonAlarm
+	(*extension.ReturnValues)(nil),         // 78: extension.ReturnValues
+}
+var file_voltha_protos_openolt_proto_depIdxs = []int32{
+	12,  // 0: openolt.Indication.olt_ind:type_name -> openolt.OltIndication
+	13,  // 1: openolt.Indication.intf_ind:type_name -> openolt.IntfIndication
+	18,  // 2: openolt.Indication.intf_oper_ind:type_name -> openolt.IntfOperIndication
+	14,  // 3: openolt.Indication.onu_disc_ind:type_name -> openolt.OnuDiscIndication
+	15,  // 4: openolt.Indication.onu_ind:type_name -> openolt.OnuIndication
+	19,  // 5: openolt.Indication.omci_ind:type_name -> openolt.OmciIndication
+	20,  // 6: openolt.Indication.pkt_ind:type_name -> openolt.PacketIndication
+	73,  // 7: openolt.Indication.port_stats:type_name -> common.PortStatistics
+	36,  // 8: openolt.Indication.flow_stats:type_name -> openolt.FlowStatistics
+	11,  // 9: openolt.Indication.alarm_ind:type_name -> openolt.AlarmIndication
+	16,  // 10: openolt.Indication.onu_disabled_ind:type_name -> openolt.OnuDisabledIndication
+	17,  // 11: openolt.Indication.onu_enabled_ind:type_name -> openolt.OnuEnabledIndication
+	37,  // 12: openolt.AlarmIndication.los_ind:type_name -> openolt.LosIndication
+	38,  // 13: openolt.AlarmIndication.dying_gasp_ind:type_name -> openolt.DyingGaspIndication
+	39,  // 14: openolt.AlarmIndication.onu_alarm_ind:type_name -> openolt.OnuAlarmIndication
+	40,  // 15: openolt.AlarmIndication.onu_startup_fail_ind:type_name -> openolt.OnuStartupFailureIndication
+	41,  // 16: openolt.AlarmIndication.onu_signal_degrade_ind:type_name -> openolt.OnuSignalDegradeIndication
+	42,  // 17: openolt.AlarmIndication.onu_drift_of_window_ind:type_name -> openolt.OnuDriftOfWindowIndication
+	43,  // 18: openolt.AlarmIndication.onu_loss_omci_ind:type_name -> openolt.OnuLossOfOmciChannelIndication
+	44,  // 19: openolt.AlarmIndication.onu_signals_fail_ind:type_name -> openolt.OnuSignalsFailureIndication
+	45,  // 20: openolt.AlarmIndication.onu_tiwi_ind:type_name -> openolt.OnuTransmissionInterferenceWarning
+	46,  // 21: openolt.AlarmIndication.onu_activation_fail_ind:type_name -> openolt.OnuActivationFailureIndication
+	50,  // 22: openolt.AlarmIndication.onu_processing_error_ind:type_name -> openolt.OnuProcessingErrorIndication
+	47,  // 23: openolt.AlarmIndication.onu_loss_of_sync_fail_ind:type_name -> openolt.OnuLossOfKeySyncFailureIndication
+	49,  // 24: openolt.AlarmIndication.onu_itu_pon_stats_ind:type_name -> openolt.OnuItuPonStatsIndication
+	51,  // 25: openolt.AlarmIndication.onu_deactivation_failure_ind:type_name -> openolt.OnuDeactivationFailureIndication
+	52,  // 26: openolt.AlarmIndication.onu_remote_defect_ind:type_name -> openolt.OnuRemoteDefectIndication
+	53,  // 27: openolt.AlarmIndication.onu_loss_gem_delineation_ind:type_name -> openolt.OnuLossOfGEMChannelDelineationIndication
+	54,  // 28: openolt.AlarmIndication.onu_physical_equipment_error_ind:type_name -> openolt.OnuPhysicalEquipmentErrorIndication
+	55,  // 29: openolt.AlarmIndication.onu_loss_of_ack_ind:type_name -> openolt.OnuLossOfAcknowledgementIndication
+	56,  // 30: openolt.AlarmIndication.onu_diff_reach_exceeded_ind:type_name -> openolt.OnuDifferentialReachExceededIndication
+	33,  // 31: openolt.OnuDiscIndication.serial_number:type_name -> openolt.SerialNumber
+	33,  // 32: openolt.OnuIndication.serial_number:type_name -> openolt.SerialNumber
+	1,   // 33: openolt.OnuIndication.fail_reason:type_name -> openolt.OnuIndication.ActivationFailReason
+	33,  // 34: openolt.OnuDisabledIndication.serial_number:type_name -> openolt.SerialNumber
+	33,  // 35: openolt.OnuEnabledIndication.serial_number:type_name -> openolt.SerialNumber
+	67,  // 36: openolt.IntfOperIndication.ranges:type_name -> openolt.IntfOperIndication.PONResourceRanges
+	33,  // 37: openolt.Onu.serial_number:type_name -> openolt.SerialNumber
+	69,  // 38: openolt.DeviceInfo.ranges:type_name -> openolt.DeviceInfo.DeviceResourceRanges
+	30,  // 39: openolt.Action.cmd:type_name -> openolt.ActionCmd
+	29,  // 40: openolt.Flow.classifier:type_name -> openolt.Classifier
+	31,  // 41: openolt.Flow.action:type_name -> openolt.Action
+	71,  // 42: openolt.Flow.pbit_to_gemport:type_name -> openolt.Flow.PbitToGemportEntry
+	72,  // 43: openolt.Flow.gemport_to_aes:type_name -> openolt.Flow.GemportToAesEntry
+	48,  // 44: openolt.OnuItuPonStatsIndication.rdi_error_ind:type_name -> openolt.RdiErrorIndication
+	5,   // 45: openolt.GroupMember.interface_type:type_name -> openolt.GroupMember.InterfaceType
+	6,   // 46: openolt.Group.command:type_name -> openolt.Group.GroupMembersCommand
+	57,  // 47: openolt.Group.members:type_name -> openolt.GroupMember
+	31,  // 48: openolt.Group.action:type_name -> openolt.Action
+	23,  // 49: openolt.ValueParam.onu:type_name -> openolt.Onu
+	74,  // 50: openolt.ValueParam.value:type_name -> extension.ValueType.Type
+	7,   // 51: openolt.PonRxPowerData.fail_reason:type_name -> openolt.PonRxPowerData.RssiMeasurementFailReason
+	8,   // 52: openolt.OnuInfo.state:type_name -> openolt.OnuInfo.OnuState
+	0,   // 53: openolt.OnuInfo.losi:type_name -> openolt.AlarmState
+	0,   // 54: openolt.OnuInfo.lofi:type_name -> openolt.AlarmState
+	0,   // 55: openolt.OnuInfo.loami:type_name -> openolt.AlarmState
+	9,   // 56: openolt.PonIntfInfo.state:type_name -> openolt.PonIntfInfo.PonIntfState
+	0,   // 57: openolt.PonIntfInfo.los:type_name -> openolt.AlarmState
+	65,  // 58: openolt.InterfaceOnuSerialNumberOnuId.intf_id_serial_num:type_name -> openolt.InterfaceOnuSerialNumber
+	33,  // 59: openolt.InterfaceOnuSerialNumber.onu_serial_number:type_name -> openolt.SerialNumber
+	68,  // 60: openolt.IntfOperIndication.PONResourceRanges.pools:type_name -> openolt.IntfOperIndication.PONResourceRanges.Pool
+	2,   // 61: openolt.IntfOperIndication.PONResourceRanges.Pool.type:type_name -> openolt.IntfOperIndication.PONResourceRanges.Pool.PoolType
+	70,  // 62: openolt.DeviceInfo.DeviceResourceRanges.pools:type_name -> openolt.DeviceInfo.DeviceResourceRanges.Pool
+	3,   // 63: openolt.DeviceInfo.DeviceResourceRanges.Pool.type:type_name -> openolt.DeviceInfo.DeviceResourceRanges.Pool.PoolType
+	4,   // 64: openolt.DeviceInfo.DeviceResourceRanges.Pool.sharing:type_name -> openolt.DeviceInfo.DeviceResourceRanges.Pool.SharingType
+	66,  // 65: openolt.Openolt.DisableOlt:input_type -> openolt.Empty
+	66,  // 66: openolt.Openolt.ReenableOlt:input_type -> openolt.Empty
+	23,  // 67: openolt.Openolt.ActivateOnu:input_type -> openolt.Onu
+	23,  // 68: openolt.Openolt.DeactivateOnu:input_type -> openolt.Onu
+	23,  // 69: openolt.Openolt.DeleteOnu:input_type -> openolt.Onu
+	25,  // 70: openolt.Openolt.OmciMsgOut:input_type -> openolt.OmciMsg
+	26,  // 71: openolt.Openolt.OnuPacketOut:input_type -> openolt.OnuPacket
+	27,  // 72: openolt.Openolt.UplinkPacketOut:input_type -> openolt.UplinkPacket
+	32,  // 73: openolt.Openolt.FlowAdd:input_type -> openolt.Flow
+	32,  // 74: openolt.Openolt.FlowRemove:input_type -> openolt.Flow
+	66,  // 75: openolt.Openolt.HeartbeatCheck:input_type -> openolt.Empty
+	21,  // 76: openolt.Openolt.EnablePonIf:input_type -> openolt.Interface
+	21,  // 77: openolt.Openolt.DisablePonIf:input_type -> openolt.Interface
+	66,  // 78: openolt.Openolt.GetDeviceInfo:input_type -> openolt.Empty
+	66,  // 79: openolt.Openolt.Reboot:input_type -> openolt.Empty
+	66,  // 80: openolt.Openolt.CollectStatistics:input_type -> openolt.Empty
+	23,  // 81: openolt.Openolt.GetOnuStatistics:input_type -> openolt.Onu
+	26,  // 82: openolt.Openolt.GetGemPortStatistics:input_type -> openolt.OnuPacket
+	75,  // 83: openolt.Openolt.CreateTrafficSchedulers:input_type -> tech_profile.TrafficSchedulers
+	75,  // 84: openolt.Openolt.RemoveTrafficSchedulers:input_type -> tech_profile.TrafficSchedulers
+	76,  // 85: openolt.Openolt.CreateTrafficQueues:input_type -> tech_profile.TrafficQueues
+	76,  // 86: openolt.Openolt.RemoveTrafficQueues:input_type -> tech_profile.TrafficQueues
+	66,  // 87: openolt.Openolt.EnableIndication:input_type -> openolt.Empty
+	58,  // 88: openolt.Openolt.PerformGroupOperation:input_type -> openolt.Group
+	58,  // 89: openolt.Openolt.DeleteGroup:input_type -> openolt.Group
+	59,  // 90: openolt.Openolt.GetExtValue:input_type -> openolt.ValueParam
+	77,  // 91: openolt.Openolt.OnuItuPonAlarmSet:input_type -> config.OnuItuPonAlarm
+	23,  // 92: openolt.Openolt.GetLogicalOnuDistanceZero:input_type -> openolt.Onu
+	23,  // 93: openolt.Openolt.GetLogicalOnuDistance:input_type -> openolt.Onu
+	23,  // 94: openolt.Openolt.GetPonRxPower:input_type -> openolt.Onu
+	23,  // 95: openolt.Openolt.GetOnuInfo:input_type -> openolt.Onu
+	21,  // 96: openolt.Openolt.GetPonInterfaceInfo:input_type -> openolt.Interface
+	26,  // 97: openolt.Openolt.GetAllocIdStatistics:input_type -> openolt.OnuPacket
+	21,  // 98: openolt.Openolt.GetPonPortStatistics:input_type -> openolt.Interface
+	21,  // 99: openolt.Openolt.GetNniPortStatistics:input_type -> openolt.Interface
+	64,  // 100: openolt.Openolt.DisableOnu:input_type -> openolt.InterfaceOnuSerialNumberOnuId
+	64,  // 101: openolt.Openolt.EnableOnu:input_type -> openolt.InterfaceOnuSerialNumberOnuId
+	65,  // 102: openolt.Openolt.DisableOnuSerialNumber:input_type -> openolt.InterfaceOnuSerialNumber
+	65,  // 103: openolt.Openolt.EnableOnuSerialNumber:input_type -> openolt.InterfaceOnuSerialNumber
+	66,  // 104: openolt.Openolt.DisableOlt:output_type -> openolt.Empty
+	66,  // 105: openolt.Openolt.ReenableOlt:output_type -> openolt.Empty
+	66,  // 106: openolt.Openolt.ActivateOnu:output_type -> openolt.Empty
+	66,  // 107: openolt.Openolt.DeactivateOnu:output_type -> openolt.Empty
+	66,  // 108: openolt.Openolt.DeleteOnu:output_type -> openolt.Empty
+	66,  // 109: openolt.Openolt.OmciMsgOut:output_type -> openolt.Empty
+	66,  // 110: openolt.Openolt.OnuPacketOut:output_type -> openolt.Empty
+	66,  // 111: openolt.Openolt.UplinkPacketOut:output_type -> openolt.Empty
+	66,  // 112: openolt.Openolt.FlowAdd:output_type -> openolt.Empty
+	66,  // 113: openolt.Openolt.FlowRemove:output_type -> openolt.Empty
+	22,  // 114: openolt.Openolt.HeartbeatCheck:output_type -> openolt.Heartbeat
+	66,  // 115: openolt.Openolt.EnablePonIf:output_type -> openolt.Empty
+	66,  // 116: openolt.Openolt.DisablePonIf:output_type -> openolt.Empty
+	28,  // 117: openolt.Openolt.GetDeviceInfo:output_type -> openolt.DeviceInfo
+	66,  // 118: openolt.Openolt.Reboot:output_type -> openolt.Empty
+	66,  // 119: openolt.Openolt.CollectStatistics:output_type -> openolt.Empty
+	34,  // 120: openolt.Openolt.GetOnuStatistics:output_type -> openolt.OnuStatistics
+	35,  // 121: openolt.Openolt.GetGemPortStatistics:output_type -> openolt.GemPortStatistics
+	66,  // 122: openolt.Openolt.CreateTrafficSchedulers:output_type -> openolt.Empty
+	66,  // 123: openolt.Openolt.RemoveTrafficSchedulers:output_type -> openolt.Empty
+	66,  // 124: openolt.Openolt.CreateTrafficQueues:output_type -> openolt.Empty
+	66,  // 125: openolt.Openolt.RemoveTrafficQueues:output_type -> openolt.Empty
+	10,  // 126: openolt.Openolt.EnableIndication:output_type -> openolt.Indication
+	66,  // 127: openolt.Openolt.PerformGroupOperation:output_type -> openolt.Empty
+	66,  // 128: openolt.Openolt.DeleteGroup:output_type -> openolt.Empty
+	78,  // 129: openolt.Openolt.GetExtValue:output_type -> extension.ReturnValues
+	66,  // 130: openolt.Openolt.OnuItuPonAlarmSet:output_type -> openolt.Empty
+	24,  // 131: openolt.Openolt.GetLogicalOnuDistanceZero:output_type -> openolt.OnuLogicalDistance
+	24,  // 132: openolt.Openolt.GetLogicalOnuDistance:output_type -> openolt.OnuLogicalDistance
+	60,  // 133: openolt.Openolt.GetPonRxPower:output_type -> openolt.PonRxPowerData
+	62,  // 134: openolt.Openolt.GetOnuInfo:output_type -> openolt.OnuInfo
+	63,  // 135: openolt.Openolt.GetPonInterfaceInfo:output_type -> openolt.PonIntfInfo
+	61,  // 136: openolt.Openolt.GetAllocIdStatistics:output_type -> openolt.OnuAllocIdStatistics
+	73,  // 137: openolt.Openolt.GetPonPortStatistics:output_type -> common.PortStatistics
+	73,  // 138: openolt.Openolt.GetNniPortStatistics:output_type -> common.PortStatistics
+	66,  // 139: openolt.Openolt.DisableOnu:output_type -> openolt.Empty
+	66,  // 140: openolt.Openolt.EnableOnu:output_type -> openolt.Empty
+	66,  // 141: openolt.Openolt.DisableOnuSerialNumber:output_type -> openolt.Empty
+	66,  // 142: openolt.Openolt.EnableOnuSerialNumber:output_type -> openolt.Empty
+	104, // [104:143] is the sub-list for method output_type
+	65,  // [65:104] is the sub-list for method input_type
+	65,  // [65:65] is the sub-list for extension type_name
+	65,  // [65:65] is the sub-list for extension extendee
+	0,   // [0:65] is the sub-list for field type_name
+}
+
+func init() { file_voltha_protos_openolt_proto_init() }
+func file_voltha_protos_openolt_proto_init() {
+	if File_voltha_protos_openolt_proto != nil {
+		return
+	}
+	file_voltha_protos_openolt_proto_msgTypes[0].OneofWrappers = []any{
+		(*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),
+		(*Indication_OnuDisabledInd)(nil),
+		(*Indication_OnuEnabledInd)(nil),
+	}
+	file_voltha_protos_openolt_proto_msgTypes[1].OneofWrappers = []any{
 		(*AlarmIndication_LosInd)(nil),
 		(*AlarmIndication_DyingGaspInd)(nil),
 		(*AlarmIndication_OnuAlarmInd)(nil),
@@ -900,5996 +6270,25 @@
 		(*AlarmIndication_OnuLossOfAckInd)(nil),
 		(*AlarmIndication_OnuDiffReachExceededInd)(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"`
-	FailReason           OnuIndication_ActivationFailReason `protobuf:"varint,6,opt,name=fail_reason,json=failReason,proto3,enum=openolt.OnuIndication_ActivationFailReason" json:"fail_reason,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
-}
-
-func (m *OnuIndication) GetFailReason() OnuIndication_ActivationFailReason {
-	if m != nil {
-		return m.FailReason
-	}
-	return OnuIndication_ONU_ACTIVATION_FAIL_REASON_NONE
-}
-
-type OnuDisabledIndication 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,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 *OnuDisabledIndication) Reset()         { *m = OnuDisabledIndication{} }
-func (m *OnuDisabledIndication) String() string { return proto.CompactTextString(m) }
-func (*OnuDisabledIndication) ProtoMessage()    {}
-func (*OnuDisabledIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{6}
-}
-
-func (m *OnuDisabledIndication) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuDisabledIndication.Unmarshal(m, b)
-}
-func (m *OnuDisabledIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuDisabledIndication.Marshal(b, m, deterministic)
-}
-func (m *OnuDisabledIndication) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuDisabledIndication.Merge(m, src)
-}
-func (m *OnuDisabledIndication) XXX_Size() int {
-	return xxx_messageInfo_OnuDisabledIndication.Size(m)
-}
-func (m *OnuDisabledIndication) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuDisabledIndication.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuDisabledIndication proto.InternalMessageInfo
-
-func (m *OnuDisabledIndication) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuDisabledIndication) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *OnuDisabledIndication) GetSerialNumber() *SerialNumber {
-	if m != nil {
-		return m.SerialNumber
-	}
-	return nil
-}
-
-type OnuEnabledIndication 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,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 *OnuEnabledIndication) Reset()         { *m = OnuEnabledIndication{} }
-func (m *OnuEnabledIndication) String() string { return proto.CompactTextString(m) }
-func (*OnuEnabledIndication) ProtoMessage()    {}
-func (*OnuEnabledIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{7}
-}
-
-func (m *OnuEnabledIndication) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuEnabledIndication.Unmarshal(m, b)
-}
-func (m *OnuEnabledIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuEnabledIndication.Marshal(b, m, deterministic)
-}
-func (m *OnuEnabledIndication) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuEnabledIndication.Merge(m, src)
-}
-func (m *OnuEnabledIndication) XXX_Size() int {
-	return xxx_messageInfo_OnuEnabledIndication.Size(m)
-}
-func (m *OnuEnabledIndication) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuEnabledIndication.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuEnabledIndication proto.InternalMessageInfo
-
-func (m *OnuEnabledIndication) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuEnabledIndication) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *OnuEnabledIndication) 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"`
-	Speed                uint32                                `protobuf:"fixed32,4,opt,name=speed,proto3" json:"speed,omitempty"`
-	Technology           string                                `protobuf:"bytes,5,opt,name=technology,proto3" json:"technology,omitempty"`
-	Ranges               *IntfOperIndication_PONResourceRanges `protobuf:"bytes,6,opt,name=ranges,proto3" json:"ranges,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{8}
-}
-
-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 ""
-}
-
-func (m *IntfOperIndication) GetSpeed() uint32 {
-	if m != nil {
-		return m.Speed
-	}
-	return 0
-}
-
-func (m *IntfOperIndication) GetTechnology() string {
-	if m != nil {
-		return m.Technology
-	}
-	return ""
-}
-
-func (m *IntfOperIndication) GetRanges() *IntfOperIndication_PONResourceRanges {
-	if m != nil {
-		return m.Ranges
-	}
-	return nil
-}
-
-type IntfOperIndication_PONResourceRanges struct {
-	Pools                []*IntfOperIndication_PONResourceRanges_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 *IntfOperIndication_PONResourceRanges) Reset()         { *m = IntfOperIndication_PONResourceRanges{} }
-func (m *IntfOperIndication_PONResourceRanges) String() string { return proto.CompactTextString(m) }
-func (*IntfOperIndication_PONResourceRanges) ProtoMessage()    {}
-func (*IntfOperIndication_PONResourceRanges) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{8, 0}
-}
-
-func (m *IntfOperIndication_PONResourceRanges) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_IntfOperIndication_PONResourceRanges.Unmarshal(m, b)
-}
-func (m *IntfOperIndication_PONResourceRanges) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_IntfOperIndication_PONResourceRanges.Marshal(b, m, deterministic)
-}
-func (m *IntfOperIndication_PONResourceRanges) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_IntfOperIndication_PONResourceRanges.Merge(m, src)
-}
-func (m *IntfOperIndication_PONResourceRanges) XXX_Size() int {
-	return xxx_messageInfo_IntfOperIndication_PONResourceRanges.Size(m)
-}
-func (m *IntfOperIndication_PONResourceRanges) XXX_DiscardUnknown() {
-	xxx_messageInfo_IntfOperIndication_PONResourceRanges.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_IntfOperIndication_PONResourceRanges proto.InternalMessageInfo
-
-func (m *IntfOperIndication_PONResourceRanges) GetPools() []*IntfOperIndication_PONResourceRanges_Pool {
-	if m != nil {
-		return m.Pools
-	}
-	return nil
-}
-
-type IntfOperIndication_PONResourceRanges_Pool struct {
-	Type                 IntfOperIndication_PONResourceRanges_Pool_PoolType `protobuf:"varint,1,opt,name=type,proto3,enum=openolt.IntfOperIndication_PONResourceRanges_Pool_PoolType" json:"type,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 *IntfOperIndication_PONResourceRanges_Pool) Reset() {
-	*m = IntfOperIndication_PONResourceRanges_Pool{}
-}
-func (m *IntfOperIndication_PONResourceRanges_Pool) String() string {
-	return proto.CompactTextString(m)
-}
-func (*IntfOperIndication_PONResourceRanges_Pool) ProtoMessage() {}
-func (*IntfOperIndication_PONResourceRanges_Pool) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{8, 0, 0}
-}
-
-func (m *IntfOperIndication_PONResourceRanges_Pool) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_IntfOperIndication_PONResourceRanges_Pool.Unmarshal(m, b)
-}
-func (m *IntfOperIndication_PONResourceRanges_Pool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_IntfOperIndication_PONResourceRanges_Pool.Marshal(b, m, deterministic)
-}
-func (m *IntfOperIndication_PONResourceRanges_Pool) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_IntfOperIndication_PONResourceRanges_Pool.Merge(m, src)
-}
-func (m *IntfOperIndication_PONResourceRanges_Pool) XXX_Size() int {
-	return xxx_messageInfo_IntfOperIndication_PONResourceRanges_Pool.Size(m)
-}
-func (m *IntfOperIndication_PONResourceRanges_Pool) XXX_DiscardUnknown() {
-	xxx_messageInfo_IntfOperIndication_PONResourceRanges_Pool.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_IntfOperIndication_PONResourceRanges_Pool proto.InternalMessageInfo
-
-func (m *IntfOperIndication_PONResourceRanges_Pool) GetType() IntfOperIndication_PONResourceRanges_Pool_PoolType {
-	if m != nil {
-		return m.Type
-	}
-	return IntfOperIndication_PONResourceRanges_Pool_ONU_ID
-}
-
-func (m *IntfOperIndication_PONResourceRanges_Pool) GetStart() uint32 {
-	if m != nil {
-		return m.Start
-	}
-	return 0
-}
-
-func (m *IntfOperIndication_PONResourceRanges_Pool) GetEnd() uint32 {
-	if m != nil {
-		return m.End
-	}
-	return 0
-}
-
-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{9}
-}
-
-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"`
-	OnuId                uint32   `protobuf:"fixed32,8,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
-	UniId                uint32   `protobuf:"fixed32,9,opt,name=uni_id,json=uniId,proto3" json:"uni_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{10}
-}
-
-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) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *PacketIndication) GetUniId() uint32 {
-	if m != nil {
-		return m.UniId
-	}
-	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"`
-	IntfType             uint32   `protobuf:"fixed32,2,opt,name=intf_type,json=intfType,proto3" json:"intf_type,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{11}
-}
-
-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
-}
-
-func (m *Interface) GetIntfType() uint32 {
-	if m != nil {
-		return m.IntfType
-	}
-	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{12}
-}
-
-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"`
-	OmccEncryption       bool          `protobuf:"varint,5,opt,name=omcc_encryption,json=omccEncryption,proto3" json:"omcc_encryption,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{13}
-}
-
-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
-}
-
-func (m *Onu) GetOmccEncryption() bool {
-	if m != nil {
-		return m.OmccEncryption
-	}
-	return false
-}
-
-type OnuLogicalDistance 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"`
-	LogicalOnuDistanceZero uint32   `protobuf:"fixed32,3,opt,name=logical_onu_distance_zero,json=logicalOnuDistanceZero,proto3" json:"logical_onu_distance_zero,omitempty"`
-	LogicalOnuDistance     uint32   `protobuf:"fixed32,4,opt,name=logical_onu_distance,json=logicalOnuDistance,proto3" json:"logical_onu_distance,omitempty"`
-	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
-	XXX_unrecognized       []byte   `json:"-"`
-	XXX_sizecache          int32    `json:"-"`
-}
-
-func (m *OnuLogicalDistance) Reset()         { *m = OnuLogicalDistance{} }
-func (m *OnuLogicalDistance) String() string { return proto.CompactTextString(m) }
-func (*OnuLogicalDistance) ProtoMessage()    {}
-func (*OnuLogicalDistance) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{14}
-}
-
-func (m *OnuLogicalDistance) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuLogicalDistance.Unmarshal(m, b)
-}
-func (m *OnuLogicalDistance) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuLogicalDistance.Marshal(b, m, deterministic)
-}
-func (m *OnuLogicalDistance) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuLogicalDistance.Merge(m, src)
-}
-func (m *OnuLogicalDistance) XXX_Size() int {
-	return xxx_messageInfo_OnuLogicalDistance.Size(m)
-}
-func (m *OnuLogicalDistance) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuLogicalDistance.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuLogicalDistance proto.InternalMessageInfo
-
-func (m *OnuLogicalDistance) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuLogicalDistance) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *OnuLogicalDistance) GetLogicalOnuDistanceZero() uint32 {
-	if m != nil {
-		return m.LogicalOnuDistanceZero
-	}
-	return 0
-}
-
-func (m *OnuLogicalDistance) GetLogicalOnuDistance() uint32 {
-	if m != nil {
-		return m.LogicalOnuDistance
-	}
-	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{15}
-}
-
-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"`
-	AllocId              uint32   `protobuf:"fixed32,6,opt,name=alloc_id,json=allocId,proto3" json:"alloc_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{16}
-}
-
-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) GetAllocId() uint32 {
-	if m != nil {
-		return m.AllocId
-	}
-	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{17}
-}
-
-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"`
-	PreviouslyConnected bool   `protobuf:"varint,19,opt,name=previously_connected,json=previouslyConnected,proto3" json:"previously_connected,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"`
-	// Total number of nni intf ports on the device
-	NniPorts             uint32                             `protobuf:"fixed32,20,opt,name=nni_ports,json=nniPorts,proto3" json:"nni_ports,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{18}
-}
-
-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) GetPreviouslyConnected() bool {
-	if m != nil {
-		return m.PreviouslyConnected
-	}
-	return false
-}
-
-func (m *DeviceInfo) GetPonPorts() uint32 {
-	if m != nil {
-		return m.PonPorts
-	}
-	return 0
-}
-
-func (m *DeviceInfo) GetNniPorts() uint32 {
-	if m != nil {
-		return m.NniPorts
-	}
-	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{18, 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{18, 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{19}
-}
-
-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"`
-	RemarkOuterPbits     bool     `protobuf:"varint,4,opt,name=remark_outer_pbits,json=remarkOuterPbits,proto3" json:"remark_outer_pbits,omitempty"`
-	RemarkInnerPbits     bool     `protobuf:"varint,5,opt,name=remark_inner_pbits,json=remarkInnerPbits,proto3" json:"remark_inner_pbits,omitempty"`
-	AddInnerTag          bool     `protobuf:"varint,6,opt,name=add_inner_tag,json=addInnerTag,proto3" json:"add_inner_tag,omitempty"`
-	RemoveInnerTag       bool     `protobuf:"varint,7,opt,name=remove_inner_tag,json=removeInnerTag,proto3" json:"remove_inner_tag,omitempty"`
-	TranslateInnerTag    bool     `protobuf:"varint,8,opt,name=translate_inner_tag,json=translateInnerTag,proto3" json:"translate_inner_tag,omitempty"`
-	TranslateOuterTag    bool     `protobuf:"varint,9,opt,name=translate_outer_tag,json=translateOuterTag,proto3" json:"translate_outer_tag,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{20}
-}
-
-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
-}
-
-func (m *ActionCmd) GetRemarkOuterPbits() bool {
-	if m != nil {
-		return m.RemarkOuterPbits
-	}
-	return false
-}
-
-func (m *ActionCmd) GetRemarkInnerPbits() bool {
-	if m != nil {
-		return m.RemarkInnerPbits
-	}
-	return false
-}
-
-func (m *ActionCmd) GetAddInnerTag() bool {
-	if m != nil {
-		return m.AddInnerTag
-	}
-	return false
-}
-
-func (m *ActionCmd) GetRemoveInnerTag() bool {
-	if m != nil {
-		return m.RemoveInnerTag
-	}
-	return false
-}
-
-func (m *ActionCmd) GetTranslateInnerTag() bool {
-	if m != nil {
-		return m.TranslateInnerTag
-	}
-	return false
-}
-
-func (m *ActionCmd) GetTranslateOuterTag() bool {
-	if m != nil {
-		return m.TranslateOuterTag
-	}
-	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{21}
-}
-
-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               uint64            `protobuf:"fixed64,3,opt,name=flow_id,json=flowId,proto3" json:"flow_id,omitempty"`
-	SymmetricFlowId      uint64            `protobuf:"fixed64,18,opt,name=symmetric_flow_id,json=symmetricFlowId,proto3" json:"symmetric_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"`
-	TechProfileId        uint32            `protobuf:"fixed32,15,opt,name=tech_profile_id,json=techProfileId,proto3" json:"tech_profile_id,omitempty"`
-	ReplicateFlow        bool              `protobuf:"varint,16,opt,name=replicate_flow,json=replicateFlow,proto3" json:"replicate_flow,omitempty"`
-	PbitToGemport        map[uint32]uint32 `protobuf:"bytes,17,rep,name=pbit_to_gemport,json=pbitToGemport,proto3" json:"pbit_to_gemport,omitempty" protobuf_key:"fixed32,1,opt,name=key,proto3" protobuf_val:"fixed32,2,opt,name=value,proto3"`
-	GemportToAes         map[uint32]bool   `protobuf:"bytes,19,rep,name=gemport_to_aes,json=gemportToAes,proto3" json:"gemport_to_aes,omitempty" protobuf_key:"fixed32,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
-	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{22}
-}
-
-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() uint64 {
-	if m != nil {
-		return m.FlowId
-	}
-	return 0
-}
-
-func (m *Flow) GetSymmetricFlowId() uint64 {
-	if m != nil {
-		return m.SymmetricFlowId
-	}
-	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
-}
-
-func (m *Flow) GetTechProfileId() uint32 {
-	if m != nil {
-		return m.TechProfileId
-	}
-	return 0
-}
-
-func (m *Flow) GetReplicateFlow() bool {
-	if m != nil {
-		return m.ReplicateFlow
-	}
-	return false
-}
-
-func (m *Flow) GetPbitToGemport() map[uint32]uint32 {
-	if m != nil {
-		return m.PbitToGemport
-	}
-	return nil
-}
-
-func (m *Flow) GetGemportToAes() map[uint32]bool {
-	if m != nil {
-		return m.GemportToAes
-	}
-	return nil
-}
-
-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{23}
-}
-
-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 OnuStatistics 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"`
-	PositiveDrift             uint64   `protobuf:"fixed64,3,opt,name=positive_drift,json=positiveDrift,proto3" json:"positive_drift,omitempty"`
-	NegativeDrift             uint64   `protobuf:"fixed64,4,opt,name=negative_drift,json=negativeDrift,proto3" json:"negative_drift,omitempty"`
-	DelimiterMissDetection    uint64   `protobuf:"fixed64,5,opt,name=delimiter_miss_detection,json=delimiterMissDetection,proto3" json:"delimiter_miss_detection,omitempty"`
-	BipErrors                 uint64   `protobuf:"fixed64,6,opt,name=bip_errors,json=bipErrors,proto3" json:"bip_errors,omitempty"`
-	BipUnits                  uint64   `protobuf:"fixed64,7,opt,name=bip_units,json=bipUnits,proto3" json:"bip_units,omitempty"`
-	FecCorrectedSymbols       uint64   `protobuf:"fixed64,8,opt,name=fec_corrected_symbols,json=fecCorrectedSymbols,proto3" json:"fec_corrected_symbols,omitempty"`
-	FecCodewordsCorrected     uint64   `protobuf:"fixed64,9,opt,name=fec_codewords_corrected,json=fecCodewordsCorrected,proto3" json:"fec_codewords_corrected,omitempty"`
-	FecCodewordsUncorrectable uint64   `protobuf:"fixed64,10,opt,name=fec_codewords_uncorrectable,json=fecCodewordsUncorrectable,proto3" json:"fec_codewords_uncorrectable,omitempty"`
-	FecCodewords              uint64   `protobuf:"fixed64,11,opt,name=fec_codewords,json=fecCodewords,proto3" json:"fec_codewords,omitempty"`
-	FecCorrectedUnits         uint64   `protobuf:"fixed64,12,opt,name=fec_corrected_units,json=fecCorrectedUnits,proto3" json:"fec_corrected_units,omitempty"`
-	XgemKeyErrors             uint64   `protobuf:"fixed64,13,opt,name=xgem_key_errors,json=xgemKeyErrors,proto3" json:"xgem_key_errors,omitempty"`
-	XgemLoss                  uint64   `protobuf:"fixed64,14,opt,name=xgem_loss,json=xgemLoss,proto3" json:"xgem_loss,omitempty"`
-	RxPloamsError             uint64   `protobuf:"fixed64,15,opt,name=rx_ploams_error,json=rxPloamsError,proto3" json:"rx_ploams_error,omitempty"`
-	RxPloamsNonIdle           uint64   `protobuf:"fixed64,16,opt,name=rx_ploams_non_idle,json=rxPloamsNonIdle,proto3" json:"rx_ploams_non_idle,omitempty"`
-	RxOmci                    uint64   `protobuf:"fixed64,17,opt,name=rx_omci,json=rxOmci,proto3" json:"rx_omci,omitempty"`
-	RxOmciPacketsCrcError     uint64   `protobuf:"fixed64,18,opt,name=rx_omci_packets_crc_error,json=rxOmciPacketsCrcError,proto3" json:"rx_omci_packets_crc_error,omitempty"`
-	RxBytes                   uint64   `protobuf:"fixed64,19,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
-	RxPackets                 uint64   `protobuf:"fixed64,20,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
-	TxBytes                   uint64   `protobuf:"fixed64,21,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
-	TxPackets                 uint64   `protobuf:"fixed64,22,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
-	BerReported               uint64   `protobuf:"fixed64,23,opt,name=ber_reported,json=berReported,proto3" json:"ber_reported,omitempty"`
-	LcdgErrors                uint64   `protobuf:"fixed64,24,opt,name=lcdg_errors,json=lcdgErrors,proto3" json:"lcdg_errors,omitempty"`
-	RdiErrors                 uint64   `protobuf:"fixed64,25,opt,name=rdi_errors,json=rdiErrors,proto3" json:"rdi_errors,omitempty"`
-	Timestamp                 uint32   `protobuf:"fixed32,26,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
-	XXX_NoUnkeyedLiteral      struct{} `json:"-"`
-	XXX_unrecognized          []byte   `json:"-"`
-	XXX_sizecache             int32    `json:"-"`
-}
-
-func (m *OnuStatistics) Reset()         { *m = OnuStatistics{} }
-func (m *OnuStatistics) String() string { return proto.CompactTextString(m) }
-func (*OnuStatistics) ProtoMessage()    {}
-func (*OnuStatistics) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{24}
-}
-
-func (m *OnuStatistics) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuStatistics.Unmarshal(m, b)
-}
-func (m *OnuStatistics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuStatistics.Marshal(b, m, deterministic)
-}
-func (m *OnuStatistics) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuStatistics.Merge(m, src)
-}
-func (m *OnuStatistics) XXX_Size() int {
-	return xxx_messageInfo_OnuStatistics.Size(m)
-}
-func (m *OnuStatistics) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuStatistics.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuStatistics proto.InternalMessageInfo
-
-func (m *OnuStatistics) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetPositiveDrift() uint64 {
-	if m != nil {
-		return m.PositiveDrift
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetNegativeDrift() uint64 {
-	if m != nil {
-		return m.NegativeDrift
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetDelimiterMissDetection() uint64 {
-	if m != nil {
-		return m.DelimiterMissDetection
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetBipErrors() uint64 {
-	if m != nil {
-		return m.BipErrors
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetBipUnits() uint64 {
-	if m != nil {
-		return m.BipUnits
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetFecCorrectedSymbols() uint64 {
-	if m != nil {
-		return m.FecCorrectedSymbols
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetFecCodewordsCorrected() uint64 {
-	if m != nil {
-		return m.FecCodewordsCorrected
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetFecCodewordsUncorrectable() uint64 {
-	if m != nil {
-		return m.FecCodewordsUncorrectable
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetFecCodewords() uint64 {
-	if m != nil {
-		return m.FecCodewords
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetFecCorrectedUnits() uint64 {
-	if m != nil {
-		return m.FecCorrectedUnits
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetXgemKeyErrors() uint64 {
-	if m != nil {
-		return m.XgemKeyErrors
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetXgemLoss() uint64 {
-	if m != nil {
-		return m.XgemLoss
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetRxPloamsError() uint64 {
-	if m != nil {
-		return m.RxPloamsError
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetRxPloamsNonIdle() uint64 {
-	if m != nil {
-		return m.RxPloamsNonIdle
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetRxOmci() uint64 {
-	if m != nil {
-		return m.RxOmci
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetRxOmciPacketsCrcError() uint64 {
-	if m != nil {
-		return m.RxOmciPacketsCrcError
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetRxBytes() uint64 {
-	if m != nil {
-		return m.RxBytes
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetRxPackets() uint64 {
-	if m != nil {
-		return m.RxPackets
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetTxBytes() uint64 {
-	if m != nil {
-		return m.TxBytes
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetTxPackets() uint64 {
-	if m != nil {
-		return m.TxPackets
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetBerReported() uint64 {
-	if m != nil {
-		return m.BerReported
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetLcdgErrors() uint64 {
-	if m != nil {
-		return m.LcdgErrors
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetRdiErrors() uint64 {
-	if m != nil {
-		return m.RdiErrors
-	}
-	return 0
-}
-
-func (m *OnuStatistics) GetTimestamp() uint32 {
-	if m != nil {
-		return m.Timestamp
-	}
-	return 0
-}
-
-type GemPortStatistics struct {
-	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"`
-	RxPackets            uint64   `protobuf:"fixed64,3,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
-	RxBytes              uint64   `protobuf:"fixed64,4,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
-	TxPackets            uint64   `protobuf:"fixed64,5,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
-	TxBytes              uint64   `protobuf:"fixed64,6,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
-	Timestamp            uint32   `protobuf:"fixed32,26,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *GemPortStatistics) Reset()         { *m = GemPortStatistics{} }
-func (m *GemPortStatistics) String() string { return proto.CompactTextString(m) }
-func (*GemPortStatistics) ProtoMessage()    {}
-func (*GemPortStatistics) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{25}
-}
-
-func (m *GemPortStatistics) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GemPortStatistics.Unmarshal(m, b)
-}
-func (m *GemPortStatistics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GemPortStatistics.Marshal(b, m, deterministic)
-}
-func (m *GemPortStatistics) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GemPortStatistics.Merge(m, src)
-}
-func (m *GemPortStatistics) XXX_Size() int {
-	return xxx_messageInfo_GemPortStatistics.Size(m)
-}
-func (m *GemPortStatistics) XXX_DiscardUnknown() {
-	xxx_messageInfo_GemPortStatistics.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GemPortStatistics proto.InternalMessageInfo
-
-func (m *GemPortStatistics) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *GemPortStatistics) GetGemportId() uint32 {
-	if m != nil {
-		return m.GemportId
-	}
-	return 0
-}
-
-func (m *GemPortStatistics) GetRxPackets() uint64 {
-	if m != nil {
-		return m.RxPackets
-	}
-	return 0
-}
-
-func (m *GemPortStatistics) GetRxBytes() uint64 {
-	if m != nil {
-		return m.RxBytes
-	}
-	return 0
-}
-
-func (m *GemPortStatistics) GetTxPackets() uint64 {
-	if m != nil {
-		return m.TxPackets
-	}
-	return 0
-}
-
-func (m *GemPortStatistics) GetTxBytes() uint64 {
-	if m != nil {
-		return m.TxBytes
-	}
-	return 0
-}
-
-func (m *GemPortStatistics) 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{26}
-}
-
-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{27}
-}
-
-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{28}
-}
-
-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"`
-	LofiStatus           string   `protobuf:"bytes,7,opt,name=lofi_status,json=lofiStatus,proto3" json:"lofi_status,omitempty"`
-	LoamiStatus          string   `protobuf:"bytes,8,opt,name=loami_status,json=loamiStatus,proto3" json:"loami_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{29}
-}
-
-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 ""
-}
-
-func (m *OnuAlarmIndication) GetLofiStatus() string {
-	if m != nil {
-		return m.LofiStatus
-	}
-	return ""
-}
-
-func (m *OnuAlarmIndication) GetLoamiStatus() string {
-	if m != nil {
-		return m.LoamiStatus
-	}
-	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{30}
-}
-
-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{31}
-}
-
-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{32}
-}
-
-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{33}
-}
-
-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{34}
-}
-
-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{35}
-}
-
-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"`
-	FailReason           uint32   `protobuf:"fixed32,3,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,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{36}
-}
-
-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
-}
-
-func (m *OnuActivationFailureIndication) GetFailReason() uint32 {
-	if m != nil {
-		return m.FailReason
-	}
-	return 0
-}
-
-type OnuLossOfKeySyncFailureIndication 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 *OnuLossOfKeySyncFailureIndication) Reset()         { *m = OnuLossOfKeySyncFailureIndication{} }
-func (m *OnuLossOfKeySyncFailureIndication) String() string { return proto.CompactTextString(m) }
-func (*OnuLossOfKeySyncFailureIndication) ProtoMessage()    {}
-func (*OnuLossOfKeySyncFailureIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{37}
-}
-
-func (m *OnuLossOfKeySyncFailureIndication) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuLossOfKeySyncFailureIndication.Unmarshal(m, b)
-}
-func (m *OnuLossOfKeySyncFailureIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuLossOfKeySyncFailureIndication.Marshal(b, m, deterministic)
-}
-func (m *OnuLossOfKeySyncFailureIndication) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuLossOfKeySyncFailureIndication.Merge(m, src)
-}
-func (m *OnuLossOfKeySyncFailureIndication) XXX_Size() int {
-	return xxx_messageInfo_OnuLossOfKeySyncFailureIndication.Size(m)
-}
-func (m *OnuLossOfKeySyncFailureIndication) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuLossOfKeySyncFailureIndication.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuLossOfKeySyncFailureIndication proto.InternalMessageInfo
-
-func (m *OnuLossOfKeySyncFailureIndication) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuLossOfKeySyncFailureIndication) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *OnuLossOfKeySyncFailureIndication) GetStatus() string {
-	if m != nil {
-		return m.Status
-	}
-	return ""
-}
-
-type RdiErrorIndication struct {
-	RdiErrorCount        uint64   `protobuf:"fixed64,1,opt,name=rdi_error_count,json=rdiErrorCount,proto3" json:"rdi_error_count,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 *RdiErrorIndication) Reset()         { *m = RdiErrorIndication{} }
-func (m *RdiErrorIndication) String() string { return proto.CompactTextString(m) }
-func (*RdiErrorIndication) ProtoMessage()    {}
-func (*RdiErrorIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{38}
-}
-
-func (m *RdiErrorIndication) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RdiErrorIndication.Unmarshal(m, b)
-}
-func (m *RdiErrorIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RdiErrorIndication.Marshal(b, m, deterministic)
-}
-func (m *RdiErrorIndication) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RdiErrorIndication.Merge(m, src)
-}
-func (m *RdiErrorIndication) XXX_Size() int {
-	return xxx_messageInfo_RdiErrorIndication.Size(m)
-}
-func (m *RdiErrorIndication) XXX_DiscardUnknown() {
-	xxx_messageInfo_RdiErrorIndication.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RdiErrorIndication proto.InternalMessageInfo
-
-func (m *RdiErrorIndication) GetRdiErrorCount() uint64 {
-	if m != nil {
-		return m.RdiErrorCount
-	}
-	return 0
-}
-
-func (m *RdiErrorIndication) GetStatus() string {
-	if m != nil {
-		return m.Status
-	}
-	return ""
-}
-
-type OnuItuPonStatsIndication 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"`
-	// Types that are valid to be assigned to Stats:
-	//	*OnuItuPonStatsIndication_RdiErrorInd
-	Stats                isOnuItuPonStatsIndication_Stats `protobuf_oneof:"stats"`
-	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
-	XXX_unrecognized     []byte                           `json:"-"`
-	XXX_sizecache        int32                            `json:"-"`
-}
-
-func (m *OnuItuPonStatsIndication) Reset()         { *m = OnuItuPonStatsIndication{} }
-func (m *OnuItuPonStatsIndication) String() string { return proto.CompactTextString(m) }
-func (*OnuItuPonStatsIndication) ProtoMessage()    {}
-func (*OnuItuPonStatsIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{39}
-}
-
-func (m *OnuItuPonStatsIndication) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuItuPonStatsIndication.Unmarshal(m, b)
-}
-func (m *OnuItuPonStatsIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuItuPonStatsIndication.Marshal(b, m, deterministic)
-}
-func (m *OnuItuPonStatsIndication) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuItuPonStatsIndication.Merge(m, src)
-}
-func (m *OnuItuPonStatsIndication) XXX_Size() int {
-	return xxx_messageInfo_OnuItuPonStatsIndication.Size(m)
-}
-func (m *OnuItuPonStatsIndication) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuItuPonStatsIndication.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuItuPonStatsIndication proto.InternalMessageInfo
-
-func (m *OnuItuPonStatsIndication) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuItuPonStatsIndication) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-type isOnuItuPonStatsIndication_Stats interface {
-	isOnuItuPonStatsIndication_Stats()
-}
-
-type OnuItuPonStatsIndication_RdiErrorInd struct {
-	RdiErrorInd *RdiErrorIndication `protobuf:"bytes,3,opt,name=rdi_error_ind,json=rdiErrorInd,proto3,oneof"`
-}
-
-func (*OnuItuPonStatsIndication_RdiErrorInd) isOnuItuPonStatsIndication_Stats() {}
-
-func (m *OnuItuPonStatsIndication) GetStats() isOnuItuPonStatsIndication_Stats {
-	if m != nil {
-		return m.Stats
-	}
-	return nil
-}
-
-func (m *OnuItuPonStatsIndication) GetRdiErrorInd() *RdiErrorIndication {
-	if x, ok := m.GetStats().(*OnuItuPonStatsIndication_RdiErrorInd); ok {
-		return x.RdiErrorInd
-	}
-	return nil
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*OnuItuPonStatsIndication) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
+	file_voltha_protos_openolt_proto_msgTypes[39].OneofWrappers = []any{
 		(*OnuItuPonStatsIndication_RdiErrorInd)(nil),
 	}
-}
-
-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{40}
-}
-
-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 OnuDeactivationFailureIndication 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 *OnuDeactivationFailureIndication) Reset()         { *m = OnuDeactivationFailureIndication{} }
-func (m *OnuDeactivationFailureIndication) String() string { return proto.CompactTextString(m) }
-func (*OnuDeactivationFailureIndication) ProtoMessage()    {}
-func (*OnuDeactivationFailureIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{41}
-}
-
-func (m *OnuDeactivationFailureIndication) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuDeactivationFailureIndication.Unmarshal(m, b)
-}
-func (m *OnuDeactivationFailureIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuDeactivationFailureIndication.Marshal(b, m, deterministic)
-}
-func (m *OnuDeactivationFailureIndication) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuDeactivationFailureIndication.Merge(m, src)
-}
-func (m *OnuDeactivationFailureIndication) XXX_Size() int {
-	return xxx_messageInfo_OnuDeactivationFailureIndication.Size(m)
-}
-func (m *OnuDeactivationFailureIndication) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuDeactivationFailureIndication.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuDeactivationFailureIndication proto.InternalMessageInfo
-
-func (m *OnuDeactivationFailureIndication) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuDeactivationFailureIndication) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *OnuDeactivationFailureIndication) GetStatus() string {
-	if m != nil {
-		return m.Status
-	}
-	return ""
-}
-
-type OnuRemoteDefectIndication 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"`
-	RdiErrors            uint64   `protobuf:"fixed64,3,opt,name=rdi_errors,json=rdiErrors,proto3" json:"rdi_errors,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *OnuRemoteDefectIndication) Reset()         { *m = OnuRemoteDefectIndication{} }
-func (m *OnuRemoteDefectIndication) String() string { return proto.CompactTextString(m) }
-func (*OnuRemoteDefectIndication) ProtoMessage()    {}
-func (*OnuRemoteDefectIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{42}
-}
-
-func (m *OnuRemoteDefectIndication) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuRemoteDefectIndication.Unmarshal(m, b)
-}
-func (m *OnuRemoteDefectIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuRemoteDefectIndication.Marshal(b, m, deterministic)
-}
-func (m *OnuRemoteDefectIndication) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuRemoteDefectIndication.Merge(m, src)
-}
-func (m *OnuRemoteDefectIndication) XXX_Size() int {
-	return xxx_messageInfo_OnuRemoteDefectIndication.Size(m)
-}
-func (m *OnuRemoteDefectIndication) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuRemoteDefectIndication.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuRemoteDefectIndication proto.InternalMessageInfo
-
-func (m *OnuRemoteDefectIndication) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuRemoteDefectIndication) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *OnuRemoteDefectIndication) GetRdiErrors() uint64 {
-	if m != nil {
-		return m.RdiErrors
-	}
-	return 0
-}
-
-type OnuLossOfGEMChannelDelineationIndication 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"`
-	DelineationErrors    uint32   `protobuf:"fixed32,4,opt,name=delineation_errors,json=delineationErrors,proto3" json:"delineation_errors,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *OnuLossOfGEMChannelDelineationIndication) Reset() {
-	*m = OnuLossOfGEMChannelDelineationIndication{}
-}
-func (m *OnuLossOfGEMChannelDelineationIndication) String() string { return proto.CompactTextString(m) }
-func (*OnuLossOfGEMChannelDelineationIndication) ProtoMessage()    {}
-func (*OnuLossOfGEMChannelDelineationIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{43}
-}
-
-func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.Unmarshal(m, b)
-}
-func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.Marshal(b, m, deterministic)
-}
-func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.Merge(m, src)
-}
-func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Size() int {
-	return xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.Size(m)
-}
-func (m *OnuLossOfGEMChannelDelineationIndication) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication proto.InternalMessageInfo
-
-func (m *OnuLossOfGEMChannelDelineationIndication) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuLossOfGEMChannelDelineationIndication) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *OnuLossOfGEMChannelDelineationIndication) GetStatus() string {
-	if m != nil {
-		return m.Status
-	}
-	return ""
-}
-
-func (m *OnuLossOfGEMChannelDelineationIndication) GetDelineationErrors() uint32 {
-	if m != nil {
-		return m.DelineationErrors
-	}
-	return 0
-}
-
-type OnuPhysicalEquipmentErrorIndication 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 *OnuPhysicalEquipmentErrorIndication) Reset()         { *m = OnuPhysicalEquipmentErrorIndication{} }
-func (m *OnuPhysicalEquipmentErrorIndication) String() string { return proto.CompactTextString(m) }
-func (*OnuPhysicalEquipmentErrorIndication) ProtoMessage()    {}
-func (*OnuPhysicalEquipmentErrorIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{44}
-}
-
-func (m *OnuPhysicalEquipmentErrorIndication) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.Unmarshal(m, b)
-}
-func (m *OnuPhysicalEquipmentErrorIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.Marshal(b, m, deterministic)
-}
-func (m *OnuPhysicalEquipmentErrorIndication) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.Merge(m, src)
-}
-func (m *OnuPhysicalEquipmentErrorIndication) XXX_Size() int {
-	return xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.Size(m)
-}
-func (m *OnuPhysicalEquipmentErrorIndication) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuPhysicalEquipmentErrorIndication proto.InternalMessageInfo
-
-func (m *OnuPhysicalEquipmentErrorIndication) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuPhysicalEquipmentErrorIndication) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *OnuPhysicalEquipmentErrorIndication) GetStatus() string {
-	if m != nil {
-		return m.Status
-	}
-	return ""
-}
-
-type OnuLossOfAcknowledgementIndication 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 *OnuLossOfAcknowledgementIndication) Reset()         { *m = OnuLossOfAcknowledgementIndication{} }
-func (m *OnuLossOfAcknowledgementIndication) String() string { return proto.CompactTextString(m) }
-func (*OnuLossOfAcknowledgementIndication) ProtoMessage()    {}
-func (*OnuLossOfAcknowledgementIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{45}
-}
-
-func (m *OnuLossOfAcknowledgementIndication) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuLossOfAcknowledgementIndication.Unmarshal(m, b)
-}
-func (m *OnuLossOfAcknowledgementIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuLossOfAcknowledgementIndication.Marshal(b, m, deterministic)
-}
-func (m *OnuLossOfAcknowledgementIndication) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuLossOfAcknowledgementIndication.Merge(m, src)
-}
-func (m *OnuLossOfAcknowledgementIndication) XXX_Size() int {
-	return xxx_messageInfo_OnuLossOfAcknowledgementIndication.Size(m)
-}
-func (m *OnuLossOfAcknowledgementIndication) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuLossOfAcknowledgementIndication.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuLossOfAcknowledgementIndication proto.InternalMessageInfo
-
-func (m *OnuLossOfAcknowledgementIndication) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuLossOfAcknowledgementIndication) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *OnuLossOfAcknowledgementIndication) GetStatus() string {
-	if m != nil {
-		return m.Status
-	}
-	return ""
-}
-
-type OnuDifferentialReachExceededIndication 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"`
-	Distance             uint32   `protobuf:"fixed32,4,opt,name=distance,proto3" json:"distance,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *OnuDifferentialReachExceededIndication) Reset() {
-	*m = OnuDifferentialReachExceededIndication{}
-}
-func (m *OnuDifferentialReachExceededIndication) String() string { return proto.CompactTextString(m) }
-func (*OnuDifferentialReachExceededIndication) ProtoMessage()    {}
-func (*OnuDifferentialReachExceededIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{46}
-}
-
-func (m *OnuDifferentialReachExceededIndication) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuDifferentialReachExceededIndication.Unmarshal(m, b)
-}
-func (m *OnuDifferentialReachExceededIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuDifferentialReachExceededIndication.Marshal(b, m, deterministic)
-}
-func (m *OnuDifferentialReachExceededIndication) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuDifferentialReachExceededIndication.Merge(m, src)
-}
-func (m *OnuDifferentialReachExceededIndication) XXX_Size() int {
-	return xxx_messageInfo_OnuDifferentialReachExceededIndication.Size(m)
-}
-func (m *OnuDifferentialReachExceededIndication) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuDifferentialReachExceededIndication.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuDifferentialReachExceededIndication proto.InternalMessageInfo
-
-func (m *OnuDifferentialReachExceededIndication) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuDifferentialReachExceededIndication) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *OnuDifferentialReachExceededIndication) GetStatus() string {
-	if m != nil {
-		return m.Status
-	}
-	return ""
-}
-
-func (m *OnuDifferentialReachExceededIndication) GetDistance() uint32 {
-	if m != nil {
-		return m.Distance
-	}
-	return 0
-}
-
-type GroupMember struct {
-	InterfaceId          uint32                    `protobuf:"varint,1,opt,name=interface_id,json=interfaceId,proto3" json:"interface_id,omitempty"`
-	InterfaceType        GroupMember_InterfaceType `protobuf:"varint,2,opt,name=interface_type,json=interfaceType,proto3,enum=openolt.GroupMember_InterfaceType" json:"interface_type,omitempty"`
-	GemPortId            uint32                    `protobuf:"varint,3,opt,name=gem_port_id,json=gemPortId,proto3" json:"gem_port_id,omitempty"`
-	Priority             uint32                    `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
-	XXX_unrecognized     []byte                    `json:"-"`
-	XXX_sizecache        int32                     `json:"-"`
-}
-
-func (m *GroupMember) Reset()         { *m = GroupMember{} }
-func (m *GroupMember) String() string { return proto.CompactTextString(m) }
-func (*GroupMember) ProtoMessage()    {}
-func (*GroupMember) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{47}
-}
-
-func (m *GroupMember) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GroupMember.Unmarshal(m, b)
-}
-func (m *GroupMember) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GroupMember.Marshal(b, m, deterministic)
-}
-func (m *GroupMember) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GroupMember.Merge(m, src)
-}
-func (m *GroupMember) XXX_Size() int {
-	return xxx_messageInfo_GroupMember.Size(m)
-}
-func (m *GroupMember) XXX_DiscardUnknown() {
-	xxx_messageInfo_GroupMember.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GroupMember proto.InternalMessageInfo
-
-func (m *GroupMember) GetInterfaceId() uint32 {
-	if m != nil {
-		return m.InterfaceId
-	}
-	return 0
-}
-
-func (m *GroupMember) GetInterfaceType() GroupMember_InterfaceType {
-	if m != nil {
-		return m.InterfaceType
-	}
-	return GroupMember_PON
-}
-
-func (m *GroupMember) GetGemPortId() uint32 {
-	if m != nil {
-		return m.GemPortId
-	}
-	return 0
-}
-
-func (m *GroupMember) GetPriority() uint32 {
-	if m != nil {
-		return m.Priority
-	}
-	return 0
-}
-
-type Group struct {
-	GroupId              uint32                    `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
-	Command              Group_GroupMembersCommand `protobuf:"varint,2,opt,name=command,proto3,enum=openolt.Group_GroupMembersCommand" json:"command,omitempty"`
-	Members              []*GroupMember            `protobuf:"bytes,3,rep,name=members,proto3" json:"members,omitempty"`
-	Action               *Action                   `protobuf:"bytes,4,opt,name=action,proto3" json:"action,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
-	XXX_unrecognized     []byte                    `json:"-"`
-	XXX_sizecache        int32                     `json:"-"`
-}
-
-func (m *Group) Reset()         { *m = Group{} }
-func (m *Group) String() string { return proto.CompactTextString(m) }
-func (*Group) ProtoMessage()    {}
-func (*Group) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{48}
-}
-
-func (m *Group) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Group.Unmarshal(m, b)
-}
-func (m *Group) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Group.Marshal(b, m, deterministic)
-}
-func (m *Group) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Group.Merge(m, src)
-}
-func (m *Group) XXX_Size() int {
-	return xxx_messageInfo_Group.Size(m)
-}
-func (m *Group) XXX_DiscardUnknown() {
-	xxx_messageInfo_Group.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Group proto.InternalMessageInfo
-
-func (m *Group) GetGroupId() uint32 {
-	if m != nil {
-		return m.GroupId
-	}
-	return 0
-}
-
-func (m *Group) GetCommand() Group_GroupMembersCommand {
-	if m != nil {
-		return m.Command
-	}
-	return Group_ADD_MEMBERS
-}
-
-func (m *Group) GetMembers() []*GroupMember {
-	if m != nil {
-		return m.Members
-	}
-	return nil
-}
-
-func (m *Group) GetAction() *Action {
-	if m != nil {
-		return m.Action
-	}
-	return nil
-}
-
-type ValueParam struct {
-	Onu                  *Onu                     `protobuf:"bytes,1,opt,name=onu,proto3" json:"onu,omitempty"`
-	Value                extension.ValueType_Type `protobuf:"varint,2,opt,name=value,proto3,enum=extension.ValueType_Type" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
-	XXX_unrecognized     []byte                   `json:"-"`
-	XXX_sizecache        int32                    `json:"-"`
-}
-
-func (m *ValueParam) Reset()         { *m = ValueParam{} }
-func (m *ValueParam) String() string { return proto.CompactTextString(m) }
-func (*ValueParam) ProtoMessage()    {}
-func (*ValueParam) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{49}
-}
-
-func (m *ValueParam) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ValueParam.Unmarshal(m, b)
-}
-func (m *ValueParam) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ValueParam.Marshal(b, m, deterministic)
-}
-func (m *ValueParam) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ValueParam.Merge(m, src)
-}
-func (m *ValueParam) XXX_Size() int {
-	return xxx_messageInfo_ValueParam.Size(m)
-}
-func (m *ValueParam) XXX_DiscardUnknown() {
-	xxx_messageInfo_ValueParam.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ValueParam proto.InternalMessageInfo
-
-func (m *ValueParam) GetOnu() *Onu {
-	if m != nil {
-		return m.Onu
-	}
-	return nil
-}
-
-func (m *ValueParam) GetValue() extension.ValueType_Type {
-	if m != nil {
-		return m.Value
-	}
-	return extension.ValueType_EMPTY
-}
-
-type PonRxPowerData 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"`
-	FailReason           PonRxPowerData_RssiMeasurementFailReason `protobuf:"varint,4,opt,name=fail_reason,json=failReason,proto3,enum=openolt.PonRxPowerData_RssiMeasurementFailReason" json:"fail_reason,omitempty"`
-	RxPowerMeanDbm       float64                                  `protobuf:"fixed64,5,opt,name=rx_power_mean_dbm,json=rxPowerMeanDbm,proto3" json:"rx_power_mean_dbm,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                                 `json:"-"`
-	XXX_unrecognized     []byte                                   `json:"-"`
-	XXX_sizecache        int32                                    `json:"-"`
-}
-
-func (m *PonRxPowerData) Reset()         { *m = PonRxPowerData{} }
-func (m *PonRxPowerData) String() string { return proto.CompactTextString(m) }
-func (*PonRxPowerData) ProtoMessage()    {}
-func (*PonRxPowerData) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{50}
-}
-
-func (m *PonRxPowerData) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PonRxPowerData.Unmarshal(m, b)
-}
-func (m *PonRxPowerData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PonRxPowerData.Marshal(b, m, deterministic)
-}
-func (m *PonRxPowerData) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PonRxPowerData.Merge(m, src)
-}
-func (m *PonRxPowerData) XXX_Size() int {
-	return xxx_messageInfo_PonRxPowerData.Size(m)
-}
-func (m *PonRxPowerData) XXX_DiscardUnknown() {
-	xxx_messageInfo_PonRxPowerData.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PonRxPowerData proto.InternalMessageInfo
-
-func (m *PonRxPowerData) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *PonRxPowerData) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *PonRxPowerData) GetStatus() string {
-	if m != nil {
-		return m.Status
-	}
-	return ""
-}
-
-func (m *PonRxPowerData) GetFailReason() PonRxPowerData_RssiMeasurementFailReason {
-	if m != nil {
-		return m.FailReason
-	}
-	return PonRxPowerData_FAIL_REASON_NONE
-}
-
-func (m *PonRxPowerData) GetRxPowerMeanDbm() float64 {
-	if m != nil {
-		return m.RxPowerMeanDbm
-	}
-	return 0
-}
-
-type OnuAllocIdStatistics struct {
-	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intfId,proto3" json:"intfId,omitempty"`
-	AllocId              uint32   `protobuf:"fixed32,2,opt,name=allocId,proto3" json:"allocId,omitempty"`
-	RxBytes              uint64   `protobuf:"fixed64,3,opt,name=rxBytes,proto3" json:"rxBytes,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *OnuAllocIdStatistics) Reset()         { *m = OnuAllocIdStatistics{} }
-func (m *OnuAllocIdStatistics) String() string { return proto.CompactTextString(m) }
-func (*OnuAllocIdStatistics) ProtoMessage()    {}
-func (*OnuAllocIdStatistics) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{51}
-}
-
-func (m *OnuAllocIdStatistics) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuAllocIdStatistics.Unmarshal(m, b)
-}
-func (m *OnuAllocIdStatistics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuAllocIdStatistics.Marshal(b, m, deterministic)
-}
-func (m *OnuAllocIdStatistics) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuAllocIdStatistics.Merge(m, src)
-}
-func (m *OnuAllocIdStatistics) XXX_Size() int {
-	return xxx_messageInfo_OnuAllocIdStatistics.Size(m)
-}
-func (m *OnuAllocIdStatistics) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuAllocIdStatistics.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuAllocIdStatistics proto.InternalMessageInfo
-
-func (m *OnuAllocIdStatistics) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *OnuAllocIdStatistics) GetAllocId() uint32 {
-	if m != nil {
-		return m.AllocId
-	}
-	return 0
-}
-
-func (m *OnuAllocIdStatistics) GetRxBytes() uint64 {
-	if m != nil {
-		return m.RxBytes
-	}
-	return 0
-}
-
-//
-// contains the onu id, state of the onu and the information about the alarms on the onu.
-// As of now only few alarms are added, any further information needed can be added to the structure.
-type OnuInfo struct {
-	OnuId                uint32           `protobuf:"fixed32,1,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
-	State                OnuInfo_OnuState `protobuf:"varint,2,opt,name=state,proto3,enum=openolt.OnuInfo_OnuState" json:"state,omitempty"`
-	Losi                 AlarmState       `protobuf:"varint,3,opt,name=losi,proto3,enum=openolt.AlarmState" json:"losi,omitempty"`
-	Lofi                 AlarmState       `protobuf:"varint,4,opt,name=lofi,proto3,enum=openolt.AlarmState" json:"lofi,omitempty"`
-	Loami                AlarmState       `protobuf:"varint,5,opt,name=loami,proto3,enum=openolt.AlarmState" json:"loami,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
-	XXX_unrecognized     []byte           `json:"-"`
-	XXX_sizecache        int32            `json:"-"`
-}
-
-func (m *OnuInfo) Reset()         { *m = OnuInfo{} }
-func (m *OnuInfo) String() string { return proto.CompactTextString(m) }
-func (*OnuInfo) ProtoMessage()    {}
-func (*OnuInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{52}
-}
-
-func (m *OnuInfo) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuInfo.Unmarshal(m, b)
-}
-func (m *OnuInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuInfo.Marshal(b, m, deterministic)
-}
-func (m *OnuInfo) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuInfo.Merge(m, src)
-}
-func (m *OnuInfo) XXX_Size() int {
-	return xxx_messageInfo_OnuInfo.Size(m)
-}
-func (m *OnuInfo) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuInfo.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuInfo proto.InternalMessageInfo
-
-func (m *OnuInfo) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-func (m *OnuInfo) GetState() OnuInfo_OnuState {
-	if m != nil {
-		return m.State
-	}
-	return OnuInfo_UNKNOWN
-}
-
-func (m *OnuInfo) GetLosi() AlarmState {
-	if m != nil {
-		return m.Losi
-	}
-	return AlarmState_OFF
-}
-
-func (m *OnuInfo) GetLofi() AlarmState {
-	if m != nil {
-		return m.Lofi
-	}
-	return AlarmState_OFF
-}
-
-func (m *OnuInfo) GetLoami() AlarmState {
-	if m != nil {
-		return m.Loami
-	}
-	return AlarmState_OFF
-}
-
-//
-// IntfInfo has the interface Id and if there are any alarms active on that interface.
-// Any further information needed from the interface object can be added to the structure.
-type PonIntfInfo struct {
-	IntfId               uint32                   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
-	State                PonIntfInfo_PonIntfState `protobuf:"varint,3,opt,name=state,proto3,enum=openolt.PonIntfInfo_PonIntfState" json:"state,omitempty"`
-	Los                  AlarmState               `protobuf:"varint,4,opt,name=los,proto3,enum=openolt.AlarmState" json:"los,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
-	XXX_unrecognized     []byte                   `json:"-"`
-	XXX_sizecache        int32                    `json:"-"`
-}
-
-func (m *PonIntfInfo) Reset()         { *m = PonIntfInfo{} }
-func (m *PonIntfInfo) String() string { return proto.CompactTextString(m) }
-func (*PonIntfInfo) ProtoMessage()    {}
-func (*PonIntfInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{53}
-}
-
-func (m *PonIntfInfo) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PonIntfInfo.Unmarshal(m, b)
-}
-func (m *PonIntfInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PonIntfInfo.Marshal(b, m, deterministic)
-}
-func (m *PonIntfInfo) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PonIntfInfo.Merge(m, src)
-}
-func (m *PonIntfInfo) XXX_Size() int {
-	return xxx_messageInfo_PonIntfInfo.Size(m)
-}
-func (m *PonIntfInfo) XXX_DiscardUnknown() {
-	xxx_messageInfo_PonIntfInfo.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PonIntfInfo proto.InternalMessageInfo
-
-func (m *PonIntfInfo) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *PonIntfInfo) GetState() PonIntfInfo_PonIntfState {
-	if m != nil {
-		return m.State
-	}
-	return PonIntfInfo_UNKNOWN
-}
-
-func (m *PonIntfInfo) GetLos() AlarmState {
-	if m != nil {
-		return m.Los
-	}
-	return AlarmState_OFF
-}
-
-//
-// Message used for disabling device by serialnumber, disable at PLOAM
-type InterfaceOnuSerialNumberOnuId struct {
-	IntfIdSerialNum      *InterfaceOnuSerialNumber `protobuf:"bytes,1,opt,name=intf_id_serial_num,json=intfIdSerialNum,proto3" json:"intf_id_serial_num,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 *InterfaceOnuSerialNumberOnuId) Reset()         { *m = InterfaceOnuSerialNumberOnuId{} }
-func (m *InterfaceOnuSerialNumberOnuId) String() string { return proto.CompactTextString(m) }
-func (*InterfaceOnuSerialNumberOnuId) ProtoMessage()    {}
-func (*InterfaceOnuSerialNumberOnuId) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{54}
-}
-
-func (m *InterfaceOnuSerialNumberOnuId) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_InterfaceOnuSerialNumberOnuId.Unmarshal(m, b)
-}
-func (m *InterfaceOnuSerialNumberOnuId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_InterfaceOnuSerialNumberOnuId.Marshal(b, m, deterministic)
-}
-func (m *InterfaceOnuSerialNumberOnuId) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_InterfaceOnuSerialNumberOnuId.Merge(m, src)
-}
-func (m *InterfaceOnuSerialNumberOnuId) XXX_Size() int {
-	return xxx_messageInfo_InterfaceOnuSerialNumberOnuId.Size(m)
-}
-func (m *InterfaceOnuSerialNumberOnuId) XXX_DiscardUnknown() {
-	xxx_messageInfo_InterfaceOnuSerialNumberOnuId.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_InterfaceOnuSerialNumberOnuId proto.InternalMessageInfo
-
-func (m *InterfaceOnuSerialNumberOnuId) GetIntfIdSerialNum() *InterfaceOnuSerialNumber {
-	if m != nil {
-		return m.IntfIdSerialNum
-	}
-	return nil
-}
-
-func (m *InterfaceOnuSerialNumberOnuId) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
-	}
-	return 0
-}
-
-type InterfaceOnuSerialNumber struct {
-	IntfId               uint32        `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
-	OnuSerialNumber      *SerialNumber `protobuf:"bytes,2,opt,name=onu_serial_number,json=onuSerialNumber,proto3" json:"onu_serial_number,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
-	XXX_unrecognized     []byte        `json:"-"`
-	XXX_sizecache        int32         `json:"-"`
-}
-
-func (m *InterfaceOnuSerialNumber) Reset()         { *m = InterfaceOnuSerialNumber{} }
-func (m *InterfaceOnuSerialNumber) String() string { return proto.CompactTextString(m) }
-func (*InterfaceOnuSerialNumber) ProtoMessage()    {}
-func (*InterfaceOnuSerialNumber) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{55}
-}
-
-func (m *InterfaceOnuSerialNumber) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_InterfaceOnuSerialNumber.Unmarshal(m, b)
-}
-func (m *InterfaceOnuSerialNumber) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_InterfaceOnuSerialNumber.Marshal(b, m, deterministic)
-}
-func (m *InterfaceOnuSerialNumber) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_InterfaceOnuSerialNumber.Merge(m, src)
-}
-func (m *InterfaceOnuSerialNumber) XXX_Size() int {
-	return xxx_messageInfo_InterfaceOnuSerialNumber.Size(m)
-}
-func (m *InterfaceOnuSerialNumber) XXX_DiscardUnknown() {
-	xxx_messageInfo_InterfaceOnuSerialNumber.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_InterfaceOnuSerialNumber proto.InternalMessageInfo
-
-func (m *InterfaceOnuSerialNumber) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
-	}
-	return 0
-}
-
-func (m *InterfaceOnuSerialNumber) GetOnuSerialNumber() *SerialNumber {
-	if m != nil {
-		return m.OnuSerialNumber
-	}
-	return nil
-}
-
-type Empty struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Empty) Reset()         { *m = Empty{} }
-func (m *Empty) String() string { return proto.CompactTextString(m) }
-func (*Empty) ProtoMessage()    {}
-func (*Empty) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{56}
-}
-
-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.AlarmState", AlarmState_name, AlarmState_value)
-	proto.RegisterEnum("openolt.OnuIndication_ActivationFailReason", OnuIndication_ActivationFailReason_name, OnuIndication_ActivationFailReason_value)
-	proto.RegisterEnum("openolt.IntfOperIndication_PONResourceRanges_Pool_PoolType", IntfOperIndication_PONResourceRanges_Pool_PoolType_name, IntfOperIndication_PONResourceRanges_Pool_PoolType_value)
-	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.RegisterEnum("openolt.GroupMember_InterfaceType", GroupMember_InterfaceType_name, GroupMember_InterfaceType_value)
-	proto.RegisterEnum("openolt.Group_GroupMembersCommand", Group_GroupMembersCommand_name, Group_GroupMembersCommand_value)
-	proto.RegisterEnum("openolt.PonRxPowerData_RssiMeasurementFailReason", PonRxPowerData_RssiMeasurementFailReason_name, PonRxPowerData_RssiMeasurementFailReason_value)
-	proto.RegisterEnum("openolt.OnuInfo_OnuState", OnuInfo_OnuState_name, OnuInfo_OnuState_value)
-	proto.RegisterEnum("openolt.PonIntfInfo_PonIntfState", PonIntfInfo_PonIntfState_name, PonIntfInfo_PonIntfState_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((*OnuDisabledIndication)(nil), "openolt.OnuDisabledIndication")
-	proto.RegisterType((*OnuEnabledIndication)(nil), "openolt.OnuEnabledIndication")
-	proto.RegisterType((*IntfOperIndication)(nil), "openolt.IntfOperIndication")
-	proto.RegisterType((*IntfOperIndication_PONResourceRanges)(nil), "openolt.IntfOperIndication.PONResourceRanges")
-	proto.RegisterType((*IntfOperIndication_PONResourceRanges_Pool)(nil), "openolt.IntfOperIndication.PONResourceRanges.Pool")
-	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((*OnuLogicalDistance)(nil), "openolt.OnuLogicalDistance")
-	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.RegisterMapType((map[uint32]bool)(nil), "openolt.Flow.GemportToAesEntry")
-	proto.RegisterMapType((map[uint32]uint32)(nil), "openolt.Flow.PbitToGemportEntry")
-	proto.RegisterType((*SerialNumber)(nil), "openolt.SerialNumber")
-	proto.RegisterType((*OnuStatistics)(nil), "openolt.OnuStatistics")
-	proto.RegisterType((*GemPortStatistics)(nil), "openolt.GemPortStatistics")
-	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((*OnuLossOfKeySyncFailureIndication)(nil), "openolt.OnuLossOfKeySyncFailureIndication")
-	proto.RegisterType((*RdiErrorIndication)(nil), "openolt.RdiErrorIndication")
-	proto.RegisterType((*OnuItuPonStatsIndication)(nil), "openolt.OnuItuPonStatsIndication")
-	proto.RegisterType((*OnuProcessingErrorIndication)(nil), "openolt.OnuProcessingErrorIndication")
-	proto.RegisterType((*OnuDeactivationFailureIndication)(nil), "openolt.OnuDeactivationFailureIndication")
-	proto.RegisterType((*OnuRemoteDefectIndication)(nil), "openolt.OnuRemoteDefectIndication")
-	proto.RegisterType((*OnuLossOfGEMChannelDelineationIndication)(nil), "openolt.OnuLossOfGEMChannelDelineationIndication")
-	proto.RegisterType((*OnuPhysicalEquipmentErrorIndication)(nil), "openolt.OnuPhysicalEquipmentErrorIndication")
-	proto.RegisterType((*OnuLossOfAcknowledgementIndication)(nil), "openolt.OnuLossOfAcknowledgementIndication")
-	proto.RegisterType((*OnuDifferentialReachExceededIndication)(nil), "openolt.OnuDifferentialReachExceededIndication")
-	proto.RegisterType((*GroupMember)(nil), "openolt.GroupMember")
-	proto.RegisterType((*Group)(nil), "openolt.Group")
-	proto.RegisterType((*ValueParam)(nil), "openolt.ValueParam")
-	proto.RegisterType((*PonRxPowerData)(nil), "openolt.PonRxPowerData")
-	proto.RegisterType((*OnuAllocIdStatistics)(nil), "openolt.OnuAllocIdStatistics")
-	proto.RegisterType((*OnuInfo)(nil), "openolt.OnuInfo")
-	proto.RegisterType((*PonIntfInfo)(nil), "openolt.PonIntfInfo")
-	proto.RegisterType((*InterfaceOnuSerialNumberOnuId)(nil), "openolt.InterfaceOnuSerialNumberOnuId")
-	proto.RegisterType((*InterfaceOnuSerialNumber)(nil), "openolt.InterfaceOnuSerialNumber")
-	proto.RegisterType((*Empty)(nil), "openolt.Empty")
-}
-
-func init() { proto.RegisterFile("voltha_protos/openolt.proto", fileDescriptor_c072e7aa0dfd74d5) }
-
-var fileDescriptor_c072e7aa0dfd74d5 = []byte{
-	// 5437 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x7c, 0xc9, 0x73, 0x23, 0xc9,
-	0x75, 0x77, 0x83, 0x04, 0x01, 0xf0, 0x11, 0x00, 0xc1, 0xe4, 0x4e, 0xf6, 0x5a, 0xb3, 0xf5, 0x8c,
-	0x34, 0x6c, 0x4d, 0x4b, 0x9f, 0x34, 0x5a, 0x3e, 0x69, 0xd0, 0x04, 0x9a, 0xc4, 0x0c, 0x09, 0xd0,
-	0x45, 0x74, 0xb7, 0x35, 0xf2, 0x44, 0xa9, 0x58, 0x95, 0x00, 0x4b, 0x2c, 0x54, 0xd6, 0x54, 0x15,
-	0xc8, 0xa6, 0x8f, 0xb2, 0x2d, 0x5f, 0x7c, 0x53, 0xd8, 0x11, 0xf6, 0xc9, 0x4b, 0x84, 0x4f, 0xbe,
-	0xf8, 0xa6, 0x08, 0xdf, 0xec, 0x83, 0xff, 0x00, 0x9f, 0x1d, 0xe1, 0x83, 0xc3, 0x3e, 0xf8, 0xe4,
-	0x8b, 0x4f, 0x3e, 0x38, 0xf2, 0x65, 0xd6, 0x92, 0x58, 0xc8, 0xa6, 0x86, 0x96, 0x2f, 0x1d, 0xcc,
-	0xb7, 0xfc, 0x5e, 0xe6, 0xcb, 0xf7, 0x32, 0x5f, 0x66, 0x25, 0x1a, 0xb6, 0xcf, 0x99, 0x1b, 0x9d,
-	0x9a, 0x86, 0x1f, 0xb0, 0x88, 0x85, 0x4f, 0x98, 0x4f, 0x3d, 0xe6, 0x46, 0x3b, 0xd8, 0x24, 0x45,
-	0xd9, 0xdc, 0xba, 0xdb, 0x67, 0xac, 0xef, 0xd2, 0x27, 0xa6, 0xef, 0x3c, 0x31, 0x3d, 0x8f, 0x45,
-	0x66, 0xe4, 0x30, 0x2f, 0x14, 0x62, 0x5b, 0x0f, 0x55, 0x8c, 0x88, 0x5a, 0xa7, 0xfc, 0xef, 0x9e,
-	0xe3, 0x52, 0x29, 0x71, 0x5f, 0x95, 0xa0, 0xaf, 0x23, 0xc3, 0x62, 0x5e, 0xcf, 0xe9, 0x4f, 0xe5,
-	0x53, 0x2f, 0xcc, 0x58, 0xd8, 0x52, 0xf9, 0x16, 0x1b, 0x0c, 0x98, 0x27, 0x78, 0xda, 0xbf, 0xcc,
-	0x01, 0xb4, 0x3c, 0xdb, 0xb1, 0xb0, 0x4f, 0xe4, 0x23, 0x28, 0x32, 0x37, 0x32, 0x1c, 0xcf, 0xde,
-	0xc8, 0x3d, 0xcc, 0x3d, 0x5e, 0x78, 0xba, 0xb6, 0x13, 0x0f, 0xaa, 0xe3, 0x46, 0xa9, 0xe0, 0xfe,
-	0x1d, 0xbd, 0xc0, 0x90, 0x40, 0xbe, 0x05, 0x25, 0xc7, 0x8b, 0x7a, 0xa8, 0x33, 0x83, 0x3a, 0xeb,
-	0x89, 0x4e, 0xcb, 0x8b, 0x7a, 0x8a, 0x52, 0xd1, 0x11, 0x14, 0x52, 0x87, 0x0a, 0x6a, 0x31, 0x9f,
-	0x06, 0xa8, 0x3a, 0x8b, 0xaa, 0xdb, 0x8a, 0x6a, 0xc7, 0xa7, 0x81, 0xa2, 0xbe, 0xe0, 0xa4, 0x54,
-	0xf2, 0x43, 0x28, 0x33, 0x6f, 0x68, 0xd8, 0x4e, 0x68, 0x21, 0x42, 0x1e, 0x11, 0xb6, 0xd2, 0x0e,
-	0x7b, 0xc3, 0x86, 0x13, 0x5a, 0x0a, 0x00, 0xb0, 0x84, 0x88, 0x63, 0xf5, 0x86, 0xa8, 0x3a, 0x37,
-	0x3a, 0x56, 0x6f, 0x38, 0x32, 0x56, 0x24, 0xf0, 0xb1, 0xb2, 0x81, 0xe5, 0xa0, 0x4e, 0x61, 0x64,
-	0xac, 0x9d, 0x81, 0xe5, 0xa8, 0x63, 0x65, 0x82, 0x42, 0xbe, 0x05, 0x45, 0xff, 0x4c, 0x38, 0xb5,
-	0x88, 0x4a, 0x9b, 0x89, 0xd2, 0x91, 0x69, 0x9d, 0xd1, 0x11, 0xbf, 0xfa, 0x67, 0xe8, 0xd7, 0xef,
-	0x00, 0xf8, 0x2c, 0x88, 0x8c, 0x30, 0x32, 0xa3, 0x70, 0xa3, 0x24, 0x7b, 0x28, 0x27, 0xef, 0x88,
-	0x05, 0xd1, 0x31, 0x8f, 0xa3, 0x30, 0x72, 0xac, 0x70, 0xff, 0x8e, 0x3e, 0xef, 0x4b, 0x4a, 0x48,
-	0x3e, 0x06, 0xe8, 0xb9, 0xec, 0x42, 0x2a, 0xce, 0x8f, 0x74, 0xf3, 0xb9, 0xcb, 0x2e, 0x54, 0xcd,
-	0x9e, 0xa4, 0x84, 0xe4, 0x3b, 0x30, 0x6f, 0xba, 0x66, 0x30, 0xc0, 0xae, 0x02, 0x2a, 0x6e, 0x24,
-	0x8a, 0x75, 0xce, 0x51, 0x7a, 0x5a, 0x32, 0x25, 0x89, 0x7c, 0x0a, 0x35, 0x39, 0x15, 0xe6, 0x89,
-	0x4b, 0x6d, 0xd4, 0x5f, 0x40, 0xfd, 0xfb, 0x23, 0xd3, 0x81, 0x7c, 0x05, 0xa5, 0xca, 0x14, 0x06,
-	0xd9, 0x83, 0x45, 0x8e, 0x45, 0xbd, 0x14, 0xaa, 0x8c, 0x50, 0xf7, 0xb2, 0x50, 0x4d, 0x6f, 0x1c,
-	0xa9, 0xc2, 0xb2, 0xf4, 0x67, 0x05, 0xc8, 0xdb, 0x66, 0x64, 0x6a, 0xff, 0x51, 0x81, 0xc5, 0x91,
-	0xce, 0xf3, 0xb9, 0x77, 0x59, 0x38, 0x31, 0xce, 0x0f, 0x58, 0xa8, 0xce, 0x87, 0x8b, 0x04, 0xd2,
-	0x80, 0xaa, 0x7d, 0xe9, 0x78, 0x7d, 0xa3, 0x6f, 0x86, 0x7e, 0x26, 0xda, 0xef, 0x26, 0x9a, 0x0d,
-	0xce, 0xde, 0x33, 0x43, 0x5f, 0xd1, 0x2f, 0xdb, 0x19, 0x32, 0x8f, 0x7b, 0x3e, 0xba, 0xd4, 0xcd,
-	0xa3, 0x71, 0xdf, 0xf1, 0x86, 0xe3, 0x9e, 0x5e, 0x60, 0x29, 0x95, 0xbc, 0x82, 0x15, 0x0e, 0x11,
-	0x46, 0x66, 0x10, 0x0d, 0x7d, 0xa3, 0x67, 0x3a, 0x6e, 0x26, 0xfe, 0xdf, 0xce, 0x22, 0x1d, 0x0b,
-	0x99, 0xe7, 0xa6, 0xe3, 0x0e, 0x03, 0xaa, 0x40, 0x2e, 0x31, 0x85, 0xcd, 0x81, 0x3f, 0x87, 0x35,
-	0x04, 0x76, 0xfa, 0x9e, 0xe9, 0x1a, 0x36, 0xed, 0x07, 0xa6, 0x4d, 0x33, 0xf9, 0xf1, 0x96, 0x02,
-	0x8d, 0x52, 0x0d, 0x21, 0xa4, 0x20, 0x2f, 0xb3, 0x71, 0x2e, 0xf9, 0x09, 0xac, 0x63, 0x84, 0x04,
-	0x4e, 0x2f, 0x32, 0x58, 0xcf, 0xb8, 0x70, 0x3c, 0x9b, 0x5d, 0x64, 0x12, 0x49, 0x01, 0x6f, 0x70,
-	0xb1, 0x4e, 0xef, 0x15, 0x0a, 0x8d, 0x81, 0x8f, 0x72, 0x49, 0x17, 0xf8, 0x68, 0x0c, 0x97, 0x85,
-	0xa1, 0x91, 0xe4, 0xa7, 0x48, 0xb5, 0xf7, 0xb2, 0xb0, 0x07, 0x2c, 0x0c, 0x3b, 0x3d, 0x9e, 0xa8,
-	0xbb, 0xa7, 0xa6, 0xe7, 0x51, 0x77, 0x2c, 0x10, 0x51, 0x42, 0xa6, 0x6d, 0xec, 0x67, 0x1c, 0x4a,
-	0x98, 0xfa, 0xb9, 0x34, 0xc1, 0xcf, 0x42, 0x66, 0xaa, 0x9f, 0x53, 0x36, 0x07, 0xee, 0x88, 0x85,
-	0x2b, 0x72, 0x2e, 0x44, 0x4f, 0x45, 0x8a, 0x7e, 0x2d, 0x0b, 0xd8, 0x0d, 0x4c, 0x2f, 0x1c, 0x38,
-	0x21, 0x5f, 0xc6, 0x5b, 0x5e, 0x44, 0x83, 0x1e, 0x0d, 0xa8, 0x67, 0xd1, 0x57, 0x66, 0xe0, 0x39,
-	0x5e, 0x5f, 0xae, 0x64, 0x5d, 0xe7, 0x02, 0x7b, 0xfa, 0x53, 0xe1, 0x5c, 0xd3, 0x8a, 0x9c, 0x73,
-	0xb4, 0x9b, 0x76, 0x16, 0xc6, 0xbd, 0x50, 0x4f, 0xc4, 0x26, 0xf5, 0x97, 0x8f, 0x59, 0x95, 0x10,
-	0x16, 0x36, 0xb8, 0x05, 0x3f, 0x60, 0x16, 0x0d, 0x43, 0x9e, 0x05, 0x34, 0x08, 0x58, 0x90, 0x49,
-	0xf4, 0x77, 0xb2, 0x26, 0x8e, 0x12, 0xb9, 0x26, 0x17, 0x53, 0x0c, 0xac, 0xb2, 0x49, 0x7c, 0x42,
-	0x61, 0x33, 0x9d, 0xc3, 0x9e, 0x11, 0x5e, 0x7a, 0x56, 0x3a, 0x0a, 0xb1, 0x00, 0x7c, 0x30, 0x3e,
-	0x97, 0x9f, 0xd1, 0xcb, 0xe3, 0x4b, 0xcf, 0x9a, 0x36, 0x10, 0x21, 0x14, 0x4b, 0x70, 0x33, 0x2f,
-	0x60, 0x15, 0x17, 0xfd, 0x68, 0x68, 0xf8, 0xcc, 0x13, 0x6b, 0x24, 0x9a, 0xa8, 0xa0, 0x89, 0x47,
-	0xca, 0x16, 0x10, 0x0d, 0x8f, 0x98, 0x87, 0x4b, 0xe3, 0xd8, 0x94, 0xaa, 0x3c, 0xe2, 0xc2, 0x5d,
-	0x0c, 0x6f, 0x3a, 0x32, 0x07, 0xc3, 0x40, 0x24, 0x50, 0x15, 0xd1, 0xdf, 0x57, 0x62, 0x3c, 0x23,
-	0x3b, 0xa9, 0xff, 0xdc, 0x1d, 0x93, 0x65, 0xc8, 0x2b, 0x31, 0x88, 0x80, 0x0e, 0x58, 0x44, 0x0d,
-	0x9b, 0xf6, 0xa8, 0x25, 0xb6, 0x97, 0x45, 0x34, 0xa3, 0x65, 0xcd, 0xe8, 0x28, 0xd4, 0x40, 0x19,
-	0x05, 0x9f, 0xb0, 0x31, 0x26, 0x09, 0xc5, 0x30, 0x70, 0x12, 0xfa, 0x74, 0x60, 0xd8, 0xd4, 0x75,
-	0x3c, 0x2a, 0x86, 0xc3, 0xf1, 0x6b, 0x88, 0xff, 0xd1, 0xf8, 0x3c, 0xec, 0x35, 0x0f, 0x65, 0x4a,
-	0x35, 0x52, 0x15, 0xc5, 0xdc, 0x86, 0x9c, 0x8e, 0x3d, 0x3a, 0x50, 0x45, 0xc8, 0x39, 0x3c, 0xc4,
-	0xd8, 0x3a, 0xbd, 0x0c, 0x1d, 0xcb, 0x74, 0x0d, 0xfa, 0xe5, 0xd0, 0xf1, 0x07, 0xd4, 0x8b, 0x32,
-	0x31, 0xb6, 0x84, 0x86, 0xbf, 0xae, 0xc4, 0x98, 0x94, 0x6f, 0xc6, 0xe2, 0xe3, 0xa1, 0xc6, 0x07,
-	0x33, 0x55, 0x8c, 0xfc, 0x04, 0x96, 0xb3, 0x11, 0x67, 0x5a, 0x67, 0x68, 0x8a, 0x8c, 0x67, 0xa3,
-	0x18, 0x63, 0xdd, 0x3a, 0xf3, 0xd8, 0x85, 0x4b, 0xed, 0x3e, 0xe5, 0x38, 0x8a, 0xa5, 0x45, 0x96,
-	0x91, 0xe2, 0xe0, 0x0c, 0xb6, 0xc5, 0x8e, 0xd8, 0xeb, 0x19, 0x01, 0x35, 0xad, 0x53, 0x83, 0xbe,
-	0xb6, 0x28, 0xb5, 0xe5, 0x8e, 0xb6, 0x8c, 0x46, 0x9e, 0xa8, 0x9b, 0x63, 0x0f, 0x93, 0x3c, 0x72,
-	0x4c, 0x57, 0xe7, 0x1a, 0x4d, 0xa9, 0xa0, 0x18, 0x5a, 0x67, 0x42, 0x72, 0x54, 0x22, 0xd9, 0xed,
-	0x76, 0xa0, 0xa2, 0x54, 0x6a, 0xe4, 0x1e, 0x00, 0x16, 0x59, 0x3c, 0xd4, 0x29, 0xee, 0x76, 0xf3,
-	0xfa, 0x3c, 0xa7, 0xf0, 0xe0, 0xa5, 0xda, 0x3e, 0x54, 0xd5, 0x2a, 0x8d, 0xac, 0x43, 0x51, 0x14,
-	0x74, 0x62, 0x6f, 0x2c, 0xea, 0x05, 0x2c, 0xda, 0xec, 0x11, 0xa4, 0x99, 0x51, 0xa4, 0x53, 0x58,
-	0x1a, 0x2b, 0xb9, 0xa6, 0x83, 0x7d, 0x0f, 0x2a, 0x21, 0x0d, 0x1c, 0xd3, 0x35, 0xbc, 0xe1, 0xe0,
-	0x84, 0x06, 0x72, 0x37, 0x5d, 0x4d, 0x5c, 0x72, 0x8c, 0xdc, 0x36, 0x32, 0xf5, 0x72, 0x98, 0x69,
-	0x69, 0xbf, 0xcc, 0x43, 0x45, 0x29, 0xd1, 0xa6, 0x9b, 0x59, 0x85, 0x02, 0xe6, 0xbb, 0xd8, 0xad,
-	0x8b, 0xfa, 0x1c, 0xcf, 0xdd, 0xd1, 0xa1, 0xcc, 0x8e, 0x0c, 0x85, 0x3c, 0x80, 0x05, 0xd3, 0x1e,
-	0x38, 0x9e, 0xe4, 0xcf, 0x21, 0x1f, 0x90, 0x24, 0x04, 0xc6, 0x7a, 0x9f, 0x7f, 0xe3, 0xde, 0x93,
-	0x03, 0x58, 0xc0, 0x85, 0x2d, 0xa0, 0x66, 0xc8, 0x3c, 0xdc, 0xfe, 0xaa, 0x6a, 0xbc, 0xa5, 0x03,
-	0xdb, 0x51, 0x97, 0x62, 0x1d, 0x55, 0x74, 0xe8, 0x25, 0x7f, 0x6b, 0x7f, 0x38, 0x03, 0x2b, 0x93,
-	0x84, 0xc8, 0x5b, 0xf0, 0xa0, 0xd3, 0x7e, 0x61, 0xd4, 0x77, 0xbb, 0xad, 0x97, 0xf5, 0x6e, 0xab,
-	0xd3, 0x36, 0x9e, 0xd7, 0x5b, 0x07, 0x86, 0xde, 0xac, 0x1f, 0x77, 0xda, 0x46, 0xbb, 0xd3, 0x6e,
-	0xd6, 0xee, 0x90, 0x77, 0x41, 0xbb, 0x42, 0x48, 0xaf, 0xb7, 0xf7, 0x5a, 0xed, 0xbd, 0x5a, 0x8e,
-	0x7c, 0x1b, 0x9e, 0x5e, 0x21, 0x77, 0x54, 0x3f, 0x3e, 0x7e, 0xd5, 0xd1, 0x1b, 0x46, 0xfd, 0x45,
-	0x77, 0xbf, 0xd9, 0xee, 0xb6, 0x76, 0x51, 0xa6, 0x36, 0x43, 0x34, 0xb8, 0x7f, 0x85, 0xde, 0x41,
-	0xe7, 0xb8, 0x36, 0x4b, 0x1e, 0xc1, 0xbd, 0x49, 0x32, 0x48, 0x3b, 0xa8, 0xeb, 0x87, 0xb5, 0xfc,
-	0xb4, 0xb1, 0x1c, 0xbf, 0x6a, 0x75, 0x77, 0xf7, 0x8d, 0xce, 0xcb, 0xa6, 0x5e, 0x9b, 0xd3, 0x7e,
-	0x2f, 0x07, 0xab, 0x13, 0x8b, 0xcc, 0x1b, 0x47, 0xc7, 0x57, 0x98, 0x5d, 0xed, 0xe7, 0x39, 0x58,
-	0x99, 0x54, 0x9f, 0xfe, 0x66, 0x3b, 0x91, 0x07, 0x32, 0x7e, 0x80, 0x22, 0x04, 0xf2, 0xd1, 0xa5,
-	0x1f, 0x2f, 0x02, 0xf8, 0x77, 0xb6, 0x5b, 0x33, 0x57, 0x64, 0xfb, 0x58, 0x8a, 0xac, 0xc0, 0x5c,
-	0xe8, 0x53, 0x2a, 0xca, 0xce, 0xa2, 0x2e, 0x1a, 0xe4, 0x3e, 0x00, 0x3f, 0xc0, 0x7a, 0xcc, 0x65,
-	0xfd, 0xcb, 0x38, 0x6f, 0x52, 0x0a, 0x69, 0x42, 0x21, 0x30, 0xbd, 0x3e, 0x0d, 0x65, 0xd5, 0xf7,
-	0xe1, 0x15, 0xe7, 0xbd, 0x9d, 0xa3, 0x4e, 0x5b, 0xa7, 0x21, 0x1b, 0x06, 0x16, 0xd5, 0x51, 0x49,
-	0x97, 0xca, 0x5b, 0x7f, 0x39, 0x03, 0x4b, 0x63, 0x5c, 0xb2, 0x0f, 0x73, 0x3e, 0x63, 0x6e, 0xb8,
-	0x31, 0xfb, 0x70, 0xf6, 0xf1, 0xc2, 0xd3, 0xa7, 0x37, 0xc2, 0xde, 0x39, 0x62, 0xcc, 0xd5, 0x05,
-	0xc0, 0xd6, 0xdf, 0xe7, 0x20, 0xcf, 0xdb, 0xa4, 0x93, 0xf1, 0x58, 0xf5, 0xe9, 0xf7, 0x6f, 0x8e,
-	0x88, 0xff, 0x74, 0x2f, 0x7d, 0x2a, 0xdd, 0xcd, 0xdd, 0xc6, 0xab, 0x6e, 0x74, 0x28, 0x77, 0x1b,
-	0x6f, 0x90, 0x1a, 0xcc, 0x52, 0x2f, 0x76, 0x25, 0xff, 0x53, 0xab, 0x43, 0x29, 0xd6, 0x24, 0x00,
-	0x05, 0x1e, 0xfd, 0xad, 0x46, 0xed, 0x0e, 0x29, 0x43, 0xa9, 0x7e, 0x70, 0xd0, 0xd9, 0xe5, 0xad,
-	0x1c, 0xa9, 0x02, 0xec, 0x35, 0x0f, 0x8f, 0x3a, 0x7a, 0x97, 0xb7, 0x67, 0xc8, 0x02, 0x14, 0x9f,
-	0x1f, 0x74, 0x5e, 0xf1, 0xc6, 0xac, 0xa6, 0x43, 0x55, 0x3d, 0x93, 0xde, 0x38, 0x04, 0x6b, 0x30,
-	0xeb, 0x9f, 0x89, 0xae, 0x96, 0x75, 0xfe, 0xa7, 0xf6, 0x9f, 0x39, 0xa8, 0x8d, 0x9e, 0x59, 0xc9,
-	0x36, 0xcc, 0x23, 0x2c, 0x7a, 0x4a, 0xcc, 0x39, 0x5e, 0x09, 0x74, 0x47, 0xe2, 0x6b, 0x9a, 0xcd,
-	0x52, 0xd6, 0xe6, 0x2a, 0x14, 0x86, 0x9e, 0xc3, 0xc9, 0xf3, 0x82, 0x3c, 0xf4, 0x1c, 0x11, 0x8d,
-	0x7d, 0x3a, 0xc0, 0x03, 0x71, 0xd2, 0xcb, 0x79, 0x49, 0x69, 0xd9, 0xdc, 0x0a, 0x9e, 0x79, 0x1d,
-	0x5b, 0x3a, 0xb6, 0xc0, 0x9b, 0x82, 0x81, 0x4a, 0x1e, 0xc3, 0x88, 0x2b, 0xea, 0x05, 0xde, 0x6c,
-	0x33, 0xb2, 0x06, 0x05, 0x8b, 0xb1, 0x33, 0x87, 0xe2, 0x41, 0xa1, 0xa0, 0xcb, 0x56, 0x3c, 0xe6,
-	0x7c, 0x3a, 0xe6, 0x3a, 0xcc, 0x8b, 0x12, 0xdc, 0xb4, 0xae, 0x18, 0x8e, 0xe2, 0x04, 0xd1, 0xbf,
-	0xc4, 0x09, 0xda, 0x0f, 0x60, 0x7e, 0x9f, 0x9a, 0x41, 0x74, 0x42, 0xcd, 0x88, 0x3c, 0x81, 0xe5,
-	0xd3, 0xb8, 0x21, 0x4e, 0x17, 0xd1, 0x30, 0xa0, 0x12, 0x8e, 0x24, 0xac, 0xe3, 0x98, 0xa3, 0xfd,
-	0x4d, 0x0e, 0x66, 0x3b, 0xde, 0xf0, 0xab, 0xaf, 0x20, 0xb3, 0x6f, 0xbe, 0x49, 0x71, 0x37, 0x38,
-	0x41, 0x1c, 0x91, 0xbe, 0x13, 0x90, 0xf7, 0x60, 0x91, 0x0d, 0x2c, 0xcb, 0xa0, 0x9e, 0x15, 0x5c,
-	0xfa, 0x7c, 0xe2, 0x71, 0xae, 0x4b, 0x7a, 0x95, 0x93, 0x9b, 0x09, 0x55, 0xfb, 0xdb, 0x1c, 0x10,
-	0x2c, 0x9a, 0xfa, 0xbc, 0xee, 0x6a, 0x38, 0x61, 0x64, 0x7a, 0x16, 0xbd, 0x71, 0xef, 0xbf, 0x0b,
-	0x9b, 0xae, 0x80, 0x30, 0xe4, 0xdd, 0x02, 0xe2, 0x18, 0xbf, 0x4b, 0x03, 0x26, 0x27, 0x79, 0x4d,
-	0x0a, 0x88, 0x55, 0x1f, 0xd9, 0x9f, 0xd3, 0x80, 0x91, 0x6f, 0xc0, 0xca, 0x24, 0x55, 0x39, 0x1a,
-	0x32, 0xae, 0xa5, 0x7d, 0x06, 0x45, 0x9e, 0x2b, 0x87, 0x61, 0xff, 0x16, 0x92, 0xe4, 0xcf, 0x73,
-	0x30, 0xcf, 0x0b, 0x54, 0xcc, 0x93, 0x1b, 0xe3, 0x65, 0x22, 0x36, 0xaf, 0x44, 0xac, 0x9a, 0x02,
-	0x73, 0xa3, 0x29, 0xb0, 0x09, 0x25, 0xd3, 0x75, 0x99, 0xc5, 0x99, 0x22, 0xd4, 0x8b, 0xd8, 0x9e,
-	0xd8, 0xc5, 0xef, 0x42, 0xf9, 0x85, 0xef, 0x3a, 0xde, 0xd9, 0x75, 0x9d, 0x94, 0xaa, 0x33, 0xa9,
-	0xea, 0xaf, 0x8a, 0x00, 0x0d, 0x7a, 0xee, 0x58, 0xb4, 0xe5, 0xf5, 0x30, 0x8f, 0xce, 0xa9, 0x67,
-	0xb3, 0x40, 0xee, 0x2a, 0xb2, 0xc5, 0x17, 0xba, 0x01, 0xb3, 0xa9, 0x2b, 0xeb, 0x44, 0xd1, 0x20,
-	0xef, 0x43, 0xed, 0xd4, 0x0c, 0xec, 0x0b, 0x33, 0xa0, 0xc6, 0x39, 0x0d, 0xf8, 0xf1, 0x56, 0x6e,
-	0x2d, 0x8b, 0x31, 0xfd, 0xa5, 0x20, 0x73, 0xd1, 0x9e, 0x13, 0x0c, 0x14, 0xd1, 0xbc, 0x10, 0x8d,
-	0xe9, 0xb1, 0xe8, 0x36, 0xcc, 0xdb, 0xd8, 0x23, 0xde, 0xff, 0x9a, 0x58, 0x80, 0x04, 0xa1, 0x65,
-	0xf3, 0x60, 0x90, 0x4c, 0x35, 0x19, 0x96, 0x50, 0x8e, 0x08, 0x5e, 0x36, 0x13, 0xc8, 0x47, 0xb0,
-	0xe2, 0x07, 0xf4, 0xdc, 0x61, 0xc3, 0xd0, 0xbd, 0x34, 0x2c, 0xe6, 0x79, 0xd4, 0x8a, 0xa8, 0x28,
-	0xda, 0x4b, 0xfa, 0x72, 0xca, 0xdb, 0x8d, 0x59, 0xbc, 0x07, 0xfc, 0x38, 0xc9, 0xa7, 0x22, 0xc4,
-	0xd3, 0x6a, 0x51, 0x2f, 0xf9, 0xcc, 0x3b, 0xe2, 0x6d, 0xce, 0xf4, 0x3c, 0x47, 0x32, 0x57, 0x04,
-	0xd3, 0xf3, 0x1c, 0xc1, 0xfc, 0x24, 0xd9, 0x11, 0x17, 0x71, 0xd7, 0x7a, 0x9c, 0x5e, 0x27, 0x25,
-	0x4e, 0x96, 0x7f, 0x4e, 0xd9, 0x0c, 0xff, 0x38, 0x0f, 0x2b, 0x93, 0x04, 0x78, 0x44, 0xc8, 0x49,
-	0x0d, 0x37, 0x72, 0x0f, 0x67, 0x79, 0x44, 0x88, 0x59, 0x0d, 0x47, 0xf6, 0xe9, 0x99, 0xb1, 0x7d,
-	0x7a, 0x57, 0xdd, 0x4a, 0x3f, 0x7c, 0xd3, 0x4e, 0x29, 0xbb, 0xe8, 0x7f, 0xcf, 0xc8, 0x5d, 0xf4,
-	0x53, 0x65, 0x17, 0xfd, 0xf6, 0x8d, 0xc0, 0x46, 0x37, 0xd0, 0x63, 0x28, 0x86, 0xa7, 0x66, 0xe0,
-	0x78, 0x7d, 0xec, 0x76, 0xf5, 0xe9, 0x77, 0x6f, 0x06, 0x77, 0x2c, 0x94, 0x11, 0x31, 0x46, 0xfa,
-	0x4d, 0xee, 0xca, 0xa7, 0xb0, 0x90, 0xe9, 0x02, 0x59, 0x03, 0xd2, 0x68, 0x36, 0x78, 0xc1, 0xdc,
-	0x6c, 0x18, 0x47, 0x4d, 0xdd, 0x68, 0xb5, 0xbb, 0xcf, 0x6b, 0x77, 0xc8, 0x03, 0xd8, 0x3e, 0xde,
-	0xaf, 0xeb, 0xcd, 0x86, 0xf1, 0xec, 0xc7, 0x46, 0xfd, 0xe0, 0x00, 0xe9, 0xf8, 0x47, 0xb7, 0xb9,
-	0xbb, 0x5f, 0xcb, 0x91, 0x87, 0x70, 0x77, 0x82, 0xc0, 0x71, 0xfd, 0xb0, 0x29, 0x24, 0x66, 0x3e,
-	0xcd, 0x97, 0xe6, 0x6a, 0xe5, 0x4f, 0xf3, 0xa5, 0x4a, 0xad, 0xfa, 0x69, 0xbe, 0x54, 0xad, 0x2d,
-	0x6a, 0xbf, 0x3f, 0x0b, 0xb0, 0xeb, 0x9a, 0x61, 0xe8, 0xf4, 0x1c, 0x1a, 0xe0, 0x02, 0x64, 0x44,
-	0x7e, 0x92, 0xf3, 0x73, 0xac, 0xeb, 0x3b, 0x36, 0x59, 0x86, 0x39, 0x66, 0x9c, 0x27, 0xcb, 0x52,
-	0x9e, 0xbd, 0x74, 0x70, 0xb1, 0x72, 0x84, 0xac, 0x74, 0x91, 0x13, 0xcb, 0x3a, 0x28, 0x2b, 0x9c,
-	0x94, 0x77, 0xb8, 0xec, 0x3a, 0x14, 0x99, 0xe1, 0x9f, 0x38, 0x51, 0x28, 0x57, 0xa9, 0x02, 0x3b,
-	0xe2, 0x2d, 0x5c, 0x65, 0x24, 0x43, 0x6e, 0xc6, 0x8e, 0x60, 0x6c, 0x42, 0x89, 0x46, 0xa7, 0x62,
-	0xef, 0x2c, 0x8a, 0xb5, 0x8b, 0x46, 0xa7, 0x71, 0xfd, 0x60, 0x87, 0x91, 0x31, 0x30, 0x2d, 0xac,
-	0x13, 0xca, 0x7a, 0xc1, 0x0e, 0xa3, 0x43, 0xd3, 0xe2, 0x8c, 0x30, 0xb0, 0x90, 0x31, 0x2f, 0x18,
-	0x61, 0x60, 0x71, 0x06, 0x0f, 0x7b, 0x5f, 0x7c, 0xec, 0xc0, 0xeb, 0x2f, 0x1e, 0xf6, 0xfe, 0x11,
-	0x7e, 0x92, 0x59, 0x05, 0xae, 0x6d, 0x38, 0x3e, 0x5e, 0x5a, 0x15, 0xf5, 0x39, 0x3b, 0x8c, 0x5a,
-	0x3e, 0x27, 0x73, 0x28, 0xc7, 0x97, 0xa9, 0x3b, 0x17, 0x06, 0x56, 0xcb, 0xe7, 0x40, 0x9c, 0xcc,
-	0xf3, 0x16, 0xaf, 0x87, 0x8a, 0x3a, 0xb7, 0xc8, 0xd3, 0x96, 0xb3, 0x38, 0x10, 0xb2, 0xaa, 0x82,
-	0x65, 0x87, 0x11, 0xb2, 0x1e, 0x42, 0xd9, 0x3f, 0x8b, 0x8c, 0xc8, 0xec, 0x8b, 0xf1, 0x2c, 0x8a,
-	0xe4, 0xf2, 0xcf, 0xa2, 0xae, 0x89, 0x73, 0xae, 0xfd, 0xc1, 0x2c, 0xcc, 0xf3, 0x23, 0x1b, 0xf3,
-	0x76, 0x07, 0x36, 0xd1, 0xa0, 0x62, 0xda, 0xb6, 0xc1, 0x86, 0x11, 0x0d, 0xb8, 0x16, 0x4e, 0x46,
-	0x49, 0x5f, 0x30, 0x6d, 0xbb, 0xc3, 0x69, 0x5d, 0xb3, 0x4f, 0x1e, 0x43, 0x2d, 0xa0, 0x03, 0x76,
-	0x4e, 0x33, 0x62, 0x33, 0x62, 0xf3, 0x15, 0xf4, 0x44, 0xf2, 0x21, 0x94, 0xa3, 0xc0, 0xf4, 0x8d,
-	0x88, 0x19, 0xa7, 0x2c, 0x14, 0x01, 0x5d, 0xd2, 0x81, 0xd3, 0xba, 0x6c, 0x9f, 0x85, 0x11, 0xf9,
-	0x3a, 0x90, 0x80, 0x0e, 0xcc, 0xe0, 0x4c, 0x62, 0x89, 0xf9, 0xc8, 0xa3, 0x5c, 0x4d, 0x70, 0x10,
-	0x4d, 0xcc, 0x4c, 0x2a, 0xed, 0x78, 0x5e, 0x22, 0x3d, 0x97, 0x95, 0x6e, 0x71, 0x86, 0x90, 0x96,
-	0x63, 0x11, 0xa2, 0xbc, 0x93, 0x85, 0x64, 0x2c, 0x28, 0xa5, 0x8e, 0x25, 0x15, 0x2b, 0x66, 0xc7,
-	0x92, 0x48, 0xee, 0xc0, 0x72, 0x14, 0x98, 0x5e, 0xe8, 0x9a, 0x51, 0x56, 0xb8, 0x84, 0xc2, 0x4b,
-	0x09, 0x6b, 0xb2, 0x7c, 0xea, 0xa8, 0xf9, 0x11, 0xf9, 0xd8, 0x57, 0xda, 0xaf, 0x72, 0x50, 0x10,
-	0xf3, 0x40, 0xde, 0x86, 0x59, 0x6b, 0x10, 0x7f, 0x0b, 0x20, 0xe9, 0x37, 0x8f, 0x78, 0x96, 0x74,
-	0xce, 0x9e, 0x9c, 0x19, 0x99, 0x68, 0x9f, 0x55, 0xa2, 0x3d, 0x4d, 0xaf, 0xfc, 0x48, 0x7a, 0x89,
-	0x94, 0x99, 0x53, 0x53, 0x66, 0x72, 0x66, 0xa4, 0x79, 0x57, 0xcc, 0xe4, 0x9d, 0xf6, 0x8f, 0x05,
-	0xc8, 0x3f, 0x77, 0xd9, 0x05, 0x79, 0x1b, 0xaa, 0xa6, 0x65, 0xd1, 0x30, 0x34, 0xb2, 0xfb, 0xf7,
-	0xa2, 0x5e, 0x16, 0xd4, 0xd6, 0xa4, 0x52, 0x63, 0x71, 0xbc, 0xd6, 0x5e, 0x10, 0x64, 0x51, 0x6b,
-	0x8f, 0x14, 0xd3, 0x85, 0xa4, 0x98, 0xfe, 0x00, 0x96, 0xc2, 0xcb, 0xc1, 0x80, 0x46, 0x81, 0x63,
-	0x19, 0xb1, 0x08, 0x41, 0x91, 0xc5, 0x84, 0xf1, 0x5c, 0xc8, 0x6e, 0x03, 0x7e, 0x58, 0x12, 0x39,
-	0x20, 0xf6, 0xed, 0x12, 0x27, 0x60, 0x52, 0x67, 0x6b, 0x15, 0x40, 0xd3, 0x49, 0xad, 0xf2, 0x2e,
-	0x2c, 0x7a, 0x34, 0xba, 0x60, 0x18, 0x71, 0x62, 0x44, 0x73, 0x28, 0x51, 0x91, 0xe4, 0x56, 0x72,
-	0x3c, 0xcd, 0x54, 0x43, 0x05, 0x14, 0xc9, 0x54, 0x43, 0xdf, 0x04, 0xb0, 0x92, 0x95, 0x4e, 0x7e,
-	0x0b, 0x58, 0x4e, 0xe6, 0x35, 0x5d, 0x04, 0xf5, 0x8c, 0x18, 0x79, 0x0f, 0x0a, 0x26, 0xce, 0xb8,
-	0xbc, 0xe3, 0x5f, 0x1c, 0x09, 0x04, 0x5d, 0xb2, 0xc9, 0x16, 0x94, 0xfc, 0xc0, 0x61, 0x81, 0x13,
-	0x5d, 0x62, 0x78, 0x2d, 0xea, 0x49, 0x3b, 0x73, 0xb0, 0x28, 0x2b, 0x07, 0x8b, 0x4c, 0x5d, 0x57,
-	0x51, 0xea, 0xba, 0x4d, 0x28, 0xf5, 0x03, 0x36, 0xf4, 0xf9, 0x38, 0xe4, 0x5a, 0x82, 0x6d, 0xe1,
-	0x8c, 0xec, 0xf7, 0x60, 0x2e, 0xb1, 0x88, 0x12, 0x15, 0x4e, 0x3e, 0x12, 0xd4, 0x96, 0x4d, 0xde,
-	0x81, 0x6a, 0x40, 0x7d, 0x97, 0x1f, 0xc8, 0x28, 0x4e, 0x0c, 0x56, 0x41, 0x25, 0xbd, 0x92, 0x50,
-	0x31, 0x58, 0xf6, 0x61, 0x91, 0xc7, 0x18, 0x5f, 0x1c, 0xa4, 0xa7, 0x36, 0x96, 0x70, 0x7f, 0x7f,
-	0xa8, 0x7c, 0x1e, 0xdc, 0xe1, 0xa1, 0xd7, 0x65, 0x7b, 0x42, 0xa4, 0xe9, 0x45, 0xc1, 0xa5, 0x5e,
-	0xf1, 0xb3, 0x34, 0xd2, 0x84, 0x6a, 0xec, 0xfd, 0x88, 0x19, 0x26, 0x0d, 0x37, 0x96, 0x11, 0xe8,
-	0x81, 0x0a, 0x24, 0xc5, 0xbb, 0xac, 0x4e, 0x43, 0x81, 0x53, 0xee, 0x67, 0x48, 0x5b, 0x9f, 0x00,
-	0x19, 0xb7, 0xc5, 0xf7, 0xdd, 0x33, 0x7a, 0x29, 0x37, 0x25, 0xfe, 0x27, 0xdf, 0x9f, 0xcf, 0x4d,
-	0x77, 0x18, 0x1f, 0xac, 0x44, 0xe3, 0x7b, 0x33, 0x1f, 0xe7, 0xb6, 0x7e, 0x04, 0x4b, 0x63, 0x46,
-	0xae, 0x03, 0x28, 0x65, 0x00, 0xb4, 0x2e, 0x94, 0x95, 0xe2, 0x6f, 0x1b, 0xe6, 0x45, 0x05, 0x1b,
-	0xe7, 0x52, 0x59, 0x2f, 0x09, 0x42, 0xcb, 0xe6, 0x67, 0x20, 0xc9, 0x0c, 0x7d, 0x6a, 0x39, 0x3d,
-	0xc7, 0x92, 0x95, 0x71, 0x55, 0x90, 0x8f, 0x25, 0x55, 0xfb, 0xb7, 0x22, 0xde, 0x50, 0xa6, 0x1f,
-	0x5a, 0x6f, 0x7c, 0x0c, 0x78, 0x07, 0xaa, 0x3e, 0x0b, 0x9d, 0xc8, 0x39, 0xa7, 0xe2, 0xab, 0x99,
-	0xcc, 0xc5, 0x4a, 0x4c, 0xc5, 0xaf, 0x60, 0x5c, 0xcc, 0xa3, 0x7d, 0x33, 0x23, 0x96, 0x17, 0x62,
-	0x31, 0x55, 0x88, 0x7d, 0x0c, 0x1b, 0x36, 0x75, 0x9d, 0x81, 0xc3, 0x17, 0xc5, 0x81, 0x13, 0x86,
-	0x86, 0x4d, 0x23, 0x6a, 0x25, 0xa7, 0xb8, 0x82, 0xbe, 0x96, 0xf0, 0x0f, 0x9d, 0x30, 0x6c, 0xc4,
-	0x5c, 0x9e, 0x67, 0x27, 0x8e, 0x2f, 0xae, 0xe2, 0xc5, 0xe2, 0x54, 0xd0, 0xe7, 0x4f, 0x1c, 0x1f,
-	0xaf, 0xd1, 0xb1, 0xb6, 0xe5, 0xec, 0xa1, 0xc7, 0x97, 0x2e, 0x71, 0x92, 0x2e, 0x9d, 0x38, 0xfe,
-	0x0b, 0xde, 0x26, 0x4f, 0x61, 0xb5, 0x47, 0x2d, 0xc3, 0x62, 0x41, 0x80, 0x65, 0xb2, 0x11, 0x5e,
-	0x0e, 0x4e, 0x78, 0x55, 0x59, 0x42, 0xc1, 0xe5, 0x1e, 0xb5, 0x76, 0x63, 0xde, 0xb1, 0x60, 0x91,
-	0x6f, 0xc3, 0xba, 0xd0, 0xb1, 0xe9, 0x05, 0x0b, 0xec, 0x30, 0xd5, 0xc6, 0x4c, 0x2b, 0xe8, 0xab,
-	0xa8, 0x25, 0xb9, 0x89, 0x3a, 0xf9, 0x21, 0x6c, 0xab, 0x7a, 0x43, 0x4f, 0x6a, 0x9a, 0x27, 0x2e,
-	0xc5, 0x55, 0xa6, 0xa0, 0x6f, 0x66, 0x75, 0x5f, 0x64, 0x05, 0xc8, 0x5b, 0x50, 0x51, 0xf4, 0x71,
-	0x49, 0x2c, 0xe8, 0xe5, 0xac, 0x06, 0xdf, 0x61, 0xd4, 0x01, 0x89, 0x71, 0x8b, 0x44, 0x5f, 0xca,
-	0x0e, 0x47, 0x38, 0xe0, 0x5d, 0x58, 0x7c, 0xdd, 0xa7, 0x03, 0xe3, 0x8c, 0x5e, 0xc6, 0x1e, 0xac,
-	0x88, 0xe9, 0xe1, 0xe4, 0xcf, 0xe8, 0x65, 0xea, 0x45, 0x94, 0x73, 0x59, 0x18, 0xe2, 0x1a, 0x50,
-	0xd0, 0x4b, 0x9c, 0x70, 0xc0, 0x42, 0x04, 0x09, 0x5e, 0x1b, 0xbe, 0xcb, 0xcc, 0x41, 0x28, 0x50,
-	0x70, 0x11, 0x28, 0xe8, 0x95, 0xe0, 0xf5, 0x11, 0x52, 0x11, 0x85, 0x7c, 0x0d, 0x48, 0x2a, 0xe7,
-	0x31, 0xcf, 0x70, 0x6c, 0x97, 0xe2, 0x42, 0x50, 0xd0, 0x17, 0x63, 0xd1, 0x36, 0xf3, 0x5a, 0xb6,
-	0x8b, 0xab, 0x51, 0xf0, 0x1a, 0x3f, 0x96, 0xe2, 0x41, 0xa8, 0xa0, 0x17, 0x82, 0xd7, 0xfc, 0x04,
-	0x4c, 0x3e, 0x86, 0x4d, 0xc9, 0x30, 0x7c, 0x3c, 0x1b, 0x86, 0x86, 0x15, 0x58, 0xd2, 0xae, 0x58,
-	0xeb, 0x57, 0x85, 0xa8, 0x38, 0x3a, 0x86, 0xbb, 0x81, 0x25, 0xec, 0x6f, 0x42, 0x29, 0x78, 0x6d,
-	0x9c, 0x5c, 0x46, 0xb8, 0x1a, 0x70, 0xc1, 0x62, 0xf0, 0xfa, 0x19, 0x6f, 0xf2, 0x20, 0xe2, 0x5d,
-	0x13, 0x0a, 0x78, 0x04, 0x2a, 0xe8, 0xf3, 0xc1, 0x6b, 0x89, 0xc0, 0x35, 0xa3, 0x58, 0x73, 0x55,
-	0x68, 0x46, 0xa9, 0x66, 0x94, 0x6a, 0xae, 0x09, 0xcd, 0x28, 0xd1, 0x7c, 0x04, 0xe5, 0x13, 0x1a,
-	0x18, 0x01, 0xe5, 0x2b, 0x00, 0xb5, 0x37, 0xd6, 0x51, 0x60, 0xe1, 0x84, 0x06, 0xba, 0x24, 0x91,
-	0x07, 0xb0, 0xe0, 0x5a, 0x76, 0x3f, 0xf6, 0xff, 0x06, 0x4a, 0x00, 0x27, 0x49, 0xe7, 0xf3, 0xce,
-	0xd9, 0x4e, 0xcc, 0xdf, 0x94, 0x9d, 0xb3, 0x1d, 0xc9, 0xbe, 0x0b, 0xf3, 0x91, 0x33, 0xa0, 0x61,
-	0x64, 0x0e, 0xfc, 0x8d, 0x2d, 0x71, 0xea, 0x4e, 0x08, 0xda, 0x3f, 0xe7, 0x70, 0x01, 0x52, 0xdf,
-	0x63, 0x5c, 0xf9, 0x09, 0xe5, 0xaa, 0x6b, 0x2c, 0xd5, 0x4f, 0xb3, 0x13, 0xfc, 0x94, 0x78, 0x38,
-	0x3f, 0xe6, 0xe1, 0x8c, 0x9f, 0xe6, 0x46, 0xfd, 0x94, 0xf5, 0x70, 0x41, 0xf5, 0xf0, 0xd5, 0xe3,
-	0xfb, 0xbb, 0x1c, 0x54, 0xd5, 0x27, 0x23, 0xd9, 0xf2, 0x20, 0xa7, 0xdc, 0xb5, 0x65, 0xbb, 0x37,
-	0x73, 0x55, 0x00, 0xcc, 0x5e, 0x15, 0x00, 0xa5, 0xab, 0x02, 0x60, 0x7e, 0x74, 0x60, 0x4a, 0xef,
-	0x6b, 0xa3, 0xbd, 0xff, 0x04, 0x2a, 0xca, 0x73, 0x8e, 0xe9, 0x13, 0xb3, 0x06, 0x85, 0x30, 0x32,
-	0xa3, 0x61, 0x28, 0x0f, 0xc3, 0xb2, 0xa5, 0x7d, 0x01, 0xcb, 0x13, 0x9e, 0x75, 0xdc, 0x78, 0x35,
-	0x4f, 0xe1, 0x67, 0x15, 0xf8, 0xbf, 0x9a, 0xc1, 0xbb, 0xb2, 0xd1, 0xe7, 0x29, 0xbf, 0xc6, 0xe7,
-	0x2c, 0x97, 0x85, 0x86, 0x62, 0x62, 0xde, 0x65, 0xe1, 0x31, 0x12, 0x04, 0xfb, 0x24, 0x66, 0xe7,
-	0x63, 0xf6, 0x89, 0x64, 0x3f, 0x86, 0x9a, 0xcb, 0x7c, 0x4b, 0xec, 0x0b, 0x52, 0x48, 0x5c, 0xe3,
-	0x56, 0x39, 0x9d, 0xef, 0x07, 0x52, 0xf2, 0x23, 0x58, 0x95, 0x92, 0x72, 0x45, 0x88, 0xc5, 0x0b,
-	0xe2, 0x32, 0x45, 0x88, 0x8b, 0xf5, 0x40, 0xaa, 0xf0, 0xf4, 0x63, 0x3d, 0x27, 0x16, 0x2c, 0x8a,
-	0xd3, 0x10, 0x27, 0x49, 0x81, 0x47, 0x50, 0xe6, 0x2b, 0x53, 0x22, 0x51, 0x42, 0x89, 0x05, 0xa4,
-	0x09, 0x11, 0x8d, 0xc2, 0xf6, 0x15, 0x8f, 0x59, 0x6e, 0x6d, 0x32, 0xfe, 0x34, 0x07, 0x5b, 0xd3,
-	0x5f, 0xb6, 0xdc, 0x96, 0x19, 0xf2, 0x4d, 0x58, 0x73, 0xbc, 0x73, 0x1a, 0x84, 0xd4, 0xe0, 0xc5,
-	0x98, 0xf0, 0x63, 0x60, 0x46, 0xf1, 0xfd, 0xe4, 0xb2, 0xe4, 0x3e, 0x73, 0xc4, 0xb7, 0x6a, 0xdd,
-	0x8c, 0xa8, 0xf6, 0x4b, 0xd1, 0xb7, 0x29, 0x0f, 0x63, 0x6e, 0xad, 0x6f, 0x2b, 0x30, 0x97, 0x56,
-	0x11, 0xfc, 0x7c, 0x8c, 0xd5, 0xc3, 0x3a, 0x14, 0x3d, 0x7a, 0x61, 0xd0, 0x2f, 0xe3, 0x43, 0x4b,
-	0xc1, 0xa3, 0x17, 0xcd, 0x2f, 0x6d, 0xed, 0x14, 0xee, 0x5f, 0xfd, 0xac, 0xe6, 0xd6, 0xe6, 0xe6,
-	0xcf, 0x72, 0x22, 0x06, 0xa6, 0x3c, 0xb4, 0xf9, 0xbf, 0x9d, 0x9c, 0x9f, 0xe7, 0x40, 0xbb, 0xfe,
-	0xd1, 0xce, 0xff, 0xee, 0x24, 0x69, 0x5f, 0xe2, 0x5c, 0x5c, 0xf1, 0xb8, 0xe7, 0xc6, 0xf6, 0x1f,
-	0xa8, 0x1f, 0xaa, 0xc5, 0xe9, 0x36, 0xfb, 0xed, 0xf9, 0x0c, 0x1e, 0x5d, 0xfb, 0x12, 0xe7, 0xd6,
-	0x22, 0xa0, 0x0b, 0x44, 0x97, 0x9b, 0x72, 0x06, 0x9d, 0x17, 0x47, 0xf1, 0xe6, 0x6d, 0x58, 0x6c,
-	0xe8, 0x45, 0x68, 0x85, 0x17, 0x47, 0x52, 0x78, 0x97, 0x13, 0xa7, 0xae, 0xef, 0x7f, 0x92, 0x83,
-	0x8d, 0x69, 0x4f, 0x7d, 0x6e, 0xdc, 0xf5, 0x3a, 0x54, 0xd2, 0xce, 0x4c, 0x7a, 0xdc, 0x37, 0x3e,
-	0x80, 0xfd, 0x3b, 0xfa, 0x42, 0x90, 0x52, 0x9f, 0x15, 0xf1, 0x26, 0x32, 0x0a, 0xb5, 0x36, 0xdc,
-	0xbd, 0xea, 0x21, 0xd5, 0x4d, 0xfb, 0xa6, 0xfd, 0x0c, 0x1e, 0x5e, 0xf7, 0xe8, 0xe8, 0xd6, 0xa6,
-	0xea, 0x67, 0xb0, 0x39, 0xf5, 0xe5, 0xd1, 0xaf, 0xb3, 0xb7, 0x65, 0xca, 0xb3, 0xd9, 0x91, 0xf2,
-	0x4c, 0xfb, 0x8b, 0x1c, 0x3c, 0x7e, 0xd3, 0x67, 0x48, 0xb7, 0x96, 0x81, 0x1f, 0x02, 0xc9, 0x3e,
-	0x8d, 0x92, 0x7d, 0x13, 0xe9, 0xb8, 0x94, 0xe1, 0xc8, 0x3e, 0x0e, 0xe0, 0xad, 0x37, 0x78, 0xb0,
-	0x74, 0x6b, 0xee, 0x77, 0x71, 0x35, 0xba, 0xe6, 0xd1, 0xd2, 0xad, 0x59, 0xfb, 0xa3, 0x1c, 0xbc,
-	0xfb, 0x66, 0xcf, 0x97, 0x6e, 0xcd, 0xfd, 0x5b, 0x50, 0x1a, 0xf9, 0xa6, 0x97, 0xb4, 0xb5, 0xff,
-	0xca, 0xc1, 0xc2, 0x5e, 0xc0, 0x86, 0xfe, 0x21, 0xc5, 0xf3, 0xfc, 0x23, 0x28, 0x3b, 0xf1, 0xd7,
-	0xdb, 0xd8, 0x70, 0x05, 0x1f, 0x92, 0x0b, 0x5a, 0xcb, 0x26, 0x2d, 0xa8, 0xa6, 0x22, 0xc9, 0xf7,
-	0xdb, 0x6a, 0xe6, 0x1d, 0x5d, 0x06, 0x70, 0x27, 0xf9, 0x16, 0x8c, 0x9f, 0x10, 0x2a, 0x4e, 0xb6,
-	0x49, 0xee, 0xc3, 0x02, 0x3f, 0xc7, 0xc5, 0x05, 0xfe, 0x2c, 0x1a, 0xe3, 0x05, 0xfe, 0x91, 0x28,
-	0xf0, 0xb3, 0x17, 0x47, 0x79, 0x64, 0x26, 0x6d, 0xed, 0xff, 0x43, 0x45, 0xc1, 0x26, 0x45, 0x98,
-	0x3d, 0xea, 0xb4, 0x6b, 0x77, 0x48, 0x0d, 0xca, 0xcd, 0xa3, 0x4e, 0xdb, 0xf8, 0x68, 0xcf, 0x38,
-	0xaa, 0x77, 0xf7, 0x6b, 0x39, 0xb2, 0x04, 0x15, 0x41, 0xf9, 0x86, 0x24, 0xcd, 0x68, 0xbf, 0x98,
-	0x81, 0x39, 0xec, 0xa7, 0x72, 0xa1, 0x24, 0x86, 0x9b, 0x5c, 0x28, 0xfd, 0x00, 0x8a, 0x16, 0x1b,
-	0x0c, 0x4c, 0xf9, 0x7a, 0x79, 0x6c, 0x8c, 0xd9, 0x91, 0x86, 0xbb, 0x42, 0x52, 0x8f, 0x55, 0xc8,
-	0x0e, 0x14, 0x07, 0x82, 0x25, 0xbf, 0x0b, 0xad, 0x4c, 0xf2, 0x90, 0x1e, 0x0b, 0x65, 0xee, 0xd3,
-	0xf2, 0x57, 0xde, 0xa7, 0x69, 0x9f, 0xc1, 0xf2, 0x04, 0xc3, 0x64, 0x11, 0x16, 0xea, 0x8d, 0x86,
-	0x71, 0xd8, 0x3c, 0x7c, 0xd6, 0xd4, 0x8f, 0x6b, 0x77, 0x08, 0x81, 0xaa, 0xde, 0x3c, 0xec, 0xbc,
-	0x6c, 0x26, 0xb4, 0x1c, 0x17, 0x3a, 0x6e, 0x76, 0x13, 0xc2, 0x8c, 0xf6, 0x05, 0xc0, 0x4b, 0xd3,
-	0x1d, 0xd2, 0x23, 0x33, 0x30, 0x07, 0xe4, 0x3e, 0xcc, 0x32, 0x6f, 0x28, 0x6f, 0x76, 0xcb, 0xca,
-	0xcb, 0x48, 0xce, 0x20, 0x4f, 0xb2, 0x37, 0x43, 0xd5, 0xa7, 0x9b, 0x3b, 0xc9, 0xcf, 0x27, 0x76,
-	0x10, 0x85, 0xcf, 0xc4, 0x0e, 0x4e, 0xb5, 0x90, 0xd3, 0xfe, 0x61, 0x06, 0xaa, 0x47, 0xcc, 0xd3,
-	0x5f, 0x1f, 0xb1, 0x0b, 0x1a, 0x34, 0xcc, 0xc8, 0xbc, 0xb5, 0xb8, 0xd6, 0xd5, 0x0d, 0x37, 0x8f,
-	0x3d, 0x4a, 0x5f, 0x5b, 0xaa, 0x56, 0x77, 0xf4, 0x30, 0x74, 0x0e, 0xa9, 0x19, 0x0e, 0x03, 0x4c,
-	0xed, 0xc9, 0xef, 0xc3, 0xc8, 0xfb, 0xb0, 0xc4, 0x4f, 0x5e, 0x5c, 0xcb, 0x18, 0x50, 0xd3, 0x33,
-	0xec, 0x93, 0x01, 0x56, 0x71, 0x39, 0xbd, 0x1a, 0x08, 0xb4, 0x43, 0x6a, 0x7a, 0x8d, 0x93, 0x01,
-	0x5f, 0xb6, 0xa7, 0x62, 0x92, 0x15, 0xa8, 0x4d, 0x78, 0x3f, 0x76, 0x17, 0x36, 0x54, 0xaa, 0xd1,
-	0x68, 0x1e, 0xb4, 0x0e, 0x5b, 0xdd, 0xa6, 0x5e, 0xcb, 0x91, 0x4d, 0x58, 0x1d, 0xe1, 0xd6, 0x77,
-	0x77, 0x9b, 0xc7, 0x7c, 0x92, 0x4e, 0xf0, 0x95, 0x54, 0x5d, 0x5c, 0xfa, 0x66, 0x0e, 0x97, 0x6b,
-	0x20, 0x7d, 0x37, 0xe2, 0xc9, 0x0d, 0x88, 0x6f, 0x88, 0xa5, 0x2b, 0x93, 0x0b, 0xe3, 0x0d, 0x88,
-	0x4f, 0x99, 0x72, 0x73, 0x88, 0x9b, 0xfc, 0x70, 0x55, 0xc4, 0xd7, 0x74, 0x3d, 0x96, 0x99, 0x89,
-	0x5c, 0x76, 0x26, 0x9e, 0x88, 0xed, 0x36, 0x9d, 0x7d, 0xe5, 0x15, 0x5e, 0x8f, 0xc9, 0x47, 0xf4,
-	0x11, 0xd5, 0x85, 0x1c, 0x79, 0x0f, 0xf2, 0x2e, 0x0b, 0x1d, 0x34, 0x55, 0xcd, 0xdc, 0x28, 0xe3,
-	0x09, 0x4e, 0x48, 0xa2, 0x80, 0x10, 0xec, 0x39, 0x72, 0x12, 0xa7, 0x09, 0xf6, 0x1c, 0xf2, 0x3e,
-	0xcc, 0xe1, 0x59, 0x07, 0x27, 0x65, 0x8a, 0xa4, 0x90, 0xd0, 0x8e, 0xa1, 0x14, 0xf7, 0x87, 0x2c,
-	0x40, 0xf1, 0x45, 0xfb, 0xb3, 0x76, 0xe7, 0x55, 0x5b, 0xe4, 0x45, 0xbb, 0xd3, 0x35, 0x76, 0x3b,
-	0xed, 0xe7, 0xad, 0xbd, 0x17, 0x7a, 0xb3, 0x51, 0xcb, 0x11, 0x80, 0x02, 0xbe, 0x97, 0x6b, 0xd6,
-	0x66, 0x48, 0x19, 0x4a, 0xad, 0xb6, 0x6c, 0xcd, 0xf2, 0x56, 0xa3, 0x75, 0x5c, 0x7f, 0x76, 0xd0,
-	0x6c, 0xd4, 0xf2, 0xda, 0xbf, 0xe7, 0x60, 0xe1, 0x08, 0x0b, 0xd6, 0x1e, 0x7a, 0x6a, 0x6a, 0x30,
-	0x7f, 0x27, 0xf6, 0x95, 0x18, 0xfb, 0xa3, 0x6c, 0x5c, 0xc6, 0xda, 0xf1, 0xdf, 0x8a, 0xcf, 0xde,
-	0x81, 0x59, 0x97, 0x85, 0x57, 0x79, 0x82, 0xf3, 0x35, 0x03, 0xca, 0x59, 0xed, 0xb1, 0x11, 0x8a,
-	0xfe, 0x1b, 0xaf, 0x3a, 0xfa, 0x67, 0xe2, 0x51, 0x62, 0x4a, 0x3b, 0xee, 0xd6, 0xdb, 0x8d, 0x67,
-	0x3f, 0xbe, 0x66, 0xa4, 0xbf, 0xc8, 0xc1, 0xbd, 0x64, 0x85, 0xe5, 0x8e, 0xcc, 0xdc, 0xfb, 0x76,
-	0x30, 0x1c, 0xda, 0x40, 0xe4, 0xd8, 0x33, 0x8f, 0x05, 0xe4, 0xda, 0xf1, 0x28, 0xfb, 0xf8, 0x6b,
-	0x22, 0x86, 0xbe, 0x28, 0x3c, 0x95, 0xd0, 0xa6, 0xd5, 0x62, 0xe7, 0xb0, 0x31, 0x0d, 0x63, 0xba,
-	0xfb, 0xeb, 0xe2, 0x47, 0x0e, 0x37, 0x78, 0x34, 0xbb, 0xc8, 0x54, 0x6c, 0xad, 0x08, 0x73, 0xcd,
-	0x81, 0x1f, 0x5d, 0x7e, 0x70, 0x0f, 0x20, 0xf5, 0x3e, 0xdf, 0x67, 0x3a, 0xcf, 0x9f, 0xd7, 0xee,
-	0x90, 0x02, 0xcc, 0x74, 0xda, 0xb5, 0xdc, 0xd3, 0xbf, 0xde, 0x86, 0x62, 0x47, 0x20, 0x92, 0x06,
-	0x80, 0x7c, 0x51, 0xd9, 0x71, 0x23, 0x52, 0x4d, 0x2c, 0x21, 0xd0, 0xd6, 0x48, 0x5b, 0x5b, 0xfb,
-	0xf9, 0x3f, 0xfd, 0xeb, 0x2f, 0x67, 0x6a, 0xda, 0xc2, 0x93, 0xf3, 0x8f, 0x9e, 0x48, 0xbd, 0xef,
-	0xe5, 0x3e, 0x20, 0xcf, 0x61, 0x41, 0xa7, 0xe2, 0x27, 0x3d, 0x6f, 0x02, 0xb3, 0x8e, 0x30, 0x4b,
-	0x5a, 0x99, 0xc3, 0xc4, 0x8a, 0x1c, 0xa7, 0x09, 0x0b, 0xf2, 0x84, 0xc3, 0x1d, 0x47, 0x94, 0xf5,
-	0x7c, 0x0c, 0x65, 0x03, 0x51, 0x88, 0x56, 0xe1, 0x28, 0xe2, 0x41, 0x66, 0xc7, 0x1b, 0x72, 0x98,
-	0x7d, 0xa8, 0x24, 0x95, 0xf0, 0x1b, 0x00, 0x6d, 0x22, 0xd0, 0xb2, 0x56, 0xcd, 0x8c, 0x4a, 0x22,
-	0xed, 0xc2, 0x7c, 0x83, 0xba, 0xf4, 0xc6, 0xdd, 0x49, 0x94, 0x38, 0x48, 0x0b, 0x40, 0xbe, 0x3e,
-	0xea, 0x0c, 0x23, 0x52, 0x53, 0x7e, 0x52, 0x76, 0x18, 0xf6, 0xaf, 0xee, 0x4f, 0xaa, 0xc9, 0xa1,
-	0x3a, 0x50, 0x4e, 0x9e, 0x1e, 0x71, 0x30, 0xa2, 0x3c, 0x99, 0x47, 0xf2, 0x18, 0xdc, 0x36, 0xc2,
-	0xad, 0x6a, 0x35, 0x84, 0xcb, 0x68, 0x73, 0xc0, 0xdf, 0x86, 0xc5, 0xec, 0x4b, 0x21, 0x8e, 0x99,
-	0x86, 0x5b, 0x96, 0x33, 0x06, 0x7b, 0x1f, 0x61, 0x37, 0xb4, 0x65, 0x0e, 0x3b, 0x82, 0xc1, 0x91,
-	0x3f, 0x81, 0xe2, 0x73, 0x97, 0x5d, 0xd4, 0x6d, 0x9b, 0x54, 0x94, 0xcf, 0x46, 0x57, 0x47, 0x95,
-	0xd4, 0x11, 0x51, 0x05, 0xbc, 0xa5, 0xe3, 0x67, 0xe3, 0xeb, 0x40, 0x14, 0xa7, 0xa5, 0x6a, 0x1c,
-	0xe7, 0x18, 0xaa, 0xc9, 0xf3, 0xbc, 0xdd, 0x53, 0x6a, 0x9d, 0x8d, 0x05, 0x68, 0xea, 0xc6, 0x44,
-	0x50, 0xbb, 0x87, 0x80, 0xeb, 0x1a, 0xe1, 0x80, 0xaa, 0x3e, 0x07, 0x3d, 0x84, 0x05, 0x11, 0x73,
-	0x7c, 0x51, 0xeb, 0x65, 0x26, 0x22, 0x49, 0xfd, 0xb1, 0x2e, 0x6e, 0x21, 0xe2, 0x8a, 0xb6, 0x98,
-	0x06, 0x2c, 0x2a, 0xcb, 0x89, 0x95, 0x91, 0xf7, 0xe6, 0x78, 0xca, 0xc4, 0x66, 0xb5, 0x39, 0xa0,
-	0x0e, 0x95, 0x3d, 0x1a, 0x65, 0x5e, 0x72, 0x8d, 0x8e, 0x79, 0x79, 0xc2, 0xc3, 0x1a, 0xed, 0x2e,
-	0x42, 0xae, 0x69, 0x4b, 0x1c, 0x52, 0xd1, 0xe7, 0x98, 0x3f, 0x82, 0x82, 0x4e, 0x4f, 0x18, 0xbb,
-	0x3e, 0xc3, 0x57, 0x11, 0x67, 0x51, 0x03, 0x91, 0xe1, 0x5c, 0x87, 0x03, 0xbc, 0x80, 0xa5, 0x5d,
-	0xe6, 0xba, 0xd4, 0xca, 0xde, 0xa6, 0x5f, 0x87, 0xf5, 0x10, 0xb1, 0xb6, 0xb4, 0x55, 0x8e, 0x35,
-	0xa6, 0xce, 0x61, 0x7f, 0x0c, 0xb5, 0x3d, 0x1a, 0xa9, 0x1f, 0xe4, 0xd4, 0x64, 0x5d, 0x1b, 0xf9,
-	0xd9, 0x9c, 0x94, 0xd2, 0x1e, 0x20, 0xf6, 0xa6, 0xb6, 0x22, 0xc7, 0xab, 0x70, 0x39, 0xf4, 0x19,
-	0xac, 0xec, 0xd1, 0x68, 0xfc, 0x13, 0xc0, 0xa4, 0xc4, 0x4b, 0x7f, 0x9b, 0x3a, 0x26, 0xaf, 0xbd,
-	0x85, 0x86, 0xee, 0x69, 0x1b, 0xd2, 0xd0, 0x98, 0x04, 0x37, 0x16, 0xc0, 0xfa, 0x6e, 0x40, 0xcd,
-	0x88, 0x76, 0x03, 0xb3, 0xd7, 0x73, 0xac, 0x63, 0xeb, 0x94, 0xda, 0x43, 0x97, 0xd7, 0xda, 0x0f,
-	0x76, 0x94, 0x5f, 0x0e, 0x8f, 0x09, 0x8c, 0x79, 0xed, 0x5d, 0x34, 0xf8, 0x50, 0xdb, 0x46, 0xaf,
-	0x4d, 0x46, 0x95, 0x36, 0x45, 0xa6, 0xdc, 0xb6, 0xcd, 0x29, 0xa8, 0xdc, 0x66, 0x0f, 0x96, 0x95,
-	0x1e, 0xfd, 0xd6, 0x90, 0x0e, 0x69, 0x48, 0xb6, 0x27, 0xda, 0x13, 0xcc, 0x31, 0x5b, 0x1a, 0xda,
-	0xba, 0xab, 0xad, 0x8f, 0x8d, 0x4f, 0x28, 0x48, 0x3b, 0x4a, 0x2f, 0xbe, 0xb2, 0x9d, 0x09, 0x68,
-	0xdc, 0xce, 0xf7, 0xa1, 0x26, 0xd2, 0x39, 0x73, 0x18, 0x9e, 0x9e, 0x6e, 0xa9, 0x90, 0x76, 0xe7,
-	0x1b, 0x39, 0xf2, 0x05, 0xac, 0x1e, 0xd1, 0xa0, 0xc7, 0x82, 0x01, 0x9e, 0x91, 0x3a, 0x3e, 0x0d,
-	0x46, 0x11, 0x90, 0x31, 0xd6, 0xb3, 0xb7, 0xb1, 0x67, 0xf7, 0xb5, 0x4d, 0xde, 0xb3, 0x89, 0x10,
-	0x62, 0xf3, 0x59, 0x10, 0x9b, 0x91, 0x38, 0x3c, 0x5e, 0x07, 0xaa, 0xac, 0x51, 0x19, 0x45, 0x0e,
-	0xf5, 0x0a, 0x16, 0xf6, 0x68, 0xd4, 0x7c, 0x1d, 0xe1, 0xc9, 0x89, 0xa4, 0x23, 0x4a, 0xcf, 0x63,
-	0x5b, 0xeb, 0x99, 0x03, 0x96, 0x4e, 0xa3, 0x61, 0xe0, 0x21, 0x33, 0x54, 0x81, 0x33, 0x30, 0x1c,
-	0xf8, 0x0b, 0xfc, 0x69, 0x91, 0xb8, 0xa4, 0x13, 0x85, 0x0b, 0x8d, 0xc8, 0xda, 0x8e, 0xfc, 0x15,
-	0xbc, 0xca, 0xba, 0x7a, 0x79, 0x18, 0x83, 0xe1, 0xf0, 0x3e, 0x6c, 0xee, 0xd1, 0xe8, 0x60, 0xf2,
-	0x63, 0x62, 0x75, 0x9d, 0xd8, 0x56, 0x7f, 0x17, 0xa6, 0x3c, 0x71, 0xd6, 0x1e, 0xa3, 0x25, 0x4d,
-	0xbb, 0x27, 0x87, 0x30, 0x19, 0x91, 0x5b, 0x3c, 0x85, 0xd5, 0x89, 0xfc, 0x9b, 0x58, 0x53, 0xa6,
-	0x77, 0x22, 0x1a, 0xb7, 0xd4, 0xc5, 0x65, 0x3e, 0x3d, 0x3a, 0x8e, 0x58, 0x58, 0x9f, 0x72, 0xba,
-	0x1c, 0x5b, 0xe8, 0x53, 0x36, 0x47, 0xdd, 0x03, 0x10, 0x8b, 0x21, 0xee, 0x1c, 0x2a, 0x64, 0x6d,
-	0xf4, 0x10, 0xa5, 0x6e, 0xbd, 0xa9, 0x1e, 0x07, 0xfa, 0x29, 0x2c, 0x0b, 0xf0, 0x64, 0x17, 0x43,
-	0xc4, 0x49, 0xbb, 0xdb, 0xca, 0xa4, 0x03, 0xc7, 0xd8, 0x02, 0xad, 0xe0, 0x70, 0x0b, 0x1e, 0x2e,
-	0xd0, 0xe3, 0x27, 0xcd, 0x49, 0x0b, 0xf4, 0x3d, 0xf5, 0x67, 0xd8, 0x23, 0x2a, 0x63, 0x6b, 0xf4,
-	0x98, 0x04, 0xb7, 0xd7, 0x47, 0x7b, 0x47, 0xe2, 0xf1, 0xef, 0x44, 0x7b, 0xe9, 0x90, 0xa6, 0xfc,
-	0x9e, 0x7f, 0xcc, 0xd0, 0x18, 0x5a, 0x6a, 0xa8, 0x2d, 0x1e, 0x12, 0xdf, 0x92, 0xa1, 0x31, 0x34,
-	0x6e, 0xe8, 0x77, 0xd2, 0x23, 0x80, 0x37, 0x24, 0xef, 0x5e, 0x7b, 0x0e, 0xc2, 0xb3, 0xd4, 0xd4,
-	0x22, 0x6e, 0xa4, 0x88, 0x26, 0x9f, 0xc3, 0x7c, 0x52, 0x9b, 0xff, 0xda, 0xe0, 0x71, 0x39, 0xa1,
-	0x96, 0xfa, 0x84, 0xc1, 0x5a, 0x6a, 0x49, 0x39, 0x66, 0x5d, 0x7f, 0x9a, 0x9b, 0xba, 0xd0, 0x6f,
-	0xa9, 0x03, 0x50, 0x60, 0x07, 0xb0, 0x9a, 0x58, 0xff, 0xaa, 0xf6, 0x1e, 0xa1, 0xbd, 0x6d, 0x91,
-	0xdf, 0x13, 0x51, 0x9f, 0x7d, 0x01, 0xdb, 0x2c, 0xe8, 0xa3, 0x9e, 0xc5, 0x02, 0x7b, 0x47, 0xfc,
-	0x47, 0x1f, 0x31, 0xce, 0xb3, 0xca, 0x4b, 0x6c, 0xf3, 0xa3, 0x5c, 0xe7, 0xa0, 0xfb, 0xf9, 0x93,
-	0xbe, 0x13, 0x9d, 0x0e, 0x4f, 0x78, 0x28, 0x3c, 0x89, 0x55, 0x9e, 0x08, 0x95, 0x0f, 0xe5, 0xff,
-	0x0d, 0x72, 0xfe, 0xff, 0x9e, 0xf4, 0x59, 0xfc, 0xff, 0x98, 0x9c, 0x14, 0x90, 0xfa, 0xcd, 0xff,
-	0x09, 0x00, 0x00, 0xff, 0xff, 0x3b, 0xd4, 0xa0, 0xe2, 0xe7, 0x44, 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)
-	GetOnuStatistics(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuStatistics, error)
-	GetGemPortStatistics(ctx context.Context, in *OnuPacket, opts ...grpc.CallOption) (*GemPortStatistics, 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)
-	PerformGroupOperation(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error)
-	DeleteGroup(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error)
-	GetExtValue(ctx context.Context, in *ValueParam, opts ...grpc.CallOption) (*extension.ReturnValues, error)
-	OnuItuPonAlarmSet(ctx context.Context, in *config.OnuItuPonAlarm, opts ...grpc.CallOption) (*Empty, error)
-	GetLogicalOnuDistanceZero(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error)
-	GetLogicalOnuDistance(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error)
-	GetPonRxPower(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*PonRxPowerData, error)
-	//
-	// GetOnuInfo takes Onu id, serialnumber, and pon interface as argument from the onu structure.
-	// Returns the Onu info from the device.
-	GetOnuInfo(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuInfo, error)
-	//
-	// GetPonInterfaceInfo takes the pon intf id as argument.
-	// Returns the pon interface information from the device.
-	GetPonInterfaceInfo(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*PonIntfInfo, error)
-	//
-	// GetAllocIdStatistics takes onuId and allocId as argument.
-	// This method includes a default wait period of 10 secs before collecting the stats.
-	// The caller has to be aware of this wait and handle it accordingly.
-	// Returns AllocId statistics in the form of OnuAllocStatistics structure
-	GetAllocIdStatistics(ctx context.Context, in *OnuPacket, opts ...grpc.CallOption) (*OnuAllocIdStatistics, error)
-	//
-	// GetPonPortStatistics takes interface id and type as argument from Interface structure.
-	// Returns Pon port statistics in the form of PonStatsData structure.
-	GetPonPortStatistics(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*common.PortStatistics, error)
-	//
-	// GetNniPortStatistics takes takes interface id and type as argument from Interface structure.
-	// Returns Nni port statistics in the form of NniStatsData structure
-	GetNniPortStatistics(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*common.PortStatistics, error)
-	//
-	// Disable ONU serailnumber, disable device at PLOAM.
-	// Takes input as intfid, onuid, sn of the ONU.
-	// Returns success if the call towards the device is success, error otherwise.
-	DisableOnu(ctx context.Context, in *InterfaceOnuSerialNumberOnuId, opts ...grpc.CallOption) (*Empty, error)
-	//
-	// Enables ONU serailnumber, enable device at PLOAM.
-	// Takes input as intfid, onuid, sn of the ONU.
-	// Returns success if the call towards the device is success, error otherwise.
-	EnableOnu(ctx context.Context, in *InterfaceOnuSerialNumberOnuId, opts ...grpc.CallOption) (*Empty, error)
-	//
-	// Disable ONU serailnumber, disable device at PLOAM
-	// Takes input as intfid and sn of the ONU. Generally used when the onu is not present in the OLT.
-	// Returns success if the call towards the device is success, error otherwise.
-	DisableOnuSerialNumber(ctx context.Context, in *InterfaceOnuSerialNumber, opts ...grpc.CallOption) (*Empty, error)
-	//
-	// Enables ONU serailnumber, enable device at PLOAM
-	// Takes input as intfid and sn of the ONU. Generally used when the onu is not present in the OLT.
-	// Returns success if the call towards the device is success, error otherwise.
-	EnableOnuSerialNumber(ctx context.Context, in *InterfaceOnuSerialNumber, opts ...grpc.CallOption) (*Empty, 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) GetOnuStatistics(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuStatistics, error) {
-	out := new(OnuStatistics)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetOnuStatistics", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) GetGemPortStatistics(ctx context.Context, in *OnuPacket, opts ...grpc.CallOption) (*GemPortStatistics, error) {
-	out := new(GemPortStatistics)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetGemPortStatistics", 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
-}
-
-func (c *openoltClient) PerformGroupOperation(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error) {
-	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/PerformGroupOperation", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) DeleteGroup(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error) {
-	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/DeleteGroup", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) GetExtValue(ctx context.Context, in *ValueParam, opts ...grpc.CallOption) (*extension.ReturnValues, error) {
-	out := new(extension.ReturnValues)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetExtValue", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) OnuItuPonAlarmSet(ctx context.Context, in *config.OnuItuPonAlarm, opts ...grpc.CallOption) (*Empty, error) {
-	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/OnuItuPonAlarmSet", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) GetLogicalOnuDistanceZero(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error) {
-	out := new(OnuLogicalDistance)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetLogicalOnuDistanceZero", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) GetLogicalOnuDistance(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error) {
-	out := new(OnuLogicalDistance)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetLogicalOnuDistance", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) GetPonRxPower(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*PonRxPowerData, error) {
-	out := new(PonRxPowerData)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetPonRxPower", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) GetOnuInfo(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuInfo, error) {
-	out := new(OnuInfo)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetOnuInfo", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) GetPonInterfaceInfo(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*PonIntfInfo, error) {
-	out := new(PonIntfInfo)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetPonInterfaceInfo", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) GetAllocIdStatistics(ctx context.Context, in *OnuPacket, opts ...grpc.CallOption) (*OnuAllocIdStatistics, error) {
-	out := new(OnuAllocIdStatistics)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetAllocIdStatistics", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) GetPonPortStatistics(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*common.PortStatistics, error) {
-	out := new(common.PortStatistics)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetPonPortStatistics", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) GetNniPortStatistics(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*common.PortStatistics, error) {
-	out := new(common.PortStatistics)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetNniPortStatistics", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) DisableOnu(ctx context.Context, in *InterfaceOnuSerialNumberOnuId, opts ...grpc.CallOption) (*Empty, error) {
-	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/DisableOnu", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) EnableOnu(ctx context.Context, in *InterfaceOnuSerialNumberOnuId, opts ...grpc.CallOption) (*Empty, error) {
-	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/EnableOnu", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) DisableOnuSerialNumber(ctx context.Context, in *InterfaceOnuSerialNumber, opts ...grpc.CallOption) (*Empty, error) {
-	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/DisableOnuSerialNumber", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *openoltClient) EnableOnuSerialNumber(ctx context.Context, in *InterfaceOnuSerialNumber, opts ...grpc.CallOption) (*Empty, error) {
-	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/openolt.Openolt/EnableOnuSerialNumber", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, 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)
-	GetOnuStatistics(context.Context, *Onu) (*OnuStatistics, error)
-	GetGemPortStatistics(context.Context, *OnuPacket) (*GemPortStatistics, 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
-	PerformGroupOperation(context.Context, *Group) (*Empty, error)
-	DeleteGroup(context.Context, *Group) (*Empty, error)
-	GetExtValue(context.Context, *ValueParam) (*extension.ReturnValues, error)
-	OnuItuPonAlarmSet(context.Context, *config.OnuItuPonAlarm) (*Empty, error)
-	GetLogicalOnuDistanceZero(context.Context, *Onu) (*OnuLogicalDistance, error)
-	GetLogicalOnuDistance(context.Context, *Onu) (*OnuLogicalDistance, error)
-	GetPonRxPower(context.Context, *Onu) (*PonRxPowerData, error)
-	//
-	// GetOnuInfo takes Onu id, serialnumber, and pon interface as argument from the onu structure.
-	// Returns the Onu info from the device.
-	GetOnuInfo(context.Context, *Onu) (*OnuInfo, error)
-	//
-	// GetPonInterfaceInfo takes the pon intf id as argument.
-	// Returns the pon interface information from the device.
-	GetPonInterfaceInfo(context.Context, *Interface) (*PonIntfInfo, error)
-	//
-	// GetAllocIdStatistics takes onuId and allocId as argument.
-	// This method includes a default wait period of 10 secs before collecting the stats.
-	// The caller has to be aware of this wait and handle it accordingly.
-	// Returns AllocId statistics in the form of OnuAllocStatistics structure
-	GetAllocIdStatistics(context.Context, *OnuPacket) (*OnuAllocIdStatistics, error)
-	//
-	// GetPonPortStatistics takes interface id and type as argument from Interface structure.
-	// Returns Pon port statistics in the form of PonStatsData structure.
-	GetPonPortStatistics(context.Context, *Interface) (*common.PortStatistics, error)
-	//
-	// GetNniPortStatistics takes takes interface id and type as argument from Interface structure.
-	// Returns Nni port statistics in the form of NniStatsData structure
-	GetNniPortStatistics(context.Context, *Interface) (*common.PortStatistics, error)
-	//
-	// Disable ONU serailnumber, disable device at PLOAM.
-	// Takes input as intfid, onuid, sn of the ONU.
-	// Returns success if the call towards the device is success, error otherwise.
-	DisableOnu(context.Context, *InterfaceOnuSerialNumberOnuId) (*Empty, error)
-	//
-	// Enables ONU serailnumber, enable device at PLOAM.
-	// Takes input as intfid, onuid, sn of the ONU.
-	// Returns success if the call towards the device is success, error otherwise.
-	EnableOnu(context.Context, *InterfaceOnuSerialNumberOnuId) (*Empty, error)
-	//
-	// Disable ONU serailnumber, disable device at PLOAM
-	// Takes input as intfid and sn of the ONU. Generally used when the onu is not present in the OLT.
-	// Returns success if the call towards the device is success, error otherwise.
-	DisableOnuSerialNumber(context.Context, *InterfaceOnuSerialNumber) (*Empty, error)
-	//
-	// Enables ONU serailnumber, enable device at PLOAM
-	// Takes input as intfid and sn of the ONU. Generally used when the onu is not present in the OLT.
-	// Returns success if the call towards the device is success, error otherwise.
-	EnableOnuSerialNumber(context.Context, *InterfaceOnuSerialNumber) (*Empty, error)
-}
-
-// UnimplementedOpenoltServer can be embedded to have forward compatible implementations.
-type UnimplementedOpenoltServer struct {
-}
-
-func (*UnimplementedOpenoltServer) DisableOlt(ctx context.Context, req *Empty) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method DisableOlt not implemented")
-}
-func (*UnimplementedOpenoltServer) ReenableOlt(ctx context.Context, req *Empty) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method ReenableOlt not implemented")
-}
-func (*UnimplementedOpenoltServer) ActivateOnu(ctx context.Context, req *Onu) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method ActivateOnu not implemented")
-}
-func (*UnimplementedOpenoltServer) DeactivateOnu(ctx context.Context, req *Onu) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method DeactivateOnu not implemented")
-}
-func (*UnimplementedOpenoltServer) DeleteOnu(ctx context.Context, req *Onu) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method DeleteOnu not implemented")
-}
-func (*UnimplementedOpenoltServer) OmciMsgOut(ctx context.Context, req *OmciMsg) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method OmciMsgOut not implemented")
-}
-func (*UnimplementedOpenoltServer) OnuPacketOut(ctx context.Context, req *OnuPacket) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method OnuPacketOut not implemented")
-}
-func (*UnimplementedOpenoltServer) UplinkPacketOut(ctx context.Context, req *UplinkPacket) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method UplinkPacketOut not implemented")
-}
-func (*UnimplementedOpenoltServer) FlowAdd(ctx context.Context, req *Flow) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method FlowAdd not implemented")
-}
-func (*UnimplementedOpenoltServer) FlowRemove(ctx context.Context, req *Flow) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method FlowRemove not implemented")
-}
-func (*UnimplementedOpenoltServer) HeartbeatCheck(ctx context.Context, req *Empty) (*Heartbeat, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method HeartbeatCheck not implemented")
-}
-func (*UnimplementedOpenoltServer) EnablePonIf(ctx context.Context, req *Interface) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method EnablePonIf not implemented")
-}
-func (*UnimplementedOpenoltServer) DisablePonIf(ctx context.Context, req *Interface) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method DisablePonIf not implemented")
-}
-func (*UnimplementedOpenoltServer) GetDeviceInfo(ctx context.Context, req *Empty) (*DeviceInfo, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetDeviceInfo not implemented")
-}
-func (*UnimplementedOpenoltServer) Reboot(ctx context.Context, req *Empty) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Reboot not implemented")
-}
-func (*UnimplementedOpenoltServer) CollectStatistics(ctx context.Context, req *Empty) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method CollectStatistics not implemented")
-}
-func (*UnimplementedOpenoltServer) GetOnuStatistics(ctx context.Context, req *Onu) (*OnuStatistics, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetOnuStatistics not implemented")
-}
-func (*UnimplementedOpenoltServer) GetGemPortStatistics(ctx context.Context, req *OnuPacket) (*GemPortStatistics, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetGemPortStatistics not implemented")
-}
-func (*UnimplementedOpenoltServer) CreateTrafficSchedulers(ctx context.Context, req *tech_profile.TrafficSchedulers) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method CreateTrafficSchedulers not implemented")
-}
-func (*UnimplementedOpenoltServer) RemoveTrafficSchedulers(ctx context.Context, req *tech_profile.TrafficSchedulers) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method RemoveTrafficSchedulers not implemented")
-}
-func (*UnimplementedOpenoltServer) CreateTrafficQueues(ctx context.Context, req *tech_profile.TrafficQueues) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method CreateTrafficQueues not implemented")
-}
-func (*UnimplementedOpenoltServer) RemoveTrafficQueues(ctx context.Context, req *tech_profile.TrafficQueues) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method RemoveTrafficQueues not implemented")
-}
-func (*UnimplementedOpenoltServer) EnableIndication(req *Empty, srv Openolt_EnableIndicationServer) error {
-	return status.Errorf(codes.Unimplemented, "method EnableIndication not implemented")
-}
-func (*UnimplementedOpenoltServer) PerformGroupOperation(ctx context.Context, req *Group) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method PerformGroupOperation not implemented")
-}
-func (*UnimplementedOpenoltServer) DeleteGroup(ctx context.Context, req *Group) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method DeleteGroup not implemented")
-}
-func (*UnimplementedOpenoltServer) GetExtValue(ctx context.Context, req *ValueParam) (*extension.ReturnValues, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetExtValue not implemented")
-}
-func (*UnimplementedOpenoltServer) OnuItuPonAlarmSet(ctx context.Context, req *config.OnuItuPonAlarm) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method OnuItuPonAlarmSet not implemented")
-}
-func (*UnimplementedOpenoltServer) GetLogicalOnuDistanceZero(ctx context.Context, req *Onu) (*OnuLogicalDistance, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetLogicalOnuDistanceZero not implemented")
-}
-func (*UnimplementedOpenoltServer) GetLogicalOnuDistance(ctx context.Context, req *Onu) (*OnuLogicalDistance, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetLogicalOnuDistance not implemented")
-}
-func (*UnimplementedOpenoltServer) GetPonRxPower(ctx context.Context, req *Onu) (*PonRxPowerData, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetPonRxPower not implemented")
-}
-func (*UnimplementedOpenoltServer) GetOnuInfo(ctx context.Context, req *Onu) (*OnuInfo, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetOnuInfo not implemented")
-}
-func (*UnimplementedOpenoltServer) GetPonInterfaceInfo(ctx context.Context, req *Interface) (*PonIntfInfo, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetPonInterfaceInfo not implemented")
-}
-func (*UnimplementedOpenoltServer) GetAllocIdStatistics(ctx context.Context, req *OnuPacket) (*OnuAllocIdStatistics, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetAllocIdStatistics not implemented")
-}
-func (*UnimplementedOpenoltServer) GetPonPortStatistics(ctx context.Context, req *Interface) (*common.PortStatistics, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetPonPortStatistics not implemented")
-}
-func (*UnimplementedOpenoltServer) GetNniPortStatistics(ctx context.Context, req *Interface) (*common.PortStatistics, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetNniPortStatistics not implemented")
-}
-func (*UnimplementedOpenoltServer) DisableOnu(ctx context.Context, req *InterfaceOnuSerialNumberOnuId) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method DisableOnu not implemented")
-}
-func (*UnimplementedOpenoltServer) EnableOnu(ctx context.Context, req *InterfaceOnuSerialNumberOnuId) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method EnableOnu not implemented")
-}
-func (*UnimplementedOpenoltServer) DisableOnuSerialNumber(ctx context.Context, req *InterfaceOnuSerialNumber) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method DisableOnuSerialNumber not implemented")
-}
-func (*UnimplementedOpenoltServer) EnableOnuSerialNumber(ctx context.Context, req *InterfaceOnuSerialNumber) (*Empty, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method EnableOnuSerialNumber not implemented")
-}
-
-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_GetOnuStatistics_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).GetOnuStatistics(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/GetOnuStatistics",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).GetOnuStatistics(ctx, req.(*Onu))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_GetGemPortStatistics_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).GetGemPortStatistics(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/GetGemPortStatistics",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).GetGemPortStatistics(ctx, req.(*OnuPacket))
-	}
-	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)
-}
-
-func _Openolt_PerformGroupOperation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(Group)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(OpenoltServer).PerformGroupOperation(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/PerformGroupOperation",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).PerformGroupOperation(ctx, req.(*Group))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_DeleteGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(Group)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(OpenoltServer).DeleteGroup(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/DeleteGroup",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).DeleteGroup(ctx, req.(*Group))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_GetExtValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(ValueParam)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(OpenoltServer).GetExtValue(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/GetExtValue",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).GetExtValue(ctx, req.(*ValueParam))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_OnuItuPonAlarmSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(config.OnuItuPonAlarm)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(OpenoltServer).OnuItuPonAlarmSet(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/OnuItuPonAlarmSet",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).OnuItuPonAlarmSet(ctx, req.(*config.OnuItuPonAlarm))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_GetLogicalOnuDistanceZero_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).GetLogicalOnuDistanceZero(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/GetLogicalOnuDistanceZero",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).GetLogicalOnuDistanceZero(ctx, req.(*Onu))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_GetLogicalOnuDistance_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).GetLogicalOnuDistance(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/GetLogicalOnuDistance",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).GetLogicalOnuDistance(ctx, req.(*Onu))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_GetPonRxPower_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).GetPonRxPower(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/GetPonRxPower",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).GetPonRxPower(ctx, req.(*Onu))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_GetOnuInfo_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).GetOnuInfo(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/GetOnuInfo",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).GetOnuInfo(ctx, req.(*Onu))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_GetPonInterfaceInfo_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).GetPonInterfaceInfo(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/GetPonInterfaceInfo",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).GetPonInterfaceInfo(ctx, req.(*Interface))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_GetAllocIdStatistics_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).GetAllocIdStatistics(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/GetAllocIdStatistics",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).GetAllocIdStatistics(ctx, req.(*OnuPacket))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_GetPonPortStatistics_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).GetPonPortStatistics(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/GetPonPortStatistics",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).GetPonPortStatistics(ctx, req.(*Interface))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_GetNniPortStatistics_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).GetNniPortStatistics(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/GetNniPortStatistics",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).GetNniPortStatistics(ctx, req.(*Interface))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_DisableOnu_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(InterfaceOnuSerialNumberOnuId)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(OpenoltServer).DisableOnu(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/DisableOnu",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).DisableOnu(ctx, req.(*InterfaceOnuSerialNumberOnuId))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_EnableOnu_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(InterfaceOnuSerialNumberOnuId)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(OpenoltServer).EnableOnu(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/EnableOnu",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).EnableOnu(ctx, req.(*InterfaceOnuSerialNumberOnuId))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_DisableOnuSerialNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(InterfaceOnuSerialNumber)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(OpenoltServer).DisableOnuSerialNumber(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/DisableOnuSerialNumber",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).DisableOnuSerialNumber(ctx, req.(*InterfaceOnuSerialNumber))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Openolt_EnableOnuSerialNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(InterfaceOnuSerialNumber)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(OpenoltServer).EnableOnuSerialNumber(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/openolt.Openolt/EnableOnuSerialNumber",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(OpenoltServer).EnableOnuSerialNumber(ctx, req.(*InterfaceOnuSerialNumber))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _Openolt_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "openolt.Openolt",
-	HandlerType: (*OpenoltServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "DisableOlt",
-			Handler:    _Openolt_DisableOlt_Handler,
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: unsafe.Slice(unsafe.StringData(file_voltha_protos_openolt_proto_rawDesc), len(file_voltha_protos_openolt_proto_rawDesc)),
+			NumEnums:      10,
+			NumMessages:   63,
+			NumExtensions: 0,
+			NumServices:   1,
 		},
-		{
-			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: "GetOnuStatistics",
-			Handler:    _Openolt_GetOnuStatistics_Handler,
-		},
-		{
-			MethodName: "GetGemPortStatistics",
-			Handler:    _Openolt_GetGemPortStatistics_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,
-		},
-		{
-			MethodName: "PerformGroupOperation",
-			Handler:    _Openolt_PerformGroupOperation_Handler,
-		},
-		{
-			MethodName: "DeleteGroup",
-			Handler:    _Openolt_DeleteGroup_Handler,
-		},
-		{
-			MethodName: "GetExtValue",
-			Handler:    _Openolt_GetExtValue_Handler,
-		},
-		{
-			MethodName: "OnuItuPonAlarmSet",
-			Handler:    _Openolt_OnuItuPonAlarmSet_Handler,
-		},
-		{
-			MethodName: "GetLogicalOnuDistanceZero",
-			Handler:    _Openolt_GetLogicalOnuDistanceZero_Handler,
-		},
-		{
-			MethodName: "GetLogicalOnuDistance",
-			Handler:    _Openolt_GetLogicalOnuDistance_Handler,
-		},
-		{
-			MethodName: "GetPonRxPower",
-			Handler:    _Openolt_GetPonRxPower_Handler,
-		},
-		{
-			MethodName: "GetOnuInfo",
-			Handler:    _Openolt_GetOnuInfo_Handler,
-		},
-		{
-			MethodName: "GetPonInterfaceInfo",
-			Handler:    _Openolt_GetPonInterfaceInfo_Handler,
-		},
-		{
-			MethodName: "GetAllocIdStatistics",
-			Handler:    _Openolt_GetAllocIdStatistics_Handler,
-		},
-		{
-			MethodName: "GetPonPortStatistics",
-			Handler:    _Openolt_GetPonPortStatistics_Handler,
-		},
-		{
-			MethodName: "GetNniPortStatistics",
-			Handler:    _Openolt_GetNniPortStatistics_Handler,
-		},
-		{
-			MethodName: "DisableOnu",
-			Handler:    _Openolt_DisableOnu_Handler,
-		},
-		{
-			MethodName: "EnableOnu",
-			Handler:    _Openolt_EnableOnu_Handler,
-		},
-		{
-			MethodName: "DisableOnuSerialNumber",
-			Handler:    _Openolt_DisableOnuSerialNumber_Handler,
-		},
-		{
-			MethodName: "EnableOnuSerialNumber",
-			Handler:    _Openolt_EnableOnuSerialNumber_Handler,
-		},
-	},
-	Streams: []grpc.StreamDesc{
-		{
-			StreamName:    "EnableIndication",
-			Handler:       _Openolt_EnableIndication_Handler,
-			ServerStreams: true,
-		},
-	},
-	Metadata: "voltha_protos/openolt.proto",
+		GoTypes:           file_voltha_protos_openolt_proto_goTypes,
+		DependencyIndexes: file_voltha_protos_openolt_proto_depIdxs,
+		EnumInfos:         file_voltha_protos_openolt_proto_enumTypes,
+		MessageInfos:      file_voltha_protos_openolt_proto_msgTypes,
+	}.Build()
+	File_voltha_protos_openolt_proto = out.File
+	file_voltha_protos_openolt_proto_goTypes = nil
+	file_voltha_protos_openolt_proto_depIdxs = nil
 }
