sanitize Boolean autoboxing NPE
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / ModelDrivenSwitchImpl.java
index 337c165068e5263ed5d8e5b6b15694204f903fbe..d667d52f0ff8004220280d2a10fd61dff2111163 100644 (file)
@@ -14,6 +14,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Future;
 
+import org.opendaylight.controller.sal.common.util.Arguments;
 import org.opendaylight.controller.sal.common.util.Rpcs;
 import org.opendaylight.openflowjava.protocol.api.util.BinContent;
 import org.opendaylight.openflowplugin.openflow.md.OFConstants;
@@ -21,13 +22,14 @@ import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistingu
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterConvertor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.OpenflowEnumConstant;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PortConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.TableFeaturesConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
 import org.opendaylight.openflowplugin.openflow.md.core.session.IMessageDispatchService;
 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.inet.types.rev100924.Uri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutputBuilder;
@@ -62,7 +64,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.G
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowTableStatisticsOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsOutputBuilder;
@@ -70,6 +71,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutput;
@@ -89,7 +91,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterOutput;
@@ -112,6 +116,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowWildcardsV10;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Group;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
@@ -119,14 +131,20 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmMatchType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.Match;
@@ -140,6 +158,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder;
@@ -148,10 +167,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table._case.MultipartRequestTableBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.multipart.request.table.features.TableFeatures;
-//import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features.TableFeatures;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.GetPortOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortInput;
@@ -163,14 +182,25 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.G
 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetPortStatisticsInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetPortStatisticsOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetPortStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortOutputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableOutputBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 
