diff --git a/go/extension/extensions.pb.go b/go/extension/extensions.pb.go
index a43c4bd..883a391 100644
--- a/go/extension/extensions.pb.go
+++ b/go/extension/extensions.pb.go
@@ -1,31 +1,42 @@
+// 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/extensions.proto
 
 package extension
 
 import (
-	context "context"
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	empty "github.com/golang/protobuf/ptypes/empty"
 	common "github.com/opencord/voltha-protos/v5/go/common"
 	config "github.com/opencord/voltha-protos/v5/go/ext/config"
-	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"
+	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	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 ValueType_Type int32
 
@@ -34,22 +45,43 @@
 	ValueType_DISTANCE ValueType_Type = 1
 )
 
-var ValueType_Type_name = map[int32]string{
-	0: "EMPTY",
-	1: "DISTANCE",
-}
+// Enum value maps for ValueType_Type.
+var (
+	ValueType_Type_name = map[int32]string{
+		0: "EMPTY",
+		1: "DISTANCE",
+	}
+	ValueType_Type_value = map[string]int32{
+		"EMPTY":    0,
+		"DISTANCE": 1,
+	}
+)
 
-var ValueType_Type_value = map[string]int32{
-	"EMPTY":    0,
-	"DISTANCE": 1,
+func (x ValueType_Type) Enum() *ValueType_Type {
+	p := new(ValueType_Type)
+	*p = x
+	return p
 }
 
 func (x ValueType_Type) String() string {
-	return proto.EnumName(ValueType_Type_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (ValueType_Type) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_extensions_proto_enumTypes[0].Descriptor()
+}
+
+func (ValueType_Type) Type() protoreflect.EnumType {
+	return &file_voltha_protos_extensions_proto_enumTypes[0]
+}
+
+func (x ValueType_Type) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ValueType_Type.Descriptor instead.
 func (ValueType_Type) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{1, 0}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{1, 0}
 }
 
 type GetOnuUniInfoResponse_ConfigurationInd int32
@@ -65,34 +97,55 @@
 	GetOnuUniInfoResponse_GIGABIT_ETHERNET_HDX GetOnuUniInfoResponse_ConfigurationInd = 7
 )
 
-var GetOnuUniInfoResponse_ConfigurationInd_name = map[int32]string{
-	0: "UNKOWN",
-	1: "TEN_BASE_T_FDX",
-	2: "HUNDRED_BASE_T_FDX",
-	3: "GIGABIT_ETHERNET_FDX",
-	4: "TEN_G_ETHERNET_FDX",
-	5: "TEN_BASE_T_HDX",
-	6: "HUNDRED_BASE_T_HDX",
-	7: "GIGABIT_ETHERNET_HDX",
-}
+// Enum value maps for GetOnuUniInfoResponse_ConfigurationInd.
+var (
+	GetOnuUniInfoResponse_ConfigurationInd_name = map[int32]string{
+		0: "UNKOWN",
+		1: "TEN_BASE_T_FDX",
+		2: "HUNDRED_BASE_T_FDX",
+		3: "GIGABIT_ETHERNET_FDX",
+		4: "TEN_G_ETHERNET_FDX",
+		5: "TEN_BASE_T_HDX",
+		6: "HUNDRED_BASE_T_HDX",
+		7: "GIGABIT_ETHERNET_HDX",
+	}
+	GetOnuUniInfoResponse_ConfigurationInd_value = map[string]int32{
+		"UNKOWN":               0,
+		"TEN_BASE_T_FDX":       1,
+		"HUNDRED_BASE_T_FDX":   2,
+		"GIGABIT_ETHERNET_FDX": 3,
+		"TEN_G_ETHERNET_FDX":   4,
+		"TEN_BASE_T_HDX":       5,
+		"HUNDRED_BASE_T_HDX":   6,
+		"GIGABIT_ETHERNET_HDX": 7,
+	}
+)
 
-var GetOnuUniInfoResponse_ConfigurationInd_value = map[string]int32{
-	"UNKOWN":               0,
-	"TEN_BASE_T_FDX":       1,
-	"HUNDRED_BASE_T_FDX":   2,
-	"GIGABIT_ETHERNET_FDX": 3,
-	"TEN_G_ETHERNET_FDX":   4,
-	"TEN_BASE_T_HDX":       5,
-	"HUNDRED_BASE_T_HDX":   6,
-	"GIGABIT_ETHERNET_HDX": 7,
+func (x GetOnuUniInfoResponse_ConfigurationInd) Enum() *GetOnuUniInfoResponse_ConfigurationInd {
+	p := new(GetOnuUniInfoResponse_ConfigurationInd)
+	*p = x
+	return p
 }
 
 func (x GetOnuUniInfoResponse_ConfigurationInd) String() string {
-	return proto.EnumName(GetOnuUniInfoResponse_ConfigurationInd_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (GetOnuUniInfoResponse_ConfigurationInd) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_extensions_proto_enumTypes[1].Descriptor()
+}
+
+func (GetOnuUniInfoResponse_ConfigurationInd) Type() protoreflect.EnumType {
+	return &file_voltha_protos_extensions_proto_enumTypes[1]
+}
+
+func (x GetOnuUniInfoResponse_ConfigurationInd) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use GetOnuUniInfoResponse_ConfigurationInd.Descriptor instead.
 func (GetOnuUniInfoResponse_ConfigurationInd) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{7, 0}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{7, 0}
 }
 
 type GetOnuUniInfoResponse_AdministrativeState int32
@@ -103,24 +156,45 @@
 	GetOnuUniInfoResponse_UNLOCKED           GetOnuUniInfoResponse_AdministrativeState = 2
 )
 
-var GetOnuUniInfoResponse_AdministrativeState_name = map[int32]string{
-	0: "ADMSTATE_UNDEFINED",
-	1: "LOCKED",
-	2: "UNLOCKED",
-}
+// Enum value maps for GetOnuUniInfoResponse_AdministrativeState.
+var (
+	GetOnuUniInfoResponse_AdministrativeState_name = map[int32]string{
+		0: "ADMSTATE_UNDEFINED",
+		1: "LOCKED",
+		2: "UNLOCKED",
+	}
+	GetOnuUniInfoResponse_AdministrativeState_value = map[string]int32{
+		"ADMSTATE_UNDEFINED": 0,
+		"LOCKED":             1,
+		"UNLOCKED":           2,
+	}
+)
 
-var GetOnuUniInfoResponse_AdministrativeState_value = map[string]int32{
-	"ADMSTATE_UNDEFINED": 0,
-	"LOCKED":             1,
-	"UNLOCKED":           2,
+func (x GetOnuUniInfoResponse_AdministrativeState) Enum() *GetOnuUniInfoResponse_AdministrativeState {
+	p := new(GetOnuUniInfoResponse_AdministrativeState)
+	*p = x
+	return p
 }
 
 func (x GetOnuUniInfoResponse_AdministrativeState) String() string {
-	return proto.EnumName(GetOnuUniInfoResponse_AdministrativeState_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (GetOnuUniInfoResponse_AdministrativeState) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_extensions_proto_enumTypes[2].Descriptor()
+}
+
+func (GetOnuUniInfoResponse_AdministrativeState) Type() protoreflect.EnumType {
+	return &file_voltha_protos_extensions_proto_enumTypes[2]
+}
+
+func (x GetOnuUniInfoResponse_AdministrativeState) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use GetOnuUniInfoResponse_AdministrativeState.Descriptor instead.
 func (GetOnuUniInfoResponse_AdministrativeState) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{7, 1}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{7, 1}
 }
 
 type GetOnuUniInfoResponse_OperationalState int32
@@ -131,24 +205,45 @@
 	GetOnuUniInfoResponse_DISABLED            GetOnuUniInfoResponse_OperationalState = 2
 )
 
-var GetOnuUniInfoResponse_OperationalState_name = map[int32]string{
-	0: "OPERSTATE_UNDEFINED",
-	1: "ENABLED",
-	2: "DISABLED",
-}
+// Enum value maps for GetOnuUniInfoResponse_OperationalState.
+var (
+	GetOnuUniInfoResponse_OperationalState_name = map[int32]string{
+		0: "OPERSTATE_UNDEFINED",
+		1: "ENABLED",
+		2: "DISABLED",
+	}
+	GetOnuUniInfoResponse_OperationalState_value = map[string]int32{
+		"OPERSTATE_UNDEFINED": 0,
+		"ENABLED":             1,
+		"DISABLED":            2,
+	}
+)
 
-var GetOnuUniInfoResponse_OperationalState_value = map[string]int32{
-	"OPERSTATE_UNDEFINED": 0,
-	"ENABLED":             1,
-	"DISABLED":            2,
+func (x GetOnuUniInfoResponse_OperationalState) Enum() *GetOnuUniInfoResponse_OperationalState {
+	p := new(GetOnuUniInfoResponse_OperationalState)
+	*p = x
+	return p
 }
 
 func (x GetOnuUniInfoResponse_OperationalState) String() string {
-	return proto.EnumName(GetOnuUniInfoResponse_OperationalState_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (GetOnuUniInfoResponse_OperationalState) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_extensions_proto_enumTypes[3].Descriptor()
+}
+
+func (GetOnuUniInfoResponse_OperationalState) Type() protoreflect.EnumType {
+	return &file_voltha_protos_extensions_proto_enumTypes[3]
+}
+
+func (x GetOnuUniInfoResponse_OperationalState) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use GetOnuUniInfoResponse_OperationalState.Descriptor instead.
 func (GetOnuUniInfoResponse_OperationalState) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{7, 2}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{7, 2}
 }
 
 type GetOltPortCounters_PortType int32
@@ -159,24 +254,45 @@
 	GetOltPortCounters_Port_PON_OLT      GetOltPortCounters_PortType = 2
 )
 
-var GetOltPortCounters_PortType_name = map[int32]string{
-	0: "Port_UNKNOWN",
-	1: "Port_ETHERNET_NNI",
-	2: "Port_PON_OLT",
-}
+// Enum value maps for GetOltPortCounters_PortType.
+var (
+	GetOltPortCounters_PortType_name = map[int32]string{
+		0: "Port_UNKNOWN",
+		1: "Port_ETHERNET_NNI",
+		2: "Port_PON_OLT",
+	}
+	GetOltPortCounters_PortType_value = map[string]int32{
+		"Port_UNKNOWN":      0,
+		"Port_ETHERNET_NNI": 1,
+		"Port_PON_OLT":      2,
+	}
+)
 
-var GetOltPortCounters_PortType_value = map[string]int32{
-	"Port_UNKNOWN":      0,
-	"Port_ETHERNET_NNI": 1,
-	"Port_PON_OLT":      2,
+func (x GetOltPortCounters_PortType) Enum() *GetOltPortCounters_PortType {
+	p := new(GetOltPortCounters_PortType)
+	*p = x
+	return p
 }
 
 func (x GetOltPortCounters_PortType) String() string {
-	return proto.EnumName(GetOltPortCounters_PortType_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (GetOltPortCounters_PortType) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_extensions_proto_enumTypes[4].Descriptor()
+}
+
+func (GetOltPortCounters_PortType) Type() protoreflect.EnumType {
+	return &file_voltha_protos_extensions_proto_enumTypes[4]
+}
+
+func (x GetOltPortCounters_PortType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use GetOltPortCounters_PortType.Descriptor instead.
 func (GetOltPortCounters_PortType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{8, 0}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{8, 0}
 }
 
 type GetOnuEthernetBridgePortHistory_Direction int32
@@ -187,24 +303,45 @@
 	GetOnuEthernetBridgePortHistory_DOWNSTREAM GetOnuEthernetBridgePortHistory_Direction = 2
 )
 
-var GetOnuEthernetBridgePortHistory_Direction_name = map[int32]string{
-	0: "UNDEFINED",
-	1: "UPSTREAM",
-	2: "DOWNSTREAM",
-}
+// Enum value maps for GetOnuEthernetBridgePortHistory_Direction.
+var (
+	GetOnuEthernetBridgePortHistory_Direction_name = map[int32]string{
+		0: "UNDEFINED",
+		1: "UPSTREAM",
+		2: "DOWNSTREAM",
+	}
+	GetOnuEthernetBridgePortHistory_Direction_value = map[string]int32{
+		"UNDEFINED":  0,
+		"UPSTREAM":   1,
+		"DOWNSTREAM": 2,
+	}
+)
 
-var GetOnuEthernetBridgePortHistory_Direction_value = map[string]int32{
-	"UNDEFINED":  0,
-	"UPSTREAM":   1,
-	"DOWNSTREAM": 2,
+func (x GetOnuEthernetBridgePortHistory_Direction) Enum() *GetOnuEthernetBridgePortHistory_Direction {
+	p := new(GetOnuEthernetBridgePortHistory_Direction)
+	*p = x
+	return p
 }
 
 func (x GetOnuEthernetBridgePortHistory_Direction) String() string {
-	return proto.EnumName(GetOnuEthernetBridgePortHistory_Direction_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (GetOnuEthernetBridgePortHistory_Direction) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_extensions_proto_enumTypes[5].Descriptor()
+}
+
+func (GetOnuEthernetBridgePortHistory_Direction) Type() protoreflect.EnumType {
+	return &file_voltha_protos_extensions_proto_enumTypes[5]
+}
+
+func (x GetOnuEthernetBridgePortHistory_Direction) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use GetOnuEthernetBridgePortHistory_Direction.Descriptor instead.
 func (GetOnuEthernetBridgePortHistory_Direction) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{12, 0}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{12, 0}
 }
 
 type GetOmciEthernetFrameExtendedPmResponse_Format int32
@@ -214,22 +351,43 @@
 	GetOmciEthernetFrameExtendedPmResponse_SIXTY_FOUR_BIT GetOmciEthernetFrameExtendedPmResponse_Format = 1
 )
 
-var GetOmciEthernetFrameExtendedPmResponse_Format_name = map[int32]string{
-	0: "THIRTY_TWO_BIT",
-	1: "SIXTY_FOUR_BIT",
-}
+// Enum value maps for GetOmciEthernetFrameExtendedPmResponse_Format.
+var (
+	GetOmciEthernetFrameExtendedPmResponse_Format_name = map[int32]string{
+		0: "THIRTY_TWO_BIT",
+		1: "SIXTY_FOUR_BIT",
+	}
+	GetOmciEthernetFrameExtendedPmResponse_Format_value = map[string]int32{
+		"THIRTY_TWO_BIT": 0,
+		"SIXTY_FOUR_BIT": 1,
+	}
+)
 
-var GetOmciEthernetFrameExtendedPmResponse_Format_value = map[string]int32{
-	"THIRTY_TWO_BIT": 0,
-	"SIXTY_FOUR_BIT": 1,
+func (x GetOmciEthernetFrameExtendedPmResponse_Format) Enum() *GetOmciEthernetFrameExtendedPmResponse_Format {
+	p := new(GetOmciEthernetFrameExtendedPmResponse_Format)
+	*p = x
+	return p
 }
 
 func (x GetOmciEthernetFrameExtendedPmResponse_Format) String() string {
-	return proto.EnumName(GetOmciEthernetFrameExtendedPmResponse_Format_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (GetOmciEthernetFrameExtendedPmResponse_Format) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_extensions_proto_enumTypes[6].Descriptor()
+}
+
+func (GetOmciEthernetFrameExtendedPmResponse_Format) Type() protoreflect.EnumType {
+	return &file_voltha_protos_extensions_proto_enumTypes[6]
+}
+
+func (x GetOmciEthernetFrameExtendedPmResponse_Format) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use GetOmciEthernetFrameExtendedPmResponse_Format.Descriptor instead.
 func (GetOmciEthernetFrameExtendedPmResponse_Format) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{36, 0}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{36, 0}
 }
 
 type GetOffloadedAppsStatisticsRequest_OffloadedApp int32
@@ -241,26 +399,47 @@
 	GetOffloadedAppsStatisticsRequest_DHCPv6RA  GetOffloadedAppsStatisticsRequest_OffloadedApp = 3
 )
 
-var GetOffloadedAppsStatisticsRequest_OffloadedApp_name = map[int32]string{
-	0: "UNDEFINED",
-	1: "PPPoeIA",
-	2: "DHCPv4RA",
-	3: "DHCPv6RA",
-}
+// Enum value maps for GetOffloadedAppsStatisticsRequest_OffloadedApp.
+var (
+	GetOffloadedAppsStatisticsRequest_OffloadedApp_name = map[int32]string{
+		0: "UNDEFINED",
+		1: "PPPoeIA",
+		2: "DHCPv4RA",
+		3: "DHCPv6RA",
+	}
+	GetOffloadedAppsStatisticsRequest_OffloadedApp_value = map[string]int32{
+		"UNDEFINED": 0,
+		"PPPoeIA":   1,
+		"DHCPv4RA":  2,
+		"DHCPv6RA":  3,
+	}
+)
 
-var GetOffloadedAppsStatisticsRequest_OffloadedApp_value = map[string]int32{
-	"UNDEFINED": 0,
-	"PPPoeIA":   1,
-	"DHCPv4RA":  2,
-	"DHCPv6RA":  3,
+func (x GetOffloadedAppsStatisticsRequest_OffloadedApp) Enum() *GetOffloadedAppsStatisticsRequest_OffloadedApp {
+	p := new(GetOffloadedAppsStatisticsRequest_OffloadedApp)
+	*p = x
+	return p
 }
 
 func (x GetOffloadedAppsStatisticsRequest_OffloadedApp) String() string {
-	return proto.EnumName(GetOffloadedAppsStatisticsRequest_OffloadedApp_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (GetOffloadedAppsStatisticsRequest_OffloadedApp) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_extensions_proto_enumTypes[7].Descriptor()
+}
+
+func (GetOffloadedAppsStatisticsRequest_OffloadedApp) Type() protoreflect.EnumType {
+	return &file_voltha_protos_extensions_proto_enumTypes[7]
+}
+
+func (x GetOffloadedAppsStatisticsRequest_OffloadedApp) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use GetOffloadedAppsStatisticsRequest_OffloadedApp.Descriptor instead.
 func (GetOffloadedAppsStatisticsRequest_OffloadedApp) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{45, 0}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{45, 0}
 }
 
 type GetValueResponse_Status int32
@@ -271,24 +450,45 @@
 	GetValueResponse_ERROR            GetValueResponse_Status = 2
 )
 
-var GetValueResponse_Status_name = map[int32]string{
-	0: "STATUS_UNDEFINED",
-	1: "OK",
-	2: "ERROR",
-}
+// Enum value maps for GetValueResponse_Status.
+var (
+	GetValueResponse_Status_name = map[int32]string{
+		0: "STATUS_UNDEFINED",
+		1: "OK",
+		2: "ERROR",
+	}
+	GetValueResponse_Status_value = map[string]int32{
+		"STATUS_UNDEFINED": 0,
+		"OK":               1,
+		"ERROR":            2,
+	}
+)
 
-var GetValueResponse_Status_value = map[string]int32{
-	"STATUS_UNDEFINED": 0,
-	"OK":               1,
-	"ERROR":            2,
+func (x GetValueResponse_Status) Enum() *GetValueResponse_Status {
+	p := new(GetValueResponse_Status)
+	*p = x
+	return p
 }
 
 func (x GetValueResponse_Status) String() string {
-	return proto.EnumName(GetValueResponse_Status_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (GetValueResponse_Status) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_extensions_proto_enumTypes[8].Descriptor()
+}
+
+func (GetValueResponse_Status) Type() protoreflect.EnumType {
+	return &file_voltha_protos_extensions_proto_enumTypes[8]
+}
+
+func (x GetValueResponse_Status) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use GetValueResponse_Status.Descriptor instead.
 func (GetValueResponse_Status) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{48, 0}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{48, 0}
 }
 
 type GetValueResponse_ErrorReason int32
@@ -304,34 +504,55 @@
 	GetValueResponse_INVALID_DEVICE    GetValueResponse_ErrorReason = 7
 )
 
-var GetValueResponse_ErrorReason_name = map[int32]string{
-	0: "REASON_UNDEFINED",
-	1: "UNSUPPORTED",
-	2: "INVALID_DEVICE_ID",
-	3: "INVALID_PORT_TYPE",
-	4: "TIMEOUT",
-	5: "INVALID_REQ_TYPE",
-	6: "INTERNAL_ERROR",
-	7: "INVALID_DEVICE",
-}
+// Enum value maps for GetValueResponse_ErrorReason.
+var (
+	GetValueResponse_ErrorReason_name = map[int32]string{
+		0: "REASON_UNDEFINED",
+		1: "UNSUPPORTED",
+		2: "INVALID_DEVICE_ID",
+		3: "INVALID_PORT_TYPE",
+		4: "TIMEOUT",
+		5: "INVALID_REQ_TYPE",
+		6: "INTERNAL_ERROR",
+		7: "INVALID_DEVICE",
+	}
+	GetValueResponse_ErrorReason_value = map[string]int32{
+		"REASON_UNDEFINED":  0,
+		"UNSUPPORTED":       1,
+		"INVALID_DEVICE_ID": 2,
+		"INVALID_PORT_TYPE": 3,
+		"TIMEOUT":           4,
+		"INVALID_REQ_TYPE":  5,
+		"INTERNAL_ERROR":    6,
+		"INVALID_DEVICE":    7,
+	}
+)
 
-var GetValueResponse_ErrorReason_value = map[string]int32{
-	"REASON_UNDEFINED":  0,
-	"UNSUPPORTED":       1,
-	"INVALID_DEVICE_ID": 2,
-	"INVALID_PORT_TYPE": 3,
-	"TIMEOUT":           4,
-	"INVALID_REQ_TYPE":  5,
-	"INTERNAL_ERROR":    6,
-	"INVALID_DEVICE":    7,
+func (x GetValueResponse_ErrorReason) Enum() *GetValueResponse_ErrorReason {
+	p := new(GetValueResponse_ErrorReason)
+	*p = x
+	return p
 }
 
 func (x GetValueResponse_ErrorReason) String() string {
-	return proto.EnumName(GetValueResponse_ErrorReason_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (GetValueResponse_ErrorReason) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_extensions_proto_enumTypes[9].Descriptor()
+}
+
+func (GetValueResponse_ErrorReason) Type() protoreflect.EnumType {
+	return &file_voltha_protos_extensions_proto_enumTypes[9]
+}
+
+func (x GetValueResponse_ErrorReason) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use GetValueResponse_ErrorReason.Descriptor instead.
 func (GetValueResponse_ErrorReason) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{48, 1}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{48, 1}
 }
 
 type SetValueResponse_Status int32
@@ -342,24 +563,45 @@
 	SetValueResponse_ERROR            SetValueResponse_Status = 2
 )
 
-var SetValueResponse_Status_name = map[int32]string{
-	0: "STATUS_UNDEFINED",
-	1: "OK",
-	2: "ERROR",
-}
+// Enum value maps for SetValueResponse_Status.
+var (
+	SetValueResponse_Status_name = map[int32]string{
+		0: "STATUS_UNDEFINED",
+		1: "OK",
+		2: "ERROR",
+	}
+	SetValueResponse_Status_value = map[string]int32{
+		"STATUS_UNDEFINED": 0,
+		"OK":               1,
+		"ERROR":            2,
+	}
+)
 
-var SetValueResponse_Status_value = map[string]int32{
-	"STATUS_UNDEFINED": 0,
-	"OK":               1,
-	"ERROR":            2,
+func (x SetValueResponse_Status) Enum() *SetValueResponse_Status {
+	p := new(SetValueResponse_Status)
+	*p = x
+	return p
 }
 
 func (x SetValueResponse_Status) String() string {
-	return proto.EnumName(SetValueResponse_Status_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (SetValueResponse_Status) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_extensions_proto_enumTypes[10].Descriptor()
+}
+
+func (SetValueResponse_Status) Type() protoreflect.EnumType {
+	return &file_voltha_protos_extensions_proto_enumTypes[10]
+}
+
+func (x SetValueResponse_Status) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use SetValueResponse_Status.Descriptor instead.
 func (SetValueResponse_Status) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{52, 0}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{52, 0}
 }
 
 type SetValueResponse_ErrorReason int32
@@ -372,72 +614,115 @@
 	SetValueResponse_INVALID_UNI_ID        SetValueResponse_ErrorReason = 4
 )
 
-var SetValueResponse_ErrorReason_name = map[int32]string{
-	0: "REASON_UNDEFINED",
-	1: "UNSUPPORTED",
-	2: "INVALID_DEVICE_ID",
-	3: "INVALID_ONU_DEVICE_ID",
-	4: "INVALID_UNI_ID",
-}
+// Enum value maps for SetValueResponse_ErrorReason.
+var (
+	SetValueResponse_ErrorReason_name = map[int32]string{
+		0: "REASON_UNDEFINED",
+		1: "UNSUPPORTED",
+		2: "INVALID_DEVICE_ID",
+		3: "INVALID_ONU_DEVICE_ID",
+		4: "INVALID_UNI_ID",
+	}
+	SetValueResponse_ErrorReason_value = map[string]int32{
+		"REASON_UNDEFINED":      0,
+		"UNSUPPORTED":           1,
+		"INVALID_DEVICE_ID":     2,
+		"INVALID_ONU_DEVICE_ID": 3,
+		"INVALID_UNI_ID":        4,
+	}
+)
 
-var SetValueResponse_ErrorReason_value = map[string]int32{
-	"REASON_UNDEFINED":      0,
-	"UNSUPPORTED":           1,
-	"INVALID_DEVICE_ID":     2,
-	"INVALID_ONU_DEVICE_ID": 3,
-	"INVALID_UNI_ID":        4,
+func (x SetValueResponse_ErrorReason) Enum() *SetValueResponse_ErrorReason {
+	p := new(SetValueResponse_ErrorReason)
+	*p = x
+	return p
 }
 
 func (x SetValueResponse_ErrorReason) String() string {
-	return proto.EnumName(SetValueResponse_ErrorReason_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (SetValueResponse_ErrorReason) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_extensions_proto_enumTypes[11].Descriptor()
+}
+
+func (SetValueResponse_ErrorReason) Type() protoreflect.EnumType {
+	return &file_voltha_protos_extensions_proto_enumTypes[11]
+}
+
+func (x SetValueResponse_ErrorReason) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use SetValueResponse_ErrorReason.Descriptor instead.
 func (SetValueResponse_ErrorReason) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{52, 1}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{52, 1}
 }
 
 type ValueSet struct {
-	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	state protoimpl.MessageState `protogen:"open.v1"`
+	Id    string                 `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
 	// Types that are valid to be assigned to Value:
+	//
 	//	*ValueSet_AlarmConfig
-	Value                isValueSet_Value `protobuf_oneof:"value"`
-	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
-	XXX_unrecognized     []byte           `json:"-"`
-	XXX_sizecache        int32            `json:"-"`
+	Value         isValueSet_Value `protobuf_oneof:"value"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *ValueSet) Reset()         { *m = ValueSet{} }
-func (m *ValueSet) String() string { return proto.CompactTextString(m) }
-func (*ValueSet) ProtoMessage()    {}
+func (x *ValueSet) Reset() {
+	*x = ValueSet{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ValueSet) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ValueSet) ProtoMessage() {}
+
+func (x *ValueSet) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 ValueSet.ProtoReflect.Descriptor instead.
 func (*ValueSet) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{0}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{0}
 }
 
-func (m *ValueSet) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ValueSet.Unmarshal(m, b)
-}
-func (m *ValueSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ValueSet.Marshal(b, m, deterministic)
-}
-func (m *ValueSet) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ValueSet.Merge(m, src)
-}
-func (m *ValueSet) XXX_Size() int {
-	return xxx_messageInfo_ValueSet.Size(m)
-}
-func (m *ValueSet) XXX_DiscardUnknown() {
-	xxx_messageInfo_ValueSet.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ValueSet proto.InternalMessageInfo
-
-func (m *ValueSet) GetId() string {
-	if m != nil {
-		return m.Id
+func (x *ValueSet) GetId() string {
+	if x != nil {
+		return x.Id
 	}
 	return ""
 }
 
+func (x *ValueSet) GetValue() isValueSet_Value {
+	if x != nil {
+		return x.Value
+	}
+	return nil
+}
+
+func (x *ValueSet) GetAlarmConfig() *config.AlarmConfig {
+	if x != nil {
+		if x, ok := x.Value.(*ValueSet_AlarmConfig); ok {
+			return x.AlarmConfig
+		}
+	}
+	return nil
+}
+
 type isValueSet_Value interface {
 	isValueSet_Value()
 }
@@ -448,549 +733,578 @@
 
 func (*ValueSet_AlarmConfig) isValueSet_Value() {}
 
-func (m *ValueSet) GetValue() isValueSet_Value {
-	if m != nil {
-		return m.Value
-	}
-	return nil
-}
-
-func (m *ValueSet) GetAlarmConfig() *config.AlarmConfig {
-	if x, ok := m.GetValue().(*ValueSet_AlarmConfig); ok {
-		return x.AlarmConfig
-	}
-	return nil
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*ValueSet) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*ValueSet_AlarmConfig)(nil),
-	}
-}
-
 type ValueType struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *ValueType) Reset()         { *m = ValueType{} }
-func (m *ValueType) String() string { return proto.CompactTextString(m) }
-func (*ValueType) ProtoMessage()    {}
+func (x *ValueType) Reset() {
+	*x = ValueType{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ValueType) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ValueType) ProtoMessage() {}
+
+func (x *ValueType) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 ValueType.ProtoReflect.Descriptor instead.
 func (*ValueType) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{1}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{1}
 }
 
-func (m *ValueType) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ValueType.Unmarshal(m, b)
-}
-func (m *ValueType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ValueType.Marshal(b, m, deterministic)
-}
-func (m *ValueType) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ValueType.Merge(m, src)
-}
-func (m *ValueType) XXX_Size() int {
-	return xxx_messageInfo_ValueType.Size(m)
-}
-func (m *ValueType) XXX_DiscardUnknown() {
-	xxx_messageInfo_ValueType.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ValueType proto.InternalMessageInfo
-
 type ValueSpecifier struct {
-	Id                   string         `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	Value                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:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Id            string                 `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Value         ValueType_Type         `protobuf:"varint,2,opt,name=value,proto3,enum=extension.ValueType_Type" json:"value,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *ValueSpecifier) Reset()         { *m = ValueSpecifier{} }
-func (m *ValueSpecifier) String() string { return proto.CompactTextString(m) }
-func (*ValueSpecifier) ProtoMessage()    {}
+func (x *ValueSpecifier) Reset() {
+	*x = ValueSpecifier{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ValueSpecifier) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ValueSpecifier) ProtoMessage() {}
+
+func (x *ValueSpecifier) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 ValueSpecifier.ProtoReflect.Descriptor instead.
 func (*ValueSpecifier) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{2}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{2}
 }
 
-func (m *ValueSpecifier) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ValueSpecifier.Unmarshal(m, b)
-}
-func (m *ValueSpecifier) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ValueSpecifier.Marshal(b, m, deterministic)
-}
-func (m *ValueSpecifier) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ValueSpecifier.Merge(m, src)
-}
-func (m *ValueSpecifier) XXX_Size() int {
-	return xxx_messageInfo_ValueSpecifier.Size(m)
-}
-func (m *ValueSpecifier) XXX_DiscardUnknown() {
-	xxx_messageInfo_ValueSpecifier.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ValueSpecifier proto.InternalMessageInfo
-
-func (m *ValueSpecifier) GetId() string {
-	if m != nil {
-		return m.Id
+func (x *ValueSpecifier) GetId() string {
+	if x != nil {
+		return x.Id
 	}
 	return ""
 }
 
-func (m *ValueSpecifier) GetValue() ValueType_Type {
-	if m != nil {
-		return m.Value
+func (x *ValueSpecifier) GetValue() ValueType_Type {
+	if x != nil {
+		return x.Value
 	}
 	return ValueType_EMPTY
 }
 
 type ReturnValues struct {
-	Set                  uint32   `protobuf:"varint,1,opt,name=Set,proto3" json:"Set,omitempty"`
-	Unsupported          uint32   `protobuf:"varint,2,opt,name=Unsupported,proto3" json:"Unsupported,omitempty"`
-	Error                uint32   `protobuf:"varint,3,opt,name=Error,proto3" json:"Error,omitempty"`
-	Distance             uint32   `protobuf:"varint,4,opt,name=Distance,proto3" json:"Distance,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Set           uint32                 `protobuf:"varint,1,opt,name=Set,proto3" json:"Set,omitempty"`                 // Specifies what values are
+	Unsupported   uint32                 `protobuf:"varint,2,opt,name=Unsupported,proto3" json:"Unsupported,omitempty"` // Specifies requested values not
+	Error         uint32                 `protobuf:"varint,3,opt,name=Error,proto3" json:"Error,omitempty"`             // Specifies requested values not
+	Distance      uint32                 `protobuf:"varint,4,opt,name=Distance,proto3" json:"Distance,omitempty"`       // Value of distance Set includes
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *ReturnValues) Reset()         { *m = ReturnValues{} }
-func (m *ReturnValues) String() string { return proto.CompactTextString(m) }
-func (*ReturnValues) ProtoMessage()    {}
+func (x *ReturnValues) Reset() {
+	*x = ReturnValues{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ReturnValues) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReturnValues) ProtoMessage() {}
+
+func (x *ReturnValues) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 ReturnValues.ProtoReflect.Descriptor instead.
 func (*ReturnValues) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{3}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{3}
 }
 
-func (m *ReturnValues) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ReturnValues.Unmarshal(m, b)
-}
-func (m *ReturnValues) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ReturnValues.Marshal(b, m, deterministic)
-}
-func (m *ReturnValues) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ReturnValues.Merge(m, src)
-}
-func (m *ReturnValues) XXX_Size() int {
-	return xxx_messageInfo_ReturnValues.Size(m)
-}
-func (m *ReturnValues) XXX_DiscardUnknown() {
-	xxx_messageInfo_ReturnValues.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ReturnValues proto.InternalMessageInfo
-
-func (m *ReturnValues) GetSet() uint32 {
-	if m != nil {
-		return m.Set
+func (x *ReturnValues) GetSet() uint32 {
+	if x != nil {
+		return x.Set
 	}
 	return 0
 }
 
-func (m *ReturnValues) GetUnsupported() uint32 {
-	if m != nil {
-		return m.Unsupported
+func (x *ReturnValues) GetUnsupported() uint32 {
+	if x != nil {
+		return x.Unsupported
 	}
 	return 0
 }
 
-func (m *ReturnValues) GetError() uint32 {
-	if m != nil {
-		return m.Error
+func (x *ReturnValues) GetError() uint32 {
+	if x != nil {
+		return x.Error
 	}
 	return 0
 }
 
-func (m *ReturnValues) GetDistance() uint32 {
-	if m != nil {
-		return m.Distance
+func (x *ReturnValues) GetDistance() uint32 {
+	if x != nil {
+		return x.Distance
 	}
 	return 0
 }
 
 type GetDistanceRequest struct {
-	OnuDeviceId          string   `protobuf:"bytes,1,opt,name=onuDeviceId,proto3" json:"onuDeviceId,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	OnuDeviceId   string                 `protobuf:"bytes,1,opt,name=onuDeviceId,proto3" json:"onuDeviceId,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetDistanceRequest) Reset()         { *m = GetDistanceRequest{} }
-func (m *GetDistanceRequest) String() string { return proto.CompactTextString(m) }
-func (*GetDistanceRequest) ProtoMessage()    {}
+func (x *GetDistanceRequest) Reset() {
+	*x = GetDistanceRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetDistanceRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetDistanceRequest) ProtoMessage() {}
+
+func (x *GetDistanceRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetDistanceRequest.ProtoReflect.Descriptor instead.
 func (*GetDistanceRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{4}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{4}
 }
 
-func (m *GetDistanceRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetDistanceRequest.Unmarshal(m, b)
-}
-func (m *GetDistanceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetDistanceRequest.Marshal(b, m, deterministic)
-}
-func (m *GetDistanceRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetDistanceRequest.Merge(m, src)
-}
-func (m *GetDistanceRequest) XXX_Size() int {
-	return xxx_messageInfo_GetDistanceRequest.Size(m)
-}
-func (m *GetDistanceRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetDistanceRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetDistanceRequest proto.InternalMessageInfo
-
-func (m *GetDistanceRequest) GetOnuDeviceId() string {
-	if m != nil {
-		return m.OnuDeviceId
+func (x *GetDistanceRequest) GetOnuDeviceId() string {
+	if x != nil {
+		return x.OnuDeviceId
 	}
 	return ""
 }
 
 type GetDistanceResponse struct {
-	Distance             uint32   `protobuf:"varint,1,opt,name=distance,proto3" json:"distance,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Distance      uint32                 `protobuf:"varint,1,opt,name=distance,proto3" json:"distance,omitempty"` // distance in meters
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetDistanceResponse) Reset()         { *m = GetDistanceResponse{} }
-func (m *GetDistanceResponse) String() string { return proto.CompactTextString(m) }
-func (*GetDistanceResponse) ProtoMessage()    {}
+func (x *GetDistanceResponse) Reset() {
+	*x = GetDistanceResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetDistanceResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetDistanceResponse) ProtoMessage() {}
+
+func (x *GetDistanceResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetDistanceResponse.ProtoReflect.Descriptor instead.
 func (*GetDistanceResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{5}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{5}
 }
 
-func (m *GetDistanceResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetDistanceResponse.Unmarshal(m, b)
-}
-func (m *GetDistanceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetDistanceResponse.Marshal(b, m, deterministic)
-}
-func (m *GetDistanceResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetDistanceResponse.Merge(m, src)
-}
-func (m *GetDistanceResponse) XXX_Size() int {
-	return xxx_messageInfo_GetDistanceResponse.Size(m)
-}
-func (m *GetDistanceResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetDistanceResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetDistanceResponse proto.InternalMessageInfo
-
-func (m *GetDistanceResponse) GetDistance() uint32 {
-	if m != nil {
-		return m.Distance
+func (x *GetDistanceResponse) GetDistance() uint32 {
+	if x != nil {
+		return x.Distance
 	}
 	return 0
 }
 
 type GetOnuUniInfoRequest struct {
-	UniIndex             uint32   `protobuf:"varint,1,opt,name=uniIndex,proto3" json:"uniIndex,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	UniIndex      uint32                 `protobuf:"varint,1,opt,name=uniIndex,proto3" json:"uniIndex,omitempty"` // Index of the uni starting from 0
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOnuUniInfoRequest) Reset()         { *m = GetOnuUniInfoRequest{} }
-func (m *GetOnuUniInfoRequest) String() string { return proto.CompactTextString(m) }
-func (*GetOnuUniInfoRequest) ProtoMessage()    {}
+func (x *GetOnuUniInfoRequest) Reset() {
+	*x = GetOnuUniInfoRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuUniInfoRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuUniInfoRequest) ProtoMessage() {}
+
+func (x *GetOnuUniInfoRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuUniInfoRequest.ProtoReflect.Descriptor instead.
 func (*GetOnuUniInfoRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{6}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{6}
 }
 
-func (m *GetOnuUniInfoRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuUniInfoRequest.Unmarshal(m, b)
-}
-func (m *GetOnuUniInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuUniInfoRequest.Marshal(b, m, deterministic)
-}
-func (m *GetOnuUniInfoRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuUniInfoRequest.Merge(m, src)
-}
-func (m *GetOnuUniInfoRequest) XXX_Size() int {
-	return xxx_messageInfo_GetOnuUniInfoRequest.Size(m)
-}
-func (m *GetOnuUniInfoRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuUniInfoRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuUniInfoRequest proto.InternalMessageInfo
-
-func (m *GetOnuUniInfoRequest) GetUniIndex() uint32 {
-	if m != nil {
-		return m.UniIndex
+func (x *GetOnuUniInfoRequest) GetUniIndex() uint32 {
+	if x != nil {
+		return x.UniIndex
 	}
 	return 0
 }
 
 type GetOnuUniInfoResponse struct {
-	AdmState             GetOnuUniInfoResponse_AdministrativeState `protobuf:"varint,1,opt,name=admState,proto3,enum=extension.GetOnuUniInfoResponse_AdministrativeState" json:"admState,omitempty"`
-	OperState            GetOnuUniInfoResponse_OperationalState    `protobuf:"varint,2,opt,name=operState,proto3,enum=extension.GetOnuUniInfoResponse_OperationalState" json:"operState,omitempty"`
-	ConfigInd            GetOnuUniInfoResponse_ConfigurationInd    `protobuf:"varint,3,opt,name=configInd,proto3,enum=extension.GetOnuUniInfoResponse_ConfigurationInd" json:"configInd,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
-	XXX_unrecognized     []byte                                    `json:"-"`
-	XXX_sizecache        int32                                     `json:"-"`
+	state         protoimpl.MessageState                    `protogen:"open.v1"`
+	AdmState      GetOnuUniInfoResponse_AdministrativeState `protobuf:"varint,1,opt,name=admState,proto3,enum=extension.GetOnuUniInfoResponse_AdministrativeState" json:"admState,omitempty"`
+	OperState     GetOnuUniInfoResponse_OperationalState    `protobuf:"varint,2,opt,name=operState,proto3,enum=extension.GetOnuUniInfoResponse_OperationalState" json:"operState,omitempty"`
+	ConfigInd     GetOnuUniInfoResponse_ConfigurationInd    `protobuf:"varint,3,opt,name=configInd,proto3,enum=extension.GetOnuUniInfoResponse_ConfigurationInd" json:"configInd,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOnuUniInfoResponse) Reset()         { *m = GetOnuUniInfoResponse{} }
-func (m *GetOnuUniInfoResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOnuUniInfoResponse) ProtoMessage()    {}
+func (x *GetOnuUniInfoResponse) Reset() {
+	*x = GetOnuUniInfoResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuUniInfoResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuUniInfoResponse) ProtoMessage() {}
+
+func (x *GetOnuUniInfoResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuUniInfoResponse.ProtoReflect.Descriptor instead.
 func (*GetOnuUniInfoResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{7}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{7}
 }
 
-func (m *GetOnuUniInfoResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuUniInfoResponse.Unmarshal(m, b)
-}
-func (m *GetOnuUniInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuUniInfoResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOnuUniInfoResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuUniInfoResponse.Merge(m, src)
-}
-func (m *GetOnuUniInfoResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOnuUniInfoResponse.Size(m)
-}
-func (m *GetOnuUniInfoResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuUniInfoResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuUniInfoResponse proto.InternalMessageInfo
-
-func (m *GetOnuUniInfoResponse) GetAdmState() GetOnuUniInfoResponse_AdministrativeState {
-	if m != nil {
-		return m.AdmState
+func (x *GetOnuUniInfoResponse) GetAdmState() GetOnuUniInfoResponse_AdministrativeState {
+	if x != nil {
+		return x.AdmState
 	}
 	return GetOnuUniInfoResponse_ADMSTATE_UNDEFINED
 }
 
-func (m *GetOnuUniInfoResponse) GetOperState() GetOnuUniInfoResponse_OperationalState {
-	if m != nil {
-		return m.OperState
+func (x *GetOnuUniInfoResponse) GetOperState() GetOnuUniInfoResponse_OperationalState {
+	if x != nil {
+		return x.OperState
 	}
 	return GetOnuUniInfoResponse_OPERSTATE_UNDEFINED
 }
 
-func (m *GetOnuUniInfoResponse) GetConfigInd() GetOnuUniInfoResponse_ConfigurationInd {
-	if m != nil {
-		return m.ConfigInd
+func (x *GetOnuUniInfoResponse) GetConfigInd() GetOnuUniInfoResponse_ConfigurationInd {
+	if x != nil {
+		return x.ConfigInd
 	}
 	return GetOnuUniInfoResponse_UNKOWN
 }
 
 type GetOltPortCounters struct {
-	PortNo               uint32                      `protobuf:"varint,1,opt,name=portNo,proto3" json:"portNo,omitempty"`
-	PortType             GetOltPortCounters_PortType `protobuf:"varint,2,opt,name=portType,proto3,enum=extension.GetOltPortCounters_PortType" json:"portType,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
-	XXX_unrecognized     []byte                      `json:"-"`
-	XXX_sizecache        int32                       `json:"-"`
+	state         protoimpl.MessageState      `protogen:"open.v1"`
+	PortNo        uint32                      `protobuf:"varint,1,opt,name=portNo,proto3" json:"portNo,omitempty"` // Device-unique port number
+	PortType      GetOltPortCounters_PortType `protobuf:"varint,2,opt,name=portType,proto3,enum=extension.GetOltPortCounters_PortType" json:"portType,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOltPortCounters) Reset()         { *m = GetOltPortCounters{} }
-func (m *GetOltPortCounters) String() string { return proto.CompactTextString(m) }
-func (*GetOltPortCounters) ProtoMessage()    {}
+func (x *GetOltPortCounters) Reset() {
+	*x = GetOltPortCounters{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOltPortCounters) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOltPortCounters) ProtoMessage() {}
+
+func (x *GetOltPortCounters) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOltPortCounters.ProtoReflect.Descriptor instead.
 func (*GetOltPortCounters) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{8}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{8}
 }
 
-func (m *GetOltPortCounters) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOltPortCounters.Unmarshal(m, b)
-}
-func (m *GetOltPortCounters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOltPortCounters.Marshal(b, m, deterministic)
-}
-func (m *GetOltPortCounters) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOltPortCounters.Merge(m, src)
-}
-func (m *GetOltPortCounters) XXX_Size() int {
-	return xxx_messageInfo_GetOltPortCounters.Size(m)
-}
-func (m *GetOltPortCounters) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOltPortCounters.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOltPortCounters proto.InternalMessageInfo
-
-func (m *GetOltPortCounters) GetPortNo() uint32 {
-	if m != nil {
-		return m.PortNo
+func (x *GetOltPortCounters) GetPortNo() uint32 {
+	if x != nil {
+		return x.PortNo
 	}
 	return 0
 }
 
-func (m *GetOltPortCounters) GetPortType() GetOltPortCounters_PortType {
-	if m != nil {
-		return m.PortType
+func (x *GetOltPortCounters) GetPortType() GetOltPortCounters_PortType {
+	if x != nil {
+		return x.PortType
 	}
 	return GetOltPortCounters_Port_UNKNOWN
 }
 
 type GetOltPortCountersResponse struct {
-	TxBytes              uint64   `protobuf:"varint,1,opt,name=txBytes,proto3" json:"txBytes,omitempty"`
-	RxBytes              uint64   `protobuf:"varint,2,opt,name=rxBytes,proto3" json:"rxBytes,omitempty"`
-	TxPackets            uint64   `protobuf:"varint,3,opt,name=txPackets,proto3" json:"txPackets,omitempty"`
-	RxPackets            uint64   `protobuf:"varint,4,opt,name=rxPackets,proto3" json:"rxPackets,omitempty"`
-	TxErrorPackets       uint64   `protobuf:"varint,5,opt,name=txErrorPackets,proto3" json:"txErrorPackets,omitempty"`
-	RxErrorPackets       uint64   `protobuf:"varint,6,opt,name=rxErrorPackets,proto3" json:"rxErrorPackets,omitempty"`
-	TxBcastPackets       uint64   `protobuf:"varint,7,opt,name=txBcastPackets,proto3" json:"txBcastPackets,omitempty"`
-	RxBcastPackets       uint64   `protobuf:"varint,8,opt,name=rxBcastPackets,proto3" json:"rxBcastPackets,omitempty"`
-	TxUcastPackets       uint64   `protobuf:"varint,9,opt,name=txUcastPackets,proto3" json:"txUcastPackets,omitempty"`
-	RxUcastPackets       uint64   `protobuf:"varint,10,opt,name=rxUcastPackets,proto3" json:"rxUcastPackets,omitempty"`
-	TxMcastPackets       uint64   `protobuf:"varint,11,opt,name=txMcastPackets,proto3" json:"txMcastPackets,omitempty"`
-	RxMcastPackets       uint64   `protobuf:"varint,12,opt,name=rxMcastPackets,proto3" json:"rxMcastPackets,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	TxBytes        uint64                 `protobuf:"varint,1,opt,name=txBytes,proto3" json:"txBytes,omitempty"`
+	RxBytes        uint64                 `protobuf:"varint,2,opt,name=rxBytes,proto3" json:"rxBytes,omitempty"`
+	TxPackets      uint64                 `protobuf:"varint,3,opt,name=txPackets,proto3" json:"txPackets,omitempty"`
+	RxPackets      uint64                 `protobuf:"varint,4,opt,name=rxPackets,proto3" json:"rxPackets,omitempty"`
+	TxErrorPackets uint64                 `protobuf:"varint,5,opt,name=txErrorPackets,proto3" json:"txErrorPackets,omitempty"`
+	RxErrorPackets uint64                 `protobuf:"varint,6,opt,name=rxErrorPackets,proto3" json:"rxErrorPackets,omitempty"`
+	TxBcastPackets uint64                 `protobuf:"varint,7,opt,name=txBcastPackets,proto3" json:"txBcastPackets,omitempty"`
+	RxBcastPackets uint64                 `protobuf:"varint,8,opt,name=rxBcastPackets,proto3" json:"rxBcastPackets,omitempty"`
+	TxUcastPackets uint64                 `protobuf:"varint,9,opt,name=txUcastPackets,proto3" json:"txUcastPackets,omitempty"`
+	RxUcastPackets uint64                 `protobuf:"varint,10,opt,name=rxUcastPackets,proto3" json:"rxUcastPackets,omitempty"`
+	TxMcastPackets uint64                 `protobuf:"varint,11,opt,name=txMcastPackets,proto3" json:"txMcastPackets,omitempty"`
+	RxMcastPackets uint64                 `protobuf:"varint,12,opt,name=rxMcastPackets,proto3" json:"rxMcastPackets,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
-func (m *GetOltPortCountersResponse) Reset()         { *m = GetOltPortCountersResponse{} }
-func (m *GetOltPortCountersResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOltPortCountersResponse) ProtoMessage()    {}
+func (x *GetOltPortCountersResponse) Reset() {
+	*x = GetOltPortCountersResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOltPortCountersResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOltPortCountersResponse) ProtoMessage() {}
+
+func (x *GetOltPortCountersResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOltPortCountersResponse.ProtoReflect.Descriptor instead.
 func (*GetOltPortCountersResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{9}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{9}
 }
 
-func (m *GetOltPortCountersResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOltPortCountersResponse.Unmarshal(m, b)
-}
-func (m *GetOltPortCountersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOltPortCountersResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOltPortCountersResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOltPortCountersResponse.Merge(m, src)
-}
-func (m *GetOltPortCountersResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOltPortCountersResponse.Size(m)
-}
-func (m *GetOltPortCountersResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOltPortCountersResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOltPortCountersResponse proto.InternalMessageInfo
-
-func (m *GetOltPortCountersResponse) GetTxBytes() uint64 {
-	if m != nil {
-		return m.TxBytes
+func (x *GetOltPortCountersResponse) GetTxBytes() uint64 {
+	if x != nil {
+		return x.TxBytes
 	}
 	return 0
 }
 
-func (m *GetOltPortCountersResponse) GetRxBytes() uint64 {
-	if m != nil {
-		return m.RxBytes
+func (x *GetOltPortCountersResponse) GetRxBytes() uint64 {
+	if x != nil {
+		return x.RxBytes
 	}
 	return 0
 }
 
-func (m *GetOltPortCountersResponse) GetTxPackets() uint64 {
-	if m != nil {
-		return m.TxPackets
+func (x *GetOltPortCountersResponse) GetTxPackets() uint64 {
+	if x != nil {
+		return x.TxPackets
 	}
 	return 0
 }
 
-func (m *GetOltPortCountersResponse) GetRxPackets() uint64 {
-	if m != nil {
-		return m.RxPackets
+func (x *GetOltPortCountersResponse) GetRxPackets() uint64 {
+	if x != nil {
+		return x.RxPackets
 	}
 	return 0
 }
 
-func (m *GetOltPortCountersResponse) GetTxErrorPackets() uint64 {
-	if m != nil {
-		return m.TxErrorPackets
+func (x *GetOltPortCountersResponse) GetTxErrorPackets() uint64 {
+	if x != nil {
+		return x.TxErrorPackets
 	}
 	return 0
 }
 
-func (m *GetOltPortCountersResponse) GetRxErrorPackets() uint64 {
-	if m != nil {
-		return m.RxErrorPackets
+func (x *GetOltPortCountersResponse) GetRxErrorPackets() uint64 {
+	if x != nil {
+		return x.RxErrorPackets
 	}
 	return 0
 }
 
-func (m *GetOltPortCountersResponse) GetTxBcastPackets() uint64 {
-	if m != nil {
-		return m.TxBcastPackets
+func (x *GetOltPortCountersResponse) GetTxBcastPackets() uint64 {
+	if x != nil {
+		return x.TxBcastPackets
 	}
 	return 0
 }
 
-func (m *GetOltPortCountersResponse) GetRxBcastPackets() uint64 {
-	if m != nil {
-		return m.RxBcastPackets
+func (x *GetOltPortCountersResponse) GetRxBcastPackets() uint64 {
+	if x != nil {
+		return x.RxBcastPackets
 	}
 	return 0
 }
 
-func (m *GetOltPortCountersResponse) GetTxUcastPackets() uint64 {
-	if m != nil {
-		return m.TxUcastPackets
+func (x *GetOltPortCountersResponse) GetTxUcastPackets() uint64 {
+	if x != nil {
+		return x.TxUcastPackets
 	}
 	return 0
 }
 
-func (m *GetOltPortCountersResponse) GetRxUcastPackets() uint64 {
-	if m != nil {
-		return m.RxUcastPackets
+func (x *GetOltPortCountersResponse) GetRxUcastPackets() uint64 {
+	if x != nil {
+		return x.RxUcastPackets
 	}
 	return 0
 }
 
-func (m *GetOltPortCountersResponse) GetTxMcastPackets() uint64 {
-	if m != nil {
-		return m.TxMcastPackets
+func (x *GetOltPortCountersResponse) GetTxMcastPackets() uint64 {
+	if x != nil {
+		return x.TxMcastPackets
 	}
 	return 0
 }
 
-func (m *GetOltPortCountersResponse) GetRxMcastPackets() uint64 {
-	if m != nil {
-		return m.RxMcastPackets
+func (x *GetOltPortCountersResponse) GetRxMcastPackets() uint64 {
+	if x != nil {
+		return x.RxMcastPackets
 	}
 	return 0
 }
 
 type GetOnuPonOpticalInfo struct {
-	Empty                *empty.Empty `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
-	XXX_unrecognized     []byte       `json:"-"`
-	XXX_sizecache        int32        `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Empty         *emptypb.Empty         `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOnuPonOpticalInfo) Reset()         { *m = GetOnuPonOpticalInfo{} }
-func (m *GetOnuPonOpticalInfo) String() string { return proto.CompactTextString(m) }
-func (*GetOnuPonOpticalInfo) ProtoMessage()    {}
+func (x *GetOnuPonOpticalInfo) Reset() {
+	*x = GetOnuPonOpticalInfo{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuPonOpticalInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuPonOpticalInfo) ProtoMessage() {}
+
+func (x *GetOnuPonOpticalInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuPonOpticalInfo.ProtoReflect.Descriptor instead.
 func (*GetOnuPonOpticalInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{10}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{10}
 }
 
-func (m *GetOnuPonOpticalInfo) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuPonOpticalInfo.Unmarshal(m, b)
-}
-func (m *GetOnuPonOpticalInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuPonOpticalInfo.Marshal(b, m, deterministic)
-}
-func (m *GetOnuPonOpticalInfo) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuPonOpticalInfo.Merge(m, src)
-}
-func (m *GetOnuPonOpticalInfo) XXX_Size() int {
-	return xxx_messageInfo_GetOnuPonOpticalInfo.Size(m)
-}
-func (m *GetOnuPonOpticalInfo) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuPonOpticalInfo.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuPonOpticalInfo proto.InternalMessageInfo
-
-func (m *GetOnuPonOpticalInfo) GetEmpty() *empty.Empty {
-	if m != nil {
-		return m.Empty
+func (x *GetOnuPonOpticalInfo) GetEmpty() *emptypb.Empty {
+	if x != nil {
+		return x.Empty
 	}
 	return nil
 }
@@ -998,950 +1312,1057 @@
 // These values correspond to the Optical Line Supervision Test results
 // described in section A3.39.5 of ITU-T G.988 (11/2017) specification.
 type GetOnuPonOpticalInfoResponse struct {
-	PowerFeedVoltage       float32  `protobuf:"fixed32,1,opt,name=powerFeedVoltage,proto3" json:"powerFeedVoltage,omitempty"`
-	ReceivedOpticalPower   float32  `protobuf:"fixed32,2,opt,name=receivedOpticalPower,proto3" json:"receivedOpticalPower,omitempty"`
-	MeanOpticalLaunchPower float32  `protobuf:"fixed32,3,opt,name=meanOpticalLaunchPower,proto3" json:"meanOpticalLaunchPower,omitempty"`
-	LaserBiasCurrent       float32  `protobuf:"fixed32,4,opt,name=laserBiasCurrent,proto3" json:"laserBiasCurrent,omitempty"`
-	Temperature            float32  `protobuf:"fixed32,5,opt,name=temperature,proto3" json:"temperature,omitempty"`
-	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
-	XXX_unrecognized       []byte   `json:"-"`
-	XXX_sizecache          int32    `json:"-"`
+	state                  protoimpl.MessageState `protogen:"open.v1"`
+	PowerFeedVoltage       float32                `protobuf:"fixed32,1,opt,name=powerFeedVoltage,proto3" json:"powerFeedVoltage,omitempty"`             // unit of value is voltage
+	ReceivedOpticalPower   float32                `protobuf:"fixed32,2,opt,name=receivedOpticalPower,proto3" json:"receivedOpticalPower,omitempty"`     // unit of value is dBm
+	MeanOpticalLaunchPower float32                `protobuf:"fixed32,3,opt,name=meanOpticalLaunchPower,proto3" json:"meanOpticalLaunchPower,omitempty"` // unit of value is dBm
+	LaserBiasCurrent       float32                `protobuf:"fixed32,4,opt,name=laserBiasCurrent,proto3" json:"laserBiasCurrent,omitempty"`             // unit of value is milli-amphere (mA)
+	Temperature            float32                `protobuf:"fixed32,5,opt,name=temperature,proto3" json:"temperature,omitempty"`                       // unit of value is degree celsius
+	unknownFields          protoimpl.UnknownFields
+	sizeCache              protoimpl.SizeCache
 }
 
-func (m *GetOnuPonOpticalInfoResponse) Reset()         { *m = GetOnuPonOpticalInfoResponse{} }
-func (m *GetOnuPonOpticalInfoResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOnuPonOpticalInfoResponse) ProtoMessage()    {}
+func (x *GetOnuPonOpticalInfoResponse) Reset() {
+	*x = GetOnuPonOpticalInfoResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuPonOpticalInfoResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuPonOpticalInfoResponse) ProtoMessage() {}
+
+func (x *GetOnuPonOpticalInfoResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuPonOpticalInfoResponse.ProtoReflect.Descriptor instead.
 func (*GetOnuPonOpticalInfoResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{11}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{11}
 }
 
-func (m *GetOnuPonOpticalInfoResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuPonOpticalInfoResponse.Unmarshal(m, b)
-}
-func (m *GetOnuPonOpticalInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuPonOpticalInfoResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOnuPonOpticalInfoResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuPonOpticalInfoResponse.Merge(m, src)
-}
-func (m *GetOnuPonOpticalInfoResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOnuPonOpticalInfoResponse.Size(m)
-}
-func (m *GetOnuPonOpticalInfoResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuPonOpticalInfoResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuPonOpticalInfoResponse proto.InternalMessageInfo
-
-func (m *GetOnuPonOpticalInfoResponse) GetPowerFeedVoltage() float32 {
-	if m != nil {
-		return m.PowerFeedVoltage
+func (x *GetOnuPonOpticalInfoResponse) GetPowerFeedVoltage() float32 {
+	if x != nil {
+		return x.PowerFeedVoltage
 	}
 	return 0
 }
 
-func (m *GetOnuPonOpticalInfoResponse) GetReceivedOpticalPower() float32 {
-	if m != nil {
-		return m.ReceivedOpticalPower
+func (x *GetOnuPonOpticalInfoResponse) GetReceivedOpticalPower() float32 {
+	if x != nil {
+		return x.ReceivedOpticalPower
 	}
 	return 0
 }
 
-func (m *GetOnuPonOpticalInfoResponse) GetMeanOpticalLaunchPower() float32 {
-	if m != nil {
-		return m.MeanOpticalLaunchPower
+func (x *GetOnuPonOpticalInfoResponse) GetMeanOpticalLaunchPower() float32 {
+	if x != nil {
+		return x.MeanOpticalLaunchPower
 	}
 	return 0
 }
 
-func (m *GetOnuPonOpticalInfoResponse) GetLaserBiasCurrent() float32 {
-	if m != nil {
-		return m.LaserBiasCurrent
+func (x *GetOnuPonOpticalInfoResponse) GetLaserBiasCurrent() float32 {
+	if x != nil {
+		return x.LaserBiasCurrent
 	}
 	return 0
 }
 
-func (m *GetOnuPonOpticalInfoResponse) GetTemperature() float32 {
-	if m != nil {
-		return m.Temperature
+func (x *GetOnuPonOpticalInfoResponse) GetTemperature() float32 {
+	if x != nil {
+		return x.Temperature
 	}
 	return 0
 }
 
 type GetOnuEthernetBridgePortHistory struct {
-	Direction            GetOnuEthernetBridgePortHistory_Direction `protobuf:"varint,1,opt,name=direction,proto3,enum=extension.GetOnuEthernetBridgePortHistory_Direction" json:"direction,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
-	XXX_unrecognized     []byte                                    `json:"-"`
-	XXX_sizecache        int32                                     `json:"-"`
+	state         protoimpl.MessageState                    `protogen:"open.v1"`
+	Direction     GetOnuEthernetBridgePortHistory_Direction `protobuf:"varint,1,opt,name=direction,proto3,enum=extension.GetOnuEthernetBridgePortHistory_Direction" json:"direction,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOnuEthernetBridgePortHistory) Reset()         { *m = GetOnuEthernetBridgePortHistory{} }
-func (m *GetOnuEthernetBridgePortHistory) String() string { return proto.CompactTextString(m) }
-func (*GetOnuEthernetBridgePortHistory) ProtoMessage()    {}
+func (x *GetOnuEthernetBridgePortHistory) Reset() {
+	*x = GetOnuEthernetBridgePortHistory{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuEthernetBridgePortHistory) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuEthernetBridgePortHistory) ProtoMessage() {}
+
+func (x *GetOnuEthernetBridgePortHistory) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuEthernetBridgePortHistory.ProtoReflect.Descriptor instead.
 func (*GetOnuEthernetBridgePortHistory) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{12}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{12}
 }
 
-func (m *GetOnuEthernetBridgePortHistory) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuEthernetBridgePortHistory.Unmarshal(m, b)
-}
-func (m *GetOnuEthernetBridgePortHistory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuEthernetBridgePortHistory.Marshal(b, m, deterministic)
-}
-func (m *GetOnuEthernetBridgePortHistory) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuEthernetBridgePortHistory.Merge(m, src)
-}
-func (m *GetOnuEthernetBridgePortHistory) XXX_Size() int {
-	return xxx_messageInfo_GetOnuEthernetBridgePortHistory.Size(m)
-}
-func (m *GetOnuEthernetBridgePortHistory) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuEthernetBridgePortHistory.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuEthernetBridgePortHistory proto.InternalMessageInfo
-
-func (m *GetOnuEthernetBridgePortHistory) GetDirection() GetOnuEthernetBridgePortHistory_Direction {
-	if m != nil {
-		return m.Direction
+func (x *GetOnuEthernetBridgePortHistory) GetDirection() GetOnuEthernetBridgePortHistory_Direction {
+	if x != nil {
+		return x.Direction
 	}
 	return GetOnuEthernetBridgePortHistory_UNDEFINED
 }
 
 type GetOnuEthernetBridgePortHistoryResponse struct {
-	DropEvents              uint32   `protobuf:"varint,1,opt,name=dropEvents,proto3" json:"dropEvents,omitempty"`
-	Octets                  uint32   `protobuf:"varint,2,opt,name=octets,proto3" json:"octets,omitempty"`
-	Packets                 uint32   `protobuf:"varint,3,opt,name=packets,proto3" json:"packets,omitempty"`
-	BroadcastPackets        uint32   `protobuf:"varint,4,opt,name=broadcastPackets,proto3" json:"broadcastPackets,omitempty"`
-	MulticastPackets        uint32   `protobuf:"varint,5,opt,name=multicastPackets,proto3" json:"multicastPackets,omitempty"`
-	CrcErroredPackets       uint32   `protobuf:"varint,6,opt,name=crcErroredPackets,proto3" json:"crcErroredPackets,omitempty"`
-	UndersizePackets        uint32   `protobuf:"varint,7,opt,name=undersizePackets,proto3" json:"undersizePackets,omitempty"`
-	OversizePackets         uint32   `protobuf:"varint,8,opt,name=oversizePackets,proto3" json:"oversizePackets,omitempty"`
-	Packets64Octets         uint32   `protobuf:"varint,9,opt,name=packets64octets,proto3" json:"packets64octets,omitempty"`
-	Packets65To127Octets    uint32   `protobuf:"varint,10,opt,name=packets65To127octets,proto3" json:"packets65To127octets,omitempty"`
-	Packets128To255Octets   uint32   `protobuf:"varint,11,opt,name=packets128To255Octets,proto3" json:"packets128To255Octets,omitempty"`
-	Packets256To511Octets   uint32   `protobuf:"varint,12,opt,name=packets256To511octets,proto3" json:"packets256To511octets,omitempty"`
-	Packets512To1023Octets  uint32   `protobuf:"varint,13,opt,name=packets512To1023octets,proto3" json:"packets512To1023octets,omitempty"`
-	Packets1024To1518Octets uint32   `protobuf:"varint,14,opt,name=packets1024To1518octets,proto3" json:"packets1024To1518octets,omitempty"`
-	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
-	XXX_unrecognized        []byte   `json:"-"`
-	XXX_sizecache           int32    `json:"-"`
+	state                   protoimpl.MessageState `protogen:"open.v1"`
+	DropEvents              uint32                 `protobuf:"varint,1,opt,name=dropEvents,proto3" json:"dropEvents,omitempty"`
+	Octets                  uint32                 `protobuf:"varint,2,opt,name=octets,proto3" json:"octets,omitempty"`
+	Packets                 uint32                 `protobuf:"varint,3,opt,name=packets,proto3" json:"packets,omitempty"`
+	BroadcastPackets        uint32                 `protobuf:"varint,4,opt,name=broadcastPackets,proto3" json:"broadcastPackets,omitempty"`
+	MulticastPackets        uint32                 `protobuf:"varint,5,opt,name=multicastPackets,proto3" json:"multicastPackets,omitempty"`
+	CrcErroredPackets       uint32                 `protobuf:"varint,6,opt,name=crcErroredPackets,proto3" json:"crcErroredPackets,omitempty"`
+	UndersizePackets        uint32                 `protobuf:"varint,7,opt,name=undersizePackets,proto3" json:"undersizePackets,omitempty"`
+	OversizePackets         uint32                 `protobuf:"varint,8,opt,name=oversizePackets,proto3" json:"oversizePackets,omitempty"`
+	Packets64Octets         uint32                 `protobuf:"varint,9,opt,name=packets64octets,proto3" json:"packets64octets,omitempty"`
+	Packets65To127Octets    uint32                 `protobuf:"varint,10,opt,name=packets65To127octets,proto3" json:"packets65To127octets,omitempty"`
+	Packets128To255Octets   uint32                 `protobuf:"varint,11,opt,name=packets128To255Octets,proto3" json:"packets128To255Octets,omitempty"`
+	Packets256To511Octets   uint32                 `protobuf:"varint,12,opt,name=packets256To511octets,proto3" json:"packets256To511octets,omitempty"`
+	Packets512To1023Octets  uint32                 `protobuf:"varint,13,opt,name=packets512To1023octets,proto3" json:"packets512To1023octets,omitempty"`
+	Packets1024To1518Octets uint32                 `protobuf:"varint,14,opt,name=packets1024To1518octets,proto3" json:"packets1024To1518octets,omitempty"`
+	unknownFields           protoimpl.UnknownFields
+	sizeCache               protoimpl.SizeCache
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) Reset() {
-	*m = GetOnuEthernetBridgePortHistoryResponse{}
+func (x *GetOnuEthernetBridgePortHistoryResponse) Reset() {
+	*x = GetOnuEthernetBridgePortHistoryResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
-func (m *GetOnuEthernetBridgePortHistoryResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOnuEthernetBridgePortHistoryResponse) ProtoMessage()    {}
+
+func (x *GetOnuEthernetBridgePortHistoryResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuEthernetBridgePortHistoryResponse) ProtoMessage() {}
+
+func (x *GetOnuEthernetBridgePortHistoryResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuEthernetBridgePortHistoryResponse.ProtoReflect.Descriptor instead.
 func (*GetOnuEthernetBridgePortHistoryResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{13}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{13}
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuEthernetBridgePortHistoryResponse.Unmarshal(m, b)
-}
-func (m *GetOnuEthernetBridgePortHistoryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuEthernetBridgePortHistoryResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOnuEthernetBridgePortHistoryResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuEthernetBridgePortHistoryResponse.Merge(m, src)
-}
-func (m *GetOnuEthernetBridgePortHistoryResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOnuEthernetBridgePortHistoryResponse.Size(m)
-}
-func (m *GetOnuEthernetBridgePortHistoryResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuEthernetBridgePortHistoryResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuEthernetBridgePortHistoryResponse proto.InternalMessageInfo
-
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetDropEvents() uint32 {
-	if m != nil {
-		return m.DropEvents
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetDropEvents() uint32 {
+	if x != nil {
+		return x.DropEvents
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetOctets() uint32 {
-	if m != nil {
-		return m.Octets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetOctets() uint32 {
+	if x != nil {
+		return x.Octets
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets() uint32 {
-	if m != nil {
-		return m.Packets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetPackets() uint32 {
+	if x != nil {
+		return x.Packets
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetBroadcastPackets() uint32 {
-	if m != nil {
-		return m.BroadcastPackets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetBroadcastPackets() uint32 {
+	if x != nil {
+		return x.BroadcastPackets
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetMulticastPackets() uint32 {
-	if m != nil {
-		return m.MulticastPackets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetMulticastPackets() uint32 {
+	if x != nil {
+		return x.MulticastPackets
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetCrcErroredPackets() uint32 {
-	if m != nil {
-		return m.CrcErroredPackets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetCrcErroredPackets() uint32 {
+	if x != nil {
+		return x.CrcErroredPackets
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetUndersizePackets() uint32 {
-	if m != nil {
-		return m.UndersizePackets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetUndersizePackets() uint32 {
+	if x != nil {
+		return x.UndersizePackets
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetOversizePackets() uint32 {
-	if m != nil {
-		return m.OversizePackets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetOversizePackets() uint32 {
+	if x != nil {
+		return x.OversizePackets
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets64Octets() uint32 {
-	if m != nil {
-		return m.Packets64Octets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetPackets64Octets() uint32 {
+	if x != nil {
+		return x.Packets64Octets
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets65To127Octets() uint32 {
-	if m != nil {
-		return m.Packets65To127Octets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetPackets65To127Octets() uint32 {
+	if x != nil {
+		return x.Packets65To127Octets
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets128To255Octets() uint32 {
-	if m != nil {
-		return m.Packets128To255Octets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetPackets128To255Octets() uint32 {
+	if x != nil {
+		return x.Packets128To255Octets
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets256To511Octets() uint32 {
-	if m != nil {
-		return m.Packets256To511Octets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetPackets256To511Octets() uint32 {
+	if x != nil {
+		return x.Packets256To511Octets
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets512To1023Octets() uint32 {
-	if m != nil {
-		return m.Packets512To1023Octets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetPackets512To1023Octets() uint32 {
+	if x != nil {
+		return x.Packets512To1023Octets
 	}
 	return 0
 }
 
-func (m *GetOnuEthernetBridgePortHistoryResponse) GetPackets1024To1518Octets() uint32 {
-	if m != nil {
-		return m.Packets1024To1518Octets
+func (x *GetOnuEthernetBridgePortHistoryResponse) GetPackets1024To1518Octets() uint32 {
+	if x != nil {
+		return x.Packets1024To1518Octets
 	}
 	return 0
 }
 
 // GetOnuAllocGemHistoryRequest collects GEM and AllocId stats from ONU
 type GetOnuAllocGemHistoryRequest struct {
-	Empty                *empty.Empty `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
-	XXX_unrecognized     []byte       `json:"-"`
-	XXX_sizecache        int32        `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Empty         *emptypb.Empty         `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOnuAllocGemHistoryRequest) Reset()         { *m = GetOnuAllocGemHistoryRequest{} }
-func (m *GetOnuAllocGemHistoryRequest) String() string { return proto.CompactTextString(m) }
-func (*GetOnuAllocGemHistoryRequest) ProtoMessage()    {}
+func (x *GetOnuAllocGemHistoryRequest) Reset() {
+	*x = GetOnuAllocGemHistoryRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[14]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuAllocGemHistoryRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuAllocGemHistoryRequest) ProtoMessage() {}
+
+func (x *GetOnuAllocGemHistoryRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuAllocGemHistoryRequest.ProtoReflect.Descriptor instead.
 func (*GetOnuAllocGemHistoryRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{14}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{14}
 }
 
-func (m *GetOnuAllocGemHistoryRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuAllocGemHistoryRequest.Unmarshal(m, b)
-}
-func (m *GetOnuAllocGemHistoryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuAllocGemHistoryRequest.Marshal(b, m, deterministic)
-}
-func (m *GetOnuAllocGemHistoryRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuAllocGemHistoryRequest.Merge(m, src)
-}
-func (m *GetOnuAllocGemHistoryRequest) XXX_Size() int {
-	return xxx_messageInfo_GetOnuAllocGemHistoryRequest.Size(m)
-}
-func (m *GetOnuAllocGemHistoryRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuAllocGemHistoryRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuAllocGemHistoryRequest proto.InternalMessageInfo
-
-func (m *GetOnuAllocGemHistoryRequest) GetEmpty() *empty.Empty {
-	if m != nil {
-		return m.Empty
+func (x *GetOnuAllocGemHistoryRequest) GetEmpty() *emptypb.Empty {
+	if x != nil {
+		return x.Empty
 	}
 	return nil
 }
 
 type OnuGemPortHistoryData struct {
-	GemId                uint32 `protobuf:"varint,1,opt,name=gemId,proto3" json:"gemId,omitempty"`
-	TransmittedGEMFrames uint32 `protobuf:"varint,2,opt,name=transmittedGEMFrames,proto3" json:"transmittedGEMFrames,omitempty"`
-	ReceivedGEMFrames    uint32 `protobuf:"varint,3,opt,name=receivedGEMFrames,proto3" json:"receivedGEMFrames,omitempty"`
+	state                protoimpl.MessageState `protogen:"open.v1"`
+	GemId                uint32                 `protobuf:"varint,1,opt,name=gemId,proto3" json:"gemId,omitempty"`
+	TransmittedGEMFrames uint32                 `protobuf:"varint,2,opt,name=transmittedGEMFrames,proto3" json:"transmittedGEMFrames,omitempty"`
+	ReceivedGEMFrames    uint32                 `protobuf:"varint,3,opt,name=receivedGEMFrames,proto3" json:"receivedGEMFrames,omitempty"`
 	// Deprecated: uint32 cannot handle large byte counters and will overflow after ~4GB.
 	// Use received_payload_bytes_64 instead for full 64-bit precision.
-	ReceivedPayloadBytes uint32 `protobuf:"varint,4,opt,name=receivedPayloadBytes,proto3" json:"receivedPayloadBytes,omitempty"` // Deprecated: Do not use.
+	//
+	// Deprecated: Marked as deprecated in voltha_protos/extensions.proto.
+	ReceivedPayloadBytes uint32 `protobuf:"varint,4,opt,name=receivedPayloadBytes,proto3" json:"receivedPayloadBytes,omitempty"`
 	// Deprecated: uint32 cannot handle large byte counters and will overflow after ~4GB.
 	// Use transmitted_payload_bytes_64 instead for full 64-bit precision.
-	TransmittedPayloadBytes    uint32   `protobuf:"varint,5,opt,name=transmittedPayloadBytes,proto3" json:"transmittedPayloadBytes,omitempty"` // Deprecated: Do not use.
-	EncryptionKeyErrors        uint32   `protobuf:"varint,6,opt,name=encryptionKeyErrors,proto3" json:"encryptionKeyErrors,omitempty"`
-	ReceivedPayloadBytes_64    uint64   `protobuf:"fixed64,7,opt,name=received_payload_bytes_64,json=receivedPayloadBytes64,proto3" json:"received_payload_bytes_64,omitempty"`
-	TransmittedPayloadBytes_64 uint64   `protobuf:"fixed64,8,opt,name=transmitted_payload_bytes_64,json=transmittedPayloadBytes64,proto3" json:"transmitted_payload_bytes_64,omitempty"`
-	XXX_NoUnkeyedLiteral       struct{} `json:"-"`
-	XXX_unrecognized           []byte   `json:"-"`
-	XXX_sizecache              int32    `json:"-"`
+	//
+	// Deprecated: Marked as deprecated in voltha_protos/extensions.proto.
+	TransmittedPayloadBytes    uint32 `protobuf:"varint,5,opt,name=transmittedPayloadBytes,proto3" json:"transmittedPayloadBytes,omitempty"`
+	EncryptionKeyErrors        uint32 `protobuf:"varint,6,opt,name=encryptionKeyErrors,proto3" json:"encryptionKeyErrors,omitempty"`
+	ReceivedPayloadBytes_64    uint64 `protobuf:"fixed64,7,opt,name=received_payload_bytes_64,json=receivedPayloadBytes64,proto3" json:"received_payload_bytes_64,omitempty"`
+	TransmittedPayloadBytes_64 uint64 `protobuf:"fixed64,8,opt,name=transmitted_payload_bytes_64,json=transmittedPayloadBytes64,proto3" json:"transmitted_payload_bytes_64,omitempty"`
+	unknownFields              protoimpl.UnknownFields
+	sizeCache                  protoimpl.SizeCache
 }
 
-func (m *OnuGemPortHistoryData) Reset()         { *m = OnuGemPortHistoryData{} }
-func (m *OnuGemPortHistoryData) String() string { return proto.CompactTextString(m) }
-func (*OnuGemPortHistoryData) ProtoMessage()    {}
+func (x *OnuGemPortHistoryData) Reset() {
+	*x = OnuGemPortHistoryData{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[15]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuGemPortHistoryData) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuGemPortHistoryData) ProtoMessage() {}
+
+func (x *OnuGemPortHistoryData) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 OnuGemPortHistoryData.ProtoReflect.Descriptor instead.
 func (*OnuGemPortHistoryData) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{15}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{15}
 }
 
-func (m *OnuGemPortHistoryData) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuGemPortHistoryData.Unmarshal(m, b)
-}
-func (m *OnuGemPortHistoryData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuGemPortHistoryData.Marshal(b, m, deterministic)
-}
-func (m *OnuGemPortHistoryData) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuGemPortHistoryData.Merge(m, src)
-}
-func (m *OnuGemPortHistoryData) XXX_Size() int {
-	return xxx_messageInfo_OnuGemPortHistoryData.Size(m)
-}
-func (m *OnuGemPortHistoryData) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuGemPortHistoryData.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuGemPortHistoryData proto.InternalMessageInfo
-
-func (m *OnuGemPortHistoryData) GetGemId() uint32 {
-	if m != nil {
-		return m.GemId
+func (x *OnuGemPortHistoryData) GetGemId() uint32 {
+	if x != nil {
+		return x.GemId
 	}
 	return 0
 }
 
-func (m *OnuGemPortHistoryData) GetTransmittedGEMFrames() uint32 {
-	if m != nil {
-		return m.TransmittedGEMFrames
+func (x *OnuGemPortHistoryData) GetTransmittedGEMFrames() uint32 {
+	if x != nil {
+		return x.TransmittedGEMFrames
 	}
 	return 0
 }
 
-func (m *OnuGemPortHistoryData) GetReceivedGEMFrames() uint32 {
-	if m != nil {
-		return m.ReceivedGEMFrames
+func (x *OnuGemPortHistoryData) GetReceivedGEMFrames() uint32 {
+	if x != nil {
+		return x.ReceivedGEMFrames
 	}
 	return 0
 }
 
-// Deprecated: Do not use.
-func (m *OnuGemPortHistoryData) GetReceivedPayloadBytes() uint32 {
-	if m != nil {
-		return m.ReceivedPayloadBytes
+// Deprecated: Marked as deprecated in voltha_protos/extensions.proto.
+func (x *OnuGemPortHistoryData) GetReceivedPayloadBytes() uint32 {
+	if x != nil {
+		return x.ReceivedPayloadBytes
 	}
 	return 0
 }
 
-// Deprecated: Do not use.
-func (m *OnuGemPortHistoryData) GetTransmittedPayloadBytes() uint32 {
-	if m != nil {
-		return m.TransmittedPayloadBytes
+// Deprecated: Marked as deprecated in voltha_protos/extensions.proto.
+func (x *OnuGemPortHistoryData) GetTransmittedPayloadBytes() uint32 {
+	if x != nil {
+		return x.TransmittedPayloadBytes
 	}
 	return 0
 }
 
-func (m *OnuGemPortHistoryData) GetEncryptionKeyErrors() uint32 {
-	if m != nil {
-		return m.EncryptionKeyErrors
+func (x *OnuGemPortHistoryData) GetEncryptionKeyErrors() uint32 {
+	if x != nil {
+		return x.EncryptionKeyErrors
 	}
 	return 0
 }
 
-func (m *OnuGemPortHistoryData) GetReceivedPayloadBytes_64() uint64 {
-	if m != nil {
-		return m.ReceivedPayloadBytes_64
+func (x *OnuGemPortHistoryData) GetReceivedPayloadBytes_64() uint64 {
+	if x != nil {
+		return x.ReceivedPayloadBytes_64
 	}
 	return 0
 }
 
-func (m *OnuGemPortHistoryData) GetTransmittedPayloadBytes_64() uint64 {
-	if m != nil {
-		return m.TransmittedPayloadBytes_64
+func (x *OnuGemPortHistoryData) GetTransmittedPayloadBytes_64() uint64 {
+	if x != nil {
+		return x.TransmittedPayloadBytes_64
 	}
 	return 0
 }
 
 type OnuAllocHistoryData struct {
-	AllocId              uint32   `protobuf:"varint,1,opt,name=allocId,proto3" json:"allocId,omitempty"`
-	RxBytes              uint32   `protobuf:"varint,2,opt,name=rxBytes,proto3" json:"rxBytes,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	AllocId       uint32                 `protobuf:"varint,1,opt,name=allocId,proto3" json:"allocId,omitempty"`
+	RxBytes       uint32                 `protobuf:"varint,2,opt,name=rxBytes,proto3" json:"rxBytes,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *OnuAllocHistoryData) Reset()         { *m = OnuAllocHistoryData{} }
-func (m *OnuAllocHistoryData) String() string { return proto.CompactTextString(m) }
-func (*OnuAllocHistoryData) ProtoMessage()    {}
+func (x *OnuAllocHistoryData) Reset() {
+	*x = OnuAllocHistoryData{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[16]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuAllocHistoryData) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuAllocHistoryData) ProtoMessage() {}
+
+func (x *OnuAllocHistoryData) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 OnuAllocHistoryData.ProtoReflect.Descriptor instead.
 func (*OnuAllocHistoryData) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{16}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{16}
 }
 
-func (m *OnuAllocHistoryData) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuAllocHistoryData.Unmarshal(m, b)
-}
-func (m *OnuAllocHistoryData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuAllocHistoryData.Marshal(b, m, deterministic)
-}
-func (m *OnuAllocHistoryData) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuAllocHistoryData.Merge(m, src)
-}
-func (m *OnuAllocHistoryData) XXX_Size() int {
-	return xxx_messageInfo_OnuAllocHistoryData.Size(m)
-}
-func (m *OnuAllocHistoryData) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuAllocHistoryData.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuAllocHistoryData proto.InternalMessageInfo
-
-func (m *OnuAllocHistoryData) GetAllocId() uint32 {
-	if m != nil {
-		return m.AllocId
+func (x *OnuAllocHistoryData) GetAllocId() uint32 {
+	if x != nil {
+		return x.AllocId
 	}
 	return 0
 }
 
-func (m *OnuAllocHistoryData) GetRxBytes() uint32 {
-	if m != nil {
-		return m.RxBytes
+func (x *OnuAllocHistoryData) GetRxBytes() uint32 {
+	if x != nil {
+		return x.RxBytes
 	}
 	return 0
 }
 
 type OnuAllocGemHistoryData struct {
-	OnuAllocIdInfo       *OnuAllocHistoryData     `protobuf:"bytes,1,opt,name=onuAllocIdInfo,proto3" json:"onuAllocIdInfo,omitempty"`
-	GemPortInfo          []*OnuGemPortHistoryData `protobuf:"bytes,2,rep,name=gemPortInfo,proto3" json:"gemPortInfo,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
-	XXX_unrecognized     []byte                   `json:"-"`
-	XXX_sizecache        int32                    `json:"-"`
+	state          protoimpl.MessageState   `protogen:"open.v1"`
+	OnuAllocIdInfo *OnuAllocHistoryData     `protobuf:"bytes,1,opt,name=onuAllocIdInfo,proto3" json:"onuAllocIdInfo,omitempty"`
+	GemPortInfo    []*OnuGemPortHistoryData `protobuf:"bytes,2,rep,name=gemPortInfo,proto3" json:"gemPortInfo,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
-func (m *OnuAllocGemHistoryData) Reset()         { *m = OnuAllocGemHistoryData{} }
-func (m *OnuAllocGemHistoryData) String() string { return proto.CompactTextString(m) }
-func (*OnuAllocGemHistoryData) ProtoMessage()    {}
+func (x *OnuAllocGemHistoryData) Reset() {
+	*x = OnuAllocGemHistoryData{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[17]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuAllocGemHistoryData) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuAllocGemHistoryData) ProtoMessage() {}
+
+func (x *OnuAllocGemHistoryData) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 OnuAllocGemHistoryData.ProtoReflect.Descriptor instead.
 func (*OnuAllocGemHistoryData) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{17}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{17}
 }
 
-func (m *OnuAllocGemHistoryData) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuAllocGemHistoryData.Unmarshal(m, b)
-}
-func (m *OnuAllocGemHistoryData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuAllocGemHistoryData.Marshal(b, m, deterministic)
-}
-func (m *OnuAllocGemHistoryData) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuAllocGemHistoryData.Merge(m, src)
-}
-func (m *OnuAllocGemHistoryData) XXX_Size() int {
-	return xxx_messageInfo_OnuAllocGemHistoryData.Size(m)
-}
-func (m *OnuAllocGemHistoryData) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuAllocGemHistoryData.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuAllocGemHistoryData proto.InternalMessageInfo
-
-func (m *OnuAllocGemHistoryData) GetOnuAllocIdInfo() *OnuAllocHistoryData {
-	if m != nil {
-		return m.OnuAllocIdInfo
+func (x *OnuAllocGemHistoryData) GetOnuAllocIdInfo() *OnuAllocHistoryData {
+	if x != nil {
+		return x.OnuAllocIdInfo
 	}
 	return nil
 }
 
-func (m *OnuAllocGemHistoryData) GetGemPortInfo() []*OnuGemPortHistoryData {
-	if m != nil {
-		return m.GemPortInfo
+func (x *OnuAllocGemHistoryData) GetGemPortInfo() []*OnuGemPortHistoryData {
+	if x != nil {
+		return x.GemPortInfo
 	}
 	return nil
 }
 
 type GetOnuAllocGemHistoryResponse struct {
+	state                  protoimpl.MessageState    `protogen:"open.v1"`
 	OnuAllocGemHistoryData []*OnuAllocGemHistoryData `protobuf:"bytes,1,rep,name=onuAllocGemHistoryData,proto3" json:"onuAllocGemHistoryData,omitempty"`
-	XXX_NoUnkeyedLiteral   struct{}                  `json:"-"`
-	XXX_unrecognized       []byte                    `json:"-"`
-	XXX_sizecache          int32                     `json:"-"`
+	unknownFields          protoimpl.UnknownFields
+	sizeCache              protoimpl.SizeCache
 }
 
-func (m *GetOnuAllocGemHistoryResponse) Reset()         { *m = GetOnuAllocGemHistoryResponse{} }
-func (m *GetOnuAllocGemHistoryResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOnuAllocGemHistoryResponse) ProtoMessage()    {}
+func (x *GetOnuAllocGemHistoryResponse) Reset() {
+	*x = GetOnuAllocGemHistoryResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[18]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuAllocGemHistoryResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuAllocGemHistoryResponse) ProtoMessage() {}
+
+func (x *GetOnuAllocGemHistoryResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuAllocGemHistoryResponse.ProtoReflect.Descriptor instead.
 func (*GetOnuAllocGemHistoryResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{18}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{18}
 }
 
-func (m *GetOnuAllocGemHistoryResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuAllocGemHistoryResponse.Unmarshal(m, b)
-}
-func (m *GetOnuAllocGemHistoryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuAllocGemHistoryResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOnuAllocGemHistoryResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuAllocGemHistoryResponse.Merge(m, src)
-}
-func (m *GetOnuAllocGemHistoryResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOnuAllocGemHistoryResponse.Size(m)
-}
-func (m *GetOnuAllocGemHistoryResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuAllocGemHistoryResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuAllocGemHistoryResponse proto.InternalMessageInfo
-
-func (m *GetOnuAllocGemHistoryResponse) GetOnuAllocGemHistoryData() []*OnuAllocGemHistoryData {
-	if m != nil {
-		return m.OnuAllocGemHistoryData
+func (x *GetOnuAllocGemHistoryResponse) GetOnuAllocGemHistoryData() []*OnuAllocGemHistoryData {
+	if x != nil {
+		return x.OnuAllocGemHistoryData
 	}
 	return nil
 }
 
 type GetOnuFecHistory struct {
-	Empty                *empty.Empty `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
-	XXX_unrecognized     []byte       `json:"-"`
-	XXX_sizecache        int32        `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Empty         *emptypb.Empty         `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOnuFecHistory) Reset()         { *m = GetOnuFecHistory{} }
-func (m *GetOnuFecHistory) String() string { return proto.CompactTextString(m) }
-func (*GetOnuFecHistory) ProtoMessage()    {}
+func (x *GetOnuFecHistory) Reset() {
+	*x = GetOnuFecHistory{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[19]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuFecHistory) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuFecHistory) ProtoMessage() {}
+
+func (x *GetOnuFecHistory) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuFecHistory.ProtoReflect.Descriptor instead.
 func (*GetOnuFecHistory) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{19}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{19}
 }
 
-func (m *GetOnuFecHistory) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuFecHistory.Unmarshal(m, b)
-}
-func (m *GetOnuFecHistory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuFecHistory.Marshal(b, m, deterministic)
-}
-func (m *GetOnuFecHistory) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuFecHistory.Merge(m, src)
-}
-func (m *GetOnuFecHistory) XXX_Size() int {
-	return xxx_messageInfo_GetOnuFecHistory.Size(m)
-}
-func (m *GetOnuFecHistory) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuFecHistory.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuFecHistory proto.InternalMessageInfo
-
-func (m *GetOnuFecHistory) GetEmpty() *empty.Empty {
-	if m != nil {
-		return m.Empty
+func (x *GetOnuFecHistory) GetEmpty() *emptypb.Empty {
+	if x != nil {
+		return x.Empty
 	}
 	return nil
 }
 
 type GetOnuFecHistoryResponse struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Deprecated: uint32 cannot handle large counter values and will overflow.
 	// Use fec_corrected_bytes_64 instead for full 64-bit precision.
-	CorrectedBytes uint32 `protobuf:"varint,1,opt,name=correctedBytes,proto3" json:"correctedBytes,omitempty"` // Deprecated: Do not use.
+	//
+	// Deprecated: Marked as deprecated in voltha_protos/extensions.proto.
+	CorrectedBytes uint32 `protobuf:"varint,1,opt,name=correctedBytes,proto3" json:"correctedBytes,omitempty"`
 	// Deprecated: uint32 cannot handle large counter values and will overflow.
 	// Use fec_corrected_code_words_64 instead for full 64-bit precision.
-	CorrectedCodeWords uint32 `protobuf:"varint,2,opt,name=correctedCodeWords,proto3" json:"correctedCodeWords,omitempty"` // Deprecated: Do not use.
+	//
+	// Deprecated: Marked as deprecated in voltha_protos/extensions.proto.
+	CorrectedCodeWords uint32 `protobuf:"varint,2,opt,name=correctedCodeWords,proto3" json:"correctedCodeWords,omitempty"`
 	FecSeconds         uint32 `protobuf:"varint,3,opt,name=fecSeconds,proto3" json:"fecSeconds,omitempty"`
 	// Deprecated: uint32 cannot handle large counter values and will overflow.
 	// Use total_code_words_64 instead for full 64-bit precision.
-	TotalCodeWords uint32 `protobuf:"varint,4,opt,name=totalCodeWords,proto3" json:"totalCodeWords,omitempty"` // Deprecated: Do not use.
+	//
+	// Deprecated: Marked as deprecated in voltha_protos/extensions.proto.
+	TotalCodeWords uint32 `protobuf:"varint,4,opt,name=totalCodeWords,proto3" json:"totalCodeWords,omitempty"`
 	// Deprecated: uint32 cannot handle large counter values and will overflow.
 	// Use uncorrectable_code_words_64 instead for full 64-bit precision.
-	UncorrectableCodeWords    uint32   `protobuf:"varint,5,opt,name=uncorrectableCodeWords,proto3" json:"uncorrectableCodeWords,omitempty"` // Deprecated: Do not use.
-	FecCorrectedBytes_64      uint64   `protobuf:"fixed64,6,opt,name=fec_corrected_bytes_64,json=fecCorrectedBytes64,proto3" json:"fec_corrected_bytes_64,omitempty"`
-	FecCorrectedCodeWords_64  uint64   `protobuf:"fixed64,7,opt,name=fec_corrected_code_words_64,json=fecCorrectedCodeWords64,proto3" json:"fec_corrected_code_words_64,omitempty"`
-	TotalCodeWords_64         uint64   `protobuf:"fixed64,8,opt,name=total_code_words_64,json=totalCodeWords64,proto3" json:"total_code_words_64,omitempty"`
-	UncorrectableCodeWords_64 uint64   `protobuf:"fixed64,9,opt,name=uncorrectable_code_words_64,json=uncorrectableCodeWords64,proto3" json:"uncorrectable_code_words_64,omitempty"`
-	XXX_NoUnkeyedLiteral      struct{} `json:"-"`
-	XXX_unrecognized          []byte   `json:"-"`
-	XXX_sizecache             int32    `json:"-"`
+	//
+	// Deprecated: Marked as deprecated in voltha_protos/extensions.proto.
+	UncorrectableCodeWords    uint32 `protobuf:"varint,5,opt,name=uncorrectableCodeWords,proto3" json:"uncorrectableCodeWords,omitempty"`
+	FecCorrectedBytes_64      uint64 `protobuf:"fixed64,6,opt,name=fec_corrected_bytes_64,json=fecCorrectedBytes64,proto3" json:"fec_corrected_bytes_64,omitempty"`
+	FecCorrectedCodeWords_64  uint64 `protobuf:"fixed64,7,opt,name=fec_corrected_code_words_64,json=fecCorrectedCodeWords64,proto3" json:"fec_corrected_code_words_64,omitempty"`
+	TotalCodeWords_64         uint64 `protobuf:"fixed64,8,opt,name=total_code_words_64,json=totalCodeWords64,proto3" json:"total_code_words_64,omitempty"`
+	UncorrectableCodeWords_64 uint64 `protobuf:"fixed64,9,opt,name=uncorrectable_code_words_64,json=uncorrectableCodeWords64,proto3" json:"uncorrectable_code_words_64,omitempty"`
+	unknownFields             protoimpl.UnknownFields
+	sizeCache                 protoimpl.SizeCache
 }
 
-func (m *GetOnuFecHistoryResponse) Reset()         { *m = GetOnuFecHistoryResponse{} }
-func (m *GetOnuFecHistoryResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOnuFecHistoryResponse) ProtoMessage()    {}
+func (x *GetOnuFecHistoryResponse) Reset() {
+	*x = GetOnuFecHistoryResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[20]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuFecHistoryResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuFecHistoryResponse) ProtoMessage() {}
+
+func (x *GetOnuFecHistoryResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuFecHistoryResponse.ProtoReflect.Descriptor instead.
 func (*GetOnuFecHistoryResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{20}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{20}
 }
 
-func (m *GetOnuFecHistoryResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuFecHistoryResponse.Unmarshal(m, b)
-}
-func (m *GetOnuFecHistoryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuFecHistoryResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOnuFecHistoryResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuFecHistoryResponse.Merge(m, src)
-}
-func (m *GetOnuFecHistoryResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOnuFecHistoryResponse.Size(m)
-}
-func (m *GetOnuFecHistoryResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuFecHistoryResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuFecHistoryResponse proto.InternalMessageInfo
-
-// Deprecated: Do not use.
-func (m *GetOnuFecHistoryResponse) GetCorrectedBytes() uint32 {
-	if m != nil {
-		return m.CorrectedBytes
+// Deprecated: Marked as deprecated in voltha_protos/extensions.proto.
+func (x *GetOnuFecHistoryResponse) GetCorrectedBytes() uint32 {
+	if x != nil {
+		return x.CorrectedBytes
 	}
 	return 0
 }
 
-// Deprecated: Do not use.
-func (m *GetOnuFecHistoryResponse) GetCorrectedCodeWords() uint32 {
-	if m != nil {
-		return m.CorrectedCodeWords
+// Deprecated: Marked as deprecated in voltha_protos/extensions.proto.
+func (x *GetOnuFecHistoryResponse) GetCorrectedCodeWords() uint32 {
+	if x != nil {
+		return x.CorrectedCodeWords
 	}
 	return 0
 }
 
-func (m *GetOnuFecHistoryResponse) GetFecSeconds() uint32 {
-	if m != nil {
-		return m.FecSeconds
+func (x *GetOnuFecHistoryResponse) GetFecSeconds() uint32 {
+	if x != nil {
+		return x.FecSeconds
 	}
 	return 0
 }
 
-// Deprecated: Do not use.
-func (m *GetOnuFecHistoryResponse) GetTotalCodeWords() uint32 {
-	if m != nil {
-		return m.TotalCodeWords
+// Deprecated: Marked as deprecated in voltha_protos/extensions.proto.
+func (x *GetOnuFecHistoryResponse) GetTotalCodeWords() uint32 {
+	if x != nil {
+		return x.TotalCodeWords
 	}
 	return 0
 }
 
-// Deprecated: Do not use.
-func (m *GetOnuFecHistoryResponse) GetUncorrectableCodeWords() uint32 {
-	if m != nil {
-		return m.UncorrectableCodeWords
+// Deprecated: Marked as deprecated in voltha_protos/extensions.proto.
+func (x *GetOnuFecHistoryResponse) GetUncorrectableCodeWords() uint32 {
+	if x != nil {
+		return x.UncorrectableCodeWords
 	}
 	return 0
 }
 
-func (m *GetOnuFecHistoryResponse) GetFecCorrectedBytes_64() uint64 {
-	if m != nil {
-		return m.FecCorrectedBytes_64
+func (x *GetOnuFecHistoryResponse) GetFecCorrectedBytes_64() uint64 {
+	if x != nil {
+		return x.FecCorrectedBytes_64
 	}
 	return 0
 }
 
-func (m *GetOnuFecHistoryResponse) GetFecCorrectedCodeWords_64() uint64 {
-	if m != nil {
-		return m.FecCorrectedCodeWords_64
+func (x *GetOnuFecHistoryResponse) GetFecCorrectedCodeWords_64() uint64 {
+	if x != nil {
+		return x.FecCorrectedCodeWords_64
 	}
 	return 0
 }
 
-func (m *GetOnuFecHistoryResponse) GetTotalCodeWords_64() uint64 {
-	if m != nil {
-		return m.TotalCodeWords_64
+func (x *GetOnuFecHistoryResponse) GetTotalCodeWords_64() uint64 {
+	if x != nil {
+		return x.TotalCodeWords_64
 	}
 	return 0
 }
 
-func (m *GetOnuFecHistoryResponse) GetUncorrectableCodeWords_64() uint64 {
-	if m != nil {
-		return m.UncorrectableCodeWords_64
+func (x *GetOnuFecHistoryResponse) GetUncorrectableCodeWords_64() uint64 {
+	if x != nil {
+		return x.UncorrectableCodeWords_64
 	}
 	return 0
 }
 
 type GetOnuCountersRequest 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:"-"`
+	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 (m *GetOnuCountersRequest) Reset()         { *m = GetOnuCountersRequest{} }
-func (m *GetOnuCountersRequest) String() string { return proto.CompactTextString(m) }
-func (*GetOnuCountersRequest) ProtoMessage()    {}
+func (x *GetOnuCountersRequest) Reset() {
+	*x = GetOnuCountersRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[21]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuCountersRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuCountersRequest) ProtoMessage() {}
+
+func (x *GetOnuCountersRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuCountersRequest.ProtoReflect.Descriptor instead.
 func (*GetOnuCountersRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{21}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{21}
 }
 
-func (m *GetOnuCountersRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuCountersRequest.Unmarshal(m, b)
-}
-func (m *GetOnuCountersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuCountersRequest.Marshal(b, m, deterministic)
-}
-func (m *GetOnuCountersRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuCountersRequest.Merge(m, src)
-}
-func (m *GetOnuCountersRequest) XXX_Size() int {
-	return xxx_messageInfo_GetOnuCountersRequest.Size(m)
-}
-func (m *GetOnuCountersRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuCountersRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuCountersRequest proto.InternalMessageInfo
-
-func (m *GetOnuCountersRequest) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
+func (x *GetOnuCountersRequest) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
 	}
 	return 0
 }
 
-func (m *GetOnuCountersRequest) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
+func (x *GetOnuCountersRequest) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
 	}
 	return 0
 }
 
 type GetOmciEthernetFrameExtendedPmRequest struct {
-	OnuDeviceId string `protobuf:"bytes,1,opt,name=onuDeviceId,proto3" json:"onuDeviceId,omitempty"`
+	state       protoimpl.MessageState `protogen:"open.v1"`
+	OnuDeviceId string                 `protobuf:"bytes,1,opt,name=onuDeviceId,proto3" json:"onuDeviceId,omitempty"`
 	// Types that are valid to be assigned to IsUniIndex:
+	//
 	//	*GetOmciEthernetFrameExtendedPmRequest_UniIndex
-	IsUniIndex           isGetOmciEthernetFrameExtendedPmRequest_IsUniIndex `protobuf_oneof:"is_uni_index"`
-	Reset_               bool                                               `protobuf:"varint,3,opt,name=reset,proto3" json:"reset,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                                           `json:"-"`
-	XXX_unrecognized     []byte                                             `json:"-"`
-	XXX_sizecache        int32                                              `json:"-"`
+	IsUniIndex    isGetOmciEthernetFrameExtendedPmRequest_IsUniIndex `protobuf_oneof:"is_uni_index"`
+	Reset_        bool                                               `protobuf:"varint,3,opt,name=reset,proto3" json:"reset,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOmciEthernetFrameExtendedPmRequest) Reset()         { *m = GetOmciEthernetFrameExtendedPmRequest{} }
-func (m *GetOmciEthernetFrameExtendedPmRequest) String() string { return proto.CompactTextString(m) }
-func (*GetOmciEthernetFrameExtendedPmRequest) ProtoMessage()    {}
+func (x *GetOmciEthernetFrameExtendedPmRequest) Reset() {
+	*x = GetOmciEthernetFrameExtendedPmRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[22]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOmciEthernetFrameExtendedPmRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOmciEthernetFrameExtendedPmRequest) ProtoMessage() {}
+
+func (x *GetOmciEthernetFrameExtendedPmRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOmciEthernetFrameExtendedPmRequest.ProtoReflect.Descriptor instead.
 func (*GetOmciEthernetFrameExtendedPmRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{22}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{22}
 }
 
-func (m *GetOmciEthernetFrameExtendedPmRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOmciEthernetFrameExtendedPmRequest.Unmarshal(m, b)
-}
-func (m *GetOmciEthernetFrameExtendedPmRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOmciEthernetFrameExtendedPmRequest.Marshal(b, m, deterministic)
-}
-func (m *GetOmciEthernetFrameExtendedPmRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOmciEthernetFrameExtendedPmRequest.Merge(m, src)
-}
-func (m *GetOmciEthernetFrameExtendedPmRequest) XXX_Size() int {
-	return xxx_messageInfo_GetOmciEthernetFrameExtendedPmRequest.Size(m)
-}
-func (m *GetOmciEthernetFrameExtendedPmRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOmciEthernetFrameExtendedPmRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOmciEthernetFrameExtendedPmRequest proto.InternalMessageInfo
-
-func (m *GetOmciEthernetFrameExtendedPmRequest) GetOnuDeviceId() string {
-	if m != nil {
-		return m.OnuDeviceId
+func (x *GetOmciEthernetFrameExtendedPmRequest) GetOnuDeviceId() string {
+	if x != nil {
+		return x.OnuDeviceId
 	}
 	return ""
 }
 
+func (x *GetOmciEthernetFrameExtendedPmRequest) GetIsUniIndex() isGetOmciEthernetFrameExtendedPmRequest_IsUniIndex {
+	if x != nil {
+		return x.IsUniIndex
+	}
+	return nil
+}
+
+func (x *GetOmciEthernetFrameExtendedPmRequest) GetUniIndex() uint32 {
+	if x != nil {
+		if x, ok := x.IsUniIndex.(*GetOmciEthernetFrameExtendedPmRequest_UniIndex); ok {
+			return x.UniIndex
+		}
+	}
+	return 0
+}
+
+func (x *GetOmciEthernetFrameExtendedPmRequest) GetReset_() bool {
+	if x != nil {
+		return x.Reset_
+	}
+	return false
+}
+
 type isGetOmciEthernetFrameExtendedPmRequest_IsUniIndex interface {
 	isGetOmciEthernetFrameExtendedPmRequest_IsUniIndex()
 }
 
 type GetOmciEthernetFrameExtendedPmRequest_UniIndex struct {
-	UniIndex uint32 `protobuf:"varint,2,opt,name=uniIndex,proto3,oneof"`
+	UniIndex uint32 `protobuf:"varint,2,opt,name=uniIndex,proto3,oneof"` // Index of the uni starting from 0
 }
 
 func (*GetOmciEthernetFrameExtendedPmRequest_UniIndex) isGetOmciEthernetFrameExtendedPmRequest_IsUniIndex() {
 }
 
-func (m *GetOmciEthernetFrameExtendedPmRequest) GetIsUniIndex() isGetOmciEthernetFrameExtendedPmRequest_IsUniIndex {
-	if m != nil {
-		return m.IsUniIndex
-	}
-	return nil
-}
-
-func (m *GetOmciEthernetFrameExtendedPmRequest) GetUniIndex() uint32 {
-	if x, ok := m.GetIsUniIndex().(*GetOmciEthernetFrameExtendedPmRequest_UniIndex); ok {
-		return x.UniIndex
-	}
-	return 0
-}
-
-func (m *GetOmciEthernetFrameExtendedPmRequest) GetReset_() bool {
-	if m != nil {
-		return m.Reset_
-	}
-	return false
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*GetOmciEthernetFrameExtendedPmRequest) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*GetOmciEthernetFrameExtendedPmRequest_UniIndex)(nil),
-	}
-}
-
 // DEPRECATED
 type GetRxPowerRequest 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:"-"`
+	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 (m *GetRxPowerRequest) Reset()         { *m = GetRxPowerRequest{} }
-func (m *GetRxPowerRequest) String() string { return proto.CompactTextString(m) }
-func (*GetRxPowerRequest) ProtoMessage()    {}
+func (x *GetRxPowerRequest) Reset() {
+	*x = GetRxPowerRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[23]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetRxPowerRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetRxPowerRequest) ProtoMessage() {}
+
+func (x *GetRxPowerRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetRxPowerRequest.ProtoReflect.Descriptor instead.
 func (*GetRxPowerRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{23}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{23}
 }
 
-func (m *GetRxPowerRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetRxPowerRequest.Unmarshal(m, b)
-}
-func (m *GetRxPowerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetRxPowerRequest.Marshal(b, m, deterministic)
-}
-func (m *GetRxPowerRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetRxPowerRequest.Merge(m, src)
-}
-func (m *GetRxPowerRequest) XXX_Size() int {
-	return xxx_messageInfo_GetRxPowerRequest.Size(m)
-}
-func (m *GetRxPowerRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetRxPowerRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetRxPowerRequest proto.InternalMessageInfo
-
-func (m *GetRxPowerRequest) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
+func (x *GetRxPowerRequest) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
 	}
 	return 0
 }
 
-func (m *GetRxPowerRequest) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
+func (x *GetRxPowerRequest) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
 	}
 	return 0
 }
 
 type GetOltRxPowerRequest struct {
-	PortLabel string `protobuf:"bytes,1,opt,name=port_label,json=portLabel,proto3" json:"port_label,omitempty"`
+	state     protoimpl.MessageState `protogen:"open.v1"`
+	PortLabel string                 `protobuf:"bytes,1,opt,name=port_label,json=portLabel,proto3" json:"port_label,omitempty"`
 	// onu_sn is optional and if onu_sn is an empty string and the label is
 	// of a PON port then it means that the Rx Power corresponding to all
 	// the ONUs on that PON port is requested. In case the port_label is not
 	// of a PON port, the onu_sn does not have any significance
-	OnuSn                string   `protobuf:"bytes,2,opt,name=onu_sn,json=onuSn,proto3" json:"onu_sn,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	OnuSn         string `protobuf:"bytes,2,opt,name=onu_sn,json=onuSn,proto3" json:"onu_sn,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOltRxPowerRequest) Reset()         { *m = GetOltRxPowerRequest{} }
-func (m *GetOltRxPowerRequest) String() string { return proto.CompactTextString(m) }
-func (*GetOltRxPowerRequest) ProtoMessage()    {}
+func (x *GetOltRxPowerRequest) Reset() {
+	*x = GetOltRxPowerRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[24]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOltRxPowerRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOltRxPowerRequest) ProtoMessage() {}
+
+func (x *GetOltRxPowerRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOltRxPowerRequest.ProtoReflect.Descriptor instead.
 func (*GetOltRxPowerRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{24}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{24}
 }
 
-func (m *GetOltRxPowerRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOltRxPowerRequest.Unmarshal(m, b)
-}
-func (m *GetOltRxPowerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOltRxPowerRequest.Marshal(b, m, deterministic)
-}
-func (m *GetOltRxPowerRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOltRxPowerRequest.Merge(m, src)
-}
-func (m *GetOltRxPowerRequest) XXX_Size() int {
-	return xxx_messageInfo_GetOltRxPowerRequest.Size(m)
-}
-func (m *GetOltRxPowerRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOltRxPowerRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOltRxPowerRequest proto.InternalMessageInfo
-
-func (m *GetOltRxPowerRequest) GetPortLabel() string {
-	if m != nil {
-		return m.PortLabel
+func (x *GetOltRxPowerRequest) GetPortLabel() string {
+	if x != nil {
+		return x.PortLabel
 	}
 	return ""
 }
 
-func (m *GetOltRxPowerRequest) GetOnuSn() string {
-	if m != nil {
-		return m.OnuSn
+func (x *GetOltRxPowerRequest) GetOnuSn() string {
+	if x != nil {
+		return x.OnuSn
 	}
 	return ""
 }
 
 type GetPonStatsRequest struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Types that are valid to be assigned to PortInfo:
+	//
 	//	*GetPonStatsRequest_PortLabel
 	//	*GetPonStatsRequest_PortId
-	PortInfo             isGetPonStatsRequest_PortInfo `protobuf_oneof:"portInfo"`
-	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
-	XXX_unrecognized     []byte                        `json:"-"`
-	XXX_sizecache        int32                         `json:"-"`
+	PortInfo      isGetPonStatsRequest_PortInfo `protobuf_oneof:"portInfo"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetPonStatsRequest) Reset()         { *m = GetPonStatsRequest{} }
-func (m *GetPonStatsRequest) String() string { return proto.CompactTextString(m) }
-func (*GetPonStatsRequest) ProtoMessage()    {}
+func (x *GetPonStatsRequest) Reset() {
+	*x = GetPonStatsRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[25]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetPonStatsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPonStatsRequest) ProtoMessage() {}
+
+func (x *GetPonStatsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetPonStatsRequest.ProtoReflect.Descriptor instead.
 func (*GetPonStatsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{25}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{25}
 }
 
-func (m *GetPonStatsRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetPonStatsRequest.Unmarshal(m, b)
-}
-func (m *GetPonStatsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetPonStatsRequest.Marshal(b, m, deterministic)
-}
-func (m *GetPonStatsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetPonStatsRequest.Merge(m, src)
-}
-func (m *GetPonStatsRequest) XXX_Size() int {
-	return xxx_messageInfo_GetPonStatsRequest.Size(m)
-}
-func (m *GetPonStatsRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetPonStatsRequest.DiscardUnknown(m)
+func (x *GetPonStatsRequest) GetPortInfo() isGetPonStatsRequest_PortInfo {
+	if x != nil {
+		return x.PortInfo
+	}
+	return nil
 }
 
-var xxx_messageInfo_GetPonStatsRequest proto.InternalMessageInfo
+func (x *GetPonStatsRequest) GetPortLabel() string {
+	if x != nil {
+		if x, ok := x.PortInfo.(*GetPonStatsRequest_PortLabel); ok {
+			return x.PortLabel
+		}
+	}
+	return ""
+}
+
+func (x *GetPonStatsRequest) GetPortId() uint32 {
+	if x != nil {
+		if x, ok := x.PortInfo.(*GetPonStatsRequest_PortId); ok {
+			return x.PortId
+		}
+	}
+	return 0
+}
 
 type isGetPonStatsRequest_PortInfo interface {
 	isGetPonStatsRequest_PortInfo()
@@ -1959,116 +2380,123 @@
 
 func (*GetPonStatsRequest_PortId) isGetPonStatsRequest_PortInfo() {}
 
-func (m *GetPonStatsRequest) GetPortInfo() isGetPonStatsRequest_PortInfo {
-	if m != nil {
-		return m.PortInfo
-	}
-	return nil
-}
-
-func (m *GetPonStatsRequest) GetPortLabel() string {
-	if x, ok := m.GetPortInfo().(*GetPonStatsRequest_PortLabel); ok {
-		return x.PortLabel
-	}
-	return ""
-}
-
-func (m *GetPonStatsRequest) GetPortId() uint32 {
-	if x, ok := m.GetPortInfo().(*GetPonStatsRequest_PortId); ok {
-		return x.PortId
-	}
-	return 0
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*GetPonStatsRequest) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*GetPonStatsRequest_PortLabel)(nil),
-		(*GetPonStatsRequest_PortId)(nil),
-	}
-}
-
 type GetPonStatsResponse struct {
-	PonPort              uint32                 `protobuf:"varint,1,opt,name=ponPort,proto3" json:"ponPort,omitempty"`
-	PortStatistics       *common.PortStatistics `protobuf:"bytes,2,opt,name=portStatistics,proto3" json:"portStatistics,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
-	XXX_unrecognized     []byte                 `json:"-"`
-	XXX_sizecache        int32                  `json:"-"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	PonPort        uint32                 `protobuf:"varint,1,opt,name=ponPort,proto3" json:"ponPort,omitempty"`
+	PortStatistics *common.PortStatistics `protobuf:"bytes,2,opt,name=portStatistics,proto3" json:"portStatistics,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
-func (m *GetPonStatsResponse) Reset()         { *m = GetPonStatsResponse{} }
-func (m *GetPonStatsResponse) String() string { return proto.CompactTextString(m) }
-func (*GetPonStatsResponse) ProtoMessage()    {}
+func (x *GetPonStatsResponse) Reset() {
+	*x = GetPonStatsResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[26]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetPonStatsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPonStatsResponse) ProtoMessage() {}
+
+func (x *GetPonStatsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetPonStatsResponse.ProtoReflect.Descriptor instead.
 func (*GetPonStatsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{26}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{26}
 }
 
-func (m *GetPonStatsResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetPonStatsResponse.Unmarshal(m, b)
-}
-func (m *GetPonStatsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetPonStatsResponse.Marshal(b, m, deterministic)
-}
-func (m *GetPonStatsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetPonStatsResponse.Merge(m, src)
-}
-func (m *GetPonStatsResponse) XXX_Size() int {
-	return xxx_messageInfo_GetPonStatsResponse.Size(m)
-}
-func (m *GetPonStatsResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetPonStatsResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetPonStatsResponse proto.InternalMessageInfo
-
-func (m *GetPonStatsResponse) GetPonPort() uint32 {
-	if m != nil {
-		return m.PonPort
+func (x *GetPonStatsResponse) GetPonPort() uint32 {
+	if x != nil {
+		return x.PonPort
 	}
 	return 0
 }
 
-func (m *GetPonStatsResponse) GetPortStatistics() *common.PortStatistics {
-	if m != nil {
-		return m.PortStatistics
+func (x *GetPonStatsResponse) GetPortStatistics() *common.PortStatistics {
+	if x != nil {
+		return x.PortStatistics
 	}
 	return nil
 }
 
 type GetNNIStatsRequest struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Types that are valid to be assigned to PortInfo:
+	//
 	//	*GetNNIStatsRequest_PortLabel
 	//	*GetNNIStatsRequest_PortId
-	PortInfo             isGetNNIStatsRequest_PortInfo `protobuf_oneof:"portInfo"`
-	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
-	XXX_unrecognized     []byte                        `json:"-"`
-	XXX_sizecache        int32                         `json:"-"`
+	PortInfo      isGetNNIStatsRequest_PortInfo `protobuf_oneof:"portInfo"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetNNIStatsRequest) Reset()         { *m = GetNNIStatsRequest{} }
-func (m *GetNNIStatsRequest) String() string { return proto.CompactTextString(m) }
-func (*GetNNIStatsRequest) ProtoMessage()    {}
+func (x *GetNNIStatsRequest) Reset() {
+	*x = GetNNIStatsRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[27]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetNNIStatsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetNNIStatsRequest) ProtoMessage() {}
+
+func (x *GetNNIStatsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetNNIStatsRequest.ProtoReflect.Descriptor instead.
 func (*GetNNIStatsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{27}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{27}
 }
 
-func (m *GetNNIStatsRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetNNIStatsRequest.Unmarshal(m, b)
-}
-func (m *GetNNIStatsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetNNIStatsRequest.Marshal(b, m, deterministic)
-}
-func (m *GetNNIStatsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetNNIStatsRequest.Merge(m, src)
-}
-func (m *GetNNIStatsRequest) XXX_Size() int {
-	return xxx_messageInfo_GetNNIStatsRequest.Size(m)
-}
-func (m *GetNNIStatsRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetNNIStatsRequest.DiscardUnknown(m)
+func (x *GetNNIStatsRequest) GetPortInfo() isGetNNIStatsRequest_PortInfo {
+	if x != nil {
+		return x.PortInfo
+	}
+	return nil
 }
 
-var xxx_messageInfo_GetNNIStatsRequest proto.InternalMessageInfo
+func (x *GetNNIStatsRequest) GetPortLabel() string {
+	if x != nil {
+		if x, ok := x.PortInfo.(*GetNNIStatsRequest_PortLabel); ok {
+			return x.PortLabel
+		}
+	}
+	return ""
+}
+
+func (x *GetNNIStatsRequest) GetPortId() uint32 {
+	if x != nil {
+		if x, ok := x.PortInfo.(*GetNNIStatsRequest_PortId); ok {
+			return x.PortId
+		}
+	}
+	return 0
+}
 
 type isGetNNIStatsRequest_PortInfo interface {
 	isGetNNIStatsRequest_PortInfo()
@@ -2086,448 +2514,930 @@
 
 func (*GetNNIStatsRequest_PortId) isGetNNIStatsRequest_PortInfo() {}
 
-func (m *GetNNIStatsRequest) GetPortInfo() isGetNNIStatsRequest_PortInfo {
-	if m != nil {
-		return m.PortInfo
-	}
-	return nil
-}
-
-func (m *GetNNIStatsRequest) GetPortLabel() string {
-	if x, ok := m.GetPortInfo().(*GetNNIStatsRequest_PortLabel); ok {
-		return x.PortLabel
-	}
-	return ""
-}
-
-func (m *GetNNIStatsRequest) GetPortId() uint32 {
-	if x, ok := m.GetPortInfo().(*GetNNIStatsRequest_PortId); ok {
-		return x.PortId
-	}
-	return 0
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*GetNNIStatsRequest) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*GetNNIStatsRequest_PortLabel)(nil),
-		(*GetNNIStatsRequest_PortId)(nil),
-	}
-}
-
 type GetNNIStatsResponse struct {
-	NniPort              uint32                 `protobuf:"varint,1,opt,name=nniPort,proto3" json:"nniPort,omitempty"`
-	PortStatistics       *common.PortStatistics `protobuf:"bytes,2,opt,name=portStatistics,proto3" json:"portStatistics,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
-	XXX_unrecognized     []byte                 `json:"-"`
-	XXX_sizecache        int32                  `json:"-"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	NniPort        uint32                 `protobuf:"varint,1,opt,name=nniPort,proto3" json:"nniPort,omitempty"`
+	PortStatistics *common.PortStatistics `protobuf:"bytes,2,opt,name=portStatistics,proto3" json:"portStatistics,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
-func (m *GetNNIStatsResponse) Reset()         { *m = GetNNIStatsResponse{} }
-func (m *GetNNIStatsResponse) String() string { return proto.CompactTextString(m) }
-func (*GetNNIStatsResponse) ProtoMessage()    {}
+func (x *GetNNIStatsResponse) Reset() {
+	*x = GetNNIStatsResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[28]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetNNIStatsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetNNIStatsResponse) ProtoMessage() {}
+
+func (x *GetNNIStatsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetNNIStatsResponse.ProtoReflect.Descriptor instead.
 func (*GetNNIStatsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{28}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{28}
 }
 
-func (m *GetNNIStatsResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetNNIStatsResponse.Unmarshal(m, b)
-}
-func (m *GetNNIStatsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetNNIStatsResponse.Marshal(b, m, deterministic)
-}
-func (m *GetNNIStatsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetNNIStatsResponse.Merge(m, src)
-}
-func (m *GetNNIStatsResponse) XXX_Size() int {
-	return xxx_messageInfo_GetNNIStatsResponse.Size(m)
-}
-func (m *GetNNIStatsResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetNNIStatsResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetNNIStatsResponse proto.InternalMessageInfo
-
-func (m *GetNNIStatsResponse) GetNniPort() uint32 {
-	if m != nil {
-		return m.NniPort
+func (x *GetNNIStatsResponse) GetNniPort() uint32 {
+	if x != nil {
+		return x.NniPort
 	}
 	return 0
 }
 
-func (m *GetNNIStatsResponse) GetPortStatistics() *common.PortStatistics {
-	if m != nil {
-		return m.PortStatistics
+func (x *GetNNIStatsResponse) GetPortStatistics() *common.PortStatistics {
+	if x != nil {
+		return x.PortStatistics
 	}
 	return nil
 }
 
 // GetOnuStatsFromOltRequest collects GEM and AllocId stats from the OLT for a particular ONU.
 type GetOnuStatsFromOltRequest struct {
-	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intfId,proto3" json:"intfId,omitempty"`
-	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onuId,proto3" json:"onuId,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	IntfId        uint32                 `protobuf:"fixed32,1,opt,name=intfId,proto3" json:"intfId,omitempty"`
+	OnuId         uint32                 `protobuf:"fixed32,2,opt,name=onuId,proto3" json:"onuId,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOnuStatsFromOltRequest) Reset()         { *m = GetOnuStatsFromOltRequest{} }
-func (m *GetOnuStatsFromOltRequest) String() string { return proto.CompactTextString(m) }
-func (*GetOnuStatsFromOltRequest) ProtoMessage()    {}
+func (x *GetOnuStatsFromOltRequest) Reset() {
+	*x = GetOnuStatsFromOltRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[29]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuStatsFromOltRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuStatsFromOltRequest) ProtoMessage() {}
+
+func (x *GetOnuStatsFromOltRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuStatsFromOltRequest.ProtoReflect.Descriptor instead.
 func (*GetOnuStatsFromOltRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{29}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{29}
 }
 
-func (m *GetOnuStatsFromOltRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuStatsFromOltRequest.Unmarshal(m, b)
-}
-func (m *GetOnuStatsFromOltRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuStatsFromOltRequest.Marshal(b, m, deterministic)
-}
-func (m *GetOnuStatsFromOltRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuStatsFromOltRequest.Merge(m, src)
-}
-func (m *GetOnuStatsFromOltRequest) XXX_Size() int {
-	return xxx_messageInfo_GetOnuStatsFromOltRequest.Size(m)
-}
-func (m *GetOnuStatsFromOltRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuStatsFromOltRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuStatsFromOltRequest proto.InternalMessageInfo
-
-func (m *GetOnuStatsFromOltRequest) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
+func (x *GetOnuStatsFromOltRequest) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
 	}
 	return 0
 }
 
-func (m *GetOnuStatsFromOltRequest) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
+func (x *GetOnuStatsFromOltRequest) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
 	}
 	return 0
 }
 
 type OnuGemPortInfoFromOlt struct {
-	GemId                uint32   `protobuf:"varint,1,opt,name=gemId,proto3" json:"gemId,omitempty"`
-	RxPackets            uint64   `protobuf:"varint,2,opt,name=rxPackets,proto3" json:"rxPackets,omitempty"`
-	RxBytes              uint64   `protobuf:"varint,3,opt,name=rxBytes,proto3" json:"rxBytes,omitempty"`
-	TxPackets            uint64   `protobuf:"varint,4,opt,name=txPackets,proto3" json:"txPackets,omitempty"`
-	TxBytes              uint64   `protobuf:"varint,5,opt,name=txBytes,proto3" json:"txBytes,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	GemId         uint32                 `protobuf:"varint,1,opt,name=gemId,proto3" json:"gemId,omitempty"`
+	RxPackets     uint64                 `protobuf:"varint,2,opt,name=rxPackets,proto3" json:"rxPackets,omitempty"`
+	RxBytes       uint64                 `protobuf:"varint,3,opt,name=rxBytes,proto3" json:"rxBytes,omitempty"`
+	TxPackets     uint64                 `protobuf:"varint,4,opt,name=txPackets,proto3" json:"txPackets,omitempty"`
+	TxBytes       uint64                 `protobuf:"varint,5,opt,name=txBytes,proto3" json:"txBytes,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *OnuGemPortInfoFromOlt) Reset()         { *m = OnuGemPortInfoFromOlt{} }
-func (m *OnuGemPortInfoFromOlt) String() string { return proto.CompactTextString(m) }
-func (*OnuGemPortInfoFromOlt) ProtoMessage()    {}
+func (x *OnuGemPortInfoFromOlt) Reset() {
+	*x = OnuGemPortInfoFromOlt{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[30]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuGemPortInfoFromOlt) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuGemPortInfoFromOlt) ProtoMessage() {}
+
+func (x *OnuGemPortInfoFromOlt) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 OnuGemPortInfoFromOlt.ProtoReflect.Descriptor instead.
 func (*OnuGemPortInfoFromOlt) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{30}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{30}
 }
 
-func (m *OnuGemPortInfoFromOlt) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuGemPortInfoFromOlt.Unmarshal(m, b)
-}
-func (m *OnuGemPortInfoFromOlt) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuGemPortInfoFromOlt.Marshal(b, m, deterministic)
-}
-func (m *OnuGemPortInfoFromOlt) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuGemPortInfoFromOlt.Merge(m, src)
-}
-func (m *OnuGemPortInfoFromOlt) XXX_Size() int {
-	return xxx_messageInfo_OnuGemPortInfoFromOlt.Size(m)
-}
-func (m *OnuGemPortInfoFromOlt) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuGemPortInfoFromOlt.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuGemPortInfoFromOlt proto.InternalMessageInfo
-
-func (m *OnuGemPortInfoFromOlt) GetGemId() uint32 {
-	if m != nil {
-		return m.GemId
+func (x *OnuGemPortInfoFromOlt) GetGemId() uint32 {
+	if x != nil {
+		return x.GemId
 	}
 	return 0
 }
 
-func (m *OnuGemPortInfoFromOlt) GetRxPackets() uint64 {
-	if m != nil {
-		return m.RxPackets
+func (x *OnuGemPortInfoFromOlt) GetRxPackets() uint64 {
+	if x != nil {
+		return x.RxPackets
 	}
 	return 0
 }
 
-func (m *OnuGemPortInfoFromOlt) GetRxBytes() uint64 {
-	if m != nil {
-		return m.RxBytes
+func (x *OnuGemPortInfoFromOlt) GetRxBytes() uint64 {
+	if x != nil {
+		return x.RxBytes
 	}
 	return 0
 }
 
-func (m *OnuGemPortInfoFromOlt) GetTxPackets() uint64 {
-	if m != nil {
-		return m.TxPackets
+func (x *OnuGemPortInfoFromOlt) GetTxPackets() uint64 {
+	if x != nil {
+		return x.TxPackets
 	}
 	return 0
 }
 
-func (m *OnuGemPortInfoFromOlt) GetTxBytes() uint64 {
-	if m != nil {
-		return m.TxBytes
+func (x *OnuGemPortInfoFromOlt) GetTxBytes() uint64 {
+	if x != nil {
+		return x.TxBytes
 	}
 	return 0
 }
 
 type OnuAllocIdInfoFromOlt struct {
-	AllocId              uint32   `protobuf:"varint,1,opt,name=allocId,proto3" json:"allocId,omitempty"`
-	RxBytes              uint64   `protobuf:"varint,2,opt,name=rxBytes,proto3" json:"rxBytes,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	AllocId       uint32                 `protobuf:"varint,1,opt,name=allocId,proto3" json:"allocId,omitempty"`
+	RxBytes       uint64                 `protobuf:"varint,2,opt,name=rxBytes,proto3" json:"rxBytes,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *OnuAllocIdInfoFromOlt) Reset()         { *m = OnuAllocIdInfoFromOlt{} }
-func (m *OnuAllocIdInfoFromOlt) String() string { return proto.CompactTextString(m) }
-func (*OnuAllocIdInfoFromOlt) ProtoMessage()    {}
+func (x *OnuAllocIdInfoFromOlt) Reset() {
+	*x = OnuAllocIdInfoFromOlt{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[31]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuAllocIdInfoFromOlt) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuAllocIdInfoFromOlt) ProtoMessage() {}
+
+func (x *OnuAllocIdInfoFromOlt) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 OnuAllocIdInfoFromOlt.ProtoReflect.Descriptor instead.
 func (*OnuAllocIdInfoFromOlt) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{31}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{31}
 }
 
-func (m *OnuAllocIdInfoFromOlt) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuAllocIdInfoFromOlt.Unmarshal(m, b)
-}
-func (m *OnuAllocIdInfoFromOlt) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuAllocIdInfoFromOlt.Marshal(b, m, deterministic)
-}
-func (m *OnuAllocIdInfoFromOlt) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuAllocIdInfoFromOlt.Merge(m, src)
-}
-func (m *OnuAllocIdInfoFromOlt) XXX_Size() int {
-	return xxx_messageInfo_OnuAllocIdInfoFromOlt.Size(m)
-}
-func (m *OnuAllocIdInfoFromOlt) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuAllocIdInfoFromOlt.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuAllocIdInfoFromOlt proto.InternalMessageInfo
-
-func (m *OnuAllocIdInfoFromOlt) GetAllocId() uint32 {
-	if m != nil {
-		return m.AllocId
+func (x *OnuAllocIdInfoFromOlt) GetAllocId() uint32 {
+	if x != nil {
+		return x.AllocId
 	}
 	return 0
 }
 
-func (m *OnuAllocIdInfoFromOlt) GetRxBytes() uint64 {
-	if m != nil {
-		return m.RxBytes
+func (x *OnuAllocIdInfoFromOlt) GetRxBytes() uint64 {
+	if x != nil {
+		return x.RxBytes
 	}
 	return 0
 }
 
 type OnuAllocGemStatsFromOltResponse struct {
-	AllocIdInfo          *OnuAllocIdInfoFromOlt   `protobuf:"bytes,1,opt,name=allocIdInfo,proto3" json:"allocIdInfo,omitempty"`
-	GemPortInfo          []*OnuGemPortInfoFromOlt `protobuf:"bytes,2,rep,name=gemPortInfo,proto3" json:"gemPortInfo,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
-	XXX_unrecognized     []byte                   `json:"-"`
-	XXX_sizecache        int32                    `json:"-"`
+	state         protoimpl.MessageState   `protogen:"open.v1"`
+	AllocIdInfo   *OnuAllocIdInfoFromOlt   `protobuf:"bytes,1,opt,name=allocIdInfo,proto3" json:"allocIdInfo,omitempty"`
+	GemPortInfo   []*OnuGemPortInfoFromOlt `protobuf:"bytes,2,rep,name=gemPortInfo,proto3" json:"gemPortInfo,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *OnuAllocGemStatsFromOltResponse) Reset()         { *m = OnuAllocGemStatsFromOltResponse{} }
-func (m *OnuAllocGemStatsFromOltResponse) String() string { return proto.CompactTextString(m) }
-func (*OnuAllocGemStatsFromOltResponse) ProtoMessage()    {}
+func (x *OnuAllocGemStatsFromOltResponse) Reset() {
+	*x = OnuAllocGemStatsFromOltResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[32]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuAllocGemStatsFromOltResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuAllocGemStatsFromOltResponse) ProtoMessage() {}
+
+func (x *OnuAllocGemStatsFromOltResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 OnuAllocGemStatsFromOltResponse.ProtoReflect.Descriptor instead.
 func (*OnuAllocGemStatsFromOltResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{32}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{32}
 }
 
-func (m *OnuAllocGemStatsFromOltResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuAllocGemStatsFromOltResponse.Unmarshal(m, b)
-}
-func (m *OnuAllocGemStatsFromOltResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuAllocGemStatsFromOltResponse.Marshal(b, m, deterministic)
-}
-func (m *OnuAllocGemStatsFromOltResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuAllocGemStatsFromOltResponse.Merge(m, src)
-}
-func (m *OnuAllocGemStatsFromOltResponse) XXX_Size() int {
-	return xxx_messageInfo_OnuAllocGemStatsFromOltResponse.Size(m)
-}
-func (m *OnuAllocGemStatsFromOltResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuAllocGemStatsFromOltResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuAllocGemStatsFromOltResponse proto.InternalMessageInfo
-
-func (m *OnuAllocGemStatsFromOltResponse) GetAllocIdInfo() *OnuAllocIdInfoFromOlt {
-	if m != nil {
-		return m.AllocIdInfo
+func (x *OnuAllocGemStatsFromOltResponse) GetAllocIdInfo() *OnuAllocIdInfoFromOlt {
+	if x != nil {
+		return x.AllocIdInfo
 	}
 	return nil
 }
 
-func (m *OnuAllocGemStatsFromOltResponse) GetGemPortInfo() []*OnuGemPortInfoFromOlt {
-	if m != nil {
-		return m.GemPortInfo
+func (x *OnuAllocGemStatsFromOltResponse) GetGemPortInfo() []*OnuGemPortInfoFromOlt {
+	if x != nil {
+		return x.GemPortInfo
 	}
 	return nil
 }
 
 type GetOnuStatsFromOltResponse struct {
-	AllocGemStatsInfo    []*OnuAllocGemStatsFromOltResponse `protobuf:"bytes,1,rep,name=allocGemStatsInfo,proto3" json:"allocGemStatsInfo,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
-	XXX_unrecognized     []byte                             `json:"-"`
-	XXX_sizecache        int32                              `json:"-"`
+	state             protoimpl.MessageState             `protogen:"open.v1"`
+	AllocGemStatsInfo []*OnuAllocGemStatsFromOltResponse `protobuf:"bytes,1,rep,name=allocGemStatsInfo,proto3" json:"allocGemStatsInfo,omitempty"`
+	unknownFields     protoimpl.UnknownFields
+	sizeCache         protoimpl.SizeCache
 }
 
-func (m *GetOnuStatsFromOltResponse) Reset()         { *m = GetOnuStatsFromOltResponse{} }
-func (m *GetOnuStatsFromOltResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOnuStatsFromOltResponse) ProtoMessage()    {}
+func (x *GetOnuStatsFromOltResponse) Reset() {
+	*x = GetOnuStatsFromOltResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[33]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuStatsFromOltResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuStatsFromOltResponse) ProtoMessage() {}
+
+func (x *GetOnuStatsFromOltResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuStatsFromOltResponse.ProtoReflect.Descriptor instead.
 func (*GetOnuStatsFromOltResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{33}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{33}
 }
 
-func (m *GetOnuStatsFromOltResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuStatsFromOltResponse.Unmarshal(m, b)
-}
-func (m *GetOnuStatsFromOltResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuStatsFromOltResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOnuStatsFromOltResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuStatsFromOltResponse.Merge(m, src)
-}
-func (m *GetOnuStatsFromOltResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOnuStatsFromOltResponse.Size(m)
-}
-func (m *GetOnuStatsFromOltResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuStatsFromOltResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuStatsFromOltResponse proto.InternalMessageInfo
-
-func (m *GetOnuStatsFromOltResponse) GetAllocGemStatsInfo() []*OnuAllocGemStatsFromOltResponse {
-	if m != nil {
-		return m.AllocGemStatsInfo
+func (x *GetOnuStatsFromOltResponse) GetAllocGemStatsInfo() []*OnuAllocGemStatsFromOltResponse {
+	if x != nil {
+		return x.AllocGemStatsInfo
 	}
 	return nil
 }
 
 type GetOnuCountersResponse struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Types that are valid to be assigned to IsIntfId:
+	//
 	//	*GetOnuCountersResponse_IntfId
 	IsIntfId isGetOnuCountersResponse_IsIntfId `protobuf_oneof:"is_intf_id"`
 	// Types that are valid to be assigned to IsOnuId:
+	//
 	//	*GetOnuCountersResponse_OnuId
 	IsOnuId isGetOnuCountersResponse_IsOnuId `protobuf_oneof:"is_onu_id"`
 	// Types that are valid to be assigned to IsPositiveDrift:
+	//
 	//	*GetOnuCountersResponse_PositiveDrift
 	IsPositiveDrift isGetOnuCountersResponse_IsPositiveDrift `protobuf_oneof:"is_positive_drift"`
 	// Types that are valid to be assigned to IsNegativeDrift:
+	//
 	//	*GetOnuCountersResponse_NegativeDrift
 	IsNegativeDrift isGetOnuCountersResponse_IsNegativeDrift `protobuf_oneof:"is_negative_drift"`
 	// Types that are valid to be assigned to IsDelimiterMissDetection:
+	//
 	//	*GetOnuCountersResponse_DelimiterMissDetection
 	IsDelimiterMissDetection isGetOnuCountersResponse_IsDelimiterMissDetection `protobuf_oneof:"is_delimiter_miss_detection"`
 	// Types that are valid to be assigned to IsBipErrors:
+	//
 	//	*GetOnuCountersResponse_BipErrors
 	IsBipErrors isGetOnuCountersResponse_IsBipErrors `protobuf_oneof:"is_bip_errors"`
 	// Types that are valid to be assigned to IsBipUnits:
+	//
 	//	*GetOnuCountersResponse_BipUnits
 	IsBipUnits isGetOnuCountersResponse_IsBipUnits `protobuf_oneof:"is_bip_units"`
 	// Types that are valid to be assigned to IsFecCorrectedSymbols:
+	//
 	//	*GetOnuCountersResponse_FecCorrectedSymbols
 	IsFecCorrectedSymbols isGetOnuCountersResponse_IsFecCorrectedSymbols `protobuf_oneof:"is_fec_corrected_symbols"`
 	// Types that are valid to be assigned to IsFecCodewordsCorrected:
+	//
 	//	*GetOnuCountersResponse_FecCodewordsCorrected
 	IsFecCodewordsCorrected isGetOnuCountersResponse_IsFecCodewordsCorrected `protobuf_oneof:"is_fec_codewords_corrected"`
 	// Types that are valid to be assigned to IsFecCodewordsUncorrectable:
+	//
 	//	*GetOnuCountersResponse_FecCodewordsUncorrectable
 	IsFecCodewordsUncorrectable isGetOnuCountersResponse_IsFecCodewordsUncorrectable `protobuf_oneof:"is_fec_codewords_uncorrectable"`
 	// Types that are valid to be assigned to IsFecCodewords:
+	//
 	//	*GetOnuCountersResponse_FecCodewords
 	IsFecCodewords isGetOnuCountersResponse_IsFecCodewords `protobuf_oneof:"is_fec_codewords"`
 	// Types that are valid to be assigned to IsFecCorrectedUnits:
+	//
 	//	*GetOnuCountersResponse_FecCorrectedUnits
 	IsFecCorrectedUnits isGetOnuCountersResponse_IsFecCorrectedUnits `protobuf_oneof:"is_fec_corrected_units"`
 	// Types that are valid to be assigned to IsXgemKeyErrors:
+	//
 	//	*GetOnuCountersResponse_XgemKeyErrors
 	IsXgemKeyErrors isGetOnuCountersResponse_IsXgemKeyErrors `protobuf_oneof:"is_xgem_key_errors"`
 	// Types that are valid to be assigned to IsXgemLoss:
+	//
 	//	*GetOnuCountersResponse_XgemLoss
 	IsXgemLoss isGetOnuCountersResponse_IsXgemLoss `protobuf_oneof:"is_xgem_loss"`
 	// Types that are valid to be assigned to IsRxPloamsError:
+	//
 	//	*GetOnuCountersResponse_RxPloamsError
 	IsRxPloamsError isGetOnuCountersResponse_IsRxPloamsError `protobuf_oneof:"is_rx_ploams_error"`
 	// Types that are valid to be assigned to IsRxPloamsNonIdle:
+	//
 	//	*GetOnuCountersResponse_RxPloamsNonIdle
 	IsRxPloamsNonIdle isGetOnuCountersResponse_IsRxPloamsNonIdle `protobuf_oneof:"is_rx_ploams_non_idle"`
 	// Types that are valid to be assigned to IsRxOmci:
+	//
 	//	*GetOnuCountersResponse_RxOmci
 	IsRxOmci isGetOnuCountersResponse_IsRxOmci `protobuf_oneof:"is_rx_omci"`
 	// Types that are valid to be assigned to IsTxOmci:
+	//
 	//	*GetOnuCountersResponse_TxOmci
 	IsTxOmci isGetOnuCountersResponse_IsTxOmci `protobuf_oneof:"is_tx_omci"`
 	// Types that are valid to be assigned to IsRxOmciPacketsCrcError:
+	//
 	//	*GetOnuCountersResponse_RxOmciPacketsCrcError
 	IsRxOmciPacketsCrcError isGetOnuCountersResponse_IsRxOmciPacketsCrcError `protobuf_oneof:"is_rx_omci_packets_crc_error"`
 	// Types that are valid to be assigned to IsRxBytes:
+	//
 	//	*GetOnuCountersResponse_RxBytes
 	IsRxBytes isGetOnuCountersResponse_IsRxBytes `protobuf_oneof:"is_rx_bytes"`
 	// Types that are valid to be assigned to IsRxPackets:
+	//
 	//	*GetOnuCountersResponse_RxPackets
 	IsRxPackets isGetOnuCountersResponse_IsRxPackets `protobuf_oneof:"is_rx_packets"`
 	// Types that are valid to be assigned to IsTxBytes:
+	//
 	//	*GetOnuCountersResponse_TxBytes
 	IsTxBytes isGetOnuCountersResponse_IsTxBytes `protobuf_oneof:"is_tx_bytes"`
 	// Types that are valid to be assigned to IsTxPackets:
+	//
 	//	*GetOnuCountersResponse_TxPackets
 	IsTxPackets isGetOnuCountersResponse_IsTxPackets `protobuf_oneof:"is_tx_packets"`
 	// Types that are valid to be assigned to IsBerReported:
+	//
 	//	*GetOnuCountersResponse_BerReported
 	IsBerReported isGetOnuCountersResponse_IsBerReported `protobuf_oneof:"is_ber_reported"`
 	// Types that are valid to be assigned to IsLcdgErrors:
+	//
 	//	*GetOnuCountersResponse_LcdgErrors
 	IsLcdgErrors isGetOnuCountersResponse_IsLcdgErrors `protobuf_oneof:"is_lcdg_errors"`
 	// Types that are valid to be assigned to IsRdiErrors:
+	//
 	//	*GetOnuCountersResponse_RdiErrors
 	IsRdiErrors isGetOnuCountersResponse_IsRdiErrors `protobuf_oneof:"is_rdi_errors"`
 	// Types that are valid to be assigned to IsTimestamp:
+	//
 	//	*GetOnuCountersResponse_Timestamp
 	IsTimestamp isGetOnuCountersResponse_IsTimestamp `protobuf_oneof:"is_timestamp"`
 	// Types that are valid to be assigned to IsHecErrors:
+	//
 	//	*GetOnuCountersResponse_HecErrors
-	IsHecErrors          isGetOnuCountersResponse_IsHecErrors `protobuf_oneof:"is_hec_errors"`
-	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
-	XXX_unrecognized     []byte                               `json:"-"`
-	XXX_sizecache        int32                                `json:"-"`
+	IsHecErrors   isGetOnuCountersResponse_IsHecErrors `protobuf_oneof:"is_hec_errors"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOnuCountersResponse) Reset()         { *m = GetOnuCountersResponse{} }
-func (m *GetOnuCountersResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOnuCountersResponse) ProtoMessage()    {}
+func (x *GetOnuCountersResponse) Reset() {
+	*x = GetOnuCountersResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[34]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuCountersResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuCountersResponse) ProtoMessage() {}
+
+func (x *GetOnuCountersResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuCountersResponse.ProtoReflect.Descriptor instead.
 func (*GetOnuCountersResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{34}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{34}
 }
 
-func (m *GetOnuCountersResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuCountersResponse.Unmarshal(m, b)
-}
-func (m *GetOnuCountersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuCountersResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOnuCountersResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuCountersResponse.Merge(m, src)
-}
-func (m *GetOnuCountersResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOnuCountersResponse.Size(m)
-}
-func (m *GetOnuCountersResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuCountersResponse.DiscardUnknown(m)
+func (x *GetOnuCountersResponse) GetIsIntfId() isGetOnuCountersResponse_IsIntfId {
+	if x != nil {
+		return x.IsIntfId
+	}
+	return nil
 }
 
-var xxx_messageInfo_GetOnuCountersResponse proto.InternalMessageInfo
+func (x *GetOnuCountersResponse) GetIntfId() uint32 {
+	if x != nil {
+		if x, ok := x.IsIntfId.(*GetOnuCountersResponse_IntfId); ok {
+			return x.IntfId
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsOnuId() isGetOnuCountersResponse_IsOnuId {
+	if x != nil {
+		return x.IsOnuId
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetOnuId() uint32 {
+	if x != nil {
+		if x, ok := x.IsOnuId.(*GetOnuCountersResponse_OnuId); ok {
+			return x.OnuId
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsPositiveDrift() isGetOnuCountersResponse_IsPositiveDrift {
+	if x != nil {
+		return x.IsPositiveDrift
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetPositiveDrift() uint64 {
+	if x != nil {
+		if x, ok := x.IsPositiveDrift.(*GetOnuCountersResponse_PositiveDrift); ok {
+			return x.PositiveDrift
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsNegativeDrift() isGetOnuCountersResponse_IsNegativeDrift {
+	if x != nil {
+		return x.IsNegativeDrift
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetNegativeDrift() uint64 {
+	if x != nil {
+		if x, ok := x.IsNegativeDrift.(*GetOnuCountersResponse_NegativeDrift); ok {
+			return x.NegativeDrift
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsDelimiterMissDetection() isGetOnuCountersResponse_IsDelimiterMissDetection {
+	if x != nil {
+		return x.IsDelimiterMissDetection
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetDelimiterMissDetection() uint64 {
+	if x != nil {
+		if x, ok := x.IsDelimiterMissDetection.(*GetOnuCountersResponse_DelimiterMissDetection); ok {
+			return x.DelimiterMissDetection
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsBipErrors() isGetOnuCountersResponse_IsBipErrors {
+	if x != nil {
+		return x.IsBipErrors
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetBipErrors() uint64 {
+	if x != nil {
+		if x, ok := x.IsBipErrors.(*GetOnuCountersResponse_BipErrors); ok {
+			return x.BipErrors
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsBipUnits() isGetOnuCountersResponse_IsBipUnits {
+	if x != nil {
+		return x.IsBipUnits
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetBipUnits() uint64 {
+	if x != nil {
+		if x, ok := x.IsBipUnits.(*GetOnuCountersResponse_BipUnits); ok {
+			return x.BipUnits
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsFecCorrectedSymbols() isGetOnuCountersResponse_IsFecCorrectedSymbols {
+	if x != nil {
+		return x.IsFecCorrectedSymbols
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetFecCorrectedSymbols() uint64 {
+	if x != nil {
+		if x, ok := x.IsFecCorrectedSymbols.(*GetOnuCountersResponse_FecCorrectedSymbols); ok {
+			return x.FecCorrectedSymbols
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsFecCodewordsCorrected() isGetOnuCountersResponse_IsFecCodewordsCorrected {
+	if x != nil {
+		return x.IsFecCodewordsCorrected
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetFecCodewordsCorrected() uint64 {
+	if x != nil {
+		if x, ok := x.IsFecCodewordsCorrected.(*GetOnuCountersResponse_FecCodewordsCorrected); ok {
+			return x.FecCodewordsCorrected
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsFecCodewordsUncorrectable() isGetOnuCountersResponse_IsFecCodewordsUncorrectable {
+	if x != nil {
+		return x.IsFecCodewordsUncorrectable
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetFecCodewordsUncorrectable() uint64 {
+	if x != nil {
+		if x, ok := x.IsFecCodewordsUncorrectable.(*GetOnuCountersResponse_FecCodewordsUncorrectable); ok {
+			return x.FecCodewordsUncorrectable
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsFecCodewords() isGetOnuCountersResponse_IsFecCodewords {
+	if x != nil {
+		return x.IsFecCodewords
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetFecCodewords() uint64 {
+	if x != nil {
+		if x, ok := x.IsFecCodewords.(*GetOnuCountersResponse_FecCodewords); ok {
+			return x.FecCodewords
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsFecCorrectedUnits() isGetOnuCountersResponse_IsFecCorrectedUnits {
+	if x != nil {
+		return x.IsFecCorrectedUnits
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetFecCorrectedUnits() uint64 {
+	if x != nil {
+		if x, ok := x.IsFecCorrectedUnits.(*GetOnuCountersResponse_FecCorrectedUnits); ok {
+			return x.FecCorrectedUnits
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsXgemKeyErrors() isGetOnuCountersResponse_IsXgemKeyErrors {
+	if x != nil {
+		return x.IsXgemKeyErrors
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetXgemKeyErrors() uint64 {
+	if x != nil {
+		if x, ok := x.IsXgemKeyErrors.(*GetOnuCountersResponse_XgemKeyErrors); ok {
+			return x.XgemKeyErrors
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsXgemLoss() isGetOnuCountersResponse_IsXgemLoss {
+	if x != nil {
+		return x.IsXgemLoss
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetXgemLoss() uint64 {
+	if x != nil {
+		if x, ok := x.IsXgemLoss.(*GetOnuCountersResponse_XgemLoss); ok {
+			return x.XgemLoss
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsRxPloamsError() isGetOnuCountersResponse_IsRxPloamsError {
+	if x != nil {
+		return x.IsRxPloamsError
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetRxPloamsError() uint64 {
+	if x != nil {
+		if x, ok := x.IsRxPloamsError.(*GetOnuCountersResponse_RxPloamsError); ok {
+			return x.RxPloamsError
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsRxPloamsNonIdle() isGetOnuCountersResponse_IsRxPloamsNonIdle {
+	if x != nil {
+		return x.IsRxPloamsNonIdle
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetRxPloamsNonIdle() uint64 {
+	if x != nil {
+		if x, ok := x.IsRxPloamsNonIdle.(*GetOnuCountersResponse_RxPloamsNonIdle); ok {
+			return x.RxPloamsNonIdle
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsRxOmci() isGetOnuCountersResponse_IsRxOmci {
+	if x != nil {
+		return x.IsRxOmci
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetRxOmci() uint64 {
+	if x != nil {
+		if x, ok := x.IsRxOmci.(*GetOnuCountersResponse_RxOmci); ok {
+			return x.RxOmci
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsTxOmci() isGetOnuCountersResponse_IsTxOmci {
+	if x != nil {
+		return x.IsTxOmci
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetTxOmci() uint64 {
+	if x != nil {
+		if x, ok := x.IsTxOmci.(*GetOnuCountersResponse_TxOmci); ok {
+			return x.TxOmci
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsRxOmciPacketsCrcError() isGetOnuCountersResponse_IsRxOmciPacketsCrcError {
+	if x != nil {
+		return x.IsRxOmciPacketsCrcError
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetRxOmciPacketsCrcError() uint64 {
+	if x != nil {
+		if x, ok := x.IsRxOmciPacketsCrcError.(*GetOnuCountersResponse_RxOmciPacketsCrcError); ok {
+			return x.RxOmciPacketsCrcError
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsRxBytes() isGetOnuCountersResponse_IsRxBytes {
+	if x != nil {
+		return x.IsRxBytes
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetRxBytes() uint64 {
+	if x != nil {
+		if x, ok := x.IsRxBytes.(*GetOnuCountersResponse_RxBytes); ok {
+			return x.RxBytes
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsRxPackets() isGetOnuCountersResponse_IsRxPackets {
+	if x != nil {
+		return x.IsRxPackets
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetRxPackets() uint64 {
+	if x != nil {
+		if x, ok := x.IsRxPackets.(*GetOnuCountersResponse_RxPackets); ok {
+			return x.RxPackets
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsTxBytes() isGetOnuCountersResponse_IsTxBytes {
+	if x != nil {
+		return x.IsTxBytes
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetTxBytes() uint64 {
+	if x != nil {
+		if x, ok := x.IsTxBytes.(*GetOnuCountersResponse_TxBytes); ok {
+			return x.TxBytes
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsTxPackets() isGetOnuCountersResponse_IsTxPackets {
+	if x != nil {
+		return x.IsTxPackets
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetTxPackets() uint64 {
+	if x != nil {
+		if x, ok := x.IsTxPackets.(*GetOnuCountersResponse_TxPackets); ok {
+			return x.TxPackets
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsBerReported() isGetOnuCountersResponse_IsBerReported {
+	if x != nil {
+		return x.IsBerReported
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetBerReported() uint64 {
+	if x != nil {
+		if x, ok := x.IsBerReported.(*GetOnuCountersResponse_BerReported); ok {
+			return x.BerReported
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsLcdgErrors() isGetOnuCountersResponse_IsLcdgErrors {
+	if x != nil {
+		return x.IsLcdgErrors
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetLcdgErrors() uint64 {
+	if x != nil {
+		if x, ok := x.IsLcdgErrors.(*GetOnuCountersResponse_LcdgErrors); ok {
+			return x.LcdgErrors
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsRdiErrors() isGetOnuCountersResponse_IsRdiErrors {
+	if x != nil {
+		return x.IsRdiErrors
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetRdiErrors() uint64 {
+	if x != nil {
+		if x, ok := x.IsRdiErrors.(*GetOnuCountersResponse_RdiErrors); ok {
+			return x.RdiErrors
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsTimestamp() isGetOnuCountersResponse_IsTimestamp {
+	if x != nil {
+		return x.IsTimestamp
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetTimestamp() uint32 {
+	if x != nil {
+		if x, ok := x.IsTimestamp.(*GetOnuCountersResponse_Timestamp); ok {
+			return x.Timestamp
+		}
+	}
+	return 0
+}
+
+func (x *GetOnuCountersResponse) GetIsHecErrors() isGetOnuCountersResponse_IsHecErrors {
+	if x != nil {
+		return x.IsHecErrors
+	}
+	return nil
+}
+
+func (x *GetOnuCountersResponse) GetHecErrors() uint64 {
+	if x != nil {
+		if x, ok := x.IsHecErrors.(*GetOnuCountersResponse_HecErrors); ok {
+			return x.HecErrors
+		}
+	}
+	return 0
+}
 
 type isGetOnuCountersResponse_IsIntfId interface {
 	isGetOnuCountersResponse_IsIntfId()
@@ -2539,20 +3449,6 @@
 
 func (*GetOnuCountersResponse_IntfId) isGetOnuCountersResponse_IsIntfId() {}
 
-func (m *GetOnuCountersResponse) GetIsIntfId() isGetOnuCountersResponse_IsIntfId {
-	if m != nil {
-		return m.IsIntfId
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetIntfId() uint32 {
-	if x, ok := m.GetIsIntfId().(*GetOnuCountersResponse_IntfId); ok {
-		return x.IntfId
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsOnuId interface {
 	isGetOnuCountersResponse_IsOnuId()
 }
@@ -2563,20 +3459,6 @@
 
 func (*GetOnuCountersResponse_OnuId) isGetOnuCountersResponse_IsOnuId() {}
 
-func (m *GetOnuCountersResponse) GetIsOnuId() isGetOnuCountersResponse_IsOnuId {
-	if m != nil {
-		return m.IsOnuId
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetOnuId() uint32 {
-	if x, ok := m.GetIsOnuId().(*GetOnuCountersResponse_OnuId); ok {
-		return x.OnuId
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsPositiveDrift interface {
 	isGetOnuCountersResponse_IsPositiveDrift()
 }
@@ -2587,20 +3469,6 @@
 
 func (*GetOnuCountersResponse_PositiveDrift) isGetOnuCountersResponse_IsPositiveDrift() {}
 
-func (m *GetOnuCountersResponse) GetIsPositiveDrift() isGetOnuCountersResponse_IsPositiveDrift {
-	if m != nil {
-		return m.IsPositiveDrift
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetPositiveDrift() uint64 {
-	if x, ok := m.GetIsPositiveDrift().(*GetOnuCountersResponse_PositiveDrift); ok {
-		return x.PositiveDrift
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsNegativeDrift interface {
 	isGetOnuCountersResponse_IsNegativeDrift()
 }
@@ -2611,20 +3479,6 @@
 
 func (*GetOnuCountersResponse_NegativeDrift) isGetOnuCountersResponse_IsNegativeDrift() {}
 
-func (m *GetOnuCountersResponse) GetIsNegativeDrift() isGetOnuCountersResponse_IsNegativeDrift {
-	if m != nil {
-		return m.IsNegativeDrift
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetNegativeDrift() uint64 {
-	if x, ok := m.GetIsNegativeDrift().(*GetOnuCountersResponse_NegativeDrift); ok {
-		return x.NegativeDrift
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsDelimiterMissDetection interface {
 	isGetOnuCountersResponse_IsDelimiterMissDetection()
 }
@@ -2636,20 +3490,6 @@
 func (*GetOnuCountersResponse_DelimiterMissDetection) isGetOnuCountersResponse_IsDelimiterMissDetection() {
 }
 
-func (m *GetOnuCountersResponse) GetIsDelimiterMissDetection() isGetOnuCountersResponse_IsDelimiterMissDetection {
-	if m != nil {
-		return m.IsDelimiterMissDetection
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetDelimiterMissDetection() uint64 {
-	if x, ok := m.GetIsDelimiterMissDetection().(*GetOnuCountersResponse_DelimiterMissDetection); ok {
-		return x.DelimiterMissDetection
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsBipErrors interface {
 	isGetOnuCountersResponse_IsBipErrors()
 }
@@ -2660,20 +3500,6 @@
 
 func (*GetOnuCountersResponse_BipErrors) isGetOnuCountersResponse_IsBipErrors() {}
 
-func (m *GetOnuCountersResponse) GetIsBipErrors() isGetOnuCountersResponse_IsBipErrors {
-	if m != nil {
-		return m.IsBipErrors
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetBipErrors() uint64 {
-	if x, ok := m.GetIsBipErrors().(*GetOnuCountersResponse_BipErrors); ok {
-		return x.BipErrors
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsBipUnits interface {
 	isGetOnuCountersResponse_IsBipUnits()
 }
@@ -2684,20 +3510,6 @@
 
 func (*GetOnuCountersResponse_BipUnits) isGetOnuCountersResponse_IsBipUnits() {}
 
-func (m *GetOnuCountersResponse) GetIsBipUnits() isGetOnuCountersResponse_IsBipUnits {
-	if m != nil {
-		return m.IsBipUnits
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetBipUnits() uint64 {
-	if x, ok := m.GetIsBipUnits().(*GetOnuCountersResponse_BipUnits); ok {
-		return x.BipUnits
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsFecCorrectedSymbols interface {
 	isGetOnuCountersResponse_IsFecCorrectedSymbols()
 }
@@ -2708,20 +3520,6 @@
 
 func (*GetOnuCountersResponse_FecCorrectedSymbols) isGetOnuCountersResponse_IsFecCorrectedSymbols() {}
 
-func (m *GetOnuCountersResponse) GetIsFecCorrectedSymbols() isGetOnuCountersResponse_IsFecCorrectedSymbols {
-	if m != nil {
-		return m.IsFecCorrectedSymbols
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetFecCorrectedSymbols() uint64 {
-	if x, ok := m.GetIsFecCorrectedSymbols().(*GetOnuCountersResponse_FecCorrectedSymbols); ok {
-		return x.FecCorrectedSymbols
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsFecCodewordsCorrected interface {
 	isGetOnuCountersResponse_IsFecCodewordsCorrected()
 }
@@ -2733,20 +3531,6 @@
 func (*GetOnuCountersResponse_FecCodewordsCorrected) isGetOnuCountersResponse_IsFecCodewordsCorrected() {
 }
 
-func (m *GetOnuCountersResponse) GetIsFecCodewordsCorrected() isGetOnuCountersResponse_IsFecCodewordsCorrected {
-	if m != nil {
-		return m.IsFecCodewordsCorrected
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetFecCodewordsCorrected() uint64 {
-	if x, ok := m.GetIsFecCodewordsCorrected().(*GetOnuCountersResponse_FecCodewordsCorrected); ok {
-		return x.FecCodewordsCorrected
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsFecCodewordsUncorrectable interface {
 	isGetOnuCountersResponse_IsFecCodewordsUncorrectable()
 }
@@ -2758,20 +3542,6 @@
 func (*GetOnuCountersResponse_FecCodewordsUncorrectable) isGetOnuCountersResponse_IsFecCodewordsUncorrectable() {
 }
 
-func (m *GetOnuCountersResponse) GetIsFecCodewordsUncorrectable() isGetOnuCountersResponse_IsFecCodewordsUncorrectable {
-	if m != nil {
-		return m.IsFecCodewordsUncorrectable
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetFecCodewordsUncorrectable() uint64 {
-	if x, ok := m.GetIsFecCodewordsUncorrectable().(*GetOnuCountersResponse_FecCodewordsUncorrectable); ok {
-		return x.FecCodewordsUncorrectable
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsFecCodewords interface {
 	isGetOnuCountersResponse_IsFecCodewords()
 }
@@ -2782,20 +3552,6 @@
 
 func (*GetOnuCountersResponse_FecCodewords) isGetOnuCountersResponse_IsFecCodewords() {}
 
-func (m *GetOnuCountersResponse) GetIsFecCodewords() isGetOnuCountersResponse_IsFecCodewords {
-	if m != nil {
-		return m.IsFecCodewords
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetFecCodewords() uint64 {
-	if x, ok := m.GetIsFecCodewords().(*GetOnuCountersResponse_FecCodewords); ok {
-		return x.FecCodewords
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsFecCorrectedUnits interface {
 	isGetOnuCountersResponse_IsFecCorrectedUnits()
 }
@@ -2806,20 +3562,6 @@
 
 func (*GetOnuCountersResponse_FecCorrectedUnits) isGetOnuCountersResponse_IsFecCorrectedUnits() {}
 
-func (m *GetOnuCountersResponse) GetIsFecCorrectedUnits() isGetOnuCountersResponse_IsFecCorrectedUnits {
-	if m != nil {
-		return m.IsFecCorrectedUnits
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetFecCorrectedUnits() uint64 {
-	if x, ok := m.GetIsFecCorrectedUnits().(*GetOnuCountersResponse_FecCorrectedUnits); ok {
-		return x.FecCorrectedUnits
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsXgemKeyErrors interface {
 	isGetOnuCountersResponse_IsXgemKeyErrors()
 }
@@ -2830,20 +3572,6 @@
 
 func (*GetOnuCountersResponse_XgemKeyErrors) isGetOnuCountersResponse_IsXgemKeyErrors() {}
 
-func (m *GetOnuCountersResponse) GetIsXgemKeyErrors() isGetOnuCountersResponse_IsXgemKeyErrors {
-	if m != nil {
-		return m.IsXgemKeyErrors
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetXgemKeyErrors() uint64 {
-	if x, ok := m.GetIsXgemKeyErrors().(*GetOnuCountersResponse_XgemKeyErrors); ok {
-		return x.XgemKeyErrors
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsXgemLoss interface {
 	isGetOnuCountersResponse_IsXgemLoss()
 }
@@ -2854,20 +3582,6 @@
 
 func (*GetOnuCountersResponse_XgemLoss) isGetOnuCountersResponse_IsXgemLoss() {}
 
-func (m *GetOnuCountersResponse) GetIsXgemLoss() isGetOnuCountersResponse_IsXgemLoss {
-	if m != nil {
-		return m.IsXgemLoss
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetXgemLoss() uint64 {
-	if x, ok := m.GetIsXgemLoss().(*GetOnuCountersResponse_XgemLoss); ok {
-		return x.XgemLoss
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsRxPloamsError interface {
 	isGetOnuCountersResponse_IsRxPloamsError()
 }
@@ -2878,20 +3592,6 @@
 
 func (*GetOnuCountersResponse_RxPloamsError) isGetOnuCountersResponse_IsRxPloamsError() {}
 
-func (m *GetOnuCountersResponse) GetIsRxPloamsError() isGetOnuCountersResponse_IsRxPloamsError {
-	if m != nil {
-		return m.IsRxPloamsError
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetRxPloamsError() uint64 {
-	if x, ok := m.GetIsRxPloamsError().(*GetOnuCountersResponse_RxPloamsError); ok {
-		return x.RxPloamsError
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsRxPloamsNonIdle interface {
 	isGetOnuCountersResponse_IsRxPloamsNonIdle()
 }
@@ -2902,20 +3602,6 @@
 
 func (*GetOnuCountersResponse_RxPloamsNonIdle) isGetOnuCountersResponse_IsRxPloamsNonIdle() {}
 
-func (m *GetOnuCountersResponse) GetIsRxPloamsNonIdle() isGetOnuCountersResponse_IsRxPloamsNonIdle {
-	if m != nil {
-		return m.IsRxPloamsNonIdle
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetRxPloamsNonIdle() uint64 {
-	if x, ok := m.GetIsRxPloamsNonIdle().(*GetOnuCountersResponse_RxPloamsNonIdle); ok {
-		return x.RxPloamsNonIdle
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsRxOmci interface {
 	isGetOnuCountersResponse_IsRxOmci()
 }
@@ -2926,20 +3612,6 @@
 
 func (*GetOnuCountersResponse_RxOmci) isGetOnuCountersResponse_IsRxOmci() {}
 
-func (m *GetOnuCountersResponse) GetIsRxOmci() isGetOnuCountersResponse_IsRxOmci {
-	if m != nil {
-		return m.IsRxOmci
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetRxOmci() uint64 {
-	if x, ok := m.GetIsRxOmci().(*GetOnuCountersResponse_RxOmci); ok {
-		return x.RxOmci
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsTxOmci interface {
 	isGetOnuCountersResponse_IsTxOmci()
 }
@@ -2950,20 +3622,6 @@
 
 func (*GetOnuCountersResponse_TxOmci) isGetOnuCountersResponse_IsTxOmci() {}
 
-func (m *GetOnuCountersResponse) GetIsTxOmci() isGetOnuCountersResponse_IsTxOmci {
-	if m != nil {
-		return m.IsTxOmci
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetTxOmci() uint64 {
-	if x, ok := m.GetIsTxOmci().(*GetOnuCountersResponse_TxOmci); ok {
-		return x.TxOmci
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsRxOmciPacketsCrcError interface {
 	isGetOnuCountersResponse_IsRxOmciPacketsCrcError()
 }
@@ -2975,20 +3633,6 @@
 func (*GetOnuCountersResponse_RxOmciPacketsCrcError) isGetOnuCountersResponse_IsRxOmciPacketsCrcError() {
 }
 
-func (m *GetOnuCountersResponse) GetIsRxOmciPacketsCrcError() isGetOnuCountersResponse_IsRxOmciPacketsCrcError {
-	if m != nil {
-		return m.IsRxOmciPacketsCrcError
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetRxOmciPacketsCrcError() uint64 {
-	if x, ok := m.GetIsRxOmciPacketsCrcError().(*GetOnuCountersResponse_RxOmciPacketsCrcError); ok {
-		return x.RxOmciPacketsCrcError
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsRxBytes interface {
 	isGetOnuCountersResponse_IsRxBytes()
 }
@@ -2999,20 +3643,6 @@
 
 func (*GetOnuCountersResponse_RxBytes) isGetOnuCountersResponse_IsRxBytes() {}
 
-func (m *GetOnuCountersResponse) GetIsRxBytes() isGetOnuCountersResponse_IsRxBytes {
-	if m != nil {
-		return m.IsRxBytes
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetRxBytes() uint64 {
-	if x, ok := m.GetIsRxBytes().(*GetOnuCountersResponse_RxBytes); ok {
-		return x.RxBytes
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsRxPackets interface {
 	isGetOnuCountersResponse_IsRxPackets()
 }
@@ -3023,20 +3653,6 @@
 
 func (*GetOnuCountersResponse_RxPackets) isGetOnuCountersResponse_IsRxPackets() {}
 
-func (m *GetOnuCountersResponse) GetIsRxPackets() isGetOnuCountersResponse_IsRxPackets {
-	if m != nil {
-		return m.IsRxPackets
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetRxPackets() uint64 {
-	if x, ok := m.GetIsRxPackets().(*GetOnuCountersResponse_RxPackets); ok {
-		return x.RxPackets
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsTxBytes interface {
 	isGetOnuCountersResponse_IsTxBytes()
 }
@@ -3047,20 +3663,6 @@
 
 func (*GetOnuCountersResponse_TxBytes) isGetOnuCountersResponse_IsTxBytes() {}
 
-func (m *GetOnuCountersResponse) GetIsTxBytes() isGetOnuCountersResponse_IsTxBytes {
-	if m != nil {
-		return m.IsTxBytes
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetTxBytes() uint64 {
-	if x, ok := m.GetIsTxBytes().(*GetOnuCountersResponse_TxBytes); ok {
-		return x.TxBytes
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsTxPackets interface {
 	isGetOnuCountersResponse_IsTxPackets()
 }
@@ -3071,20 +3673,6 @@
 
 func (*GetOnuCountersResponse_TxPackets) isGetOnuCountersResponse_IsTxPackets() {}
 
-func (m *GetOnuCountersResponse) GetIsTxPackets() isGetOnuCountersResponse_IsTxPackets {
-	if m != nil {
-		return m.IsTxPackets
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetTxPackets() uint64 {
-	if x, ok := m.GetIsTxPackets().(*GetOnuCountersResponse_TxPackets); ok {
-		return x.TxPackets
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsBerReported interface {
 	isGetOnuCountersResponse_IsBerReported()
 }
@@ -3095,20 +3683,6 @@
 
 func (*GetOnuCountersResponse_BerReported) isGetOnuCountersResponse_IsBerReported() {}
 
-func (m *GetOnuCountersResponse) GetIsBerReported() isGetOnuCountersResponse_IsBerReported {
-	if m != nil {
-		return m.IsBerReported
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetBerReported() uint64 {
-	if x, ok := m.GetIsBerReported().(*GetOnuCountersResponse_BerReported); ok {
-		return x.BerReported
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsLcdgErrors interface {
 	isGetOnuCountersResponse_IsLcdgErrors()
 }
@@ -3119,20 +3693,6 @@
 
 func (*GetOnuCountersResponse_LcdgErrors) isGetOnuCountersResponse_IsLcdgErrors() {}
 
-func (m *GetOnuCountersResponse) GetIsLcdgErrors() isGetOnuCountersResponse_IsLcdgErrors {
-	if m != nil {
-		return m.IsLcdgErrors
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetLcdgErrors() uint64 {
-	if x, ok := m.GetIsLcdgErrors().(*GetOnuCountersResponse_LcdgErrors); ok {
-		return x.LcdgErrors
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsRdiErrors interface {
 	isGetOnuCountersResponse_IsRdiErrors()
 }
@@ -3143,44 +3703,17 @@
 
 func (*GetOnuCountersResponse_RdiErrors) isGetOnuCountersResponse_IsRdiErrors() {}
 
-func (m *GetOnuCountersResponse) GetIsRdiErrors() isGetOnuCountersResponse_IsRdiErrors {
-	if m != nil {
-		return m.IsRdiErrors
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetRdiErrors() uint64 {
-	if x, ok := m.GetIsRdiErrors().(*GetOnuCountersResponse_RdiErrors); ok {
-		return x.RdiErrors
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsTimestamp interface {
 	isGetOnuCountersResponse_IsTimestamp()
 }
 
 type GetOnuCountersResponse_Timestamp struct {
+	// reported timestamp in seconds since epoch
 	Timestamp uint32 `protobuf:"fixed32,27,opt,name=timestamp,proto3,oneof"`
 }
 
 func (*GetOnuCountersResponse_Timestamp) isGetOnuCountersResponse_IsTimestamp() {}
 
-func (m *GetOnuCountersResponse) GetIsTimestamp() isGetOnuCountersResponse_IsTimestamp {
-	if m != nil {
-		return m.IsTimestamp
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetTimestamp() uint32 {
-	if x, ok := m.GetIsTimestamp().(*GetOnuCountersResponse_Timestamp); ok {
-		return x.Timestamp
-	}
-	return 0
-}
-
 type isGetOnuCountersResponse_IsHecErrors interface {
 	isGetOnuCountersResponse_IsHecErrors()
 }
@@ -3191,477 +3724,458 @@
 
 func (*GetOnuCountersResponse_HecErrors) isGetOnuCountersResponse_IsHecErrors() {}
 
-func (m *GetOnuCountersResponse) GetIsHecErrors() isGetOnuCountersResponse_IsHecErrors {
-	if m != nil {
-		return m.IsHecErrors
-	}
-	return nil
-}
-
-func (m *GetOnuCountersResponse) GetHecErrors() uint64 {
-	if x, ok := m.GetIsHecErrors().(*GetOnuCountersResponse_HecErrors); ok {
-		return x.HecErrors
-	}
-	return 0
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*GetOnuCountersResponse) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*GetOnuCountersResponse_IntfId)(nil),
-		(*GetOnuCountersResponse_OnuId)(nil),
-		(*GetOnuCountersResponse_PositiveDrift)(nil),
-		(*GetOnuCountersResponse_NegativeDrift)(nil),
-		(*GetOnuCountersResponse_DelimiterMissDetection)(nil),
-		(*GetOnuCountersResponse_BipErrors)(nil),
-		(*GetOnuCountersResponse_BipUnits)(nil),
-		(*GetOnuCountersResponse_FecCorrectedSymbols)(nil),
-		(*GetOnuCountersResponse_FecCodewordsCorrected)(nil),
-		(*GetOnuCountersResponse_FecCodewordsUncorrectable)(nil),
-		(*GetOnuCountersResponse_FecCodewords)(nil),
-		(*GetOnuCountersResponse_FecCorrectedUnits)(nil),
-		(*GetOnuCountersResponse_XgemKeyErrors)(nil),
-		(*GetOnuCountersResponse_XgemLoss)(nil),
-		(*GetOnuCountersResponse_RxPloamsError)(nil),
-		(*GetOnuCountersResponse_RxPloamsNonIdle)(nil),
-		(*GetOnuCountersResponse_RxOmci)(nil),
-		(*GetOnuCountersResponse_TxOmci)(nil),
-		(*GetOnuCountersResponse_RxOmciPacketsCrcError)(nil),
-		(*GetOnuCountersResponse_RxBytes)(nil),
-		(*GetOnuCountersResponse_RxPackets)(nil),
-		(*GetOnuCountersResponse_TxBytes)(nil),
-		(*GetOnuCountersResponse_TxPackets)(nil),
-		(*GetOnuCountersResponse_BerReported)(nil),
-		(*GetOnuCountersResponse_LcdgErrors)(nil),
-		(*GetOnuCountersResponse_RdiErrors)(nil),
-		(*GetOnuCountersResponse_Timestamp)(nil),
-		(*GetOnuCountersResponse_HecErrors)(nil),
-	}
-}
-
 type OmciEthernetFrameExtendedPm struct {
-	DropEvents               uint64   `protobuf:"fixed64,1,opt,name=drop_events,json=dropEvents,proto3" json:"drop_events,omitempty"`
-	Octets                   uint64   `protobuf:"fixed64,2,opt,name=octets,proto3" json:"octets,omitempty"`
-	Frames                   uint64   `protobuf:"fixed64,3,opt,name=frames,proto3" json:"frames,omitempty"`
-	BroadcastFrames          uint64   `protobuf:"fixed64,4,opt,name=broadcast_frames,json=broadcastFrames,proto3" json:"broadcast_frames,omitempty"`
-	MulticastFrames          uint64   `protobuf:"fixed64,5,opt,name=multicast_frames,json=multicastFrames,proto3" json:"multicast_frames,omitempty"`
-	CrcErroredFrames         uint64   `protobuf:"fixed64,6,opt,name=crc_errored_frames,json=crcErroredFrames,proto3" json:"crc_errored_frames,omitempty"`
-	UndersizeFrames          uint64   `protobuf:"fixed64,7,opt,name=undersize_frames,json=undersizeFrames,proto3" json:"undersize_frames,omitempty"`
-	OversizeFrames           uint64   `protobuf:"fixed64,8,opt,name=oversize_frames,json=oversizeFrames,proto3" json:"oversize_frames,omitempty"`
-	Frames_64Octets          uint64   `protobuf:"fixed64,9,opt,name=frames_64_octets,json=frames64Octets,proto3" json:"frames_64_octets,omitempty"`
-	Frames_65To_127Octets    uint64   `protobuf:"fixed64,10,opt,name=frames_65_to_127_octets,json=frames65To127Octets,proto3" json:"frames_65_to_127_octets,omitempty"`
-	Frames_128To_255Octets   uint64   `protobuf:"fixed64,11,opt,name=frames_128_to_255_octets,json=frames128To255Octets,proto3" json:"frames_128_to_255_octets,omitempty"`
-	Frames_256To_511Octets   uint64   `protobuf:"fixed64,12,opt,name=frames_256_to_511_octets,json=frames256To511Octets,proto3" json:"frames_256_to_511_octets,omitempty"`
-	Frames_512To_1023Octets  uint64   `protobuf:"fixed64,13,opt,name=frames_512_to_1023_octets,json=frames512To1023Octets,proto3" json:"frames_512_to_1023_octets,omitempty"`
-	Frames_1024To_1518Octets uint64   `protobuf:"fixed64,14,opt,name=frames_1024_to_1518_octets,json=frames1024To1518Octets,proto3" json:"frames_1024_to_1518_octets,omitempty"`
-	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
-	XXX_unrecognized         []byte   `json:"-"`
-	XXX_sizecache            int32    `json:"-"`
+	state                    protoimpl.MessageState `protogen:"open.v1"`
+	DropEvents               uint64                 `protobuf:"fixed64,1,opt,name=drop_events,json=dropEvents,proto3" json:"drop_events,omitempty"`
+	Octets                   uint64                 `protobuf:"fixed64,2,opt,name=octets,proto3" json:"octets,omitempty"`
+	Frames                   uint64                 `protobuf:"fixed64,3,opt,name=frames,proto3" json:"frames,omitempty"`
+	BroadcastFrames          uint64                 `protobuf:"fixed64,4,opt,name=broadcast_frames,json=broadcastFrames,proto3" json:"broadcast_frames,omitempty"`
+	MulticastFrames          uint64                 `protobuf:"fixed64,5,opt,name=multicast_frames,json=multicastFrames,proto3" json:"multicast_frames,omitempty"`
+	CrcErroredFrames         uint64                 `protobuf:"fixed64,6,opt,name=crc_errored_frames,json=crcErroredFrames,proto3" json:"crc_errored_frames,omitempty"`
+	UndersizeFrames          uint64                 `protobuf:"fixed64,7,opt,name=undersize_frames,json=undersizeFrames,proto3" json:"undersize_frames,omitempty"`
+	OversizeFrames           uint64                 `protobuf:"fixed64,8,opt,name=oversize_frames,json=oversizeFrames,proto3" json:"oversize_frames,omitempty"`
+	Frames_64Octets          uint64                 `protobuf:"fixed64,9,opt,name=frames_64_octets,json=frames64Octets,proto3" json:"frames_64_octets,omitempty"`
+	Frames_65To_127Octets    uint64                 `protobuf:"fixed64,10,opt,name=frames_65_to_127_octets,json=frames65To127Octets,proto3" json:"frames_65_to_127_octets,omitempty"`
+	Frames_128To_255Octets   uint64                 `protobuf:"fixed64,11,opt,name=frames_128_to_255_octets,json=frames128To255Octets,proto3" json:"frames_128_to_255_octets,omitempty"`
+	Frames_256To_511Octets   uint64                 `protobuf:"fixed64,12,opt,name=frames_256_to_511_octets,json=frames256To511Octets,proto3" json:"frames_256_to_511_octets,omitempty"`
+	Frames_512To_1023Octets  uint64                 `protobuf:"fixed64,13,opt,name=frames_512_to_1023_octets,json=frames512To1023Octets,proto3" json:"frames_512_to_1023_octets,omitempty"`
+	Frames_1024To_1518Octets uint64                 `protobuf:"fixed64,14,opt,name=frames_1024_to_1518_octets,json=frames1024To1518Octets,proto3" json:"frames_1024_to_1518_octets,omitempty"`
+	unknownFields            protoimpl.UnknownFields
+	sizeCache                protoimpl.SizeCache
 }
 
-func (m *OmciEthernetFrameExtendedPm) Reset()         { *m = OmciEthernetFrameExtendedPm{} }
-func (m *OmciEthernetFrameExtendedPm) String() string { return proto.CompactTextString(m) }
-func (*OmciEthernetFrameExtendedPm) ProtoMessage()    {}
+func (x *OmciEthernetFrameExtendedPm) Reset() {
+	*x = OmciEthernetFrameExtendedPm{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[35]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OmciEthernetFrameExtendedPm) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OmciEthernetFrameExtendedPm) ProtoMessage() {}
+
+func (x *OmciEthernetFrameExtendedPm) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 OmciEthernetFrameExtendedPm.ProtoReflect.Descriptor instead.
 func (*OmciEthernetFrameExtendedPm) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{35}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{35}
 }
 
-func (m *OmciEthernetFrameExtendedPm) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OmciEthernetFrameExtendedPm.Unmarshal(m, b)
-}
-func (m *OmciEthernetFrameExtendedPm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OmciEthernetFrameExtendedPm.Marshal(b, m, deterministic)
-}
-func (m *OmciEthernetFrameExtendedPm) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OmciEthernetFrameExtendedPm.Merge(m, src)
-}
-func (m *OmciEthernetFrameExtendedPm) XXX_Size() int {
-	return xxx_messageInfo_OmciEthernetFrameExtendedPm.Size(m)
-}
-func (m *OmciEthernetFrameExtendedPm) XXX_DiscardUnknown() {
-	xxx_messageInfo_OmciEthernetFrameExtendedPm.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OmciEthernetFrameExtendedPm proto.InternalMessageInfo
-
-func (m *OmciEthernetFrameExtendedPm) GetDropEvents() uint64 {
-	if m != nil {
-		return m.DropEvents
+func (x *OmciEthernetFrameExtendedPm) GetDropEvents() uint64 {
+	if x != nil {
+		return x.DropEvents
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetOctets() uint64 {
-	if m != nil {
-		return m.Octets
+func (x *OmciEthernetFrameExtendedPm) GetOctets() uint64 {
+	if x != nil {
+		return x.Octets
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetFrames() uint64 {
-	if m != nil {
-		return m.Frames
+func (x *OmciEthernetFrameExtendedPm) GetFrames() uint64 {
+	if x != nil {
+		return x.Frames
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetBroadcastFrames() uint64 {
-	if m != nil {
-		return m.BroadcastFrames
+func (x *OmciEthernetFrameExtendedPm) GetBroadcastFrames() uint64 {
+	if x != nil {
+		return x.BroadcastFrames
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetMulticastFrames() uint64 {
-	if m != nil {
-		return m.MulticastFrames
+func (x *OmciEthernetFrameExtendedPm) GetMulticastFrames() uint64 {
+	if x != nil {
+		return x.MulticastFrames
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetCrcErroredFrames() uint64 {
-	if m != nil {
-		return m.CrcErroredFrames
+func (x *OmciEthernetFrameExtendedPm) GetCrcErroredFrames() uint64 {
+	if x != nil {
+		return x.CrcErroredFrames
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetUndersizeFrames() uint64 {
-	if m != nil {
-		return m.UndersizeFrames
+func (x *OmciEthernetFrameExtendedPm) GetUndersizeFrames() uint64 {
+	if x != nil {
+		return x.UndersizeFrames
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetOversizeFrames() uint64 {
-	if m != nil {
-		return m.OversizeFrames
+func (x *OmciEthernetFrameExtendedPm) GetOversizeFrames() uint64 {
+	if x != nil {
+		return x.OversizeFrames
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetFrames_64Octets() uint64 {
-	if m != nil {
-		return m.Frames_64Octets
+func (x *OmciEthernetFrameExtendedPm) GetFrames_64Octets() uint64 {
+	if x != nil {
+		return x.Frames_64Octets
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetFrames_65To_127Octets() uint64 {
-	if m != nil {
-		return m.Frames_65To_127Octets
+func (x *OmciEthernetFrameExtendedPm) GetFrames_65To_127Octets() uint64 {
+	if x != nil {
+		return x.Frames_65To_127Octets
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetFrames_128To_255Octets() uint64 {
-	if m != nil {
-		return m.Frames_128To_255Octets
+func (x *OmciEthernetFrameExtendedPm) GetFrames_128To_255Octets() uint64 {
+	if x != nil {
+		return x.Frames_128To_255Octets
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetFrames_256To_511Octets() uint64 {
-	if m != nil {
-		return m.Frames_256To_511Octets
+func (x *OmciEthernetFrameExtendedPm) GetFrames_256To_511Octets() uint64 {
+	if x != nil {
+		return x.Frames_256To_511Octets
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetFrames_512To_1023Octets() uint64 {
-	if m != nil {
-		return m.Frames_512To_1023Octets
+func (x *OmciEthernetFrameExtendedPm) GetFrames_512To_1023Octets() uint64 {
+	if x != nil {
+		return x.Frames_512To_1023Octets
 	}
 	return 0
 }
 
-func (m *OmciEthernetFrameExtendedPm) GetFrames_1024To_1518Octets() uint64 {
-	if m != nil {
-		return m.Frames_1024To_1518Octets
+func (x *OmciEthernetFrameExtendedPm) GetFrames_1024To_1518Octets() uint64 {
+	if x != nil {
+		return x.Frames_1024To_1518Octets
 	}
 	return 0
 }
 
 type GetOmciEthernetFrameExtendedPmResponse struct {
+	state                             protoimpl.MessageState                        `protogen:"open.v1"`
 	Upstream                          *OmciEthernetFrameExtendedPm                  `protobuf:"bytes,1,opt,name=upstream,proto3" json:"upstream,omitempty"`
 	Downstream                        *OmciEthernetFrameExtendedPm                  `protobuf:"bytes,2,opt,name=downstream,proto3" json:"downstream,omitempty"`
 	OmciEthernetFrameExtendedPmFormat GetOmciEthernetFrameExtendedPmResponse_Format `protobuf:"varint,3,opt,name=omci_ethernet_frame_extended_pm_format,json=omciEthernetFrameExtendedPmFormat,proto3,enum=extension.GetOmciEthernetFrameExtendedPmResponse_Format" json:"omci_ethernet_frame_extended_pm_format,omitempty"`
-	XXX_NoUnkeyedLiteral              struct{}                                      `json:"-"`
-	XXX_unrecognized                  []byte                                        `json:"-"`
-	XXX_sizecache                     int32                                         `json:"-"`
+	unknownFields                     protoimpl.UnknownFields
+	sizeCache                         protoimpl.SizeCache
 }
 
-func (m *GetOmciEthernetFrameExtendedPmResponse) Reset() {
-	*m = GetOmciEthernetFrameExtendedPmResponse{}
+func (x *GetOmciEthernetFrameExtendedPmResponse) Reset() {
+	*x = GetOmciEthernetFrameExtendedPmResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[36]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
-func (m *GetOmciEthernetFrameExtendedPmResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOmciEthernetFrameExtendedPmResponse) ProtoMessage()    {}
+
+func (x *GetOmciEthernetFrameExtendedPmResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOmciEthernetFrameExtendedPmResponse) ProtoMessage() {}
+
+func (x *GetOmciEthernetFrameExtendedPmResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOmciEthernetFrameExtendedPmResponse.ProtoReflect.Descriptor instead.
 func (*GetOmciEthernetFrameExtendedPmResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{36}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{36}
 }
 
-func (m *GetOmciEthernetFrameExtendedPmResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOmciEthernetFrameExtendedPmResponse.Unmarshal(m, b)
-}
-func (m *GetOmciEthernetFrameExtendedPmResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOmciEthernetFrameExtendedPmResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOmciEthernetFrameExtendedPmResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOmciEthernetFrameExtendedPmResponse.Merge(m, src)
-}
-func (m *GetOmciEthernetFrameExtendedPmResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOmciEthernetFrameExtendedPmResponse.Size(m)
-}
-func (m *GetOmciEthernetFrameExtendedPmResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOmciEthernetFrameExtendedPmResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOmciEthernetFrameExtendedPmResponse proto.InternalMessageInfo
-
-func (m *GetOmciEthernetFrameExtendedPmResponse) GetUpstream() *OmciEthernetFrameExtendedPm {
-	if m != nil {
-		return m.Upstream
+func (x *GetOmciEthernetFrameExtendedPmResponse) GetUpstream() *OmciEthernetFrameExtendedPm {
+	if x != nil {
+		return x.Upstream
 	}
 	return nil
 }
 
-func (m *GetOmciEthernetFrameExtendedPmResponse) GetDownstream() *OmciEthernetFrameExtendedPm {
-	if m != nil {
-		return m.Downstream
+func (x *GetOmciEthernetFrameExtendedPmResponse) GetDownstream() *OmciEthernetFrameExtendedPm {
+	if x != nil {
+		return x.Downstream
 	}
 	return nil
 }
 
-func (m *GetOmciEthernetFrameExtendedPmResponse) GetOmciEthernetFrameExtendedPmFormat() GetOmciEthernetFrameExtendedPmResponse_Format {
-	if m != nil {
-		return m.OmciEthernetFrameExtendedPmFormat
+func (x *GetOmciEthernetFrameExtendedPmResponse) GetOmciEthernetFrameExtendedPmFormat() GetOmciEthernetFrameExtendedPmResponse_Format {
+	if x != nil {
+		return x.OmciEthernetFrameExtendedPmFormat
 	}
 	return GetOmciEthernetFrameExtendedPmResponse_THIRTY_TWO_BIT
 }
 
 type RxPower struct {
-	OnuSn                string   `protobuf:"bytes,1,opt,name=onu_sn,json=onuSn,proto3" json:"onu_sn,omitempty"`
-	Status               string   `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
-	FailReason           string   `protobuf:"bytes,3,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,omitempty"`
-	RxPower              float64  `protobuf:"fixed64,4,opt,name=rx_power,json=rxPower,proto3" json:"rx_power,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	OnuSn         string                 `protobuf:"bytes,1,opt,name=onu_sn,json=onuSn,proto3" json:"onu_sn,omitempty"` // if the port on which RxPower is measured is not a PON port this will be empty ("") string
+	Status        string                 `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
+	FailReason    string                 `protobuf:"bytes,3,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,omitempty"`
+	RxPower       float64                `protobuf:"fixed64,4,opt,name=rx_power,json=rxPower,proto3" json:"rx_power,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *RxPower) Reset()         { *m = RxPower{} }
-func (m *RxPower) String() string { return proto.CompactTextString(m) }
-func (*RxPower) ProtoMessage()    {}
+func (x *RxPower) Reset() {
+	*x = RxPower{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[37]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *RxPower) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RxPower) ProtoMessage() {}
+
+func (x *RxPower) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 RxPower.ProtoReflect.Descriptor instead.
 func (*RxPower) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{37}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{37}
 }
 
-func (m *RxPower) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RxPower.Unmarshal(m, b)
-}
-func (m *RxPower) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RxPower.Marshal(b, m, deterministic)
-}
-func (m *RxPower) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RxPower.Merge(m, src)
-}
-func (m *RxPower) XXX_Size() int {
-	return xxx_messageInfo_RxPower.Size(m)
-}
-func (m *RxPower) XXX_DiscardUnknown() {
-	xxx_messageInfo_RxPower.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RxPower proto.InternalMessageInfo
-
-func (m *RxPower) GetOnuSn() string {
-	if m != nil {
-		return m.OnuSn
+func (x *RxPower) GetOnuSn() string {
+	if x != nil {
+		return x.OnuSn
 	}
 	return ""
 }
 
-func (m *RxPower) GetStatus() string {
-	if m != nil {
-		return m.Status
+func (x *RxPower) GetStatus() string {
+	if x != nil {
+		return x.Status
 	}
 	return ""
 }
 
-func (m *RxPower) GetFailReason() string {
-	if m != nil {
-		return m.FailReason
+func (x *RxPower) GetFailReason() string {
+	if x != nil {
+		return x.FailReason
 	}
 	return ""
 }
 
-func (m *RxPower) GetRxPower() float64 {
-	if m != nil {
-		return m.RxPower
+func (x *RxPower) GetRxPower() float64 {
+	if x != nil {
+		return x.RxPower
 	}
 	return 0
 }
 
 type GetOltRxPowerResponse struct {
-	PortLabel            string     `protobuf:"bytes,1,opt,name=port_label,json=portLabel,proto3" json:"port_label,omitempty"`
-	RxPower              []*RxPower `protobuf:"bytes,2,rep,name=rx_power,json=rxPower,proto3" json:"rx_power,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
-	XXX_unrecognized     []byte     `json:"-"`
-	XXX_sizecache        int32      `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	PortLabel     string                 `protobuf:"bytes,1,opt,name=port_label,json=portLabel,proto3" json:"port_label,omitempty"`
+	RxPower       []*RxPower             `protobuf:"bytes,2,rep,name=rx_power,json=rxPower,proto3" json:"rx_power,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOltRxPowerResponse) Reset()         { *m = GetOltRxPowerResponse{} }
-func (m *GetOltRxPowerResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOltRxPowerResponse) ProtoMessage()    {}
+func (x *GetOltRxPowerResponse) Reset() {
+	*x = GetOltRxPowerResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[38]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOltRxPowerResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOltRxPowerResponse) ProtoMessage() {}
+
+func (x *GetOltRxPowerResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOltRxPowerResponse.ProtoReflect.Descriptor instead.
 func (*GetOltRxPowerResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{38}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{38}
 }
 
-func (m *GetOltRxPowerResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOltRxPowerResponse.Unmarshal(m, b)
-}
-func (m *GetOltRxPowerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOltRxPowerResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOltRxPowerResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOltRxPowerResponse.Merge(m, src)
-}
-func (m *GetOltRxPowerResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOltRxPowerResponse.Size(m)
-}
-func (m *GetOltRxPowerResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOltRxPowerResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOltRxPowerResponse proto.InternalMessageInfo
-
-func (m *GetOltRxPowerResponse) GetPortLabel() string {
-	if m != nil {
-		return m.PortLabel
+func (x *GetOltRxPowerResponse) GetPortLabel() string {
+	if x != nil {
+		return x.PortLabel
 	}
 	return ""
 }
 
-func (m *GetOltRxPowerResponse) GetRxPower() []*RxPower {
-	if m != nil {
-		return m.RxPower
+func (x *GetOltRxPowerResponse) GetRxPower() []*RxPower {
+	if x != nil {
+		return x.RxPower
 	}
 	return nil
 }
 
 // DEPRECATED
 type GetRxPowerResponse 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           string   `protobuf:"bytes,4,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,omitempty"`
-	RxPower              float64  `protobuf:"fixed64,5,opt,name=rx_power,json=rxPower,proto3" json:"rx_power,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	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    string                 `protobuf:"bytes,4,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,omitempty"`
+	RxPower       float64                `protobuf:"fixed64,5,opt,name=rx_power,json=rxPower,proto3" json:"rx_power,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetRxPowerResponse) Reset()         { *m = GetRxPowerResponse{} }
-func (m *GetRxPowerResponse) String() string { return proto.CompactTextString(m) }
-func (*GetRxPowerResponse) ProtoMessage()    {}
+func (x *GetRxPowerResponse) Reset() {
+	*x = GetRxPowerResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[39]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetRxPowerResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetRxPowerResponse) ProtoMessage() {}
+
+func (x *GetRxPowerResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetRxPowerResponse.ProtoReflect.Descriptor instead.
 func (*GetRxPowerResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{39}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{39}
 }
 
-func (m *GetRxPowerResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetRxPowerResponse.Unmarshal(m, b)
-}
-func (m *GetRxPowerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetRxPowerResponse.Marshal(b, m, deterministic)
-}
-func (m *GetRxPowerResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetRxPowerResponse.Merge(m, src)
-}
-func (m *GetRxPowerResponse) XXX_Size() int {
-	return xxx_messageInfo_GetRxPowerResponse.Size(m)
-}
-func (m *GetRxPowerResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetRxPowerResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetRxPowerResponse proto.InternalMessageInfo
-
-func (m *GetRxPowerResponse) GetIntfId() uint32 {
-	if m != nil {
-		return m.IntfId
+func (x *GetRxPowerResponse) GetIntfId() uint32 {
+	if x != nil {
+		return x.IntfId
 	}
 	return 0
 }
 
-func (m *GetRxPowerResponse) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
+func (x *GetRxPowerResponse) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
 	}
 	return 0
 }
 
-func (m *GetRxPowerResponse) GetStatus() string {
-	if m != nil {
-		return m.Status
+func (x *GetRxPowerResponse) GetStatus() string {
+	if x != nil {
+		return x.Status
 	}
 	return ""
 }
 
-func (m *GetRxPowerResponse) GetFailReason() string {
-	if m != nil {
-		return m.FailReason
+func (x *GetRxPowerResponse) GetFailReason() string {
+	if x != nil {
+		return x.FailReason
 	}
 	return ""
 }
 
-func (m *GetRxPowerResponse) GetRxPower() float64 {
-	if m != nil {
-		return m.RxPower
+func (x *GetRxPowerResponse) GetRxPower() float64 {
+	if x != nil {
+		return x.RxPower
 	}
 	return 0
 }
 
 type GetOnuOmciTxRxStatsRequest struct {
-	Empty                *empty.Empty `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
-	XXX_unrecognized     []byte       `json:"-"`
-	XXX_sizecache        int32        `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Empty         *emptypb.Empty         `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOnuOmciTxRxStatsRequest) Reset()         { *m = GetOnuOmciTxRxStatsRequest{} }
-func (m *GetOnuOmciTxRxStatsRequest) String() string { return proto.CompactTextString(m) }
-func (*GetOnuOmciTxRxStatsRequest) ProtoMessage()    {}
+func (x *GetOnuOmciTxRxStatsRequest) Reset() {
+	*x = GetOnuOmciTxRxStatsRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[40]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuOmciTxRxStatsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuOmciTxRxStatsRequest) ProtoMessage() {}
+
+func (x *GetOnuOmciTxRxStatsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuOmciTxRxStatsRequest.ProtoReflect.Descriptor instead.
 func (*GetOnuOmciTxRxStatsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{40}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{40}
 }
 
-func (m *GetOnuOmciTxRxStatsRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuOmciTxRxStatsRequest.Unmarshal(m, b)
-}
-func (m *GetOnuOmciTxRxStatsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuOmciTxRxStatsRequest.Marshal(b, m, deterministic)
-}
-func (m *GetOnuOmciTxRxStatsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuOmciTxRxStatsRequest.Merge(m, src)
-}
-func (m *GetOnuOmciTxRxStatsRequest) XXX_Size() int {
-	return xxx_messageInfo_GetOnuOmciTxRxStatsRequest.Size(m)
-}
-func (m *GetOnuOmciTxRxStatsRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuOmciTxRxStatsRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuOmciTxRxStatsRequest proto.InternalMessageInfo
-
-func (m *GetOnuOmciTxRxStatsRequest) GetEmpty() *empty.Empty {
-	if m != nil {
-		return m.Empty
+func (x *GetOnuOmciTxRxStatsRequest) GetEmpty() *emptypb.Empty {
+	if x != nil {
+		return x.Empty
 	}
 	return nil
 }
 
 // see ITU-T G.988 clause 11.2.2
 type GetOnuOmciTxRxStatsResponse struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// OMCI baseline Tx frames with AR bit set
 	BaseTxArFrames uint32 `protobuf:"varint,1,opt,name=base_tx_ar_frames,json=baseTxArFrames,proto3" json:"base_tx_ar_frames,omitempty"`
 	// OMCI baseline Rx frames with AK bit set
@@ -3681,323 +4195,387 @@
 	// Number of retries of requests (tx) due to not received responses (Rx)
 	TxOmciCounterRetries uint32 `protobuf:"varint,9,opt,name=tx_omci_counter_retries,json=txOmciCounterRetries,proto3" json:"tx_omci_counter_retries,omitempty"`
 	// Number of timeouts of requests (tx) due to not received responses (Rx) after configured number of retries
-	TxOmciCounterTimeouts uint32   `protobuf:"varint,10,opt,name=tx_omci_counter_timeouts,json=txOmciCounterTimeouts,proto3" json:"tx_omci_counter_timeouts,omitempty"`
-	XXX_NoUnkeyedLiteral  struct{} `json:"-"`
-	XXX_unrecognized      []byte   `json:"-"`
-	XXX_sizecache         int32    `json:"-"`
+	TxOmciCounterTimeouts uint32 `protobuf:"varint,10,opt,name=tx_omci_counter_timeouts,json=txOmciCounterTimeouts,proto3" json:"tx_omci_counter_timeouts,omitempty"`
+	unknownFields         protoimpl.UnknownFields
+	sizeCache             protoimpl.SizeCache
 }
 
-func (m *GetOnuOmciTxRxStatsResponse) Reset()         { *m = GetOnuOmciTxRxStatsResponse{} }
-func (m *GetOnuOmciTxRxStatsResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOnuOmciTxRxStatsResponse) ProtoMessage()    {}
+func (x *GetOnuOmciTxRxStatsResponse) Reset() {
+	*x = GetOnuOmciTxRxStatsResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[41]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuOmciTxRxStatsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuOmciTxRxStatsResponse) ProtoMessage() {}
+
+func (x *GetOnuOmciTxRxStatsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuOmciTxRxStatsResponse.ProtoReflect.Descriptor instead.
 func (*GetOnuOmciTxRxStatsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{41}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{41}
 }
 
-func (m *GetOnuOmciTxRxStatsResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuOmciTxRxStatsResponse.Unmarshal(m, b)
-}
-func (m *GetOnuOmciTxRxStatsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuOmciTxRxStatsResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOnuOmciTxRxStatsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuOmciTxRxStatsResponse.Merge(m, src)
-}
-func (m *GetOnuOmciTxRxStatsResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOnuOmciTxRxStatsResponse.Size(m)
-}
-func (m *GetOnuOmciTxRxStatsResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuOmciTxRxStatsResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuOmciTxRxStatsResponse proto.InternalMessageInfo
-
-func (m *GetOnuOmciTxRxStatsResponse) GetBaseTxArFrames() uint32 {
-	if m != nil {
-		return m.BaseTxArFrames
+func (x *GetOnuOmciTxRxStatsResponse) GetBaseTxArFrames() uint32 {
+	if x != nil {
+		return x.BaseTxArFrames
 	}
 	return 0
 }
 
-func (m *GetOnuOmciTxRxStatsResponse) GetBaseRxAkFrames() uint32 {
-	if m != nil {
-		return m.BaseRxAkFrames
+func (x *GetOnuOmciTxRxStatsResponse) GetBaseRxAkFrames() uint32 {
+	if x != nil {
+		return x.BaseRxAkFrames
 	}
 	return 0
 }
 
-func (m *GetOnuOmciTxRxStatsResponse) GetBaseTxNoArFrames() uint32 {
-	if m != nil {
-		return m.BaseTxNoArFrames
+func (x *GetOnuOmciTxRxStatsResponse) GetBaseTxNoArFrames() uint32 {
+	if x != nil {
+		return x.BaseTxNoArFrames
 	}
 	return 0
 }
 
-func (m *GetOnuOmciTxRxStatsResponse) GetBaseRxNoAkFrames() uint32 {
-	if m != nil {
-		return m.BaseRxNoAkFrames
+func (x *GetOnuOmciTxRxStatsResponse) GetBaseRxNoAkFrames() uint32 {
+	if x != nil {
+		return x.BaseRxNoAkFrames
 	}
 	return 0
 }
 
-func (m *GetOnuOmciTxRxStatsResponse) GetExtTxArFrames() uint32 {
-	if m != nil {
-		return m.ExtTxArFrames
+func (x *GetOnuOmciTxRxStatsResponse) GetExtTxArFrames() uint32 {
+	if x != nil {
+		return x.ExtTxArFrames
 	}
 	return 0
 }
 
-func (m *GetOnuOmciTxRxStatsResponse) GetExtRxAkFrames() uint32 {
-	if m != nil {
-		return m.ExtRxAkFrames
+func (x *GetOnuOmciTxRxStatsResponse) GetExtRxAkFrames() uint32 {
+	if x != nil {
+		return x.ExtRxAkFrames
 	}
 	return 0
 }
 
-func (m *GetOnuOmciTxRxStatsResponse) GetExtTxNoArFrames() uint32 {
-	if m != nil {
-		return m.ExtTxNoArFrames
+func (x *GetOnuOmciTxRxStatsResponse) GetExtTxNoArFrames() uint32 {
+	if x != nil {
+		return x.ExtTxNoArFrames
 	}
 	return 0
 }
 
-func (m *GetOnuOmciTxRxStatsResponse) GetExtRxNoAkFrames() uint32 {
-	if m != nil {
-		return m.ExtRxNoAkFrames
+func (x *GetOnuOmciTxRxStatsResponse) GetExtRxNoAkFrames() uint32 {
+	if x != nil {
+		return x.ExtRxNoAkFrames
 	}
 	return 0
 }
 
-func (m *GetOnuOmciTxRxStatsResponse) GetTxOmciCounterRetries() uint32 {
-	if m != nil {
-		return m.TxOmciCounterRetries
+func (x *GetOnuOmciTxRxStatsResponse) GetTxOmciCounterRetries() uint32 {
+	if x != nil {
+		return x.TxOmciCounterRetries
 	}
 	return 0
 }
 
-func (m *GetOnuOmciTxRxStatsResponse) GetTxOmciCounterTimeouts() uint32 {
-	if m != nil {
-		return m.TxOmciCounterTimeouts
+func (x *GetOnuOmciTxRxStatsResponse) GetTxOmciCounterTimeouts() uint32 {
+	if x != nil {
+		return x.TxOmciCounterTimeouts
 	}
 	return 0
 }
 
 type GetOnuOmciActiveAlarmsRequest struct {
-	Empty                *empty.Empty `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
-	XXX_unrecognized     []byte       `json:"-"`
-	XXX_sizecache        int32        `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Empty         *emptypb.Empty         `protobuf:"bytes,1,opt,name=empty,proto3" json:"empty,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOnuOmciActiveAlarmsRequest) Reset()         { *m = GetOnuOmciActiveAlarmsRequest{} }
-func (m *GetOnuOmciActiveAlarmsRequest) String() string { return proto.CompactTextString(m) }
-func (*GetOnuOmciActiveAlarmsRequest) ProtoMessage()    {}
+func (x *GetOnuOmciActiveAlarmsRequest) Reset() {
+	*x = GetOnuOmciActiveAlarmsRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[42]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuOmciActiveAlarmsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuOmciActiveAlarmsRequest) ProtoMessage() {}
+
+func (x *GetOnuOmciActiveAlarmsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuOmciActiveAlarmsRequest.ProtoReflect.Descriptor instead.
 func (*GetOnuOmciActiveAlarmsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{42}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{42}
 }
 
-func (m *GetOnuOmciActiveAlarmsRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuOmciActiveAlarmsRequest.Unmarshal(m, b)
-}
-func (m *GetOnuOmciActiveAlarmsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuOmciActiveAlarmsRequest.Marshal(b, m, deterministic)
-}
-func (m *GetOnuOmciActiveAlarmsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuOmciActiveAlarmsRequest.Merge(m, src)
-}
-func (m *GetOnuOmciActiveAlarmsRequest) XXX_Size() int {
-	return xxx_messageInfo_GetOnuOmciActiveAlarmsRequest.Size(m)
-}
-func (m *GetOnuOmciActiveAlarmsRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuOmciActiveAlarmsRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuOmciActiveAlarmsRequest proto.InternalMessageInfo
-
-func (m *GetOnuOmciActiveAlarmsRequest) GetEmpty() *empty.Empty {
-	if m != nil {
-		return m.Empty
+func (x *GetOnuOmciActiveAlarmsRequest) GetEmpty() *emptypb.Empty {
+	if x != nil {
+		return x.Empty
 	}
 	return nil
 }
 
 type AlarmData struct {
-	ClassId              uint32   `protobuf:"varint,1,opt,name=class_id,json=classId,proto3" json:"class_id,omitempty"`
-	InstanceId           uint32   `protobuf:"varint,2,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"`
-	Name                 string   `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
-	Description          string   `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	ClassId       uint32                 `protobuf:"varint,1,opt,name=class_id,json=classId,proto3" json:"class_id,omitempty"`
+	InstanceId    uint32                 `protobuf:"varint,2,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"`
+	Name          string                 `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	Description   string                 `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *AlarmData) Reset()         { *m = AlarmData{} }
-func (m *AlarmData) String() string { return proto.CompactTextString(m) }
-func (*AlarmData) ProtoMessage()    {}
+func (x *AlarmData) Reset() {
+	*x = AlarmData{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[43]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *AlarmData) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AlarmData) ProtoMessage() {}
+
+func (x *AlarmData) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 AlarmData.ProtoReflect.Descriptor instead.
 func (*AlarmData) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{43}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{43}
 }
 
-func (m *AlarmData) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_AlarmData.Unmarshal(m, b)
-}
-func (m *AlarmData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_AlarmData.Marshal(b, m, deterministic)
-}
-func (m *AlarmData) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_AlarmData.Merge(m, src)
-}
-func (m *AlarmData) XXX_Size() int {
-	return xxx_messageInfo_AlarmData.Size(m)
-}
-func (m *AlarmData) XXX_DiscardUnknown() {
-	xxx_messageInfo_AlarmData.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_AlarmData proto.InternalMessageInfo
-
-func (m *AlarmData) GetClassId() uint32 {
-	if m != nil {
-		return m.ClassId
+func (x *AlarmData) GetClassId() uint32 {
+	if x != nil {
+		return x.ClassId
 	}
 	return 0
 }
 
-func (m *AlarmData) GetInstanceId() uint32 {
-	if m != nil {
-		return m.InstanceId
+func (x *AlarmData) GetInstanceId() uint32 {
+	if x != nil {
+		return x.InstanceId
 	}
 	return 0
 }
 
-func (m *AlarmData) GetName() string {
-	if m != nil {
-		return m.Name
+func (x *AlarmData) GetName() string {
+	if x != nil {
+		return x.Name
 	}
 	return ""
 }
 
-func (m *AlarmData) GetDescription() string {
-	if m != nil {
-		return m.Description
+func (x *AlarmData) GetDescription() string {
+	if x != nil {
+		return x.Description
 	}
 	return ""
 }
 
 type GetOnuOmciActiveAlarmsResponse struct {
-	ActiveAlarms         []*AlarmData `protobuf:"bytes,1,rep,name=active_alarms,json=activeAlarms,proto3" json:"active_alarms,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
-	XXX_unrecognized     []byte       `json:"-"`
-	XXX_sizecache        int32        `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	ActiveAlarms  []*AlarmData           `protobuf:"bytes,1,rep,name=active_alarms,json=activeAlarms,proto3" json:"active_alarms,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOnuOmciActiveAlarmsResponse) Reset()         { *m = GetOnuOmciActiveAlarmsResponse{} }
-func (m *GetOnuOmciActiveAlarmsResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOnuOmciActiveAlarmsResponse) ProtoMessage()    {}
+func (x *GetOnuOmciActiveAlarmsResponse) Reset() {
+	*x = GetOnuOmciActiveAlarmsResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[44]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnuOmciActiveAlarmsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnuOmciActiveAlarmsResponse) ProtoMessage() {}
+
+func (x *GetOnuOmciActiveAlarmsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOnuOmciActiveAlarmsResponse.ProtoReflect.Descriptor instead.
 func (*GetOnuOmciActiveAlarmsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{44}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{44}
 }
 
-func (m *GetOnuOmciActiveAlarmsResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOnuOmciActiveAlarmsResponse.Unmarshal(m, b)
-}
-func (m *GetOnuOmciActiveAlarmsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOnuOmciActiveAlarmsResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOnuOmciActiveAlarmsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOnuOmciActiveAlarmsResponse.Merge(m, src)
-}
-func (m *GetOnuOmciActiveAlarmsResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOnuOmciActiveAlarmsResponse.Size(m)
-}
-func (m *GetOnuOmciActiveAlarmsResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOnuOmciActiveAlarmsResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOnuOmciActiveAlarmsResponse proto.InternalMessageInfo
-
-func (m *GetOnuOmciActiveAlarmsResponse) GetActiveAlarms() []*AlarmData {
-	if m != nil {
-		return m.ActiveAlarms
+func (x *GetOnuOmciActiveAlarmsResponse) GetActiveAlarms() []*AlarmData {
+	if x != nil {
+		return x.ActiveAlarms
 	}
 	return nil
 }
 
 type GetOffloadedAppsStatisticsRequest struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// The offloaded application whose statistics are requested
-	StatsFor             GetOffloadedAppsStatisticsRequest_OffloadedApp `protobuf:"varint,1,opt,name=statsFor,proto3,enum=extension.GetOffloadedAppsStatisticsRequest_OffloadedApp" json:"statsFor,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                                       `json:"-"`
-	XXX_unrecognized     []byte                                         `json:"-"`
-	XXX_sizecache        int32                                          `json:"-"`
+	StatsFor      GetOffloadedAppsStatisticsRequest_OffloadedApp `protobuf:"varint,1,opt,name=statsFor,proto3,enum=extension.GetOffloadedAppsStatisticsRequest_OffloadedApp" json:"statsFor,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOffloadedAppsStatisticsRequest) Reset()         { *m = GetOffloadedAppsStatisticsRequest{} }
-func (m *GetOffloadedAppsStatisticsRequest) String() string { return proto.CompactTextString(m) }
-func (*GetOffloadedAppsStatisticsRequest) ProtoMessage()    {}
+func (x *GetOffloadedAppsStatisticsRequest) Reset() {
+	*x = GetOffloadedAppsStatisticsRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[45]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOffloadedAppsStatisticsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOffloadedAppsStatisticsRequest) ProtoMessage() {}
+
+func (x *GetOffloadedAppsStatisticsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOffloadedAppsStatisticsRequest.ProtoReflect.Descriptor instead.
 func (*GetOffloadedAppsStatisticsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{45}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{45}
 }
 
-func (m *GetOffloadedAppsStatisticsRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsRequest.Unmarshal(m, b)
-}
-func (m *GetOffloadedAppsStatisticsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsRequest.Marshal(b, m, deterministic)
-}
-func (m *GetOffloadedAppsStatisticsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOffloadedAppsStatisticsRequest.Merge(m, src)
-}
-func (m *GetOffloadedAppsStatisticsRequest) XXX_Size() int {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsRequest.Size(m)
-}
-func (m *GetOffloadedAppsStatisticsRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOffloadedAppsStatisticsRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOffloadedAppsStatisticsRequest proto.InternalMessageInfo
-
-func (m *GetOffloadedAppsStatisticsRequest) GetStatsFor() GetOffloadedAppsStatisticsRequest_OffloadedApp {
-	if m != nil {
-		return m.StatsFor
+func (x *GetOffloadedAppsStatisticsRequest) GetStatsFor() GetOffloadedAppsStatisticsRequest_OffloadedApp {
+	if x != nil {
+		return x.StatsFor
 	}
 	return GetOffloadedAppsStatisticsRequest_UNDEFINED
 }
 
 type GetOffloadedAppsStatisticsResponse struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Types that are valid to be assigned to Stats:
+	//
 	//	*GetOffloadedAppsStatisticsResponse_Dhcpv4RaStats
 	//	*GetOffloadedAppsStatisticsResponse_Dhcpv6RaStats
 	//	*GetOffloadedAppsStatisticsResponse_PppoeIaStats
-	Stats                isGetOffloadedAppsStatisticsResponse_Stats `protobuf_oneof:"stats"`
-	XXX_NoUnkeyedLiteral struct{}                                   `json:"-"`
-	XXX_unrecognized     []byte                                     `json:"-"`
-	XXX_sizecache        int32                                      `json:"-"`
+	Stats         isGetOffloadedAppsStatisticsResponse_Stats `protobuf_oneof:"stats"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetOffloadedAppsStatisticsResponse) Reset()         { *m = GetOffloadedAppsStatisticsResponse{} }
-func (m *GetOffloadedAppsStatisticsResponse) String() string { return proto.CompactTextString(m) }
-func (*GetOffloadedAppsStatisticsResponse) ProtoMessage()    {}
+func (x *GetOffloadedAppsStatisticsResponse) Reset() {
+	*x = GetOffloadedAppsStatisticsResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[46]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOffloadedAppsStatisticsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOffloadedAppsStatisticsResponse) ProtoMessage() {}
+
+func (x *GetOffloadedAppsStatisticsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOffloadedAppsStatisticsResponse.ProtoReflect.Descriptor instead.
 func (*GetOffloadedAppsStatisticsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{46}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{46}
 }
 
-func (m *GetOffloadedAppsStatisticsResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsResponse.Unmarshal(m, b)
-}
-func (m *GetOffloadedAppsStatisticsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsResponse.Marshal(b, m, deterministic)
-}
-func (m *GetOffloadedAppsStatisticsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOffloadedAppsStatisticsResponse.Merge(m, src)
-}
-func (m *GetOffloadedAppsStatisticsResponse) XXX_Size() int {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsResponse.Size(m)
-}
-func (m *GetOffloadedAppsStatisticsResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOffloadedAppsStatisticsResponse.DiscardUnknown(m)
+func (x *GetOffloadedAppsStatisticsResponse) GetStats() isGetOffloadedAppsStatisticsResponse_Stats {
+	if x != nil {
+		return x.Stats
+	}
+	return nil
 }
 
-var xxx_messageInfo_GetOffloadedAppsStatisticsResponse proto.InternalMessageInfo
+func (x *GetOffloadedAppsStatisticsResponse) GetDhcpv4RaStats() *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats {
+	if x != nil {
+		if x, ok := x.Stats.(*GetOffloadedAppsStatisticsResponse_Dhcpv4RaStats); ok {
+			return x.Dhcpv4RaStats
+		}
+	}
+	return nil
+}
+
+func (x *GetOffloadedAppsStatisticsResponse) GetDhcpv6RaStats() *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats {
+	if x != nil {
+		if x, ok := x.Stats.(*GetOffloadedAppsStatisticsResponse_Dhcpv6RaStats); ok {
+			return x.Dhcpv6RaStats
+		}
+	}
+	return nil
+}
+
+func (x *GetOffloadedAppsStatisticsResponse) GetPppoeIaStats() *GetOffloadedAppsStatisticsResponse_PPPoeIAStats {
+	if x != nil {
+		if x, ok := x.Stats.(*GetOffloadedAppsStatisticsResponse_PppoeIaStats); ok {
+			return x.PppoeIaStats
+		}
+	}
+	return nil
+}
 
 type isGetOffloadedAppsStatisticsResponse_Stats interface {
 	isGetOffloadedAppsStatisticsResponse_Stats()
@@ -4024,396 +4602,10 @@
 func (*GetOffloadedAppsStatisticsResponse_PppoeIaStats) isGetOffloadedAppsStatisticsResponse_Stats() {
 }
 
-func (m *GetOffloadedAppsStatisticsResponse) GetStats() isGetOffloadedAppsStatisticsResponse_Stats {
-	if m != nil {
-		return m.Stats
-	}
-	return nil
-}
-
-func (m *GetOffloadedAppsStatisticsResponse) GetDhcpv4RaStats() *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats {
-	if x, ok := m.GetStats().(*GetOffloadedAppsStatisticsResponse_Dhcpv4RaStats); ok {
-		return x.Dhcpv4RaStats
-	}
-	return nil
-}
-
-func (m *GetOffloadedAppsStatisticsResponse) GetDhcpv6RaStats() *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats {
-	if x, ok := m.GetStats().(*GetOffloadedAppsStatisticsResponse_Dhcpv6RaStats); ok {
-		return x.Dhcpv6RaStats
-	}
-	return nil
-}
-
-func (m *GetOffloadedAppsStatisticsResponse) GetPppoeIaStats() *GetOffloadedAppsStatisticsResponse_PPPoeIAStats {
-	if x, ok := m.GetStats().(*GetOffloadedAppsStatisticsResponse_PppoeIaStats); ok {
-		return x.PppoeIaStats
-	}
-	return nil
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*GetOffloadedAppsStatisticsResponse) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*GetOffloadedAppsStatisticsResponse_Dhcpv4RaStats)(nil),
-		(*GetOffloadedAppsStatisticsResponse_Dhcpv6RaStats)(nil),
-		(*GetOffloadedAppsStatisticsResponse_PppoeIaStats)(nil),
-	}
-}
-
-type GetOffloadedAppsStatisticsResponse_DHCPv4RAStats struct {
-	// From https://github.com/BroadbandForum/yang/blob/master/standard/networking/bbf-l2-dhcpv4-relay.yang
-	InBadPacketsFromClient           uint32 `protobuf:"varint,1,opt,name=in_bad_packets_from_client,json=inBadPacketsFromClient,proto3" json:"in_bad_packets_from_client,omitempty"`
-	InBadPacketsFromServer           uint32 `protobuf:"varint,2,opt,name=in_bad_packets_from_server,json=inBadPacketsFromServer,proto3" json:"in_bad_packets_from_server,omitempty"`
-	InPacketsFromClient              uint32 `protobuf:"varint,3,opt,name=in_packets_from_client,json=inPacketsFromClient,proto3" json:"in_packets_from_client,omitempty"`
-	InPacketsFromServer              uint32 `protobuf:"varint,4,opt,name=in_packets_from_server,json=inPacketsFromServer,proto3" json:"in_packets_from_server,omitempty"`
-	OutPacketsToServer               uint32 `protobuf:"varint,5,opt,name=out_packets_to_server,json=outPacketsToServer,proto3" json:"out_packets_to_server,omitempty"`
-	OutPacketsToClient               uint32 `protobuf:"varint,6,opt,name=out_packets_to_client,json=outPacketsToClient,proto3" json:"out_packets_to_client,omitempty"`
-	Option_82InsertedPacketsToServer uint32 `protobuf:"varint,7,opt,name=option_82_inserted_packets_to_server,json=option82InsertedPacketsToServer,proto3" json:"option_82_inserted_packets_to_server,omitempty"`
-	Option_82RemovedPacketsToClient  uint32 `protobuf:"varint,8,opt,name=option_82_removed_packets_to_client,json=option82RemovedPacketsToClient,proto3" json:"option_82_removed_packets_to_client,omitempty"`
-	Option_82NotInsertedToServer     uint32 `protobuf:"varint,9,opt,name=option_82_not_inserted_to_server,json=option82NotInsertedToServer,proto3" json:"option_82_not_inserted_to_server,omitempty"`
-	// Name value pairs that gives the flexibility to report different statistics that implementations may choose
-	AdditionalStats      map[string]string `protobuf:"bytes,10,rep,name=additional_stats,json=additionalStats,proto3" json:"additional_stats,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
-	XXX_unrecognized     []byte            `json:"-"`
-	XXX_sizecache        int32             `json:"-"`
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) Reset() {
-	*m = GetOffloadedAppsStatisticsResponse_DHCPv4RAStats{}
-}
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) String() string {
-	return proto.CompactTextString(m)
-}
-func (*GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) ProtoMessage() {}
-func (*GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{46, 0}
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsResponse_DHCPv4RAStats.Unmarshal(m, b)
-}
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsResponse_DHCPv4RAStats.Marshal(b, m, deterministic)
-}
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOffloadedAppsStatisticsResponse_DHCPv4RAStats.Merge(m, src)
-}
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) XXX_Size() int {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsResponse_DHCPv4RAStats.Size(m)
-}
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOffloadedAppsStatisticsResponse_DHCPv4RAStats.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOffloadedAppsStatisticsResponse_DHCPv4RAStats proto.InternalMessageInfo
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetInBadPacketsFromClient() uint32 {
-	if m != nil {
-		return m.InBadPacketsFromClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetInBadPacketsFromServer() uint32 {
-	if m != nil {
-		return m.InBadPacketsFromServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetInPacketsFromClient() uint32 {
-	if m != nil {
-		return m.InPacketsFromClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetInPacketsFromServer() uint32 {
-	if m != nil {
-		return m.InPacketsFromServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetOutPacketsToServer() uint32 {
-	if m != nil {
-		return m.OutPacketsToServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetOutPacketsToClient() uint32 {
-	if m != nil {
-		return m.OutPacketsToClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetOption_82InsertedPacketsToServer() uint32 {
-	if m != nil {
-		return m.Option_82InsertedPacketsToServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetOption_82RemovedPacketsToClient() uint32 {
-	if m != nil {
-		return m.Option_82RemovedPacketsToClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetOption_82NotInsertedToServer() uint32 {
-	if m != nil {
-		return m.Option_82NotInsertedToServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetAdditionalStats() map[string]string {
-	if m != nil {
-		return m.AdditionalStats
-	}
-	return nil
-}
-
-type GetOffloadedAppsStatisticsResponse_DHCPv6RAStats struct {
-	// From https://github.com/BroadbandForum/yang/blob/master/standard/networking/bbf-ldra.yang
-	InBadPacketsFromClient               uint32 `protobuf:"varint,1,opt,name=in_bad_packets_from_client,json=inBadPacketsFromClient,proto3" json:"in_bad_packets_from_client,omitempty"`
-	InBadPacketsFromServer               uint32 `protobuf:"varint,2,opt,name=in_bad_packets_from_server,json=inBadPacketsFromServer,proto3" json:"in_bad_packets_from_server,omitempty"`
-	Option_17InsertedPacketsToServer     uint32 `protobuf:"varint,3,opt,name=option_17_inserted_packets_to_server,json=option17InsertedPacketsToServer,proto3" json:"option_17_inserted_packets_to_server,omitempty"`
-	Option_17RemovedPacketsToClient      uint32 `protobuf:"varint,4,opt,name=option_17_removed_packets_to_client,json=option17RemovedPacketsToClient,proto3" json:"option_17_removed_packets_to_client,omitempty"`
-	Option_18InsertedPacketsToServer     uint32 `protobuf:"varint,5,opt,name=option_18_inserted_packets_to_server,json=option18InsertedPacketsToServer,proto3" json:"option_18_inserted_packets_to_server,omitempty"`
-	Option_18RemovedPacketsToClient      uint32 `protobuf:"varint,6,opt,name=option_18_removed_packets_to_client,json=option18RemovedPacketsToClient,proto3" json:"option_18_removed_packets_to_client,omitempty"`
-	Option_37InsertedPacketsToServer     uint32 `protobuf:"varint,7,opt,name=option_37_inserted_packets_to_server,json=option37InsertedPacketsToServer,proto3" json:"option_37_inserted_packets_to_server,omitempty"`
-	Option_37RemovedPacketsToClient      uint32 `protobuf:"varint,8,opt,name=option_37_removed_packets_to_client,json=option37RemovedPacketsToClient,proto3" json:"option_37_removed_packets_to_client,omitempty"`
-	OutgoingMtuExceededPacketsFromClient uint32 `protobuf:"varint,9,opt,name=outgoing_mtu_exceeded_packets_from_client,json=outgoingMtuExceededPacketsFromClient,proto3" json:"outgoing_mtu_exceeded_packets_from_client,omitempty"`
-	// Name value pairs that gives the flexibility to report different statistics that implementations may choose
-	AdditionalStats      map[string]string `protobuf:"bytes,10,rep,name=additional_stats,json=additionalStats,proto3" json:"additional_stats,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
-	XXX_unrecognized     []byte            `json:"-"`
-	XXX_sizecache        int32             `json:"-"`
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) Reset() {
-	*m = GetOffloadedAppsStatisticsResponse_DHCPv6RAStats{}
-}
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) String() string {
-	return proto.CompactTextString(m)
-}
-func (*GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) ProtoMessage() {}
-func (*GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{46, 1}
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsResponse_DHCPv6RAStats.Unmarshal(m, b)
-}
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsResponse_DHCPv6RAStats.Marshal(b, m, deterministic)
-}
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOffloadedAppsStatisticsResponse_DHCPv6RAStats.Merge(m, src)
-}
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) XXX_Size() int {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsResponse_DHCPv6RAStats.Size(m)
-}
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOffloadedAppsStatisticsResponse_DHCPv6RAStats.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOffloadedAppsStatisticsResponse_DHCPv6RAStats proto.InternalMessageInfo
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetInBadPacketsFromClient() uint32 {
-	if m != nil {
-		return m.InBadPacketsFromClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetInBadPacketsFromServer() uint32 {
-	if m != nil {
-		return m.InBadPacketsFromServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOption_17InsertedPacketsToServer() uint32 {
-	if m != nil {
-		return m.Option_17InsertedPacketsToServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOption_17RemovedPacketsToClient() uint32 {
-	if m != nil {
-		return m.Option_17RemovedPacketsToClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOption_18InsertedPacketsToServer() uint32 {
-	if m != nil {
-		return m.Option_18InsertedPacketsToServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOption_18RemovedPacketsToClient() uint32 {
-	if m != nil {
-		return m.Option_18RemovedPacketsToClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOption_37InsertedPacketsToServer() uint32 {
-	if m != nil {
-		return m.Option_37InsertedPacketsToServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOption_37RemovedPacketsToClient() uint32 {
-	if m != nil {
-		return m.Option_37RemovedPacketsToClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOutgoingMtuExceededPacketsFromClient() uint32 {
-	if m != nil {
-		return m.OutgoingMtuExceededPacketsFromClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetAdditionalStats() map[string]string {
-	if m != nil {
-		return m.AdditionalStats
-	}
-	return nil
-}
-
-type GetOffloadedAppsStatisticsResponse_PPPoeIAStats struct {
-	// From https://github.com/BroadbandForum/yang/blob/master/standard/networking/bbf-pppoe-intermediate-agent.yang
-	InErrorPacketsFromClient                 uint32 `protobuf:"varint,1,opt,name=in_error_packets_from_client,json=inErrorPacketsFromClient,proto3" json:"in_error_packets_from_client,omitempty"`
-	InErrorPacketsFromServer                 uint32 `protobuf:"varint,2,opt,name=in_error_packets_from_server,json=inErrorPacketsFromServer,proto3" json:"in_error_packets_from_server,omitempty"`
-	InPacketsFromClient                      uint32 `protobuf:"varint,3,opt,name=in_packets_from_client,json=inPacketsFromClient,proto3" json:"in_packets_from_client,omitempty"`
-	InPacketsFromServer                      uint32 `protobuf:"varint,4,opt,name=in_packets_from_server,json=inPacketsFromServer,proto3" json:"in_packets_from_server,omitempty"`
-	OutPacketsToServer                       uint32 `protobuf:"varint,5,opt,name=out_packets_to_server,json=outPacketsToServer,proto3" json:"out_packets_to_server,omitempty"`
-	OutPacketsToClient                       uint32 `protobuf:"varint,6,opt,name=out_packets_to_client,json=outPacketsToClient,proto3" json:"out_packets_to_client,omitempty"`
-	VendorSpecificTagInsertedPacketsToServer uint32 `protobuf:"varint,7,opt,name=vendor_specific_tag_inserted_packets_to_server,json=vendorSpecificTagInsertedPacketsToServer,proto3" json:"vendor_specific_tag_inserted_packets_to_server,omitempty"`
-	VendorSpecificTagRemovedPacketsToClient  uint32 `protobuf:"varint,8,opt,name=vendor_specific_tag_removed_packets_to_client,json=vendorSpecificTagRemovedPacketsToClient,proto3" json:"vendor_specific_tag_removed_packets_to_client,omitempty"`
-	OutgoingMtuExceededPacketsFromClient     uint32 `protobuf:"varint,9,opt,name=outgoing_mtu_exceeded_packets_from_client,json=outgoingMtuExceededPacketsFromClient,proto3" json:"outgoing_mtu_exceeded_packets_from_client,omitempty"`
-	// Name value pairs that gives the flexibility to report different statistics that implementations may choose
-	AdditionalStats      map[string]string `protobuf:"bytes,10,rep,name=additional_stats,json=additionalStats,proto3" json:"additional_stats,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
-	XXX_unrecognized     []byte            `json:"-"`
-	XXX_sizecache        int32             `json:"-"`
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) Reset() {
-	*m = GetOffloadedAppsStatisticsResponse_PPPoeIAStats{}
-}
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) String() string {
-	return proto.CompactTextString(m)
-}
-func (*GetOffloadedAppsStatisticsResponse_PPPoeIAStats) ProtoMessage() {}
-func (*GetOffloadedAppsStatisticsResponse_PPPoeIAStats) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{46, 2}
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsResponse_PPPoeIAStats.Unmarshal(m, b)
-}
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsResponse_PPPoeIAStats.Marshal(b, m, deterministic)
-}
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetOffloadedAppsStatisticsResponse_PPPoeIAStats.Merge(m, src)
-}
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) XXX_Size() int {
-	return xxx_messageInfo_GetOffloadedAppsStatisticsResponse_PPPoeIAStats.Size(m)
-}
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetOffloadedAppsStatisticsResponse_PPPoeIAStats.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetOffloadedAppsStatisticsResponse_PPPoeIAStats proto.InternalMessageInfo
-
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetInErrorPacketsFromClient() uint32 {
-	if m != nil {
-		return m.InErrorPacketsFromClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetInErrorPacketsFromServer() uint32 {
-	if m != nil {
-		return m.InErrorPacketsFromServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetInPacketsFromClient() uint32 {
-	if m != nil {
-		return m.InPacketsFromClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetInPacketsFromServer() uint32 {
-	if m != nil {
-		return m.InPacketsFromServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetOutPacketsToServer() uint32 {
-	if m != nil {
-		return m.OutPacketsToServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetOutPacketsToClient() uint32 {
-	if m != nil {
-		return m.OutPacketsToClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetVendorSpecificTagInsertedPacketsToServer() uint32 {
-	if m != nil {
-		return m.VendorSpecificTagInsertedPacketsToServer
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetVendorSpecificTagRemovedPacketsToClient() uint32 {
-	if m != nil {
-		return m.VendorSpecificTagRemovedPacketsToClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetOutgoingMtuExceededPacketsFromClient() uint32 {
-	if m != nil {
-		return m.OutgoingMtuExceededPacketsFromClient
-	}
-	return 0
-}
-
-func (m *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetAdditionalStats() map[string]string {
-	if m != nil {
-		return m.AdditionalStats
-	}
-	return nil
-}
-
 type GetValueRequest struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Types that are valid to be assigned to Request:
+	//
 	//	*GetValueRequest_Distance
 	//	*GetValueRequest_UniInfo
 	//	*GetValueRequest_OltPortInfo
@@ -4431,36 +4623,200 @@
 	//	*GetValueRequest_OnuStatsFromOlt
 	//	*GetValueRequest_OltPonStats
 	//	*GetValueRequest_OltNniStats
-	Request              isGetValueRequest_Request `protobuf_oneof:"request"`
-	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
-	XXX_unrecognized     []byte                    `json:"-"`
-	XXX_sizecache        int32                     `json:"-"`
+	Request       isGetValueRequest_Request `protobuf_oneof:"request"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetValueRequest) Reset()         { *m = GetValueRequest{} }
-func (m *GetValueRequest) String() string { return proto.CompactTextString(m) }
-func (*GetValueRequest) ProtoMessage()    {}
+func (x *GetValueRequest) Reset() {
+	*x = GetValueRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[47]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetValueRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetValueRequest) ProtoMessage() {}
+
+func (x *GetValueRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetValueRequest.ProtoReflect.Descriptor instead.
 func (*GetValueRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{47}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{47}
 }
 
-func (m *GetValueRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetValueRequest.Unmarshal(m, b)
-}
-func (m *GetValueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetValueRequest.Marshal(b, m, deterministic)
-}
-func (m *GetValueRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetValueRequest.Merge(m, src)
-}
-func (m *GetValueRequest) XXX_Size() int {
-	return xxx_messageInfo_GetValueRequest.Size(m)
-}
-func (m *GetValueRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetValueRequest.DiscardUnknown(m)
+func (x *GetValueRequest) GetRequest() isGetValueRequest_Request {
+	if x != nil {
+		return x.Request
+	}
+	return nil
 }
 
-var xxx_messageInfo_GetValueRequest proto.InternalMessageInfo
+func (x *GetValueRequest) GetDistance() *GetDistanceRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_Distance); ok {
+			return x.Distance
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetUniInfo() *GetOnuUniInfoRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_UniInfo); ok {
+			return x.UniInfo
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetOltPortInfo() *GetOltPortCounters {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_OltPortInfo); ok {
+			return x.OltPortInfo
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetOnuOpticalInfo() *GetOnuPonOpticalInfo {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_OnuOpticalInfo); ok {
+			return x.OnuOpticalInfo
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetEthBridgePort() *GetOnuEthernetBridgePortHistory {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_EthBridgePort); ok {
+			return x.EthBridgePort
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetFecHistory() *GetOnuFecHistory {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_FecHistory); ok {
+			return x.FecHistory
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetOnuPonInfo() *GetOnuCountersRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_OnuPonInfo); ok {
+			return x.OnuPonInfo
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetOnuInfo() *GetOmciEthernetFrameExtendedPmRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_OnuInfo); ok {
+			return x.OnuInfo
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetRxPower() *GetRxPowerRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_RxPower); ok {
+			return x.RxPower
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetOnuOmciStats() *GetOnuOmciTxRxStatsRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_OnuOmciStats); ok {
+			return x.OnuOmciStats
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetOltRxPower() *GetOltRxPowerRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_OltRxPower); ok {
+			return x.OltRxPower
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetOnuActiveAlarms() *GetOnuOmciActiveAlarmsRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_OnuActiveAlarms); ok {
+			return x.OnuActiveAlarms
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetOffloadedAppsStats() *GetOffloadedAppsStatisticsRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_OffloadedAppsStats); ok {
+			return x.OffloadedAppsStats
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetOnuAllocGemStats() *GetOnuAllocGemHistoryRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_OnuAllocGemStats); ok {
+			return x.OnuAllocGemStats
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetOnuStatsFromOlt() *GetOnuStatsFromOltRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_OnuStatsFromOlt); ok {
+			return x.OnuStatsFromOlt
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetOltPonStats() *GetPonStatsRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_OltPonStats); ok {
+			return x.OltPonStats
+		}
+	}
+	return nil
+}
+
+func (x *GetValueRequest) GetOltNniStats() *GetNNIStatsRequest {
+	if x != nil {
+		if x, ok := x.Request.(*GetValueRequest_OltNniStats); ok {
+			return x.OltNniStats
+		}
+	}
+	return nil
+}
 
 type isGetValueRequest_Request interface {
 	isGetValueRequest_Request()
@@ -4475,18 +4831,22 @@
 }
 
 type GetValueRequest_OltPortInfo struct {
+	// Corresponds to PmMetricId.PON_PORT_COUNTERS, PmMetricId.NNI_PORT_COUNTERS
 	OltPortInfo *GetOltPortCounters `protobuf:"bytes,3,opt,name=oltPortInfo,proto3,oneof"`
 }
 
 type GetValueRequest_OnuOpticalInfo struct {
+	// Corresponds to PmMetricId.PON_OPTICAL
 	OnuOpticalInfo *GetOnuPonOpticalInfo `protobuf:"bytes,4,opt,name=onuOpticalInfo,proto3,oneof"`
 }
 
 type GetValueRequest_EthBridgePort struct {
+	// Corresponds to PmMetricId.ETHERNET_BRIDGE_PORT_HISTORY
 	EthBridgePort *GetOnuEthernetBridgePortHistory `protobuf:"bytes,5,opt,name=ethBridgePort,proto3,oneof"`
 }
 
 type GetValueRequest_FecHistory struct {
+	// Corresponds to PmMetricId.FEC_HISTORY
 	FecHistory *GetOnuFecHistory `protobuf:"bytes,6,opt,name=fecHistory,proto3,oneof"`
 }
 
@@ -4499,7 +4859,7 @@
 }
 
 type GetValueRequest_RxPower struct {
-	RxPower *GetRxPowerRequest `protobuf:"bytes,9,opt,name=rxPower,proto3,oneof"`
+	RxPower *GetRxPowerRequest `protobuf:"bytes,9,opt,name=rxPower,proto3,oneof"` // This is deprecated
 }
 
 type GetValueRequest_OnuOmciStats struct {
@@ -4568,159 +4928,12 @@
 
 func (*GetValueRequest_OltNniStats) isGetValueRequest_Request() {}
 
-func (m *GetValueRequest) GetRequest() isGetValueRequest_Request {
-	if m != nil {
-		return m.Request
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetDistance() *GetDistanceRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_Distance); ok {
-		return x.Distance
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetUniInfo() *GetOnuUniInfoRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_UniInfo); ok {
-		return x.UniInfo
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetOltPortInfo() *GetOltPortCounters {
-	if x, ok := m.GetRequest().(*GetValueRequest_OltPortInfo); ok {
-		return x.OltPortInfo
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetOnuOpticalInfo() *GetOnuPonOpticalInfo {
-	if x, ok := m.GetRequest().(*GetValueRequest_OnuOpticalInfo); ok {
-		return x.OnuOpticalInfo
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetEthBridgePort() *GetOnuEthernetBridgePortHistory {
-	if x, ok := m.GetRequest().(*GetValueRequest_EthBridgePort); ok {
-		return x.EthBridgePort
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetFecHistory() *GetOnuFecHistory {
-	if x, ok := m.GetRequest().(*GetValueRequest_FecHistory); ok {
-		return x.FecHistory
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetOnuPonInfo() *GetOnuCountersRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_OnuPonInfo); ok {
-		return x.OnuPonInfo
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetOnuInfo() *GetOmciEthernetFrameExtendedPmRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_OnuInfo); ok {
-		return x.OnuInfo
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetRxPower() *GetRxPowerRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_RxPower); ok {
-		return x.RxPower
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetOnuOmciStats() *GetOnuOmciTxRxStatsRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_OnuOmciStats); ok {
-		return x.OnuOmciStats
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetOltRxPower() *GetOltRxPowerRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_OltRxPower); ok {
-		return x.OltRxPower
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetOnuActiveAlarms() *GetOnuOmciActiveAlarmsRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_OnuActiveAlarms); ok {
-		return x.OnuActiveAlarms
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetOffloadedAppsStats() *GetOffloadedAppsStatisticsRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_OffloadedAppsStats); ok {
-		return x.OffloadedAppsStats
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetOnuAllocGemStats() *GetOnuAllocGemHistoryRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_OnuAllocGemStats); ok {
-		return x.OnuAllocGemStats
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetOnuStatsFromOlt() *GetOnuStatsFromOltRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_OnuStatsFromOlt); ok {
-		return x.OnuStatsFromOlt
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetOltPonStats() *GetPonStatsRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_OltPonStats); ok {
-		return x.OltPonStats
-	}
-	return nil
-}
-
-func (m *GetValueRequest) GetOltNniStats() *GetNNIStatsRequest {
-	if x, ok := m.GetRequest().(*GetValueRequest_OltNniStats); ok {
-		return x.OltNniStats
-	}
-	return nil
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*GetValueRequest) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*GetValueRequest_Distance)(nil),
-		(*GetValueRequest_UniInfo)(nil),
-		(*GetValueRequest_OltPortInfo)(nil),
-		(*GetValueRequest_OnuOpticalInfo)(nil),
-		(*GetValueRequest_EthBridgePort)(nil),
-		(*GetValueRequest_FecHistory)(nil),
-		(*GetValueRequest_OnuPonInfo)(nil),
-		(*GetValueRequest_OnuInfo)(nil),
-		(*GetValueRequest_RxPower)(nil),
-		(*GetValueRequest_OnuOmciStats)(nil),
-		(*GetValueRequest_OltRxPower)(nil),
-		(*GetValueRequest_OnuActiveAlarms)(nil),
-		(*GetValueRequest_OffloadedAppsStats)(nil),
-		(*GetValueRequest_OnuAllocGemStats)(nil),
-		(*GetValueRequest_OnuStatsFromOlt)(nil),
-		(*GetValueRequest_OltPonStats)(nil),
-		(*GetValueRequest_OltNniStats)(nil),
-	}
-}
-
 type GetValueResponse struct {
+	state     protoimpl.MessageState       `protogen:"open.v1"`
 	Status    GetValueResponse_Status      `protobuf:"varint,1,opt,name=status,proto3,enum=extension.GetValueResponse_Status" json:"status,omitempty"`
 	ErrReason GetValueResponse_ErrorReason `protobuf:"varint,2,opt,name=errReason,proto3,enum=extension.GetValueResponse_ErrorReason" json:"errReason,omitempty"`
 	// Types that are valid to be assigned to Response:
+	//
 	//	*GetValueResponse_Distance
 	//	*GetValueResponse_UniInfo
 	//	*GetValueResponse_PortCoutners
@@ -4738,51 +4951,215 @@
 	//	*GetValueResponse_OnuStatsFromOltResponse
 	//	*GetValueResponse_OltPonStatsResponse
 	//	*GetValueResponse_OltNniStatsResponse
-	Response             isGetValueResponse_Response `protobuf_oneof:"response"`
-	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
-	XXX_unrecognized     []byte                      `json:"-"`
-	XXX_sizecache        int32                       `json:"-"`
+	Response      isGetValueResponse_Response `protobuf_oneof:"response"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *GetValueResponse) Reset()         { *m = GetValueResponse{} }
-func (m *GetValueResponse) String() string { return proto.CompactTextString(m) }
-func (*GetValueResponse) ProtoMessage()    {}
+func (x *GetValueResponse) Reset() {
+	*x = GetValueResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[48]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetValueResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetValueResponse) ProtoMessage() {}
+
+func (x *GetValueResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetValueResponse.ProtoReflect.Descriptor instead.
 func (*GetValueResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{48}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{48}
 }
 
-func (m *GetValueResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetValueResponse.Unmarshal(m, b)
-}
-func (m *GetValueResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetValueResponse.Marshal(b, m, deterministic)
-}
-func (m *GetValueResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetValueResponse.Merge(m, src)
-}
-func (m *GetValueResponse) XXX_Size() int {
-	return xxx_messageInfo_GetValueResponse.Size(m)
-}
-func (m *GetValueResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetValueResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetValueResponse proto.InternalMessageInfo
-
-func (m *GetValueResponse) GetStatus() GetValueResponse_Status {
-	if m != nil {
-		return m.Status
+func (x *GetValueResponse) GetStatus() GetValueResponse_Status {
+	if x != nil {
+		return x.Status
 	}
 	return GetValueResponse_STATUS_UNDEFINED
 }
 
-func (m *GetValueResponse) GetErrReason() GetValueResponse_ErrorReason {
-	if m != nil {
-		return m.ErrReason
+func (x *GetValueResponse) GetErrReason() GetValueResponse_ErrorReason {
+	if x != nil {
+		return x.ErrReason
 	}
 	return GetValueResponse_REASON_UNDEFINED
 }
 
+func (x *GetValueResponse) GetResponse() isGetValueResponse_Response {
+	if x != nil {
+		return x.Response
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetDistance() *GetDistanceResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_Distance); ok {
+			return x.Distance
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetUniInfo() *GetOnuUniInfoResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_UniInfo); ok {
+			return x.UniInfo
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetPortCoutners() *GetOltPortCountersResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_PortCoutners); ok {
+			return x.PortCoutners
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetOnuOpticalInfo() *GetOnuPonOpticalInfoResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_OnuOpticalInfo); ok {
+			return x.OnuOpticalInfo
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetEthBridgePortInfo() *GetOnuEthernetBridgePortHistoryResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_EthBridgePortInfo); ok {
+			return x.EthBridgePortInfo
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetFecHistory() *GetOnuFecHistoryResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_FecHistory); ok {
+			return x.FecHistory
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetOnuPonCounters() *GetOnuCountersResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_OnuPonCounters); ok {
+			return x.OnuPonCounters
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetOnuCounters() *GetOmciEthernetFrameExtendedPmResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_OnuCounters); ok {
+			return x.OnuCounters
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetRxPower() *GetRxPowerResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_RxPower); ok {
+			return x.RxPower
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetOnuOmciStats() *GetOnuOmciTxRxStatsResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_OnuOmciStats); ok {
+			return x.OnuOmciStats
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetOltRxPower() *GetOltRxPowerResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_OltRxPower); ok {
+			return x.OltRxPower
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetOnuActiveAlarms() *GetOnuOmciActiveAlarmsResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_OnuActiveAlarms); ok {
+			return x.OnuActiveAlarms
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetOffloadedAppsStats() *GetOffloadedAppsStatisticsResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_OffloadedAppsStats); ok {
+			return x.OffloadedAppsStats
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetOnuAllocGemStatsResponse() *GetOnuAllocGemHistoryResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_OnuAllocGemStatsResponse); ok {
+			return x.OnuAllocGemStatsResponse
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetOnuStatsFromOltResponse() *GetOnuStatsFromOltResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_OnuStatsFromOltResponse); ok {
+			return x.OnuStatsFromOltResponse
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetOltPonStatsResponse() *GetPonStatsResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_OltPonStatsResponse); ok {
+			return x.OltPonStatsResponse
+		}
+	}
+	return nil
+}
+
+func (x *GetValueResponse) GetOltNniStatsResponse() *GetNNIStatsResponse {
+	if x != nil {
+		if x, ok := x.Response.(*GetValueResponse_OltNniStatsResponse); ok {
+			return x.OltNniStatsResponse
+		}
+	}
+	return nil
+}
+
 type isGetValueResponse_Response interface {
 	isGetValueResponse_Response()
 }
@@ -4820,7 +5197,7 @@
 }
 
 type GetValueResponse_RxPower struct {
-	RxPower *GetRxPowerResponse `protobuf:"bytes,11,opt,name=rxPower,proto3,oneof"`
+	RxPower *GetRxPowerResponse `protobuf:"bytes,11,opt,name=rxPower,proto3,oneof"` // This is DEPRECATED
 }
 
 type GetValueResponse_OnuOmciStats struct {
@@ -4889,361 +5266,204 @@
 
 func (*GetValueResponse_OltNniStatsResponse) isGetValueResponse_Response() {}
 
-func (m *GetValueResponse) GetResponse() isGetValueResponse_Response {
-	if m != nil {
-		return m.Response
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetDistance() *GetDistanceResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_Distance); ok {
-		return x.Distance
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetUniInfo() *GetOnuUniInfoResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_UniInfo); ok {
-		return x.UniInfo
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetPortCoutners() *GetOltPortCountersResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_PortCoutners); ok {
-		return x.PortCoutners
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetOnuOpticalInfo() *GetOnuPonOpticalInfoResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_OnuOpticalInfo); ok {
-		return x.OnuOpticalInfo
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetEthBridgePortInfo() *GetOnuEthernetBridgePortHistoryResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_EthBridgePortInfo); ok {
-		return x.EthBridgePortInfo
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetFecHistory() *GetOnuFecHistoryResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_FecHistory); ok {
-		return x.FecHistory
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetOnuPonCounters() *GetOnuCountersResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_OnuPonCounters); ok {
-		return x.OnuPonCounters
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetOnuCounters() *GetOmciEthernetFrameExtendedPmResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_OnuCounters); ok {
-		return x.OnuCounters
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetRxPower() *GetRxPowerResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_RxPower); ok {
-		return x.RxPower
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetOnuOmciStats() *GetOnuOmciTxRxStatsResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_OnuOmciStats); ok {
-		return x.OnuOmciStats
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetOltRxPower() *GetOltRxPowerResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_OltRxPower); ok {
-		return x.OltRxPower
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetOnuActiveAlarms() *GetOnuOmciActiveAlarmsResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_OnuActiveAlarms); ok {
-		return x.OnuActiveAlarms
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetOffloadedAppsStats() *GetOffloadedAppsStatisticsResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_OffloadedAppsStats); ok {
-		return x.OffloadedAppsStats
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetOnuAllocGemStatsResponse() *GetOnuAllocGemHistoryResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_OnuAllocGemStatsResponse); ok {
-		return x.OnuAllocGemStatsResponse
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetOnuStatsFromOltResponse() *GetOnuStatsFromOltResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_OnuStatsFromOltResponse); ok {
-		return x.OnuStatsFromOltResponse
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetOltPonStatsResponse() *GetPonStatsResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_OltPonStatsResponse); ok {
-		return x.OltPonStatsResponse
-	}
-	return nil
-}
-
-func (m *GetValueResponse) GetOltNniStatsResponse() *GetNNIStatsResponse {
-	if x, ok := m.GetResponse().(*GetValueResponse_OltNniStatsResponse); ok {
-		return x.OltNniStatsResponse
-	}
-	return nil
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*GetValueResponse) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*GetValueResponse_Distance)(nil),
-		(*GetValueResponse_UniInfo)(nil),
-		(*GetValueResponse_PortCoutners)(nil),
-		(*GetValueResponse_OnuOpticalInfo)(nil),
-		(*GetValueResponse_EthBridgePortInfo)(nil),
-		(*GetValueResponse_FecHistory)(nil),
-		(*GetValueResponse_OnuPonCounters)(nil),
-		(*GetValueResponse_OnuCounters)(nil),
-		(*GetValueResponse_RxPower)(nil),
-		(*GetValueResponse_OnuOmciStats)(nil),
-		(*GetValueResponse_OltRxPower)(nil),
-		(*GetValueResponse_OnuActiveAlarms)(nil),
-		(*GetValueResponse_OffloadedAppsStats)(nil),
-		(*GetValueResponse_OnuAllocGemStatsResponse)(nil),
-		(*GetValueResponse_OnuStatsFromOltResponse)(nil),
-		(*GetValueResponse_OltPonStatsResponse)(nil),
-		(*GetValueResponse_OltNniStatsResponse)(nil),
-	}
-}
-
 // AppOffloadConfig is the configuration for offloading applications to the OLT and has OLT wide configuration.
 type AppOffloadConfig struct {
-	EnableDHCPv4RA bool `protobuf:"varint,1,opt,name=enableDHCPv4RA,proto3" json:"enableDHCPv4RA,omitempty"`
-	EnableDHCPv6RA bool `protobuf:"varint,2,opt,name=enableDHCPv6RA,proto3" json:"enableDHCPv6RA,omitempty"`
-	EnablePPPoEIA  bool `protobuf:"varint,3,opt,name=enablePPPoEIA,proto3" json:"enablePPPoEIA,omitempty"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	EnableDHCPv4RA bool                   `protobuf:"varint,1,opt,name=enableDHCPv4RA,proto3" json:"enableDHCPv4RA,omitempty"`
+	EnableDHCPv6RA bool                   `protobuf:"varint,2,opt,name=enableDHCPv6RA,proto3" json:"enableDHCPv6RA,omitempty"`
+	EnablePPPoEIA  bool                   `protobuf:"varint,3,opt,name=enablePPPoEIA,proto3" json:"enablePPPoEIA,omitempty"`
 	// Follows the same as the BBF Access Node Id defined in https://github.com/BroadbandForum/yang/blob/master/standard/networking/bbf-subscriber-profiles.yang
-	AccessNodeID         string   `protobuf:"bytes,4,opt,name=accessNodeID,proto3" json:"accessNodeID,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	AccessNodeID  string `protobuf:"bytes,4,opt,name=accessNodeID,proto3" json:"accessNodeID,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *AppOffloadConfig) Reset()         { *m = AppOffloadConfig{} }
-func (m *AppOffloadConfig) String() string { return proto.CompactTextString(m) }
-func (*AppOffloadConfig) ProtoMessage()    {}
+func (x *AppOffloadConfig) Reset() {
+	*x = AppOffloadConfig{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[49]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *AppOffloadConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AppOffloadConfig) ProtoMessage() {}
+
+func (x *AppOffloadConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 AppOffloadConfig.ProtoReflect.Descriptor instead.
 func (*AppOffloadConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{49}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{49}
 }
 
-func (m *AppOffloadConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_AppOffloadConfig.Unmarshal(m, b)
-}
-func (m *AppOffloadConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_AppOffloadConfig.Marshal(b, m, deterministic)
-}
-func (m *AppOffloadConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_AppOffloadConfig.Merge(m, src)
-}
-func (m *AppOffloadConfig) XXX_Size() int {
-	return xxx_messageInfo_AppOffloadConfig.Size(m)
-}
-func (m *AppOffloadConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_AppOffloadConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_AppOffloadConfig proto.InternalMessageInfo
-
-func (m *AppOffloadConfig) GetEnableDHCPv4RA() bool {
-	if m != nil {
-		return m.EnableDHCPv4RA
+func (x *AppOffloadConfig) GetEnableDHCPv4RA() bool {
+	if x != nil {
+		return x.EnableDHCPv4RA
 	}
 	return false
 }
 
-func (m *AppOffloadConfig) GetEnableDHCPv6RA() bool {
-	if m != nil {
-		return m.EnableDHCPv6RA
+func (x *AppOffloadConfig) GetEnableDHCPv6RA() bool {
+	if x != nil {
+		return x.EnableDHCPv6RA
 	}
 	return false
 }
 
-func (m *AppOffloadConfig) GetEnablePPPoEIA() bool {
-	if m != nil {
-		return m.EnablePPPoEIA
+func (x *AppOffloadConfig) GetEnablePPPoEIA() bool {
+	if x != nil {
+		return x.EnablePPPoEIA
 	}
 	return false
 }
 
-func (m *AppOffloadConfig) GetAccessNodeID() string {
-	if m != nil {
-		return m.AccessNodeID
+func (x *AppOffloadConfig) GetAccessNodeID() string {
+	if x != nil {
+		return x.AccessNodeID
 	}
 	return ""
 }
 
 // AppOffloadOnuConfig has Onu specfic configuration which the OLT runs applications which have been offloaded.
 type AppOffloadOnuConfig struct {
-	OnuDeviceId          string                              `protobuf:"bytes,1,opt,name=onuDeviceId,proto3" json:"onuDeviceId,omitempty"`
-	PerUniInfo           []*AppOffloadOnuConfig_PerUniConfig `protobuf:"bytes,5,rep,name=perUniInfo,proto3" json:"perUniInfo,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
-	XXX_unrecognized     []byte                              `json:"-"`
-	XXX_sizecache        int32                               `json:"-"`
+	state         protoimpl.MessageState              `protogen:"open.v1"`
+	OnuDeviceId   string                              `protobuf:"bytes,1,opt,name=onuDeviceId,proto3" json:"onuDeviceId,omitempty"`
+	PerUniInfo    []*AppOffloadOnuConfig_PerUniConfig `protobuf:"bytes,5,rep,name=perUniInfo,proto3" json:"perUniInfo,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *AppOffloadOnuConfig) Reset()         { *m = AppOffloadOnuConfig{} }
-func (m *AppOffloadOnuConfig) String() string { return proto.CompactTextString(m) }
-func (*AppOffloadOnuConfig) ProtoMessage()    {}
+func (x *AppOffloadOnuConfig) Reset() {
+	*x = AppOffloadOnuConfig{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[50]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *AppOffloadOnuConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AppOffloadOnuConfig) ProtoMessage() {}
+
+func (x *AppOffloadOnuConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 AppOffloadOnuConfig.ProtoReflect.Descriptor instead.
 func (*AppOffloadOnuConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{50}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{50}
 }
 
-func (m *AppOffloadOnuConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_AppOffloadOnuConfig.Unmarshal(m, b)
-}
-func (m *AppOffloadOnuConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_AppOffloadOnuConfig.Marshal(b, m, deterministic)
-}
-func (m *AppOffloadOnuConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_AppOffloadOnuConfig.Merge(m, src)
-}
-func (m *AppOffloadOnuConfig) XXX_Size() int {
-	return xxx_messageInfo_AppOffloadOnuConfig.Size(m)
-}
-func (m *AppOffloadOnuConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_AppOffloadOnuConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_AppOffloadOnuConfig proto.InternalMessageInfo
-
-func (m *AppOffloadOnuConfig) GetOnuDeviceId() string {
-	if m != nil {
-		return m.OnuDeviceId
+func (x *AppOffloadOnuConfig) GetOnuDeviceId() string {
+	if x != nil {
+		return x.OnuDeviceId
 	}
 	return ""
 }
 
-func (m *AppOffloadOnuConfig) GetPerUniInfo() []*AppOffloadOnuConfig_PerUniConfig {
-	if m != nil {
-		return m.PerUniInfo
+func (x *AppOffloadOnuConfig) GetPerUniInfo() []*AppOffloadOnuConfig_PerUniConfig {
+	if x != nil {
+		return x.PerUniInfo
 	}
 	return nil
 }
 
-type AppOffloadOnuConfig_PerUniConfig struct {
-	// As per the BBF Agent Remote Id defined in https://github.com/BroadbandForum/yang/blob/master/standard/networking/bbf-pppoe-intermediate-agent-profile-common.yang
-	AgentRemoteID string `protobuf:"bytes,2,opt,name=agentRemoteID,proto3" json:"agentRemoteID,omitempty"`
-	// As per the BBF Agent Circuit Id defined in https://github.com/BroadbandForum/yang/blob/master/standard/networking/bbf-pppoe-intermediate-agent-profile-common.yang
-	AgentCircuitID string `protobuf:"bytes,3,opt,name=agentCircuitID,proto3" json:"agentCircuitID,omitempty"`
-	// The id of the UNI on the Onu for which this configuration is relevant. The UNI ids are numbered from 0 to n depending on the number of UNI ports on the ONU.
-	OnuUniId             uint32   `protobuf:"varint,4,opt,name=onuUniId,proto3" json:"onuUniId,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *AppOffloadOnuConfig_PerUniConfig) Reset()         { *m = AppOffloadOnuConfig_PerUniConfig{} }
-func (m *AppOffloadOnuConfig_PerUniConfig) String() string { return proto.CompactTextString(m) }
-func (*AppOffloadOnuConfig_PerUniConfig) ProtoMessage()    {}
-func (*AppOffloadOnuConfig_PerUniConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{50, 0}
-}
-
-func (m *AppOffloadOnuConfig_PerUniConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_AppOffloadOnuConfig_PerUniConfig.Unmarshal(m, b)
-}
-func (m *AppOffloadOnuConfig_PerUniConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_AppOffloadOnuConfig_PerUniConfig.Marshal(b, m, deterministic)
-}
-func (m *AppOffloadOnuConfig_PerUniConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_AppOffloadOnuConfig_PerUniConfig.Merge(m, src)
-}
-func (m *AppOffloadOnuConfig_PerUniConfig) XXX_Size() int {
-	return xxx_messageInfo_AppOffloadOnuConfig_PerUniConfig.Size(m)
-}
-func (m *AppOffloadOnuConfig_PerUniConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_AppOffloadOnuConfig_PerUniConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_AppOffloadOnuConfig_PerUniConfig proto.InternalMessageInfo
-
-func (m *AppOffloadOnuConfig_PerUniConfig) GetAgentRemoteID() string {
-	if m != nil {
-		return m.AgentRemoteID
-	}
-	return ""
-}
-
-func (m *AppOffloadOnuConfig_PerUniConfig) GetAgentCircuitID() string {
-	if m != nil {
-		return m.AgentCircuitID
-	}
-	return ""
-}
-
-func (m *AppOffloadOnuConfig_PerUniConfig) GetOnuUniId() uint32 {
-	if m != nil {
-		return m.OnuUniId
-	}
-	return 0
-}
-
 type SetValueRequest struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
 	// Types that are valid to be assigned to Request:
+	//
 	//	*SetValueRequest_AlarmConfig
 	//	*SetValueRequest_AppOffloadConfig
 	//	*SetValueRequest_AppOffloadOnuConfig
-	Request              isSetValueRequest_Request `protobuf_oneof:"request"`
-	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
-	XXX_unrecognized     []byte                    `json:"-"`
-	XXX_sizecache        int32                     `json:"-"`
+	Request       isSetValueRequest_Request `protobuf_oneof:"request"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *SetValueRequest) Reset()         { *m = SetValueRequest{} }
-func (m *SetValueRequest) String() string { return proto.CompactTextString(m) }
-func (*SetValueRequest) ProtoMessage()    {}
+func (x *SetValueRequest) Reset() {
+	*x = SetValueRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[51]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SetValueRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetValueRequest) ProtoMessage() {}
+
+func (x *SetValueRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 SetValueRequest.ProtoReflect.Descriptor instead.
 func (*SetValueRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{51}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{51}
 }
 
-func (m *SetValueRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SetValueRequest.Unmarshal(m, b)
-}
-func (m *SetValueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SetValueRequest.Marshal(b, m, deterministic)
-}
-func (m *SetValueRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SetValueRequest.Merge(m, src)
-}
-func (m *SetValueRequest) XXX_Size() int {
-	return xxx_messageInfo_SetValueRequest.Size(m)
-}
-func (m *SetValueRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_SetValueRequest.DiscardUnknown(m)
+func (x *SetValueRequest) GetRequest() isSetValueRequest_Request {
+	if x != nil {
+		return x.Request
+	}
+	return nil
 }
 
-var xxx_messageInfo_SetValueRequest proto.InternalMessageInfo
+func (x *SetValueRequest) GetAlarmConfig() *config.AlarmConfig {
+	if x != nil {
+		if x, ok := x.Request.(*SetValueRequest_AlarmConfig); ok {
+			return x.AlarmConfig
+		}
+	}
+	return nil
+}
+
+func (x *SetValueRequest) GetAppOffloadConfig() *AppOffloadConfig {
+	if x != nil {
+		if x, ok := x.Request.(*SetValueRequest_AppOffloadConfig); ok {
+			return x.AppOffloadConfig
+		}
+	}
+	return nil
+}
+
+func (x *SetValueRequest) GetAppOffloadOnuConfig() *AppOffloadOnuConfig {
+	if x != nil {
+		if x, ok := x.Request.(*SetValueRequest_AppOffloadOnuConfig); ok {
+			return x.AppOffloadOnuConfig
+		}
+	}
+	return nil
+}
 
 type isSetValueRequest_Request interface {
 	isSetValueRequest_Request()
@@ -5267,796 +5487,1455 @@
 
 func (*SetValueRequest_AppOffloadOnuConfig) isSetValueRequest_Request() {}
 
-func (m *SetValueRequest) GetRequest() isSetValueRequest_Request {
-	if m != nil {
-		return m.Request
-	}
-	return nil
-}
-
-func (m *SetValueRequest) GetAlarmConfig() *config.AlarmConfig {
-	if x, ok := m.GetRequest().(*SetValueRequest_AlarmConfig); ok {
-		return x.AlarmConfig
-	}
-	return nil
-}
-
-func (m *SetValueRequest) GetAppOffloadConfig() *AppOffloadConfig {
-	if x, ok := m.GetRequest().(*SetValueRequest_AppOffloadConfig); ok {
-		return x.AppOffloadConfig
-	}
-	return nil
-}
-
-func (m *SetValueRequest) GetAppOffloadOnuConfig() *AppOffloadOnuConfig {
-	if x, ok := m.GetRequest().(*SetValueRequest_AppOffloadOnuConfig); ok {
-		return x.AppOffloadOnuConfig
-	}
-	return nil
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*SetValueRequest) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*SetValueRequest_AlarmConfig)(nil),
-		(*SetValueRequest_AppOffloadConfig)(nil),
-		(*SetValueRequest_AppOffloadOnuConfig)(nil),
-	}
-}
-
 type SetValueResponse struct {
-	Status               SetValueResponse_Status      `protobuf:"varint,1,opt,name=status,proto3,enum=extension.SetValueResponse_Status" json:"status,omitempty"`
-	ErrReason            SetValueResponse_ErrorReason `protobuf:"varint,2,opt,name=errReason,proto3,enum=extension.SetValueResponse_ErrorReason" json:"errReason,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
-	XXX_unrecognized     []byte                       `json:"-"`
-	XXX_sizecache        int32                        `json:"-"`
+	state         protoimpl.MessageState       `protogen:"open.v1"`
+	Status        SetValueResponse_Status      `protobuf:"varint,1,opt,name=status,proto3,enum=extension.SetValueResponse_Status" json:"status,omitempty"`
+	ErrReason     SetValueResponse_ErrorReason `protobuf:"varint,2,opt,name=errReason,proto3,enum=extension.SetValueResponse_ErrorReason" json:"errReason,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *SetValueResponse) Reset()         { *m = SetValueResponse{} }
-func (m *SetValueResponse) String() string { return proto.CompactTextString(m) }
-func (*SetValueResponse) ProtoMessage()    {}
+func (x *SetValueResponse) Reset() {
+	*x = SetValueResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[52]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SetValueResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetValueResponse) ProtoMessage() {}
+
+func (x *SetValueResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 SetValueResponse.ProtoReflect.Descriptor instead.
 func (*SetValueResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{52}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{52}
 }
 
-func (m *SetValueResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SetValueResponse.Unmarshal(m, b)
-}
-func (m *SetValueResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SetValueResponse.Marshal(b, m, deterministic)
-}
-func (m *SetValueResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SetValueResponse.Merge(m, src)
-}
-func (m *SetValueResponse) XXX_Size() int {
-	return xxx_messageInfo_SetValueResponse.Size(m)
-}
-func (m *SetValueResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_SetValueResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SetValueResponse proto.InternalMessageInfo
-
-func (m *SetValueResponse) GetStatus() SetValueResponse_Status {
-	if m != nil {
-		return m.Status
+func (x *SetValueResponse) GetStatus() SetValueResponse_Status {
+	if x != nil {
+		return x.Status
 	}
 	return SetValueResponse_STATUS_UNDEFINED
 }
 
-func (m *SetValueResponse) GetErrReason() SetValueResponse_ErrorReason {
-	if m != nil {
-		return m.ErrReason
+func (x *SetValueResponse) GetErrReason() SetValueResponse_ErrorReason {
+	if x != nil {
+		return x.ErrReason
 	}
 	return SetValueResponse_REASON_UNDEFINED
 }
 
 type SingleGetValueRequest struct {
-	TargetId             string           `protobuf:"bytes,1,opt,name=targetId,proto3" json:"targetId,omitempty"`
-	Request              *GetValueRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
-	XXX_unrecognized     []byte           `json:"-"`
-	XXX_sizecache        int32            `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	TargetId      string                 `protobuf:"bytes,1,opt,name=targetId,proto3" json:"targetId,omitempty"`
+	Request       *GetValueRequest       `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *SingleGetValueRequest) Reset()         { *m = SingleGetValueRequest{} }
-func (m *SingleGetValueRequest) String() string { return proto.CompactTextString(m) }
-func (*SingleGetValueRequest) ProtoMessage()    {}
+func (x *SingleGetValueRequest) Reset() {
+	*x = SingleGetValueRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[53]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SingleGetValueRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SingleGetValueRequest) ProtoMessage() {}
+
+func (x *SingleGetValueRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 SingleGetValueRequest.ProtoReflect.Descriptor instead.
 func (*SingleGetValueRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{53}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{53}
 }
 
-func (m *SingleGetValueRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SingleGetValueRequest.Unmarshal(m, b)
-}
-func (m *SingleGetValueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SingleGetValueRequest.Marshal(b, m, deterministic)
-}
-func (m *SingleGetValueRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SingleGetValueRequest.Merge(m, src)
-}
-func (m *SingleGetValueRequest) XXX_Size() int {
-	return xxx_messageInfo_SingleGetValueRequest.Size(m)
-}
-func (m *SingleGetValueRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_SingleGetValueRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SingleGetValueRequest proto.InternalMessageInfo
-
-func (m *SingleGetValueRequest) GetTargetId() string {
-	if m != nil {
-		return m.TargetId
+func (x *SingleGetValueRequest) GetTargetId() string {
+	if x != nil {
+		return x.TargetId
 	}
 	return ""
 }
 
-func (m *SingleGetValueRequest) GetRequest() *GetValueRequest {
-	if m != nil {
-		return m.Request
+func (x *SingleGetValueRequest) GetRequest() *GetValueRequest {
+	if x != nil {
+		return x.Request
 	}
 	return nil
 }
 
 type SingleGetValueResponse struct {
-	Response             *GetValueResponse `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
-	XXX_unrecognized     []byte            `json:"-"`
-	XXX_sizecache        int32             `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Response      *GetValueResponse      `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *SingleGetValueResponse) Reset()         { *m = SingleGetValueResponse{} }
-func (m *SingleGetValueResponse) String() string { return proto.CompactTextString(m) }
-func (*SingleGetValueResponse) ProtoMessage()    {}
+func (x *SingleGetValueResponse) Reset() {
+	*x = SingleGetValueResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[54]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SingleGetValueResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SingleGetValueResponse) ProtoMessage() {}
+
+func (x *SingleGetValueResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 SingleGetValueResponse.ProtoReflect.Descriptor instead.
 func (*SingleGetValueResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{54}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{54}
 }
 
-func (m *SingleGetValueResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SingleGetValueResponse.Unmarshal(m, b)
-}
-func (m *SingleGetValueResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SingleGetValueResponse.Marshal(b, m, deterministic)
-}
-func (m *SingleGetValueResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SingleGetValueResponse.Merge(m, src)
-}
-func (m *SingleGetValueResponse) XXX_Size() int {
-	return xxx_messageInfo_SingleGetValueResponse.Size(m)
-}
-func (m *SingleGetValueResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_SingleGetValueResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SingleGetValueResponse proto.InternalMessageInfo
-
-func (m *SingleGetValueResponse) GetResponse() *GetValueResponse {
-	if m != nil {
-		return m.Response
+func (x *SingleGetValueResponse) GetResponse() *GetValueResponse {
+	if x != nil {
+		return x.Response
 	}
 	return nil
 }
 
 type SingleSetValueRequest struct {
-	TargetId             string           `protobuf:"bytes,1,opt,name=targetId,proto3" json:"targetId,omitempty"`
-	Request              *SetValueRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
-	XXX_unrecognized     []byte           `json:"-"`
-	XXX_sizecache        int32            `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	TargetId      string                 `protobuf:"bytes,1,opt,name=targetId,proto3" json:"targetId,omitempty"`
+	Request       *SetValueRequest       `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *SingleSetValueRequest) Reset()         { *m = SingleSetValueRequest{} }
-func (m *SingleSetValueRequest) String() string { return proto.CompactTextString(m) }
-func (*SingleSetValueRequest) ProtoMessage()    {}
+func (x *SingleSetValueRequest) Reset() {
+	*x = SingleSetValueRequest{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[55]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SingleSetValueRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SingleSetValueRequest) ProtoMessage() {}
+
+func (x *SingleSetValueRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 SingleSetValueRequest.ProtoReflect.Descriptor instead.
 func (*SingleSetValueRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{55}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{55}
 }
 
-func (m *SingleSetValueRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SingleSetValueRequest.Unmarshal(m, b)
-}
-func (m *SingleSetValueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SingleSetValueRequest.Marshal(b, m, deterministic)
-}
-func (m *SingleSetValueRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SingleSetValueRequest.Merge(m, src)
-}
-func (m *SingleSetValueRequest) XXX_Size() int {
-	return xxx_messageInfo_SingleSetValueRequest.Size(m)
-}
-func (m *SingleSetValueRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_SingleSetValueRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SingleSetValueRequest proto.InternalMessageInfo
-
-func (m *SingleSetValueRequest) GetTargetId() string {
-	if m != nil {
-		return m.TargetId
+func (x *SingleSetValueRequest) GetTargetId() string {
+	if x != nil {
+		return x.TargetId
 	}
 	return ""
 }
 
-func (m *SingleSetValueRequest) GetRequest() *SetValueRequest {
-	if m != nil {
-		return m.Request
+func (x *SingleSetValueRequest) GetRequest() *SetValueRequest {
+	if x != nil {
+		return x.Request
 	}
 	return nil
 }
 
 type SingleSetValueResponse struct {
-	Response             *SetValueResponse `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
-	XXX_unrecognized     []byte            `json:"-"`
-	XXX_sizecache        int32             `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Response      *SetValueResponse      `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *SingleSetValueResponse) Reset()         { *m = SingleSetValueResponse{} }
-func (m *SingleSetValueResponse) String() string { return proto.CompactTextString(m) }
-func (*SingleSetValueResponse) ProtoMessage()    {}
+func (x *SingleSetValueResponse) Reset() {
+	*x = SingleSetValueResponse{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[56]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SingleSetValueResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SingleSetValueResponse) ProtoMessage() {}
+
+func (x *SingleSetValueResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 SingleSetValueResponse.ProtoReflect.Descriptor instead.
 func (*SingleSetValueResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7ecf6e9799a9202d, []int{56}
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{56}
 }
 
-func (m *SingleSetValueResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SingleSetValueResponse.Unmarshal(m, b)
-}
-func (m *SingleSetValueResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SingleSetValueResponse.Marshal(b, m, deterministic)
-}
-func (m *SingleSetValueResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SingleSetValueResponse.Merge(m, src)
-}
-func (m *SingleSetValueResponse) XXX_Size() int {
-	return xxx_messageInfo_SingleSetValueResponse.Size(m)
-}
-func (m *SingleSetValueResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_SingleSetValueResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SingleSetValueResponse proto.InternalMessageInfo
-
-func (m *SingleSetValueResponse) GetResponse() *SetValueResponse {
-	if m != nil {
-		return m.Response
+func (x *SingleSetValueResponse) GetResponse() *SetValueResponse {
+	if x != nil {
+		return x.Response
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterEnum("extension.ValueType_Type", ValueType_Type_name, ValueType_Type_value)
-	proto.RegisterEnum("extension.GetOnuUniInfoResponse_ConfigurationInd", GetOnuUniInfoResponse_ConfigurationInd_name, GetOnuUniInfoResponse_ConfigurationInd_value)
-	proto.RegisterEnum("extension.GetOnuUniInfoResponse_AdministrativeState", GetOnuUniInfoResponse_AdministrativeState_name, GetOnuUniInfoResponse_AdministrativeState_value)
-	proto.RegisterEnum("extension.GetOnuUniInfoResponse_OperationalState", GetOnuUniInfoResponse_OperationalState_name, GetOnuUniInfoResponse_OperationalState_value)
-	proto.RegisterEnum("extension.GetOltPortCounters_PortType", GetOltPortCounters_PortType_name, GetOltPortCounters_PortType_value)
-	proto.RegisterEnum("extension.GetOnuEthernetBridgePortHistory_Direction", GetOnuEthernetBridgePortHistory_Direction_name, GetOnuEthernetBridgePortHistory_Direction_value)
-	proto.RegisterEnum("extension.GetOmciEthernetFrameExtendedPmResponse_Format", GetOmciEthernetFrameExtendedPmResponse_Format_name, GetOmciEthernetFrameExtendedPmResponse_Format_value)
-	proto.RegisterEnum("extension.GetOffloadedAppsStatisticsRequest_OffloadedApp", GetOffloadedAppsStatisticsRequest_OffloadedApp_name, GetOffloadedAppsStatisticsRequest_OffloadedApp_value)
-	proto.RegisterEnum("extension.GetValueResponse_Status", GetValueResponse_Status_name, GetValueResponse_Status_value)
-	proto.RegisterEnum("extension.GetValueResponse_ErrorReason", GetValueResponse_ErrorReason_name, GetValueResponse_ErrorReason_value)
-	proto.RegisterEnum("extension.SetValueResponse_Status", SetValueResponse_Status_name, SetValueResponse_Status_value)
-	proto.RegisterEnum("extension.SetValueResponse_ErrorReason", SetValueResponse_ErrorReason_name, SetValueResponse_ErrorReason_value)
-	proto.RegisterType((*ValueSet)(nil), "extension.ValueSet")
-	proto.RegisterType((*ValueType)(nil), "extension.ValueType")
-	proto.RegisterType((*ValueSpecifier)(nil), "extension.ValueSpecifier")
-	proto.RegisterType((*ReturnValues)(nil), "extension.ReturnValues")
-	proto.RegisterType((*GetDistanceRequest)(nil), "extension.GetDistanceRequest")
-	proto.RegisterType((*GetDistanceResponse)(nil), "extension.GetDistanceResponse")
-	proto.RegisterType((*GetOnuUniInfoRequest)(nil), "extension.GetOnuUniInfoRequest")
-	proto.RegisterType((*GetOnuUniInfoResponse)(nil), "extension.GetOnuUniInfoResponse")
-	proto.RegisterType((*GetOltPortCounters)(nil), "extension.GetOltPortCounters")
-	proto.RegisterType((*GetOltPortCountersResponse)(nil), "extension.GetOltPortCountersResponse")
-	proto.RegisterType((*GetOnuPonOpticalInfo)(nil), "extension.GetOnuPonOpticalInfo")
-	proto.RegisterType((*GetOnuPonOpticalInfoResponse)(nil), "extension.GetOnuPonOpticalInfoResponse")
-	proto.RegisterType((*GetOnuEthernetBridgePortHistory)(nil), "extension.GetOnuEthernetBridgePortHistory")
-	proto.RegisterType((*GetOnuEthernetBridgePortHistoryResponse)(nil), "extension.GetOnuEthernetBridgePortHistoryResponse")
-	proto.RegisterType((*GetOnuAllocGemHistoryRequest)(nil), "extension.GetOnuAllocGemHistoryRequest")
-	proto.RegisterType((*OnuGemPortHistoryData)(nil), "extension.OnuGemPortHistoryData")
-	proto.RegisterType((*OnuAllocHistoryData)(nil), "extension.OnuAllocHistoryData")
-	proto.RegisterType((*OnuAllocGemHistoryData)(nil), "extension.OnuAllocGemHistoryData")
-	proto.RegisterType((*GetOnuAllocGemHistoryResponse)(nil), "extension.GetOnuAllocGemHistoryResponse")
-	proto.RegisterType((*GetOnuFecHistory)(nil), "extension.GetOnuFecHistory")
-	proto.RegisterType((*GetOnuFecHistoryResponse)(nil), "extension.GetOnuFecHistoryResponse")
-	proto.RegisterType((*GetOnuCountersRequest)(nil), "extension.GetOnuCountersRequest")
-	proto.RegisterType((*GetOmciEthernetFrameExtendedPmRequest)(nil), "extension.GetOmciEthernetFrameExtendedPmRequest")
-	proto.RegisterType((*GetRxPowerRequest)(nil), "extension.GetRxPowerRequest")
-	proto.RegisterType((*GetOltRxPowerRequest)(nil), "extension.GetOltRxPowerRequest")
-	proto.RegisterType((*GetPonStatsRequest)(nil), "extension.GetPonStatsRequest")
-	proto.RegisterType((*GetPonStatsResponse)(nil), "extension.GetPonStatsResponse")
-	proto.RegisterType((*GetNNIStatsRequest)(nil), "extension.GetNNIStatsRequest")
-	proto.RegisterType((*GetNNIStatsResponse)(nil), "extension.GetNNIStatsResponse")
-	proto.RegisterType((*GetOnuStatsFromOltRequest)(nil), "extension.GetOnuStatsFromOltRequest")
-	proto.RegisterType((*OnuGemPortInfoFromOlt)(nil), "extension.OnuGemPortInfoFromOlt")
-	proto.RegisterType((*OnuAllocIdInfoFromOlt)(nil), "extension.OnuAllocIdInfoFromOlt")
-	proto.RegisterType((*OnuAllocGemStatsFromOltResponse)(nil), "extension.OnuAllocGemStatsFromOltResponse")
-	proto.RegisterType((*GetOnuStatsFromOltResponse)(nil), "extension.GetOnuStatsFromOltResponse")
-	proto.RegisterType((*GetOnuCountersResponse)(nil), "extension.GetOnuCountersResponse")
-	proto.RegisterType((*OmciEthernetFrameExtendedPm)(nil), "extension.OmciEthernetFrameExtendedPm")
-	proto.RegisterType((*GetOmciEthernetFrameExtendedPmResponse)(nil), "extension.GetOmciEthernetFrameExtendedPmResponse")
-	proto.RegisterType((*RxPower)(nil), "extension.RxPower")
-	proto.RegisterType((*GetOltRxPowerResponse)(nil), "extension.GetOltRxPowerResponse")
-	proto.RegisterType((*GetRxPowerResponse)(nil), "extension.GetRxPowerResponse")
-	proto.RegisterType((*GetOnuOmciTxRxStatsRequest)(nil), "extension.GetOnuOmciTxRxStatsRequest")
-	proto.RegisterType((*GetOnuOmciTxRxStatsResponse)(nil), "extension.GetOnuOmciTxRxStatsResponse")
-	proto.RegisterType((*GetOnuOmciActiveAlarmsRequest)(nil), "extension.GetOnuOmciActiveAlarmsRequest")
-	proto.RegisterType((*AlarmData)(nil), "extension.AlarmData")
-	proto.RegisterType((*GetOnuOmciActiveAlarmsResponse)(nil), "extension.GetOnuOmciActiveAlarmsResponse")
-	proto.RegisterType((*GetOffloadedAppsStatisticsRequest)(nil), "extension.GetOffloadedAppsStatisticsRequest")
-	proto.RegisterType((*GetOffloadedAppsStatisticsResponse)(nil), "extension.GetOffloadedAppsStatisticsResponse")
-	proto.RegisterType((*GetOffloadedAppsStatisticsResponse_DHCPv4RAStats)(nil), "extension.GetOffloadedAppsStatisticsResponse.DHCPv4RAStats")
-	proto.RegisterMapType((map[string]string)(nil), "extension.GetOffloadedAppsStatisticsResponse.DHCPv4RAStats.AdditionalStatsEntry")
-	proto.RegisterType((*GetOffloadedAppsStatisticsResponse_DHCPv6RAStats)(nil), "extension.GetOffloadedAppsStatisticsResponse.DHCPv6RAStats")
-	proto.RegisterMapType((map[string]string)(nil), "extension.GetOffloadedAppsStatisticsResponse.DHCPv6RAStats.AdditionalStatsEntry")
-	proto.RegisterType((*GetOffloadedAppsStatisticsResponse_PPPoeIAStats)(nil), "extension.GetOffloadedAppsStatisticsResponse.PPPoeIAStats")
-	proto.RegisterMapType((map[string]string)(nil), "extension.GetOffloadedAppsStatisticsResponse.PPPoeIAStats.AdditionalStatsEntry")
-	proto.RegisterType((*GetValueRequest)(nil), "extension.GetValueRequest")
-	proto.RegisterType((*GetValueResponse)(nil), "extension.GetValueResponse")
-	proto.RegisterType((*AppOffloadConfig)(nil), "extension.AppOffloadConfig")
-	proto.RegisterType((*AppOffloadOnuConfig)(nil), "extension.AppOffloadOnuConfig")
-	proto.RegisterType((*AppOffloadOnuConfig_PerUniConfig)(nil), "extension.AppOffloadOnuConfig.PerUniConfig")
-	proto.RegisterType((*SetValueRequest)(nil), "extension.SetValueRequest")
-	proto.RegisterType((*SetValueResponse)(nil), "extension.SetValueResponse")
-	proto.RegisterType((*SingleGetValueRequest)(nil), "extension.SingleGetValueRequest")
-	proto.RegisterType((*SingleGetValueResponse)(nil), "extension.SingleGetValueResponse")
-	proto.RegisterType((*SingleSetValueRequest)(nil), "extension.SingleSetValueRequest")
-	proto.RegisterType((*SingleSetValueResponse)(nil), "extension.SingleSetValueResponse")
+type GetOffloadedAppsStatisticsResponse_DHCPv4RAStats struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// From https://github.com/BroadbandForum/yang/blob/master/standard/networking/bbf-l2-dhcpv4-relay.yang
+	InBadPacketsFromClient           uint32 `protobuf:"varint,1,opt,name=in_bad_packets_from_client,json=inBadPacketsFromClient,proto3" json:"in_bad_packets_from_client,omitempty"`
+	InBadPacketsFromServer           uint32 `protobuf:"varint,2,opt,name=in_bad_packets_from_server,json=inBadPacketsFromServer,proto3" json:"in_bad_packets_from_server,omitempty"`
+	InPacketsFromClient              uint32 `protobuf:"varint,3,opt,name=in_packets_from_client,json=inPacketsFromClient,proto3" json:"in_packets_from_client,omitempty"`
+	InPacketsFromServer              uint32 `protobuf:"varint,4,opt,name=in_packets_from_server,json=inPacketsFromServer,proto3" json:"in_packets_from_server,omitempty"`
+	OutPacketsToServer               uint32 `protobuf:"varint,5,opt,name=out_packets_to_server,json=outPacketsToServer,proto3" json:"out_packets_to_server,omitempty"`
+	OutPacketsToClient               uint32 `protobuf:"varint,6,opt,name=out_packets_to_client,json=outPacketsToClient,proto3" json:"out_packets_to_client,omitempty"`
+	Option_82InsertedPacketsToServer uint32 `protobuf:"varint,7,opt,name=option_82_inserted_packets_to_server,json=option82InsertedPacketsToServer,proto3" json:"option_82_inserted_packets_to_server,omitempty"`
+	Option_82RemovedPacketsToClient  uint32 `protobuf:"varint,8,opt,name=option_82_removed_packets_to_client,json=option82RemovedPacketsToClient,proto3" json:"option_82_removed_packets_to_client,omitempty"`
+	Option_82NotInsertedToServer     uint32 `protobuf:"varint,9,opt,name=option_82_not_inserted_to_server,json=option82NotInsertedToServer,proto3" json:"option_82_not_inserted_to_server,omitempty"`
+	// Name value pairs that gives the flexibility to report different statistics that implementations may choose
+	AdditionalStats map[string]string `protobuf:"bytes,10,rep,name=additional_stats,json=additionalStats,proto3" json:"additional_stats,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
 }
 
-func init() { proto.RegisterFile("voltha_protos/extensions.proto", fileDescriptor_7ecf6e9799a9202d) }
-
-var fileDescriptor_7ecf6e9799a9202d = []byte{
-	// 5317 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x7c, 0xcb, 0x6f, 0x23, 0x49,
-	0x72, 0xb7, 0x48, 0x49, 0x14, 0x19, 0x14, 0x25, 0x2a, 0xf5, 0x68, 0x4a, 0xea, 0xd7, 0x70, 0xe7,
-	0xd1, 0xb3, 0xdf, 0x8c, 0xba, 0xc5, 0x96, 0xd4, 0x9a, 0xde, 0xd9, 0xfd, 0x96, 0x94, 0x28, 0x91,
-	0x5f, 0x77, 0x53, 0x9c, 0x24, 0x35, 0x8f, 0xfd, 0xe0, 0xad, 0x2d, 0xb1, 0x52, 0xea, 0x42, 0x93,
-	0x95, 0x74, 0x55, 0x51, 0xab, 0x1e, 0xc3, 0x37, 0xdf, 0xd6, 0x3e, 0x19, 0x30, 0x7c, 0xf1, 0xcd,
-	0x17, 0x03, 0x36, 0x7c, 0xd8, 0x83, 0xe1, 0xeb, 0xc2, 0x47, 0xff, 0x13, 0x86, 0x0f, 0x3e, 0x1b,
-	0xb0, 0x01, 0xc3, 0x06, 0x0c, 0x23, 0x5f, 0x55, 0x59, 0xc5, 0xa2, 0xd4, 0x9a, 0x5d, 0xaf, 0x01,
-	0x5f, 0x66, 0x94, 0xf1, 0xf8, 0x65, 0x64, 0x56, 0x44, 0x64, 0x46, 0x66, 0xb2, 0xe1, 0xfe, 0x25,
-	0xed, 0xfb, 0xaf, 0x4d, 0x63, 0xe8, 0x52, 0x9f, 0x7a, 0x8f, 0xc9, 0x95, 0x4f, 0x1c, 0xcf, 0xa6,
-	0x8e, 0xb7, 0xc5, 0x29, 0x28, 0x17, 0x50, 0x36, 0xc6, 0x45, 0x8d, 0x1e, 0x75, 0xce, 0xed, 0x0b,
-	0x21, 0xba, 0xb1, 0x79, 0x41, 0xe9, 0x45, 0x9f, 0x3c, 0xe6, 0xad, 0xb3, 0xd1, 0xf9, 0x63, 0x32,
-	0x18, 0xfa, 0x6f, 0x25, 0x73, 0x23, 0xaa, 0xdc, 0xa3, 0x83, 0x01, 0x75, 0x04, 0xaf, 0xfc, 0x3b,
-	0x90, 0xfd, 0xd2, 0xec, 0x8f, 0x48, 0x87, 0xf8, 0x68, 0x01, 0xd2, 0xb6, 0x55, 0x4a, 0x3d, 0x4c,
-	0x3d, 0xca, 0xe1, 0xb4, 0x6d, 0xa1, 0x7d, 0x98, 0x37, 0xfb, 0xa6, 0x3b, 0x90, 0x5d, 0x95, 0xd2,
-	0x0f, 0x53, 0x8f, 0xf2, 0x95, 0xe5, 0x2d, 0xd9, 0x73, 0x95, 0xf1, 0x0e, 0xf8, 0xdf, 0x8d, 0x29,
-	0x9c, 0x37, 0xc3, 0x66, 0x6d, 0x0e, 0x66, 0x2f, 0x19, 0x6a, 0xf9, 0x13, 0xc8, 0x71, 0xf8, 0xee,
-	0xdb, 0x21, 0x29, 0x3f, 0x80, 0x19, 0xf6, 0x7f, 0x94, 0x83, 0xd9, 0xfa, 0xab, 0x76, 0xf7, 0x9b,
-	0xe2, 0x14, 0x9a, 0x87, 0xec, 0x61, 0xb3, 0xd3, 0xad, 0xb6, 0x0e, 0xea, 0xc5, 0x54, 0xf9, 0x0b,
-	0x58, 0x10, 0xc6, 0x0c, 0x49, 0xcf, 0x3e, 0xb7, 0x89, 0x3b, 0x66, 0xd2, 0x63, 0x09, 0xcc, 0x6d,
-	0x59, 0xa8, 0xac, 0x6f, 0x05, 0x53, 0xb4, 0x15, 0xf4, 0xb3, 0xc5, 0xfe, 0x83, 0xa5, 0x01, 0x3e,
-	0xcc, 0x63, 0xe2, 0x8f, 0x5c, 0x87, 0xb3, 0x3d, 0x54, 0x84, 0xe9, 0x0e, 0xf1, 0x39, 0x62, 0x01,
-	0xb3, 0x3f, 0xd1, 0x43, 0xc8, 0x9f, 0x3a, 0xde, 0x68, 0x38, 0xa4, 0xae, 0x4f, 0x2c, 0x0e, 0x5c,
-	0xc0, 0x3a, 0x09, 0xad, 0xc0, 0x6c, 0xdd, 0x75, 0xa9, 0x5b, 0x9a, 0xe6, 0x3c, 0xd1, 0x40, 0x1b,
-	0x90, 0x3d, 0xb4, 0x3d, 0xdf, 0x74, 0x7a, 0xa4, 0x34, 0xc3, 0x19, 0x41, 0xbb, 0xbc, 0x07, 0xe8,
-	0x98, 0xf8, 0xaa, 0x89, 0xc9, 0xef, 0x8e, 0x88, 0xc7, 0x7b, 0xa2, 0xce, 0xe8, 0x90, 0x5c, 0xda,
-	0x3d, 0xd2, 0x54, 0xa3, 0xd2, 0x49, 0xe5, 0x6d, 0x58, 0x8e, 0xe8, 0x79, 0x43, 0xea, 0x78, 0x84,
-	0x75, 0x65, 0xa9, 0xae, 0x84, 0xe5, 0x41, 0xbb, 0x5c, 0x81, 0x95, 0x63, 0xe2, 0x9f, 0x38, 0xa3,
-	0x53, 0xc7, 0x6e, 0x3a, 0xe7, 0x54, 0x75, 0xb6, 0x01, 0xd9, 0x11, 0xa3, 0x58, 0xe4, 0x4a, 0xe9,
-	0xa8, 0x76, 0xf9, 0x1f, 0x66, 0x60, 0x35, 0xa6, 0x24, 0x7b, 0x6a, 0x43, 0xd6, 0xb4, 0x06, 0x1d,
-	0xdf, 0xf4, 0x45, 0x4f, 0x0b, 0x95, 0x1d, 0x6d, 0x8a, 0x13, 0x75, 0xb6, 0xaa, 0xd6, 0xc0, 0x76,
-	0x6c, 0xcf, 0x77, 0x4d, 0xdf, 0xbe, 0x24, 0x5c, 0x17, 0x07, 0x28, 0xe8, 0x04, 0x72, 0x74, 0x48,
-	0x5c, 0x01, 0x29, 0xbe, 0xda, 0xf6, 0x8d, 0x90, 0x27, 0x43, 0xc2, 0xd0, 0xa8, 0x63, 0xf6, 0x05,
-	0x5e, 0x88, 0xc1, 0x00, 0x85, 0x03, 0x36, 0x1d, 0x8b, 0x7f, 0x91, 0x77, 0x01, 0x14, 0x7e, 0x39,
-	0x12, 0xa0, 0x4d, 0xc7, 0xc2, 0x21, 0x46, 0xf9, 0x57, 0x29, 0x28, 0xc6, 0xf9, 0x08, 0x20, 0x73,
-	0xda, 0x7a, 0x71, 0xf2, 0x55, 0xab, 0x38, 0x85, 0x10, 0x2c, 0x74, 0xeb, 0x2d, 0xa3, 0x56, 0xed,
-	0xd4, 0x8d, 0xae, 0x71, 0x74, 0xf8, 0x75, 0x31, 0x85, 0xd6, 0x00, 0x35, 0x4e, 0x5b, 0x87, 0xb8,
-	0x7e, 0xa8, 0xd3, 0xd3, 0xa8, 0x04, 0x2b, 0xc7, 0xcd, 0xe3, 0x6a, 0xad, 0xd9, 0x35, 0xea, 0xdd,
-	0x46, 0x1d, 0xb7, 0xea, 0x82, 0x33, 0xcd, 0x34, 0x18, 0xca, 0x71, 0x94, 0x3e, 0x13, 0x43, 0x6f,
-	0x1c, 0x7e, 0x5d, 0x9c, 0x4d, 0x40, 0x67, 0xf4, 0x4c, 0x22, 0x3a, 0xe3, 0xcc, 0x95, 0x8f, 0x61,
-	0x39, 0xe1, 0x3b, 0x30, 0xa0, 0xea, 0xe1, 0xab, 0x4e, 0xb7, 0xda, 0xad, 0x1b, 0xa7, 0xad, 0xc3,
-	0xfa, 0x51, 0xb3, 0x55, 0x3f, 0x2c, 0x4e, 0xb1, 0xe1, 0xbd, 0x3c, 0x39, 0x78, 0x51, 0x3f, 0x2c,
-	0xa6, 0x58, 0x0c, 0x9e, 0xb6, 0x64, 0x2b, 0x5d, 0x3e, 0x82, 0x62, 0x7c, 0xf6, 0xd1, 0x1d, 0x58,
-	0x3e, 0x69, 0xd7, 0xf1, 0x38, 0x4c, 0x1e, 0xe6, 0xea, 0xad, 0x6a, 0xed, 0xa5, 0xc2, 0x39, 0x6c,
-	0x76, 0x44, 0x2b, 0x5d, 0xfe, 0x9b, 0x14, 0x8f, 0x81, 0x93, 0xbe, 0xdf, 0xa6, 0xae, 0x7f, 0x40,
-	0x47, 0x8e, 0x4f, 0x5c, 0x0f, 0xad, 0x41, 0x86, 0x45, 0x55, 0x8b, 0x4a, 0xa7, 0x94, 0x2d, 0x54,
-	0x83, 0x2c, 0xfb, 0x8b, 0x85, 0xae, 0xf4, 0x92, 0x0f, 0x63, 0x1f, 0x35, 0x0a, 0xb4, 0xd5, 0x96,
-	0xd2, 0x38, 0xd0, 0x2b, 0xd7, 0x21, 0xab, 0xa8, 0xa8, 0x08, 0xf3, 0xec, 0x6f, 0xe3, 0xb4, 0xf5,
-	0xa2, 0x25, 0xbe, 0xe2, 0x2a, 0x2c, 0x71, 0x4a, 0x30, 0x71, 0xad, 0x56, 0xb3, 0x98, 0x0a, 0x04,
-	0xdb, 0x27, 0x2d, 0xe3, 0xe4, 0x65, 0xb7, 0x98, 0x2e, 0xff, 0xfd, 0x34, 0x6c, 0x8c, 0x77, 0x18,
-	0x84, 0x48, 0x09, 0xe6, 0xfc, 0xab, 0xda, 0x5b, 0x9f, 0x78, 0x7c, 0x08, 0x33, 0x58, 0x35, 0x19,
-	0xc7, 0x95, 0x9c, 0xb4, 0xe0, 0xc8, 0x26, 0xba, 0x0b, 0x39, 0xff, 0xaa, 0x6d, 0xf6, 0xde, 0x10,
-	0xdf, 0xe3, 0x3e, 0x3b, 0x83, 0x43, 0x02, 0xe3, 0xba, 0x01, 0x77, 0x46, 0x70, 0x03, 0x02, 0xfa,
-	0x10, 0x16, 0xfc, 0x2b, 0x9e, 0x72, 0x94, 0xc8, 0x2c, 0x17, 0x89, 0x51, 0x99, 0x9c, 0x1b, 0x95,
-	0xcb, 0x08, 0x39, 0x77, 0x4c, 0xce, 0xbf, 0xaa, 0xf5, 0x4c, 0xcf, 0x57, 0x72, 0x73, 0x0a, 0x4f,
-	0xa7, 0x0a, 0xbc, 0x88, 0x5c, 0x56, 0xe1, 0xc5, 0xe5, 0xfc, 0xab, 0x53, 0x5d, 0x2e, 0xa7, 0xf0,
-	0x4e, 0xc7, 0xf0, 0x22, 0x72, 0xa0, 0xf0, 0x4e, 0xc7, 0xf0, 0x5e, 0xe9, 0x72, 0x79, 0x85, 0xf7,
-	0x6a, 0x0c, 0x2f, 0x22, 0x37, 0xaf, 0xf0, 0x74, 0x6a, 0xf9, 0x50, 0x25, 0xc8, 0x36, 0x75, 0x4e,
-	0x86, 0xbe, 0xdd, 0x33, 0xfb, 0x2c, 0x35, 0xa0, 0x4f, 0x60, 0x96, 0x2f, 0x92, 0xfc, 0x2b, 0xe6,
-	0x2b, 0x6b, 0x5b, 0x62, 0x09, 0xdd, 0x52, 0x4b, 0xe8, 0x56, 0x9d, 0x71, 0xb1, 0x10, 0x2a, 0xff,
-	0x41, 0x1a, 0xee, 0x26, 0xc1, 0x04, 0x6e, 0xf1, 0x7d, 0x28, 0x0e, 0xe9, 0xcf, 0x89, 0x7b, 0x44,
-	0x88, 0xf5, 0x25, 0xed, 0xfb, 0xe6, 0x85, 0xc8, 0xa0, 0x69, 0x3c, 0x46, 0x47, 0x15, 0x58, 0x71,
-	0x49, 0x8f, 0xd8, 0x97, 0xc4, 0x92, 0x50, 0x6d, 0x26, 0xc2, 0xbd, 0x26, 0x8d, 0x13, 0x79, 0x68,
-	0x0f, 0xd6, 0x06, 0xc4, 0x54, 0x5d, 0xbf, 0x34, 0x47, 0x4e, 0xef, 0xb5, 0xd0, 0x9a, 0xe6, 0x5a,
-	0x13, 0xb8, 0xcc, 0xae, 0xbe, 0xe9, 0x11, 0xb7, 0x66, 0x9b, 0xde, 0xc1, 0xc8, 0x75, 0x89, 0xe3,
-	0x73, 0x1f, 0x4b, 0xe3, 0x31, 0x3a, 0x5b, 0xa0, 0x7c, 0x32, 0xe0, 0xd1, 0x3f, 0x72, 0x09, 0xf7,
-	0xb3, 0x34, 0xd6, 0x49, 0xe5, 0xbf, 0x4e, 0xc1, 0x03, 0x31, 0x0d, 0x75, 0xff, 0x35, 0x71, 0x1d,
-	0xe2, 0xd7, 0x5c, 0xdb, 0xba, 0x20, 0x2c, 0x52, 0x1a, 0xb6, 0xe7, 0x53, 0xf7, 0x2d, 0xc2, 0x90,
-	0xb3, 0x6c, 0x97, 0xf4, 0x58, 0x06, 0x99, 0xb8, 0x88, 0x4c, 0x54, 0xdf, 0x3a, 0x54, 0xba, 0x38,
-	0x84, 0x29, 0xef, 0x43, 0x2e, 0xa0, 0xa3, 0x02, 0xe4, 0xf4, 0x24, 0xc4, 0xf2, 0x57, 0xbb, 0xd3,
-	0xc5, 0xf5, 0xea, 0xab, 0x62, 0x0a, 0x2d, 0x00, 0x1c, 0x9e, 0x7c, 0xd5, 0x92, 0xed, 0x74, 0xf9,
-	0x8f, 0x67, 0xe1, 0xa3, 0x1b, 0xba, 0x0c, 0xbe, 0xe1, 0x7d, 0x00, 0xcb, 0xa5, 0xc3, 0xfa, 0x25,
-	0x71, 0x7c, 0x4f, 0x26, 0x28, 0x8d, 0xc2, 0x92, 0x17, 0xed, 0xf9, 0xcc, 0xd5, 0xc4, 0x2e, 0x41,
-	0xb6, 0x58, 0xe0, 0x0f, 0xb5, 0xe0, 0x2e, 0x60, 0xd5, 0x64, 0xb3, 0x7f, 0xe6, 0x52, 0xd3, 0xd2,
-	0xdd, 0x54, 0x6c, 0x16, 0xc6, 0xe8, 0x4c, 0x76, 0x30, 0xea, 0xb3, 0x0f, 0x18, 0xca, 0xce, 0x0a,
-	0xd9, 0x38, 0x1d, 0x7d, 0x02, 0x4b, 0x3d, 0xb7, 0xc7, 0xe3, 0x9a, 0x58, 0x7a, 0xbc, 0x17, 0xf0,
-	0x38, 0x83, 0x21, 0x8f, 0x1c, 0x8b, 0xb8, 0x9e, 0xfd, 0x2d, 0xd1, 0x83, 0xbe, 0x80, 0xc7, 0xe8,
-	0xe8, 0x11, 0x2c, 0xd2, 0xcb, 0xa8, 0x68, 0x96, 0x8b, 0xc6, 0xc9, 0x4c, 0x52, 0x0e, 0x73, 0x6f,
-	0x47, 0x4e, 0x4b, 0x4e, 0x48, 0xc6, 0xc8, 0xcc, 0xdf, 0x15, 0x69, 0xb7, 0x4b, 0xb7, 0x2b, 0xcf,
-	0xa4, 0x38, 0x70, 0xf1, 0x44, 0x1e, 0xda, 0x81, 0x55, 0x49, 0xdf, 0xae, 0xec, 0x77, 0x69, 0x65,
-	0x77, 0xf7, 0x44, 0x28, 0xe5, 0xb9, 0x52, 0x32, 0x53, 0xd3, 0xaa, 0xec, 0xee, 0x75, 0xe9, 0xee,
-	0xf6, 0xb6, 0xec, 0x6a, 0x3e, 0xa2, 0x15, 0x65, 0xb2, 0xd8, 0x92, 0x8c, 0xdd, 0xed, 0x4a, 0x97,
-	0x6e, 0x3f, 0xa9, 0x3c, 0x95, 0x6a, 0x05, 0xae, 0x36, 0x81, 0x8b, 0xf6, 0xe1, 0x8e, 0x32, 0xe3,
-	0x49, 0x65, 0xa7, 0x4b, 0xb7, 0x77, 0xb7, 0xf7, 0xa5, 0xe2, 0x02, 0x57, 0x9c, 0xc4, 0x2e, 0xbf,
-	0x54, 0xd9, 0xa4, 0xda, 0xef, 0xd3, 0xde, 0x31, 0x19, 0x04, 0xae, 0x28, 0x76, 0x6f, 0xb7, 0x4b,
-	0x4e, 0xbf, 0x9c, 0x86, 0xd5, 0x13, 0x67, 0x74, 0x4c, 0x06, 0x9a, 0x57, 0x1f, 0x9a, 0xbe, 0xc9,
-	0xb6, 0xae, 0x17, 0x64, 0x20, 0x37, 0x9b, 0x05, 0x2c, 0x1a, 0xec, 0x7b, 0xf8, 0xae, 0xe9, 0x78,
-	0x03, 0xdb, 0xf7, 0x89, 0x75, 0x5c, 0x7f, 0x75, 0xe4, 0x9a, 0x03, 0xa2, 0xbc, 0x3a, 0x91, 0xc7,
-	0x3c, 0x4e, 0xe5, 0xa5, 0x50, 0x41, 0x78, 0xfb, 0x38, 0x03, 0xed, 0x85, 0x19, 0xae, 0x6d, 0xbe,
-	0xed, 0x53, 0xd3, 0x12, 0xeb, 0x22, 0xf7, 0xfd, 0x5a, 0xba, 0x94, 0xc2, 0x89, 0x7c, 0xf4, 0x39,
-	0xdc, 0xd1, 0x7a, 0x8f, 0xa8, 0xce, 0x06, 0xaa, 0x93, 0x44, 0xd0, 0x13, 0x58, 0x26, 0x4e, 0xcf,
-	0x7d, 0x3b, 0x64, 0x69, 0xe2, 0x05, 0x79, 0xcb, 0xc3, 0x40, 0xc5, 0x45, 0x12, 0x0b, 0x7d, 0x06,
-	0xeb, 0xca, 0x0e, 0x63, 0x28, 0xa0, 0x8c, 0x33, 0x86, 0x65, 0xec, 0xed, 0xf0, 0x10, 0xc9, 0xe0,
-	0xb5, 0x24, 0x43, 0xf7, 0x76, 0xd0, 0xff, 0x85, 0xbb, 0x9a, 0x1d, 0xe3, 0xda, 0x59, 0xae, 0xbd,
-	0x3e, 0xc1, 0xd6, 0xbd, 0x9d, 0x72, 0x13, 0x96, 0x95, 0x03, 0xe8, 0x9f, 0xac, 0x04, 0x73, 0x26,
-	0xa3, 0x05, 0x1f, 0x4d, 0x35, 0xe3, 0xfb, 0x8b, 0x42, 0xb0, 0xbf, 0x28, 0xff, 0x79, 0x0a, 0xd6,
-	0xc6, 0x9d, 0x89, 0xc3, 0x1d, 0xc1, 0x02, 0x95, 0x9c, 0xa6, 0xc5, 0x56, 0x2c, 0xe9, 0x52, 0xf7,
-	0xb5, 0x94, 0x9c, 0x60, 0x06, 0x8e, 0x69, 0xa1, 0x1a, 0xe4, 0x2f, 0x84, 0x7f, 0x71, 0x90, 0xf4,
-	0xc3, 0xe9, 0x47, 0xf9, 0xca, 0xc3, 0x28, 0xc8, 0xb8, 0x03, 0x62, 0x5d, 0xa9, 0xfc, 0x2d, 0xdc,
-	0x9b, 0xe0, 0xf5, 0x32, 0x01, 0x7f, 0x03, 0x6b, 0x34, 0x71, 0x18, 0xa5, 0x14, 0xef, 0xef, 0xbd,
-	0x04, 0xa3, 0xa3, 0x82, 0x78, 0x02, 0x40, 0xf9, 0xc7, 0x50, 0x14, 0x7d, 0x1f, 0x11, 0x35, 0xce,
-	0x5b, 0x46, 0xd9, 0x3f, 0x4e, 0x43, 0x29, 0x0e, 0xa1, 0x2d, 0xff, 0x0b, 0x3d, 0xea, 0xb2, 0x15,
-	0x8a, 0x58, 0xe1, 0xe6, 0x50, 0xf8, 0x6b, 0x8c, 0x83, 0x2a, 0x80, 0x02, 0xca, 0x01, 0xb5, 0xc8,
-	0x57, 0xd4, 0xb5, 0xe4, 0x27, 0xe5, 0xf2, 0x09, 0x5c, 0xb6, 0x34, 0x9d, 0x93, 0x5e, 0x87, 0xf4,
-	0xa8, 0x63, 0xa9, 0xb8, 0xd3, 0x28, 0xac, 0x7f, 0x9f, 0xfa, 0x66, 0x3f, 0xc4, 0x0b, 0x43, 0x2d,
-	0xc6, 0x41, 0xcf, 0x61, 0x6d, 0xe4, 0xc8, 0x3e, 0xcc, 0xb3, 0x3e, 0x09, 0x75, 0xc2, 0x18, 0x9b,
-	0x20, 0x81, 0x9e, 0xc2, 0xda, 0x39, 0xe9, 0x19, 0x81, 0x85, 0xa1, 0xbf, 0x67, 0xb8, 0xbf, 0x2f,
-	0x9f, 0x93, 0xde, 0x41, 0x64, 0xb8, 0x7b, 0x3b, 0xe8, 0x73, 0xd8, 0x8c, 0x2a, 0xf5, 0xa8, 0x45,
-	0x8c, 0x9f, 0x33, 0xc0, 0x30, 0xce, 0xee, 0xe8, 0x9a, 0x41, 0x87, 0x7b, 0x3b, 0xe8, 0x53, 0x58,
-	0xe6, 0x03, 0x88, 0x69, 0x89, 0xf8, 0x2a, 0x46, 0xc7, 0xb6, 0xb7, 0x83, 0x7e, 0x08, 0x9b, 0x11,
-	0xdb, 0x63, 0x6a, 0x39, 0xae, 0x56, 0x4a, 0x1e, 0xde, 0xde, 0x4e, 0xf9, 0x58, 0x95, 0xc6, 0xe1,
-	0xc6, 0x5f, 0xa4, 0xe4, 0x3b, 0x30, 0x67, 0x3b, 0xfe, 0xb9, 0x21, 0xcf, 0x23, 0xe6, 0x70, 0x86,
-	0x35, 0x9b, 0x16, 0x5a, 0x85, 0x0c, 0x75, 0x46, 0x8c, 0x9e, 0xe6, 0xf4, 0x59, 0xea, 0x8c, 0x9a,
-	0x56, 0xf9, 0x8f, 0x52, 0xf0, 0x01, 0x43, 0x1a, 0xf4, 0x6c, 0xb5, 0xf3, 0xe0, 0xc9, 0xb1, 0xce,
-	0x3c, 0xd8, 0x22, 0x56, 0x7b, 0xf0, 0xce, 0xe7, 0x02, 0xe8, 0xae, 0x56, 0xcc, 0x73, 0x3f, 0x69,
-	0x4c, 0x85, 0xe5, 0x3c, 0x4b, 0xf2, 0x2e, 0xf1, 0x88, 0xcf, 0xdd, 0x22, 0x8b, 0x45, 0xa3, 0xb6,
-	0x00, 0xf3, 0xb6, 0x67, 0x8c, 0x1c, 0xdb, 0xb0, 0x79, 0xd1, 0x7f, 0x00, 0x4b, 0xc7, 0xc4, 0xc7,
-	0x57, 0x7c, 0x5b, 0xf8, 0x5d, 0x07, 0xf5, 0x52, 0x6c, 0xa6, 0xfb, 0x71, 0x9c, 0x7b, 0x00, 0xac,
-	0x0c, 0x33, 0xfa, 0xe6, 0x19, 0xe9, 0xcb, 0x11, 0xe4, 0x18, 0xe5, 0x25, 0x23, 0x28, 0x34, 0xcf,
-	0xe1, 0x68, 0x39, 0x8e, 0xd6, 0x71, 0xca, 0x3f, 0xe1, 0x25, 0x62, 0x9b, 0x3a, 0xac, 0xcc, 0x0c,
-	0x26, 0xfa, 0x3e, 0x84, 0x9a, 0x02, 0xaa, 0x31, 0xa5, 0x83, 0x95, 0x44, 0x09, 0xd9, 0x94, 0xa6,
-	0x35, 0xa6, 0xb0, 0x6c, 0xd7, 0x40, 0x14, 0x91, 0x3c, 0xd7, 0x50, 0x7e, 0x94, 0x12, 0x62, 0x87,
-	0xd5, 0xdb, 0x90, 0x3a, 0x2c, 0x23, 0xa9, 0xec, 0x2a, 0x9b, 0xe8, 0x47, 0xb0, 0xc0, 0x94, 0x99,
-	0xb8, 0xed, 0xf9, 0x76, 0xcf, 0x93, 0xe7, 0x5d, 0x6b, 0x5b, 0xf2, 0xc0, 0xac, 0x1d, 0xe1, 0xe2,
-	0x98, 0xb4, 0x1c, 0x4c, 0xab, 0xd5, 0xfc, 0x6f, 0x1b, 0x4c, 0x88, 0x1d, 0x0e, 0xc6, 0x71, 0x6c,
-	0x7d, 0x30, 0xb2, 0xf9, 0x6b, 0x0f, 0xa6, 0x09, 0xeb, 0x22, 0x0a, 0x78, 0x87, 0x47, 0x2e, 0x1d,
-	0xb0, 0x6f, 0x2e, 0xc7, 0xb4, 0x06, 0xd2, 0x4b, 0x62, 0x3e, 0xb3, 0x02, 0xc2, 0x4b, 0xa2, 0x2e,
-	0xf3, 0x67, 0x29, 0x7d, 0x73, 0xc2, 0x86, 0x23, 0xe1, 0x26, 0x6c, 0x4e, 0x22, 0xd5, 0x70, 0x3a,
-	0x5e, 0x0d, 0x6b, 0x6b, 0xe0, 0xf4, 0x35, 0x35, 0xf6, 0x4c, 0xbc, 0xc6, 0xd6, 0xaa, 0xf6, 0xd9,
-	0x48, 0xd5, 0x5e, 0x7e, 0xc1, 0xcd, 0xd3, 0x96, 0x3a, 0x65, 0xde, 0x3b, 0x2f, 0xc4, 0xa1, 0x11,
-	0xe5, 0xbf, 0x48, 0xc1, 0x03, 0x6d, 0x61, 0x8a, 0xce, 0x9e, 0xfc, 0x6a, 0x35, 0xc8, 0x9b, 0x63,
-	0xcb, 0xf1, 0xc3, 0x84, 0x95, 0x2d, 0x62, 0x0e, 0xd6, 0x95, 0x6e, 0xb3, 0x1a, 0x47, 0x30, 0xf4,
-	0xd5, 0xf8, 0x52, 0x1c, 0x73, 0xc4, 0xbf, 0xb1, 0xb4, 0xf2, 0x6b, 0x58, 0x32, 0xf5, 0x51, 0x48,
-	0x5b, 0x59, 0x3f, 0xdf, 0x4f, 0x5e, 0x85, 0x93, 0x60, 0xf0, 0x38, 0x48, 0xf9, 0x4f, 0x0a, 0xb0,
-	0x16, 0x4f, 0xb1, 0xb2, 0xd3, 0xf5, 0x58, 0x3a, 0x62, 0xe1, 0x20, 0x9d, 0xeb, 0x4e, 0x34, 0x21,
-	0x35, 0x52, 0xd2, 0xbf, 0xd0, 0x47, 0xcc, 0xd5, 0x3d, 0xdb, 0xb7, 0x2f, 0x89, 0x61, 0xb9, 0xf6,
-	0xb9, 0x48, 0x83, 0x99, 0x46, 0x1a, 0x17, 0x14, 0xfd, 0x90, 0x91, 0x99, 0xa0, 0x43, 0x2e, 0x4c,
-	0x4d, 0x70, 0x86, 0x0b, 0x4e, 0xe3, 0x82, 0xa2, 0x0b, 0xc1, 0xe7, 0x50, 0xb2, 0x48, 0xdf, 0x1e,
-	0xd8, 0x3e, 0x71, 0x8d, 0x81, 0xed, 0x79, 0x86, 0x45, 0x7c, 0x59, 0xcf, 0xce, 0x72, 0x95, 0x19,
-	0xbc, 0x16, 0x48, 0xbc, 0xb2, 0x3d, 0xef, 0x50, 0xf1, 0xd1, 0x03, 0x80, 0x33, 0x7b, 0x68, 0x90,
-	0x70, 0xe7, 0x99, 0x69, 0xcc, 0xe2, 0xdc, 0x99, 0x3d, 0x94, 0x3b, 0xce, 0x7b, 0xc0, 0x1a, 0x2c,
-	0x2f, 0xcb, 0x22, 0x2c, 0xd3, 0xc8, 0xe0, 0xec, 0x99, 0x3d, 0x3c, 0x65, 0x14, 0x56, 0xc0, 0x44,
-	0x97, 0x4a, 0xef, 0xed, 0xe0, 0x8c, 0xf6, 0x45, 0x11, 0x96, 0x69, 0xcc, 0x45, 0x17, 0xd8, 0x8e,
-	0x60, 0xb2, 0x42, 0x44, 0x68, 0x59, 0x44, 0x2c, 0x74, 0x81, 0xbe, 0x58, 0xef, 0x1a, 0x59, 0xbc,
-	0xca, 0xf5, 0x24, 0x3f, 0x00, 0x40, 0x3f, 0x56, 0x4b, 0xb3, 0xd2, 0x8c, 0x2c, 0x8c, 0xbc, 0x42,
-	0xcb, 0x34, 0x72, 0x78, 0x5d, 0xd7, 0x3e, 0xd5, 0x45, 0xd0, 0x07, 0x50, 0x88, 0x20, 0xf0, 0x02,
-	0x2d, 0xd3, 0x00, 0x3c, 0xaf, 0xeb, 0xb0, 0xbd, 0x79, 0x74, 0x60, 0x62, 0x06, 0xe6, 0xb9, 0x70,
-	0x1e, 0x2f, 0xe9, 0xc3, 0x12, 0x53, 0xf1, 0x08, 0x16, 0xaf, 0x2e, 0xc8, 0xc0, 0x78, 0x43, 0xde,
-	0xaa, 0xf9, 0x2c, 0x70, 0xe9, 0x79, 0x5c, 0x60, 0x8c, 0x70, 0x17, 0x7f, 0x0f, 0x72, 0x5c, 0xb2,
-	0x4f, 0x3d, 0x51, 0x79, 0x65, 0x1a, 0x05, 0x9c, 0x65, 0xa4, 0x97, 0xd4, 0xe3, 0x40, 0xee, 0x95,
-	0x31, 0xec, 0x53, 0x73, 0xe0, 0x09, 0xa4, 0xd2, 0x22, 0x17, 0x5a, 0xc0, 0x05, 0xf7, 0xaa, 0xcd,
-	0xe9, 0xe2, 0x4c, 0xff, 0x53, 0x40, 0xa1, 0xa4, 0x43, 0x1d, 0xc3, 0xb6, 0xfa, 0xa4, 0x54, 0xe4,
-	0xc2, 0x8b, 0x78, 0x51, 0x09, 0xb7, 0xa8, 0xd3, 0xb4, 0xfa, 0xdc, 0x5d, 0xdd, 0x2b, 0x83, 0x0e,
-	0x7a, 0x76, 0x69, 0x89, 0xcb, 0x14, 0x71, 0xc6, 0xbd, 0x62, 0x2b, 0x3e, 0x63, 0xf9, 0x92, 0x85,
-	0x38, 0x6b, 0x09, 0x67, 0x7c, 0xc1, 0x7a, 0x0e, 0xeb, 0x52, 0xcb, 0x90, 0xe5, 0xa1, 0xd1, 0x73,
-	0x7b, 0xd2, 0xb0, 0x65, 0x2e, 0x8c, 0xf0, 0xaa, 0xc0, 0x91, 0xe9, 0xeb, 0x40, 0x96, 0xf4, 0x68,
-	0x13, 0xb2, 0xee, 0x95, 0xd8, 0x73, 0x95, 0x56, 0xb8, 0xe8, 0x72, 0x98, 0x01, 0x1f, 0x00, 0x30,
-	0xeb, 0x65, 0x0a, 0x5c, 0xe5, 0xec, 0x15, 0x3d, 0x79, 0x6e, 0x42, 0xd6, 0x57, 0xda, 0x6b, 0x9c,
-	0xbd, 0x1a, 0x9e, 0x5e, 0x3e, 0x00, 0xf0, 0x43, 0xed, 0x3b, 0x9c, 0xbd, 0xa6, 0xa7, 0xd0, 0xef,
-	0xc1, 0xfc, 0x19, 0x71, 0x0d, 0x97, 0xc8, 0x9b, 0x92, 0x12, 0x17, 0xb9, 0x83, 0xf3, 0x67, 0x6c,
-	0x1f, 0x20, 0xef, 0x4a, 0xde, 0x83, 0x7c, 0xbf, 0x67, 0x5d, 0xa8, 0x0f, 0xb6, 0xce, 0x65, 0x4a,
-	0x18, 0x18, 0x51, 0x7e, 0x2d, 0x66, 0xa6, 0x65, 0x2b, 0x89, 0x0d, 0x2e, 0xb1, 0x8e, 0x73, 0xae,
-	0x65, 0x4b, 0x81, 0xfb, 0x90, 0xf3, 0xed, 0x01, 0xf1, 0x7c, 0x73, 0x30, 0x2c, 0x6d, 0xf2, 0x68,
-	0xdf, 0xc0, 0x21, 0x89, 0x01, 0xbc, 0x26, 0x3d, 0x05, 0x70, 0x97, 0x03, 0x6c, 0xe2, 0xdc, 0x6b,
-	0x22, 0x26, 0xc9, 0xab, 0xcd, 0x03, 0xd8, 0x9e, 0x21, 0x33, 0x49, 0x2d, 0x0f, 0x39, 0xdb, 0x33,
-	0x44, 0xf2, 0xa8, 0x2d, 0xc3, 0x92, 0xed, 0x19, 0xd1, 0x84, 0x21, 0x89, 0xd1, 0xe4, 0x50, 0xbb,
-	0x07, 0x9b, 0x36, 0x8b, 0xfc, 0xe4, 0x44, 0x50, 0x5b, 0x84, 0x82, 0xed, 0x19, 0x61, 0xac, 0xcb,
-	0xfd, 0x56, 0x10, 0xdb, 0xb5, 0x0d, 0x28, 0xd9, 0x9e, 0x91, 0x18, 0xcc, 0xb5, 0xbb, 0xb0, 0x11,
-	0xf0, 0xc6, 0x42, 0xb6, 0xf6, 0x10, 0xee, 0x8f, 0x71, 0x23, 0x61, 0x59, 0x43, 0x50, 0x8c, 0x4b,
-	0xd4, 0x4a, 0xb0, 0x36, 0xd6, 0x9f, 0xb0, 0x64, 0x05, 0x90, 0xed, 0x19, 0xb1, 0x58, 0x92, 0xf6,
-	0x06, 0x71, 0x23, 0xa5, 0x62, 0x81, 0x52, 0xbb, 0x03, 0xab, 0x11, 0xaa, 0x0a, 0x0a, 0x39, 0xc7,
-	0xd2, 0x91, 0x65, 0x4b, 0x7a, 0x7c, 0xed, 0x3e, 0xdc, 0x0d, 0x79, 0xe3, 0x4e, 0x5e, 0x2b, 0x40,
-	0x5e, 0xf0, 0xb9, 0x2b, 0xca, 0xa9, 0x0c, 0x5d, 0x57, 0xf2, 0xfd, 0x28, 0x3f, 0x74, 0xce, 0xda,
-	0x12, 0x2c, 0xb2, 0xa9, 0xd6, 0x9c, 0xb1, 0x56, 0x84, 0x05, 0xdb, 0x33, 0x34, 0xd7, 0x53, 0xa8,
-	0x81, 0xa7, 0xc9, 0x01, 0x07, 0x6e, 0x24, 0x05, 0x42, 0x4f, 0x2a, 0xff, 0xe1, 0x2c, 0x6c, 0x5e,
-	0xb3, 0x5d, 0x47, 0x0f, 0x20, 0x6f, 0xb9, 0x74, 0x68, 0x90, 0xf0, 0x7c, 0x30, 0x73, 0xcd, 0xf9,
-	0x60, 0x26, 0x38, 0x1f, 0x5c, 0x83, 0xcc, 0x79, 0x78, 0x60, 0x92, 0xc1, 0xb2, 0x85, 0x3e, 0xd6,
-	0x4e, 0x07, 0x0d, 0x29, 0xc1, 0xd7, 0x24, 0xbc, 0x18, 0xd0, 0x8f, 0x02, 0xd1, 0xe0, 0x10, 0x50,
-	0x89, 0xce, 0x0a, 0xd1, 0x80, 0x1e, 0x9c, 0xd4, 0xa0, 0x60, 0xaa, 0x89, 0xa5, 0x84, 0x45, 0x79,
-	0x56, 0x0c, 0x0f, 0x07, 0x43, 0xe0, 0xe0, 0x0c, 0x50, 0xc9, 0x8a, 0x82, 0x6c, 0x31, 0xa0, 0x4b,
-	0xd1, 0x8f, 0xc2, 0xa3, 0x41, 0x25, 0x29, 0x8a, 0xb0, 0x05, 0x45, 0x96, 0x82, 0x8f, 0xa0, 0x28,
-	0xf8, 0xc6, 0xde, 0x8e, 0xa1, 0x1d, 0x0d, 0x66, 0xf0, 0x82, 0xa0, 0xef, 0xed, 0x04, 0xe7, 0x75,
-	0x77, 0x94, 0xe4, 0xae, 0xe1, 0x53, 0x63, 0xbb, 0xf2, 0xcc, 0xd0, 0x0e, 0x07, 0x59, 0x3d, 0x29,
-	0x14, 0xc4, 0xd9, 0xe0, 0x89, 0x3a, 0xaf, 0x2b, 0x49, 0xad, 0xed, 0xca, 0x3e, 0x53, 0xab, 0xec,
-	0xee, 0x2a, 0x35, 0xbe, 0xfa, 0xe0, 0x15, 0xc1, 0x8f, 0x9d, 0x0e, 0x86, 0x7a, 0x95, 0xdd, 0x3d,
-	0xa6, 0xb7, 0xbb, 0xbd, 0x6d, 0x68, 0x07, 0x84, 0x81, 0x9e, 0x3a, 0x1f, 0x3c, 0x51, 0xe7, 0x7c,
-	0xeb, 0x52, 0x6f, 0x77, 0xbb, 0xc2, 0xcd, 0x7c, 0x52, 0x79, 0x6a, 0x68, 0x47, 0x84, 0x19, 0xbc,
-	0x2a, 0x04, 0x82, 0x13, 0x42, 0xa9, 0xf9, 0x1c, 0x36, 0x94, 0xa5, 0x4f, 0x2a, 0x3b, 0x5c, 0x75,
-	0x77, 0x7b, 0xdf, 0xd0, 0x0e, 0x09, 0x33, 0x78, 0x4d, 0xda, 0x1a, 0x9c, 0x11, 0x0a, 0xdd, 0xf2,
-	0xbf, 0xa4, 0xe1, 0xc3, 0x9b, 0x0a, 0xc8, 0x60, 0x4b, 0x99, 0x1d, 0x0d, 0x3d, 0xdf, 0x25, 0xe6,
-	0x40, 0xee, 0x27, 0xf5, 0xdb, 0xb3, 0xeb, 0x10, 0x02, 0x3d, 0x74, 0x04, 0x60, 0xd1, 0x9f, 0x3b,
-	0x12, 0x25, 0x7d, 0x2b, 0x14, 0x4d, 0x13, 0xfd, 0x22, 0x05, 0x1f, 0xf2, 0xb8, 0x27, 0x52, 0x58,
-	0xf8, 0x8a, 0x41, 0xa4, 0xb8, 0x31, 0x1c, 0x18, 0xe7, 0xd4, 0x1d, 0x98, 0xbe, 0xbc, 0xbd, 0xdd,
-	0x8f, 0x5d, 0x0e, 0xdc, 0x3c, 0xde, 0xad, 0x23, 0xae, 0x8f, 0xdf, 0xa3, 0x93, 0x65, 0x85, 0x48,
-	0xf9, 0x09, 0x64, 0xc4, 0x5f, 0xfc, 0x9e, 0xb5, 0xd1, 0xc4, 0xdd, 0x6f, 0x8c, 0xee, 0x57, 0x27,
-	0x46, 0xad, 0xd9, 0x15, 0x37, 0xbb, 0x9d, 0xe6, 0xd7, 0xdd, 0x6f, 0x8c, 0xa3, 0x93, 0x53, 0xcc,
-	0x69, 0xa9, 0xb2, 0x0f, 0x73, 0xb2, 0xb8, 0xd5, 0xca, 0xd6, 0x94, 0x56, 0xb6, 0xb2, 0x70, 0xf6,
-	0x7c, 0xd3, 0x1f, 0x79, 0xb2, 0x9a, 0x95, 0x2d, 0x96, 0x1f, 0xce, 0x4d, 0xbb, 0x6f, 0xb8, 0xc4,
-	0xf4, 0xa8, 0xc3, 0x47, 0x97, 0xc3, 0xc0, 0x48, 0x98, 0x53, 0xd0, 0x3a, 0x5f, 0xbd, 0xf9, 0x75,
-	0x10, 0x8f, 0xf3, 0x14, 0x5b, 0xbb, 0x79, 0x57, 0x65, 0x22, 0x8e, 0x1d, 0xb4, 0xc2, 0x5a, 0x7e,
-	0xda, 0x1b, 0x2a, 0xeb, 0x4f, 0x35, 0x48, 0x51, 0x05, 0x20, 0x6d, 0x3a, 0x15, 0x58, 0xd0, 0xcd,
-	0x9f, 0x8a, 0x5b, 0xd9, 0x78, 0x27, 0xb7, 0x3c, 0x06, 0xd0, 0x66, 0x60, 0xfa, 0xba, 0x19, 0x98,
-	0xb9, 0x76, 0x06, 0x66, 0xa3, 0x33, 0xf0, 0xff, 0x54, 0x39, 0xc2, 0x1c, 0xa0, 0x7b, 0x85, 0xaf,
-	0x22, 0x75, 0xf4, 0xed, 0x8e, 0xea, 0xfe, 0x79, 0x1a, 0x36, 0x13, 0xc1, 0xe4, 0x78, 0x3f, 0x86,
-	0xa5, 0x33, 0xd3, 0x23, 0x6c, 0x4d, 0x31, 0x5d, 0x95, 0xcb, 0x44, 0x91, 0xb7, 0xc0, 0x18, 0xdd,
-	0xab, 0xaa, 0x1b, 0xe4, 0x47, 0x21, 0xea, 0x5e, 0x19, 0xe6, 0x1b, 0x25, 0x9a, 0x0e, 0x45, 0xf1,
-	0x55, 0xf5, 0x8d, 0x14, 0xdd, 0x82, 0x15, 0x85, 0xea, 0x50, 0x0d, 0x78, 0x5a, 0x5e, 0xf8, 0x70,
-	0xe0, 0x16, 0x0d, 0xa0, 0x95, 0xbc, 0x2b, 0xe4, 0xdf, 0xe8, 0x4b, 0x80, 0x94, 0xc7, 0x4c, 0xfe,
-	0x4d, 0x90, 0x7f, 0x8b, 0xe4, 0xca, 0x8f, 0x1a, 0x2d, 0x2e, 0x88, 0x0a, 0xe4, 0xca, 0xd7, 0x6c,
-	0x96, 0x82, 0x11, 0x93, 0x33, 0x81, 0xa0, 0x66, 0xf1, 0x27, 0xb0, 0x2c, 0x11, 0x23, 0x06, 0x8b,
-	0xbb, 0xa1, 0x45, 0x0e, 0xaa, 0xd9, 0x2b, 0xa5, 0xe3, 0xe6, 0x66, 0x03, 0xe9, 0x88, 0xb5, 0xbb,
-	0x70, 0x47, 0xee, 0x07, 0x8c, 0x9e, 0xa8, 0xf3, 0x0c, 0x97, 0xf8, 0xae, 0x4d, 0xd4, 0x35, 0xd1,
-	0x8a, 0xd8, 0x0f, 0xcb, 0x22, 0x10, 0x0b, 0x1e, 0x7a, 0x06, 0xa5, 0xb8, 0x1a, 0x5b, 0xb2, 0xe9,
-	0x28, 0xb8, 0x2f, 0x5a, 0x8d, 0xe8, 0x75, 0x25, 0xb3, 0xfc, 0x4a, 0x1d, 0x2e, 0x33, 0x66, 0xb5,
-	0xc7, 0x76, 0x72, 0xfc, 0x85, 0xd2, 0x77, 0x74, 0xa1, 0xdf, 0x87, 0x1c, 0x57, 0xe7, 0x87, 0xe8,
-	0xeb, 0x90, 0xed, 0xf5, 0x4d, 0xcf, 0x53, 0x01, 0x52, 0xc0, 0x73, 0xbc, 0xdd, 0xb4, 0x98, 0xcb,
-	0xdb, 0x8e, 0x78, 0x8b, 0xa3, 0xc2, 0xa4, 0x80, 0x41, 0x91, 0x9a, 0x16, 0x42, 0x30, 0xe3, 0x98,
-	0x03, 0x22, 0x23, 0x85, 0xff, 0x8d, 0x1e, 0x42, 0xde, 0x22, 0x5e, 0xcf, 0xb5, 0xf9, 0x75, 0x84,
-	0x8c, 0x13, 0x9d, 0x54, 0xfe, 0xff, 0x70, 0x7f, 0xd2, 0x68, 0xa4, 0x0f, 0x7f, 0x06, 0x05, 0x93,
-	0xd3, 0x0d, 0xfe, 0xf2, 0xca, 0x93, 0xc5, 0xf9, 0x8a, 0x16, 0xfe, 0xc1, 0x00, 0xf0, 0xbc, 0xa9,
-	0x41, 0x94, 0x7f, 0x95, 0x82, 0xf7, 0x18, 0xfa, 0xf9, 0x79, 0x9f, 0x9a, 0x16, 0xb1, 0xaa, 0xc3,
-	0xa1, 0xa7, 0x1d, 0x06, 0xc9, 0xf9, 0x3a, 0x85, 0xac, 0xc7, 0x4b, 0x7a, 0xea, 0xca, 0x6b, 0xdc,
-	0xcf, 0x62, 0x99, 0xfa, 0x5a, 0xfd, 0x2d, 0x9d, 0x8d, 0x03, 0xa8, 0xf2, 0x11, 0xcc, 0xeb, 0x9c,
-	0xf8, 0x6d, 0x6e, 0x1e, 0xe6, 0xda, 0xed, 0x36, 0x25, 0xcd, 0xaa, 0x7c, 0x52, 0xd2, 0x38, 0x68,
-	0x5f, 0xee, 0xe0, 0x6a, 0x31, 0x1d, 0xb4, 0xf6, 0x70, 0xb5, 0x38, 0x5d, 0xfe, 0xc5, 0x1a, 0x94,
-	0xaf, 0x33, 0x42, 0x4e, 0x53, 0x0f, 0x0a, 0xd6, 0xeb, 0xde, 0xf0, 0x72, 0x07, 0x9b, 0x3c, 0x07,
-	0xc8, 0xaf, 0xff, 0x83, 0x77, 0x1c, 0x8a, 0x5c, 0x70, 0x94, 0x15, 0x1c, 0xa2, 0x31, 0x85, 0xa3,
-	0x98, 0x41, 0x27, 0x7b, 0xaa, 0x93, 0xf4, 0x77, 0xee, 0x64, 0x2f, 0xde, 0x89, 0xc2, 0x44, 0x3f,
-	0x83, 0xf9, 0xe1, 0x70, 0x48, 0x49, 0x53, 0xf6, 0x31, 0xcd, 0xfb, 0x78, 0x7e, 0xbb, 0x3e, 0xe4,
-	0xdc, 0xaa, 0x2e, 0x22, 0x88, 0x1b, 0xff, 0x31, 0x0b, 0x85, 0xc8, 0x48, 0xd9, 0xfe, 0xc5, 0x76,
-	0x8c, 0x33, 0xd3, 0x0a, 0x76, 0xf1, 0xe7, 0x2e, 0x1d, 0x18, 0xbd, 0xbe, 0x4d, 0x1c, 0x75, 0xe8,
-	0xb8, 0x66, 0x3b, 0x35, 0x53, 0xdd, 0x35, 0x1f, 0xb9, 0x74, 0x70, 0xc0, 0xb9, 0x93, 0x74, 0x3d,
-	0xe2, 0x5e, 0xca, 0xb7, 0x0e, 0x09, 0xba, 0x1d, 0xce, 0x45, 0x4f, 0x61, 0xcd, 0x76, 0x12, 0xfb,
-	0x14, 0xc9, 0x74, 0xd9, 0x76, 0xc6, 0x3b, 0x4c, 0x50, 0x92, 0x9d, 0xcd, 0x24, 0x28, 0xc9, 0x9e,
-	0xb6, 0x61, 0x95, 0x8e, 0xfc, 0x40, 0xcb, 0xa7, 0x4a, 0x47, 0x64, 0x56, 0x44, 0x47, 0xea, 0xd2,
-	0xbd, 0x4b, 0x27, 0xaa, 0x48, 0xdb, 0x32, 0xe3, 0x2a, 0xd2, 0xb4, 0x57, 0xf0, 0x3e, 0xe5, 0x81,
-	0x6d, 0xec, 0x57, 0x0c, 0xdb, 0xf1, 0x88, 0x2b, 0xee, 0x0c, 0xe3, 0x9d, 0x8a, 0xcc, 0xfb, 0x40,
-	0xc8, 0xee, 0x57, 0x9a, 0x52, 0x32, 0x6e, 0xc1, 0x0b, 0xf8, 0x5e, 0x08, 0xe7, 0x92, 0x01, 0xbd,
-	0x8c, 0xa2, 0x49, 0x7b, 0x44, 0x66, 0xbe, 0xaf, 0xd0, 0xb0, 0x10, 0x8c, 0xdb, 0x56, 0x87, 0x87,
-	0x21, 0x98, 0x43, 0xfd, 0xd0, 0xbe, 0xd0, 0x2e, 0x91, 0xb1, 0x37, 0x15, 0x52, 0x8b, 0xfa, 0xca,
-	0xb4, 0xc0, 0xa6, 0xdf, 0x83, 0xa2, 0x69, 0x59, 0xb6, 0x78, 0x37, 0x66, 0xf0, 0x70, 0x2f, 0x01,
-	0x4f, 0x49, 0xed, 0x5f, 0x23, 0xd6, 0xb6, 0xaa, 0x01, 0x26, 0x6f, 0xd7, 0x1d, 0xdf, 0x7d, 0x8b,
-	0x17, 0xcd, 0x28, 0x75, 0xa3, 0x06, 0x2b, 0x49, 0x82, 0xa8, 0x08, 0xd3, 0x6f, 0xc8, 0x5b, 0xb9,
-	0x6d, 0x62, 0x7f, 0xa2, 0x15, 0xfd, 0x05, 0x69, 0x4e, 0x3e, 0x13, 0x7d, 0x9e, 0xde, 0x4f, 0x6d,
-	0xfc, 0x6b, 0x46, 0x7a, 0xff, 0xde, 0xff, 0xb4, 0xf7, 0x87, 0xde, 0xb2, 0xfd, 0xec, 0x3a, 0x6f,
-	0x99, 0xd6, 0xbd, 0x65, 0xfb, 0xd9, 0xcd, 0xde, 0xb2, 0xfd, 0xec, 0x1a, 0x6f, 0x99, 0xd1, 0xbd,
-	0x65, 0xfb, 0xd9, 0x04, 0x6f, 0xd1, 0x6c, 0xdb, 0xbf, 0xce, 0xb6, 0xd9, 0x88, 0x6d, 0xfb, 0xef,
-	0x60, 0xdb, 0xfe, 0x35, 0xb6, 0x65, 0x22, 0xb6, 0xed, 0xdf, 0x68, 0xdb, 0xd3, 0x67, 0xef, 0x1c,
-	0x65, 0x4f, 0xdf, 0x61, 0xde, 0x9e, 0x3e, 0x7b, 0xd7, 0x28, 0x7b, 0x3a, 0x69, 0xde, 0xbe, 0x82,
-	0x8f, 0xe9, 0xc8, 0xbf, 0xa0, 0xb6, 0x73, 0x61, 0x0c, 0xfc, 0x91, 0x41, 0xae, 0x7a, 0x84, 0x58,
-	0x24, 0xd9, 0xb5, 0x44, 0xb8, 0xbd, 0xaf, 0x14, 0x5e, 0xf9, 0xa3, 0xba, 0x14, 0x1f, 0x77, 0xb4,
-	0xdf, 0x6c, 0xdc, 0xed, 0xfd, 0xf6, 0xe3, 0xee, 0x6f, 0x33, 0x30, 0xaf, 0x2f, 0x4b, 0xe8, 0x47,
-	0x70, 0xd7, 0x76, 0xc4, 0xf9, 0xc5, 0x35, 0x81, 0x57, 0xb2, 0x1d, 0xfd, 0x5d, 0xa3, 0x36, 0x23,
-	0x13, 0xf5, 0x23, 0xc1, 0x97, 0xa0, 0xff, 0xbf, 0x74, 0xf1, 0xf9, 0x19, 0x6c, 0x5d, 0x12, 0xc7,
-	0xa2, 0xae, 0xe1, 0x89, 0x87, 0xf5, 0x3d, 0xc3, 0x37, 0x2f, 0x6e, 0x0e, 0x90, 0x47, 0x42, 0x4b,
-	0xbe, 0xc6, 0xef, 0x75, 0xcd, 0x8b, 0x49, 0x91, 0xf2, 0x53, 0xf8, 0x34, 0xa9, 0x87, 0x9b, 0x62,
-	0xe6, 0xa3, 0xb1, 0x0e, 0x7e, 0xdb, 0xc1, 0xf3, 0xed, 0xc4, 0xe0, 0x39, 0xf9, 0xee, 0xfb, 0xaa,
-	0xdf, 0x5e, 0xec, 0xd4, 0xe6, 0x60, 0x96, 0x1b, 0x5d, 0xfe, 0xb7, 0x1c, 0x2c, 0x1e, 0x13, 0x9f,
-	0xff, 0xca, 0x41, 0x6d, 0xe0, 0x7f, 0x10, 0xfb, 0xd9, 0x40, 0xbe, 0x72, 0x2f, 0x3a, 0xa8, 0xd8,
-	0x0f, 0x14, 0x1a, 0x53, 0xe1, 0xef, 0x0a, 0xd0, 0x0f, 0x60, 0x6e, 0x24, 0x1e, 0xd1, 0xcb, 0xcd,
-	0xec, 0x83, 0xc9, 0x8f, 0xec, 0x95, 0xb6, 0xd2, 0x40, 0x55, 0xc8, 0x53, 0xf1, 0x7c, 0x9a, 0x03,
-	0x4c, 0x27, 0x75, 0x1e, 0x7b, 0x5f, 0xdd, 0x98, 0xc2, 0xba, 0x0e, 0x6a, 0xf2, 0x77, 0x4b, 0xda,
-	0x4b, 0x5b, 0x1e, 0x47, 0x49, 0x66, 0x44, 0x1f, 0xe4, 0x36, 0xa6, 0x70, 0x4c, 0x11, 0x61, 0x28,
-	0x10, 0xff, 0x75, 0xf8, 0xec, 0x93, 0x47, 0x57, 0xf4, 0x1a, 0xf3, 0x86, 0x17, 0xa2, 0x6c, 0x33,
-	0x1e, 0x81, 0x40, 0x3f, 0xe4, 0xef, 0x71, 0x24, 0x9b, 0xc7, 0x5e, 0xbe, 0xb2, 0x39, 0x06, 0x18,
-	0x3e, 0x14, 0x6a, 0x4c, 0x61, 0x4d, 0x01, 0xd5, 0x00, 0x28, 0xb7, 0x9c, 0x8f, 0x6c, 0x6e, 0xec,
-	0x0a, 0x38, 0xf1, 0x09, 0x0a, 0xc3, 0x08, 0xb5, 0xd0, 0x4b, 0x98, 0xa3, 0xce, 0x88, 0x03, 0x64,
-	0x39, 0xc0, 0x93, 0x5b, 0x1c, 0xa4, 0x05, 0x9f, 0x4c, 0x42, 0xa0, 0x7d, 0x50, 0x27, 0x31, 0x3c,
-	0x80, 0xf2, 0x95, 0xbb, 0x51, 0xb4, 0xe8, 0x83, 0x0f, 0xa6, 0x29, 0xc5, 0xd1, 0x0b, 0x98, 0xa7,
-	0xa2, 0x4e, 0xed, 0xc8, 0xf8, 0x61, 0xea, 0x1f, 0x8c, 0x8d, 0x26, 0xe9, 0x5c, 0x87, 0x95, 0x20,
-	0xba, 0x32, 0xaa, 0x02, 0xd0, 0xe0, 0x10, 0x8c, 0x1f, 0xe6, 0x8e, 0x7f, 0xf2, 0xfe, 0xb8, 0x31,
-	0x9a, 0x12, 0xea, 0xc2, 0x22, 0x75, 0x46, 0x7a, 0xcd, 0xcc, 0x0f, 0x77, 0xf3, 0x95, 0x47, 0x89,
-	0x26, 0x25, 0x1c, 0x15, 0x34, 0xa6, 0x70, 0x1c, 0x02, 0xfd, 0x14, 0x10, 0x8d, 0xe7, 0x00, 0x71,
-	0xf8, 0x9b, 0xaf, 0x7c, 0x72, 0x9b, 0xba, 0xb8, 0x31, 0x85, 0x13, 0x90, 0xd0, 0x29, 0x14, 0x69,
-	0xec, 0x2e, 0x9d, 0x9f, 0x0f, 0xe7, 0x2b, 0x1f, 0x8d, 0x99, 0x9d, 0xfc, 0x68, 0xb4, 0x31, 0x85,
-	0xc7, 0x20, 0x50, 0x9b, 0x4f, 0x86, 0x7e, 0x35, 0xcf, 0xef, 0x3e, 0xf3, 0x95, 0xf7, 0xc7, 0x50,
-	0x13, 0x9e, 0x7a, 0xc8, 0x89, 0xd0, 0x39, 0x41, 0x6c, 0x8b, 0x87, 0x35, 0xfc, 0x72, 0x74, 0x2c,
-	0xb6, 0x63, 0x4f, 0x7a, 0x82, 0xd8, 0x76, 0xd4, 0x47, 0x66, 0xcd, 0x96, 0x23, 0x1d, 0x66, 0x29,
-	0x09, 0x22, 0xf6, 0x90, 0x46, 0x42, 0x28, 0x9d, 0x5a, 0x0e, 0xe6, 0x5c, 0xc1, 0x29, 0xff, 0x53,
-	0x81, 0x3f, 0xed, 0x93, 0xa9, 0x4f, 0x96, 0xfd, 0xcf, 0x83, 0x13, 0x4a, 0x71, 0x74, 0x51, 0x8e,
-	0xa2, 0x47, 0x84, 0xb7, 0x3a, 0x5c, 0x32, 0x38, 0xc5, 0xac, 0x43, 0x8e, 0xb8, 0xae, 0x38, 0xb1,
-	0x94, 0x3f, 0x46, 0xf9, 0xe8, 0x3a, 0x75, 0xbe, 0x8d, 0x10, 0xe2, 0x38, 0xd4, 0x44, 0x9f, 0x6b,
-	0xe9, 0x77, 0x7a, 0xec, 0xcd, 0x65, 0xc2, 0xef, 0xbc, 0x22, 0xf9, 0xf7, 0xf3, 0x30, 0xff, 0xce,
-	0x4c, 0x48, 0x0f, 0xb1, 0x1f, 0x39, 0xe9, 0x09, 0xf8, 0x05, 0xcc, 0x0f, 0x45, 0x72, 0xf5, 0x1d,
-	0xe2, 0x7a, 0x32, 0xe3, 0x7d, 0x70, 0x6d, 0x06, 0xd6, 0x70, 0x22, 0xca, 0xe8, 0x8b, 0xb1, 0x54,
-	0x9c, 0x99, 0xe0, 0x98, 0xc9, 0xbf, 0x8d, 0x48, 0x48, 0xc9, 0x67, 0xb0, 0x14, 0xc9, 0xa7, 0x5a,
-	0x1a, 0xac, 0xbc, 0x7b, 0x5a, 0xd6, 0x3a, 0x18, 0x87, 0x43, 0xf5, 0x48, 0x8a, 0x16, 0x29, 0xf2,
-	0x7b, 0xd7, 0xa4, 0x68, 0x0d, 0x4d, 0x4f, 0xd5, 0x2f, 0xf8, 0xe8, 0xdb, 0xd4, 0x51, 0xf3, 0x24,
-	0xf3, 0xe3, 0x7b, 0xd7, 0xa4, 0xeb, 0xc8, 0xb8, 0x35, 0x55, 0x74, 0xca, 0x9f, 0xfa, 0x05, 0x48,
-	0x22, 0x55, 0x6e, 0xdf, 0xfa, 0x02, 0x84, 0x47, 0x43, 0x88, 0x83, 0x3e, 0x0b, 0x93, 0x77, 0x3e,
-	0x29, 0x98, 0x62, 0xe7, 0xfd, 0x7a, 0xf6, 0x7e, 0x19, 0xcb, 0xde, 0xf3, 0x63, 0x17, 0x3f, 0xd7,
-	0x1c, 0xa4, 0x8f, 0xa5, 0xef, 0x5a, 0x24, 0x7d, 0x17, 0x12, 0x1d, 0xb7, 0x9f, 0x60, 0x8e, 0x9e,
-	0xbf, 0x4f, 0xc7, 0xf3, 0xb7, 0x48, 0x84, 0x1f, 0xbf, 0x43, 0xfe, 0x0e, 0x10, 0xc7, 0x12, 0xb8,
-	0x91, 0x98, 0xc0, 0x45, 0x32, 0xfc, 0xf4, 0x56, 0x9b, 0xbd, 0x09, 0x19, 0xfc, 0x1c, 0x4a, 0xf1,
-	0xf4, 0xab, 0x34, 0x64, 0x96, 0x7c, 0x74, 0x73, 0x26, 0x0f, 0x7a, 0x98, 0x88, 0x85, 0x4c, 0xb8,
-	0x43, 0x93, 0x1f, 0x6d, 0xc9, 0x4c, 0xfa, 0xc1, 0x0d, 0xa9, 0x3d, 0xe8, 0x63, 0x12, 0x0e, 0xc2,
-	0xb0, 0xac, 0xe5, 0xeb, 0x00, 0x1e, 0x25, 0x65, 0xb1, 0xb8, 0x54, 0x63, 0x0a, 0x27, 0x29, 0x4b,
-	0x4c, 0x95, 0xc0, 0x03, 0xcc, 0xe5, 0x24, 0xcc, 0xf8, 0x4b, 0x47, 0x89, 0x19, 0x57, 0x2e, 0x6f,
-	0x43, 0x46, 0xe4, 0x6e, 0xb4, 0x02, 0xc5, 0x4e, 0xb7, 0xda, 0x3d, 0xed, 0x44, 0x7e, 0x9f, 0x98,
-	0x81, 0xf4, 0xc9, 0x8b, 0x62, 0x8a, 0xff, 0xe2, 0x18, 0xe3, 0x13, 0x5c, 0x4c, 0x97, 0xff, 0x2a,
-	0x05, 0x79, 0x2d, 0x61, 0x33, 0x45, 0x5c, 0xaf, 0x76, 0x4e, 0x5a, 0x11, 0xc5, 0x45, 0xc8, 0x9f,
-	0xb6, 0x3a, 0xa7, 0xed, 0xf6, 0x09, 0xee, 0xf2, 0x1f, 0x37, 0xae, 0xc2, 0x52, 0xb3, 0xf5, 0x65,
-	0xf5, 0x65, 0xf3, 0xd0, 0x38, 0xac, 0x7f, 0xd9, 0x3c, 0xa8, 0x1b, 0xcd, 0xc3, 0x62, 0x5a, 0x27,
-	0x33, 0x51, 0xa3, 0xfb, 0x4d, 0xbb, 0x5e, 0x9c, 0x46, 0x79, 0x98, 0xeb, 0x36, 0x5f, 0xd5, 0x4f,
-	0x4e, 0xbb, 0xc5, 0x19, 0xd6, 0x83, 0x92, 0xc1, 0xf5, 0x2f, 0x84, 0xc8, 0x2c, 0x42, 0xb0, 0xd0,
-	0x6c, 0x75, 0xeb, 0xb8, 0x55, 0x7d, 0x69, 0x08, 0xdb, 0x32, 0x82, 0xa6, 0x77, 0x52, 0x9c, 0xab,
-	0x01, 0x64, 0x5d, 0x35, 0xdc, 0xbf, 0x4c, 0x41, 0xb1, 0x3a, 0x1c, 0x4a, 0xf7, 0x14, 0xbf, 0x59,
-	0x45, 0x1f, 0xc2, 0x02, 0x71, 0xcc, 0xb3, 0x3e, 0x51, 0xe7, 0x66, 0x7c, 0xc5, 0xcb, 0xe2, 0x18,
-	0x35, 0x26, 0xb7, 0x87, 0xab, 0x7c, 0x69, 0x8b, 0xca, 0xed, 0xe1, 0x2a, 0x7a, 0x1f, 0x0a, 0x82,
-	0xc2, 0x4a, 0x9a, 0x7a, 0xb3, 0x2a, 0x5f, 0x15, 0x47, 0x89, 0xa8, 0x0c, 0xf3, 0x66, 0xaf, 0x47,
-	0x3c, 0xaf, 0x45, 0x2d, 0xd2, 0x3c, 0x94, 0x57, 0x18, 0x11, 0x5a, 0xf9, 0x3f, 0x53, 0xb0, 0x1c,
-	0x9a, 0xcb, 0x13, 0x24, 0xb7, 0xf8, 0xe6, 0xf7, 0xce, 0x2f, 0x00, 0x86, 0xc4, 0x95, 0xeb, 0x5b,
-	0x69, 0x96, 0x17, 0x64, 0xff, 0x47, 0xbf, 0xd8, 0x18, 0x47, 0xdd, 0x6a, 0x73, 0x05, 0xd1, 0xc0,
-	0x9a, 0xfa, 0xc6, 0x15, 0xcc, 0xeb, 0x3c, 0x36, 0x40, 0xf3, 0x82, 0x38, 0x3e, 0xab, 0x35, 0x7d,
-	0x66, 0xbb, 0xa8, 0xaa, 0xa2, 0x44, 0x36, 0x5d, 0x9c, 0x70, 0x60, 0xbb, 0xbd, 0x91, 0xed, 0x37,
-	0x0f, 0xe5, 0x05, 0x4e, 0x8c, 0x8a, 0x36, 0x20, 0x4b, 0xc5, 0x52, 0x6c, 0xa9, 0x9f, 0x81, 0xab,
-	0x76, 0xf9, 0xdf, 0x53, 0xb0, 0xd8, 0x89, 0x15, 0x65, 0xf1, 0x1f, 0xd5, 0xa7, 0xde, 0xf5, 0x47,
-	0xf5, 0xe8, 0x05, 0x20, 0x73, 0x38, 0x34, 0x64, 0xe6, 0x89, 0xfe, 0x28, 0x7f, 0x33, 0x71, 0x72,
-	0x02, 0x9c, 0xa2, 0x19, 0xf7, 0x9a, 0x53, 0x58, 0xd3, 0xc1, 0xa8, 0x33, 0x52, 0x80, 0xe3, 0x5b,
-	0x95, 0x84, 0xd9, 0x66, 0x01, 0x69, 0x8e, 0x93, 0xf5, 0x6d, 0xd9, 0xdf, 0xa5, 0xa1, 0xd8, 0xb9,
-	0xcd, 0xb6, 0xac, 0xf3, 0xeb, 0x6d, 0xcb, 0x3a, 0xef, 0xb6, 0x2d, 0xfb, 0x2e, 0x39, 0xe3, 0xdb,
-	0xdf, 0x64, 0xca, 0x58, 0x87, 0x55, 0x45, 0x3e, 0x69, 0x9d, 0x6a, 0xac, 0x69, 0x3d, 0xfe, 0x4f,
-	0x5b, 0x4d, 0x46, 0x9b, 0x29, 0xdb, 0xb0, 0xda, 0xb1, 0x9d, 0x8b, 0x3e, 0x89, 0x57, 0xf7, 0x1b,
-	0x90, 0xf5, 0x4d, 0xf7, 0x82, 0xf8, 0x41, 0x08, 0x05, 0x6d, 0xb4, 0x13, 0x7c, 0x06, 0xe9, 0x1f,
-	0x1b, 0x89, 0xfb, 0x57, 0x2e, 0x81, 0x83, 0x2f, 0xf6, 0x05, 0xac, 0xc5, 0xbb, 0x92, 0x9f, 0xed,
-	0x59, 0x98, 0x84, 0xa4, 0xc3, 0x6e, 0x5e, 0xb3, 0x21, 0xc6, 0x61, 0xc6, 0x0a, 0xac, 0xef, 0xfc,
-	0xa6, 0xac, 0xef, 0xdc, 0x68, 0x7d, 0xe7, 0x76, 0xd6, 0x77, 0x26, 0x5a, 0x5f, 0xf9, 0x65, 0x0a,
-	0x72, 0x75, 0x25, 0x88, 0x30, 0xe4, 0x8f, 0x89, 0x5f, 0xbf, 0x12, 0xe2, 0x48, 0xdf, 0xd6, 0x24,
-	0x7e, 0xa1, 0x8d, 0xf7, 0xae, 0x91, 0x08, 0x16, 0xc5, 0x7c, 0xe7, 0x5a, 0xcc, 0xce, 0x8d, 0x98,
-	0x71, 0xfb, 0x6b, 0x18, 0xee, 0x51, 0xf7, 0x62, 0x8b, 0x0e, 0x89, 0xd3, 0xa3, 0xae, 0xb5, 0x25,
-	0xfe, 0xf5, 0x8f, 0x50, 0xef, 0x27, 0xdb, 0x17, 0xb6, 0xff, 0x7a, 0x74, 0xb6, 0xd5, 0xa3, 0x83,
-	0xc7, 0x4a, 0xea, 0xb1, 0x90, 0xfa, 0x54, 0xfe, 0x1b, 0x21, 0x97, 0xbb, 0x8f, 0x2f, 0x68, 0xf8,
-	0x2f, 0x92, 0x9c, 0x65, 0x38, 0xfd, 0xe9, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x08, 0x90, 0xb8,
-	0x96, 0xb3, 0x44, 0x00, 0x00,
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) Reset() {
+	*x = GetOffloadedAppsStatisticsResponse_DHCPv4RAStats{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[57]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
 }
 
-// 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
-
-// ExtensionClient is the client API for Extension service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type ExtensionClient interface {
-	// Get a single attribute
-	GetExtValue(ctx context.Context, in *SingleGetValueRequest, opts ...grpc.CallOption) (*SingleGetValueResponse, error)
-	// Set a single attribute
-	SetExtValue(ctx context.Context, in *SingleSetValueRequest, opts ...grpc.CallOption) (*SingleSetValueResponse, error)
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 
-type extensionClient struct {
-	cc *grpc.ClientConn
-}
+func (*GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) ProtoMessage() {}
 
-func NewExtensionClient(cc *grpc.ClientConn) ExtensionClient {
-	return &extensionClient{cc}
-}
-
-func (c *extensionClient) GetExtValue(ctx context.Context, in *SingleGetValueRequest, opts ...grpc.CallOption) (*SingleGetValueResponse, error) {
-	out := new(SingleGetValueResponse)
-	err := c.cc.Invoke(ctx, "/extension.Extension/GetExtValue", in, out, opts...)
-	if err != nil {
-		return nil, err
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_proto_msgTypes[57]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
 	}
-	return out, nil
+	return mi.MessageOf(x)
 }
 
-func (c *extensionClient) SetExtValue(ctx context.Context, in *SingleSetValueRequest, opts ...grpc.CallOption) (*SingleSetValueResponse, error) {
-	out := new(SingleSetValueResponse)
-	err := c.cc.Invoke(ctx, "/extension.Extension/SetExtValue", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
+// Deprecated: Use GetOffloadedAppsStatisticsResponse_DHCPv4RAStats.ProtoReflect.Descriptor instead.
+func (*GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{46, 0}
 }
 
-// ExtensionServer is the server API for Extension service.
-type ExtensionServer interface {
-	// Get a single attribute
-	GetExtValue(context.Context, *SingleGetValueRequest) (*SingleGetValueResponse, error)
-	// Set a single attribute
-	SetExtValue(context.Context, *SingleSetValueRequest) (*SingleSetValueResponse, error)
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetInBadPacketsFromClient() uint32 {
+	if x != nil {
+		return x.InBadPacketsFromClient
+	}
+	return 0
 }
 
-// UnimplementedExtensionServer can be embedded to have forward compatible implementations.
-type UnimplementedExtensionServer struct {
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetInBadPacketsFromServer() uint32 {
+	if x != nil {
+		return x.InBadPacketsFromServer
+	}
+	return 0
 }
 
-func (*UnimplementedExtensionServer) GetExtValue(ctx context.Context, req *SingleGetValueRequest) (*SingleGetValueResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetExtValue not implemented")
-}
-func (*UnimplementedExtensionServer) SetExtValue(ctx context.Context, req *SingleSetValueRequest) (*SingleSetValueResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method SetExtValue not implemented")
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetInPacketsFromClient() uint32 {
+	if x != nil {
+		return x.InPacketsFromClient
+	}
+	return 0
 }
 
-func RegisterExtensionServer(s *grpc.Server, srv ExtensionServer) {
-	s.RegisterService(&_Extension_serviceDesc, srv)
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetInPacketsFromServer() uint32 {
+	if x != nil {
+		return x.InPacketsFromServer
+	}
+	return 0
 }
 
-func _Extension_GetExtValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SingleGetValueRequest)
-	if err := dec(in); err != nil {
-		return nil, err
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetOutPacketsToServer() uint32 {
+	if x != nil {
+		return x.OutPacketsToServer
 	}
-	if interceptor == nil {
-		return srv.(ExtensionServer).GetExtValue(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/extension.Extension/GetExtValue",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ExtensionServer).GetExtValue(ctx, req.(*SingleGetValueRequest))
-	}
-	return interceptor(ctx, in, info, handler)
+	return 0
 }
 
-func _Extension_SetExtValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SingleSetValueRequest)
-	if err := dec(in); err != nil {
-		return nil, err
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetOutPacketsToClient() uint32 {
+	if x != nil {
+		return x.OutPacketsToClient
 	}
-	if interceptor == nil {
-		return srv.(ExtensionServer).SetExtValue(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/extension.Extension/SetExtValue",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ExtensionServer).SetExtValue(ctx, req.(*SingleSetValueRequest))
-	}
-	return interceptor(ctx, in, info, handler)
+	return 0
 }
 
-var _Extension_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "extension.Extension",
-	HandlerType: (*ExtensionServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "GetExtValue",
-			Handler:    _Extension_GetExtValue_Handler,
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetOption_82InsertedPacketsToServer() uint32 {
+	if x != nil {
+		return x.Option_82InsertedPacketsToServer
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetOption_82RemovedPacketsToClient() uint32 {
+	if x != nil {
+		return x.Option_82RemovedPacketsToClient
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetOption_82NotInsertedToServer() uint32 {
+	if x != nil {
+		return x.Option_82NotInsertedToServer
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv4RAStats) GetAdditionalStats() map[string]string {
+	if x != nil {
+		return x.AdditionalStats
+	}
+	return nil
+}
+
+type GetOffloadedAppsStatisticsResponse_DHCPv6RAStats struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// From https://github.com/BroadbandForum/yang/blob/master/standard/networking/bbf-ldra.yang
+	InBadPacketsFromClient               uint32 `protobuf:"varint,1,opt,name=in_bad_packets_from_client,json=inBadPacketsFromClient,proto3" json:"in_bad_packets_from_client,omitempty"`
+	InBadPacketsFromServer               uint32 `protobuf:"varint,2,opt,name=in_bad_packets_from_server,json=inBadPacketsFromServer,proto3" json:"in_bad_packets_from_server,omitempty"`
+	Option_17InsertedPacketsToServer     uint32 `protobuf:"varint,3,opt,name=option_17_inserted_packets_to_server,json=option17InsertedPacketsToServer,proto3" json:"option_17_inserted_packets_to_server,omitempty"`
+	Option_17RemovedPacketsToClient      uint32 `protobuf:"varint,4,opt,name=option_17_removed_packets_to_client,json=option17RemovedPacketsToClient,proto3" json:"option_17_removed_packets_to_client,omitempty"`
+	Option_18InsertedPacketsToServer     uint32 `protobuf:"varint,5,opt,name=option_18_inserted_packets_to_server,json=option18InsertedPacketsToServer,proto3" json:"option_18_inserted_packets_to_server,omitempty"`
+	Option_18RemovedPacketsToClient      uint32 `protobuf:"varint,6,opt,name=option_18_removed_packets_to_client,json=option18RemovedPacketsToClient,proto3" json:"option_18_removed_packets_to_client,omitempty"`
+	Option_37InsertedPacketsToServer     uint32 `protobuf:"varint,7,opt,name=option_37_inserted_packets_to_server,json=option37InsertedPacketsToServer,proto3" json:"option_37_inserted_packets_to_server,omitempty"`
+	Option_37RemovedPacketsToClient      uint32 `protobuf:"varint,8,opt,name=option_37_removed_packets_to_client,json=option37RemovedPacketsToClient,proto3" json:"option_37_removed_packets_to_client,omitempty"`
+	OutgoingMtuExceededPacketsFromClient uint32 `protobuf:"varint,9,opt,name=outgoing_mtu_exceeded_packets_from_client,json=outgoingMtuExceededPacketsFromClient,proto3" json:"outgoing_mtu_exceeded_packets_from_client,omitempty"`
+	// Name value pairs that gives the flexibility to report different statistics that implementations may choose
+	AdditionalStats map[string]string `protobuf:"bytes,10,rep,name=additional_stats,json=additionalStats,proto3" json:"additional_stats,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) Reset() {
+	*x = GetOffloadedAppsStatisticsResponse_DHCPv6RAStats{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[58]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) ProtoMessage() {}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOffloadedAppsStatisticsResponse_DHCPv6RAStats.ProtoReflect.Descriptor instead.
+func (*GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{46, 1}
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetInBadPacketsFromClient() uint32 {
+	if x != nil {
+		return x.InBadPacketsFromClient
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetInBadPacketsFromServer() uint32 {
+	if x != nil {
+		return x.InBadPacketsFromServer
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOption_17InsertedPacketsToServer() uint32 {
+	if x != nil {
+		return x.Option_17InsertedPacketsToServer
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOption_17RemovedPacketsToClient() uint32 {
+	if x != nil {
+		return x.Option_17RemovedPacketsToClient
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOption_18InsertedPacketsToServer() uint32 {
+	if x != nil {
+		return x.Option_18InsertedPacketsToServer
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOption_18RemovedPacketsToClient() uint32 {
+	if x != nil {
+		return x.Option_18RemovedPacketsToClient
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOption_37InsertedPacketsToServer() uint32 {
+	if x != nil {
+		return x.Option_37InsertedPacketsToServer
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOption_37RemovedPacketsToClient() uint32 {
+	if x != nil {
+		return x.Option_37RemovedPacketsToClient
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetOutgoingMtuExceededPacketsFromClient() uint32 {
+	if x != nil {
+		return x.OutgoingMtuExceededPacketsFromClient
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_DHCPv6RAStats) GetAdditionalStats() map[string]string {
+	if x != nil {
+		return x.AdditionalStats
+	}
+	return nil
+}
+
+type GetOffloadedAppsStatisticsResponse_PPPoeIAStats struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// From https://github.com/BroadbandForum/yang/blob/master/standard/networking/bbf-pppoe-intermediate-agent.yang
+	InErrorPacketsFromClient                 uint32 `protobuf:"varint,1,opt,name=in_error_packets_from_client,json=inErrorPacketsFromClient,proto3" json:"in_error_packets_from_client,omitempty"`
+	InErrorPacketsFromServer                 uint32 `protobuf:"varint,2,opt,name=in_error_packets_from_server,json=inErrorPacketsFromServer,proto3" json:"in_error_packets_from_server,omitempty"`
+	InPacketsFromClient                      uint32 `protobuf:"varint,3,opt,name=in_packets_from_client,json=inPacketsFromClient,proto3" json:"in_packets_from_client,omitempty"`
+	InPacketsFromServer                      uint32 `protobuf:"varint,4,opt,name=in_packets_from_server,json=inPacketsFromServer,proto3" json:"in_packets_from_server,omitempty"`
+	OutPacketsToServer                       uint32 `protobuf:"varint,5,opt,name=out_packets_to_server,json=outPacketsToServer,proto3" json:"out_packets_to_server,omitempty"`
+	OutPacketsToClient                       uint32 `protobuf:"varint,6,opt,name=out_packets_to_client,json=outPacketsToClient,proto3" json:"out_packets_to_client,omitempty"`
+	VendorSpecificTagInsertedPacketsToServer uint32 `protobuf:"varint,7,opt,name=vendor_specific_tag_inserted_packets_to_server,json=vendorSpecificTagInsertedPacketsToServer,proto3" json:"vendor_specific_tag_inserted_packets_to_server,omitempty"`
+	VendorSpecificTagRemovedPacketsToClient  uint32 `protobuf:"varint,8,opt,name=vendor_specific_tag_removed_packets_to_client,json=vendorSpecificTagRemovedPacketsToClient,proto3" json:"vendor_specific_tag_removed_packets_to_client,omitempty"`
+	OutgoingMtuExceededPacketsFromClient     uint32 `protobuf:"varint,9,opt,name=outgoing_mtu_exceeded_packets_from_client,json=outgoingMtuExceededPacketsFromClient,proto3" json:"outgoing_mtu_exceeded_packets_from_client,omitempty"`
+	// Name value pairs that gives the flexibility to report different statistics that implementations may choose
+	AdditionalStats map[string]string `protobuf:"bytes,10,rep,name=additional_stats,json=additionalStats,proto3" json:"additional_stats,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) Reset() {
+	*x = GetOffloadedAppsStatisticsResponse_PPPoeIAStats{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[59]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOffloadedAppsStatisticsResponse_PPPoeIAStats) ProtoMessage() {}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_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 GetOffloadedAppsStatisticsResponse_PPPoeIAStats.ProtoReflect.Descriptor instead.
+func (*GetOffloadedAppsStatisticsResponse_PPPoeIAStats) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{46, 2}
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetInErrorPacketsFromClient() uint32 {
+	if x != nil {
+		return x.InErrorPacketsFromClient
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetInErrorPacketsFromServer() uint32 {
+	if x != nil {
+		return x.InErrorPacketsFromServer
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetInPacketsFromClient() uint32 {
+	if x != nil {
+		return x.InPacketsFromClient
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetInPacketsFromServer() uint32 {
+	if x != nil {
+		return x.InPacketsFromServer
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetOutPacketsToServer() uint32 {
+	if x != nil {
+		return x.OutPacketsToServer
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetOutPacketsToClient() uint32 {
+	if x != nil {
+		return x.OutPacketsToClient
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetVendorSpecificTagInsertedPacketsToServer() uint32 {
+	if x != nil {
+		return x.VendorSpecificTagInsertedPacketsToServer
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetVendorSpecificTagRemovedPacketsToClient() uint32 {
+	if x != nil {
+		return x.VendorSpecificTagRemovedPacketsToClient
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetOutgoingMtuExceededPacketsFromClient() uint32 {
+	if x != nil {
+		return x.OutgoingMtuExceededPacketsFromClient
+	}
+	return 0
+}
+
+func (x *GetOffloadedAppsStatisticsResponse_PPPoeIAStats) GetAdditionalStats() map[string]string {
+	if x != nil {
+		return x.AdditionalStats
+	}
+	return nil
+}
+
+type AppOffloadOnuConfig_PerUniConfig struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// As per the BBF Agent Remote Id defined in https://github.com/BroadbandForum/yang/blob/master/standard/networking/bbf-pppoe-intermediate-agent-profile-common.yang
+	AgentRemoteID string `protobuf:"bytes,2,opt,name=agentRemoteID,proto3" json:"agentRemoteID,omitempty"`
+	// As per the BBF Agent Circuit Id defined in https://github.com/BroadbandForum/yang/blob/master/standard/networking/bbf-pppoe-intermediate-agent-profile-common.yang
+	AgentCircuitID string `protobuf:"bytes,3,opt,name=agentCircuitID,proto3" json:"agentCircuitID,omitempty"`
+	// The id of the UNI on the Onu for which this configuration is relevant. The UNI ids are numbered from 0 to n depending on the number of UNI ports on the ONU.
+	OnuUniId      uint32 `protobuf:"varint,4,opt,name=onuUniId,proto3" json:"onuUniId,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *AppOffloadOnuConfig_PerUniConfig) Reset() {
+	*x = AppOffloadOnuConfig_PerUniConfig{}
+	mi := &file_voltha_protos_extensions_proto_msgTypes[63]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *AppOffloadOnuConfig_PerUniConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AppOffloadOnuConfig_PerUniConfig) ProtoMessage() {}
+
+func (x *AppOffloadOnuConfig_PerUniConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_extensions_proto_msgTypes[63]
+	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 AppOffloadOnuConfig_PerUniConfig.ProtoReflect.Descriptor instead.
+func (*AppOffloadOnuConfig_PerUniConfig) Descriptor() ([]byte, []int) {
+	return file_voltha_protos_extensions_proto_rawDescGZIP(), []int{50, 0}
+}
+
+func (x *AppOffloadOnuConfig_PerUniConfig) GetAgentRemoteID() string {
+	if x != nil {
+		return x.AgentRemoteID
+	}
+	return ""
+}
+
+func (x *AppOffloadOnuConfig_PerUniConfig) GetAgentCircuitID() string {
+	if x != nil {
+		return x.AgentCircuitID
+	}
+	return ""
+}
+
+func (x *AppOffloadOnuConfig_PerUniConfig) GetOnuUniId() uint32 {
+	if x != nil {
+		return x.OnuUniId
+	}
+	return 0
+}
+
+var File_voltha_protos_extensions_proto protoreflect.FileDescriptor
+
+const file_voltha_protos_extensions_proto_rawDesc = "" +
+	"\n" +
+	"\x1evoltha_protos/extensions.proto\x12\textension\x1a\x1evoltha_protos/ext_config.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1avoltha_protos/common.proto\"]\n" +
+	"\bValueSet\x12\x0e\n" +
+	"\x02id\x18\x01 \x01(\tR\x02id\x128\n" +
+	"\falarm_config\x18\x02 \x01(\v2\x13.config.AlarmConfigH\x00R\valarmConfigB\a\n" +
+	"\x05value\",\n" +
+	"\tValueType\"\x1f\n" +
+	"\x04Type\x12\t\n" +
+	"\x05EMPTY\x10\x00\x12\f\n" +
+	"\bDISTANCE\x10\x01\"Q\n" +
+	"\x0eValueSpecifier\x12\x0e\n" +
+	"\x02id\x18\x01 \x01(\tR\x02id\x12/\n" +
+	"\x05value\x18\x02 \x01(\x0e2\x19.extension.ValueType.TypeR\x05value\"t\n" +
+	"\fReturnValues\x12\x10\n" +
+	"\x03Set\x18\x01 \x01(\rR\x03Set\x12 \n" +
+	"\vUnsupported\x18\x02 \x01(\rR\vUnsupported\x12\x14\n" +
+	"\x05Error\x18\x03 \x01(\rR\x05Error\x12\x1a\n" +
+	"\bDistance\x18\x04 \x01(\rR\bDistance\"6\n" +
+	"\x12GetDistanceRequest\x12 \n" +
+	"\vonuDeviceId\x18\x01 \x01(\tR\vonuDeviceId\"1\n" +
+	"\x13GetDistanceResponse\x12\x1a\n" +
+	"\bdistance\x18\x01 \x01(\rR\bdistance\"2\n" +
+	"\x14GetOnuUniInfoRequest\x12\x1a\n" +
+	"\buniIndex\x18\x01 \x01(\rR\buniIndex\"\xe1\x04\n" +
+	"\x15GetOnuUniInfoResponse\x12P\n" +
+	"\badmState\x18\x01 \x01(\x0e24.extension.GetOnuUniInfoResponse.AdministrativeStateR\badmState\x12O\n" +
+	"\toperState\x18\x02 \x01(\x0e21.extension.GetOnuUniInfoResponse.OperationalStateR\toperState\x12O\n" +
+	"\tconfigInd\x18\x03 \x01(\x0e21.extension.GetOnuUniInfoResponse.ConfigurationIndR\tconfigInd\"\xc2\x01\n" +
+	"\x10ConfigurationInd\x12\n" +
+	"\n" +
+	"\x06UNKOWN\x10\x00\x12\x12\n" +
+	"\x0eTEN_BASE_T_FDX\x10\x01\x12\x16\n" +
+	"\x12HUNDRED_BASE_T_FDX\x10\x02\x12\x18\n" +
+	"\x14GIGABIT_ETHERNET_FDX\x10\x03\x12\x16\n" +
+	"\x12TEN_G_ETHERNET_FDX\x10\x04\x12\x12\n" +
+	"\x0eTEN_BASE_T_HDX\x10\x05\x12\x16\n" +
+	"\x12HUNDRED_BASE_T_HDX\x10\x06\x12\x18\n" +
+	"\x14GIGABIT_ETHERNET_HDX\x10\a\"G\n" +
+	"\x13AdministrativeState\x12\x16\n" +
+	"\x12ADMSTATE_UNDEFINED\x10\x00\x12\n" +
+	"\n" +
+	"\x06LOCKED\x10\x01\x12\f\n" +
+	"\bUNLOCKED\x10\x02\"F\n" +
+	"\x10OperationalState\x12\x17\n" +
+	"\x13OPERSTATE_UNDEFINED\x10\x00\x12\v\n" +
+	"\aENABLED\x10\x01\x12\f\n" +
+	"\bDISABLED\x10\x02\"\xb7\x01\n" +
+	"\x12GetOltPortCounters\x12\x16\n" +
+	"\x06portNo\x18\x01 \x01(\rR\x06portNo\x12B\n" +
+	"\bportType\x18\x02 \x01(\x0e2&.extension.GetOltPortCounters.PortTypeR\bportType\"E\n" +
+	"\bPortType\x12\x10\n" +
+	"\fPort_UNKNOWN\x10\x00\x12\x15\n" +
+	"\x11Port_ETHERNET_NNI\x10\x01\x12\x10\n" +
+	"\fPort_PON_OLT\x10\x02\"\xcc\x03\n" +
+	"\x1aGetOltPortCountersResponse\x12\x18\n" +
+	"\atxBytes\x18\x01 \x01(\x04R\atxBytes\x12\x18\n" +
+	"\arxBytes\x18\x02 \x01(\x04R\arxBytes\x12\x1c\n" +
+	"\ttxPackets\x18\x03 \x01(\x04R\ttxPackets\x12\x1c\n" +
+	"\trxPackets\x18\x04 \x01(\x04R\trxPackets\x12&\n" +
+	"\x0etxErrorPackets\x18\x05 \x01(\x04R\x0etxErrorPackets\x12&\n" +
+	"\x0erxErrorPackets\x18\x06 \x01(\x04R\x0erxErrorPackets\x12&\n" +
+	"\x0etxBcastPackets\x18\a \x01(\x04R\x0etxBcastPackets\x12&\n" +
+	"\x0erxBcastPackets\x18\b \x01(\x04R\x0erxBcastPackets\x12&\n" +
+	"\x0etxUcastPackets\x18\t \x01(\x04R\x0etxUcastPackets\x12&\n" +
+	"\x0erxUcastPackets\x18\n" +
+	" \x01(\x04R\x0erxUcastPackets\x12&\n" +
+	"\x0etxMcastPackets\x18\v \x01(\x04R\x0etxMcastPackets\x12&\n" +
+	"\x0erxMcastPackets\x18\f \x01(\x04R\x0erxMcastPackets\"D\n" +
+	"\x14GetOnuPonOpticalInfo\x12,\n" +
+	"\x05empty\x18\x01 \x01(\v2\x16.google.protobuf.EmptyR\x05empty\"\x84\x02\n" +
+	"\x1cGetOnuPonOpticalInfoResponse\x12*\n" +
+	"\x10powerFeedVoltage\x18\x01 \x01(\x02R\x10powerFeedVoltage\x122\n" +
+	"\x14receivedOpticalPower\x18\x02 \x01(\x02R\x14receivedOpticalPower\x126\n" +
+	"\x16meanOpticalLaunchPower\x18\x03 \x01(\x02R\x16meanOpticalLaunchPower\x12*\n" +
+	"\x10laserBiasCurrent\x18\x04 \x01(\x02R\x10laserBiasCurrent\x12 \n" +
+	"\vtemperature\x18\x05 \x01(\x02R\vtemperature\"\xaf\x01\n" +
+	"\x1fGetOnuEthernetBridgePortHistory\x12R\n" +
+	"\tdirection\x18\x01 \x01(\x0e24.extension.GetOnuEthernetBridgePortHistory.DirectionR\tdirection\"8\n" +
+	"\tDirection\x12\r\n" +
+	"\tUNDEFINED\x10\x00\x12\f\n" +
+	"\bUPSTREAM\x10\x01\x12\x0e\n" +
+	"\n" +
+	"DOWNSTREAM\x10\x02\"\x93\x05\n" +
+	"'GetOnuEthernetBridgePortHistoryResponse\x12\x1e\n" +
+	"\n" +
+	"dropEvents\x18\x01 \x01(\rR\n" +
+	"dropEvents\x12\x16\n" +
+	"\x06octets\x18\x02 \x01(\rR\x06octets\x12\x18\n" +
+	"\apackets\x18\x03 \x01(\rR\apackets\x12*\n" +
+	"\x10broadcastPackets\x18\x04 \x01(\rR\x10broadcastPackets\x12*\n" +
+	"\x10multicastPackets\x18\x05 \x01(\rR\x10multicastPackets\x12,\n" +
+	"\x11crcErroredPackets\x18\x06 \x01(\rR\x11crcErroredPackets\x12*\n" +
+	"\x10undersizePackets\x18\a \x01(\rR\x10undersizePackets\x12(\n" +
+	"\x0foversizePackets\x18\b \x01(\rR\x0foversizePackets\x12(\n" +
+	"\x0fpackets64octets\x18\t \x01(\rR\x0fpackets64octets\x122\n" +
+	"\x14packets65To127octets\x18\n" +
+	" \x01(\rR\x14packets65To127octets\x124\n" +
+	"\x15packets128To255Octets\x18\v \x01(\rR\x15packets128To255Octets\x124\n" +
+	"\x15packets256To511octets\x18\f \x01(\rR\x15packets256To511octets\x126\n" +
+	"\x16packets512To1023octets\x18\r \x01(\rR\x16packets512To1023octets\x128\n" +
+	"\x17packets1024To1518octets\x18\x0e \x01(\rR\x17packets1024To1518octets\"L\n" +
+	"\x1cGetOnuAllocGemHistoryRequest\x12,\n" +
+	"\x05empty\x18\x01 \x01(\v2\x16.google.protobuf.EmptyR\x05empty\"\xb3\x03\n" +
+	"\x15OnuGemPortHistoryData\x12\x14\n" +
+	"\x05gemId\x18\x01 \x01(\rR\x05gemId\x122\n" +
+	"\x14transmittedGEMFrames\x18\x02 \x01(\rR\x14transmittedGEMFrames\x12,\n" +
+	"\x11receivedGEMFrames\x18\x03 \x01(\rR\x11receivedGEMFrames\x126\n" +
+	"\x14receivedPayloadBytes\x18\x04 \x01(\rB\x02\x18\x01R\x14receivedPayloadBytes\x12<\n" +
+	"\x17transmittedPayloadBytes\x18\x05 \x01(\rB\x02\x18\x01R\x17transmittedPayloadBytes\x120\n" +
+	"\x13encryptionKeyErrors\x18\x06 \x01(\rR\x13encryptionKeyErrors\x129\n" +
+	"\x19received_payload_bytes_64\x18\a \x01(\x06R\x16receivedPayloadBytes64\x12?\n" +
+	"\x1ctransmitted_payload_bytes_64\x18\b \x01(\x06R\x19transmittedPayloadBytes64\"I\n" +
+	"\x13OnuAllocHistoryData\x12\x18\n" +
+	"\aallocId\x18\x01 \x01(\rR\aallocId\x12\x18\n" +
+	"\arxBytes\x18\x02 \x01(\rR\arxBytes\"\xa4\x01\n" +
+	"\x16OnuAllocGemHistoryData\x12F\n" +
+	"\x0eonuAllocIdInfo\x18\x01 \x01(\v2\x1e.extension.OnuAllocHistoryDataR\x0eonuAllocIdInfo\x12B\n" +
+	"\vgemPortInfo\x18\x02 \x03(\v2 .extension.OnuGemPortHistoryDataR\vgemPortInfo\"z\n" +
+	"\x1dGetOnuAllocGemHistoryResponse\x12Y\n" +
+	"\x16onuAllocGemHistoryData\x18\x01 \x03(\v2!.extension.OnuAllocGemHistoryDataR\x16onuAllocGemHistoryData\"@\n" +
+	"\x10GetOnuFecHistory\x12,\n" +
+	"\x05empty\x18\x01 \x01(\v2\x16.google.protobuf.EmptyR\x05empty\"\xe3\x03\n" +
+	"\x18GetOnuFecHistoryResponse\x12*\n" +
+	"\x0ecorrectedBytes\x18\x01 \x01(\rB\x02\x18\x01R\x0ecorrectedBytes\x122\n" +
+	"\x12correctedCodeWords\x18\x02 \x01(\rB\x02\x18\x01R\x12correctedCodeWords\x12\x1e\n" +
+	"\n" +
+	"fecSeconds\x18\x03 \x01(\rR\n" +
+	"fecSeconds\x12*\n" +
+	"\x0etotalCodeWords\x18\x04 \x01(\rB\x02\x18\x01R\x0etotalCodeWords\x12:\n" +
+	"\x16uncorrectableCodeWords\x18\x05 \x01(\rB\x02\x18\x01R\x16uncorrectableCodeWords\x123\n" +
+	"\x16fec_corrected_bytes_64\x18\x06 \x01(\x06R\x13fecCorrectedBytes64\x12<\n" +
+	"\x1bfec_corrected_code_words_64\x18\a \x01(\x06R\x17fecCorrectedCodeWords64\x12-\n" +
+	"\x13total_code_words_64\x18\b \x01(\x06R\x10totalCodeWords64\x12=\n" +
+	"\x1buncorrectable_code_words_64\x18\t \x01(\x06R\x18uncorrectableCodeWords64\"G\n" +
+	"\x15GetOnuCountersRequest\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\"\x8d\x01\n" +
+	"%GetOmciEthernetFrameExtendedPmRequest\x12 \n" +
+	"\vonuDeviceId\x18\x01 \x01(\tR\vonuDeviceId\x12\x1c\n" +
+	"\buniIndex\x18\x02 \x01(\rH\x00R\buniIndex\x12\x14\n" +
+	"\x05reset\x18\x03 \x01(\bR\x05resetB\x0e\n" +
+	"\fis_uni_index\"C\n" +
+	"\x11GetRxPowerRequest\x12\x17\n" +
+	"\aintf_id\x18\x01 \x01(\aR\x06intfId\x12\x15\n" +
+	"\x06onu_id\x18\x02 \x01(\aR\x05onuId\"L\n" +
+	"\x14GetOltRxPowerRequest\x12\x1d\n" +
+	"\n" +
+	"port_label\x18\x01 \x01(\tR\tportLabel\x12\x15\n" +
+	"\x06onu_sn\x18\x02 \x01(\tR\x05onuSn\"Z\n" +
+	"\x12GetPonStatsRequest\x12\x1e\n" +
+	"\tportLabel\x18\x01 \x01(\tH\x00R\tportLabel\x12\x18\n" +
+	"\x06portId\x18\x02 \x01(\aH\x00R\x06portIdB\n" +
+	"\n" +
+	"\bportInfo\"o\n" +
+	"\x13GetPonStatsResponse\x12\x18\n" +
+	"\aponPort\x18\x01 \x01(\rR\aponPort\x12>\n" +
+	"\x0eportStatistics\x18\x02 \x01(\v2\x16.common.PortStatisticsR\x0eportStatistics\"Z\n" +
+	"\x12GetNNIStatsRequest\x12\x1e\n" +
+	"\tportLabel\x18\x01 \x01(\tH\x00R\tportLabel\x12\x18\n" +
+	"\x06portId\x18\x02 \x01(\aH\x00R\x06portIdB\n" +
+	"\n" +
+	"\bportInfo\"o\n" +
+	"\x13GetNNIStatsResponse\x12\x18\n" +
+	"\anniPort\x18\x01 \x01(\rR\anniPort\x12>\n" +
+	"\x0eportStatistics\x18\x02 \x01(\v2\x16.common.PortStatisticsR\x0eportStatistics\"I\n" +
+	"\x19GetOnuStatsFromOltRequest\x12\x16\n" +
+	"\x06intfId\x18\x01 \x01(\aR\x06intfId\x12\x14\n" +
+	"\x05onuId\x18\x02 \x01(\aR\x05onuId\"\x9d\x01\n" +
+	"\x15OnuGemPortInfoFromOlt\x12\x14\n" +
+	"\x05gemId\x18\x01 \x01(\rR\x05gemId\x12\x1c\n" +
+	"\trxPackets\x18\x02 \x01(\x04R\trxPackets\x12\x18\n" +
+	"\arxBytes\x18\x03 \x01(\x04R\arxBytes\x12\x1c\n" +
+	"\ttxPackets\x18\x04 \x01(\x04R\ttxPackets\x12\x18\n" +
+	"\atxBytes\x18\x05 \x01(\x04R\atxBytes\"K\n" +
+	"\x15OnuAllocIdInfoFromOlt\x12\x18\n" +
+	"\aallocId\x18\x01 \x01(\rR\aallocId\x12\x18\n" +
+	"\arxBytes\x18\x02 \x01(\x04R\arxBytes\"\xa9\x01\n" +
+	"\x1fOnuAllocGemStatsFromOltResponse\x12B\n" +
+	"\vallocIdInfo\x18\x01 \x01(\v2 .extension.OnuAllocIdInfoFromOltR\vallocIdInfo\x12B\n" +
+	"\vgemPortInfo\x18\x02 \x03(\v2 .extension.OnuGemPortInfoFromOltR\vgemPortInfo\"v\n" +
+	"\x1aGetOnuStatsFromOltResponse\x12X\n" +
+	"\x11allocGemStatsInfo\x18\x01 \x03(\v2*.extension.OnuAllocGemStatsFromOltResponseR\x11allocGemStatsInfo\"\x96\r\n" +
+	"\x16GetOnuCountersResponse\x12\x19\n" +
+	"\aintf_id\x18\x01 \x01(\aH\x00R\x06intfId\x12\x17\n" +
+	"\x06onu_id\x18\x02 \x01(\aH\x01R\x05onuId\x12'\n" +
+	"\x0epositive_drift\x18\x03 \x01(\x06H\x02R\rpositiveDrift\x12'\n" +
+	"\x0enegative_drift\x18\x04 \x01(\x06H\x03R\rnegativeDrift\x12:\n" +
+	"\x18delimiter_miss_detection\x18\x05 \x01(\x06H\x04R\x16delimiterMissDetection\x12\x1f\n" +
+	"\n" +
+	"bip_errors\x18\x06 \x01(\x06H\x05R\tbipErrors\x12\x1d\n" +
+	"\tbip_units\x18\a \x01(\x06H\x06R\bbipUnits\x124\n" +
+	"\x15fec_corrected_symbols\x18\b \x01(\x06H\aR\x13fecCorrectedSymbols\x128\n" +
+	"\x17fec_codewords_corrected\x18\t \x01(\x06H\bR\x15fecCodewordsCorrected\x12@\n" +
+	"\x1bfec_codewords_uncorrectable\x18\n" +
+	" \x01(\x06H\tR\x19fecCodewordsUncorrectable\x12%\n" +
+	"\rfec_codewords\x18\v \x01(\x06H\n" +
+	"R\ffecCodewords\x120\n" +
+	"\x13fec_corrected_units\x18\f \x01(\x06H\vR\x11fecCorrectedUnits\x12(\n" +
+	"\x0fxgem_key_errors\x18\r \x01(\x06H\fR\rxgemKeyErrors\x12\x1d\n" +
+	"\txgem_loss\x18\x0e \x01(\x06H\rR\bxgemLoss\x12(\n" +
+	"\x0frx_ploams_error\x18\x0f \x01(\x06H\x0eR\rrxPloamsError\x12-\n" +
+	"\x12rx_ploams_non_idle\x18\x10 \x01(\x06H\x0fR\x0frxPloamsNonIdle\x12\x19\n" +
+	"\arx_omci\x18\x11 \x01(\x06H\x10R\x06rxOmci\x12\x19\n" +
+	"\atx_omci\x18\x12 \x01(\x06H\x11R\x06txOmci\x12:\n" +
+	"\x19rx_omci_packets_crc_error\x18\x13 \x01(\x06H\x12R\x15rxOmciPacketsCrcError\x12\x1b\n" +
+	"\brx_bytes\x18\x14 \x01(\x06H\x13R\arxBytes\x12\x1f\n" +
+	"\n" +
+	"rx_packets\x18\x15 \x01(\x06H\x14R\trxPackets\x12\x1b\n" +
+	"\btx_bytes\x18\x16 \x01(\x06H\x15R\atxBytes\x12\x1f\n" +
+	"\n" +
+	"tx_packets\x18\x17 \x01(\x06H\x16R\ttxPackets\x12#\n" +
+	"\fber_reported\x18\x18 \x01(\x06H\x17R\vberReported\x12!\n" +
+	"\vlcdg_errors\x18\x19 \x01(\x06H\x18R\n" +
+	"lcdgErrors\x12\x1f\n" +
+	"\n" +
+	"rdi_errors\x18\x1a \x01(\x06H\x19R\trdiErrors\x12\x1e\n" +
+	"\ttimestamp\x18\x1b \x01(\aH\x1aR\ttimestamp\x12\x1f\n" +
+	"\n" +
+	"hec_errors\x18\x1c \x01(\x06H\x1bR\thecErrorsB\f\n" +
+	"\n" +
+	"is_intf_idB\v\n" +
+	"\tis_onu_idB\x13\n" +
+	"\x11is_positive_driftB\x13\n" +
+	"\x11is_negative_driftB\x1d\n" +
+	"\x1bis_delimiter_miss_detectionB\x0f\n" +
+	"\ris_bip_errorsB\x0e\n" +
+	"\fis_bip_unitsB\x1a\n" +
+	"\x18is_fec_corrected_symbolsB\x1c\n" +
+	"\x1ais_fec_codewords_correctedB \n" +
+	"\x1eis_fec_codewords_uncorrectableB\x12\n" +
+	"\x10is_fec_codewordsB\x18\n" +
+	"\x16is_fec_corrected_unitsB\x14\n" +
+	"\x12is_xgem_key_errorsB\x0e\n" +
+	"\fis_xgem_lossB\x14\n" +
+	"\x12is_rx_ploams_errorB\x17\n" +
+	"\x15is_rx_ploams_non_idleB\f\n" +
+	"\n" +
+	"is_rx_omciB\f\n" +
+	"\n" +
+	"is_tx_omciB\x1e\n" +
+	"\x1cis_rx_omci_packets_crc_errorB\r\n" +
+	"\vis_rx_bytesB\x0f\n" +
+	"\ris_rx_packetsB\r\n" +
+	"\vis_tx_bytesB\x0f\n" +
+	"\ris_tx_packetsB\x11\n" +
+	"\x0fis_ber_reportedB\x10\n" +
+	"\x0eis_lcdg_errorsB\x0f\n" +
+	"\ris_rdi_errorsB\x0e\n" +
+	"\fis_timestampB\x0f\n" +
+	"\ris_hec_errors\"\x8c\x05\n" +
+	"\x1bOmciEthernetFrameExtendedPm\x12\x1f\n" +
+	"\vdrop_events\x18\x01 \x01(\x06R\n" +
+	"dropEvents\x12\x16\n" +
+	"\x06octets\x18\x02 \x01(\x06R\x06octets\x12\x16\n" +
+	"\x06frames\x18\x03 \x01(\x06R\x06frames\x12)\n" +
+	"\x10broadcast_frames\x18\x04 \x01(\x06R\x0fbroadcastFrames\x12)\n" +
+	"\x10multicast_frames\x18\x05 \x01(\x06R\x0fmulticastFrames\x12,\n" +
+	"\x12crc_errored_frames\x18\x06 \x01(\x06R\x10crcErroredFrames\x12)\n" +
+	"\x10undersize_frames\x18\a \x01(\x06R\x0fundersizeFrames\x12'\n" +
+	"\x0foversize_frames\x18\b \x01(\x06R\x0eoversizeFrames\x12(\n" +
+	"\x10frames_64_octets\x18\t \x01(\x06R\x0eframes64Octets\x124\n" +
+	"\x17frames_65_to_127_octets\x18\n" +
+	" \x01(\x06R\x13frames65To127Octets\x126\n" +
+	"\x18frames_128_to_255_octets\x18\v \x01(\x06R\x14frames128To255Octets\x126\n" +
+	"\x18frames_256_to_511_octets\x18\f \x01(\x06R\x14frames256To511Octets\x128\n" +
+	"\x19frames_512_to_1023_octets\x18\r \x01(\x06R\x15frames512To1023Octets\x12:\n" +
+	"\x1aframes_1024_to_1518_octets\x18\x0e \x01(\x06R\x16frames1024To1518Octets\"\xf4\x02\n" +
+	"&GetOmciEthernetFrameExtendedPmResponse\x12B\n" +
+	"\bupstream\x18\x01 \x01(\v2&.extension.OmciEthernetFrameExtendedPmR\bupstream\x12F\n" +
+	"\n" +
+	"downstream\x18\x02 \x01(\v2&.extension.OmciEthernetFrameExtendedPmR\n" +
+	"downstream\x12\x8b\x01\n" +
+	"&omci_ethernet_frame_extended_pm_format\x18\x03 \x01(\x0e28.extension.GetOmciEthernetFrameExtendedPmResponse.FormatR!omciEthernetFrameExtendedPmFormat\"0\n" +
+	"\x06Format\x12\x12\n" +
+	"\x0eTHIRTY_TWO_BIT\x10\x00\x12\x12\n" +
+	"\x0eSIXTY_FOUR_BIT\x10\x01\"t\n" +
+	"\aRxPower\x12\x15\n" +
+	"\x06onu_sn\x18\x01 \x01(\tR\x05onuSn\x12\x16\n" +
+	"\x06status\x18\x02 \x01(\tR\x06status\x12\x1f\n" +
+	"\vfail_reason\x18\x03 \x01(\tR\n" +
+	"failReason\x12\x19\n" +
+	"\brx_power\x18\x04 \x01(\x01R\arxPower\"e\n" +
+	"\x15GetOltRxPowerResponse\x12\x1d\n" +
+	"\n" +
+	"port_label\x18\x01 \x01(\tR\tportLabel\x12-\n" +
+	"\brx_power\x18\x02 \x03(\v2\x12.extension.RxPowerR\arxPower\"\x98\x01\n" +
+	"\x12GetRxPowerResponse\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\x1f\n" +
+	"\vfail_reason\x18\x04 \x01(\tR\n" +
+	"failReason\x12\x19\n" +
+	"\brx_power\x18\x05 \x01(\x01R\arxPower\"J\n" +
+	"\x1aGetOnuOmciTxRxStatsRequest\x12,\n" +
+	"\x05empty\x18\x01 \x01(\v2\x16.google.protobuf.EmptyR\x05empty\"\xf1\x03\n" +
+	"\x1bGetOnuOmciTxRxStatsResponse\x12)\n" +
+	"\x11base_tx_ar_frames\x18\x01 \x01(\rR\x0ebaseTxArFrames\x12)\n" +
+	"\x11base_rx_ak_frames\x18\x02 \x01(\rR\x0ebaseRxAkFrames\x12.\n" +
+	"\x14base_tx_no_ar_frames\x18\x03 \x01(\rR\x10baseTxNoArFrames\x12.\n" +
+	"\x14base_rx_no_ak_frames\x18\x04 \x01(\rR\x10baseRxNoAkFrames\x12'\n" +
+	"\x10ext_tx_ar_frames\x18\x05 \x01(\rR\rextTxArFrames\x12'\n" +
+	"\x10ext_rx_ak_frames\x18\x06 \x01(\rR\rextRxAkFrames\x12,\n" +
+	"\x13ext_tx_no_ar_frames\x18\a \x01(\rR\x0fextTxNoArFrames\x12,\n" +
+	"\x13ext_rx_no_ak_frames\x18\b \x01(\rR\x0fextRxNoAkFrames\x125\n" +
+	"\x17tx_omci_counter_retries\x18\t \x01(\rR\x14txOmciCounterRetries\x127\n" +
+	"\x18tx_omci_counter_timeouts\x18\n" +
+	" \x01(\rR\x15txOmciCounterTimeouts\"M\n" +
+	"\x1dGetOnuOmciActiveAlarmsRequest\x12,\n" +
+	"\x05empty\x18\x01 \x01(\v2\x16.google.protobuf.EmptyR\x05empty\"}\n" +
+	"\tAlarmData\x12\x19\n" +
+	"\bclass_id\x18\x01 \x01(\rR\aclassId\x12\x1f\n" +
+	"\vinstance_id\x18\x02 \x01(\rR\n" +
+	"instanceId\x12\x12\n" +
+	"\x04name\x18\x03 \x01(\tR\x04name\x12 \n" +
+	"\vdescription\x18\x04 \x01(\tR\vdescription\"[\n" +
+	"\x1eGetOnuOmciActiveAlarmsResponse\x129\n" +
+	"\ractive_alarms\x18\x01 \x03(\v2\x14.extension.AlarmDataR\factiveAlarms\"\xc2\x01\n" +
+	"!GetOffloadedAppsStatisticsRequest\x12U\n" +
+	"\bstatsFor\x18\x01 \x01(\x0e29.extension.GetOffloadedAppsStatisticsRequest.OffloadedAppR\bstatsFor\"F\n" +
+	"\fOffloadedApp\x12\r\n" +
+	"\tUNDEFINED\x10\x00\x12\v\n" +
+	"\aPPPoeIA\x10\x01\x12\f\n" +
+	"\bDHCPv4RA\x10\x02\x12\f\n" +
+	"\bDHCPv6RA\x10\x03\"\x8b\x16\n" +
+	"\"GetOffloadedAppsStatisticsResponse\x12c\n" +
+	"\rdhcpv4RaStats\x18\x01 \x01(\v2;.extension.GetOffloadedAppsStatisticsResponse.DHCPv4RAStatsH\x00R\rdhcpv4RaStats\x12c\n" +
+	"\rdhcpv6RaStats\x18\x02 \x01(\v2;.extension.GetOffloadedAppsStatisticsResponse.DHCPv6RAStatsH\x00R\rdhcpv6RaStats\x12`\n" +
+	"\fpppoeIaStats\x18\x03 \x01(\v2:.extension.GetOffloadedAppsStatisticsResponse.PPPoeIAStatsH\x00R\fpppoeIaStats\x1a\xfb\x05\n" +
+	"\rDHCPv4RAStats\x12:\n" +
+	"\x1ain_bad_packets_from_client\x18\x01 \x01(\rR\x16inBadPacketsFromClient\x12:\n" +
+	"\x1ain_bad_packets_from_server\x18\x02 \x01(\rR\x16inBadPacketsFromServer\x123\n" +
+	"\x16in_packets_from_client\x18\x03 \x01(\rR\x13inPacketsFromClient\x123\n" +
+	"\x16in_packets_from_server\x18\x04 \x01(\rR\x13inPacketsFromServer\x121\n" +
+	"\x15out_packets_to_server\x18\x05 \x01(\rR\x12outPacketsToServer\x121\n" +
+	"\x15out_packets_to_client\x18\x06 \x01(\rR\x12outPacketsToClient\x12M\n" +
+	"$option_82_inserted_packets_to_server\x18\a \x01(\rR\x1foption82InsertedPacketsToServer\x12K\n" +
+	"#option_82_removed_packets_to_client\x18\b \x01(\rR\x1eoption82RemovedPacketsToClient\x12E\n" +
+	" option_82_not_inserted_to_server\x18\t \x01(\rR\x1boption82NotInsertedToServer\x12{\n" +
+	"\x10additional_stats\x18\n" +
+	" \x03(\v2P.extension.GetOffloadedAppsStatisticsResponse.DHCPv4RAStats.AdditionalStatsEntryR\x0fadditionalStats\x1aB\n" +
+	"\x14AdditionalStatsEntry\x12\x10\n" +
+	"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
+	"\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1a\xf5\x06\n" +
+	"\rDHCPv6RAStats\x12:\n" +
+	"\x1ain_bad_packets_from_client\x18\x01 \x01(\rR\x16inBadPacketsFromClient\x12:\n" +
+	"\x1ain_bad_packets_from_server\x18\x02 \x01(\rR\x16inBadPacketsFromServer\x12M\n" +
+	"$option_17_inserted_packets_to_server\x18\x03 \x01(\rR\x1foption17InsertedPacketsToServer\x12K\n" +
+	"#option_17_removed_packets_to_client\x18\x04 \x01(\rR\x1eoption17RemovedPacketsToClient\x12M\n" +
+	"$option_18_inserted_packets_to_server\x18\x05 \x01(\rR\x1foption18InsertedPacketsToServer\x12K\n" +
+	"#option_18_removed_packets_to_client\x18\x06 \x01(\rR\x1eoption18RemovedPacketsToClient\x12M\n" +
+	"$option_37_inserted_packets_to_server\x18\a \x01(\rR\x1foption37InsertedPacketsToServer\x12K\n" +
+	"#option_37_removed_packets_to_client\x18\b \x01(\rR\x1eoption37RemovedPacketsToClient\x12W\n" +
+	")outgoing_mtu_exceeded_packets_from_client\x18\t \x01(\rR$outgoingMtuExceededPacketsFromClient\x12{\n" +
+	"\x10additional_stats\x18\n" +
+	" \x03(\v2P.extension.GetOffloadedAppsStatisticsResponse.DHCPv6RAStats.AdditionalStatsEntryR\x0fadditionalStats\x1aB\n" +
+	"\x14AdditionalStatsEntry\x12\x10\n" +
+	"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
+	"\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1a\xb9\x06\n" +
+	"\fPPPoeIAStats\x12>\n" +
+	"\x1cin_error_packets_from_client\x18\x01 \x01(\rR\x18inErrorPacketsFromClient\x12>\n" +
+	"\x1cin_error_packets_from_server\x18\x02 \x01(\rR\x18inErrorPacketsFromServer\x123\n" +
+	"\x16in_packets_from_client\x18\x03 \x01(\rR\x13inPacketsFromClient\x123\n" +
+	"\x16in_packets_from_server\x18\x04 \x01(\rR\x13inPacketsFromServer\x121\n" +
+	"\x15out_packets_to_server\x18\x05 \x01(\rR\x12outPacketsToServer\x121\n" +
+	"\x15out_packets_to_client\x18\x06 \x01(\rR\x12outPacketsToClient\x12`\n" +
+	".vendor_specific_tag_inserted_packets_to_server\x18\a \x01(\rR(vendorSpecificTagInsertedPacketsToServer\x12^\n" +
+	"-vendor_specific_tag_removed_packets_to_client\x18\b \x01(\rR'vendorSpecificTagRemovedPacketsToClient\x12W\n" +
+	")outgoing_mtu_exceeded_packets_from_client\x18\t \x01(\rR$outgoingMtuExceededPacketsFromClient\x12z\n" +
+	"\x10additional_stats\x18\n" +
+	" \x03(\v2O.extension.GetOffloadedAppsStatisticsResponse.PPPoeIAStats.AdditionalStatsEntryR\x0fadditionalStats\x1aB\n" +
+	"\x14AdditionalStatsEntry\x12\x10\n" +
+	"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
+	"\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\a\n" +
+	"\x05stats\"\xf8\t\n" +
+	"\x0fGetValueRequest\x12;\n" +
+	"\bdistance\x18\x01 \x01(\v2\x1d.extension.GetDistanceRequestH\x00R\bdistance\x12;\n" +
+	"\auniInfo\x18\x02 \x01(\v2\x1f.extension.GetOnuUniInfoRequestH\x00R\auniInfo\x12A\n" +
+	"\voltPortInfo\x18\x03 \x01(\v2\x1d.extension.GetOltPortCountersH\x00R\voltPortInfo\x12I\n" +
+	"\x0eonuOpticalInfo\x18\x04 \x01(\v2\x1f.extension.GetOnuPonOpticalInfoH\x00R\x0eonuOpticalInfo\x12R\n" +
+	"\rethBridgePort\x18\x05 \x01(\v2*.extension.GetOnuEthernetBridgePortHistoryH\x00R\rethBridgePort\x12=\n" +
+	"\n" +
+	"fecHistory\x18\x06 \x01(\v2\x1b.extension.GetOnuFecHistoryH\x00R\n" +
+	"fecHistory\x12B\n" +
+	"\n" +
+	"onuPonInfo\x18\a \x01(\v2 .extension.GetOnuCountersRequestH\x00R\n" +
+	"onuPonInfo\x12L\n" +
+	"\aonuInfo\x18\b \x01(\v20.extension.GetOmciEthernetFrameExtendedPmRequestH\x00R\aonuInfo\x128\n" +
+	"\arxPower\x18\t \x01(\v2\x1c.extension.GetRxPowerRequestH\x00R\arxPower\x12K\n" +
+	"\fonuOmciStats\x18\n" +
+	" \x01(\v2%.extension.GetOnuOmciTxRxStatsRequestH\x00R\fonuOmciStats\x12A\n" +
+	"\n" +
+	"oltRxPower\x18\v \x01(\v2\x1f.extension.GetOltRxPowerRequestH\x00R\n" +
+	"oltRxPower\x12T\n" +
+	"\x0fonuActiveAlarms\x18\f \x01(\v2(.extension.GetOnuOmciActiveAlarmsRequestH\x00R\x0fonuActiveAlarms\x12^\n" +
+	"\x12offloadedAppsStats\x18\r \x01(\v2,.extension.GetOffloadedAppsStatisticsRequestH\x00R\x12offloadedAppsStats\x12U\n" +
+	"\x10onuAllocGemStats\x18\x0e \x01(\v2'.extension.GetOnuAllocGemHistoryRequestH\x00R\x10onuAllocGemStats\x12P\n" +
+	"\x0fonuStatsFromOlt\x18\x0f \x01(\v2$.extension.GetOnuStatsFromOltRequestH\x00R\x0fonuStatsFromOlt\x12A\n" +
+	"\voltPonStats\x18\x10 \x01(\v2\x1d.extension.GetPonStatsRequestH\x00R\voltPonStats\x12A\n" +
+	"\voltNniStats\x18\x11 \x01(\v2\x1d.extension.GetNNIStatsRequestH\x00R\voltNniStatsB\t\n" +
+	"\arequest\"\xe7\r\n" +
+	"\x10GetValueResponse\x12:\n" +
+	"\x06status\x18\x01 \x01(\x0e2\".extension.GetValueResponse.StatusR\x06status\x12E\n" +
+	"\terrReason\x18\x02 \x01(\x0e2'.extension.GetValueResponse.ErrorReasonR\terrReason\x12<\n" +
+	"\bdistance\x18\x03 \x01(\v2\x1e.extension.GetDistanceResponseH\x00R\bdistance\x12<\n" +
+	"\auniInfo\x18\x04 \x01(\v2 .extension.GetOnuUniInfoResponseH\x00R\auniInfo\x12K\n" +
+	"\fportCoutners\x18\x05 \x01(\v2%.extension.GetOltPortCountersResponseH\x00R\fportCoutners\x12Q\n" +
+	"\x0eonuOpticalInfo\x18\x06 \x01(\v2'.extension.GetOnuPonOpticalInfoResponseH\x00R\x0eonuOpticalInfo\x12b\n" +
+	"\x11ethBridgePortInfo\x18\a \x01(\v22.extension.GetOnuEthernetBridgePortHistoryResponseH\x00R\x11ethBridgePortInfo\x12E\n" +
+	"\n" +
+	"fecHistory\x18\b \x01(\v2#.extension.GetOnuFecHistoryResponseH\x00R\n" +
+	"fecHistory\x12K\n" +
+	"\x0eonuPonCounters\x18\t \x01(\v2!.extension.GetOnuCountersResponseH\x00R\x0eonuPonCounters\x12U\n" +
+	"\vonuCounters\x18\n" +
+	" \x01(\v21.extension.GetOmciEthernetFrameExtendedPmResponseH\x00R\vonuCounters\x129\n" +
+	"\arxPower\x18\v \x01(\v2\x1d.extension.GetRxPowerResponseH\x00R\arxPower\x12L\n" +
+	"\fonuOmciStats\x18\f \x01(\v2&.extension.GetOnuOmciTxRxStatsResponseH\x00R\fonuOmciStats\x12B\n" +
+	"\n" +
+	"oltRxPower\x18\r \x01(\v2 .extension.GetOltRxPowerResponseH\x00R\n" +
+	"oltRxPower\x12U\n" +
+	"\x0fonuActiveAlarms\x18\x0e \x01(\v2).extension.GetOnuOmciActiveAlarmsResponseH\x00R\x0fonuActiveAlarms\x12_\n" +
+	"\x12offloadedAppsStats\x18\x0f \x01(\v2-.extension.GetOffloadedAppsStatisticsResponseH\x00R\x12offloadedAppsStats\x12f\n" +
+	"\x18onuAllocGemStatsResponse\x18\x10 \x01(\v2(.extension.GetOnuAllocGemHistoryResponseH\x00R\x18onuAllocGemStatsResponse\x12a\n" +
+	"\x17onuStatsFromOltResponse\x18\x11 \x01(\v2%.extension.GetOnuStatsFromOltResponseH\x00R\x17onuStatsFromOltResponse\x12R\n" +
+	"\x13oltPonStatsResponse\x18\x12 \x01(\v2\x1e.extension.GetPonStatsResponseH\x00R\x13oltPonStatsResponse\x12R\n" +
+	"\x13oltNniStatsResponse\x18\x13 \x01(\v2\x1e.extension.GetNNIStatsResponseH\x00R\x13oltNniStatsResponse\"1\n" +
+	"\x06Status\x12\x14\n" +
+	"\x10STATUS_UNDEFINED\x10\x00\x12\x06\n" +
+	"\x02OK\x10\x01\x12\t\n" +
+	"\x05ERROR\x10\x02\"\xad\x01\n" +
+	"\vErrorReason\x12\x14\n" +
+	"\x10REASON_UNDEFINED\x10\x00\x12\x0f\n" +
+	"\vUNSUPPORTED\x10\x01\x12\x15\n" +
+	"\x11INVALID_DEVICE_ID\x10\x02\x12\x15\n" +
+	"\x11INVALID_PORT_TYPE\x10\x03\x12\v\n" +
+	"\aTIMEOUT\x10\x04\x12\x14\n" +
+	"\x10INVALID_REQ_TYPE\x10\x05\x12\x12\n" +
+	"\x0eINTERNAL_ERROR\x10\x06\x12\x12\n" +
+	"\x0eINVALID_DEVICE\x10\aB\n" +
+	"\n" +
+	"\bresponse\"\xac\x01\n" +
+	"\x10AppOffloadConfig\x12&\n" +
+	"\x0eenableDHCPv4RA\x18\x01 \x01(\bR\x0eenableDHCPv4RA\x12&\n" +
+	"\x0eenableDHCPv6RA\x18\x02 \x01(\bR\x0eenableDHCPv6RA\x12$\n" +
+	"\renablePPPoEIA\x18\x03 \x01(\bR\renablePPPoEIA\x12\"\n" +
+	"\faccessNodeID\x18\x04 \x01(\tR\faccessNodeID\"\xfe\x01\n" +
+	"\x13AppOffloadOnuConfig\x12 \n" +
+	"\vonuDeviceId\x18\x01 \x01(\tR\vonuDeviceId\x12K\n" +
+	"\n" +
+	"perUniInfo\x18\x05 \x03(\v2+.extension.AppOffloadOnuConfig.PerUniConfigR\n" +
+	"perUniInfo\x1ax\n" +
+	"\fPerUniConfig\x12$\n" +
+	"\ragentRemoteID\x18\x02 \x01(\tR\ragentRemoteID\x12&\n" +
+	"\x0eagentCircuitID\x18\x03 \x01(\tR\x0eagentCircuitID\x12\x1a\n" +
+	"\bonuUniId\x18\x04 \x01(\rR\bonuUniId\"\xfa\x01\n" +
+	"\x0fSetValueRequest\x128\n" +
+	"\falarm_config\x18\x01 \x01(\v2\x13.config.AlarmConfigH\x00R\valarmConfig\x12K\n" +
+	"\x12app_offload_config\x18\x02 \x01(\v2\x1b.extension.AppOffloadConfigH\x00R\x10appOffloadConfig\x12U\n" +
+	"\x16app_offload_onu_config\x18\x03 \x01(\v2\x1e.extension.AppOffloadOnuConfigH\x00R\x13appOffloadOnuConfigB\t\n" +
+	"\arequest\"\xc4\x02\n" +
+	"\x10SetValueResponse\x12:\n" +
+	"\x06status\x18\x01 \x01(\x0e2\".extension.SetValueResponse.StatusR\x06status\x12E\n" +
+	"\terrReason\x18\x02 \x01(\x0e2'.extension.SetValueResponse.ErrorReasonR\terrReason\"1\n" +
+	"\x06Status\x12\x14\n" +
+	"\x10STATUS_UNDEFINED\x10\x00\x12\x06\n" +
+	"\x02OK\x10\x01\x12\t\n" +
+	"\x05ERROR\x10\x02\"z\n" +
+	"\vErrorReason\x12\x14\n" +
+	"\x10REASON_UNDEFINED\x10\x00\x12\x0f\n" +
+	"\vUNSUPPORTED\x10\x01\x12\x15\n" +
+	"\x11INVALID_DEVICE_ID\x10\x02\x12\x19\n" +
+	"\x15INVALID_ONU_DEVICE_ID\x10\x03\x12\x12\n" +
+	"\x0eINVALID_UNI_ID\x10\x04\"i\n" +
+	"\x15SingleGetValueRequest\x12\x1a\n" +
+	"\btargetId\x18\x01 \x01(\tR\btargetId\x124\n" +
+	"\arequest\x18\x02 \x01(\v2\x1a.extension.GetValueRequestR\arequest\"Q\n" +
+	"\x16SingleGetValueResponse\x127\n" +
+	"\bresponse\x18\x01 \x01(\v2\x1b.extension.GetValueResponseR\bresponse\"i\n" +
+	"\x15SingleSetValueRequest\x12\x1a\n" +
+	"\btargetId\x18\x01 \x01(\tR\btargetId\x124\n" +
+	"\arequest\x18\x02 \x01(\v2\x1a.extension.SetValueRequestR\arequest\"Q\n" +
+	"\x16SingleSetValueResponse\x127\n" +
+	"\bresponse\x18\x01 \x01(\v2\x1b.extension.SetValueResponseR\bresponse2\xb3\x01\n" +
+	"\tExtension\x12R\n" +
+	"\vGetExtValue\x12 .extension.SingleGetValueRequest\x1a!.extension.SingleGetValueResponse\x12R\n" +
+	"\vSetExtValue\x12 .extension.SingleSetValueRequest\x1a!.extension.SingleSetValueResponseBR\n" +
+	"\x1dorg.opencord.voltha.extensionZ1github.com/opencord/voltha-protos/v5/go/extensionb\x06proto3"
+
+var (
+	file_voltha_protos_extensions_proto_rawDescOnce sync.Once
+	file_voltha_protos_extensions_proto_rawDescData []byte
+)
+
+func file_voltha_protos_extensions_proto_rawDescGZIP() []byte {
+	file_voltha_protos_extensions_proto_rawDescOnce.Do(func() {
+		file_voltha_protos_extensions_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_voltha_protos_extensions_proto_rawDesc), len(file_voltha_protos_extensions_proto_rawDesc)))
+	})
+	return file_voltha_protos_extensions_proto_rawDescData
+}
+
+var file_voltha_protos_extensions_proto_enumTypes = make([]protoimpl.EnumInfo, 12)
+var file_voltha_protos_extensions_proto_msgTypes = make([]protoimpl.MessageInfo, 64)
+var file_voltha_protos_extensions_proto_goTypes = []any{
+	(ValueType_Type)(0),                                      // 0: extension.ValueType.Type
+	(GetOnuUniInfoResponse_ConfigurationInd)(0),              // 1: extension.GetOnuUniInfoResponse.ConfigurationInd
+	(GetOnuUniInfoResponse_AdministrativeState)(0),           // 2: extension.GetOnuUniInfoResponse.AdministrativeState
+	(GetOnuUniInfoResponse_OperationalState)(0),              // 3: extension.GetOnuUniInfoResponse.OperationalState
+	(GetOltPortCounters_PortType)(0),                         // 4: extension.GetOltPortCounters.PortType
+	(GetOnuEthernetBridgePortHistory_Direction)(0),           // 5: extension.GetOnuEthernetBridgePortHistory.Direction
+	(GetOmciEthernetFrameExtendedPmResponse_Format)(0),       // 6: extension.GetOmciEthernetFrameExtendedPmResponse.Format
+	(GetOffloadedAppsStatisticsRequest_OffloadedApp)(0),      // 7: extension.GetOffloadedAppsStatisticsRequest.OffloadedApp
+	(GetValueResponse_Status)(0),                             // 8: extension.GetValueResponse.Status
+	(GetValueResponse_ErrorReason)(0),                        // 9: extension.GetValueResponse.ErrorReason
+	(SetValueResponse_Status)(0),                             // 10: extension.SetValueResponse.Status
+	(SetValueResponse_ErrorReason)(0),                        // 11: extension.SetValueResponse.ErrorReason
+	(*ValueSet)(nil),                                         // 12: extension.ValueSet
+	(*ValueType)(nil),                                        // 13: extension.ValueType
+	(*ValueSpecifier)(nil),                                   // 14: extension.ValueSpecifier
+	(*ReturnValues)(nil),                                     // 15: extension.ReturnValues
+	(*GetDistanceRequest)(nil),                               // 16: extension.GetDistanceRequest
+	(*GetDistanceResponse)(nil),                              // 17: extension.GetDistanceResponse
+	(*GetOnuUniInfoRequest)(nil),                             // 18: extension.GetOnuUniInfoRequest
+	(*GetOnuUniInfoResponse)(nil),                            // 19: extension.GetOnuUniInfoResponse
+	(*GetOltPortCounters)(nil),                               // 20: extension.GetOltPortCounters
+	(*GetOltPortCountersResponse)(nil),                       // 21: extension.GetOltPortCountersResponse
+	(*GetOnuPonOpticalInfo)(nil),                             // 22: extension.GetOnuPonOpticalInfo
+	(*GetOnuPonOpticalInfoResponse)(nil),                     // 23: extension.GetOnuPonOpticalInfoResponse
+	(*GetOnuEthernetBridgePortHistory)(nil),                  // 24: extension.GetOnuEthernetBridgePortHistory
+	(*GetOnuEthernetBridgePortHistoryResponse)(nil),          // 25: extension.GetOnuEthernetBridgePortHistoryResponse
+	(*GetOnuAllocGemHistoryRequest)(nil),                     // 26: extension.GetOnuAllocGemHistoryRequest
+	(*OnuGemPortHistoryData)(nil),                            // 27: extension.OnuGemPortHistoryData
+	(*OnuAllocHistoryData)(nil),                              // 28: extension.OnuAllocHistoryData
+	(*OnuAllocGemHistoryData)(nil),                           // 29: extension.OnuAllocGemHistoryData
+	(*GetOnuAllocGemHistoryResponse)(nil),                    // 30: extension.GetOnuAllocGemHistoryResponse
+	(*GetOnuFecHistory)(nil),                                 // 31: extension.GetOnuFecHistory
+	(*GetOnuFecHistoryResponse)(nil),                         // 32: extension.GetOnuFecHistoryResponse
+	(*GetOnuCountersRequest)(nil),                            // 33: extension.GetOnuCountersRequest
+	(*GetOmciEthernetFrameExtendedPmRequest)(nil),            // 34: extension.GetOmciEthernetFrameExtendedPmRequest
+	(*GetRxPowerRequest)(nil),                                // 35: extension.GetRxPowerRequest
+	(*GetOltRxPowerRequest)(nil),                             // 36: extension.GetOltRxPowerRequest
+	(*GetPonStatsRequest)(nil),                               // 37: extension.GetPonStatsRequest
+	(*GetPonStatsResponse)(nil),                              // 38: extension.GetPonStatsResponse
+	(*GetNNIStatsRequest)(nil),                               // 39: extension.GetNNIStatsRequest
+	(*GetNNIStatsResponse)(nil),                              // 40: extension.GetNNIStatsResponse
+	(*GetOnuStatsFromOltRequest)(nil),                        // 41: extension.GetOnuStatsFromOltRequest
+	(*OnuGemPortInfoFromOlt)(nil),                            // 42: extension.OnuGemPortInfoFromOlt
+	(*OnuAllocIdInfoFromOlt)(nil),                            // 43: extension.OnuAllocIdInfoFromOlt
+	(*OnuAllocGemStatsFromOltResponse)(nil),                  // 44: extension.OnuAllocGemStatsFromOltResponse
+	(*GetOnuStatsFromOltResponse)(nil),                       // 45: extension.GetOnuStatsFromOltResponse
+	(*GetOnuCountersResponse)(nil),                           // 46: extension.GetOnuCountersResponse
+	(*OmciEthernetFrameExtendedPm)(nil),                      // 47: extension.OmciEthernetFrameExtendedPm
+	(*GetOmciEthernetFrameExtendedPmResponse)(nil),           // 48: extension.GetOmciEthernetFrameExtendedPmResponse
+	(*RxPower)(nil),                                          // 49: extension.RxPower
+	(*GetOltRxPowerResponse)(nil),                            // 50: extension.GetOltRxPowerResponse
+	(*GetRxPowerResponse)(nil),                               // 51: extension.GetRxPowerResponse
+	(*GetOnuOmciTxRxStatsRequest)(nil),                       // 52: extension.GetOnuOmciTxRxStatsRequest
+	(*GetOnuOmciTxRxStatsResponse)(nil),                      // 53: extension.GetOnuOmciTxRxStatsResponse
+	(*GetOnuOmciActiveAlarmsRequest)(nil),                    // 54: extension.GetOnuOmciActiveAlarmsRequest
+	(*AlarmData)(nil),                                        // 55: extension.AlarmData
+	(*GetOnuOmciActiveAlarmsResponse)(nil),                   // 56: extension.GetOnuOmciActiveAlarmsResponse
+	(*GetOffloadedAppsStatisticsRequest)(nil),                // 57: extension.GetOffloadedAppsStatisticsRequest
+	(*GetOffloadedAppsStatisticsResponse)(nil),               // 58: extension.GetOffloadedAppsStatisticsResponse
+	(*GetValueRequest)(nil),                                  // 59: extension.GetValueRequest
+	(*GetValueResponse)(nil),                                 // 60: extension.GetValueResponse
+	(*AppOffloadConfig)(nil),                                 // 61: extension.AppOffloadConfig
+	(*AppOffloadOnuConfig)(nil),                              // 62: extension.AppOffloadOnuConfig
+	(*SetValueRequest)(nil),                                  // 63: extension.SetValueRequest
+	(*SetValueResponse)(nil),                                 // 64: extension.SetValueResponse
+	(*SingleGetValueRequest)(nil),                            // 65: extension.SingleGetValueRequest
+	(*SingleGetValueResponse)(nil),                           // 66: extension.SingleGetValueResponse
+	(*SingleSetValueRequest)(nil),                            // 67: extension.SingleSetValueRequest
+	(*SingleSetValueResponse)(nil),                           // 68: extension.SingleSetValueResponse
+	(*GetOffloadedAppsStatisticsResponse_DHCPv4RAStats)(nil), // 69: extension.GetOffloadedAppsStatisticsResponse.DHCPv4RAStats
+	(*GetOffloadedAppsStatisticsResponse_DHCPv6RAStats)(nil), // 70: extension.GetOffloadedAppsStatisticsResponse.DHCPv6RAStats
+	(*GetOffloadedAppsStatisticsResponse_PPPoeIAStats)(nil),  // 71: extension.GetOffloadedAppsStatisticsResponse.PPPoeIAStats
+	nil,                                      // 72: extension.GetOffloadedAppsStatisticsResponse.DHCPv4RAStats.AdditionalStatsEntry
+	nil,                                      // 73: extension.GetOffloadedAppsStatisticsResponse.DHCPv6RAStats.AdditionalStatsEntry
+	nil,                                      // 74: extension.GetOffloadedAppsStatisticsResponse.PPPoeIAStats.AdditionalStatsEntry
+	(*AppOffloadOnuConfig_PerUniConfig)(nil), // 75: extension.AppOffloadOnuConfig.PerUniConfig
+	(*config.AlarmConfig)(nil),               // 76: config.AlarmConfig
+	(*emptypb.Empty)(nil),                    // 77: google.protobuf.Empty
+	(*common.PortStatistics)(nil),            // 78: common.PortStatistics
+}
+var file_voltha_protos_extensions_proto_depIdxs = []int32{
+	76, // 0: extension.ValueSet.alarm_config:type_name -> config.AlarmConfig
+	0,  // 1: extension.ValueSpecifier.value:type_name -> extension.ValueType.Type
+	2,  // 2: extension.GetOnuUniInfoResponse.admState:type_name -> extension.GetOnuUniInfoResponse.AdministrativeState
+	3,  // 3: extension.GetOnuUniInfoResponse.operState:type_name -> extension.GetOnuUniInfoResponse.OperationalState
+	1,  // 4: extension.GetOnuUniInfoResponse.configInd:type_name -> extension.GetOnuUniInfoResponse.ConfigurationInd
+	4,  // 5: extension.GetOltPortCounters.portType:type_name -> extension.GetOltPortCounters.PortType
+	77, // 6: extension.GetOnuPonOpticalInfo.empty:type_name -> google.protobuf.Empty
+	5,  // 7: extension.GetOnuEthernetBridgePortHistory.direction:type_name -> extension.GetOnuEthernetBridgePortHistory.Direction
+	77, // 8: extension.GetOnuAllocGemHistoryRequest.empty:type_name -> google.protobuf.Empty
+	28, // 9: extension.OnuAllocGemHistoryData.onuAllocIdInfo:type_name -> extension.OnuAllocHistoryData
+	27, // 10: extension.OnuAllocGemHistoryData.gemPortInfo:type_name -> extension.OnuGemPortHistoryData
+	29, // 11: extension.GetOnuAllocGemHistoryResponse.onuAllocGemHistoryData:type_name -> extension.OnuAllocGemHistoryData
+	77, // 12: extension.GetOnuFecHistory.empty:type_name -> google.protobuf.Empty
+	78, // 13: extension.GetPonStatsResponse.portStatistics:type_name -> common.PortStatistics
+	78, // 14: extension.GetNNIStatsResponse.portStatistics:type_name -> common.PortStatistics
+	43, // 15: extension.OnuAllocGemStatsFromOltResponse.allocIdInfo:type_name -> extension.OnuAllocIdInfoFromOlt
+	42, // 16: extension.OnuAllocGemStatsFromOltResponse.gemPortInfo:type_name -> extension.OnuGemPortInfoFromOlt
+	44, // 17: extension.GetOnuStatsFromOltResponse.allocGemStatsInfo:type_name -> extension.OnuAllocGemStatsFromOltResponse
+	47, // 18: extension.GetOmciEthernetFrameExtendedPmResponse.upstream:type_name -> extension.OmciEthernetFrameExtendedPm
+	47, // 19: extension.GetOmciEthernetFrameExtendedPmResponse.downstream:type_name -> extension.OmciEthernetFrameExtendedPm
+	6,  // 20: extension.GetOmciEthernetFrameExtendedPmResponse.omci_ethernet_frame_extended_pm_format:type_name -> extension.GetOmciEthernetFrameExtendedPmResponse.Format
+	49, // 21: extension.GetOltRxPowerResponse.rx_power:type_name -> extension.RxPower
+	77, // 22: extension.GetOnuOmciTxRxStatsRequest.empty:type_name -> google.protobuf.Empty
+	77, // 23: extension.GetOnuOmciActiveAlarmsRequest.empty:type_name -> google.protobuf.Empty
+	55, // 24: extension.GetOnuOmciActiveAlarmsResponse.active_alarms:type_name -> extension.AlarmData
+	7,  // 25: extension.GetOffloadedAppsStatisticsRequest.statsFor:type_name -> extension.GetOffloadedAppsStatisticsRequest.OffloadedApp
+	69, // 26: extension.GetOffloadedAppsStatisticsResponse.dhcpv4RaStats:type_name -> extension.GetOffloadedAppsStatisticsResponse.DHCPv4RAStats
+	70, // 27: extension.GetOffloadedAppsStatisticsResponse.dhcpv6RaStats:type_name -> extension.GetOffloadedAppsStatisticsResponse.DHCPv6RAStats
+	71, // 28: extension.GetOffloadedAppsStatisticsResponse.pppoeIaStats:type_name -> extension.GetOffloadedAppsStatisticsResponse.PPPoeIAStats
+	16, // 29: extension.GetValueRequest.distance:type_name -> extension.GetDistanceRequest
+	18, // 30: extension.GetValueRequest.uniInfo:type_name -> extension.GetOnuUniInfoRequest
+	20, // 31: extension.GetValueRequest.oltPortInfo:type_name -> extension.GetOltPortCounters
+	22, // 32: extension.GetValueRequest.onuOpticalInfo:type_name -> extension.GetOnuPonOpticalInfo
+	24, // 33: extension.GetValueRequest.ethBridgePort:type_name -> extension.GetOnuEthernetBridgePortHistory
+	31, // 34: extension.GetValueRequest.fecHistory:type_name -> extension.GetOnuFecHistory
+	33, // 35: extension.GetValueRequest.onuPonInfo:type_name -> extension.GetOnuCountersRequest
+	34, // 36: extension.GetValueRequest.onuInfo:type_name -> extension.GetOmciEthernetFrameExtendedPmRequest
+	35, // 37: extension.GetValueRequest.rxPower:type_name -> extension.GetRxPowerRequest
+	52, // 38: extension.GetValueRequest.onuOmciStats:type_name -> extension.GetOnuOmciTxRxStatsRequest
+	36, // 39: extension.GetValueRequest.oltRxPower:type_name -> extension.GetOltRxPowerRequest
+	54, // 40: extension.GetValueRequest.onuActiveAlarms:type_name -> extension.GetOnuOmciActiveAlarmsRequest
+	57, // 41: extension.GetValueRequest.offloadedAppsStats:type_name -> extension.GetOffloadedAppsStatisticsRequest
+	26, // 42: extension.GetValueRequest.onuAllocGemStats:type_name -> extension.GetOnuAllocGemHistoryRequest
+	41, // 43: extension.GetValueRequest.onuStatsFromOlt:type_name -> extension.GetOnuStatsFromOltRequest
+	37, // 44: extension.GetValueRequest.oltPonStats:type_name -> extension.GetPonStatsRequest
+	39, // 45: extension.GetValueRequest.oltNniStats:type_name -> extension.GetNNIStatsRequest
+	8,  // 46: extension.GetValueResponse.status:type_name -> extension.GetValueResponse.Status
+	9,  // 47: extension.GetValueResponse.errReason:type_name -> extension.GetValueResponse.ErrorReason
+	17, // 48: extension.GetValueResponse.distance:type_name -> extension.GetDistanceResponse
+	19, // 49: extension.GetValueResponse.uniInfo:type_name -> extension.GetOnuUniInfoResponse
+	21, // 50: extension.GetValueResponse.portCoutners:type_name -> extension.GetOltPortCountersResponse
+	23, // 51: extension.GetValueResponse.onuOpticalInfo:type_name -> extension.GetOnuPonOpticalInfoResponse
+	25, // 52: extension.GetValueResponse.ethBridgePortInfo:type_name -> extension.GetOnuEthernetBridgePortHistoryResponse
+	32, // 53: extension.GetValueResponse.fecHistory:type_name -> extension.GetOnuFecHistoryResponse
+	46, // 54: extension.GetValueResponse.onuPonCounters:type_name -> extension.GetOnuCountersResponse
+	48, // 55: extension.GetValueResponse.onuCounters:type_name -> extension.GetOmciEthernetFrameExtendedPmResponse
+	51, // 56: extension.GetValueResponse.rxPower:type_name -> extension.GetRxPowerResponse
+	53, // 57: extension.GetValueResponse.onuOmciStats:type_name -> extension.GetOnuOmciTxRxStatsResponse
+	50, // 58: extension.GetValueResponse.oltRxPower:type_name -> extension.GetOltRxPowerResponse
+	56, // 59: extension.GetValueResponse.onuActiveAlarms:type_name -> extension.GetOnuOmciActiveAlarmsResponse
+	58, // 60: extension.GetValueResponse.offloadedAppsStats:type_name -> extension.GetOffloadedAppsStatisticsResponse
+	30, // 61: extension.GetValueResponse.onuAllocGemStatsResponse:type_name -> extension.GetOnuAllocGemHistoryResponse
+	45, // 62: extension.GetValueResponse.onuStatsFromOltResponse:type_name -> extension.GetOnuStatsFromOltResponse
+	38, // 63: extension.GetValueResponse.oltPonStatsResponse:type_name -> extension.GetPonStatsResponse
+	40, // 64: extension.GetValueResponse.oltNniStatsResponse:type_name -> extension.GetNNIStatsResponse
+	75, // 65: extension.AppOffloadOnuConfig.perUniInfo:type_name -> extension.AppOffloadOnuConfig.PerUniConfig
+	76, // 66: extension.SetValueRequest.alarm_config:type_name -> config.AlarmConfig
+	61, // 67: extension.SetValueRequest.app_offload_config:type_name -> extension.AppOffloadConfig
+	62, // 68: extension.SetValueRequest.app_offload_onu_config:type_name -> extension.AppOffloadOnuConfig
+	10, // 69: extension.SetValueResponse.status:type_name -> extension.SetValueResponse.Status
+	11, // 70: extension.SetValueResponse.errReason:type_name -> extension.SetValueResponse.ErrorReason
+	59, // 71: extension.SingleGetValueRequest.request:type_name -> extension.GetValueRequest
+	60, // 72: extension.SingleGetValueResponse.response:type_name -> extension.GetValueResponse
+	63, // 73: extension.SingleSetValueRequest.request:type_name -> extension.SetValueRequest
+	64, // 74: extension.SingleSetValueResponse.response:type_name -> extension.SetValueResponse
+	72, // 75: extension.GetOffloadedAppsStatisticsResponse.DHCPv4RAStats.additional_stats:type_name -> extension.GetOffloadedAppsStatisticsResponse.DHCPv4RAStats.AdditionalStatsEntry
+	73, // 76: extension.GetOffloadedAppsStatisticsResponse.DHCPv6RAStats.additional_stats:type_name -> extension.GetOffloadedAppsStatisticsResponse.DHCPv6RAStats.AdditionalStatsEntry
+	74, // 77: extension.GetOffloadedAppsStatisticsResponse.PPPoeIAStats.additional_stats:type_name -> extension.GetOffloadedAppsStatisticsResponse.PPPoeIAStats.AdditionalStatsEntry
+	65, // 78: extension.Extension.GetExtValue:input_type -> extension.SingleGetValueRequest
+	67, // 79: extension.Extension.SetExtValue:input_type -> extension.SingleSetValueRequest
+	66, // 80: extension.Extension.GetExtValue:output_type -> extension.SingleGetValueResponse
+	68, // 81: extension.Extension.SetExtValue:output_type -> extension.SingleSetValueResponse
+	80, // [80:82] is the sub-list for method output_type
+	78, // [78:80] is the sub-list for method input_type
+	78, // [78:78] is the sub-list for extension type_name
+	78, // [78:78] is the sub-list for extension extendee
+	0,  // [0:78] is the sub-list for field type_name
+}
+
+func init() { file_voltha_protos_extensions_proto_init() }
+func file_voltha_protos_extensions_proto_init() {
+	if File_voltha_protos_extensions_proto != nil {
+		return
+	}
+	file_voltha_protos_extensions_proto_msgTypes[0].OneofWrappers = []any{
+		(*ValueSet_AlarmConfig)(nil),
+	}
+	file_voltha_protos_extensions_proto_msgTypes[22].OneofWrappers = []any{
+		(*GetOmciEthernetFrameExtendedPmRequest_UniIndex)(nil),
+	}
+	file_voltha_protos_extensions_proto_msgTypes[25].OneofWrappers = []any{
+		(*GetPonStatsRequest_PortLabel)(nil),
+		(*GetPonStatsRequest_PortId)(nil),
+	}
+	file_voltha_protos_extensions_proto_msgTypes[27].OneofWrappers = []any{
+		(*GetNNIStatsRequest_PortLabel)(nil),
+		(*GetNNIStatsRequest_PortId)(nil),
+	}
+	file_voltha_protos_extensions_proto_msgTypes[34].OneofWrappers = []any{
+		(*GetOnuCountersResponse_IntfId)(nil),
+		(*GetOnuCountersResponse_OnuId)(nil),
+		(*GetOnuCountersResponse_PositiveDrift)(nil),
+		(*GetOnuCountersResponse_NegativeDrift)(nil),
+		(*GetOnuCountersResponse_DelimiterMissDetection)(nil),
+		(*GetOnuCountersResponse_BipErrors)(nil),
+		(*GetOnuCountersResponse_BipUnits)(nil),
+		(*GetOnuCountersResponse_FecCorrectedSymbols)(nil),
+		(*GetOnuCountersResponse_FecCodewordsCorrected)(nil),
+		(*GetOnuCountersResponse_FecCodewordsUncorrectable)(nil),
+		(*GetOnuCountersResponse_FecCodewords)(nil),
+		(*GetOnuCountersResponse_FecCorrectedUnits)(nil),
+		(*GetOnuCountersResponse_XgemKeyErrors)(nil),
+		(*GetOnuCountersResponse_XgemLoss)(nil),
+		(*GetOnuCountersResponse_RxPloamsError)(nil),
+		(*GetOnuCountersResponse_RxPloamsNonIdle)(nil),
+		(*GetOnuCountersResponse_RxOmci)(nil),
+		(*GetOnuCountersResponse_TxOmci)(nil),
+		(*GetOnuCountersResponse_RxOmciPacketsCrcError)(nil),
+		(*GetOnuCountersResponse_RxBytes)(nil),
+		(*GetOnuCountersResponse_RxPackets)(nil),
+		(*GetOnuCountersResponse_TxBytes)(nil),
+		(*GetOnuCountersResponse_TxPackets)(nil),
+		(*GetOnuCountersResponse_BerReported)(nil),
+		(*GetOnuCountersResponse_LcdgErrors)(nil),
+		(*GetOnuCountersResponse_RdiErrors)(nil),
+		(*GetOnuCountersResponse_Timestamp)(nil),
+		(*GetOnuCountersResponse_HecErrors)(nil),
+	}
+	file_voltha_protos_extensions_proto_msgTypes[46].OneofWrappers = []any{
+		(*GetOffloadedAppsStatisticsResponse_Dhcpv4RaStats)(nil),
+		(*GetOffloadedAppsStatisticsResponse_Dhcpv6RaStats)(nil),
+		(*GetOffloadedAppsStatisticsResponse_PppoeIaStats)(nil),
+	}
+	file_voltha_protos_extensions_proto_msgTypes[47].OneofWrappers = []any{
+		(*GetValueRequest_Distance)(nil),
+		(*GetValueRequest_UniInfo)(nil),
+		(*GetValueRequest_OltPortInfo)(nil),
+		(*GetValueRequest_OnuOpticalInfo)(nil),
+		(*GetValueRequest_EthBridgePort)(nil),
+		(*GetValueRequest_FecHistory)(nil),
+		(*GetValueRequest_OnuPonInfo)(nil),
+		(*GetValueRequest_OnuInfo)(nil),
+		(*GetValueRequest_RxPower)(nil),
+		(*GetValueRequest_OnuOmciStats)(nil),
+		(*GetValueRequest_OltRxPower)(nil),
+		(*GetValueRequest_OnuActiveAlarms)(nil),
+		(*GetValueRequest_OffloadedAppsStats)(nil),
+		(*GetValueRequest_OnuAllocGemStats)(nil),
+		(*GetValueRequest_OnuStatsFromOlt)(nil),
+		(*GetValueRequest_OltPonStats)(nil),
+		(*GetValueRequest_OltNniStats)(nil),
+	}
+	file_voltha_protos_extensions_proto_msgTypes[48].OneofWrappers = []any{
+		(*GetValueResponse_Distance)(nil),
+		(*GetValueResponse_UniInfo)(nil),
+		(*GetValueResponse_PortCoutners)(nil),
+		(*GetValueResponse_OnuOpticalInfo)(nil),
+		(*GetValueResponse_EthBridgePortInfo)(nil),
+		(*GetValueResponse_FecHistory)(nil),
+		(*GetValueResponse_OnuPonCounters)(nil),
+		(*GetValueResponse_OnuCounters)(nil),
+		(*GetValueResponse_RxPower)(nil),
+		(*GetValueResponse_OnuOmciStats)(nil),
+		(*GetValueResponse_OltRxPower)(nil),
+		(*GetValueResponse_OnuActiveAlarms)(nil),
+		(*GetValueResponse_OffloadedAppsStats)(nil),
+		(*GetValueResponse_OnuAllocGemStatsResponse)(nil),
+		(*GetValueResponse_OnuStatsFromOltResponse)(nil),
+		(*GetValueResponse_OltPonStatsResponse)(nil),
+		(*GetValueResponse_OltNniStatsResponse)(nil),
+	}
+	file_voltha_protos_extensions_proto_msgTypes[51].OneofWrappers = []any{
+		(*SetValueRequest_AlarmConfig)(nil),
+		(*SetValueRequest_AppOffloadConfig)(nil),
+		(*SetValueRequest_AppOffloadOnuConfig)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: unsafe.Slice(unsafe.StringData(file_voltha_protos_extensions_proto_rawDesc), len(file_voltha_protos_extensions_proto_rawDesc)),
+			NumEnums:      12,
+			NumMessages:   64,
+			NumExtensions: 0,
+			NumServices:   1,
 		},
-		{
-			MethodName: "SetExtValue",
-			Handler:    _Extension_SetExtValue_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "voltha_protos/extensions.proto",
+		GoTypes:           file_voltha_protos_extensions_proto_goTypes,
+		DependencyIndexes: file_voltha_protos_extensions_proto_depIdxs,
+		EnumInfos:         file_voltha_protos_extensions_proto_enumTypes,
+		MessageInfos:      file_voltha_protos_extensions_proto_msgTypes,
+	}.Build()
+	File_voltha_protos_extensions_proto = out.File
+	file_voltha_protos_extensions_proto_goTypes = nil
+	file_voltha_protos_extensions_proto_depIdxs = nil
 }
