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