[VOL-4692] BBSIM: OMCI extended message set - support get requests

Change-Id: I41f139558df5913cccab3ba3b8f7eb147e72ebbd
diff --git a/internal/common/omci/get.go b/internal/common/omci/get.go
index 6d83495..71d7d87 100644
--- a/internal/common/omci/get.go
+++ b/internal/common/omci/get.go
@@ -54,47 +54,53 @@
 		return nil, err
 	}
 	omciLogger.WithFields(log.Fields{
+		"DeviceIdent":    omciMsg.DeviceIdentifier,
 		"EntityClass":    msgObj.EntityClass,
 		"EntityInstance": msgObj.EntityInstance,
 		"AttributeMask":  fmt.Sprintf("%x", msgObj.AttributeMask),
 	}).Trace("received-omci-get-request")
 
 	var response *omci.GetResponse
+
+	isExtended := false
+	if omciMsg.DeviceIdentifier == omci.ExtendedIdent {
+		isExtended = true
+	}
 	switch msgObj.EntityClass {
 	case me.Onu2GClassID:
-		response = createOnu2gResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+		response = createOnu2gResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance)
 	case me.OnuGClassID:
-		response = createOnugResponse(msgObj.AttributeMask, msgObj.EntityInstance, onuSn)
+		response = createOnugResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance, onuSn)
 	case me.SoftwareImageClassID:
-		response = createSoftwareImageResponse(msgObj.AttributeMask, msgObj.EntityInstance,
+		response = createSoftwareImageResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance,
 			activeImageEntityId, committedImageEntityId, standbyImageVersion, activeImageVersion, committedImageVersion)
 	case me.IpHostConfigDataClassID:
-		response = createIpHostResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+		response = createIpHostResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance)
 	case me.VoipConfigDataClassID:
-		response = createVoipConfigDataResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+		response = createVoipConfigDataResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance)
 	case me.UniGClassID:
-		response = createUnigResponse(msgObj.AttributeMask, msgObj.EntityInstance, onuDown)
+		response = createUnigResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance, onuDown)
 	case me.PhysicalPathTerminationPointEthernetUniClassID:
-		response = createPptpEthernetResponse(msgObj.AttributeMask, msgObj.EntityInstance, onuDown)
+		response = createPptpEthernetResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance, onuDown)
 	case me.PhysicalPathTerminationPointPotsUniClassID:
-		response = createPptpPotsResponse(msgObj.AttributeMask, msgObj.EntityInstance, onuDown)
+		response = createPptpPotsResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance, onuDown)
 	case me.AniGClassID:
-		response = createAnigResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+		response = createAnigResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance)
 	case me.OnuDataClassID:
-		response = createOnuDataResponse(msgObj.AttributeMask, msgObj.EntityInstance, mds)
+		response = createOnuDataResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance, mds)
 	case me.EthernetFramePerformanceMonitoringHistoryDataUpstreamClassID:
-		response = createEthernetFramePerformanceMonitoringHistoryDataUpstreamResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+		response = createEthernetFramePerformanceMonitoringHistoryDataUpstreamResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance)
 	case me.EthernetFramePerformanceMonitoringHistoryDataDownstreamClassID:
-		response = createEthernetFramePerformanceMonitoringHistoryDataDownstreamResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+		response = createEthernetFramePerformanceMonitoringHistoryDataDownstreamResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance)
 	case me.EthernetPerformanceMonitoringHistoryDataClassID:
-		response = createEthernetPerformanceMonitoringHistoryDataResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+		response = createEthernetPerformanceMonitoringHistoryDataResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance)
 	case me.FecPerformanceMonitoringHistoryDataClassID:
-		response = createFecPerformanceMonitoringHistoryDataResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+		response = createFecPerformanceMonitoringHistoryDataResponse(isExtended, msgObj.AttributeMask, msgObj.EntityInstance)
 	case me.GemPortNetworkCtpPerformanceMonitoringHistoryDataClassID:
