[VOL-4688] openonuAdapterGo: OMCI extended message set - derive the capability from the OMCC version
Do not merge before https://gerrit.opencord.org/c/bbsim/+/32128

Change-Id: I800f1bae3b696f320c63c80336a22f187b9c947c
diff --git a/internal/pkg/common/omci_cc.go b/internal/pkg/common/omci_cc.go
index e1115d3..c7bda8b 100755
--- a/internal/pkg/common/omci_cc.go
+++ b/internal/pkg/common/omci_cc.go
@@ -53,6 +53,7 @@
 // UnusedTcontAllocID - TODO: add comment
 const UnusedTcontAllocID = uint16(0xFFFF) //common unused AllocId for G.984 and G.987 systems
 
+const cOmciDeviceIdentifierPos = 3
 const cOmciBaseMessageTrailerLen = 40
 
 // tOmciReceiveError - enum type for detected problems/errors in the received OMCI message (format)
@@ -282,41 +283,65 @@
 
 // ReceiveMessage - Rx handler for onu messages
 //    e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
+// nolint: gocyclo
 func (oo *OmciCC) ReceiveMessage(ctx context.Context, rxMsg []byte) error {
 	//logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
-	if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
-		// NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
-		//  (an extendedFormat message could be destroyed this way!)
-		trailerLenData := rxMsg[42:44]
-		trailerLen := binary.BigEndian.Uint16(trailerLenData)
-		//logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
-		if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
-			binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
-			if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
-				//do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
-				logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
-					log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
-				oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
-			}
+
+	if len(rxMsg) < 10 {
+		logger.Errorw(ctx, "rxOmciMessage has wrong length in general - abort",
+			log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
+		if len(rxMsg) > 0 {
+			oo.printRxMessage(ctx, rxMsg)
 		}
-	} else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
-		// NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
-		//  (an extendedFormat message could be destroyed this way!)
-		// extend/overwrite with trailer
-		trailer := make([]byte, 8)
-		binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
-		rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
-		if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
-			//do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
-			logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
-				log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
-			oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
+		return fmt.Errorf("rxOmciMessage has wrong length in general - abort %s", oo.deviceID)
+	}
+	if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
+		if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
+			// NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
+			//  (an extendedFormat message could be destroyed this way!)
+			trailerLenData := rxMsg[42:44]
+			trailerLen := binary.BigEndian.Uint16(trailerLenData)
+			//logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
+			if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
+				binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
+				if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
+					//do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
+					logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
+						log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
+					oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
+				}
+			}
+		} else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
+			// NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
+			//  (an extendedFormat message could be destroyed this way!)
+			// extend/overwrite with trailer
+			trailer := make([]byte, 8)
+			binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
+			rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
+			if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
+				//do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
+				logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
+					log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
+				oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
+			}
+		} else {
+			logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
+				log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
+			oo.printRxMessage(ctx, rxMsg)
+			return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
+		}
+	} else if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.ExtendedIdent) {
+		if len(rxMsg) > 1980 {
+			logger.Errorw(ctx, "rxOmciMessage has wrong length for OmciExtendedFormat - abort",
+				log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
+			oo.printRxMessage(ctx, rxMsg)
+			return fmt.Errorf("rxOmciMessage has wrong length for OmciExtendedFormat %s", oo.deviceID)
 		}
 	} else {
-		logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
+		logger.Errorw(ctx, "rxOmciMessage has wrong Device Identifier - abort",
 			log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
 		oo.printRxMessage(ctx, rxMsg)
-		return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
+		return fmt.Errorf("rxOmciMessage has wrong Device Identifier %s", oo.deviceID)
 	}
 	decodeOptions := gopacket.DecodeOptions{
 		Lazy:   true,
@@ -530,7 +555,7 @@
 	receiveCallbackPair CallbackPair) error {
 
 	if timeout != 0 {
-		logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": receiveCallbackPair.CbKey})
+		logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TransCorrId": receiveCallbackPair.CbKey})
 		oo.mutexRxSchedMap.Lock()
 		// it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
 		oo.rxSchedulerMap[receiveCallbackPair.CbKey] = receiveCallbackPair.CbEntry
@@ -587,6 +612,11 @@
 	for oo.highPrioTxQueue.Len() > 0 {
 		queueElement := oo.highPrioTxQueue.Front() // First element
 		if err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure)); err != nil {
+			// Element will be removed from the queue regardless of the send success, to prevent
+			// an accumulation of send requests for the same message in the event of an error.
+			// In this case, resend attempts for the message are ensured by our retry
+			// mechanism after omci-timeout.
+			oo.highPrioTxQueue.Remove(queueElement) // Dequeue
 			return err
 		}
 		oo.highPrioTxQueue.Remove(queueElement) // Dequeue
@@ -602,12 +632,22 @@
 		aOmciTxReq := queueElement.Value.(OmciTransferStructure)
 		if aOmciTxReq.OnuSwWindow != nil {
 			if err := oo.sendOnuSwSectionsOfWindow(ctx, aOmciTxReq); err != nil {
+				// Element will be removed from the queue regardless of the send success, to prevent
+				// an accumulation of send requests for the same message in the event of an error.
+				// In this case, resend attempts for the message are ensured by our retry
+				// mechanism after omci-timeout.
+				oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
 				oo.mutexLowPrioTxQueue.Unlock()
 				return err
 			}
 		} else {
 			err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure))
 			if err != nil {
+				// Element will be removed from the queue regardless of the send success, to prevent
+				// an accumulation of send requests for the same message in the event of an error.
+				// In this case, resend attempts for the message are ensured by our retry
+				// mechanism after omci-timeout.
+				oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
 				oo.mutexLowPrioTxQueue.Unlock()
 				return err
 			}
@@ -712,10 +752,11 @@
 		TransactionID: tid,
 		MessageType:   msgType,
 	}
-	return serializeOmciLayer(ctx, omciLayer, request)
+	return SerializeOmciLayer(ctx, omciLayer, request)
 }
 
