External api proposal
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / translator / MultipartReplyTranslator.java
index fea1af3181c2c95b52c0eabaf5093ad57ee5e3a8..56f2ebec56c37c3aa8f893869959975d8fa12202 100644 (file)
@@ -1,3 +1,10 @@
+/*
+ * Copyright IBM Corporation, 2013.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
 package org.opendaylight.openflowplugin.openflow.md.core.translator;
 
 import java.math.BigInteger;
@@ -5,13 +12,23 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator;
-import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
+import org.opendaylight.openflowplugin.api.openflow.md.core.IMDMessageTranslator;
+import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher;
+import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext;
+import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowStatsResponseConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterStatsResponseConvertor;
-import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
+import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter64;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.AggregateFlowStatisticsUpdateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowsStatisticsUpdateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.FlowTableStatisticsUpdateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMapBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.TransactionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.queue.rev130925.QueueId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupDescStatsUpdatedBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupFeaturesUpdatedBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupStatisticsUpdatedBuilder;
@@ -37,14 +54,44 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterKbps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterPktps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.BytesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.PacketsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroup;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDesc;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeatures;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeter;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfig;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregate;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDesc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.MultipartReplyMeter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.MultipartReplyMeterConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStats;
+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;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.NodeConnectorStatisticsUpdateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.QueueStatisticsUpdateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMapBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -61,6 +108,7 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
     protected static final Logger logger = LoggerFactory
             .getLogger(MultipartReplyTranslator.class);
     
+    private static FlowStatsResponseConvertor flowStatsConvertor = new FlowStatsResponseConvertor();
     private static GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor();
     private static MeterStatsResponseConvertor meterStatsConvertor = new MeterStatsResponseConvertor();
 
@@ -69,42 +117,138 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
         
         List<DataObject> listDataObject = new CopyOnWriteArrayList<DataObject>();
 
+        OpenflowVersion ofVersion = OpenflowVersion.get(sc.getPrimaryConductor().getVersion());
+
         if(msg instanceof MultipartReplyMessage){
             MultipartReplyMessage mpReply = (MultipartReplyMessage)msg;
             NodeId node = this.nodeIdFromDatapathId(sc.getFeatures().getDatapathId());
             switch (mpReply.getType()){
+            case OFPMPFLOW: {
+                logger.debug("Received flow statistics reponse from openflow {} switch",msg.getVersion()==1?"1.0":"1.3+");
+                FlowsStatisticsUpdateBuilder message = new FlowsStatisticsUpdateBuilder();
+                message.setId(node);
+                message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+                message.setTransactionId(generateTransactionId(mpReply.getXid()));
+                MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase)mpReply.getMultipartReplyBody();
+                MultipartReplyFlow replyBody = caseBody.getMultipartReplyFlow();
+                message.setFlowAndStatisticsMapList(flowStatsConvertor.toSALFlowStatsList(replyBody.getFlowStats(),sc.getFeatures().getDatapathId(), ofVersion));
+                
+                logger.debug("Converted flow statistics : {}",message.build().toString());
+                listDataObject.add(message.build());
+                return listDataObject;
+            }
+            case OFPMPAGGREGATE: {
+                logger.debug("Received aggregate flow statistics reponse from openflow {} switch",msg.getVersion()==1?"1.0":"1.3+");
+                AggregateFlowStatisticsUpdateBuilder message = new AggregateFlowStatisticsUpdateBuilder();
+                message.setId(node);
+                message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+                message.setTransactionId(generateTransactionId(mpReply.getXid()));
+                
+                MultipartReplyAggregateCase caseBody = (MultipartReplyAggregateCase)mpReply.getMultipartReplyBody();
+                MultipartReplyAggregate replyBody = caseBody.getMultipartReplyAggregate();
+                message.setByteCount(new Counter64(replyBody.getByteCount()));
+                message.setPacketCount(new Counter64(replyBody.getPacketCount()));
+                message.setFlowCount(new Counter32(replyBody.getFlowCount()));
+                
+                logger.debug("Converted aggregate flow statistics : {}",message.build().toString());
+                listDataObject.add(message.build());
+                return listDataObject;
+            }
+            case OFPMPPORTSTATS: {
+
+                logger.debug("Received port statistics multipart response");
+                
+                NodeConnectorStatisticsUpdateBuilder message = new NodeConnectorStatisticsUpdateBuilder();
+                message.setId(node);
+                message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+                message.setTransactionId(generateTransactionId(mpReply.getXid()));
+
+                MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase)mpReply.getMultipartReplyBody();
+                MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats();
+                
+                List<NodeConnectorStatisticsAndPortNumberMap> statsMap = 
+                        new ArrayList<NodeConnectorStatisticsAndPortNumberMap>();
+                for (PortStats portStats: replyBody.getPortStats()){
+                    
+                    NodeConnectorStatisticsAndPortNumberMapBuilder statsBuilder = 
+                            new NodeConnectorStatisticsAndPortNumberMapBuilder();
+                    statsBuilder.setNodeConnectorId(
+                            InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(sc.getFeatures().getDatapathId(),
+                                    portStats.getPortNo(), ofVersion));
+                    
+                    BytesBuilder bytesBuilder = new BytesBuilder();
+                    bytesBuilder.setReceived(portStats.getRxBytes());
+                    bytesBuilder.setTransmitted(portStats.getTxBytes());
+                    statsBuilder.setBytes(bytesBuilder.build());
+                    
+                    PacketsBuilder packetsBuilder = new PacketsBuilder();
+                    packetsBuilder.setReceived(portStats.getRxPackets());
+                    packetsBuilder.setTransmitted(portStats.getTxPackets());
+                    statsBuilder.setPackets(packetsBuilder.build());
+                    
+                    DurationBuilder durationBuilder = new DurationBuilder();
+                    if (portStats.getDurationSec() != null)
+                        durationBuilder.setSecond(new Counter32(portStats.getDurationSec()));
+                    if (portStats.getDurationNsec() != null)
+                        durationBuilder.setNanosecond(new Counter32(portStats.getDurationNsec()));
+                    statsBuilder.setDuration(durationBuilder.build());
+                    statsBuilder.setCollisionCount(portStats.getCollisions());
+                    statsBuilder.setKey(new NodeConnectorStatisticsAndPortNumberMapKey(statsBuilder.getNodeConnectorId()));
+                    statsBuilder.setReceiveCrcError(portStats.getRxCrcErr());
+                    statsBuilder.setReceiveDrops(portStats.getRxDropped());
+                    statsBuilder.setReceiveErrors(portStats.getRxErrors());
+                    statsBuilder.setReceiveFrameError(portStats.getRxFrameErr());
+                    statsBuilder.setReceiveOverRunError(portStats.getRxOverErr());
+                    statsBuilder.setTransmitDrops(portStats.getTxDropped());
+                    statsBuilder.setTransmitErrors(portStats.getTxErrors());
+                    
+                    statsMap.add(statsBuilder.build());
+                }
+                message.setNodeConnectorStatisticsAndPortNumberMap(statsMap);
+
+                logger.debug("Converted ports statistics : {}",message.build().toString());
+
+                listDataObject.add(message.build());
+                return listDataObject;
+            }
             case OFPMPGROUP:{
-                logger.info("Received group statistics multipart reponse");
+                logger.debug("Received group statistics multipart reponse");
                 GroupStatisticsUpdatedBuilder message = new GroupStatisticsUpdatedBuilder();
                 message.setId(node);
                 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
                 message.setTransactionId(generateTransactionId(mpReply.getXid()));
-                MultipartReplyGroup replyBody = (MultipartReplyGroup)mpReply.getMultipartReplyBody();
+                MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase)mpReply.getMultipartReplyBody();
+                MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
                 message.setGroupStats(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats()));
+                
                 logger.debug("Converted group statistics : {}",message.toString());
                 listDataObject.add(message.build());
                 return listDataObject;
             }
             case OFPMPGROUPDESC:{
-                logger.info("Received group description statistics multipart reponse");
+                logger.debug("Received group description statistics multipart reponse");
                 
                 GroupDescStatsUpdatedBuilder message = new GroupDescStatsUpdatedBuilder();
                 message.setId(node);
                 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
                 message.setTransactionId(generateTransactionId(mpReply.getXid()));
-                MultipartReplyGroupDesc replyBody = (MultipartReplyGroupDesc)mpReply.getMultipartReplyBody();
-                message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc()));
+                MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase)mpReply.getMultipartReplyBody();
+                MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
+
+                message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc(), ofVersion));
+                
                 logger.debug("Converted group statistics : {}",message.toString());
                 listDataObject.add(message.build());
                 return listDataObject;
             }
             case OFPMPGROUPFEATURES: {
-                logger.info("Received group features multipart reponse");
+                logger.debug("Received group features multipart reponse");
                 GroupFeaturesUpdatedBuilder message = new GroupFeaturesUpdatedBuilder();
                 message.setId(node);
                 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
                 message.setTransactionId(generateTransactionId(mpReply.getXid()));
-                MultipartReplyGroupFeatures replyBody = (MultipartReplyGroupFeatures)mpReply.getMultipartReplyBody();
+                MultipartReplyGroupFeaturesCase caseBody = (MultipartReplyGroupFeaturesCase)mpReply.getMultipartReplyBody();
+                MultipartReplyGroupFeatures replyBody = caseBody.getMultipartReplyGroupFeatures();
                 List<Class<? extends GroupType>> supportedGroups = 
                         new ArrayList<Class<? extends GroupType>>();
                 
@@ -144,46 +288,47 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
                 message.setActions(getGroupActionsSupportBitmap(replyBody.getActionsBitmap()));
                 listDataObject.add(message.build());
 
-                //augmentGroupFeaturesToNode(message);
-                
-                //Send update notification to all the listeners 
                 return listDataObject;
             }
             case OFPMPMETER: {
-                logger.info("Received meter statistics multipart reponse");
+                logger.debug("Received meter statistics multipart reponse");
                 MeterStatisticsUpdatedBuilder message = new MeterStatisticsUpdatedBuilder();
                 message.setId(node);
                 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
                 message.setTransactionId(generateTransactionId(mpReply.getXid()));
                 
-                MultipartReplyMeter replyBody = (MultipartReplyMeter)mpReply.getMultipartReplyBody();
+                MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase)mpReply.getMultipartReplyBody();
+                MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
                 message.setMeterStats(meterStatsConvertor.toSALMeterStatsList(replyBody.getMeterStats()));
 
                 listDataObject.add(message.build());
                 return listDataObject;
             }
             case OFPMPMETERCONFIG:{
-                logger.info("Received meter config statistics multipart reponse");
+                logger.debug("Received meter config statistics multipart reponse");
                 
                 MeterConfigStatsUpdatedBuilder message = new MeterConfigStatsUpdatedBuilder();
                 message.setId(node);
                 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
                 message.setTransactionId(generateTransactionId(mpReply.getXid()));
                 
-                MultipartReplyMeterConfig replyBody = (MultipartReplyMeterConfig)mpReply.getMultipartReplyBody();
+                MultipartReplyMeterConfigCase caseBody = (MultipartReplyMeterConfigCase)mpReply.getMultipartReplyBody();
+                MultipartReplyMeterConfig replyBody = caseBody.getMultipartReplyMeterConfig();
                 message.setMeterConfigStats(meterStatsConvertor.toSALMeterConfigList(replyBody.getMeterConfig()));
+                
                 listDataObject.add(message.build());
                 return listDataObject;
             }
             case OFPMPMETERFEATURES:{
-                logger.info("Received meter features multipart reponse");
+                logger.debug("Received meter features multipart reponse");
                 //Convert OF message and send it to SAL listener
                 MeterFeaturesUpdatedBuilder message = new MeterFeaturesUpdatedBuilder();
                 message.setId(node);
                 message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
                 message.setTransactionId(generateTransactionId(mpReply.getXid()));
                 
-                MultipartReplyMeterFeatures replyBody = (MultipartReplyMeterFeatures)mpReply.getMultipartReplyBody();
+                MultipartReplyMeterFeaturesCase caseBody = (MultipartReplyMeterFeaturesCase)mpReply.getMultipartReplyBody();
+                MultipartReplyMeterFeatures replyBody = caseBody.getMultipartReplyMeterFeatures();
                 message.setMaxBands(replyBody.getMaxBands());
                 message.setMaxColor(replyBody.getMaxColor());
                 message.setMaxMeter(new Counter32(replyBody.getMaxMeter()));
@@ -218,13 +363,81 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
                 message.setMeterBandSupported(supportedMeterBand);
                 listDataObject.add(message.build());
 
-                //augmentMeterFeaturesToNode(message);
+                return listDataObject;
+            }
+            case OFPMPTABLE: {
+                logger.debug("Received flow table statistics reponse from openflow {} switch",msg.getVersion()==1?"1.0":"1.3+");
+                
+                FlowTableStatisticsUpdateBuilder message = new FlowTableStatisticsUpdateBuilder();
+                message.setId(node);
+                message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+                message.setTransactionId(generateTransactionId(mpReply.getXid()));
+                
+                MultipartReplyTableCase caseBody = (MultipartReplyTableCase)mpReply.getMultipartReplyBody();
+                MultipartReplyTable replyBody = caseBody.getMultipartReplyTable();
+                List<TableStats> swTablesStats = replyBody.getTableStats();
+                
+                List<FlowTableAndStatisticsMap> salFlowStats = new ArrayList<FlowTableAndStatisticsMap>(); 
+                for(TableStats swTableStats : swTablesStats){
+                    FlowTableAndStatisticsMapBuilder statisticsBuilder  = new FlowTableAndStatisticsMapBuilder();
+                    
+                    statisticsBuilder.setActiveFlows(new Counter32(swTableStats.getActiveCount()));
+                    statisticsBuilder.setPacketsLookedUp(new Counter64(swTableStats.getLookupCount()));
+                    statisticsBuilder.setPacketsMatched(new Counter64(swTableStats.getMatchedCount()));
+                    statisticsBuilder.setTableId(new TableId(swTableStats.getTableId()));
+                    salFlowStats.add(statisticsBuilder.build());
+                }
+                
+                message.setFlowTableAndStatisticsMap(salFlowStats);
+                
+                logger.debug("Converted flow table statistics : {}",message.build().toString());
+                listDataObject.add(message.build());
+                return listDataObject;
+            }
+            case OFPMPQUEUE: {
+                logger.debug("Received queue statistics multipart response");
+                
+                QueueStatisticsUpdateBuilder message = new QueueStatisticsUpdateBuilder();
+                message.setId(node);
+                message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+                message.setTransactionId(generateTransactionId(mpReply.getXid()));
 
-                //Send update notification to all the listeners 
+                MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase)mpReply.getMultipartReplyBody();
+                MultipartReplyQueue replyBody = caseBody.getMultipartReplyQueue();
+                
+                List<QueueIdAndStatisticsMap> statsMap = 
+                        new ArrayList<QueueIdAndStatisticsMap>();
+                
+                for (QueueStats queueStats: replyBody.getQueueStats()){
+                    
+                    QueueIdAndStatisticsMapBuilder statsBuilder = 
+                            new QueueIdAndStatisticsMapBuilder();
+                    statsBuilder.setNodeConnectorId(
+                            InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(sc.getFeatures().getDatapathId(),
+                                    queueStats.getPortNo(), ofVersion));
+                    statsBuilder.setTransmissionErrors(new Counter64(queueStats.getTxErrors()));
+                    statsBuilder.setTransmittedBytes(new Counter64(queueStats.getTxBytes()));
+                    statsBuilder.setTransmittedPackets(new Counter64(queueStats.getTxPackets()));
+                    
+                    DurationBuilder durationBuilder = new DurationBuilder();
+                    durationBuilder.setSecond(new Counter32(queueStats.getDurationSec()));
+                    durationBuilder.setNanosecond(new Counter32(queueStats.getDurationNsec()));
+                    statsBuilder.setDuration(durationBuilder.build());
+                    
+                    statsBuilder.setQueueId(new QueueId(queueStats.getQueueId()));
+                    statsBuilder.setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(sc.getFeatures().getDatapathId(),
+                            queueStats.getPortNo(), ofVersion));
+                    
+                    statsMap.add(statsBuilder.build());
+                }
+                message.setQueueIdAndStatisticsMap(statsMap);
+
+                logger.debug("Converted queue statistics : {}",message.build().toString());
+                listDataObject.add(message.build());
                 return listDataObject;
             }
+
             default:
-                logger.info(" Type : {}, not handled yet",mpReply.getType().name() );
                 return listDataObject;
             }
         }
@@ -257,24 +470,23 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
         List<Long> supportActionByGroups = new ArrayList<Long>();
         for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType supportedActions : actionsSupported){
             long supportActionBitmap = 0;
-            supportActionBitmap |= supportedActions.isOFPATOUTPUT()?(1 << 0): ~(1 << 0);
-            supportActionBitmap |= supportedActions.isOFPATCOPYTTLOUT()?(1 << 11): ~(1 << 11);
-            supportActionBitmap |= supportedActions.isOFPATCOPYTTLIN()?(1 << 12): ~(1 << 12);
-            supportActionBitmap |= supportedActions.isOFPATSETMPLSTTL()?(1 << 15): ~(1 << 15);
-            supportActionBitmap |= supportedActions.isOFPATDECMPLSTTL()?(1 << 16): ~(1 << 16);
-            supportActionBitmap |= supportedActions.isOFPATPUSHVLAN()?(1 << 16): ~(1 << 16);
-            supportActionBitmap |= supportedActions.isOFPATPOPVLAN()?(1 << 17): ~(1 << 17);
-            supportActionBitmap |= supportedActions.isOFPATPUSHMPLS()?(1 << 18): ~(1 << 18);
-            supportActionBitmap |= supportedActions.isOFPATPOPMPLS()?(1 << 19): ~(1 << 19);
-            supportActionBitmap |= supportedActions.isOFPATSETQUEUE()?(1 << 20): ~(1 << 20);
-            supportActionBitmap |= supportedActions.isOFPATGROUP()?(1 << 21): ~(1 << 21);
-            supportActionBitmap |= supportedActions.isOFPATSETNWTTL()?(1 << 22): ~(1 << 22);
-            supportActionBitmap |= supportedActions.isOFPATDECNWTTL()?(1 << 23): ~(1 << 23);
-            supportActionBitmap |= supportedActions.isOFPATSETFIELD()?(1 << 24): ~(1 << 24);
-            supportActionBitmap |= supportedActions.isOFPATPUSHPBB()?(1 << 25): ~(1 << 25);
-            supportActionBitmap |= supportedActions.isOFPATPOPPBB()?(1 << 26): ~(1 << 26);
-            supportActionBitmap |= supportedActions.isOFPATEXPERIMENTER()?(1 << 27): ~(1 << 27);
-            supportActionByGroups.add(new Long(supportActionBitmap));
+            supportActionBitmap |= supportedActions.isOFPATOUTPUT()?(1 << 0): 0;
+            supportActionBitmap |= supportedActions.isOFPATCOPYTTLOUT()?(1 << 11): 0;
+            supportActionBitmap |= supportedActions.isOFPATCOPYTTLIN()?(1 << 12): 0;
+            supportActionBitmap |= supportedActions.isOFPATSETMPLSTTL()?(1 << 15): 0;
+            supportActionBitmap |= supportedActions.isOFPATDECMPLSTTL()?(1 << 16): 0;
+            supportActionBitmap |= supportedActions.isOFPATPUSHVLAN()?(1 << 17): 0;
+            supportActionBitmap |= supportedActions.isOFPATPOPVLAN()?(1 << 18): 0;
+            supportActionBitmap |= supportedActions.isOFPATPUSHMPLS()?(1 << 19): 0;
+            supportActionBitmap |= supportedActions.isOFPATPOPMPLS()?(1 << 20): 0;
+            supportActionBitmap |= supportedActions.isOFPATSETQUEUE()?(1 << 21): 0;
+            supportActionBitmap |= supportedActions.isOFPATGROUP()?(1 << 22): 0;
+            supportActionBitmap |= supportedActions.isOFPATSETNWTTL()?(1 << 23): 0;
+            supportActionBitmap |= supportedActions.isOFPATDECNWTTL()?(1 << 24): 0;
+            supportActionBitmap |= supportedActions.isOFPATSETFIELD()?(1 << 25): 0;
+            supportActionBitmap |= supportedActions.isOFPATPUSHPBB()?(1 << 26): 0;
+            supportActionBitmap |= supportedActions.isOFPATPOPPBB()?(1 << 27): 0;
+            supportActionByGroups.add(Long.valueOf(supportActionBitmap));
         }
         return supportActionByGroups;
     }