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