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