[VOL-4111] Dinamically generating the MibDB during ONU creation and use
that to drive the MibUploadNextResponse generation

Change-Id: I67dbbe0700a7fbec802516fc6b2a9aff496022de
diff --git a/internal/common/omci/mibpackets.go b/internal/common/omci/mibpackets.go
index 6d22200..8db0709 100755
--- a/internal/common/omci/mibpackets.go
+++ b/internal/common/omci/mibpackets.go
@@ -23,25 +23,12 @@
 	"github.com/opencord/omci-lib-go"
 	me "github.com/opencord/omci-lib-go/generated"
 	log "github.com/sirupsen/logrus"
-	"strconv"
 )
 
 var omciLogger = log.WithFields(log.Fields{
 	"module": "OMCI",
 })
 
-// we have a fixed number of 8 T-CONTS
-var reportedTcontsMeId = []uint16{
-	32769,
-	32770,
-	32771,
-	32772,
-	32773,
-	32774,
-	32775,
-	32776,
-}
-
 // NOTE this is basically the same as https://github.com/opencord/voltha-openonu-adapter-go/blob/master/internal/pkg/onuadaptercore/omci_cc.go#L545-L564
 // we should probably move it in "omci-lib-go"
 func Serialize(msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
@@ -112,10 +99,7 @@
 	return HexEncode(pkt)
 }
 