+import com.google.common.base.Objects;
 import com.google.common.util.concurrent.Futures;
 
 /**
@@ -192,15 +222,21 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         version = context.getPrimaryConductor().getVersion();
     }
 
+    
     @Override
     public Future<RpcResult<AddFlowOutput>> addFlow(AddFlowInput input) {
        // Convert the AddFlowInput to FlowModInput
         FlowModInput ofFlowModInput = FlowConvertor.toFlowModInput(input, version);
+        BarrierInputBuilder barrierInput = new BarrierInputBuilder();
+        barrierInput.setVersion(version);
 
        // For Flow provisioning, the SwitchConnectionDistinguisher is set to null so
        // the request can be routed through any connection to the switch
 
        SwitchConnectionDistinguisher cookie = null ;
+       if (Objects.firstNonNull(input.isBarrier(), Boolean.FALSE)) {
+           Future<RpcResult<BarrierOutput>> barrierOFLib = messageService.barrier(barrierInput.build(), cookie);
+       }       
 
        LOG.debug("Calling the FlowMod RPC method on MessageDispatchService");
                Future<RpcResult<UpdateFlowOutput>> resultFromOFLib = messageService.flowMod(ofFlowModInput, cookie) ;
@@ -266,7 +302,6 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
        // Convert the AddMeterInput to MeterModInput
         MeterModInput ofMeterModInput = MeterConvertor.toMeterModInput(input, version);
 
-
        // For Meter provisioning, the SwitchConnectionDistinguisher is set to null so
        // the request can be routed through any connection to the switch
 
@@ -300,13 +335,17 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
     public Future<RpcResult<RemoveFlowOutput>> removeFlow(RemoveFlowInput input) {
        // Convert the RemoveFlowInput to FlowModInput
         FlowModInput ofFlowModInput = FlowConvertor.toFlowModInput(input, version);
-
+        BarrierInputBuilder barrierInput = new BarrierInputBuilder();
+        barrierInput.setVersion(version);
 
        // For Flow provisioning, the SwitchConnectionDistinguisher is set to null so
        // the request can be routed through any connection to the switch
 
        SwitchConnectionDistinguisher cookie = null ;
-
+        if (Objects.firstNonNull(input.isBarrier(), Boolean.FALSE)) {
+           Future<RpcResult<BarrierOutput>> barrierOFLib = messageService.barrier(barrierInput.build(), cookie);
+       }
+        
        LOG.debug("Calling the FlowMod RPC method on MessageDispatchService");
                Future<RpcResult<UpdateFlowOutput>> resultFromOFLib = messageService.flowMod(ofFlowModInput, cookie) ;
 
@@ -405,8 +444,76 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
 
     @Override
     public Future<RpcResult<Void>> transmitPacket(TransmitPacketInput input) {
-        // TODO Auto-generated method stub
-        return null;
+        LOG.info("TransmitPacket - {}",input);
+       // Convert TransmitPacket to PacketOutInput
+        
+       // TODO VD create PacketConvertor and move convert logic there
+        
+        // Build Port ID from TransmitPacketInput.Ingress
+        PortNumber inPortNr = null;
+        
+        List<PathArgument> inArgs = input.getIngress().getValue().getPath();
+        if (inArgs.size() >= 3) {
+            InstanceIdentifier.IdentifiableItem item = Arguments.checkInstanceOf(inArgs.get(2), InstanceIdentifier.IdentifiableItem.class);
+            NodeConnectorKey key = Arguments.checkInstanceOf(item.getKey(), NodeConnectorKey.class);
+            String[] split = key.getId().getValue().split(":");
+            Long port = Long.decode(split[split.length-1]);
+            inPortNr = new PortNumber(port);
+        } else {
+            // TODO Ed could by in this way or Exception or something else ?
+            inPortNr = new PortNumber(0xfffffffdL);
+        }
+        
+        // Build Buffer ID from TransmitPacketInput.Ingress
+        // TODO VD P! find how to fix PacketIn to add BufferID to augmetation
+        Long bufferId = OFConstants.OFP_NO_BUFFER;
+        
+        PortNumber outPort = null;
+        NodeConnectorRef outRef = input.getEgress();
+        List<PathArgument> outArgs = outRef.getValue().getPathArguments();
+        if (outArgs.size() >= 3) {
+            InstanceIdentifier.IdentifiableItem item = Arguments.checkInstanceOf(outArgs.get(2), InstanceIdentifier.IdentifiableItem.class);
+            NodeConnectorKey key = Arguments.checkInstanceOf(item.getKey(), NodeConnectorKey.class);
+            String[] split = key.getId().getValue().split(":");
+            Long port = Long.decode(split[split.length-1]);
+            outPort = new PortNumber(port);
+        } else {
+            new Exception("PORT NR not exist in Egress"); //TODO : P4 search for some normal exception
+        }
+        
+        // TODO VD P! wait for way to move Actions (e.g. augmentation)
+        
+        // TODO VD implementation for testing PacketIn (REMOVE IT)
+        List<ActionsList> actions = new ArrayList<ActionsList>();
+        ActionsListBuilder asBuild = new ActionsListBuilder();
+        ActionBuilder aBuild = new ActionBuilder();
+        aBuild.setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
+        PortActionBuilder paBuild = new PortActionBuilder();
+        paBuild.setPort(outPort);        
+        aBuild.addAugmentation(PortAction.class, paBuild.build());
+        MaxLengthActionBuilder mlBuild = new MaxLengthActionBuilder();
+        mlBuild.setMaxLength(0xffff);
+        aBuild.addAugmentation(MaxLengthAction.class, mlBuild.build());
+        asBuild.setAction(aBuild.build());
+        actions.add(asBuild.build());
+        
+       PacketOutInputBuilder builder = new PacketOutInputBuilder();
+       builder.setActionsList(actions);
+       builder.setData(input.getPayload());
+        builder.setVersion(version);
+        builder.setXid(sessionContext.getNextXid());
+        builder.setInPort(inPortNr);
+        builder.setBufferId(bufferId);
+        // --------------------------------------------------------
+        
+        PacketOutInput message = builder.build();
+       
+       // TODO VD NULL for yet  - find how to translate cookie from TransmitPacketInput
+//     SwitchConnectionDistinguisher cookie = ( "what is need to do" ) input.getCookie();
+       SwitchConnectionDistinguisher cookie = null ;
+       
+       LOG.debug("Calling the transmitPacket RPC method");
+       return messageService.packetOut(message, cookie);
     }
 
     private FlowModInputBuilder toFlowModInputBuilder(Flow source) {
@@ -439,14 +546,18 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
     public Future<RpcResult<UpdateFlowOutput>> updateFlow(UpdateFlowInput input) {
        // Convert the UpdateFlowInput to FlowModInput
         FlowModInput ofFlowModInput = FlowConvertor.toFlowModInput(input.getUpdatedFlow(), version);
-
+        BarrierInputBuilder barrierInput = new BarrierInputBuilder();
+        barrierInput.setVersion(version);
        // Call the RPC method on MessageDispatchService
 
        // For Flow provisioning, the SwitchConnectionDistinguisher is set to null so
        // the request can be routed through any connection to the switch
 
        SwitchConnectionDistinguisher cookie = null ;
-
+        if (Objects.firstNonNull(input.getUpdatedFlow().isBarrier(), Boolean.FALSE)) {
+           Future<RpcResult<BarrierOutput>> barrierOFLib = messageService.barrier(barrierInput.build(), cookie);
+       }
+        
        LOG.debug("Calling the FlowMod RPC method on MessageDispatchService");
                Future<RpcResult<UpdateFlowOutput>> resultFromOFLib = messageService.flowMod(ofFlowModInput, cookie) ;
 
@@ -874,8 +985,7 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         MultipartRequestPortStatsCaseBuilder caseBuilder = new MultipartRequestPortStatsCaseBuilder();
         MultipartRequestPortStatsBuilder mprPortStatsBuilder = new MultipartRequestPortStatsBuilder();
         //Select all ports 
-        //TODO :need to change once i rebase on latest code.
-        mprPortStatsBuilder.setPortNo(OpenflowEnumConstant.OFPP_ANY);
+        mprPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
         caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build());
         
         //Set request body to main multipart request
@@ -1013,7 +1123,7 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
     
     @Override
     public Future<RpcResult<UpdateTableOutput>> updateTable(
-                       UpdateTableInput input) {
+                        UpdateTableInput input) {
 
         // Get the Xid. The same Xid has to be sent in all the Multipart requests
         Long xid = this.getSessionContext().getNextXid();
@@ -1028,45 +1138,26 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
 
         //Convert the list of all MD-SAL table feature object into OF library object
         List<TableFeatures> ofTableFeatureList = TableFeaturesConvertor.toTableFeaturesRequest(input.getUpdatedTable()) ;
-        int totalNoOfTableFeatureEntry = ofTableFeatureList.size();
+        
 
         MultipartRequestTableFeaturesCaseBuilder caseRequest = new MultipartRequestTableFeaturesCaseBuilder();
         MultipartRequestTableFeaturesBuilder tableFeaturesRequest = new MultipartRequestTableFeaturesBuilder();
 
-        // Slice the multipart request based on the configuration parameter, which is the no. of TableFeatureList element
-        // to be put in one multipart message. Default is 5
-        // This parameter must be set based on switch's Buffer capacity
-
-        List<TableFeatures> tmpOfTableFeatureList = null ;
-        String tableFeatureListCount = System.getProperty( "of.tableFeaturesCountPerMultipart", "5") ;
-        int noOfEntriesInMPR = Integer.parseInt(tableFeatureListCount) ;
-
-        int index = 0 ;
-        while(totalNoOfTableFeatureEntry-index > 0 ) {
-               if( (totalNoOfTableFeatureEntry-index) > noOfEntriesInMPR ) {
-                       mprInput.setFlags(new MultipartRequestFlags(true));
-                       tmpOfTableFeatureList = ofTableFeatureList.subList(index, index + noOfEntriesInMPR);
-               }
-               else {
-                       // Last multipart request
-                       mprInput.setFlags(new MultipartRequestFlags(false));
-                       tmpOfTableFeatureList = ofTableFeatureList.subList(index, totalNoOfTableFeatureEntry );
-               }
-
-        tableFeaturesRequest.setTableFeatures(tmpOfTableFeatureList) ;
+        mprInput.setFlags(new MultipartRequestFlags(true));
+        
+        tableFeaturesRequest.setTableFeatures(ofTableFeatureList) ;
+        
         //Set request body to main multipart request
         caseRequest.setMultipartRequestTableFeatures(tableFeaturesRequest.build());
         mprInput.setMultipartRequestBody(caseRequest.build());
 
         //Send the request, no cookies associated, use any connection
-        LOG.debug("Send Table Feature request :{}",tmpOfTableFeatureList);
+        LOG.debug("Send Table Feature request :{}",ofTableFeatureList);
         this.messageService.multipartRequest(mprInput.build(), null);
-        index += noOfEntriesInMPR ;
-               tmpOfTableFeatureList = null ; // To avoid any corrupt data
-        }
+        
         
         //Extract the Xid only from the Future for the last RPC and
-       // send it back to the NSF
+        // send it back to the NSF
         LOG.debug("Returning the result and transaction id to NSF");
         LOG.debug("Return results and transaction id back to caller");
         UpdateTableOutputBuilder output = new UpdateTableOutputBuilder();
@@ -1098,15 +1189,14 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder  = new MultipartRequestFlowCaseBuilder (); 
         MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
         mprFlowRequestBuilder.setTableId(arg0.getTableId().getValue());
-        mprFlowRequestBuilder.setOutPort(OpenflowEnumConstant.OFPP_ANY);
-        mprFlowRequestBuilder.setOutGroup(OpenflowEnumConstant.OFPG_ANY);
-        mprFlowRequestBuilder.setCookie(OpenflowEnumConstant.DEFAULT_COOKIE);
-        mprFlowRequestBuilder.setCookieMask(OpenflowEnumConstant.DEFAULT_COOKIE_MASK);
+        mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
+        mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+        mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+        mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
         
-        //TODO: repeating code
         if(version == OFConstants.OFP_VERSION_1_0){
             LOG.info("Target node is running openflow version 1.0");
-            FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,false,false,false,false,false,false,false,false,false,false);
+            FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,true,true,true,true,true,true,true,true,true);
             mprFlowRequestBuilder.setMatchV10(new MatchV10Builder().setWildcards(wildCard).build());
         }
         if(version == OFConstants.OFP_VERSION_1_3){
@@ -1154,16 +1244,16 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         // Create multipart request body for fetch all the group stats
         MultipartRequestFlowCaseBuilder  multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
         MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
-        mprFlowRequestBuilder.setTableId(OpenflowEnumConstant.OFPTT_ALL);
-        mprFlowRequestBuilder.setOutPort(OpenflowEnumConstant.OFPP_ANY);
-        mprFlowRequestBuilder.setOutGroup(OpenflowEnumConstant.OFPG_ANY);
-        mprFlowRequestBuilder.setCookie(OpenflowEnumConstant.DEFAULT_COOKIE);
-        mprFlowRequestBuilder.setCookieMask(OpenflowEnumConstant.DEFAULT_COOKIE_MASK);
-        mprFlowRequestBuilder.setCookieMask(OpenflowEnumConstant.DEFAULT_COOKIE_MASK);
+        mprFlowRequestBuilder.setTableId(OFConstants.OFPTT_ALL);
+        mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
+        mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+        mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+        mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
+        mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
         
         //TODO: repeating code
         if(version == OFConstants.OFP_VERSION_1_0){
-            FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,false,false,false,false,false,false,false,false,false,false);
+            FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,true,true,true,true,true,true,true,true,true);
             mprFlowRequestBuilder.setMatchV10(new MatchV10Builder().setWildcards(wildCard).build());
         }
         if(version == OFConstants.OFP_VERSION_1_3){
@@ -1210,9 +1300,9 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
         mprFlowRequestBuilder.setTableId(arg0.getTableId());
         mprFlowRequestBuilder.setOutPort(arg0.getOutPort().longValue());
-        mprFlowRequestBuilder.setOutGroup(OpenflowEnumConstant.OFPG_ANY);
-        mprFlowRequestBuilder.setCookie(OpenflowEnumConstant.DEFAULT_COOKIE);
-        mprFlowRequestBuilder.setCookieMask(OpenflowEnumConstant.DEFAULT_COOKIE_MASK);
+        mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+        mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+        mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
 
         // convert and inject match
         MatchReactor.getInstance().convert(arg0.getMatch(), version, mprFlowRequestBuilder);
@@ -1262,14 +1352,14 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         MultipartRequestAggregateCaseBuilder multipartRequestAggregateCaseBuilder  = new MultipartRequestAggregateCaseBuilder (); 
         MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder();
         mprAggregateRequestBuilder.setTableId(arg0.getTableId().getValue());
-        mprAggregateRequestBuilder.setOutPort(OpenflowEnumConstant.OFPP_ANY);
-        mprAggregateRequestBuilder.setOutGroup(OpenflowEnumConstant.OFPG_ANY);
-        mprAggregateRequestBuilder.setCookie(OpenflowEnumConstant.DEFAULT_COOKIE);
-        mprAggregateRequestBuilder.setCookieMask(OpenflowEnumConstant.DEFAULT_COOKIE_MASK);
+        mprAggregateRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
+        mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+        mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+        mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
         
         //TODO: repeating code
         if(version == OFConstants.OFP_VERSION_1_0){
-            FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,false,false,false,false,false,false,false,false,false,false);
+            FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,true,true,true,true,true,true,true,true,true);
             mprAggregateRequestBuilder.setMatchV10(new MatchV10Builder().setWildcards(wildCard).build());
         }
         if(version == OFConstants.OFP_VERSION_1_3){
@@ -1317,9 +1407,9 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder();
         mprAggregateRequestBuilder.setTableId(arg0.getTableId());
         mprAggregateRequestBuilder.setOutPort(arg0.getOutPort().longValue());
-        mprAggregateRequestBuilder.setOutGroup(OpenflowEnumConstant.OFPG_ANY);
-        mprAggregateRequestBuilder.setCookie(OpenflowEnumConstant.DEFAULT_COOKIE);
-        mprAggregateRequestBuilder.setCookieMask(OpenflowEnumConstant.DEFAULT_COOKIE_MASK);
+        mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+        mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+        mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
 
 
         MatchReactor.getInstance().convert(arg0.getMatch(), version, mprAggregateRequestBuilder);
@@ -1385,6 +1475,134 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         return Futures.immediateFuture(rpcResult);
     }
 
+    @Override
+    public Future<RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> getAllQueuesStatisticsFromAllPorts(
+            GetAllQueuesStatisticsFromAllPortsInput arg0) {
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.info("Prepare queue statistics request to collect stats for all queues attached to all the ports of node {} - TrasactionId - {}",arg0.getNode().getValue(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPQUEUE);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body to fetch stats for all the port of the node
+        MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+        MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
+        //Select all ports 
+        mprQueueBuilder.setPortNo(OFConstants.OFPP_ANY);
+        //Select all the ports
+        mprQueueBuilder.setQueueId(OFConstants.OFPQ_ANY);
+        
+        caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
+        
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(caseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send queue statistics request :{}",mprQueueBuilder.build().toString());
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetAllQueuesStatisticsFromAllPortsOutputBuilder output = new GetAllQueuesStatisticsFromAllPortsOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setQueueIdAndStatisticsMap(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetAllQueuesStatisticsFromAllPortsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> getAllQueuesStatisticsFromGivenPort(
+            GetAllQueuesStatisticsFromGivenPortInput arg0) {
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.info("Prepare queue statistics request to collect stats for " +
+                       "all queues attached to given port {} of node {} - TrasactionId - {}",arg0.getNodeConnectorId().toString(),arg0.getNode().getValue(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPQUEUE);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body to fetch stats for all the port of the node
+        MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+        MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
+        //Select all queues
+        mprQueueBuilder.setQueueId(OFConstants.OFPQ_ANY);
+        //Select specific port
+        mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(arg0.getNodeConnectorId()));
+        
+        caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
+        
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(caseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send queue statistics request :{}",mprQueueBuilder.build().toString());
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetAllQueuesStatisticsFromGivenPortOutputBuilder output = new GetAllQueuesStatisticsFromGivenPortOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setQueueIdAndStatisticsMap(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetAllQueuesStatisticsFromGivenPortOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetQueueStatisticsFromGivenPortOutput>> getQueueStatisticsFromGivenPort(
+            GetQueueStatisticsFromGivenPortInput arg0) {
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.info("Prepare queue statistics request to collect stats for " +
+                        "given queue attached to given port {} of node {} - TrasactionId - {}",arg0.getQueueId().toString(),arg0.getNodeConnectorId().toString(),arg0.getNode().getValue(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPQUEUE);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body to fetch stats for all the port of the node
+        MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+        MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
+        //Select specific queue
+        mprQueueBuilder.setQueueId(arg0.getQueueId().getValue());
+        //Select specific port 
+        mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(arg0.getNodeConnectorId()));
+        
+        caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
+        
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(caseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send queue statistics request :{}",mprQueueBuilder.build().toString());
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetQueueStatisticsFromGivenPortOutputBuilder output = new GetQueueStatisticsFromGivenPortOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setQueueIdAndStatisticsMap(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetQueueStatisticsFromGivenPortOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
     @Override
     public Future<RpcResult<GetAllFlowStatisticsOutput>> getAllFlowStatistics(GetAllFlowStatisticsInput arg0) {
         //TODO: Depricated, need to clean it up. Sal-Compatibility layes is dependent on it.
@@ -1418,4 +1636,5 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         // TODO Auto-generated method stub
         return null;
     }
+
 }