Added support for OF 1.0
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / OF10QueueGetConfigReplyMessageFactory.java
diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/OF10QueueGetConfigReplyMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/OF10QueueGetConfigReplyMessageFactory.java
new file mode 100644 (file)
index 0000000..eced791
--- /dev/null
@@ -0,0 +1,95 @@
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import java.util.ArrayList;\r
+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.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
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutputBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.get.config.reply.Queues;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.get.config.reply.QueuesBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueueProperty;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueuePropertyBuilder;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OF10QueueGetConfigReplyMessageFactory implements OFDeserializer<GetQueueConfigOutput> {\r
+\r
+    private static final byte PADDING_IN_QUEUE_GET_CONFIG_REPLY_HEADER = 6;\r
+    private static final byte PADDING_IN_PACKET_QUEUE_HEADER = 2;\r
+    private static final byte PADDING_IN_QUEUE_PROPERTY_HEADER = 4;\r
+    private static final byte PADDING_IN_RATE_QUEUE_PROPERTY = 6;\r
+    private static final byte PACKET_QUEUE_LENGTH = 16;\r
+\r
+    private static OF10QueueGetConfigReplyMessageFactory instance;\r
+    \r
+    private OF10QueueGetConfigReplyMessageFactory() {\r
+        // singleton\r
+    }\r
+    \r
+    /**\r
+     * \r
+     * @return singleton factory\r
+     */\r
+    public static synchronized OF10QueueGetConfigReplyMessageFactory getInstance(){\r
+        \r
+        if(instance == null){\r
+            instance = new OF10QueueGetConfigReplyMessageFactory();\r
+        }\r
+        return instance;\r
+    }\r
+    \r
+    @Override\r
+    public GetQueueConfigOutput bufferToMessage(ByteBuf rawMessage, short version) {\r
+        GetQueueConfigOutputBuilder builder = new GetQueueConfigOutputBuilder();\r
+        builder.setVersion(version);\r
+        builder.setXid((rawMessage.readUnsignedInt()));\r
+        builder.setPort(new PortNumber(new Long(rawMessage.readUnsignedShort())));\r
+        rawMessage.skipBytes(PADDING_IN_QUEUE_GET_CONFIG_REPLY_HEADER);\r
+        builder.setQueues(createQueuesList(rawMessage));\r
+        return builder.build();\r
+    }\r
+    \r
+    private static List<Queues> createQueuesList(ByteBuf input){\r
+        List<Queues> queuesList = new ArrayList<>();\r
+        while (input.readableBytes() > 0) {\r
+            QueuesBuilder queueBuilder = new QueuesBuilder();\r
+            queueBuilder.setQueueId(new QueueId(input.readUnsignedInt()));\r
+            int length = input.readUnsignedShort();\r
+            input.skipBytes(PADDING_IN_PACKET_QUEUE_HEADER);\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 input, int length){\r
+        int propertiesLength = length;\r
+        List<QueueProperty> propertiesList = new ArrayList<>();\r
+        while (propertiesLength > 0) {\r
+            QueuePropertyBuilder propertiesBuilder = new QueuePropertyBuilder();\r
+            QueueProperties property = QueueProperties.forValue(input.readUnsignedShort());\r
+            propertiesBuilder.setProperty(property);\r
+            propertiesLength -= input.readUnsignedShort();\r
+            input.skipBytes(PADDING_IN_QUEUE_PROPERTY_HEADER);\r
+            if (property.equals(QueueProperties.OFPQTMINRATE)) {\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
+            }\r
+            propertiesList.add(propertiesBuilder.build());\r
+        }\r
+        return propertiesList;\r
+    }\r
+} 
\ No newline at end of file