-func CreateMibUploadResponse(tid uint16) ([]byte, error) {
-
-	numberOfCommands := uint16(291) //NOTE should this be configurable? (not until we have moved all the messages away from omci-sim)
-
+func CreateMibUploadResponse(tid uint16, numberOfCommands uint16) ([]byte, error) {
 	request := &omci.MibUploadResponse{
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass: me.OnuDataClassID,
@@ -168,7 +152,7 @@
 	return msgObj, nil
 }
 
-func CreateMibUploadNextResponse(omciPkt gopacket.Packet, omciMsg *omci.OMCI, mds uint8) ([]byte, error) {
+func CreateMibUploadNextResponse(omciPkt gopacket.Packet, omciMsg *omci.OMCI, mds uint8, mibDb *MibDb) ([]byte, error) {
 
 	msgObj, err := ParseMibUploadNextRequest(omciPkt)
 	if err != nil {
@@ -183,256 +167,28 @@
 		"CommandSequenceNumber": msgObj.CommandSequenceNumber,
 	}).Trace("received-omci-mibUploadNext-request")
 
-	var reportedMe *me.ManagedEntity
-	var meErr me.OmciErrors
+	if msgObj.CommandSequenceNumber > mibDb.NumberOfCommands {
+		omciLogger.WithFields(log.Fields{
+			"CommandSequenceNumber": msgObj.CommandSequenceNumber,
+			"MibDbNumberOfCommands": mibDb.NumberOfCommands,
+		}).Error("mibdb-does-not-contain-item")
+		return nil, fmt.Errorf("mibdb-does-not-contain-item")
+	}
+	currentEntry := mibDb.items[int(msgObj.CommandSequenceNumber)]
+	reportedMe, meErr := me.LoadManagedEntityDefinition(currentEntry.classId, me.ParamData{
+		EntityID:   currentEntry.entityId.ToUint16(),
+		Attributes: currentEntry.params,
+	})
 
-	switch msgObj.CommandSequenceNumber {
-	case 0:
-		reportedMe, meErr = me.NewOnuData(me.ParamData{Attributes: me.AttributeValueMap{
-			"MibDataSync": mds,
-		}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewOnuData %v", meErr.Error())
-		}
+	if meErr.GetError() != nil {
+		omciLogger.Errorf("Error while generating %s: %v", currentEntry.classId.String(), meErr.Error())
+	}
 
-	case 1:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"Type":          47,
-				"NumberOfPorts": 4,
-				"SerialNumber":  toOctets("BBSM-Circuit-Pack", 20),
-				"Version":       toOctets("v0.0.1", 20),
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
+	if reportedMe.GetClassID() == me.OnuDataClassID {
+		// if this is ONU-Data we need to replace the MDS
+		if err := reportedMe.SetAttribute("MibDataSync", mds); err.GetError() != nil {
+			omciLogger.Errorf("Error while setting mds in %s: %v", currentEntry.classId.String(), meErr.Error())
 		}
-	case 2:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"VendorId":            "ONF",
-				"AdministrativeState": 0,
-				"OperationalState":    0,
-				"BridgedOrIpInd":      0,
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 3:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"EquipmentId":                 toOctets("BBSM-Circuit-Pack", 20),
-				"CardConfiguration":           0,
-				"TotalTContBufferNumber":      8,
-				"TotalPriorityQueueNumber":    8,
-				"TotalTrafficSchedulerNumber": 16,
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 4:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"PowerShedOverride": uint32(0),
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 5:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257,
-			Attributes: me.AttributeValueMap{
-				"Type":          238,
-				"NumberOfPorts": 4, //number of UNI for this device
-				"SerialNumber":  toOctets("BBSM-Circuit-Pack-2", 20),
-				"Version":       toOctets("v0.0.1", 20),
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 6:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"VendorId":            "ONF",
-				"AdministrativeState": 0,
-				"OperationalState":    0,
-				"BridgedOrIpInd":      0,
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 7:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"EquipmentId":                 toOctets("BBSM-Circuit-Pack", 20),
-				"CardConfiguration":           0,
-				"TotalTContBufferNumber":      0,
-				"TotalPriorityQueueNumber":    8,
-				"TotalTrafficSchedulerNumber": 0,
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 8:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"PowerShedOverride": uint32(0),
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 9, 10, 11, 12:
-		// NOTE we're reporting for different UNIs, the IDs are 257, 258, 259, 260
-		meInstance := 248 + msgObj.CommandSequenceNumber
-		reportedMe, meErr = me.NewPhysicalPathTerminationPointEthernetUni(me.ParamData{
-			EntityID: meInstance,
-			Attributes: me.AttributeValueMap{
-				"ExpectedType":                  0,
-				"SensedType":                    47,
-				"AutoDetectionConfiguration":    0,
-				"EthernetLoopbackConfiguration": 0,
-				"AdministrativeState":           0,
-				"OperationalState":              0,
-				"ConfigurationInd":              3,
-				"MaxFrameSize":                  1518,
-				"DteOrDceInd":                   0,
-				"PauseTime":                     0,
-				"BridgedOrIpInd":                2,
-				"Arc":                           0,
-				"ArcInterval":                   0,
-				"PppoeFilter":                   0,
-				"PowerControl":                  0,
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewPhysicalPathTerminationPointEthernetUni %v", meErr.Error())
-		}
-	case 13, 14, 15, 16, 17, 18, 19, 20:
-		reportedMe, meErr = me.NewTCont(me.ParamData{
-			// NOTE fetch the correct T-CONT MeID based on the sequence number
-			EntityID: reportedTcontsMeId[msgObj.CommandSequenceNumber-13],
-			Attributes: me.AttributeValueMap{
-				"AllocId": 65535,
-			},
-		})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewTCont %v", meErr.Error())
-		}
-	case 21:
-		reportedMe, meErr = me.NewAniG(me.ParamData{
-			EntityID: 32769, // same as the first T-CONT
-			Attributes: me.AttributeValueMap{
-				"Arc":                         0,
-				"ArcInterval":                 0,
-				"Deprecated":                  0,
-				"GemBlockLength":              48,
-				"LowerOpticalThreshold":       255,
-				"LowerTransmitPowerThreshold": 129,
-				"OnuResponseTime":             0,
-				"OpticalSignalLevel":          57428,
-				"PiggybackDbaReporting":       0,
-				"SignalDegradeThreshold":      9,
-				"SignalFailThreshold":         5,
-				"SrIndication":                1,
-				"TotalTcontNumber":            8,
-				"TransmitOpticalLevel":        3171,
-				"UpperOpticalThreshold":       255,
-				"UpperTransmitPowerThreshold": 129,
-			},
-		})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewAniG %v", meErr.Error())
-		}
-	case 22, 23, 24, 25:
-		// NOTE we're reporting for different UNIs, the IDs are 257, 258, 259, 260
-		meInstance := 235 + msgObj.CommandSequenceNumber
-		reportedMe, meErr = me.NewUniG(me.ParamData{
-			EntityID: meInstance,
-			Attributes: me.AttributeValueMap{
-				"AdministrativeState":         0,
-				"Deprecated":                  0,
-				"ManagementCapability":        0,
-				"NonOmciManagementIdentifier": 0,
-				"RelayAgentOptions":           0,
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewUniG %v", meErr.Error())
-		}
-	// Prior-Q with mask downstream
-	case 26, 30, 34, 38, 42, 46, 50, 54,
-		58, 62, 66, 70, 74, 78, 82, 86,
-		90, 94, 98, 102, 106, 110, 114, 118,
-		122, 126, 130, 134, 138, 142, 146, 150,
-		154, 158, 162, 166, 170, 174, 178, 182,
-		186, 190, 194, 198, 202, 206, 210, 214,
-		218, 222, 226, 230, 234, 238, 242, 246,
-		250, 254, 258, 262, 266, 270, 274, 278,
-		// Prior-Q with attribute list downstream
-		27, 31, 35, 39, 43, 47, 51, 55,
-		59, 63, 67, 71, 75, 79, 83, 87,
-		91, 95, 99, 103, 107, 111, 115, 119,
-		123, 127, 131, 135, 139, 143, 147, 151,
-		155, 159, 163, 167, 171, 175, 179, 183,
-		187, 191, 195, 199, 203, 207, 211, 215,
-		219, 223, 227, 231, 235, 239, 243, 247,
-		251, 255, 259, 263, 267, 271, 275, 279,
-		// Prior-Q with mask upstream
-		28, 32, 36, 40, 44, 48, 52, 56,
-		60, 64, 68, 72, 76, 80, 84, 88,
-		92, 96, 100, 104, 108, 112, 116, 120,
-		124, 128, 132, 136, 140, 144, 148, 152,
-		156, 160, 164, 168, 172, 176, 180, 184,
-		188, 192, 196, 200, 204, 208, 212, 216,
-		220, 224, 228, 232, 236, 240, 244, 248,
-		252, 256, 260, 264, 268, 272, 276, 280,
-		// Prior-Q with attribute list upstream
-		29, 33, 37, 41, 45, 49, 53, 57,
-		61, 65, 69, 73, 77, 81, 85, 89,
-		93, 97, 101, 105, 109, 113, 117, 121,
-		125, 129, 133, 137, 141, 145, 149, 153,
-		157, 161, 165, 169, 173, 177, 181, 185,
-		189, 193, 197, 201, 205, 209, 213, 217,
-		221, 225, 229, 233, 237, 241, 245, 249,
-		253, 257, 261, 265, 269, 273, 277, 281:
-
-		reportedMe, meErr = GeneratePriorityQueueMe(msgObj.CommandSequenceNumber)
-
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewPriorityQueue %v", meErr.Error())
-		}
-	case 282, 283, 284, 285, 286, 287, 288, 289:
-		reportedMe, meErr = me.NewTrafficScheduler(me.ParamData{Attributes: me.AttributeValueMap{
-			"TContPointer":            32768, // NOTE does this need to change?
-			"TrafficSchedulerPointer": 0,
-			"Policy":                  02,
-			"PriorityWeight":          0,
-		}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewTrafficScheduler %v", meErr.Error())
-		}
-	case 290:
-		reportedMe, meErr = me.NewOnu2G(me.ParamData{Attributes: me.AttributeValueMap{
-			"ConnectivityCapability":                      127,
-			"CurrentConnectivityMode":                     0,
-			"Deprecated":                                  1,
-			"PriorityQueueScaleFactor":                    1,
-			"QualityOfServiceQosConfigurationFlexibility": 63,
-			"Sysuptime":                                   0,
-			"TotalGemPortIdNumber":                        8,
-			"TotalPriorityQueueNumber":                    64,
-			"TotalTrafficSchedulerNumber":                 8,
-		}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewOnu2G %v", meErr.Error())
-		}
-	default:
-		omciLogger.Warn("unsupported-CommandSequenceNumber-in-mib-upload-next", msgObj.CommandSequenceNumber)
-		return nil, nil
 	}
 
 	response := &omci.MibUploadNextResponse{
@@ -457,83 +213,3 @@
 
 	return pkt, nil
 }
-
-func GeneratePriorityQueueMe(sequence uint16) (*me.ManagedEntity, me.OmciErrors) {
-
-	iteration := sequence - 26
-
-	// we report 256 messages for priority queues,
-	// 128 downstream and 128 upstream
-	// we repeat 64 times the quartet:
-	// - downstream with mask
-	// - downstream with attributes (same MeID as the previous)
-	// - upstream with mask
-	// - upstream with attributes (same MeID as the previous)
-
-	// very ugly way to define whether the priority queue is upstream or downstream
-	// (first 2 blocks are downstream, second two are upstream)
-	// for example sequence 26, 27 are downstream
-	// sequence 28, 29 are upstream
-	isDownstream := ((sequence-26)%4 == 0) || ((sequence-27)%4 == 0)
-	// entityIds are:
-	// - 1 to 64 for downstream (hex 0001 to 0040)
-	// - 32769 to 32832 for upstream (hex 8001 to 8040)
-	var entityId uint16
-	if isDownstream {
-		entityId = (iteration)/4 + 1
-	} else {
-		entityId = (iteration)/4 + 32769
-	}
-
-	var relatedPort uint32
-	if isDownstream {
-		// downstream the related port is:
-		// - Circuit Pack/ UNI port of UNI Port (01 01/04)
-		// - priority 0 to 15 -> iteration%16
-
-		// every 16 iteration (of 4 commands) we move to the next the TCONT MeID
-		uniPort := int(iteration/64) + 1
-		priority := (iteration / 4) % 16
-
-		// concat the uniPort and priority in an hex string
-		// we have a single circuit pack, so we hardcode it
-		v := fmt.Sprintf("010%x000%x", uniPort, priority)
-
-		// convert back to int
-		k, _ := strconv.ParseInt(v, 16, 64)
-		relatedPort = uint32(k)
-	} else {
-		// upstream the related port is:
-		// - Tcont MeID -> reportedTcontsMeId[ceil(iteration/4/8)]
-		// - priority 0 to 7 -> iteration%8
-
-		// every 8 iteration (of 4 commands) we move to the next the TCONT MeID
-		tcontMe := reportedTcontsMeId[int(iteration/32)]
-		priority := (iteration / 4) % 8
-
-		// concat the tcontMe and priority in an hex string
-		v := fmt.Sprintf("%x000%x", tcontMe, priority)
-
-		// convert back to int
-		k, _ := strconv.ParseInt(v, 16, 64)
-		relatedPort = uint32(k)
-	}
-
-	return me.NewPriorityQueue(me.ParamData{
-		EntityID: entityId,
-		Attributes: me.AttributeValueMap{
-			"QueueConfigurationOption":                            0,
-			"MaximumQueueSize":                                    100,
-			"AllocatedQueueSize":                                  100,
-			"DiscardBlockCounterResetInterval":                    0,
-			"ThresholdValueForDiscardedBlocksDueToBufferOverflow": 0,
-			"RelatedPort":                                         relatedPort,
-			"TrafficSchedulerPointer":                             264,
-			"Weight":                                              1,
-			"BackPressureOperation":                               1,
-			"BackPressureTime":                                    0,
-			"BackPressureOccurQueueThreshold":                     0,
-			"BackPressureClearQueueThreshold":                     0,
-		},
-	})
-}