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