Javadoc update
[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  * Translates StatsReply messages (OpenFlow v1.0)\r
42  * @author michal.polkorab\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         while (input.readableBytes() > 0) {\r
124             FlowStatsBuilder flowStatsBuilder = new FlowStatsBuilder();\r
125             input.skipBytes(Short.SIZE / Byte.SIZE);\r
126             flowStatsBuilder.setTableId(input.readUnsignedByte());\r
127             input.skipBytes(PADDING_IN_FLOW_STATS_HEADER);\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             flowStatsBuilder.setActionsList(OF10ActionsDeserializer.createActionsList(input));\r
145             flowStatsList.add(flowStatsBuilder.build());\r
146         }\r
147         flowBuilder.setFlowStats(flowStatsList);\r
148         return flowBuilder.build();\r
149     }\r
150     \r
151     private static MultipartReplyAggregate setAggregate(ByteBuf input) {\r
152         final byte PADDING_IN_AGGREGATE_HEADER = 4;\r
153         MultipartReplyAggregateBuilder builder = new MultipartReplyAggregateBuilder();\r
154         byte[] packetCount = new byte[Long.SIZE/Byte.SIZE];\r
155         input.readBytes(packetCount);\r
156         builder.setPacketCount(new BigInteger(packetCount));\r
157         byte[] byteCount = new byte[Long.SIZE/Byte.SIZE];\r
158         input.readBytes(byteCount);\r
159         builder.setByteCount(new BigInteger(byteCount));\r
160         builder.setFlowCount(input.readUnsignedInt());\r
161         input.skipBytes(PADDING_IN_AGGREGATE_HEADER);\r
162         return builder.build();\r
163     }\r
164     \r
165     private static MultipartReplyTable setTable(ByteBuf input) {\r
166         final byte PADDING_IN_TABLE_HEADER = 3;\r
167         final byte MAX_TABLE_NAME_LENGTH = 32;\r
168         MultipartReplyTableBuilder builder = new MultipartReplyTableBuilder();\r
169         List<TableStats> tableStatsList = new ArrayList<>();\r
170         while (input.readableBytes() > 0) {\r
171             TableStatsBuilder tableStatsBuilder = new TableStatsBuilder();\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             tableStatsList.add(tableStatsBuilder.build());\r
183         }\r
184         builder.setTableStats(tableStatsList);\r
185         return builder.build();\r
186     }\r
187     \r
188     private static MultipartReplyPortStats setPortStats(ByteBuf input) {\r
189         final byte PADDING_IN_PORT_STATS_HEADER = 6;\r
190         MultipartReplyPortStatsBuilder builder = new MultipartReplyPortStatsBuilder();\r
191         List<PortStats> portStatsList = new ArrayList<>();\r
192         while (input.readableBytes() > 0) {\r
193             PortStatsBuilder portStatsBuilder = new PortStatsBuilder();\r
194             portStatsBuilder.setPortNo((long) input.readUnsignedShort());\r
195             input.skipBytes(PADDING_IN_PORT_STATS_HEADER);\r
196             byte[] rxPackets = new byte[Long.SIZE/Byte.SIZE];\r
197             input.readBytes(rxPackets);\r
198             portStatsBuilder.setRxPackets(new BigInteger(rxPackets));\r
199             byte[] txPackets = new byte[Long.SIZE/Byte.SIZE];\r
200             input.readBytes(txPackets);\r
201             portStatsBuilder.setTxPackets(new BigInteger(txPackets));\r
202             byte[] rxBytes = new byte[Long.SIZE/Byte.SIZE];\r
203             input.readBytes(rxBytes);\r
204             portStatsBuilder.setRxBytes(new BigInteger(rxBytes));\r
205             byte[] txBytes = new byte[Long.SIZE/Byte.SIZE];\r
206             input.readBytes(txBytes);\r
207             portStatsBuilder.setTxBytes(new BigInteger(txBytes));\r
208             byte[] rxDropped = new byte[Long.SIZE/Byte.SIZE];\r
209             input.readBytes(rxDropped);\r
210             portStatsBuilder.setRxDropped(new BigInteger(rxDropped));\r
211             byte[] txDropped = new byte[Long.SIZE/Byte.SIZE];\r
212             input.readBytes(txDropped);\r
213             portStatsBuilder.setTxDropped(new BigInteger(txDropped));\r
214             byte[] rxErrors = new byte[Long.SIZE/Byte.SIZE];\r
215             input.readBytes(rxErrors);\r
216             portStatsBuilder.setRxErrors(new BigInteger(rxErrors));\r
217             byte[] txErrors = new byte[Long.SIZE/Byte.SIZE];\r
218             input.readBytes(txErrors);\r
219             portStatsBuilder.setTxErrors(new BigInteger(txErrors));\r
220             byte[] rxFrameErr = new byte[Long.SIZE/Byte.SIZE];\r
221             input.readBytes(rxFrameErr);\r
222             portStatsBuilder.setRxFrameErr(new BigInteger(rxFrameErr));\r
223             byte[] rxOverErr = new byte[Long.SIZE/Byte.SIZE];\r
224             input.readBytes(rxOverErr);\r
225             portStatsBuilder.setRxOverErr(new BigInteger(rxOverErr));\r
226             byte[] rxCrcErr = new byte[Long.SIZE/Byte.SIZE];\r
227             input.readBytes(rxCrcErr);\r
228             portStatsBuilder.setRxCrcErr(new BigInteger(rxCrcErr));\r
229             byte[] collisions = new byte[Long.SIZE/Byte.SIZE];\r
230             input.readBytes(collisions);\r
231             portStatsBuilder.setCollisions(new BigInteger(collisions));\r
232         }\r
233         builder.setPortStats(portStatsList);\r
234         return builder.build();\r
235     }\r
236     \r
237     private static MultipartReplyQueue setQueue(ByteBuf input) {\r
238         final byte PADDING_IN_QUEUE_HEADER = 2;\r
239         MultipartReplyQueueBuilder builder = new MultipartReplyQueueBuilder();\r
240         List<QueueStats> queueStatsList = new ArrayList<>();\r
241         while (input.readableBytes() > 0) {\r
242             QueueStatsBuilder queueStatsBuilder = new QueueStatsBuilder();\r
243             queueStatsBuilder.setPortNo((long) input.readUnsignedShort());\r
244             input.skipBytes(PADDING_IN_QUEUE_HEADER);\r
245             queueStatsBuilder.setQueueId(input.readUnsignedInt());\r
246             byte[] txBytes = new byte[Long.SIZE/Byte.SIZE];\r
247             input.readBytes(txBytes);\r
248             queueStatsBuilder.setTxBytes(new BigInteger(txBytes));\r
249             byte[] txPackets = new byte[Long.SIZE/Byte.SIZE];\r
250             input.readBytes(txPackets);\r
251             queueStatsBuilder.setTxPackets(new BigInteger(txPackets));\r
252             byte[] txErrors = new byte[Long.SIZE/Byte.SIZE];\r
253             input.readBytes(txErrors);\r
254             queueStatsBuilder.setTxErrors(new BigInteger(txErrors));\r
255             queueStatsList.add(queueStatsBuilder.build());\r
256         }\r
257         builder.setQueueStats(queueStatsList);\r
258         return builder.build();\r
259     }\r
260     \r
261     private static MultipartReplyExperimenter setExperimenter(ByteBuf input) {\r
262         MultipartReplyExperimenterBuilder builder = new MultipartReplyExperimenterBuilder();\r
263         builder.setExperimenter(input.readUnsignedInt());\r
264         byte[] data = new byte[Long.SIZE/Byte.SIZE];\r
265         input.readBytes(data);\r
266         builder.setData(data);\r
267         return builder.build();\r
268     }\r
269 }\r