2 * Copyright IBM Corporation, 2013. 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.openflow.md.core.translator;
10 import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator;
11 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
12 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowStatsResponseConvertor;
13 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor;
14 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterStatsResponseConvertor;
15 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
16 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
17 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.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.rev131103.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.protocol.rev130731.MultipartReplyMessage;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCase;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCase;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCase;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCase;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCase;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCase;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCase;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCase;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCase;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCase;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregate;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlow;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroup;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDesc;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeatures;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.MultipartReplyMeter;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.MultipartReplyMeterConfig;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeatures;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStats;
77 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;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueue;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStats;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTable;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStats;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.NodeConnectorStatisticsUpdateBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapKey;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.QueueStatisticsUpdateBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMap;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMapBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId;
90 import org.opendaylight.yangtools.yang.binding.DataObject;
91 import org.slf4j.Logger;
92 import org.slf4j.LoggerFactory;
94 import java.math.BigInteger;
95 import java.util.ArrayList;
96 import java.util.List;
97 import java.util.concurrent.CopyOnWriteArrayList;
100 * Class converts multipart reply messages to the notification objects defined
101 * by statistics provider (manager ).
103 * @author avishnoi@in.ibm.com
106 public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader, List<DataObject>> {
108 protected static final Logger logger = LoggerFactory
109 .getLogger(MultipartReplyTranslator.class);
111 private static FlowStatsResponseConvertor flowStatsConvertor = new FlowStatsResponseConvertor();
112 private static GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor();
113 private static MeterStatsResponseConvertor meterStatsConvertor = new MeterStatsResponseConvertor();
116 public List<DataObject> translate(SwitchConnectionDistinguisher cookie, SessionContext sc, OfHeader msg) {
118 List<DataObject> listDataObject = new CopyOnWriteArrayList<DataObject>();
120 OpenflowVersion ofVersion = OpenflowVersion.get(sc.getPrimaryConductor().getVersion());
122 if(msg instanceof MultipartReplyMessage){
123 MultipartReplyMessage mpReply = (MultipartReplyMessage)msg;
124 NodeId node = this.nodeIdFromDatapathId(sc.getFeatures().getDatapathId());
125 switch (mpReply.getType()){
127 logger.debug("Received flow statistics reponse from openflow {} switch",msg.getVersion()==1?"1.0":"1.3+");
128 FlowsStatisticsUpdateBuilder message = new FlowsStatisticsUpdateBuilder();
130 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
131 message.setTransactionId(generateTransactionId(mpReply.getXid()));
132 MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase)mpReply.getMultipartReplyBody();
133 MultipartReplyFlow replyBody = caseBody.getMultipartReplyFlow();
134 message.setFlowAndStatisticsMapList(flowStatsConvertor.toSALFlowStatsList(replyBody.getFlowStats(),sc.getFeatures().getDatapathId(), ofVersion));
136 logger.debug("Converted flow statistics : {}",message.build().toString());
137 listDataObject.add(message.build());
138 return listDataObject;
140 case OFPMPAGGREGATE: {
141 logger.debug("Received aggregate flow statistics reponse from openflow {} switch",msg.getVersion()==1?"1.0":"1.3+");
142 AggregateFlowStatisticsUpdateBuilder message = new AggregateFlowStatisticsUpdateBuilder();
144 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
145 message.setTransactionId(generateTransactionId(mpReply.getXid()));
147 MultipartReplyAggregateCase caseBody = (MultipartReplyAggregateCase)mpReply.getMultipartReplyBody();
148 MultipartReplyAggregate replyBody = caseBody.getMultipartReplyAggregate();
149 message.setByteCount(new Counter64(replyBody.getByteCount()));
150 message.setPacketCount(new Counter64(replyBody.getPacketCount()));
151 message.setFlowCount(new Counter32(replyBody.getFlowCount()));
153 logger.debug("Converted aggregate flow statistics : {}",message.build().toString());
154 listDataObject.add(message.build());
155 return listDataObject;
157 case OFPMPPORTSTATS: {
159 logger.debug("Received port statistics multipart response");
161 NodeConnectorStatisticsUpdateBuilder message = new NodeConnectorStatisticsUpdateBuilder();
163 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
164 message.setTransactionId(generateTransactionId(mpReply.getXid()));
166 MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase)mpReply.getMultipartReplyBody();
167 MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats();
169 List<NodeConnectorStatisticsAndPortNumberMap> statsMap =
170 new ArrayList<NodeConnectorStatisticsAndPortNumberMap>();
171 for (PortStats portStats: replyBody.getPortStats()){
173 NodeConnectorStatisticsAndPortNumberMapBuilder statsBuilder =
174 new NodeConnectorStatisticsAndPortNumberMapBuilder();
175 statsBuilder.setNodeConnectorId(
176 InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(sc.getFeatures().getDatapathId(),
177 portStats.getPortNo(), ofVersion));
179 BytesBuilder bytesBuilder = new BytesBuilder();
180 bytesBuilder.setReceived(portStats.getRxBytes());
181 bytesBuilder.setTransmitted(portStats.getTxBytes());
182 statsBuilder.setBytes(bytesBuilder.build());
184 PacketsBuilder packetsBuilder = new PacketsBuilder();
185 packetsBuilder.setReceived(portStats.getRxPackets());
186 packetsBuilder.setTransmitted(portStats.getTxPackets());
187 statsBuilder.setPackets(packetsBuilder.build());
189 DurationBuilder durationBuilder = new DurationBuilder();
190 durationBuilder.setSecond(new Counter32(portStats.getDurationSec()));
191 durationBuilder.setNanosecond(new Counter32(portStats.getDurationNsec()));
192 statsBuilder.setDuration(durationBuilder.build());
194 statsBuilder.setCollisionCount(portStats.getCollisions());
195 statsBuilder.setKey(new NodeConnectorStatisticsAndPortNumberMapKey(statsBuilder.getNodeConnectorId()));
196 statsBuilder.setReceiveCrcError(portStats.getRxCrcErr());
197 statsBuilder.setReceiveDrops(portStats.getRxDropped());
198 statsBuilder.setReceiveErrors(portStats.getRxErrors());
199 statsBuilder.setReceiveFrameError(portStats.getRxFrameErr());
200 statsBuilder.setReceiveOverRunError(portStats.getRxOverErr());
201 statsBuilder.setTransmitDrops(portStats.getTxDropped());
202 statsBuilder.setTransmitErrors(portStats.getTxErrors());
203 statsMap.add(statsBuilder.build());
205 message.setNodeConnectorStatisticsAndPortNumberMap(statsMap);
207 logger.debug("Converted ports statistics : {}",message.build().toString());
209 listDataObject.add(message.build());
210 return listDataObject;
213 logger.debug("Received group statistics multipart reponse");
214 GroupStatisticsUpdatedBuilder message = new GroupStatisticsUpdatedBuilder();
216 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
217 message.setTransactionId(generateTransactionId(mpReply.getXid()));
218 MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase)mpReply.getMultipartReplyBody();
219 MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
220 message.setGroupStats(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats()));
222 logger.debug("Converted group statistics : {}",message.toString());
223 listDataObject.add(message.build());
224 return listDataObject;
226 case OFPMPGROUPDESC:{
227 logger.debug("Received group description statistics multipart reponse");
229 GroupDescStatsUpdatedBuilder message = new GroupDescStatsUpdatedBuilder();
231 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
232 message.setTransactionId(generateTransactionId(mpReply.getXid()));
233 MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase)mpReply.getMultipartReplyBody();
234 MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
236 message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc(), ofVersion));
238 logger.debug("Converted group statistics : {}",message.toString());
239 listDataObject.add(message.build());
240 return listDataObject;
242 case OFPMPGROUPFEATURES: {
243 logger.debug("Received group features multipart reponse");
244 GroupFeaturesUpdatedBuilder message = new GroupFeaturesUpdatedBuilder();
246 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
247 message.setTransactionId(generateTransactionId(mpReply.getXid()));
248 MultipartReplyGroupFeaturesCase caseBody = (MultipartReplyGroupFeaturesCase)mpReply.getMultipartReplyBody();
249 MultipartReplyGroupFeatures replyBody = caseBody.getMultipartReplyGroupFeatures();
250 List<Class<? extends GroupType>> supportedGroups =
251 new ArrayList<Class<? extends GroupType>>();
253 if(replyBody.getTypes().isOFPGTALL()){
254 supportedGroups.add(GroupAll.class);
256 if(replyBody.getTypes().isOFPGTSELECT()){
257 supportedGroups.add(GroupSelect.class);
259 if(replyBody.getTypes().isOFPGTINDIRECT()){
260 supportedGroups.add(GroupIndirect.class);
262 if(replyBody.getTypes().isOFPGTFF()){
263 supportedGroups.add(GroupFf.class);
265 message.setGroupTypesSupported(supportedGroups);
266 message.setMaxGroups(replyBody.getMaxGroups());
268 List<Class<? extends GroupCapability>> supportedCapabilities =
269 new ArrayList<Class<? extends GroupCapability>>();
271 if(replyBody.getCapabilities().isOFPGFCCHAINING()){
272 supportedCapabilities.add(Chaining.class);
274 if(replyBody.getCapabilities().isOFPGFCCHAININGCHECKS()){
275 supportedCapabilities.add(ChainingChecks.class);
277 if(replyBody.getCapabilities().isOFPGFCSELECTLIVENESS()){
278 supportedCapabilities.add(SelectLiveness.class);
280 if(replyBody.getCapabilities().isOFPGFCSELECTWEIGHT()){
281 supportedCapabilities.add(SelectWeight.class);
284 message.setGroupCapabilitiesSupported(supportedCapabilities);
286 message.setActions(getGroupActionsSupportBitmap(replyBody.getActionsBitmap()));
287 listDataObject.add(message.build());
289 return listDataObject;
292 logger.debug("Received meter statistics multipart reponse");
293 MeterStatisticsUpdatedBuilder message = new MeterStatisticsUpdatedBuilder();
295 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
296 message.setTransactionId(generateTransactionId(mpReply.getXid()));
298 MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase)mpReply.getMultipartReplyBody();
299 MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
300 message.setMeterStats(meterStatsConvertor.toSALMeterStatsList(replyBody.getMeterStats()));
302 listDataObject.add(message.build());
303 return listDataObject;
305 case OFPMPMETERCONFIG:{
306 logger.debug("Received meter config statistics multipart reponse");
308 MeterConfigStatsUpdatedBuilder message = new MeterConfigStatsUpdatedBuilder();
310 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
311 message.setTransactionId(generateTransactionId(mpReply.getXid()));
313 MultipartReplyMeterConfigCase caseBody = (MultipartReplyMeterConfigCase)mpReply.getMultipartReplyBody();
314 MultipartReplyMeterConfig replyBody = caseBody.getMultipartReplyMeterConfig();
315 message.setMeterConfigStats(meterStatsConvertor.toSALMeterConfigList(replyBody.getMeterConfig()));
317 listDataObject.add(message.build());
318 return listDataObject;
320 case OFPMPMETERFEATURES:{
321 logger.debug("Received meter features multipart reponse");
322 //Convert OF message and send it to SAL listener
323 MeterFeaturesUpdatedBuilder message = new MeterFeaturesUpdatedBuilder();
325 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
326 message.setTransactionId(generateTransactionId(mpReply.getXid()));
328 MultipartReplyMeterFeaturesCase caseBody = (MultipartReplyMeterFeaturesCase)mpReply.getMultipartReplyBody();
329 MultipartReplyMeterFeatures replyBody = caseBody.getMultipartReplyMeterFeatures();
330 message.setMaxBands(replyBody.getMaxBands());
331 message.setMaxColor(replyBody.getMaxColor());
332 message.setMaxMeter(new Counter32(replyBody.getMaxMeter()));
334 List<Class<? extends MeterCapability>> supportedCapabilities =
335 new ArrayList<Class<? extends MeterCapability>>();
336 if(replyBody.getCapabilities().isOFPMFBURST()){
337 supportedCapabilities.add(MeterBurst.class);
339 if(replyBody.getCapabilities().isOFPMFKBPS()){
340 supportedCapabilities.add(MeterKbps.class);
343 if(replyBody.getCapabilities().isOFPMFPKTPS()){
344 supportedCapabilities.add(MeterPktps.class);
347 if(replyBody.getCapabilities().isOFPMFSTATS()){
348 supportedCapabilities.add(MeterStats.class);
351 message.setMeterCapabilitiesSupported(supportedCapabilities);
353 List<Class<? extends MeterBand>> supportedMeterBand =
354 new ArrayList<Class <? extends MeterBand>>();
355 if(replyBody.getBandTypes().isOFPMBTDROP()){
356 supportedMeterBand.add(MeterBandDrop.class);
358 if(replyBody.getBandTypes().isOFPMBTDSCPREMARK()){
359 supportedMeterBand.add(MeterBandDscpRemark.class);
361 message.setMeterBandSupported(supportedMeterBand);
362 listDataObject.add(message.build());
364 return listDataObject;
367 logger.debug("Received flow table statistics reponse from openflow {} switch",msg.getVersion()==1?"1.0":"1.3+");
369 FlowTableStatisticsUpdateBuilder message = new FlowTableStatisticsUpdateBuilder();
371 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
372 message.setTransactionId(generateTransactionId(mpReply.getXid()));
374 MultipartReplyTableCase caseBody = (MultipartReplyTableCase)mpReply.getMultipartReplyBody();
375 MultipartReplyTable replyBody = caseBody.getMultipartReplyTable();
376 List<TableStats> swTablesStats = replyBody.getTableStats();
378 List<FlowTableAndStatisticsMap> salFlowStats = new ArrayList<FlowTableAndStatisticsMap>();
379 for(TableStats swTableStats : swTablesStats){
380 FlowTableAndStatisticsMapBuilder statisticsBuilder = new FlowTableAndStatisticsMapBuilder();
382 statisticsBuilder.setActiveFlows(new Counter32(swTableStats.getActiveCount()));
383 statisticsBuilder.setPacketsLookedUp(new Counter64(swTableStats.getLookupCount()));
384 statisticsBuilder.setPacketsMatched(new Counter64(swTableStats.getMatchedCount()));
385 statisticsBuilder.setTableId(new TableId(swTableStats.getTableId()));
386 salFlowStats.add(statisticsBuilder.build());
389 message.setFlowTableAndStatisticsMap(salFlowStats);
391 logger.debug("Converted flow table statistics : {}",message.build().toString());
392 listDataObject.add(message.build());
393 return listDataObject;
396 logger.debug("Received queue statistics multipart response");
398 QueueStatisticsUpdateBuilder message = new QueueStatisticsUpdateBuilder();
400 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
401 message.setTransactionId(generateTransactionId(mpReply.getXid()));
403 MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase)mpReply.getMultipartReplyBody();
404 MultipartReplyQueue replyBody = caseBody.getMultipartReplyQueue();
406 List<QueueIdAndStatisticsMap> statsMap =
407 new ArrayList<QueueIdAndStatisticsMap>();
409 for (QueueStats queueStats: replyBody.getQueueStats()){
411 QueueIdAndStatisticsMapBuilder statsBuilder =
412 new QueueIdAndStatisticsMapBuilder();
413 statsBuilder.setNodeConnectorId(
414 InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(sc.getFeatures().getDatapathId(),
415 queueStats.getPortNo(), ofVersion));
416 statsBuilder.setTransmissionErrors(new Counter64(queueStats.getTxErrors()));
417 statsBuilder.setTransmittedBytes(new Counter64(queueStats.getTxBytes()));
418 statsBuilder.setTransmittedPackets(new Counter64(queueStats.getTxPackets()));
420 DurationBuilder durationBuilder = new DurationBuilder();
421 durationBuilder.setSecond(new Counter32(queueStats.getDurationSec()));
422 durationBuilder.setNanosecond(new Counter32(queueStats.getDurationNsec()));
423 statsBuilder.setDuration(durationBuilder.build());
425 statsBuilder.setQueueId(new QueueId(queueStats.getQueueId()));
426 statsBuilder.setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(sc.getFeatures().getDatapathId(),
427 queueStats.getPortNo(), ofVersion));
429 statsMap.add(statsBuilder.build());
431 message.setQueueIdAndStatisticsMap(statsMap);
433 logger.debug("Converted queue statistics : {}",message.build().toString());
434 listDataObject.add(message.build());
435 return listDataObject;
439 return listDataObject;
443 return listDataObject;
446 private NodeId nodeIdFromDatapathId(BigInteger datapathId) {
447 String current = datapathId.toString();
448 return new NodeId("openflow:" + current);
451 private TransactionId generateTransactionId(Long xid){
452 String stringXid =xid.toString();
453 BigInteger bigIntXid = new BigInteger( stringXid );
454 return new TransactionId(bigIntXid);
459 * Method returns the bitmap of actions supported by each group.
460 * TODO: My recommendation would be, its good to have a respective model of
461 * 'type bits', which will generate a class where all these flags will eventually
462 * be stored as boolean. It will be convenient for application to check the
463 * supported action, rather then doing bitmap operation.
464 * @param actionsSupported
467 private List<Long> getGroupActionsSupportBitmap(List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType> actionsSupported){
468 List<Long> supportActionByGroups = new ArrayList<Long>();
469 for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType supportedActions : actionsSupported){
470 long supportActionBitmap = 0;
471 supportActionBitmap |= supportedActions.isOFPATOUTPUT()?(1 << 0): ~(1 << 0);
472 supportActionBitmap |= supportedActions.isOFPATCOPYTTLOUT()?(1 << 11): ~(1 << 11);
473 supportActionBitmap |= supportedActions.isOFPATCOPYTTLIN()?(1 << 12): ~(1 << 12);
474 supportActionBitmap |= supportedActions.isOFPATSETMPLSTTL()?(1 << 15): ~(1 << 15);
475 supportActionBitmap |= supportedActions.isOFPATDECMPLSTTL()?(1 << 16): ~(1 << 16);
476 supportActionBitmap |= supportedActions.isOFPATPUSHVLAN()?(1 << 16): ~(1 << 16);
477 supportActionBitmap |= supportedActions.isOFPATPOPVLAN()?(1 << 17): ~(1 << 17);
478 supportActionBitmap |= supportedActions.isOFPATPUSHMPLS()?(1 << 18): ~(1 << 18);
479 supportActionBitmap |= supportedActions.isOFPATPOPMPLS()?(1 << 19): ~(1 << 19);
480 supportActionBitmap |= supportedActions.isOFPATSETQUEUE()?(1 << 20): ~(1 << 20);
481 supportActionBitmap |= supportedActions.isOFPATGROUP()?(1 << 21): ~(1 << 21);
482 supportActionBitmap |= supportedActions.isOFPATSETNWTTL()?(1 << 22): ~(1 << 22);
483 supportActionBitmap |= supportedActions.isOFPATDECNWTTL()?(1 << 23): ~(1 << 23);
484 supportActionBitmap |= supportedActions.isOFPATSETFIELD()?(1 << 24): ~(1 << 24);
485 supportActionBitmap |= supportedActions.isOFPATPUSHPBB()?(1 << 25): ~(1 << 25);
486 supportActionBitmap |= supportedActions.isOFPATPOPPBB()?(1 << 26): ~(1 << 26);
487 supportActionBitmap |= supportedActions.isOFPATEXPERIMENTER()?(1 << 27): ~(1 << 27);
488 supportActionByGroups.add(new Long(supportActionBitmap));
490 return supportActionByGroups;