-		response = createGemPortNetworkCtpPerformanceMonitoringHistoryData(msgObj.AttributeMask, msgObj.EntityInstance)
+		response = createGemPortNetworkCtpPerformanceMonitoringHistoryData(isExtended, msgObj.AttributeMask, msgObj.EntityInstance)
 	case me.EthernetFrameExtendedPmClassID,
 		me.EthernetFrameExtendedPm64BitClassID:
-		response = createEthernetFrameExtendedPmGetResponse(msgObj.EntityClass, msgObj.AttributeMask, msgObj.EntityInstance)
+		response = createEthernetFrameExtendedPmGetResponse(isExtended, msgObj.EntityClass, msgObj.AttributeMask, msgObj.EntityInstance)
 	default:
 		omciLogger.WithFields(log.Fields{
 			"EntityClass":    msgObj.EntityClass,
@@ -103,8 +109,16 @@
 		}).Warnf("do-not-know-how-to-handle-get-request-for-me-class")
 		return nil, nil
 	}
+	omciLayer := &omci.OMCI{
+		TransactionID:    omciMsg.TransactionID,
+		MessageType:      omci.GetResponseType,
+		DeviceIdentifier: omciMsg.DeviceIdentifier,
+	}
+	var options gopacket.SerializeOptions
+	options.FixLengths = true
 
-	pkt, err := Serialize(omci.GetResponseType, response, omciMsg.TransactionID)
+	buffer := gopacket.NewSerializeBuffer()
+	err = gopacket.SerializeLayers(buffer, options, omciLayer, response)
 	if err != nil {
 		omciLogger.WithFields(log.Fields{
 			"Err":  err,
@@ -112,6 +126,7 @@
 		}).Error("cannot-Serialize-GetResponse")
 		return nil, err
 	}
