Added support for OF 1.0
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / OF10StatsReplyMessageFactory.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.math.BigInteger;\r
7 import java.util.ArrayList;\r
8 import java.util.List;\r
9 \r
10 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
11 import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchDeserializer;\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregate;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateBuilder;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDesc;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescBuilder;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyExperimenter;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyExperimenterBuilder;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlow;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowBuilder;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStats;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsBuilder;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueue;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueBuilder;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTable;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableBuilder;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow.FlowStats;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow.FlowStatsBuilder;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats.PortStats;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats.PortStatsBuilder;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue.QueueStats;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue.QueueStatsBuilder;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.TableStats;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.TableStatsBuilder;\r
38 \r
39 /**\r
40  * @author michal.polkorab\r
41  *\r
42  */\r
43 public class OF10StatsReplyMessageFactory implements OFDeserializer<MultipartReplyMessage> {\r
44 \r
45     private static OF10StatsReplyMessageFactory instance;\r
46     \r
47     private OF10StatsReplyMessageFactory() {\r
48         // singleton\r
49     }\r
50     \r
51     /**\r
52      * @return singleton factory\r
53      */\r
54     public static synchronized OF10StatsReplyMessageFactory getInstance() {\r
55         if (instance == null){\r
56             instance = new OF10StatsReplyMessageFactory();\r
57         }\r
58         return instance;\r
59     }\r
60 \r
61     @Override\r
62     public MultipartReplyMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
63         MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();\r
64         builder.setVersion(version);\r
65         builder.setXid(rawMessage.readUnsignedInt());\r
66         int type = rawMessage.readUnsignedShort();\r
67         builder.setType(MultipartType.forValue(type));\r
68         builder.setFlags(new MultipartRequestFlags((rawMessage.readUnsignedShort() & 0x01) != 0));\r
69         while (rawMessage.readableBytes() > 0) {\r
70             switch (type) {\r
71             case 0:  builder.setMultipartReplyBody(setDesc(rawMessage));\r
72             break;\r
73             case 1:  builder.setMultipartReplyBody(setFlow(rawMessage));\r
74             break;\r
75             case 2:  builder.setMultipartReplyBody(setAggregate(rawMessage));\r
76             break;\r
77             case 3:  builder.setMultipartReplyBody(setTable(rawMessage));\r
78             break;         \r
79             case 4:  builder.setMultipartReplyBody(setPortStats(rawMessage));\r
80             break;\r
81             case 5:  builder.setMultipartReplyBody(setQueue(rawMessage));\r
82             break;         \r
83             case 0xFFFF: builder.setMultipartReplyBody(setExperimenter(rawMessage));\r
84             break;\r
85             default: \r
86                 break;\r
87             }\r
88         }\r
89         return builder.build();\r
90     }\r
91     \r
92     private static MultipartReplyDesc setDesc(ByteBuf input) {\r
93         final int DESC_STR_LEN = 256;\r
94         final int SERIAL_NUM_LEN = 32;\r
95         MultipartReplyDescBuilder descBuilder = new MultipartReplyDescBuilder();\r
96         byte[] mfrDescBytes = new byte[DESC_STR_LEN];\r
97         input.readBytes(mfrDescBytes);\r
98         String mfrDesc = new String(mfrDescBytes);\r
99         descBuilder.setMfrDesc(mfrDesc.trim());\r
100         byte[] hwDescBytes = new byte[DESC_STR_LEN];\r
101         input.readBytes(hwDescBytes);\r
102         String hwDesc = new String(hwDescBytes);\r
103         descBuilder.setHwDesc(hwDesc.trim());\r
104         byte[] swDescBytes = new byte[DESC_STR_LEN];\r
105         input.readBytes(swDescBytes);\r
106         String swDesc = new String(swDescBytes);\r
107         descBuilder.setSwDesc(swDesc.trim());\r
108         byte[] serialNumBytes = new byte[SERIAL_NUM_LEN];\r
109         input.readBytes(serialNumBytes);\r
110         String serialNum = new String(serialNumBytes);\r
111         descBuilder.setSerialNum(serialNum.trim());\r
112         byte[] dpDescBytes = new byte[DESC_STR_LEN];\r
113         input.readBytes(dpDescBytes);\r
114         String dpDesc = new String(dpDescBytes);\r
115         descBuilder.setDpDesc(dpDesc.trim());\r
116         return descBuilder.build();\r
117     }\r
118     \r
119     private static MultipartReplyFlow setFlow(ByteBuf input) {\r
120         final byte PADDING_IN_FLOW_STATS_HEADER_01 = 1;\r
121         final byte PADDING_IN_FLOW_STATS_HEADER_02 = 6;\r
122         MultipartReplyFlowBuilder flowBuilder = new MultipartReplyFlowBuilder();\r
123         List<FlowStats> flowStatsList = new ArrayList<>();\r
124         FlowStatsBuilder flowStatsBuilder = new FlowStatsBuilder();\r
125         int length = input.readUnsignedShort();\r
126         flowStatsBuilder.setTableId(input.readUnsignedByte());\r
127         input.skipBytes(PADDING_IN_FLOW_STATS_HEADER_01);\r
128         flowStatsBuilder.setMatchV10(OF10MatchDeserializer.createMatchV10(input));\r
129         flowStatsBuilder.setDurationSec(input.readUnsignedInt());\r
130         flowStatsBuilder.setDurationNsec(input.readUnsignedInt());\r
131         flowStatsBuilder.setPriority(input.readUnsignedShort());\r
132         flowStatsBuilder.setIdleTimeout(input.readUnsignedShort());\r
133         flowStatsBuilder.setHardTimeout(input.readUnsignedShort());\r
134         input.skipBytes(PADDING_IN_FLOW_STATS_HEADER_02);\r
135         byte[] cookie = new byte[Long.SIZE/Byte.SIZE];\r
136         input.readBytes(cookie);\r
137         flowStatsBuilder.setCookie(new BigInteger(cookie));\r
138         byte[] packetCount = new byte[Long.SIZE/Byte.SIZE];\r
139         input.readBytes(packetCount);\r
140         flowStatsBuilder.setPacketCount(new BigInteger(packetCount));\r
141         byte[] byteCount = new byte[Long.SIZE/Byte.SIZE];\r
142         input.readBytes(byteCount);\r
143         flowStatsBuilder.setByteCount(new BigInteger(byteCount));\r
144         //TODO - actions\r
145         //flowStatsBuilder.setActionsList(OF10ActionsDeserializer.)\r
146         flowStatsList.add(flowStatsBuilder.build());\r
147         flowBuilder.setFlowStats(new ArrayList<>(flowStatsList));\r
148         flowStatsList.clear();\r
149         return flowBuilder.build();\r
150     }\r
151     \r
152     private static MultipartReplyAggregate setAggregate(ByteBuf input) {\r
153         final byte PADDING_IN_AGGREGATE_HEADER = 4;\r
154         MultipartReplyAggregateBuilder builder = new MultipartReplyAggregateBuilder();\r
155         byte[] packetCount = new byte[Long.SIZE/Byte.SIZE];\r
156         input.readBytes(packetCount);\r
157         builder.setPacketCount(new BigInteger(packetCount));\r
158         byte[] byteCount = new byte[Long.SIZE/Byte.SIZE];\r
159         input.readBytes(byteCount);\r
160         builder.setByteCount(new BigInteger(byteCount));\r
161         builder.setFlowCount(input.readUnsignedInt());\r
162         input.skipBytes(PADDING_IN_AGGREGATE_HEADER);\r
163         return builder.build();\r
164     }\r
165     \r
166     private static MultipartReplyTable setTable(ByteBuf input) {\r
167         final byte PADDING_IN_TABLE_HEADER = 3;\r
168         final byte MAX_TABLE_NAME_LENGTH = 32;\r
169         MultipartReplyTableBuilder builder = new MultipartReplyTableBuilder();\r
170         TableStatsBuilder tableStatsBuilder = new TableStatsBuilder();\r
171         List<TableStats> tableStatsList = new ArrayList<>();\r
172         tableStatsBuilder.setTableId(input.readUnsignedByte());\r
173         input.skipBytes(PADDING_IN_TABLE_HEADER);\r
174         tableStatsBuilder.setName(input.readBytes(MAX_TABLE_NAME_LENGTH).toString());\r
175         tableStatsBuilder.setActiveCount(input.readUnsignedInt());\r
176         byte[] lookupCount = new byte[Long.SIZE/Byte.SIZE];\r
177         input.readBytes(lookupCount);\r
178         tableStatsBuilder.setLookupCount(new BigInteger(lookupCount));\r
179         byte[] matchedCount = new byte[Long.SIZE/Byte.SIZE];\r
180         input.readBytes(matchedCount);\r
181         tableStatsBuilder.setMatchedCount(new BigInteger(matchedCount));\r
182         \r
183         tableStatsList.add(tableStatsBuilder.build());\r
184         builder.setTableStats(new ArrayList<>(tableStatsList));\r
185         tableStatsList.clear();\r
186         return builder.build();\r
187     }\r
188     \r
189     private static MultipartReplyPortStats setPortStats(ByteBuf input) {\r
190         final byte PADDING_IN_PORT_STATS_HEADER = 4;\r
191         MultipartReplyPortStatsBuilder builder = new MultipartReplyPortStatsBuilder();\r
192         PortStatsBuilder portStatsBuilder = new PortStatsBuilder();\r
193         List<PortStats> portStatsList = new ArrayList<>();\r
194         while (input.readableBytes() > 0) {\r
195             portStatsBuilder.setPortNo(input.readUnsignedInt());\r
196             input.skipBytes(PADDING_IN_PORT_STATS_HEADER);\r
197             \r
198             byte[] rxPackets = new byte[Long.SIZE/Byte.SIZE];\r
199             input.readBytes(rxPackets);\r
200             portStatsBuilder.setRxPackets(new BigInteger(rxPackets));\r
201             \r
202             byte[] txPackets = new byte[Long.SIZE/Byte.SIZE];\r
203             input.readBytes(txPackets);\r
204             portStatsBuilder.setTxPackets(new BigInteger(txPackets));\r
205             \r
206             byte[] rxBytes = new byte[Long.SIZE/Byte.SIZE];\r
207             input.readBytes(rxBytes);\r
208             portStatsBuilder.setRxBytes(new BigInteger(rxBytes));\r
209             \r
210             byte[] txBytes = new byte[Long.SIZE/Byte.SIZE];\r
211             input.readBytes(txBytes);\r
212             portStatsBuilder.setTxBytes(new BigInteger(txBytes));\r
213             \r
214             byte[] rxDropped = new byte[Long.SIZE/Byte.SIZE];\r
215             input.readBytes(rxDropped);\r
216             portStatsBuilder.setRxDropped(new BigInteger(rxDropped));\r
217             \r
218             byte[] txDropped = new byte[Long.SIZE/Byte.SIZE];\r
219             input.readBytes(txDropped);\r
220             portStatsBuilder.setTxDropped(new BigInteger(txDropped));\r
221             \r
222             byte[] rxErrors = new byte[Long.SIZE/Byte.SIZE];\r
223             input.readBytes(rxErrors);\r
224             portStatsBuilder.setRxErrors(new BigInteger(rxErrors));\r
225             \r
226             byte[] txErrors = new byte[Long.SIZE/Byte.SIZE];\r
227             input.readBytes(txErrors);\r
228             portStatsBuilder.setTxErrors(new BigInteger(txErrors));\r
229             \r
230             byte[] rxFrameErr = new byte[Long.SIZE/Byte.SIZE];\r
231             input.readBytes(rxFrameErr);\r
232             portStatsBuilder.setRxFrameErr(new BigInteger(rxFrameErr));\r
233             \r
234             byte[] rxOverErr = new byte[Long.SIZE/Byte.SIZE];\r
235             input.readBytes(rxOverErr);\r
236             portStatsBuilder.setRxOverErr(new BigInteger(rxOverErr));\r
237             \r
238             byte[] rxCrcErr = new byte[Long.SIZE/Byte.SIZE];\r
239             input.readBytes(rxCrcErr);\r
240             portStatsBuilder.setRxCrcErr(new BigInteger(rxCrcErr));\r
241             \r
242             byte[] collisions = new byte[Long.SIZE/Byte.SIZE];\r
243             input.readBytes(collisions);\r
244             portStatsBuilder.setCollisions(new BigInteger(collisions));\r
245             \r
246             portStatsBuilder.setDurationSec(input.readUnsignedInt());\r
247             portStatsBuilder.setDurationNsec(input.readUnsignedInt());\r
248             portStatsList.add(portStatsBuilder.build());\r
249         }\r
250         builder.setPortStats(new ArrayList<>(portStatsList));\r
251         portStatsList.clear();\r
252         return builder.build();\r
253     }\r
254     \r
255     private static MultipartReplyQueue setQueue(ByteBuf input) {\r
256         MultipartReplyQueueBuilder builder = new MultipartReplyQueueBuilder();\r
257         QueueStatsBuilder queueStatsBuilder = new QueueStatsBuilder();\r
258         List<QueueStats> queueStatsList = new ArrayList<>();\r
259         \r
260         while (input.readableBytes() > 0) {\r
261             queueStatsBuilder.setPortNo(input.readUnsignedInt());\r
262             queueStatsBuilder.setQueueId(input.readUnsignedInt());\r
263 \r
264             byte[] txBytes = new byte[Long.SIZE/Byte.SIZE];\r
265             input.readBytes(txBytes);\r
266             queueStatsBuilder.setTxBytes(new BigInteger(txBytes));\r
267 \r
268             byte[] txPackets = new byte[Long.SIZE/Byte.SIZE];\r
269             input.readBytes(txPackets);\r
270             queueStatsBuilder.setTxPackets(new BigInteger(txPackets));\r
271 \r
272             byte[] txErrors = new byte[Long.SIZE/Byte.SIZE];\r
273             input.readBytes(txErrors);\r
274             queueStatsBuilder.setTxErrors(new BigInteger(txErrors));\r
275 \r
276             queueStatsBuilder.setDurationSec(input.readUnsignedInt());\r
277             queueStatsBuilder.setDurationNsec(input.readUnsignedInt());\r
278             queueStatsList.add(queueStatsBuilder.build());\r
279         }\r
280         builder.setQueueStats(new ArrayList<>(queueStatsList));\r
281         queueStatsList.clear();\r
282         return builder.build();\r
283     }\r
284     \r
285     private static MultipartReplyExperimenter setExperimenter(ByteBuf input) {\r
286         MultipartReplyExperimenterBuilder builder = new MultipartReplyExperimenterBuilder();\r
287         builder.setExperimenter(input.readUnsignedInt());\r
288         builder.setExpType(input.readUnsignedInt());\r
289         byte[] data = new byte[Long.SIZE/Byte.SIZE];\r
290         input.readBytes(data);\r
291         builder.setData(data);\r
292         return builder.build();\r
293     }\r
294 }\r