Fix unused import warnings
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / statistics / SinglePurposeMultipartReplyTranslator.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.openflowplugin.impl.statistics;
9
10 import java.math.BigInteger;
11 import java.util.ArrayList;
12 import java.util.List;
13 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
14 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowStatsResponseConvertor;
15 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor;
16 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterStatsResponseConvertor;
17 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter64;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.AggregateFlowStatisticsUpdateBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowsStatisticsUpdateBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.FlowTableStatisticsUpdateBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMapBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.TransactionId;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.queue.rev130925.QueueId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupDescStatsUpdatedBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupFeaturesUpdatedBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupStatisticsUpdatedBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Chaining;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.ChainingChecks;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupAll;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupCapability;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupFf;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupIndirect;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupSelect;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupType;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectLiveness;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterConfigStatsUpdatedBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdatedBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterStatisticsUpdatedBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBand;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDrop;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDscpRemark;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBurst;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterCapability;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterKbps;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterPktps;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterStats;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.BytesBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.PacketsBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCase;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCase;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCase;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCase;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCase;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCase;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCase;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCase;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCase;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCase;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregate;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlow;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroup;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDesc;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeatures;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.MultipartReplyMeter;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.MultipartReplyMeterConfig;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeatures;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStats;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.multipart.reply.port.stats.PortStats;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueue;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStats;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTable;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStats;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.NodeConnectorStatisticsUpdateBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapKey;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.QueueStatisticsUpdateBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMap;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMapBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId;
90 import org.opendaylight.yangtools.yang.binding.DataObject;
91 import org.slf4j.Logger;
92 import org.slf4j.LoggerFactory;
93
94 /**
95  * Class converts multipart reply messages to the notification objects defined
96  * by statistics provider (manager ). It is ment to be replaced by translators
97  * and to be used for translating statistics data only.
98  *
99  * @author avishnoi@in.ibm.com
100  */
101 @Deprecated
102 public class SinglePurposeMultipartReplyTranslator {
103
104     protected static final Logger logger = LoggerFactory
105             .getLogger(SinglePurposeMultipartReplyTranslator.class);
106
107     private static FlowStatsResponseConvertor flowStatsConvertor = new FlowStatsResponseConvertor();
108     private static GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor();
109     private static MeterStatsResponseConvertor meterStatsConvertor = new MeterStatsResponseConvertor();
110
111
112     public List<DataObject> translate(final BigInteger datapathId, final short version, final OfHeader msg) {
113
114         List<DataObject> listDataObject = new ArrayList<>();
115
116         OpenflowVersion ofVersion = OpenflowVersion.get(version);
117
118         if (msg instanceof MultipartReplyMessage) {
119             MultipartReplyMessage mpReply = (MultipartReplyMessage) msg;
120             NodeId node = SinglePurposeMultipartReplyTranslator.nodeIdFromDatapathId(datapathId);
121             switch (mpReply.getType()) {
122                 case OFPMPFLOW: {
123                     FlowsStatisticsUpdateBuilder message = new FlowsStatisticsUpdateBuilder();
124                     message.setId(node);
125                     message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
126                     message.setTransactionId(generateTransactionId(mpReply.getXid()));
127                     MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase) mpReply.getMultipartReplyBody();
128                     MultipartReplyFlow replyBody = caseBody.getMultipartReplyFlow();
129                     message.setFlowAndStatisticsMapList(flowStatsConvertor.toSALFlowStatsList(replyBody.getFlowStats(), datapathId, ofVersion));
130
131                     listDataObject.add(message.build());
132                     return listDataObject;
133                 }
134                 case OFPMPAGGREGATE: {
135                     AggregateFlowStatisticsUpdateBuilder message = new AggregateFlowStatisticsUpdateBuilder();
136                     message.setId(node);
137                     message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
138                     message.setTransactionId(generateTransactionId(mpReply.getXid()));
139
140                     MultipartReplyAggregateCase caseBody = (MultipartReplyAggregateCase) mpReply.getMultipartReplyBody();
141                     MultipartReplyAggregate replyBody = caseBody.getMultipartReplyAggregate();
142                     message.setByteCount(new Counter64(replyBody.getByteCount()));
143                     message.setPacketCount(new Counter64(replyBody.getPacketCount()));
144                     message.setFlowCount(new Counter32(replyBody.getFlowCount()));
145
146                     listDataObject.add(message.build());
147                     return listDataObject;
148                 }
149                 case OFPMPPORTSTATS: {
150
151
152                     NodeConnectorStatisticsUpdateBuilder message = new NodeConnectorStatisticsUpdateBuilder();
153                     message.setId(node);
154                     message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
155                     message.setTransactionId(generateTransactionId(mpReply.getXid()));
156
157                     MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase) mpReply.getMultipartReplyBody();
158                     MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats();
159
160                     List<NodeConnectorStatisticsAndPortNumberMap> statsMap =
161                             new ArrayList<NodeConnectorStatisticsAndPortNumberMap>();
162                     for (PortStats portStats : replyBody.getPortStats()) {
163
164                         NodeConnectorStatisticsAndPortNumberMapBuilder statsBuilder =
165                                 new NodeConnectorStatisticsAndPortNumberMapBuilder();
166                         statsBuilder.setNodeConnectorId(
167                                 InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
168                                         portStats.getPortNo(), ofVersion));
169
170                         BytesBuilder bytesBuilder = new BytesBuilder();
171                         bytesBuilder.setReceived(portStats.getRxBytes());
172                         bytesBuilder.setTransmitted(portStats.getTxBytes());
173                         statsBuilder.setBytes(bytesBuilder.build());
174
175                         PacketsBuilder packetsBuilder = new PacketsBuilder();
176                         packetsBuilder.setReceived(portStats.getRxPackets());
177                         packetsBuilder.setTransmitted(portStats.getTxPackets());
178                         statsBuilder.setPackets(packetsBuilder.build());
179
180                         DurationBuilder durationBuilder = new DurationBuilder();
181                         if (portStats.getDurationSec() != null) {
182                             durationBuilder.setSecond(new Counter32(portStats.getDurationSec()));
183                         }
184                         if (portStats.getDurationNsec() != null) {
185                             durationBuilder.setNanosecond(new Counter32(portStats.getDurationNsec()));
186                         }
187                         statsBuilder.setDuration(durationBuilder.build());
188                         statsBuilder.setCollisionCount(portStats.getCollisions());
189                         statsBuilder.setKey(new NodeConnectorStatisticsAndPortNumberMapKey(statsBuilder.getNodeConnectorId()));
190                         statsBuilder.setReceiveCrcError(portStats.getRxCrcErr());
191                         statsBuilder.setReceiveDrops(portStats.getRxDropped());
192                         statsBuilder.setReceiveErrors(portStats.getRxErrors());
193                         statsBuilder.setReceiveFrameError(portStats.getRxFrameErr());
194                         statsBuilder.setReceiveOverRunError(portStats.getRxOverErr());
195                         statsBuilder.setTransmitDrops(portStats.getTxDropped());
196                         statsBuilder.setTransmitErrors(portStats.getTxErrors());
197
198                         statsMap.add(statsBuilder.build());
199                     }
200                     message.setNodeConnectorStatisticsAndPortNumberMap(statsMap);
201
202
203                     listDataObject.add(message.build());
204                     return listDataObject;
205                 }
206                 case OFPMPGROUP: {
207                     GroupStatisticsUpdatedBuilder message = new GroupStatisticsUpdatedBuilder();
208                     message.setId(node);
209                     message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
210                     message.setTransactionId(generateTransactionId(mpReply.getXid()));
211                     MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody();
212                     MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
213                     message.setGroupStats(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats()));
214
215                     listDataObject.add(message.build());
216                     return listDataObject;
217                 }
218                 case OFPMPGROUPDESC: {
219
220                     GroupDescStatsUpdatedBuilder message = new GroupDescStatsUpdatedBuilder();
221                     message.setId(node);
222                     message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
223                     message.setTransactionId(generateTransactionId(mpReply.getXid()));
224                     MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase) mpReply.getMultipartReplyBody();
225                     MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
226
227                     message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc(), ofVersion));
228
229                     listDataObject.add(message.build());
230                     return listDataObject;
231                 }
232                 case OFPMPGROUPFEATURES: {
233                     GroupFeaturesUpdatedBuilder message = new GroupFeaturesUpdatedBuilder();
234                     message.setId(node);
235                     message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
236                     message.setTransactionId(generateTransactionId(mpReply.getXid()));
237                     MultipartReplyGroupFeaturesCase caseBody = (MultipartReplyGroupFeaturesCase) mpReply.getMultipartReplyBody();
238                     MultipartReplyGroupFeatures replyBody = caseBody.getMultipartReplyGroupFeatures();
239                     List<Class<? extends GroupType>> supportedGroups =
240                             new ArrayList<Class<? extends GroupType>>();
241
242                     if (replyBody.getTypes().isOFPGTALL()) {
243                         supportedGroups.add(GroupAll.class);
244                     }
245                     if (replyBody.getTypes().isOFPGTSELECT()) {
246                         supportedGroups.add(GroupSelect.class);
247                     }
248                     if (replyBody.getTypes().isOFPGTINDIRECT()) {
249                         supportedGroups.add(GroupIndirect.class);
250                     }
251                     if (replyBody.getTypes().isOFPGTFF()) {
252                         supportedGroups.add(GroupFf.class);
253                     }
254                     message.setGroupTypesSupported(supportedGroups);
255                     message.setMaxGroups(replyBody.getMaxGroups());
256
257                     List<Class<? extends GroupCapability>> supportedCapabilities =
258                             new ArrayList<Class<? extends GroupCapability>>();
259
260                     if (replyBody.getCapabilities().isOFPGFCCHAINING()) {
261                         supportedCapabilities.add(Chaining.class);
262                     }
263                     if (replyBody.getCapabilities().isOFPGFCCHAININGCHECKS()) {
264                         supportedCapabilities.add(ChainingChecks.class);
265                     }
266                     if (replyBody.getCapabilities().isOFPGFCSELECTLIVENESS()) {
267                         supportedCapabilities.add(SelectLiveness.class);
268                     }
269                     if (replyBody.getCapabilities().isOFPGFCSELECTWEIGHT()) {
270                         supportedCapabilities.add(SelectWeight.class);
271                     }
272
273                     message.setGroupCapabilitiesSupported(supportedCapabilities);
274
275                     message.setActions(getGroupActionsSupportBitmap(replyBody.getActionsBitmap()));
276                     listDataObject.add(message.build());
277
278                     return listDataObject;
279                 }
280                 case OFPMPMETER: {
281                     MeterStatisticsUpdatedBuilder message = new MeterStatisticsUpdatedBuilder();
282                     message.setId(node);
283                     message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
284                     message.setTransactionId(generateTransactionId(mpReply.getXid()));
285
286                     MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase) mpReply.getMultipartReplyBody();
287                     MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
288                     message.setMeterStats(meterStatsConvertor.toSALMeterStatsList(replyBody.getMeterStats()));
289
290                     listDataObject.add(message.build());
291                     return listDataObject;
292                 }
293                 case OFPMPMETERCONFIG: {
294
295                     MeterConfigStatsUpdatedBuilder message = new MeterConfigStatsUpdatedBuilder();
296                     message.setId(node);
297                     message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
298                     message.setTransactionId(generateTransactionId(mpReply.getXid()));
299
300                     MultipartReplyMeterConfigCase caseBody = (MultipartReplyMeterConfigCase) mpReply.getMultipartReplyBody();
301                     MultipartReplyMeterConfig replyBody = caseBody.getMultipartReplyMeterConfig();
302                     message.setMeterConfigStats(meterStatsConvertor.toSALMeterConfigList(replyBody.getMeterConfig()));
303
304                     listDataObject.add(message.build());
305                     return listDataObject;
306                 }
307                 case OFPMPMETERFEATURES: {
308                     //Convert OF message and send it to SAL listener
309                     MeterFeaturesUpdatedBuilder message = new MeterFeaturesUpdatedBuilder();
310                     message.setId(node);
311                     message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
312                     message.setTransactionId(generateTransactionId(mpReply.getXid()));
313
314                     MultipartReplyMeterFeaturesCase caseBody = (MultipartReplyMeterFeaturesCase) mpReply.getMultipartReplyBody();
315                     MultipartReplyMeterFeatures replyBody = caseBody.getMultipartReplyMeterFeatures();
316                     message.setMaxBands(replyBody.getMaxBands());
317                     message.setMaxColor(replyBody.getMaxColor());
318                     message.setMaxMeter(new Counter32(replyBody.getMaxMeter()));
319
320                     List<Class<? extends MeterCapability>> supportedCapabilities =
321                             new ArrayList<Class<? extends MeterCapability>>();
322                     if (replyBody.getCapabilities().isOFPMFBURST()) {
323                         supportedCapabilities.add(MeterBurst.class);
324                     }
325                     if (replyBody.getCapabilities().isOFPMFKBPS()) {
326                         supportedCapabilities.add(MeterKbps.class);
327
328                     }
329                     if (replyBody.getCapabilities().isOFPMFPKTPS()) {
330                         supportedCapabilities.add(MeterPktps.class);
331
332                     }
333                     if (replyBody.getCapabilities().isOFPMFSTATS()) {
334                         supportedCapabilities.add(MeterStats.class);
335
336                     }
337                     message.setMeterCapabilitiesSupported(supportedCapabilities);
338
339                     List<Class<? extends MeterBand>> supportedMeterBand =
340                             new ArrayList<Class<? extends MeterBand>>();
341                     if (replyBody.getBandTypes().isOFPMBTDROP()) {
342                         supportedMeterBand.add(MeterBandDrop.class);
343                     }
344                     if (replyBody.getBandTypes().isOFPMBTDSCPREMARK()) {
345                         supportedMeterBand.add(MeterBandDscpRemark.class);
346                     }
347                     message.setMeterBandSupported(supportedMeterBand);
348                     listDataObject.add(message.build());
349
350                     return listDataObject;
351                 }
352                 case OFPMPTABLE: {
353
354                     FlowTableStatisticsUpdateBuilder message = new FlowTableStatisticsUpdateBuilder();
355                     message.setId(node);
356                     message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
357                     message.setTransactionId(generateTransactionId(mpReply.getXid()));
358
359                     MultipartReplyTableCase caseBody = (MultipartReplyTableCase) mpReply.getMultipartReplyBody();
360                     MultipartReplyTable replyBody = caseBody.getMultipartReplyTable();
361                     List<TableStats> swTablesStats = replyBody.getTableStats();
362
363                     List<FlowTableAndStatisticsMap> salFlowStats = new ArrayList<FlowTableAndStatisticsMap>();
364                     for (TableStats swTableStats : swTablesStats) {
365                         FlowTableAndStatisticsMapBuilder statisticsBuilder = new FlowTableAndStatisticsMapBuilder();
366
367                         statisticsBuilder.setActiveFlows(new Counter32(swTableStats.getActiveCount()));
368                         statisticsBuilder.setPacketsLookedUp(new Counter64(swTableStats.getLookupCount()));
369                         statisticsBuilder.setPacketsMatched(new Counter64(swTableStats.getMatchedCount()));
370                         statisticsBuilder.setTableId(new TableId(swTableStats.getTableId()));
371                         salFlowStats.add(statisticsBuilder.build());
372                     }
373
374                     message.setFlowTableAndStatisticsMap(salFlowStats);
375                     listDataObject.add(message.build());
376                     return listDataObject;
377                 }
378                 case OFPMPQUEUE: {
379
380                     QueueStatisticsUpdateBuilder message = new QueueStatisticsUpdateBuilder();
381                     message.setId(node);
382                     message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
383                     message.setTransactionId(generateTransactionId(mpReply.getXid()));
384
385                     MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase) mpReply.getMultipartReplyBody();
386                     MultipartReplyQueue replyBody = caseBody.getMultipartReplyQueue();
387
388                     List<QueueIdAndStatisticsMap> statsMap =
389                             new ArrayList<QueueIdAndStatisticsMap>();
390
391                     for (QueueStats queueStats : replyBody.getQueueStats()) {
392
393                         QueueIdAndStatisticsMapBuilder statsBuilder =
394                                 new QueueIdAndStatisticsMapBuilder();
395                         statsBuilder.setNodeConnectorId(
396                                 InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
397                                         queueStats.getPortNo(), ofVersion));
398                         statsBuilder.setTransmissionErrors(new Counter64(queueStats.getTxErrors()));
399                         statsBuilder.setTransmittedBytes(new Counter64(queueStats.getTxBytes()));
400                         statsBuilder.setTransmittedPackets(new Counter64(queueStats.getTxPackets()));
401
402                         DurationBuilder durationBuilder = new DurationBuilder();
403                         durationBuilder.setSecond(new Counter32(queueStats.getDurationSec()));
404                         durationBuilder.setNanosecond(new Counter32(queueStats.getDurationNsec()));
405                         statsBuilder.setDuration(durationBuilder.build());
406
407                         statsBuilder.setQueueId(new QueueId(queueStats.getQueueId()));
408                         statsBuilder.setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
409                                 queueStats.getPortNo(), ofVersion));
410
411                         statsMap.add(statsBuilder.build());
412                     }
413                     message.setQueueIdAndStatisticsMap(statsMap);
414
415                     listDataObject.add(message.build());
416                     return listDataObject;
417                 }
418
419                 default:
420                     return listDataObject;
421             }
422         }
423
424         return listDataObject;
425     }
426
427     private static NodeId nodeIdFromDatapathId(final BigInteger datapathId) {
428         String current = datapathId.toString();
429         return new NodeId("openflow:" + current);
430     }
431
432     private static TransactionId generateTransactionId(final Long xid) {
433         BigInteger bigIntXid = BigInteger.valueOf(xid);
434         return new TransactionId(bigIntXid);
435     }
436
437     /*
438      * Method returns the bitmap of actions supported by each group.
439      *
440      * @param actionsSupported
441      * @return
442      */
443     static List<Long> getGroupActionsSupportBitmap(final List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType> actionsSupported) {
444         List<Long> supportActionByGroups = new ArrayList<Long>();
445         for (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType supportedActions : actionsSupported) {
446             long supportActionBitmap = 0;
447             supportActionBitmap |= supportedActions.isOFPATOUTPUT() ? (1 << 0) : 0;
448             supportActionBitmap |= supportedActions.isOFPATCOPYTTLOUT() ? (1 << 11) : 0;
449             supportActionBitmap |= supportedActions.isOFPATCOPYTTLIN() ? (1 << 12) : 0;
450             supportActionBitmap |= supportedActions.isOFPATSETMPLSTTL() ? (1 << 15) : 0;
451             supportActionBitmap |= supportedActions.isOFPATDECMPLSTTL() ? (1 << 16) : 0;
452             supportActionBitmap |= supportedActions.isOFPATPUSHVLAN() ? (1 << 17) : 0;
453             supportActionBitmap |= supportedActions.isOFPATPOPVLAN() ? (1 << 18) : 0;
454             supportActionBitmap |= supportedActions.isOFPATPUSHMPLS() ? (1 << 19) : 0;
455             supportActionBitmap |= supportedActions.isOFPATPOPMPLS() ? (1 << 20) : 0;
456             supportActionBitmap |= supportedActions.isOFPATSETQUEUE() ? (1 << 21) : 0;
457             supportActionBitmap |= supportedActions.isOFPATGROUP() ? (1 << 22) : 0;
458             supportActionBitmap |= supportedActions.isOFPATSETNWTTL() ? (1 << 23) : 0;
459             supportActionBitmap |= supportedActions.isOFPATDECNWTTL() ? (1 << 24) : 0;
460             supportActionBitmap |= supportedActions.isOFPATSETFIELD() ? (1 << 25) : 0;
461             supportActionBitmap |= supportedActions.isOFPATPUSHPBB() ? (1 << 26) : 0;
462             supportActionBitmap |= supportedActions.isOFPATPOPPBB() ? (1 << 27) : 0;
463             supportActionByGroups.add(Long.valueOf(supportActionBitmap));
464         }
465         return supportActionByGroups;
466     }
467
468 }