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