Merge "Fixing OF Multipart messages 1) So we have a MultipartRequestDesc message...
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / QueueGetConfigReplyMessageFactory.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 \r
6 import java.util.ArrayList;\r
7 import java.util.List;\r
8 \r
9 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterQueuePropertyBuilder;\r
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.RateQueueProperty;\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.RateQueuePropertyBuilder;\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueId;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueProperties;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutputBuilder;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.get.config.reply.Queues;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.get.config.reply.QueuesBuilder;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueueProperty;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueuePropertyBuilder;\r
22 \r
23 /**\r
24  * Translates QueueGetConfigReply messages\r
25  * @author timotej.kubas\r
26  * @author michal.polkorab\r
27  */\r
28 public class QueueGetConfigReplyMessageFactory implements OFDeserializer<GetQueueConfigOutput> {\r
29 \r
30     private static final byte PADDING_IN_QUEUE_GET_CONFIG_REPLY_HEADER = 4;\r
31     private static final byte PADDING_IN_PACKET_QUEUE_HEADER = 6;\r
32     private static final byte PADDING_IN_QUEUE_PROPERTY_HEADER = 4;\r
33     private static final int PADDING_IN_RATE_QUEUE_PROPERTY = 6;\r
34     private static final int PADDING_IN_EXPERIMENTER_QUEUE_PROPERTY = 4;\r
35     private static final byte PACKET_QUEUE_LENGTH = 16;\r
36 \r
37     private static QueueGetConfigReplyMessageFactory instance;\r
38     \r
39     private QueueGetConfigReplyMessageFactory() {\r
40         // singleton\r
41     }\r
42     \r
43     /**\r
44      * \r
45      * @return singleton factory\r
46      */\r
47     public static synchronized QueueGetConfigReplyMessageFactory getInstance(){\r
48         \r
49         if(instance == null){\r
50             instance = new QueueGetConfigReplyMessageFactory();\r
51         }\r
52         return instance;\r
53     }\r
54     \r
55     @Override\r
56     public GetQueueConfigOutput bufferToMessage(ByteBuf rawMessage, short version) {\r
57         GetQueueConfigOutputBuilder builder = new GetQueueConfigOutputBuilder();\r
58         builder.setVersion(version);\r
59         builder.setXid((rawMessage.readUnsignedInt()));\r
60         builder.setPort(new PortNumber(rawMessage.readUnsignedInt()));\r
61         rawMessage.skipBytes(PADDING_IN_QUEUE_GET_CONFIG_REPLY_HEADER);\r
62         builder.setQueues(createQueuesList(rawMessage));\r
63         return builder.build();\r
64     }\r
65     \r
66     private static List<Queues> createQueuesList(ByteBuf input){\r
67         List<Queues> queuesList = new ArrayList<>();\r
68         while (input.readableBytes() > 0) {\r
69             QueuesBuilder queueBuilder = new QueuesBuilder();\r
70             queueBuilder.setQueueId(new QueueId(input.readUnsignedInt()));\r
71             queueBuilder.setPort(new PortNumber(input.readUnsignedInt()));\r
72             int length = input.readUnsignedShort();\r
73             input.skipBytes(PADDING_IN_PACKET_QUEUE_HEADER);\r
74             queueBuilder.setQueueProperty(createPropertiesList(input, length - PACKET_QUEUE_LENGTH));\r
75             queuesList.add(queueBuilder.build());\r
76         } \r
77         return queuesList;\r
78     }\r
79     \r
80     private static List<QueueProperty> createPropertiesList(ByteBuf input, int length){\r
81         int propertiesLength = length;\r
82         List<QueueProperty> propertiesList = new ArrayList<>();\r
83         while (propertiesLength > 0) {\r
84             QueuePropertyBuilder propertiesBuilder = new QueuePropertyBuilder();\r
85             QueueProperties property = QueueProperties.forValue(input.readUnsignedShort());\r
86             propertiesBuilder.setProperty(property);\r
87             int currentPropertyLength = input.readUnsignedShort();\r
88             propertiesLength -= currentPropertyLength;\r
89             input.skipBytes(PADDING_IN_QUEUE_PROPERTY_HEADER);\r
90             if (property.equals(QueueProperties.OFPQTMINRATE) || property.equals(QueueProperties.OFPQTMAXRATE)) {\r
91                 RateQueuePropertyBuilder rateBuilder = new RateQueuePropertyBuilder();\r
92                 rateBuilder.setRate(input.readUnsignedShort());\r
93                 propertiesBuilder.addAugmentation(RateQueueProperty.class, rateBuilder.build());\r
94                 input.skipBytes(PADDING_IN_RATE_QUEUE_PROPERTY);\r
95             } else if (property.equals(QueueProperties.OFPQTEXPERIMENTER)) {\r
96                 ExperimenterQueuePropertyBuilder expBuilder = new ExperimenterQueuePropertyBuilder();\r
97                 expBuilder.setExperimenter(input.readUnsignedInt());\r
98                 input.skipBytes(PADDING_IN_EXPERIMENTER_QUEUE_PROPERTY);\r
99                 expBuilder.setData(input.readBytes(currentPropertyLength\r
100                         - Integer.SIZE / Byte.SIZE - PADDING_IN_EXPERIMENTER_QUEUE_PROPERTY).array());\r
101                 propertiesBuilder.addAugmentation(RateQueueProperty.class, expBuilder.build());\r
102             }\r
103             propertiesList.add(propertiesBuilder.build());\r
104         }\r
105         return propertiesList;\r
106     }\r
107 \r
108 }\r