[VOL-3914] Not forwarding OMCI messages if the ONU is disabled

Change-Id: Ic826368642e510e9dc39766569ed5682e5910b5d
diff --git a/internal/bbsim/devices/onu.go b/internal/bbsim/devices/onu.go
index 6c1b5b9..5e74f46 100644
--- a/internal/bbsim/devices/onu.go
+++ b/internal/bbsim/devices/onu.go
@@ -660,7 +660,7 @@
 
 func (o *Onu) publishOmciEvent(msg bbsim.OmciMessage) {
 	if olt.PublishEvents {
-		_, omciMsg, err := omcilib.ParseOpenOltOmciPacket(msg.OmciMsg.Pkt)
+		_, omciMsg, err := omcilib.ParseOpenOltOmciPacket(msg.OmciPkt.Data())
 		if err != nil {
 			log.Errorf("error in getting msgType %v", err)
 			return
@@ -679,7 +679,7 @@
 
 // Create a TestResponse packet and send it
 func (o *Onu) sendTestResult(msg bbsim.OmciMessage, stream openolt.Openolt_EnableIndicationServer) error {
-	resp, err := omcilib.BuildTestResult(msg.OmciMsg.Pkt)
+	resp, err := omcilib.BuildTestResult(msg.OmciPkt.Data())
 	if err != nil {
 		return err
 	}
@@ -706,44 +706,35 @@
 // and generate the appropriate response to it
 func (o *Onu) handleOmciRequest(msg bbsim.OmciMessage, stream openolt.Openolt_EnableIndicationServer) {
 
-	omciPkt, omciMsg, err := omcilib.ParseOpenOltOmciPacket(msg.OmciMsg.Pkt)
-	if err != nil {
-		log.WithFields(log.Fields{
-			"IntfId":       o.PonPortID,
-			"SerialNumber": o.Sn(),
-			"omciPacket":   omcilib.HexDecode(msg.OmciMsg.Pkt),
-		}).Error("cannot-parse-OMCI-packet")
-	}
-
 	onuLogger.WithFields(log.Fields{
-		"omciMsgType":  omciMsg.MessageType,
-		"transCorrId":  strconv.FormatInt(int64(omciMsg.TransactionID), 16),
-		"DeviceIdent":  omciMsg.DeviceIdentifier,
+		"omciMsgType":  msg.OmciMsg.MessageType,
+		"transCorrId":  strconv.FormatInt(int64(msg.OmciMsg.TransactionID), 16),
+		"DeviceIdent":  msg.OmciMsg.DeviceIdentifier,
 		"IntfId":       o.PonPortID,
 		"SerialNumber": o.Sn(),
 	}).Trace("omci-message-decoded")
 
 	var responsePkt []byte
 	var errResp error
-	switch omciMsg.MessageType {
+	switch msg.OmciMsg.MessageType {
 	case omci.MibResetRequestType:
 		onuLogger.WithFields(log.Fields{
 			"IntfId":       o.PonPortID,
 			"OnuId":        o.ID,
 			"SerialNumber": o.Sn(),
 		}).Debug("received-mib-reset-request-resetting-mds")
-		if responsePkt, errResp = omcilib.CreateMibResetResponse(omciMsg.TransactionID); errResp == nil {
+		if responsePkt, errResp = omcilib.CreateMibResetResponse(msg.OmciMsg.TransactionID); errResp == nil {
 			o.MibDataSync = 0
 		}
 	case omci.MibUploadRequestType:
-		responsePkt, _ = omcilib.CreateMibUploadResponse(omciMsg.TransactionID)
+		responsePkt, _ = omcilib.CreateMibUploadResponse(msg.OmciMsg.TransactionID)
 	case omci.MibUploadNextRequestType:
-		responsePkt, _ = omcilib.CreateMibUploadNextResponse(omciPkt, omciMsg, o.MibDataSync)
+		responsePkt, _ = omcilib.CreateMibUploadNextResponse(msg.OmciPkt, msg.OmciMsg, o.MibDataSync)
 	case omci.GetRequestType:
-		responsePkt, _ = omcilib.CreateGetResponse(omciPkt, omciMsg, o.SerialNumber, o.MibDataSync, o.ActiveImageEntityId, o.CommittedImageEntityId)
+		responsePkt, _ = omcilib.CreateGetResponse(msg.OmciPkt, msg.OmciMsg, o.SerialNumber, o.MibDataSync, o.ActiveImageEntityId, o.CommittedImageEntityId)
 	case omci.SetRequestType:
 		success := true
-		msgObj, _ := omcilib.ParseSetRequest(omciPkt)
+		msgObj, _ := omcilib.ParseSetRequest(msg.OmciPkt)
 		switch msgObj.EntityClass {
 		case me.PhysicalPathTerminationPointEthernetUniClassID:
 			// if we're Setting a PPTP state
@@ -809,17 +800,17 @@
 		}
 
 		if success {
-			if responsePkt, errResp = omcilib.CreateSetResponse(omciPkt, omciMsg, me.Success); errResp == nil {
+			if responsePkt, errResp = omcilib.CreateSetResponse(msg.OmciPkt, msg.OmciMsg, me.Success); errResp == nil {
 				o.MibDataSync++
 			}
 		} else {
-			responsePkt, _ = omcilib.CreateSetResponse(omciPkt, omciMsg, me.AttributeFailure)
+			responsePkt, _ = omcilib.CreateSetResponse(msg.OmciPkt, msg.OmciMsg, me.AttributeFailure)
 		}
 	case omci.CreateRequestType:
 		// check for GemPortNetworkCtp and make sure there are no duplicates on the same PON
 		var used bool
 		var sn *openolt.SerialNumber
-		msgObj, err := omcilib.ParseCreateRequest(omciPkt)
+		msgObj, err := omcilib.ParseCreateRequest(msg.OmciPkt)
 		if err == nil {
 			if msgObj.EntityClass == me.GemPortNetworkCtpClassID {
 				if used, sn = o.PonPort.isGemPortAllocated(msgObj.EntityInstance); used {
@@ -846,14 +837,14 @@
 		// for now the CreateRequeste for the gemPort is the only one that can fail, if we start supporting multiple
 		// validation this check will need to be rewritten
 		if !used {
-			if responsePkt, errResp = omcilib.CreateCreateResponse(omciPkt, omciMsg, me.Success); errResp == nil {
+			if responsePkt, errResp = omcilib.CreateCreateResponse(msg.OmciPkt, msg.OmciMsg, me.Success); errResp == nil {
 				o.MibDataSync++
 			}
 		} else {
-			responsePkt, _ = omcilib.CreateCreateResponse(omciPkt, omciMsg, me.ProcessingError)
+			responsePkt, _ = omcilib.CreateCreateResponse(msg.OmciPkt, msg.OmciMsg, me.ProcessingError)
 		}
 	case omci.DeleteRequestType:
-		msgObj, err := omcilib.ParseDeleteRequest(omciPkt)
+		msgObj, err := omcilib.ParseDeleteRequest(msg.OmciPkt)
 		if err == nil {
 			if msgObj.EntityClass == me.GemPortNetworkCtpClassID {
 				onuLogger.WithFields(log.Fields{
@@ -866,12 +857,12 @@
 			}
 		}
 
-		if responsePkt, errResp = omcilib.CreateDeleteResponse(omciPkt, omciMsg); errResp == nil {
+		if responsePkt, errResp = omcilib.CreateDeleteResponse(msg.OmciPkt, msg.OmciMsg); errResp == nil {
 			o.MibDataSync++
 		}
 	case omci.RebootRequestType:
 
-		responsePkt, _ = omcilib.CreateRebootResponse(omciPkt, omciMsg)
+		responsePkt, _ = omcilib.CreateRebootResponse(msg.OmciPkt, msg.OmciMsg)
 
 		// powercycle the ONU
 		// we run this in a separate goroutine so that
@@ -893,14 +884,14 @@
 		//     second packet, TestResult, reports the result of running the self-test
 		// TestResult can come some time after a TestResponse
 		//     TODO: Implement some delay between the TestResponse and the TestResult
-		isTest, err := omcilib.IsTestRequest(msg.OmciMsg.Pkt)
+		isTest, err := omcilib.IsTestRequest(msg.OmciPkt.Data())
 		if (err == nil) && (isTest) {
 			if sendErr := o.sendTestResult(msg, stream); sendErr != nil {
 				onuLogger.WithFields(log.Fields{
 					"IntfId":       o.PonPortID,
 					"OnuId":        o.ID,
 					"SerialNumber": o.Sn(),
-					"omciPacket":   msg.OmciMsg.Pkt,
+					"omciPacket":   msg.OmciPkt.Data(),
 					"msg":          msg,
 					"err":          sendErr,
 				}).Error("send-TestResult-indication-failed")
@@ -908,14 +899,14 @@
 		}
 	case omci.SynchronizeTimeRequestType:
 		// MDS counter increment is not required for this message type
-		responsePkt, _ = omcilib.CreateSyncTimeResponse(omciPkt, omciMsg)
+		responsePkt, _ = omcilib.CreateSyncTimeResponse(msg.OmciPkt, msg.OmciMsg)
 	case omci.StartSoftwareDownloadRequestType:
 
 		o.ImageSoftwareReceivedSections = 0
 
-		o.ImageSoftwareExpectedSections = omcilib.ComputeDownloadSectionsCount(omciPkt)
+		o.ImageSoftwareExpectedSections = omcilib.ComputeDownloadSectionsCount(msg.OmciPkt)
 
-		if responsePkt, errResp = omcilib.CreateStartSoftwareDownloadResponse(omciPkt, omciMsg); errResp == nil {
+		if responsePkt, errResp = omcilib.CreateStartSoftwareDownloadResponse(msg.OmciPkt, msg.OmciMsg); errResp == nil {
 			o.MibDataSync++
 			if err := o.InternalState.Event(OnuTxStartImageDownload); err != nil {
 				onuLogger.WithFields(log.Fields{
@@ -927,18 +918,18 @@
 			}
 		} else {
 			onuLogger.WithFields(log.Fields{
-				"OmciMsgType":  omciMsg.MessageType,
-				"TransCorrId":  omciMsg.TransactionID,
-				"Err":          err.Error(),
+				"OmciMsgType":  msg.OmciMsg.MessageType,
+				"TransCorrId":  msg.OmciMsg.TransactionID,
+				"Err":          errResp.Error(),
 				"IntfId":       o.PonPortID,
 				"SerialNumber": o.Sn(),
 			}).Error("error-while-processing-start-software-download-request")
 		}
 	case omci.DownloadSectionRequestType:
-		if msgObj, err := omcilib.ParseDownloadSectionRequest(omciPkt); err == nil {
+		if msgObj, err := omcilib.ParseDownloadSectionRequest(msg.OmciPkt); err == nil {
 			onuLogger.WithFields(log.Fields{
-				"OmciMsgType":    omciMsg.MessageType,
-				"TransCorrId":    omciMsg.TransactionID,
+				"OmciMsgType":    msg.OmciMsg.MessageType,
+				"TransCorrId":    msg.OmciMsg.TransactionID,
 				"EntityInstance": msgObj.EntityInstance,
 				"SectionNumber":  msgObj.SectionNumber,
 				"SectionData":    msgObj.SectionData,
@@ -957,12 +948,12 @@
 		}
 	case omci.DownloadSectionRequestWithResponseType:
 		// NOTE we only need to respond if an ACK is requested
-		responsePkt, err = omcilib.CreateDownloadSectionResponse(omciPkt, omciMsg)
-		if err != nil {
+		responsePkt, errResp = omcilib.CreateDownloadSectionResponse(msg.OmciPkt, msg.OmciMsg)
+		if errResp != nil {
 			onuLogger.WithFields(log.Fields{
-				"OmciMsgType":  omciMsg.MessageType,
-				"TransCorrId":  omciMsg.TransactionID,
-				"Err":          err.Error(),
+				"OmciMsgType":  msg.OmciMsg.MessageType,
+				"TransCorrId":  msg.OmciMsg.TransactionID,
+				"Err":          errResp.Error(),
 				"IntfId":       o.PonPortID,
 				"SerialNumber": o.Sn(),
 			}).Error("error-while-processing-create-download-section-response")
@@ -988,7 +979,7 @@
 		}
 
 		if success {
-			if responsePkt, errResp = omcilib.CreateEndSoftwareDownloadResponse(omciPkt, omciMsg, me.Success); errResp == nil {
+			if responsePkt, errResp = omcilib.CreateEndSoftwareDownloadResponse(msg.OmciPkt, msg.OmciMsg, me.Success); errResp == nil {
 				o.MibDataSync++
 				if err := o.InternalState.Event(OnuTxCompleteImageDownload); err != nil {
 					onuLogger.WithFields(log.Fields{
@@ -1000,15 +991,15 @@
 				}
 			} else {
 				onuLogger.WithFields(log.Fields{
-					"OmciMsgType":  omciMsg.MessageType,
-					"TransCorrId":  omciMsg.TransactionID,
-					"Err":          err.Error(),
+					"OmciMsgType":  msg.OmciMsg.MessageType,
+					"TransCorrId":  msg.OmciMsg.TransactionID,
+					"Err":          errResp.Error(),
 					"IntfId":       o.PonPortID,
 					"SerialNumber": o.Sn(),
 				}).Error("error-while-processing-end-software-download-request")
 			}
 		} else {
-			if responsePkt, errResp = omcilib.CreateEndSoftwareDownloadResponse(omciPkt, omciMsg, me.ProcessingError); errResp == nil {
+			if responsePkt, errResp = omcilib.CreateEndSoftwareDownloadResponse(msg.OmciPkt, msg.OmciMsg, me.ProcessingError); errResp == nil {
 				if err := o.InternalState.Event(OnuTxFailImageDownload); err != nil {
 					onuLogger.WithFields(log.Fields{
 						"OnuId":  o.ID,
@@ -1021,7 +1012,7 @@
 		}
 
 	case omci.ActivateSoftwareRequestType:
-		if responsePkt, errResp = omcilib.CreateActivateSoftwareResponse(omciPkt, omciMsg); errResp == nil {
+		if responsePkt, errResp = omcilib.CreateActivateSoftwareResponse(msg.OmciPkt, msg.OmciMsg); errResp == nil {
 			o.MibDataSync++
 			if err := o.InternalState.Event(OnuTxActivateImage); err != nil {
 				onuLogger.WithFields(log.Fields{
@@ -1031,7 +1022,7 @@
 					"Err":    err.Error(),
 				}).Errorf("cannot-change-onu-internal-state-to-%s", OnuStateImageActivated)
 			}
-			if msgObj, err := omcilib.ParseActivateSoftwareRequest(omciPkt); err == nil {
+			if msgObj, err := omcilib.ParseActivateSoftwareRequest(msg.OmciPkt); err == nil {
 				o.ActiveImageEntityId = msgObj.EntityInstance
 			} else {
 				onuLogger.Errorf("something-went-wrong-while-activating: %s", err)
@@ -1060,9 +1051,9 @@
 			}()
 		}
 	case omci.CommitSoftwareRequestType:
-		if responsePkt, errResp = omcilib.CreateCommitSoftwareResponse(omciPkt, omciMsg); errResp == nil {
+		if responsePkt, errResp = omcilib.CreateCommitSoftwareResponse(msg.OmciPkt, msg.OmciMsg); errResp == nil {
 			o.MibDataSync++
-			if msgObj, err := omcilib.ParseCommitSoftwareRequest(omciPkt); err == nil {
+			if msgObj, err := omcilib.ParseCommitSoftwareRequest(msg.OmciPkt); err == nil {
 				// TODO validate that the image to commit is:
 				// - active
 				// - not already committed
@@ -1095,30 +1086,30 @@
 			o.onuAlarmsInfo[key] = alarmInfo
 		}
 		o.onuAlarmsInfoLock.Unlock()
-		responsePkt, _ = omcilib.CreateGetAllAlarmsResponse(omciMsg.TransactionID, o.onuAlarmsInfo)
+		responsePkt, _ = omcilib.CreateGetAllAlarmsResponse(msg.OmciMsg.TransactionID, o.onuAlarmsInfo)
 	case omci.GetAllAlarmsNextRequestType:
-		if responsePkt, errResp = omcilib.CreateGetAllAlarmsNextResponse(omciPkt, omciMsg, o.onuAlarmsInfo); errResp != nil {
+		if responsePkt, errResp = omcilib.CreateGetAllAlarmsNextResponse(msg.OmciPkt, msg.OmciMsg, o.onuAlarmsInfo); errResp != nil {
 			responsePkt = nil //Do not send any response for error case
 		}
 	default:
 		onuLogger.WithFields(log.Fields{
-			"omciBytes":    hex.EncodeToString(omciPkt.Data()),
-			"omciPkt":      omciPkt,
-			"omciMsgType":  omciMsg.MessageType,
-			"transCorrId":  omciMsg.TransactionID,
+			"omciBytes":    hex.EncodeToString(msg.OmciPkt.Data()),
+			"omciPkt":      msg.OmciPkt,
+			"omciMsgType":  msg.OmciMsg.MessageType,
+			"transCorrId":  msg.OmciMsg.TransactionID,
 			"IntfId":       o.PonPortID,
 			"SerialNumber": o.Sn(),
 		}).Warnf("OMCI-message-not-supported")
 	}
 
 	if responsePkt != nil {
-		if err := o.sendOmciIndication(responsePkt, omciMsg.TransactionID, stream); err != nil {
+		if err := o.sendOmciIndication(responsePkt, msg.OmciMsg.TransactionID, stream); err != nil {
 			onuLogger.WithFields(log.Fields{
-				"IntfId":       o.PonPortID,
-				"SerialNumber": o.Sn(),
-				"omciPacket":   responsePkt,
-				"omciMsgType":  omciMsg.MessageType,
-				"transCorrId":  omciMsg.TransactionID,
+				"IntfId":          o.PonPortID,
+				"SerialNumber":    o.Sn(),
+				"omciPacket":      responsePkt,
+				"msg.OmciMsgType": msg.OmciMsg.MessageType,
+				"transCorrId":     msg.OmciMsg.TransactionID,
 			}).Errorf("failed-to-send-omci-message: %v", err)
 		}
 	}