Added support for OF 1.0
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / QueueGetConfigReplyMessageFactory.java
index bec0c57f813d713fe24c7601a18dc037cca8eb1a..ccef4a669795df28a92cb80d34d9a8d7881fd4d1 100644 (file)
@@ -7,6 +7,9 @@ import java.util.ArrayList;
 import java.util.List;\r
 \r
 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterQueuePropertyBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.RateQueueProperty;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.RateQueuePropertyBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueId;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueProperties;\r
@@ -23,10 +26,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
  */\r
 public class QueueGetConfigReplyMessageFactory implements OFDeserializer<GetQueueConfigOutput> {\r
 \r
-    private static QueueGetConfigReplyMessageFactory instance;\r
     private static final byte PADDING_IN_QUEUE_GET_CONFIG_REPLY_HEADER = 4;\r
     private static final byte PADDING_IN_PACKET_QUEUE_HEADER = 6;\r
     private static final byte PADDING_IN_QUEUE_PROPERTY_HEADER = 4;\r
+    private static final int PADDING_IN_RATE_QUEUE_PROPERTY = 6;\r
+    private static final int PADDING_IN_EXPERIMENTER_QUEUE_PROPERTY = 4;\r
+    private static final byte PACKET_QUEUE_LENGTH = 16;\r
+\r
+    private static QueueGetConfigReplyMessageFactory instance;\r
     \r
     private QueueGetConfigReplyMessageFactory() {\r
         // singleton\r
@@ -57,25 +64,43 @@ public class QueueGetConfigReplyMessageFactory implements OFDeserializer<GetQueu
     \r
     private static List<Queues> createQueuesList(ByteBuf input){\r
         List<Queues> queuesList = new ArrayList<>();\r
-        QueuesBuilder queueBuilder = new QueuesBuilder();\r
         while (input.readableBytes() > 0) {\r
+            QueuesBuilder queueBuilder = new QueuesBuilder();\r
             queueBuilder.setQueueId(new QueueId(input.readUnsignedInt()));\r
             queueBuilder.setPort(new PortNumber(input.readUnsignedInt()));\r
-            input.skipBytes(2);\r
+            int length = input.readUnsignedShort();\r
             input.skipBytes(PADDING_IN_PACKET_QUEUE_HEADER);\r
-            queueBuilder.setQueueProperty(createPropertiesList(input));\r
+            queueBuilder.setQueueProperty(createPropertiesList(input, length - PACKET_QUEUE_LENGTH));\r
             queuesList.add(queueBuilder.build());\r
         } \r
         return queuesList;\r
     }\r
     \r
-    private static List<QueueProperty> createPropertiesList(ByteBuf propertiesInput){\r
+    private static List<QueueProperty> createPropertiesList(ByteBuf input, int length){\r
+        int propertiesLength = length;\r
         List<QueueProperty> propertiesList = new ArrayList<>();\r
-        QueuePropertyBuilder propertiesBuilder = new QueuePropertyBuilder();\r
-        propertiesBuilder.setProperty(QueueProperties.forValue(propertiesInput.readUnsignedShort()));\r
-        propertiesInput.skipBytes(2);\r
-        propertiesInput.skipBytes(PADDING_IN_QUEUE_PROPERTY_HEADER);\r
-        propertiesList.add(propertiesBuilder.build());\r
+        while (propertiesLength > 0) {\r
+            QueuePropertyBuilder propertiesBuilder = new QueuePropertyBuilder();\r
+            QueueProperties property = QueueProperties.forValue(input.readUnsignedShort());\r
+            propertiesBuilder.setProperty(property);\r
+            int currentPropertyLength = input.readUnsignedShort();\r
+            propertiesLength -= currentPropertyLength;\r
+            input.skipBytes(PADDING_IN_QUEUE_PROPERTY_HEADER);\r
+            if (property.equals(QueueProperties.OFPQTMINRATE) || property.equals(QueueProperties.OFPQTMAXRATE)) {\r
+                RateQueuePropertyBuilder rateBuilder = new RateQueuePropertyBuilder();\r
+                rateBuilder.setRate(input.readUnsignedShort());\r
+                propertiesBuilder.addAugmentation(RateQueueProperty.class, rateBuilder.build());\r
+                input.skipBytes(PADDING_IN_RATE_QUEUE_PROPERTY);\r
+            } else if (property.equals(QueueProperties.OFPQTEXPERIMENTER)) {\r
+                ExperimenterQueuePropertyBuilder expBuilder = new ExperimenterQueuePropertyBuilder();\r
+                expBuilder.setExperimenter(input.readUnsignedInt());\r
+                input.skipBytes(PADDING_IN_EXPERIMENTER_QUEUE_PROPERTY);\r
+                expBuilder.setData(input.readBytes(currentPropertyLength\r
+                        - Integer.SIZE / Byte.SIZE - PADDING_IN_EXPERIMENTER_QUEUE_PROPERTY).array());\r
+                propertiesBuilder.addAugmentation(RateQueueProperty.class, expBuilder.build());\r
+            }\r
+            propertiesList.add(propertiesBuilder.build());\r
+        }\r
         return propertiesList;\r
     }\r
 \r