+	pkt := buffer.Bytes()
 
 	log.WithFields(log.Fields{
 		"TxID": strconv.FormatInt(int64(omciMsg.TransactionID), 16),
@@ -121,7 +136,7 @@
 	return pkt, nil
 }
 
-func createOnu2gResponse(attributeMask uint16, entityID uint16) *omci.GetResponse {
+func createOnu2gResponse(isExtended bool, attributeMask uint16, entityID uint16) *omci.GetResponse {
 
 	managedEntity, meErr := me.NewOnu2G(me.ParamData{
 		EntityID: entityID,
@@ -151,7 +166,9 @@
 
 	return &omci.GetResponse{
 		MeBasePacket: omci.MeBasePacket{
-			EntityClass: me.Onu2GClassID,
+			EntityClass:    me.Onu2GClassID,
+			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,
@@ -159,7 +176,7 @@
 	}
 }
 
-func createOnugResponse(attributeMask uint16, entityID uint16, onuSn *openolt.SerialNumber) *omci.GetResponse {
+func createOnugResponse(isExtended bool, attributeMask uint16, entityID uint16, onuSn *openolt.SerialNumber) *omci.GetResponse {
 
 	managedEntity, meErr := me.NewOnuG(me.ParamData{
 		EntityID: entityID,
@@ -188,27 +205,17 @@
 
 	return &omci.GetResponse{
 		MeBasePacket: omci.MeBasePacket{
-			EntityClass: me.OnuGClassID,
+			EntityClass:    me.OnuGClassID,
+			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,
 		Result:        me.Success,
 	}
-
-	//return &omci.GetResponse{
-	//	MeBasePacket: omci.MeBasePacket{
-	//		EntityClass:    me.OnuGClassID,
-	//		EntityInstance: entityID,
-	//	},
-	//	Attributes: me.AttributeValueMap{
-	//
-	//	},
-	//	Result:        me.Success,
-	//	AttributeMask: attributeMask,
-	//}
 }
 
-func createSoftwareImageResponse(attributeMask uint16, entityInstance uint16, activeImageEntityId uint16,
+func createSoftwareImageResponse(isExtended bool, attributeMask uint16, entityInstance uint16, activeImageEntityId uint16,
 	committedImageEntityId uint16, standbyImageVersion string, activeImageVersion string, committedImageVersion string) *omci.GetResponse {
 
 	omciLogger.WithFields(log.Fields{
@@ -244,6 +251,7 @@
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.SoftwareImageClassID,
 			EntityInstance: entityInstance,
+			Extended:       isExtended,
 		},
 		Attributes: me.AttributeValueMap{
 			me.ManagedEntityID:           0,
@@ -268,11 +276,12 @@
 	return res
 }
 
-func createIpHostResponse(attributeMask uint16, entityInstance uint16) *omci.GetResponse {
+func createIpHostResponse(isExtended bool, attributeMask uint16, entityInstance uint16) *omci.GetResponse {
 	return &omci.GetResponse{
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.IpHostConfigDataClassID,
 			EntityInstance: entityInstance,
+			Extended:       isExtended,
 		},
 		Attributes: me.AttributeValueMap{
 			me.ManagedEntityID:             0,
@@ -283,11 +292,12 @@
 	}
 }
 
-func createVoipConfigDataResponse(attributeMask uint16, entityInstance uint16) *omci.GetResponse {
+func createVoipConfigDataResponse(isExtended bool, attributeMask uint16, entityInstance uint16) *omci.GetResponse {
 	return &omci.GetResponse{
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.VoipConfigDataClassID,
 			EntityInstance: entityInstance,
+			Extended:       isExtended,
 		},
 		Attributes: me.AttributeValueMap{
 			me.ManagedEntityID: 0,
@@ -305,7 +315,7 @@
 	}
 }
 
-func createUnigResponse(attributeMask uint16, entityID uint16, onuDown bool) *omci.GetResponse {
+func createUnigResponse(isExtended bool, attributeMask uint16, entityID uint16, onuDown bool) *omci.GetResponse {
 	// Valid values for uni_admin_state are 0 (unlocks) and 1 (locks)
 	omciAdminState := 1
 	if !onuDown {
@@ -332,6 +342,7 @@
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.UniGClassID,
 			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,
@@ -339,7 +350,7 @@
 	}
 }
 
-func createPptpEthernetResponse(attributeMask uint16, entityID uint16, onuDown bool) *omci.GetResponse {
+func createPptpEthernetResponse(isExtended bool, attributeMask uint16, entityID uint16, onuDown bool) *omci.GetResponse {
 	// Valid values for oper_state are 0 (enabled) and 1 (disabled)
 	// Valid values for uni_admin_state are 0 (unlocks) and 1 (locks)
 	onuAdminState := 1
@@ -378,6 +389,7 @@
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.PhysicalPathTerminationPointEthernetUniClassID,
 			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,
@@ -385,7 +397,7 @@
 	}
 }
 
-func createPptpPotsResponse(attributeMask uint16, entityID uint16, onuDown bool) *omci.GetResponse {
+func createPptpPotsResponse(isExtended bool, attributeMask uint16, entityID uint16, onuDown bool) *omci.GetResponse {
 	// Valid values for oper_state are 0 (enabled) and 1 (disabled)
 	// Valid values for uni_admin_state are 0 (unlocks) and 1 (locks)
 	onuAdminState := 1
@@ -422,6 +434,7 @@
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.PhysicalPathTerminationPointPotsUniClassID,
 			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,
@@ -429,7 +442,7 @@
 	}
 }
 
-func createEthernetFramePerformanceMonitoringHistoryDataUpstreamResponse(attributeMask uint16, entityID uint16) *omci.GetResponse {
+func createEthernetFramePerformanceMonitoringHistoryDataUpstreamResponse(isExtended bool, attributeMask uint16, entityID uint16) *omci.GetResponse {
 	managedEntity, meErr := me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(me.ParamData{
 		EntityID: entityID,
 		Attributes: me.AttributeValueMap{
@@ -462,6 +475,7 @@
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.EthernetFramePerformanceMonitoringHistoryDataUpstreamClassID,
 			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,
@@ -469,7 +483,7 @@
 	}
 }
 
-func createEthernetFramePerformanceMonitoringHistoryDataDownstreamResponse(attributeMask uint16, entityID uint16) *omci.GetResponse {
+func createEthernetFramePerformanceMonitoringHistoryDataDownstreamResponse(isExtended bool, attributeMask uint16, entityID uint16) *omci.GetResponse {
 	managedEntity, meErr := me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(me.ParamData{
 		EntityID: entityID,
 		Attributes: me.AttributeValueMap{
@@ -502,6 +516,7 @@
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.EthernetFramePerformanceMonitoringHistoryDataDownstreamClassID,
 			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,
@@ -509,7 +524,7 @@
 	}
 }
 
-func createEthernetPerformanceMonitoringHistoryDataResponse(attributeMask uint16, entityID uint16) *omci.GetResponse {
+func createEthernetPerformanceMonitoringHistoryDataResponse(isExtended bool, attributeMask uint16, entityID uint16) *omci.GetResponse {
 	managedEntity, meErr := me.NewEthernetPerformanceMonitoringHistoryData(me.ParamData{
 		EntityID: entityID,
 		Attributes: me.AttributeValueMap{
@@ -542,6 +557,7 @@
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.EthernetPerformanceMonitoringHistoryDataClassID,
 			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,
@@ -549,7 +565,7 @@
 	}
 }
 
-func createFecPerformanceMonitoringHistoryDataResponse(attributeMask uint16, entityID uint16) *omci.GetResponse {
+func createFecPerformanceMonitoringHistoryDataResponse(isExtended bool, attributeMask uint16, entityID uint16) *omci.GetResponse {
 	managedEntity, meErr := me.NewFecPerformanceMonitoringHistoryData(me.ParamData{
 		EntityID: entityID,
 		Attributes: me.AttributeValueMap{
@@ -576,6 +592,7 @@
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.FecPerformanceMonitoringHistoryDataClassID,
 			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,
@@ -583,7 +600,7 @@
 	}
 }
 
-func createGemPortNetworkCtpPerformanceMonitoringHistoryData(attributeMask uint16, entityID uint16) *omci.GetResponse {
+func createGemPortNetworkCtpPerformanceMonitoringHistoryData(isExtended bool, attributeMask uint16, entityID uint16) *omci.GetResponse {
 	managedEntity, meErr := me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(me.ParamData{
 		EntityID: entityID,
 		Attributes: me.AttributeValueMap{
@@ -607,6 +624,7 @@
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.GemPortNetworkCtpPerformanceMonitoringHistoryDataClassID,
 			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,
@@ -614,7 +632,7 @@
 	}
 }
 
-func createOnuDataResponse(attributeMask uint16, entityID uint16, mds uint8) *omci.GetResponse {
+func createOnuDataResponse(isExtended bool, attributeMask uint16, entityID uint16, mds uint8) *omci.GetResponse {
 	managedEntity, meErr := me.NewOnuData(me.ParamData{
 		EntityID: entityID,
 		Attributes: me.AttributeValueMap{
@@ -632,6 +650,7 @@
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.OnuDataClassID,
 			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,
@@ -639,7 +658,7 @@
 	}
 }
 
-func createAnigResponse(attributeMask uint16, entityID uint16) *omci.GetResponse {
+func createAnigResponse(isExtended bool, attributeMask uint16, entityID uint16) *omci.GetResponse {
 	managedEntity, meErr := me.NewAniG(me.ParamData{
 		EntityID: entityID,
 		Attributes: me.AttributeValueMap{
@@ -672,6 +691,7 @@
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    me.AniGClassID,
 			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,
@@ -679,7 +699,7 @@
 	}
 }
 
-func createEthernetFrameExtendedPmGetResponse(meClass me.ClassID, attributeMask uint16, entityID uint16) *omci.GetResponse {
+func createEthernetFrameExtendedPmGetResponse(isExtended bool, meClass me.ClassID, attributeMask uint16, entityID uint16) *omci.GetResponse {
 
 	callback := me.NewEthernetFrameExtendedPm
 	if meClass != me.EthernetFrameExtendedPmClassID {
@@ -720,6 +740,7 @@
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass:    meClass,
 			EntityInstance: entityID,
+			Extended:       isExtended,
 		},
 		Attributes:    managedEntity.GetAttributeValueMap(),
 		AttributeMask: attributeMask,