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