2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.openflowplugin.impl.statistics;
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;
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.
100 * @author avishnoi@in.ibm.com
103 public class SinglePurposeMultipartReplyTranslator {
105 protected static final Logger logger = LoggerFactory
106 .getLogger(SinglePurposeMultipartReplyTranslator.class);
108 private static FlowStatsResponseConvertor flowStatsConvertor = new FlowStatsResponseConvertor();
109 private static GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor();
110 private static MeterStatsResponseConvertor meterStatsConvertor = new MeterStatsResponseConvertor();
113 public List<DataObject> translate(final BigInteger datapathId, final short version, final OfHeader msg) {
115 List<DataObject> listDataObject = new ArrayList<>();
117 OpenflowVersion ofVersion = OpenflowVersion.get(version);
119 if (msg instanceof MultipartReplyMessage) {
120 MultipartReplyMessage mpReply = (MultipartReplyMessage) msg;
121 NodeId node = SinglePurposeMultipartReplyTranslator.nodeIdFromDatapathId(datapathId);
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);
136 return listDataObject;
139 private static void translateFlow(final List<DataObject> listDataObject,
140 final MultipartReplyMessage mpReply,
142 final OpenflowVersion ofVersion,
143 final BigInteger datapathId) {
144 if (!MultipartType.OFPMPFLOW.equals(mpReply.getType())) {
148 FlowsStatisticsUpdateBuilder message = new FlowsStatisticsUpdateBuilder();
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));
156 listDataObject.add(message.build());
159 private static void translateAggregate(final List<DataObject> listDataObject,
160 final MultipartReplyMessage mpReply,
162 if (!MultipartType.OFPMPAGGREGATE.equals(mpReply.getType())) {
166 AggregateFlowStatisticsUpdateBuilder message = new AggregateFlowStatisticsUpdateBuilder();
168 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
169 message.setTransactionId(generateTransactionId(mpReply.getXid()));
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()));
177 listDataObject.add(message.build());
180 private static void translatePortStats(final List<DataObject> listDataObject,
181 final MultipartReplyMessage mpReply,
183 final OpenflowVersion ofVersion,
184 final BigInteger datapathId) {
185 if (!MultipartType.OFPMPPORTSTATS.equals(mpReply.getType())) {
189 NodeConnectorStatisticsUpdateBuilder message = new NodeConnectorStatisticsUpdateBuilder();
191 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
192 message.setTransactionId(generateTransactionId(mpReply.getXid()));
194 MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase) mpReply.getMultipartReplyBody();
195 MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats();
197 List<NodeConnectorStatisticsAndPortNumberMap> statsMap =
199 for (PortStats portStats : replyBody.getPortStats()) {
201 NodeConnectorStatisticsAndPortNumberMapBuilder statsBuilder =
202 new NodeConnectorStatisticsAndPortNumberMapBuilder();
203 statsBuilder.setNodeConnectorId(
204 InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
205 portStats.getPortNo(), ofVersion));
207 BytesBuilder bytesBuilder = new BytesBuilder();
208 bytesBuilder.setReceived(portStats.getRxBytes());
209 bytesBuilder.setTransmitted(portStats.getTxBytes());
210 statsBuilder.setBytes(bytesBuilder.build());
212 PacketsBuilder packetsBuilder = new PacketsBuilder();
213 packetsBuilder.setReceived(portStats.getRxPackets());
214 packetsBuilder.setTransmitted(portStats.getTxPackets());
215 statsBuilder.setPackets(packetsBuilder.build());
217 DurationBuilder durationBuilder = new DurationBuilder();
218 if (portStats.getDurationSec() != null) {
219 durationBuilder.setSecond(new Counter32(portStats.getDurationSec()));
221 if (portStats.getDurationNsec() != null) {
222 durationBuilder.setNanosecond(new Counter32(portStats.getDurationNsec()));
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());
235 statsMap.add(statsBuilder.build());
237 message.setNodeConnectorStatisticsAndPortNumberMap(statsMap);
240 listDataObject.add(message.build());
243 private static void translateGroup(final List<DataObject> listDataObject,
244 final MultipartReplyMessage mpReply,
246 if (!MultipartType.OFPMPGROUP.equals(mpReply.getType())) {
250 GroupStatisticsUpdatedBuilder message = new GroupStatisticsUpdatedBuilder();
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()));
258 listDataObject.add(message.build());
261 private static void translateGroupDesc(final List<DataObject> listDataObject,
262 final MultipartReplyMessage mpReply,
264 final OpenflowVersion ofVersion) {
265 if (!MultipartType.OFPMPGROUPDESC.equals(mpReply.getType())) {
269 GroupDescStatsUpdatedBuilder message = new GroupDescStatsUpdatedBuilder();
271 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
272 message.setTransactionId(generateTransactionId(mpReply.getXid()));
273 MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase) mpReply.getMultipartReplyBody();
274 MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
276 message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc(), ofVersion));
278 listDataObject.add(message.build());
281 private static void translateGroupFeatures(final List<DataObject> listDataObject,
282 final MultipartReplyMessage mpReply,
284 if (!MultipartType.OFPMPGROUPFEATURES.equals(mpReply.getType())) {
288 GroupFeaturesUpdatedBuilder message = new GroupFeaturesUpdatedBuilder();
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 =
297 if (replyBody.getTypes().isOFPGTALL()) {
298 supportedGroups.add(GroupAll.class);
300 if (replyBody.getTypes().isOFPGTSELECT()) {
301 supportedGroups.add(GroupSelect.class);
303 if (replyBody.getTypes().isOFPGTINDIRECT()) {
304 supportedGroups.add(GroupIndirect.class);
306 if (replyBody.getTypes().isOFPGTFF()) {
307 supportedGroups.add(GroupFf.class);
309 message.setGroupTypesSupported(supportedGroups);
310 message.setMaxGroups(replyBody.getMaxGroups());
312 List<Class<? extends GroupCapability>> supportedCapabilities =
315 if (replyBody.getCapabilities().isOFPGFCCHAINING()) {
316 supportedCapabilities.add(Chaining.class);
318 if (replyBody.getCapabilities().isOFPGFCCHAININGCHECKS()) {
319 supportedCapabilities.add(ChainingChecks.class);
321 if (replyBody.getCapabilities().isOFPGFCSELECTLIVENESS()) {
322 supportedCapabilities.add(SelectLiveness.class);
324 if (replyBody.getCapabilities().isOFPGFCSELECTWEIGHT()) {
325 supportedCapabilities.add(SelectWeight.class);
328 message.setGroupCapabilitiesSupported(supportedCapabilities);
330 message.setActions(getGroupActionsSupportBitmap(replyBody.getActionsBitmap()));
331 listDataObject.add(message.build());
334 private static void translateMeter(final List<DataObject> listDataObject,
335 final MultipartReplyMessage mpReply,
337 if (!MultipartType.OFPMPMETER.equals(mpReply.getType())) {
341 MeterStatisticsUpdatedBuilder message = new MeterStatisticsUpdatedBuilder();
343 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
344 message.setTransactionId(generateTransactionId(mpReply.getXid()));
346 MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase) mpReply.getMultipartReplyBody();
347 MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
348 message.setMeterStats(meterStatsConvertor.toSALMeterStatsList(replyBody.getMeterStats()));
350 listDataObject.add(message.build());
353 private static void translateMeterConfig(final List<DataObject> listDataObject,
354 final MultipartReplyMessage mpReply,
356 if (!MultipartType.OFPMPMETERCONFIG.equals(mpReply.getType())) {
360 MeterConfigStatsUpdatedBuilder message = new MeterConfigStatsUpdatedBuilder();
362 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
363 message.setTransactionId(generateTransactionId(mpReply.getXid()));
365 MultipartReplyMeterConfigCase caseBody = (MultipartReplyMeterConfigCase) mpReply.getMultipartReplyBody();
366 MultipartReplyMeterConfig replyBody = caseBody.getMultipartReplyMeterConfig();
367 message.setMeterConfigStats(meterStatsConvertor.toSALMeterConfigList(replyBody.getMeterConfig()));
369 listDataObject.add(message.build());
372 private static void translateMeterFeatures(final List<DataObject> listDataObject,
373 final MultipartReplyMessage mpReply,
375 if (!MultipartType.OFPMPMETERFEATURES.equals(mpReply.getType())) {
379 //Convert OF message and send it to SAL listener
380 MeterFeaturesUpdatedBuilder message = new MeterFeaturesUpdatedBuilder();
382 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
383 message.setTransactionId(generateTransactionId(mpReply.getXid()));
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()));
391 List<Class<? extends MeterCapability>> supportedCapabilities =
393 if (replyBody.getCapabilities().isOFPMFBURST()) {
394 supportedCapabilities.add(MeterBurst.class);
396 if (replyBody.getCapabilities().isOFPMFKBPS()) {
397 supportedCapabilities.add(MeterKbps.class);
400 if (replyBody.getCapabilities().isOFPMFPKTPS()) {
401 supportedCapabilities.add(MeterPktps.class);
404 if (replyBody.getCapabilities().isOFPMFSTATS()) {
405 supportedCapabilities.add(MeterStats.class);
408 message.setMeterCapabilitiesSupported(supportedCapabilities);
410 List<Class<? extends MeterBand>> supportedMeterBand =
412 if (replyBody.getBandTypes().isOFPMBTDROP()) {
413 supportedMeterBand.add(MeterBandDrop.class);
415 if (replyBody.getBandTypes().isOFPMBTDSCPREMARK()) {
416 supportedMeterBand.add(MeterBandDscpRemark.class);
418 message.setMeterBandSupported(supportedMeterBand);
419 listDataObject.add(message.build());
422 private static void translateTable(final List<DataObject> listDataObject,
423 final MultipartReplyMessage mpReply,
425 if (!MultipartType.OFPMPTABLE.equals(mpReply.getType())) {
429 FlowTableStatisticsUpdateBuilder message = new FlowTableStatisticsUpdateBuilder();
431 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
432 message.setTransactionId(generateTransactionId(mpReply.getXid()));
434 MultipartReplyTableCase caseBody = (MultipartReplyTableCase) mpReply.getMultipartReplyBody();
435 MultipartReplyTable replyBody = caseBody.getMultipartReplyTable();
436 List<TableStats> swTablesStats = replyBody.getTableStats();
438 List<FlowTableAndStatisticsMap> salFlowStats = new ArrayList<FlowTableAndStatisticsMap>();
439 for (TableStats swTableStats : swTablesStats) {
440 FlowTableAndStatisticsMapBuilder statisticsBuilder = new FlowTableAndStatisticsMapBuilder();
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());
449 message.setFlowTableAndStatisticsMap(salFlowStats);
450 listDataObject.add(message.build());
453 private static void translateQueue(final List<DataObject> listDataObject,
454 final MultipartReplyMessage mpReply,
456 final OpenflowVersion ofVersion,
457 final BigInteger datapathId) {
458 if (!MultipartType.OFPMPQUEUE.equals(mpReply.getType())) {
462 QueueStatisticsUpdateBuilder message = new QueueStatisticsUpdateBuilder();
464 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
465 message.setTransactionId(generateTransactionId(mpReply.getXid()));
467 MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase) mpReply.getMultipartReplyBody();
468 MultipartReplyQueue replyBody = caseBody.getMultipartReplyQueue();
470 List<QueueIdAndStatisticsMap> statsMap =
471 new ArrayList<QueueIdAndStatisticsMap>();
473 for (QueueStats queueStats : replyBody.getQueueStats()) {
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()));
484 DurationBuilder durationBuilder = new DurationBuilder();
485 durationBuilder.setSecond(new Counter32(queueStats.getDurationSec()));
486 durationBuilder.setNanosecond(new Counter32(queueStats.getDurationNsec()));
487 statsBuilder.setDuration(durationBuilder.build());
489 statsBuilder.setQueueId(new QueueId(queueStats.getQueueId()));
490 statsBuilder.setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
491 queueStats.getPortNo(), ofVersion));
493 statsMap.add(statsBuilder.build());
495 message.setQueueIdAndStatisticsMap(statsMap);
497 listDataObject.add(message.build());
500 private static NodeId nodeIdFromDatapathId(final BigInteger datapathId) {
501 String current = datapathId.toString();
502 return new NodeId("openflow:" + current);
505 private static TransactionId generateTransactionId(final Long xid) {
506 BigInteger bigIntXid = BigInteger.valueOf(xid);
507 return new TransactionId(bigIntXid);
511 * Method returns the bitmap of actions supported by each group.
513 * @param actionsSupported
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));
538 return supportActionByGroups;