[VOL-3832] Reporting correct EntityIDs dirung the MIB Upload process
Change-Id: I8e3e8998abc0d495495c1699aa17fa582241ec32
diff --git a/Makefile b/Makefile
index 481a9ff..15c2285 100644
--- a/Makefile
+++ b/Makefile
@@ -103,7 +103,6 @@
docker-push: # @HELP Push the docker container to a registry
docker push ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}bbsim:${DOCKER_TAG}
-
docker-kind-load:
@if [ "`kind get clusters | grep voltha-$(TYPE)`" = '' ]; then echo "no voltha-$(TYPE) cluster found" && exit 1; fi
kind load docker-image ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}bbsim:${DOCKER_TAG} --name=voltha-$(TYPE) --nodes $(shell kubectl get nodes --template='{{range .items}}{{.metadata.name}},{{end}}' | sed 's/,$$//')
diff --git a/internal/common/omci/create.go b/internal/common/omci/create.go
index 1fcef4a..c1e2b0b 100644
--- a/internal/common/omci/create.go
+++ b/internal/common/omci/create.go
@@ -83,8 +83,8 @@
func CreateGalEnetRequest(tid uint16) ([]byte, error) {
params := me.ParamData{
- EntityID: galEthernetEID,
- Attributes: me.AttributeValueMap{"MaximumGemPayloadSize": maxGemPayloadSize},
+ EntityID: 1,
+ Attributes: me.AttributeValueMap{"MaximumGemPayloadSize": 48},
}
meDef, _ := me.NewGalEthernetProfile(params)
pkt, err := omci.GenFrame(meDef, omci.CreateRequestType, omci.TransactionID(tid))
@@ -129,7 +129,7 @@
func CreateGemPortRequest(tid uint16) ([]byte, error) {
params := me.ParamData{
- EntityID: gemEID,
+ EntityID: 1,
Attributes: me.AttributeValueMap{
"PortId": 1,
"TContPointer": 1,
diff --git a/internal/common/omci/get.go b/internal/common/omci/get.go
index 67ce88f..25ba8ed 100644
--- a/internal/common/omci/get.go
+++ b/internal/common/omci/get.go
@@ -108,7 +108,7 @@
EntityID: entityID,
Attributes: me.AttributeValueMap{
"ManagedEntityId": entityID,
- "EquipmentId": toOctets("BBSM", 20),
+ "EquipmentId": toOctets("12345123451234512345", 20),
"OpticalNetworkUnitManagementAndControlChannelOmccVersion": 180,
"VendorProductCode": 0,
"SecurityCapability": 1,
@@ -198,7 +198,7 @@
},
Attributes: me.AttributeValueMap{
"ManagedEntityId": 0,
- "Version": toOctets("v0.0.1", 14),
+ "Version": toOctets("00000000000001", 14),
"IsCommitted": 1,
"IsActive": 1,
"IsValid": 1,
diff --git a/internal/common/omci/mib_test.go b/internal/common/omci/mib_test.go
index a55eeeb..f569bce 100644
--- a/internal/common/omci/mib_test.go
+++ b/internal/common/omci/mib_test.go
@@ -77,13 +77,14 @@
want mibExpected
}{
{"mibUploadNext-0", createTestMibUploadNextArgs(t, 1, 0),
- mibExpected{messageType: omci.MibUploadNextResponseType, entityID: 0, transactionId: 1, entityClass: me.OnuDataClassID, attributes: map[string]interface{}{"MibDataSync": MDS}}},
+
+ mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 1, entityID: 0, entityClass: me.OnuDataClassID, attributes: map[string]interface{}{"MibDataSync": MDS}}},
{"mibUploadNext-1", createTestMibUploadNextArgs(t, 2, 1),
- mibExpected{messageType: omci.MibUploadNextResponseType, entityID: 0, transactionId: 2, entityClass: me.CircuitPackClassID, attributes: map[string]interface{}{"Type": uint8(47), "NumberOfPorts": uint8(4)}}},
+ mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 2, entityID: 257, entityClass: me.CircuitPackClassID, attributes: map[string]interface{}{"Type": uint8(47), "NumberOfPorts": uint8(4)}}},
{"mibUploadNext-4", createTestMibUploadNextArgs(t, 3, 4),
- mibExpected{messageType: omci.MibUploadNextResponseType, entityID: 0, transactionId: 3, entityClass: me.CircuitPackClassID, attributes: map[string]interface{}{"PowerShedOverride": uint32(0)}}},
+ mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 3, entityID: 257, entityClass: me.CircuitPackClassID, attributes: map[string]interface{}{"PowerShedOverride": uint32(0)}}},
{"mibUploadNext-10", createTestMibUploadNextArgs(t, 4, 10),
- mibExpected{messageType: omci.MibUploadNextResponseType, entityID: 258, transactionId: 4, entityClass: me.CircuitPackClassID, attributes: map[string]interface{}{"SensedType": uint8(47)}}},
+ mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 4, entityID: 258, entityClass: me.PhysicalPathTerminationPointEthernetUniClassID, attributes: map[string]interface{}{"SensedType": uint8(47)}}},
}
for _, tt := range tests {
@@ -111,5 +112,60 @@
}
})
}
+}
+type pqueueExpected struct {
+ entityId uint16
+ relatedPort uint32
+}
+
+func TestGeneratePriorityQueueMe(t *testing.T) {
+
+ tests := []struct {
+ name string
+ sequence uint16
+ want pqueueExpected
+ }{
+ {"generate-pq-downstream-1", 26,
+ pqueueExpected{entityId: 1, relatedPort: 16842752}},
+ {"generate-pq-downstream-2", 30,
+ pqueueExpected{entityId: 2, relatedPort: 16842753}},
+ {"generate-pq-downstream-3", 58,
+ pqueueExpected{entityId: 9, relatedPort: 16842760}},
+ {"generate-pq-upstream-1", 28,
+ pqueueExpected{entityId: 32769, relatedPort: 2147549184}},
+ {"generate-pq-upstream-2", 32,
+ pqueueExpected{entityId: 32770, relatedPort: 2147549185}},
+ {"generate-pq-upstream-3", 60,
+ pqueueExpected{entityId: 32777, relatedPort: 2147614720}},
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ reportedMe, meErr := GeneratePriorityQueueMe(tt.sequence)
+ if meErr.GetError() != nil {
+ t.Fatal(meErr.Error())
+ }
+
+ assert.Equal(t, reportedMe.GetEntityID(), tt.want.entityId)
+
+ relatedPort, _ := reportedMe.GetAttribute("RelatedPort")
+ assert.Equal(t, relatedPort, tt.want.relatedPort)
+ })
+ }
+
+ // test that the related ports are unique
+ allRelatedPorts := make(map[uint32]struct{})
+ for v := 26; v <= 281; v++ {
+ reportedMe, meErr := GeneratePriorityQueueMe(uint16(v))
+ if meErr.GetError() != nil {
+ t.Fatal(meErr.Error())
+ }
+ relatedPort, _ := reportedMe.GetAttribute("RelatedPort")
+ allRelatedPorts[relatedPort.(uint32)] = struct{}{}
+ }
+
+ // we report 128 queues total, but each of them is comprised of 2 messages
+ // that's why the 256 iterations
+ assert.Equal(t, len(allRelatedPorts), 128)
}
diff --git a/internal/common/omci/mibpackets.go b/internal/common/omci/mibpackets.go
index 5e25d7f..6d22200 100755
--- a/internal/common/omci/mibpackets.go
+++ b/internal/common/omci/mibpackets.go
@@ -18,26 +18,28 @@
import (
"errors"
+ "fmt"
"github.com/google/gopacket"
"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",
})
-const galEthernetEID = uint16(1)
-const maxGemPayloadSize = uint16(48)
-const gemEID = uint16(1)
-
-type txFrameCreator func() ([]byte, error)
-type rxFrameParser func(gopacket.Packet) error
-
-type ServiceStep struct {
- MakeTxFrame txFrameCreator
- RxHandler rxFrameParser
+// 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
@@ -181,101 +183,107 @@
"CommandSequenceNumber": msgObj.CommandSequenceNumber,
}).Trace("received-omci-mibUploadNext-request")
- // depending on the sequenceNumber we'll report a different
- reportedMe := &me.ManagedEntity{}
+ var reportedMe *me.ManagedEntity
var meErr me.OmciErrors
- //var entityInstance uint16
+
switch msgObj.CommandSequenceNumber {
case 0:
reportedMe, meErr = me.NewOnuData(me.ParamData{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.OnuDataClassID,
- "MibDataSync": mds,
+ "MibDataSync": mds,
}})
if meErr.GetError() != nil {
omciLogger.Errorf("NewOnuData %v", meErr.Error())
}
case 1:
- reportedMe, meErr = me.NewCircuitPack(me.ParamData{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.CircuitPackClassID,
- "Type": 47,
- "NumberOfPorts": 4,
- "SerialNumber": toOctets("BBSM-Circuit-Pack", 20),
- "Version": toOctets("v0.0.1", 20),
- }})
+ 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())
}
case 2:
- reportedMe, meErr = me.NewCircuitPack(me.ParamData{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.CircuitPackClassID,
- "VendorId": "ONF",
- "AdministrativeState": 0,
- "OperationalState": 0,
- "BridgedOrIpInd": 0,
- }})
+ 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{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.CircuitPackClassID,
- "EquipmentId": toOctets("BBSM-Circuit-Pack", 20),
- "CardConfiguration": 0,
- "TotalTContBufferNumber": 0,
- "TotalPriorityQueueNumber": 8,
- "TotalTrafficSchedulerNumber": 0,
- }})
+ 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{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.CircuitPackClassID,
- "PowerShedOverride": uint32(0),
- }})
+ 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{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.CircuitPackClassID,
- "Type": 238,
- "NumberOfPorts": 1,
- "SerialNumber": toOctets("BBSM-Circuit-Pack-2", 20),
- "Version": toOctets("v0.0.1", 20),
- }})
+ 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{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.CircuitPackClassID,
- "VendorId": "ONF",
- "AdministrativeState": 0,
- "OperationalState": 0,
- "BridgedOrIpInd": 0,
- }})
+ 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{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.CircuitPackClassID,
- "EquipmentId": toOctets("BBSM-Circuit-Pack", 20),
- "CardConfiguration": 0,
- "TotalTContBufferNumber": 8,
- "TotalPriorityQueueNumber": 40,
- "TotalTrafficSchedulerNumber": 10,
- }})
+ 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{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.CircuitPackClassID,
- "PowerShedOverride": uint32(0),
- }})
+ 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())
}
@@ -305,47 +313,57 @@
omciLogger.Errorf("NewPhysicalPathTerminationPointEthernetUni %v", meErr.Error())
}
case 13, 14, 15, 16, 17, 18, 19, 20:
- // TODO report different MeID (see omci-sim pcap filter "frame[22:2] == 01:06")
- reportedMe, meErr = me.NewTCont(me.ParamData{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.TContClassID,
- "AllocId": 0,
- }})
+ 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{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.AniGClassID,
- "SrIndication": 1,
- "TotalTcontNumber": 8,
- "GemBlockLength": 30,
- "PiggybackDbaReporting": 0,
- "Deprecated": 0,
- "SignalFailThreshold": 5,
- "SignalDegradeThreshold": 9,
- "Arc": 0,
- "ArcInterval": 0,
- "OpticalSignalLevel": 57428,
- "LowerOpticalThreshold": 255,
- "UpperOpticalThreshold": 255,
- "OnuResponseTime": 0,
- "TransmitOpticalLevel": 3171,
- "LowerTransmitPowerThreshold": 129,
- "UpperTransmitPowerThreshold": 129,
- }})
+ 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:
- // TODO report different MeID (see omci-sim pcap filter "frame[22:2] == 01:08")
- reportedMe, meErr = me.NewUniG(me.ParamData{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.UniGClassID,
- "Deprecated": 0,
- "AdministrativeState": 0,
- }})
+ // 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,
@@ -353,24 +371,27 @@
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:
- case 27, 31, 35, 39, 43, 47, 51, 55,
+ 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:
- case 28, 32, 36, 40, 44, 48, 52, 56,
+ 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:
- case 29, 33, 37, 41, 45, 49, 53, 57,
+ 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,
@@ -378,28 +399,15 @@
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 = me.NewPriorityQueue(me.ParamData{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.PriorityQueueClassID,
- "QueueConfigurationOption": 0,
- "MaximumQueueSize": 100,
- "AllocatedQueueSize": 100,
- "DiscardBlockCounterResetInterval": 0,
- "ThresholdValueForDiscardedBlocksDueToBufferOverflow": 0,
- "RelatedPort": 80010000, // does this need to change?
- "TrafficSchedulerPointer": 8008, // does this need to change?
- "Weight": 1,
- "BackPressureOperation": 1,
- "BackPressureTime": 0,
- "BackPressureOccurQueueThreshold": 0,
- "BackPressureClearQueueThreshold": 0,
- }})
+
+ 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{
- "ManagedEntityId": me.TrafficSchedulerClassID,
- "TContPointer": 8008, // NOTE does this need to change?
+ "TContPointer": 32768, // NOTE does this need to change?
"TrafficSchedulerPointer": 0,
"Policy": 02,
"PriorityWeight": 0,
@@ -409,12 +417,15 @@
}
case 290:
reportedMe, meErr = me.NewOnu2G(me.ParamData{Attributes: me.AttributeValueMap{
- "ManagedEntityId": me.Onu2GClassID,
- "TotalPriorityQueueNumber": 40,
- "SecurityMode": 1,
- "TotalTrafficSchedulerNumber": 8,
- "TotalGemPortIdNumber": 0,
- "Sysuptime": 0,
+ "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())
@@ -446,3 +457,83 @@
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,
+ },
+ })
+}