-func serializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
+// SerializeOmciLayer - TODO: add comment
+func SerializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
 	var options gopacket.SerializeOptions
 	options.FixLengths = true
 
@@ -960,7 +1001,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1009,7 +1050,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1064,7 +1105,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1122,7 +1163,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1182,7 +1223,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1228,7 +1269,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1274,7 +1315,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1368,7 +1409,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1413,7 +1454,7 @@
 			logger.Errorf(ctx, "Cannot encode instance for get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
 			return nil, err
 		}
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
 			return nil, err
@@ -1501,7 +1542,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1545,7 +1586,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1589,7 +1630,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1632,7 +1673,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1676,7 +1717,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1718,7 +1759,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1760,7 +1801,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1802,7 +1843,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1849,7 +1890,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1895,7 +1936,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1939,7 +1980,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -1981,7 +2022,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -2023,7 +2064,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -2070,7 +2111,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -2108,7 +2149,7 @@
 			logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
 			return nil, err
 		}
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
 			return nil, err
@@ -2144,7 +2185,7 @@
 			logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
 			return nil, err
 		}
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
 			return nil, err
@@ -2182,7 +2223,7 @@
 			logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
 			return nil, err
 		}
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
 			return nil, err
@@ -2226,7 +2267,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -2273,7 +2314,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -2320,7 +2361,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -2367,7 +2408,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -2409,7 +2450,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
 			return nil, err
@@ -2448,7 +2489,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
 			return nil, err
@@ -2488,7 +2529,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -2530,7 +2571,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -2572,7 +2613,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -2614,7 +2655,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -2656,7 +2697,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP set", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -2702,7 +2743,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -2745,7 +2786,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VoipMediaProfile create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -2787,7 +2828,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VoipMediaProfile set", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -2830,7 +2871,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VoipMediaProfile delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -2873,7 +2914,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -2915,7 +2956,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile set", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -2958,7 +2999,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -3001,7 +3042,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize SIPUserData create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3043,7 +3084,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize SIPUserData set", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3086,7 +3127,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize SIPUserData delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -3129,7 +3170,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3171,7 +3212,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile set", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3214,7 +3255,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize SIPVoipApplicationServiceProfile delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -3257,7 +3298,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3299,7 +3340,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData set", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3342,7 +3383,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -3385,7 +3426,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3427,7 +3468,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData set", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3470,7 +3511,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -3513,7 +3554,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize IPHostConfigData create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3555,7 +3596,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize IPHostConfigData set", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3598,7 +3639,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize IPHostConfigData delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -3641,7 +3682,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize RTPProfileData create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3683,7 +3724,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize RTPProfileData set", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3726,7 +3767,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize RTPProfileData delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -3769,7 +3810,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable create", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3811,7 +3852,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable set", log.Fields{"Err": err,
 				"device-id": oo.deviceID})
@@ -3854,7 +3895,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable delete", log.Fields{
 				"Err": err, "device-id": oo.deviceID})
@@ -3905,7 +3946,7 @@
 		Second: uint8(utcTime.Second()),
 	}
 
-	pkt, err := serializeOmciLayer(ctx, omciLayer, request)
+	pkt, err := SerializeOmciLayer(ctx, omciLayer, request)
 	if err != nil {
 		logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
 			"device-id": oo.deviceID})
@@ -3956,7 +3997,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
 				log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
@@ -4009,7 +4050,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
 				log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
@@ -4062,7 +4103,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize fec history data ME",
 				log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
@@ -4115,7 +4156,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "Cannot serialize gemport history data ME",
 				log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
@@ -4847,7 +4888,7 @@
 			return nil, err
 		}
 
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
 				log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
@@ -4918,7 +4959,7 @@
 				log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
 			return nil, err
 		}
-		pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
+		pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
 		if err != nil {
 			logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me-set-msg",
 				log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})