[VOL-4631] openonuAdapterGo - hardening: check ONU OMCI get responses for consistency
Change-Id: I6402b16408fd29db8d95f1607ff1af21da5907de
diff --git a/internal/pkg/uniprt/uniportstatus.go b/internal/pkg/uniprt/uniportstatus.go
index 4c294ce..749293a 100755
--- a/internal/pkg/uniprt/uniportstatus.go
+++ b/internal/pkg/uniprt/uniportstatus.go
@@ -32,6 +32,7 @@
//UniPortStatus implements methods to get uni port status info
type UniPortStatus struct {
+ deviceID string
pDeviceHandler cmn.IdeviceHandler
pOmiCC *cmn.OmciCC
omciRespChn chan cmn.Message
@@ -41,6 +42,7 @@
//NewUniPortStatus creates a new instance of UniPortStatus
func NewUniPortStatus(apDeviceHandler cmn.IdeviceHandler, apOmicc *cmn.OmciCC) *UniPortStatus {
return &UniPortStatus{
+ deviceID: apDeviceHandler.GetDeviceID(),
pDeviceHandler: apDeviceHandler,
pOmiCC: apOmicc,
omciRespChn: make(chan cmn.Message),
@@ -71,7 +73,7 @@
}
}
}
- logger.Errorw(ctx, "GetUniPortStatus uniIdx is not valid", log.Fields{"uniIdx": uniIdx})
+ logger.Errorw(ctx, "GetUniPortStatus uniIdx is not valid", log.Fields{"uniIdx": uniIdx, "device-id": portStatus.deviceID})
return PostUniStatusErrResponse(extension.GetValueResponse_INVALID_PORT_TYPE)
}
@@ -80,10 +82,10 @@
select {
// maybe be also some outside cancel (but no context modeled for the moment ...)
case <-ctx.Done():
- logger.Errorf(ctx, "waitforGetUniPortStatus Context done")
+ logger.Errorw(ctx, "waitforGetUniPortStatus Context done", log.Fields{"device-id": portStatus.deviceID})
return PostUniStatusErrResponse(extension.GetValueResponse_INTERNAL_ERROR)
case <-time.After(uniStatusTimeout * time.Second):
- logger.Errorf(ctx, "waitforGetUniPortStatus timeout")
+ logger.Errorw(ctx, "waitforGetUniPortStatus timeout", log.Fields{"device-id": portStatus.deviceID})
return PostUniStatusErrResponse(extension.GetValueResponse_TIMEOUT)
case omciMsg := <-portStatus.omciRespChn:
@@ -98,23 +100,24 @@
func (portStatus *UniPortStatus) processGetUnitStatusResp(ctx context.Context, msg cmn.OmciMessage) *extension.SingleGetValueResponse {
logger.Debugw(ctx, "processGetUniStatusResp:", log.Fields{"msg.Omci.MessageType": msg.OmciMsg.MessageType,
- "msg.OmciMsg.TransactionID": msg.OmciMsg.TransactionID, "DeviceIdentfier": msg.OmciMsg.DeviceIdentifier})
+ "msg.OmciMsg.TransactionID": msg.OmciMsg.TransactionID, "DeviceIdentfier": msg.OmciMsg.DeviceIdentifier,
+ "device-id": portStatus.deviceID})
if msg.OmciMsg.MessageType != omci.GetResponseType {
logger.Debugw(ctx, "processGetUniStatusResp error", log.Fields{"incorrect RespType": msg.OmciMsg.MessageType,
- "expected": omci.GetResponseType})
+ "expected": omci.GetResponseType, "device-id": portStatus.deviceID})
return PostUniStatusErrResponse(extension.GetValueResponse_INTERNAL_ERROR)
}
msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeGetResponse)
if msgLayer == nil {
- logger.Errorf(ctx, "processGetUniStatusResp omci Msg layer not found - ")
+ logger.Errorw(ctx, "processGetUniStatusResp omci Msg layer not found", log.Fields{"device-id": portStatus.deviceID})
return PostUniStatusErrResponse(extension.GetValueResponse_INTERNAL_ERROR)
}
msgObj, msgOk := msgLayer.(*omci.GetResponse)
if !msgOk {
- logger.Errorf(ctx, "processGetUniStatusResp omci msgObj layer could not be found ")
+ logger.Errorw(ctx, "processGetUniStatusResp omci msgObj layer could not be found", log.Fields{"device-id": portStatus.deviceID})
return PostUniStatusErrResponse(extension.GetValueResponse_INTERNAL_ERROR)
}
@@ -132,33 +135,53 @@
},
},
}
- if meAttributes[me.PhysicalPathTerminationPointEthernetUni_OperationalState].(uint8) == 0 {
- singleValResp.Response.GetUniInfo().OperState = extension.GetOnuUniInfoResponse_ENABLED
- } else if meAttributes[me.PhysicalPathTerminationPointEthernetUni_OperationalState].(uint8) == 1 {
- singleValResp.Response.GetUniInfo().OperState = extension.GetOnuUniInfoResponse_DISABLED
+ if pptpEthUniOperState, ok := meAttributes[me.PhysicalPathTerminationPointEthernetUni_OperationalState]; ok {
+ if pptpEthUniOperState.(uint8) == 0 {
+ singleValResp.Response.GetUniInfo().OperState = extension.GetOnuUniInfoResponse_ENABLED
+ } else if pptpEthUniOperState.(uint8) == 1 {
+ singleValResp.Response.GetUniInfo().OperState = extension.GetOnuUniInfoResponse_DISABLED
+ } else {
+ singleValResp.Response.GetUniInfo().OperState = extension.GetOnuUniInfoResponse_OPERSTATE_UNDEFINED
+ }
} else {
+ logger.Infow(ctx, "processGetUniStatusResp - optional attribute pptpEthUniOperState not present!",
+ log.Fields{"device-id": portStatus.deviceID})
singleValResp.Response.GetUniInfo().OperState = extension.GetOnuUniInfoResponse_OPERSTATE_UNDEFINED
}
- if meAttributes[me.PhysicalPathTerminationPointEthernetUni_AdministrativeState].(uint8) == 0 {
- singleValResp.Response.GetUniInfo().AdmState = extension.GetOnuUniInfoResponse_UNLOCKED
- } else if meAttributes[me.PhysicalPathTerminationPointEthernetUni_AdministrativeState].(uint8) == 1 {
- singleValResp.Response.GetUniInfo().AdmState = extension.GetOnuUniInfoResponse_LOCKED
+ if pptpEthUniAdminState, ok := meAttributes[me.PhysicalPathTerminationPointEthernetUni_OperationalState]; ok {
+ if pptpEthUniAdminState.(uint8) == 0 {
+ singleValResp.Response.GetUniInfo().AdmState = extension.GetOnuUniInfoResponse_UNLOCKED
+ } else if pptpEthUniAdminState.(uint8) == 1 {
+ singleValResp.Response.GetUniInfo().AdmState = extension.GetOnuUniInfoResponse_LOCKED
+ } else {
+ singleValResp.Response.GetUniInfo().AdmState = extension.GetOnuUniInfoResponse_ADMSTATE_UNDEFINED
+ }
} else {
- singleValResp.Response.GetUniInfo().AdmState = extension.GetOnuUniInfoResponse_ADMSTATE_UNDEFINED
+ logger.Errorw(ctx, "processGetUniStatusResp - mandatory attribute pptpEthUniAdminState not present!",
+ log.Fields{"device-id": portStatus.deviceID})
+ return PostUniStatusErrResponse(extension.GetValueResponse_INTERNAL_ERROR)
}
- configIndMap := map[uint8]extension.GetOnuUniInfoResponse_ConfigurationInd{
- 0: 0,
- 1: extension.GetOnuUniInfoResponse_TEN_BASE_T_FDX,
- 2: extension.GetOnuUniInfoResponse_HUNDRED_BASE_T_FDX,
- 3: extension.GetOnuUniInfoResponse_GIGABIT_ETHERNET_FDX,
- 4: extension.GetOnuUniInfoResponse_TEN_G_ETHERNET_FDX,
- 17: extension.GetOnuUniInfoResponse_TEN_BASE_T_HDX,
- 18: extension.GetOnuUniInfoResponse_HUNDRED_BASE_T_HDX,
- 19: extension.GetOnuUniInfoResponse_GIGABIT_ETHERNET_HDX,
+
+ if pptpEthUniConfigInd, ok := meAttributes[me.PhysicalPathTerminationPointEthernetUni_ConfigurationInd]; ok {
+ configIndMap := map[uint8]extension.GetOnuUniInfoResponse_ConfigurationInd{
+ 0: 0,
+ 1: extension.GetOnuUniInfoResponse_TEN_BASE_T_FDX,
+ 2: extension.GetOnuUniInfoResponse_HUNDRED_BASE_T_FDX,
+ 3: extension.GetOnuUniInfoResponse_GIGABIT_ETHERNET_FDX,
+ 4: extension.GetOnuUniInfoResponse_TEN_G_ETHERNET_FDX,
+ 17: extension.GetOnuUniInfoResponse_TEN_BASE_T_HDX,
+ 18: extension.GetOnuUniInfoResponse_HUNDRED_BASE_T_HDX,
+ 19: extension.GetOnuUniInfoResponse_GIGABIT_ETHERNET_HDX,
+ }
+ configInd := pptpEthUniConfigInd.(uint8)
+ singleValResp.Response.GetUniInfo().ConfigInd = configIndMap[configInd]
+ } else {
+ logger.Errorw(ctx, "processGetUniStatusResp - mandatory attribute pptpEthUniConfigInd not present!",
+ log.Fields{"device-id": portStatus.deviceID})
+ return PostUniStatusErrResponse(extension.GetValueResponse_INTERNAL_ERROR)
}
- configInd := meAttributes[me.PhysicalPathTerminationPointEthernetUni_ConfigurationInd].(uint8)
- singleValResp.Response.GetUniInfo().ConfigInd = configIndMap[configInd]
+
return &singleValResp
}