MD-SAL Statistics Manager- Implemented rpc/notification calls for group/meter statistics 37/3037/5
authorEd Warnicke <eaw@cisco.com>
Wed, 20 Nov 2013 23:39:33 +0000 (05:09 +0530)
committerEd Warnicke <eaw@cisco.com>
Wed, 27 Nov 2013 21:58:27 +0000 (13:58 -0800)
Change-Id: I8a05923c3691d23bb4c8359f1db47af8f417ab61
Signed-off-by: Anilkumar Vishnoi <avishnoi@in.ibm.com>
Signed-off-by: Ed Warnicke <eaw@cisco.com>
12 files changed:
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/ModelDrivenSwitch.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/AbstractModelDrivenSwitch.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/ModelDrivenSwitchImpl.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java [new file with mode: 0644]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterStatsResponseConvertor.java [new file with mode: 0644]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/IMessageDispatchService.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/MessageDispatchServiceImpl.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java [new file with mode: 0644]

index c52c0cf0106e21749dbea32cbdd92364de8dc57f..624006ef52e20d932fc541a2be3cd60c1af4c522 100644 (file)
@@ -17,6 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.Rem
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput;
@@ -26,6 +27,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.Rem
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
 import org.opendaylight.yangtools.concepts.CompositeObjectRegistration;
@@ -38,6 +40,8 @@ public interface ModelDrivenSwitch extends //
         SalFlowService, //
         SalMeterService, //
         PacketProcessingService, //
+        OpendaylightGroupStatisticsService,
+        OpendaylightMeterStatisticsService,
         Identifiable<InstanceIdentifier<Node>> {
 
     CompositeObjectRegistration<ModelDrivenSwitch> register(ProviderContext ctx);
index ea3cc66f6152ee955f3dc0a99ef991be49de7bc3..d5e7c82c1f6b7e53e6b6a5afca9418a7c9a2b6e0 100644 (file)
@@ -28,11 +28,18 @@ import org.opendaylight.openflowplugin.openflow.md.core.translator.ExperimenterT
 import org.opendaylight.openflowplugin.openflow.md.core.translator.FlowRemovedTranslator;
 import org.opendaylight.openflowplugin.openflow.md.core.translator.MultiPartMessageDescToNodeUpdatedTranslator;
 import org.opendaylight.openflowplugin.openflow.md.core.translator.MultiPartReplyPortToNodeConnectorUpdatedTranslator;
+import org.opendaylight.openflowplugin.openflow.md.core.translator.MultipartReplyTranslator;
 import org.opendaylight.openflowplugin.openflow.md.core.translator.PacketInTranslator;
 import org.opendaylight.openflowplugin.openflow.md.core.translator.PortStatusMessageToNodeConnectorUpdatedTranslator;
 import org.opendaylight.openflowplugin.openflow.md.queue.PopListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupDescStatsUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupFeaturesUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupStatisticsUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterConfigStatsUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterStatisticsUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessage;
@@ -90,6 +97,7 @@ public class MDController implements IMDController {
         addMessageTranslator(MultipartReplyMessage.class,OF13,new MultiPartReplyPortToNodeConnectorUpdatedTranslator());
         addMessageTranslator(MultipartReplyMessage.class,OF13, new MultiPartMessageDescToNodeUpdatedTranslator());
         addMessageTranslator(ExperimenterMessage.class, OF10, new ExperimenterTranslator());
+        addMessageTranslator(MultipartReplyMessage.class,OF13, new MultipartReplyTranslator());
 
         //TODO: move registration to factory
         NotificationPopListener<DataObject> notificationPopListener = new NotificationPopListener<DataObject>();
@@ -97,6 +105,17 @@ public class MDController implements IMDController {
         addMessagePopListener(PacketReceived.class,notificationPopListener);
         addMessagePopListener(TransmitPacketInput.class, notificationPopListener);
         addMessagePopListener(NodeUpdated.class, notificationPopListener);
+        
+        //Notification registrations for group-statistics
+        addMessagePopListener(GroupStatisticsUpdated.class, notificationPopListener);
+        addMessagePopListener(GroupFeaturesUpdated.class, notificationPopListener);
+        addMessagePopListener(GroupDescStatsUpdated.class, notificationPopListener);
+        
+        //Notification registrations for meter-statistics
+        addMessagePopListener(MeterStatisticsUpdated.class, notificationPopListener);
+        addMessagePopListener(MeterConfigStatsUpdated.class, notificationPopListener);
+        addMessagePopListener(MeterFeaturesUpdated.class, notificationPopListener);
+        
 
         // Push the updated Listeners to Session Manager which will be then picked up by ConnectionConductor eventually
         OFSessionUtil.getSessionManager().setTranslatorMapping(messageTranslators);
index 87dd6ba1f556024680f363b0a63b7b8848faa9bb..a0f72da8f67fe135a8afe27f42f7547751605870 100644 (file)
@@ -13,9 +13,11 @@ import org.opendaylight.openflowplugin.openflow.md.ModelDrivenSwitch;
 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
 import org.opendaylight.yangtools.concepts.CompositeObjectRegistration;
 import org.opendaylight.yangtools.concepts.CompositeObjectRegistration.CompositeObjectRegistrationBuilder;
@@ -36,6 +38,10 @@ public abstract class AbstractModelDrivenSwitch implements ModelDrivenSwitch {
 
     private RoutedRpcRegistration<PacketProcessingService> packetRegistration;
 
+    private RoutedRpcRegistration<OpendaylightGroupStatisticsService> groupStatisticsRegistration;
+
+    private RoutedRpcRegistration<OpendaylightMeterStatisticsService> meterStatisticsRegistration;
+
     protected final SessionContext sessionContext;
 
     protected AbstractModelDrivenSwitch(InstanceIdentifier<Node> identifier,SessionContext conductor) {
@@ -68,6 +74,14 @@ public abstract class AbstractModelDrivenSwitch implements ModelDrivenSwitch {
         //packetRegistration = ctx.addRoutedRpcImplementation(PacketProcessingService.class, this);
         //packetRegistration.registerPath(NodeContext.class, getIdentifier());
         //builder.add(packetRegistration);
+        
+        groupStatisticsRegistration = ctx.addRoutedRpcImplementation(OpendaylightGroupStatisticsService.class, this);
+        groupStatisticsRegistration.registerPath(NodeContext.class, getIdentifier());
+        builder.add(groupStatisticsRegistration);
+
+        meterStatisticsRegistration = ctx.addRoutedRpcImplementation(OpendaylightMeterStatisticsService.class, this);
+        meterStatisticsRegistration.registerPath(NodeContext.class, getIdentifier());
+        builder.add(meterStatisticsRegistration);
 
         return builder.toInstance();
     }
index f469aa73c24c866ed4bd65e86b251e17c3540e1a..5ce098bd51c280b52504482e607aa091744db6b0 100644 (file)
@@ -7,8 +7,10 @@
  */
 package org.opendaylight.openflowplugin.openflow.md.core.sal;
 
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Future;
 
@@ -28,9 +30,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.Remo
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
 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;
@@ -38,6 +41,18 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.Rem
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutputBuilder;
+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.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput;
@@ -49,13 +64,36 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.Rem
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutputBuilder;
+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.common.types.rev130731.Group;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Meter;
+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.oxm.rev130731.oxm.fields.MatchEntries;
 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.match.grouping.Match;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcError;
@@ -438,4 +476,308 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
     public NodeId getNodeId() {
         return nodeId;
     }
+
+    /*
+     * Methods for requesting statistics from switch
+     */
+    @Override
+    public Future<RpcResult<GetAllGroupStatisticsOutput>> getAllGroupStatistics(GetAllGroupStatisticsInput input) {
+
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.debug("Prepare statistics request for all the groups - Transaction id - {}",xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPGROUP);
+        mprInput.setVersion((short)0x04);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the group stats
+        MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder();
+        mprGroupBuild.setGroupId((long) Group.OFPGALL.getIntValue());
+
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(mprGroupBuild.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send group statistics request to the switch :{}",mprGroupBuild);
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        LOG.debug("Return results and transaction id back to caller");
+        GetAllGroupStatisticsOutputBuilder output = new GetAllGroupStatisticsOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setGroupStats(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetAllGroupStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+
+    }
+
+    @Override
+    public Future<RpcResult<GetGroupDescriptionOutput>> getGroupDescription(GetGroupDescriptionInput input) {
+
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.debug("Prepare group description statistics request - Transaction id - {}",xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPGROUPDESC);
+        mprInput.setVersion((short)0x04);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the group description stats
+        MultipartRequestGroupDescBuilder mprGroupDescBuild = new MultipartRequestGroupDescBuilder();
+
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(mprGroupDescBuild.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send group desciption statistics request to switch : {}",mprGroupDescBuild);
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        LOG.debug("Return results and transaction id back to caller");
+        GetGroupDescriptionOutputBuilder output = new GetGroupDescriptionOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setGroupDescStats(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetGroupDescriptionOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+
+    }
+
+    @Override
+    public Future<RpcResult<GetGroupFeaturesOutput>> getGroupFeatures(GetGroupFeaturesInput input) {
+
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.debug("Prepare group features statistics request - Transaction id - {}",xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPGROUPFEATURES);
+        mprInput.setVersion((short)0x04);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the group description stats
+        MultipartRequestGroupFeaturesBuilder mprGroupFeaturesBuild = new MultipartRequestGroupFeaturesBuilder();
+
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(mprGroupFeaturesBuild.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send group features statistics request :{}",mprGroupFeaturesBuild);
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        LOG.debug("Return results and transaction id back to caller");
+        GetGroupFeaturesOutputBuilder output = new GetGroupFeaturesOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetGroupFeaturesOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetGroupStatisticsOutput>> getGroupStatistics(GetGroupStatisticsInput input) {
+
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.debug("Prepare statistics request for group ({}) - Transaction id - {}",input.getId().toString(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPGROUP);
+        mprInput.setVersion((short)0x04);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the group stats
+        MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder();
+        mprGroupBuild.setGroupId(input.getGroupId().getValue());
+
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(mprGroupBuild.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send group statistics request :{}",mprGroupBuild);
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        LOG.debug("Return results and transaction id back to caller");
+        GetGroupStatisticsOutputBuilder output = new GetGroupStatisticsOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setGroupStats(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetGroupStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetAllMeterConfigStatisticsOutput>> getAllMeterConfigStatistics(
+            GetAllMeterConfigStatisticsInput input) {
+
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.debug("Prepare config request for all the meters - Transaction id - {}",xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPMETERCONFIG);
+        mprInput.setVersion((short)0x04);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the meter stats
+        MultipartRequestMeterConfigBuilder mprMeterConfigBuild = new MultipartRequestMeterConfigBuilder();
+        mprMeterConfigBuild.setMeterId((long) Meter.OFPMALL.getIntValue());
+
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(mprMeterConfigBuild.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send meter statistics request :{}",mprMeterConfigBuild);
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        LOG.debug("Return results and transaction id back to caller");
+        GetAllMeterConfigStatisticsOutputBuilder output = new GetAllMeterConfigStatisticsOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setMeterConfigStats(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetAllMeterConfigStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetAllMeterStatisticsOutput>> getAllMeterStatistics(GetAllMeterStatisticsInput input) {
+
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.debug("Prepare statistics request for all the meters - Transaction id - {}",xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPMETER);
+        mprInput.setVersion((short)0x04);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the meter stats
+        MultipartRequestMeterBuilder mprMeterBuild = new MultipartRequestMeterBuilder();
+        mprMeterBuild.setMeterId((long) Meter.OFPMALL.getIntValue());
+
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(mprMeterBuild.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send meter statistics request :{}",mprMeterBuild);
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        LOG.debug("Return results and transaction id back to caller");
+        GetAllMeterStatisticsOutputBuilder output = new GetAllMeterStatisticsOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setMeterStats(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetAllMeterStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetMeterFeaturesOutput>> getMeterFeatures(GetMeterFeaturesInput input) {
+
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.debug("Prepare features statistics request for all the meters - Transaction id - {}",xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPMETERFEATURES);
+        mprInput.setVersion((short)0x04);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the group description stats
+        MultipartRequestMeterFeaturesBuilder mprMeterFeaturesBuild = new MultipartRequestMeterFeaturesBuilder();
+
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(mprMeterFeaturesBuild.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send meter features statistics request :{}",mprMeterFeaturesBuild);
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        LOG.debug("Return results and transaction id back to caller");
+        GetMeterFeaturesOutputBuilder output = new GetMeterFeaturesOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetMeterFeaturesOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetMeterStatisticsOutput>> getMeterStatistics(GetMeterStatisticsInput input) {
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.debug("Preprae statistics request for Meter ({}) - Transaction id - {}",input.getMeterId().getValue(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPMETER);
+        mprInput.setVersion((short)0x04);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the meter stats
+        MultipartRequestMeterBuilder mprMeterBuild = new MultipartRequestMeterBuilder();
+        //Select specific meter
+        mprMeterBuild.setMeterId(input.getMeterId().getValue());
+
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(mprMeterBuild.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send meter statistics request :{}",mprMeterBuild);
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        LOG.debug("Return results and transaction id back to caller");
+        GetMeterStatisticsOutputBuilder output = new GetMeterStatisticsOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setMeterStats(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetMeterStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    private TransactionId generateTransactionId(Long xid){
+        String stringXid =xid.toString();
+        BigInteger bigIntXid = new BigInteger( stringXid );
+        return new TransactionId(bigIntXid);
+
+    }
 }
index 9048eaecd23a71afc7d282661aed46cc4f2b8a86..0a6de2cfc176e3138b3d7185fc07663a1f361437 100644 (file)
@@ -5,17 +5,37 @@ import java.util.List;
 
 import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType;
 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;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlIn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOut;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;
@@ -35,9 +55,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;
@@ -46,7 +63,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev1
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;
@@ -66,6 +82,7 @@ import org.slf4j.LoggerFactory;
 /**
  * @author usha@ericsson Action List:This class takes data from SAL layer and
  *         converts into OF Data
+ * @author avishnoi@in.ibm.com  Added convertor for OF bucket actions to SAL actions 
  *
  */
 public final class ActionConvertor {
@@ -397,4 +414,202 @@ public final class ActionConvertor {
         actionsListBuilder.setAction(actionBuilder.build());
         return actionsListBuilder.build();
     }
+    
+    /**
+     * Method to convert OF actions associated with bucket to SAL Actions.
+     * @param actionList
+     * @return List of converted SAL Actions.
+     */
+    public static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> toSALBucketActions(List<ActionsList> actionList){
+        
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> bucketActions = 
+                new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action>();
+        
+        for(ActionsList actionDesc : actionList){
+            
+            org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action 
+            = actionDesc.getAction();
+
+            if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output)
+                bucketActions.add(ofToSALOutputAction(action));
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group)
+                bucketActions.add(ofToSALGroupAction(action));
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut){
+                CopyTtlOutBuilder copyTtlOutaction = new CopyTtlOutBuilder();
+                bucketActions.add(copyTtlOutaction.build());
+            }
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn){
+                CopyTtlInBuilder copyTtlInaction = new CopyTtlInBuilder();
+                bucketActions.add(copyTtlInaction.build());
+            }
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl)
+                bucketActions.add(ofToSALSetMplsTtl(action));
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl){
+                DecMplsTtlBuilder decMplsTtl = new DecMplsTtlBuilder(); 
+                bucketActions.add(decMplsTtl.build());
+            }
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan)
+                bucketActions.add(ofToSALPushVlanAction(action));
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan){
+                PopVlanActionBuilder popVlan = new PopVlanActionBuilder();
+                bucketActions.add(popVlan.build());
+            }
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls){
+                PushMplsActionBuilder pushMpls = new PushMplsActionBuilder(); 
+                bucketActions.add(pushMpls.build());
+            }
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls){
+                PopMplsActionBuilder popMpls = new PopMplsActionBuilder(); 
+                bucketActions.add(popMpls.build());
+            }
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue)
+                bucketActions.add(ofToSALSetQueue(action));
+
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl)
+                bucketActions.add(ofToSALSetNwTtl(action));
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl){
+                DecNwTtlBuilder decNwTtl = new DecNwTtlBuilder();
+                bucketActions.add(decNwTtl.build());
+            }
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField)
+                bucketActions.add(FlowConvertor.ofToSALSetField(action));
+
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb)
+                bucketActions.add(ofToSALPushPbbAction(action));
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb){
+                PopPbbActionBuilder popPbb = new PopPbbActionBuilder(); 
+                bucketActions.add(popPbb.build());
+            }
+            else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter){
+                //bucketActions.add(ofToSALExperimenter(action));
+                // TODO: Need to explore/discuss on how to handle experimenter case.
+            }
+
+        }
+        return bucketActions;
+    }
+    
+    /**
+     * Method converts OF Output action object to SAL Output action object. 
+     * @param action org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action
+     * @return OutputAction
+     */
+    public static OutputAction ofToSALOutputAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+
+        OutputActionBuilder outputAction = new OutputActionBuilder();
+        PortAction port = action.getAugmentation(PortAction.class);
+        if(port != null){
+            outputAction.setOutputNodeConnector(new Uri(port.getPort().getValue().toString()));
+        }else {
+            logger.error("Provided action is not OF Output action, no associated port found!" );
+        }
+        
+        MaxLengthAction length = action.getAugmentation(MaxLengthAction.class);
+        if(length != null){
+            outputAction.setMaxLength(length.getMaxLength());
+        }else{
+            logger.error("Provided action is not OF Output action, no associated length found!");
+        }
+
+        return outputAction.build();
+    }
+
+    /**
+     * Method converts OF GroupAction object to SAL GroupAction object
+     * @param action
+     * @return GroupAction
+     */
+    public static GroupAction ofToSALGroupAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+
+        GroupActionBuilder groupAction = new GroupActionBuilder();
+        
+        GroupIdAction groupId = action.getAugmentation(GroupIdAction.class);
+        groupAction.setGroupId(groupId.getGroupId());
+        
+        return groupAction.build();
+    }
+    
+    /**
+     * Method converts OF SetMplsTTL action object to SAL SetMplsTTL action object.
+     * @param action
+     * @return
+     */
+    public static SetMplsTtlAction ofToSALSetMplsTtl(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action){
+
+        SetMplsTtlActionBuilder mplsTtlAction = new SetMplsTtlActionBuilder();
+        MplsTtlAction mplsTtl = action.getAugmentation(MplsTtlAction.class);
+        mplsTtlAction.setMplsTtl(mplsTtl.getMplsTtl());
+        return mplsTtlAction.build();
+    }
+    
+    /**
+     * Method converts OF Pushvlan action to SAL PushVlan action.
+     * @param action
+     * @return PushVlanAction
+     */
+    public static PushVlanAction ofToSALPushVlanAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+
+        PushVlanActionBuilder pushVlanAction = new PushVlanActionBuilder();
+        
+        EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
+        pushVlanAction.setVlanId(new VlanId(etherType.getEthertype().getValue()));
+        
+        return pushVlanAction.build();
+    }
+    
+    /**
+     * Method converts OF SetQueue action to SAL SetQueue action.
+     * @param action
+     * @return SetQueueAction
+     */
+    public static SetQueueAction ofToSALSetQueue(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+
+        SetQueueActionBuilder setQueueAction = new SetQueueActionBuilder();
+        
+        QueueIdAction queueId = action.getAugmentation(QueueIdAction.class);
+        setQueueAction.setQueueId(queueId.getQueueId());
+        
+        return setQueueAction.build();
+    }
+
+    /**
+     * Method converts OF SetNwTtl action to SAL SetNwTtl action.
+     * @param action
+     * @return SetNwTtlAction
+     */
+    public static SetNwTtlAction ofToSALSetNwTtl(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+
+        SetNwTtlActionBuilder setNwTtl = new SetNwTtlActionBuilder();
+        NwTtlAction nwTtl = action.getAugmentation(NwTtlAction.class);
+        setNwTtl.setNwTtl(nwTtl.getNwTtl());
+        
+        return setNwTtl.build();
+    }
+
+    /**
+     * Method converts OF Pushvlan action to SAL PushVlan action.
+     * @param action
+     * @return PushVlanAction
+     */
+    public static PushPbbAction ofToSALPushPbbAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+
+        PushPbbActionBuilder pushPbbAction = new PushPbbActionBuilder();
+        
+        EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
+        pushPbbAction.setEthernetType(etherType.getEthertype().getValue());
+        
+        return pushPbbAction.build();
+    }
+    
+    public static Object ofToSALExperimenter(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action){
+
+        ExperimenterAction ExperimenterAction = action.getAugmentation(ExperimenterAction.class);
+        
+        return null;
+        /*
+         * TODO: Need to explore/discuss about how to handle experimenter
+         * 
+         */
+
+    }
 }
index b08a3728d7fd4315a57ca67d34cbb6c3d9d6330a..13d802af57d08f77fb7013f54ae6dea2bc877cb2 100644 (file)
@@ -18,6 +18,8 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
@@ -29,23 +31,45 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instru
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActions;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadata;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestination;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSource;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6LabelBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFields;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionsInstruction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionsInstructionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntry;
@@ -86,6 +110,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntry;
@@ -99,6 +124,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TableIdInstructionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntryBuilder;
@@ -123,6 +149,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmp
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;
@@ -324,7 +351,7 @@ public class FlowConvertor {
                 matchEntriesBuilder.setOxmMatchField(VlanPcp.class);
                 VlanPcpMatchEntryBuilder vlanPcpBuilder = new VlanPcpMatchEntryBuilder();
                 vlanPcpBuilder.setVlanPcp(vlanMatch.getVlanPcp().getValue());
-                matchEntriesBuilder.addAugmentation(VlanVidMatchEntry.class, vlanPcpBuilder.build());
+                matchEntriesBuilder.addAugmentation(VlanPcpMatchEntry.class, vlanPcpBuilder.build());
                 matchEntriesList.add(matchEntriesBuilder.build());
             }
         }
@@ -834,4 +861,406 @@ public class FlowConvertor {
         portBuilder.setPort(port);
         builder.addAugmentation(PortMatchEntry.class, portBuilder.build());
     }
+    
+    /**
+     * Method converts OF SetField Match to SAL SetFiled matches
+     * @param action
+     * @return
+     */
+    public static SetField ofToSALSetField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+        logger.info("OF SetField match to SAL SetField match converstion begins");
+        SetFieldBuilder setField = new SetFieldBuilder();
+/*        OxmFieldsAction oxmFields = action.getAugmentation(OxmFieldsAction.class);
+
+        List<MatchEntries> matchEntries = oxmFields.getMatchEntries();
+        org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field.MatchBuilder match =new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field.MatchBuilder();
+        
+        EthernetMatchBuilder ethernetMatchBuilder = null;
+        VlanMatchBuilder vlanMatchBuilder = null;
+        IpMatchBuilder ipMatchBuilder = null;
+        TcpMatchBuilder tcpMatchBuilder = null;
+        UdpMatchBuilder udpMatchBuilder = null;
+        SctpMatchBuilder sctpMatchBuilder = null;
+        Icmpv4MatchBuilder icmpv4MatchBuilder = null;
+        Icmpv6MatchBuilder icmpv6MatchBuilder = null;
+        Ipv4MatchBuilder ipv4MatchBuilder = null;
+        ArpMatchBuilder arpMatchBuilder = null;
+        Ipv6MatchBuilder ipv6MatchBuilder = null;
+        ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = null;
+        
+        for(MatchEntries matchEntry : matchEntries){
+            if(matchEntry instanceof InPort){
+                PortNumberMatchEntry inPort = matchEntry.getAugmentation(PortNumberMatchEntry.class);
+                match.setInPort(inPort.getPortNumber().getValue());
+            }else if (matchEntry instanceof InPhyPort){
+                PortNumberMatchEntry phyPort = matchEntry.getAugmentation(PortNumberMatchEntry.class);
+                match.setInPhyPort(phyPort.getPortNumber().getValue());
+            }else if (matchEntry instanceof Metadata){
+                MetadataMatchEntry metadataMatch = matchEntry.getAugmentation(MetadataMatchEntry.class);
+                MetadataBuilder metadataBuilder = new MetadataBuilder();
+                metadataBuilder.setMetadata(new BigInteger(metadataMatch.getMetadata()));
+                MaskMatchEntry maskMatch = matchEntry.getAugmentation(MaskMatchEntry.class);
+                if (maskMatch != null){
+                    metadataBuilder.setMetadataMask(maskMatch.getMask());
+                }
+                match.setMetadata(metadataBuilder.build());
+            }else if (matchEntry instanceof EthDst){
+                
+                if(ethernetMatchBuilder == null)
+                    ethernetMatchBuilder = new EthernetMatchBuilder();
+                
+                MacAddressMatchEntry macAddressMatch = matchEntry.getAugmentation(MacAddressMatchEntry.class);
+                MaskMatchEntry maskMatch = matchEntry.getAugmentation(MaskMatchEntry.class);
+                EthernetDestinationBuilder ethernetDestination =  new EthernetDestinationBuilder();
+                ethernetDestination.setAddress(macAddressMatch.getMacAddress());
+                if(maskMatch != null){
+                    ethernetDestination.setMask(maskMatch.getMask());
+                }
+                ethernetMatchBuilder.setEthernetDestination(ethernetDestination.build());
+            }else if (matchEntry instanceof EthSrc){
+                if(ethernetMatchBuilder == null)
+                    ethernetMatchBuilder = new EthernetMatchBuilder();
+                
+                MacAddressMatchEntry macAddressMatch = matchEntry.getAugmentation(MacAddressMatchEntry.class);
+                MaskMatchEntry maskMatch = matchEntry.getAugmentation(MaskMatchEntry.class);
+                EthernetSourceBuilder ethernetSource =  new EthernetSourceBuilder();
+                ethernetSource.setAddress(macAddressMatch.getMacAddress());
+                if(maskMatch != null){
+                    ethernetSource.setMask(maskMatch.getMask());
+                }
+                ethernetMatchBuilder.setEthernetSource(ethernetSource.build());
+            }else if (matchEntry instanceof EthType){
+                if(ethernetMatchBuilder == null)
+                    ethernetMatchBuilder = new EthernetMatchBuilder();
+                
+                EthTypeMatchEntry etherTypeMatch = matchEntry.getAugmentation(EthTypeMatchEntry.class);
+                EthernetTypeBuilder ethernetType=  new EthernetTypeBuilder();
+                org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType etherType = new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType((long)etherTypeMatch.getEthType().getValue());
+                ethernetType.setType(etherType);
+                ethernetMatchBuilder.setEthernetType(ethernetType.build());
+            }else if (matchEntry instanceof VlanVid){
+                if(vlanMatchBuilder == null)
+                    vlanMatchBuilder = new VlanMatchBuilder();
+                
+                VlanVidMatchEntry vlanVidMatch = matchEntry.getAugmentation(VlanVidMatchEntry.class);
+                MaskMatchEntry maskMatch = matchEntry.getAugmentation(MaskMatchEntry.class);
+                
+                VlanIdBuilder vlanIdBuilder = new  VlanIdBuilder();
+                vlanIdBuilder.setVlanId(
+                        new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId(vlanVidMatch.getVlanVid()));
+                if(maskMatch != null){
+                    vlanIdBuilder.setMask(maskMatch.getMask());
+                }
+                vlanMatchBuilder.setVlanId(vlanIdBuilder.build());
+                
+            }else if (matchEntry instanceof VlanPcp){
+                if(vlanMatchBuilder == null)
+                    vlanMatchBuilder = new VlanMatchBuilder();
+                
+                VlanPcpMatchEntry vlanPcpMatch = matchEntry.getAugmentation(VlanPcpMatchEntry.class);
+                vlanMatchBuilder.setVlanPcp(
+                        new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp(vlanPcpMatch.getVlanPcp())); 
+            }else if (matchEntry instanceof IpDscp){
+                if(ipMatchBuilder == null)
+                    ipMatchBuilder = new IpMatchBuilder();
+                
+                DscpMatchEntry dscpMatchEntry = matchEntry.getAugmentation(DscpMatchEntry.class);
+                ipMatchBuilder.setIpDscp(dscpMatchEntry.getDscp());
+                
+            }else if (matchEntry instanceof IpEcn){
+                if(ipMatchBuilder == null)
+                    ipMatchBuilder = new IpMatchBuilder();
+                
+                EcnMatchEntry ecnMatchEntry = matchEntry.getAugmentation(EcnMatchEntry.class);
+                ipMatchBuilder.setIpEcn(ecnMatchEntry.getEcn());
+                
+            }else if (matchEntry instanceof IpProto){
+                if(ipMatchBuilder == null)
+                    ipMatchBuilder = new IpMatchBuilder();
+             
+                ProtocolNumberMatchEntry protocolNumberMatch = matchEntry.getAugmentation(ProtocolNumberMatchEntry.class);
+                ipMatchBuilder.setIpProtocol(protocolNumberMatch.getProtocolNumber());
+            }else if (matchEntry instanceof TcpSrc){
+                if(tcpMatchBuilder == null)
+                    tcpMatchBuilder = new TcpMatchBuilder();
+                
+                PortMatchEntry portMatchEntry = matchEntry.getAugmentation(PortMatchEntry.class);
+                tcpMatchBuilder.setTcpSourcePort(portMatchEntry.getPort());
+                
+            }else if (matchEntry instanceof TcpDst){
+                if(tcpMatchBuilder == null)
+                    tcpMatchBuilder = new TcpMatchBuilder();
+
+                PortMatchEntry portMatchEntry = matchEntry.getAugmentation(PortMatchEntry.class);
+                tcpMatchBuilder.setTcpDestinationPort(portMatchEntry.getPort());
+                
+            }else if (matchEntry instanceof UdpSrc){
+                if(udpMatchBuilder == null)
+                    udpMatchBuilder = new UdpMatchBuilder();
+                
+                PortMatchEntry portMatchEntry = matchEntry.getAugmentation(PortMatchEntry.class);
+                udpMatchBuilder.setUdpSourcePort(portMatchEntry.getPort());
+
+                
+            }else if (matchEntry instanceof UdpDst){
+                if(udpMatchBuilder == null)
+                    udpMatchBuilder = new UdpMatchBuilder();
+                
+                PortMatchEntry portMatchEntry = matchEntry.getAugmentation(PortMatchEntry.class);
+                udpMatchBuilder.setUdpDestinationPort(portMatchEntry.getPort());
+            }else if (matchEntry instanceof SctpSrc){
+                if(sctpMatchBuilder == null)
+                    sctpMatchBuilder = new SctpMatchBuilder();
+
+                PortMatchEntry portMatchEntry = matchEntry.getAugmentation(PortMatchEntry.class);
+                sctpMatchBuilder.setSctpSourcePort(portMatchEntry.getPort());
+                
+            }else if (matchEntry instanceof SctpDst){
+                if(sctpMatchBuilder == null)
+                    sctpMatchBuilder = new SctpMatchBuilder();
+
+                PortMatchEntry portMatchEntry = matchEntry.getAugmentation(PortMatchEntry.class);
+                sctpMatchBuilder.setSctpDestinationPort(portMatchEntry.getPort());
+            }else if (matchEntry instanceof Icmpv4Type){
+                if(icmpv4MatchBuilder == null)
+                    icmpv4MatchBuilder = new Icmpv4MatchBuilder();
+                
+                Icmpv4TypeMatchEntry icmpv4TypeMatchEntry = matchEntry.getAugmentation(Icmpv4TypeMatchEntry.class);
+                icmpv4MatchBuilder.setIcmpv4Type(icmpv4TypeMatchEntry.getIcmpv4Type());
+                
+            }else if (matchEntry instanceof Icmpv4Code){
+                if(icmpv4MatchBuilder == null)
+                    icmpv4MatchBuilder = new Icmpv4MatchBuilder();
+                
+                Icmpv4CodeMatchEntry icmpv4CodeMatchEntry = matchEntry.getAugmentation(Icmpv4CodeMatchEntry.class);
+                icmpv4MatchBuilder.setIcmpv4Code(icmpv4CodeMatchEntry.getIcmpv4Code());
+                
+            }else if (matchEntry instanceof Icmpv6Type){
+                if(icmpv6MatchBuilder == null)
+                    icmpv6MatchBuilder = new Icmpv6MatchBuilder();
+                
+                Icmpv6TypeMatchEntry icmpv6TypeMatchEntry = matchEntry.getAugmentation(Icmpv6TypeMatchEntry.class);
+                icmpv6MatchBuilder.setIcmpv6Type(icmpv6TypeMatchEntry.getIcmpv6Type());
+            }else if (matchEntry instanceof Icmpv6Code){
+                if(icmpv6MatchBuilder == null)
+                    icmpv6MatchBuilder = new Icmpv6MatchBuilder();
+                
+                Icmpv6CodeMatchEntry icmpv6CodeMatchEntry = matchEntry.getAugmentation(Icmpv6CodeMatchEntry.class);
+                icmpv6MatchBuilder.setIcmpv6Code(icmpv6CodeMatchEntry.getIcmpv6Code());
+            }else if (matchEntry instanceof Ipv4Src){
+                if(ipv4MatchBuilder == null)
+                    ipv4MatchBuilder = new Ipv4MatchBuilder();
+                
+                Ipv4AddressMatchEntry ipv4AddressMatchEntry = matchEntry.getAugmentation(Ipv4AddressMatchEntry.class);
+                MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+                ipv4MatchBuilder.setIpv4Source(
+                        new Ipv4Prefix(ipv4AddressMatchEntry.getIpv4Address().getValue()
+                                +"/"+new String(maskMatchEntry.getMask())));
+                
+            }else if (matchEntry instanceof Ipv4Dst){
+                if(ipv4MatchBuilder == null)
+                    ipv4MatchBuilder = new Ipv4MatchBuilder();
+                
+                Ipv4AddressMatchEntry ipv4AddressMatchEntry = matchEntry.getAugmentation(Ipv4AddressMatchEntry.class);
+                MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+                ipv4MatchBuilder.setIpv4Destination(
+                        new Ipv4Prefix(ipv4AddressMatchEntry.getIpv4Address().getValue()
+                                +"/"+new String(maskMatchEntry.getMask())));
+            }else if (matchEntry instanceof ArpOp){
+                if(arpMatchBuilder == null)
+                    arpMatchBuilder = new ArpMatchBuilder();
+                
+                OpCodeMatchEntry opCodeMatchEntry = matchEntry.getAugmentation(OpCodeMatchEntry.class);
+                arpMatchBuilder.setArpOp(opCodeMatchEntry.getOpCode());
+                
+            }else if (matchEntry instanceof ArpSpa){
+                if(arpMatchBuilder == null)
+                    arpMatchBuilder = new ArpMatchBuilder();
+                
+                Ipv4AddressMatchEntry ipv4AddressMatchEntry = matchEntry.getAugmentation(Ipv4AddressMatchEntry.class);
+                MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+                arpMatchBuilder.setArpSourceTransportAddress(
+                        new Ipv4Prefix(ipv4AddressMatchEntry.getIpv4Address().getValue()
+                                +"/"+new String(maskMatchEntry.getMask())));
+                
+            }else if (matchEntry instanceof ArpTpa){
+                if(arpMatchBuilder == null)
+                    arpMatchBuilder = new ArpMatchBuilder();
+                
+                Ipv4AddressMatchEntry ipv4AddressMatchEntry = matchEntry.getAugmentation(Ipv4AddressMatchEntry.class);
+                MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+                arpMatchBuilder.setArpTargetTransportAddress(
+                        new Ipv4Prefix(ipv4AddressMatchEntry.getIpv4Address().getValue()
+                                +"/"+new String(maskMatchEntry.getMask())));
+                
+            }else if (matchEntry instanceof ArpSha){
+                if(arpMatchBuilder == null)
+                    arpMatchBuilder = new ArpMatchBuilder();
+                
+                MacAddressMatchEntry macAddressMatchEntry = matchEntry.getAugmentation(MacAddressMatchEntry.class);
+                MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+                ArpSourceHardwareAddressBuilder arpSourceHardwareAddressBuilder = new ArpSourceHardwareAddressBuilder();
+                arpSourceHardwareAddressBuilder.setAddress(macAddressMatchEntry.getMacAddress());
+                arpSourceHardwareAddressBuilder.setMask(maskMatchEntry.getMask());
+                arpMatchBuilder.setArpSourceHardwareAddress(arpSourceHardwareAddressBuilder.build());
+                
+            }else if (matchEntry instanceof ArpTha){
+                if(arpMatchBuilder == null)
+                    arpMatchBuilder = new ArpMatchBuilder();
+                
+                MacAddressMatchEntry macAddressMatchEntry = matchEntry.getAugmentation(MacAddressMatchEntry.class);
+                MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+                ArpTargetHardwareAddressBuilder arpTargetHardwareAddressBuilder = new ArpTargetHardwareAddressBuilder();
+                arpTargetHardwareAddressBuilder.setAddress(macAddressMatchEntry.getMacAddress());
+                arpTargetHardwareAddressBuilder.setMask(maskMatchEntry.getMask());
+                arpMatchBuilder.setArpTargetHardwareAddress(arpTargetHardwareAddressBuilder.build());
+            }else if (matchEntry instanceof Ipv6Src){
+                if(ipv6MatchBuilder == null)
+                    ipv6MatchBuilder = new Ipv6MatchBuilder();
+                
+                Ipv6AddressMatchEntry ipv6AddressMatchEntry = matchEntry.getAugmentation(Ipv6AddressMatchEntry.class);
+                MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+                ipv6MatchBuilder.setIpv6Source(new Ipv6Prefix (ipv6AddressMatchEntry.getIpv6Address().getValue()+
+                        "/"+new String(maskMatchEntry.getMask())));
+                
+            }else if (matchEntry instanceof Ipv6Dst){
+                if(ipv6MatchBuilder == null)
+                    ipv6MatchBuilder = new Ipv6MatchBuilder();
+                
+                Ipv6AddressMatchEntry ipv6AddressMatchEntry = matchEntry.getAugmentation(Ipv6AddressMatchEntry.class);
+                MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+                ipv6MatchBuilder.setIpv6Destination(new Ipv6Prefix (ipv6AddressMatchEntry.getIpv6Address().getValue()+
+                        "/"+new String(maskMatchEntry.getMask())));
+                
+            }else if (matchEntry instanceof Ipv6Flabel){
+                if(ipv6MatchBuilder == null)
+                    ipv6MatchBuilder = new Ipv6MatchBuilder();
+
+                Ipv6FlabelMatchEntry ipv6FlabelMatchEntry = matchEntry.getAugmentation(Ipv6FlabelMatchEntry.class);
+                MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+                Ipv6LabelBuilder ipv6LabelBuilder = new Ipv6LabelBuilder();
+                ipv6LabelBuilder.setIpv6Flabel(ipv6FlabelMatchEntry.getIpv6Flabel());
+                ipv6LabelBuilder.setFlabelMask(maskMatchEntry.getMask());
+                ipv6MatchBuilder.setIpv6Label(ipv6LabelBuilder.build());
+
+            }else if (matchEntry instanceof Ipv6NdTarget){
+                if(ipv6MatchBuilder == null)
+                    ipv6MatchBuilder = new Ipv6MatchBuilder();
+                Ipv6AddressMatchEntry ipv6AddressMatchEntry = matchEntry.getAugmentation(Ipv6AddressMatchEntry.class);
+                ipv6MatchBuilder.setIpv6NdTarget(ipv6AddressMatchEntry.getIpv6Address());
+
+            }else if (matchEntry instanceof Ipv6NdSll){
+                if(ipv6MatchBuilder == null)
+                    ipv6MatchBuilder = new Ipv6MatchBuilder();
+
+                MacAddressMatchEntry macAddressMatchEntry = matchEntry.getAugmentation(MacAddressMatchEntry.class);
+                ipv6MatchBuilder.setIpv6NdSll(macAddressMatchEntry.getMacAddress());
+            }else if (matchEntry instanceof Ipv6NdTll){
+                if(ipv6MatchBuilder == null)
+                    ipv6MatchBuilder = new Ipv6MatchBuilder();
+
+                MacAddressMatchEntry macAddressMatchEntry = matchEntry.getAugmentation(MacAddressMatchEntry.class);
+                ipv6MatchBuilder.setIpv6NdTll(macAddressMatchEntry.getMacAddress());
+                
+            }else if (matchEntry instanceof Ipv6Exthdr){
+                if(ipv6MatchBuilder == null)
+                    ipv6MatchBuilder = new Ipv6MatchBuilder();
+
+                PseudoFieldMatchEntry pseudoFieldMatchEntry = matchEntry.getAugmentation(PseudoFieldMatchEntry.class);
+                PseudoField pseudoField = pseudoFieldMatchEntry.getPseudoField();
+                int pseudoFieldInt = 0;
+                pseudoFieldInt |= pseudoField.isNonext()?(1 << 0):~(1 << 0);
+                pseudoFieldInt |= pseudoField.isEsp()?(1 << 1):~(1 << 1);
+                pseudoFieldInt |= pseudoField.isAuth()?(1 << 2):~(1 << 2);
+                pseudoFieldInt |= pseudoField.isDest()?(1 << 3):~(1 << 3);
+                pseudoFieldInt |= pseudoField.isFrag()?(1 << 4):~(1 << 4);
+                pseudoFieldInt |= pseudoField.isRouter()?(1 << 5):~(1 << 5);
+                pseudoFieldInt |= pseudoField.isHop()?(1 << 6):~(1 << 6);
+                pseudoFieldInt |= pseudoField.isUnrep()?(1 << 7):~(1 << 7);
+                pseudoFieldInt |= pseudoField.isUnseq()?(1 << 8):~(1 << 8);
+                
+                ipv6MatchBuilder.setIpv6Exthdr(pseudoFieldInt);
+            }else if (matchEntry instanceof MplsLabel){
+                if(protocolMatchFieldsBuilder == null)
+                    protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
+                
+                MplsLabelMatchEntry MplsLabelMatchEntry = matchEntry.getAugmentation(MplsLabelMatchEntry.class);
+                protocolMatchFieldsBuilder.setMplsLabel(MplsLabelMatchEntry.getMplsLabel());
+                
+            }else if (matchEntry instanceof MplsBos){
+                if(protocolMatchFieldsBuilder == null)
+                    protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
+                
+                BosMatchEntry bosMatchEntry = matchEntry.getAugmentation(BosMatchEntry.class);
+                protocolMatchFieldsBuilder.setMplsBos(bosMatchEntry.isBos()?(short)1:(short)0);
+                
+            }else if (matchEntry instanceof MplsTc) {
+                if(protocolMatchFieldsBuilder == null)
+                    protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
+                
+                TcMatchEntry tcMatchEntry = matchEntry.getAugmentation(TcMatchEntry.class);
+                protocolMatchFieldsBuilder.setMplsTc(tcMatchEntry.getTc());
+                
+            }else if (matchEntry instanceof PbbIsid){
+                if(protocolMatchFieldsBuilder == null)
+                    protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
+                
+                IsidMatchEntry isidMatchEntry = matchEntry.getAugmentation(IsidMatchEntry.class);
+                PbbBuilder pbbBuilder = new PbbBuilder();
+                pbbBuilder.setPbbIsid(isidMatchEntry.getIsid());
+                MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+                if(maskMatchEntry != null)
+                    pbbBuilder.setPbbMask(maskMatchEntry.getMask());
+                
+                protocolMatchFieldsBuilder.setPbb(pbbBuilder.build());
+            }else if (matchEntry instanceof TunnelId){
+                MetadataMatchEntry metadataMatchEntry = matchEntry.getAugmentation(MetadataMatchEntry.class);
+                MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+                TunnelBuilder tunnelBuilder = new TunnelBuilder();
+                tunnelBuilder.setTunnelId(new BigInteger(metadataMatchEntry.getMetadata()));
+                tunnelBuilder.setTunnelMask(maskMatchEntry.getMask());
+                match.setTunnel(tunnelBuilder.build());
+            }
+        }
+        if(ethernetMatchBuilder != null){
+            match.setEthernetMatch(ethernetMatchBuilder.build());
+        }
+        if (vlanMatchBuilder != null){
+            match.setVlanMatch(vlanMatchBuilder.build());
+        }
+        if(ipMatchBuilder != null){
+            match.setIpMatch(ipMatchBuilder.build());
+        }
+        if(tcpMatchBuilder != null){
+            match.setLayer4Match(tcpMatchBuilder.build());
+        }
+        if(udpMatchBuilder != null){
+            match.setLayer4Match(udpMatchBuilder.build());
+        }
+        if(sctpMatchBuilder != null){
+            match.setLayer4Match(sctpMatchBuilder.build());
+        }
+        if(icmpv4MatchBuilder != null){
+            match.setIcmpv4Match(icmpv4MatchBuilder.build()); 
+        }
+        if(icmpv6MatchBuilder != null){
+            match.setIcmpv6Match(icmpv6MatchBuilder.build()); 
+        }
+        if(ipv4MatchBuilder != null){
+            match.setLayer3Match(ipv4MatchBuilder.build());
+        }
+        if(arpMatchBuilder != null){
+            match.setLayer3Match(arpMatchBuilder.build());
+        }
+        if(ipv6MatchBuilder != null){
+            match.setLayer3Match(ipv6MatchBuilder.build());
+        }
+        if(protocolMatchFieldsBuilder != null){
+            match.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
+        }
+        setField.setMatch(match.build());
+        
+  */      return setField.build();
+    }
+
 }
\ No newline at end of file
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java
new file mode 100644 (file)
index 0000000..1c027a8
--- /dev/null
@@ -0,0 +1,141 @@
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32;
+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.action.types.rev131112.action.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes.GroupType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.Buckets;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.BucketsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.DurationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.buckets.BucketCounter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.buckets.BucketCounterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc.GroupDesc;
+
+/**
+ * Class is an utility class for converting group related statistics messages coming from switch to MD-SAL
+ * messages.
+ * @author avishnoi@in.ibm.com
+ *
+ */
+public class GroupStatsResponseConvertor {
+
+    public List<GroupStats> toSALGroupStatsList(
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.GroupStats> allGroupStats){
+        List<GroupStats> convertedSALGroups = new ArrayList<GroupStats>();
+        for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.GroupStats group: allGroupStats){
+            convertedSALGroups.add(toSALGroupStats(group));
+        }
+        return convertedSALGroups;
+        
+    }
+    /**
+     * Method convert GroupStats message from library to MD SAL defined GroupStats  
+     * @param groupStats GroupStats from library
+     * @return GroupStats -- GroupStats defined in MD-SAL
+     */
+    public GroupStats toSALGroupStats(
+            org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.GroupStats groupStats){
+        
+        GroupStatsBuilder salGroupStats = new GroupStatsBuilder();
+        
+        salGroupStats.setBuckets(toSALBuckets(groupStats.getBucketStats()));
+        salGroupStats.setByteCount(new Counter64(groupStats.getByteCount()));
+        
+        DurationBuilder time = new DurationBuilder();
+        time.setSecond(new Counter32(groupStats.getDurationSec()));
+        time.setNanosecond(new Counter32(groupStats.getDurationNsec()));
+        
+        salGroupStats.setDuration(time.build());
+        salGroupStats.setGroupId(groupStats.getGroupId().intValue());
+        salGroupStats.setPacketCount(new Counter64(groupStats.getPacketCount()));
+        salGroupStats.setRefCount(new Counter32(groupStats.getRefCount()));
+        
+        return salGroupStats.build();
+    }
+    
+    public Buckets toSALBuckets(
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.group.stats.BucketStats> bucketStats ){
+        
+        BucketsBuilder salBuckets  = new BucketsBuilder();
+        
+        List<BucketCounter> allBucketStats = new ArrayList<BucketCounter>();
+        
+        for( org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.group.stats.BucketStats bucketStat : bucketStats){
+            BucketCounterBuilder bucketCounter = new BucketCounterBuilder();
+            bucketCounter.setByteCount(new Counter64(bucketStat.getByteCount()));
+            bucketCounter.setPacketCount(new Counter64(bucketStat.getPacketCount()));
+            allBucketStats.add(bucketCounter.build());
+        }
+        salBuckets.setBucketCounter(allBucketStats);
+        return salBuckets.build();
+    }
+    
+    
+    public List<GroupDescStats> toSALGroupDescStatsList(
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.
+            multipart.reply.multipart.reply.body.multipart.reply.group.desc.GroupDesc> allGroupDescStats){
+        
+        List<GroupDescStats> convertedSALGroupsDesc = new ArrayList<GroupDescStats>();
+        for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc.GroupDesc groupDesc: allGroupDescStats){
+            convertedSALGroupsDesc.add(toSALGroupDescStats(groupDesc));
+        }
+        return convertedSALGroupsDesc;
+        
+    }
+    /**
+     * Method convert GroupStats message from library to MD SAL defined GroupStats  
+     * @param groupDesc GroupStats from library
+     * @return GroupStats -- GroupStats defined in MD-SAL
+     */
+    public GroupDescStats toSALGroupDescStats(GroupDesc groupDesc){
+        
+        GroupDescStatsBuilder salGroupDescStats = new GroupDescStatsBuilder();
+        
+        salGroupDescStats.setBuckets(toSALBucketsDesc(groupDesc.getBucketsList()));
+        salGroupDescStats.setGroupId(new GroupId(groupDesc.getGroupId()));
+        salGroupDescStats.setGroupType(GroupType.forValue(groupDesc.getType().getIntValue()));
+        
+        return salGroupDescStats.build();
+    }
+    
+    public  org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets toSALBucketsDesc(
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.BucketsList> bucketDescStats ){
+        
+        org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder salBucketsDesc  = 
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder();
+        
+        List<Bucket> allBuckets = new ArrayList<Bucket>();
+        
+        for( org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.BucketsList bucketDetails : bucketDescStats){
+            BucketBuilder bucketDesc = new BucketBuilder();
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> convertedSalActions = 
+                    ActionConvertor.toSALBucketActions (bucketDetails.getActionsList());
+            
+            List<Action> actions = new ArrayList<Action>(); 
+            for (org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action : convertedSalActions){
+                ActionBuilder warppedAction = new ActionBuilder();
+                warppedAction.setAction(action);
+                actions.add(warppedAction.build());
+            }
+            bucketDesc.setAction(actions);
+            bucketDesc.setWeight(bucketDetails.getWeight());
+            bucketDesc.setWatchPort(bucketDetails.getWatchPort().getValue());
+            bucketDesc.setWatchGroup(bucketDetails.getWatchGroup());
+            allBuckets.add(bucketDesc.build());
+        }
+        salBucketsDesc.setBucket(allBuckets);
+        return salBucketsDesc.build();
+    }
+
+}
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterStatsResponseConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterStatsResponseConvertor.java
new file mode 100644 (file)
index 0000000..c059e0d
--- /dev/null
@@ -0,0 +1,151 @@
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32;
+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.meter.types.rev130918.MeterId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DropBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemarkBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.ExperimenterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.config.stats.reply.MeterConfigStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.config.stats.reply.MeterConfigStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.DurationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.MeterBandStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.meter.band.stats.BandStat;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.meter.band.stats.BandStatBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDrop;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemark;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenter;
+
+/**
+ * Class is an utility class for converting group related statistics messages coming from switch to MD-SAL
+ * messages.
+ * @author avishnoi@in.ibm.com
+ *
+ */
+public class MeterStatsResponseConvertor {
+
+    /**
+     * Method converts list of OF Meter Stats to SAL Meter Stats.
+     * @param allMeterStats
+     * @return List of MeterStats
+     */
+    public List<MeterStats> toSALMeterStatsList(
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.MeterStats> allMeterStats){
+        List<MeterStats> convertedSALMeters = new ArrayList<MeterStats>();
+        for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.MeterStats meter: allMeterStats){
+            convertedSALMeters.add(toSALMeterStats(meter));
+        }
+        return convertedSALMeters;
+        
+    }
+    
+    /**
+     * Method convert MeterStats message from library to MD SAL defined MeterStats  
+     * @param meterStats MeterStats from library
+     * @return MeterStats -- MeterStats defined in MD-SAL
+     */
+    public MeterStats toSALMeterStats(
+            org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.MeterStats meterStats){
+        
+        MeterStatsBuilder salMeterStats = new MeterStatsBuilder();
+        salMeterStats.setByteInCount(new Counter64(meterStats.getByteInCount()));
+        
+        DurationBuilder time = new DurationBuilder();
+        time.setSecond(new Counter32(meterStats.getDurationSec()));
+        time.setNanosecond(new Counter32(meterStats.getDurationNsec()));
+        salMeterStats.setDuration(time.build());
+        
+        salMeterStats.setFlowCount(new Counter32(meterStats.getFlowCount()));
+        salMeterStats.setMeterId(meterStats.getMeterId().intValue());
+        salMeterStats.setPacketInCount(new Counter64(meterStats.getPacketInCount()));
+        
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol
+        .rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter
+        .meter.stats.MeterBandStats> allMeterBandStats = meterStats.getMeterBandStats();
+        
+        MeterBandStatsBuilder meterBandStatsBuilder = new MeterBandStatsBuilder();
+        List<BandStat> listAllBandStats = new ArrayList<BandStat>();
+        for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol
+                .rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter
+                .meter.stats.MeterBandStats meterBandStats : allMeterBandStats){
+            BandStatBuilder bandStatBuilder = new BandStatBuilder(); 
+            bandStatBuilder.setByteBandCount(new Counter64(meterBandStats.getByteBandCount()));
+            bandStatBuilder.setPacketBandCount(new Counter64(meterBandStats.getPacketBandCount()));
+            listAllBandStats.add(bandStatBuilder.build());
+        }
+        meterBandStatsBuilder.setBandStat(listAllBandStats);
+        salMeterStats.setMeterBandStats(meterBandStatsBuilder.build());
+        return salMeterStats.build();
+    }
+    
+    /**
+     * Method convert list of OF Meter config Stats to SAL Meter Config stats 
+     * @param allMeterConfigs
+     * @return list of MeterConfigStats
+     */
+    public List<MeterConfigStats> toSALMeterConfigList(List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config.MeterConfig> allMeterConfigs){
+        
+        List<MeterConfigStats> listMeterConfigStats = new ArrayList<MeterConfigStats>();
+        for( org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config.MeterConfig meterConfig : allMeterConfigs){
+            MeterConfigStatsBuilder meterConfigStatsBuilder = new MeterConfigStatsBuilder();
+            meterConfigStatsBuilder.setMeterId(new MeterId(meterConfig.getMeterId()));
+            //TODO: Set flag should be bitmap and not once enum value.
+            //Need to discuss with openflowjava team.
+            //meterConfigStatsBuilder.setFlags(value);
+            
+            MeterBandHeadersBuilder meterBandHeadersBuilder = new MeterBandHeadersBuilder();
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config.meter.config.Bands> bands = meterConfig.getBands();
+            
+            List<MeterBandHeader> listBandHeaders = new ArrayList<MeterBandHeader>();
+            for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config.meter.config.Bands band : bands){
+                MeterBandHeaderBuilder meterBandHeaderBuilder = new MeterBandHeaderBuilder();
+                if(band.getMeterBand() instanceof MeterBandDrop){
+                    MeterBandDrop dropBand = (MeterBandDrop)band.getMeterBand();
+                    DropBuilder dropBuilder = new DropBuilder();
+                    dropBuilder.setBurstSize(dropBand.getBurstSize());
+                    dropBuilder.setRate(dropBand.getRate());
+                    meterBandHeaderBuilder.setBandType(dropBuilder.build());
+                    
+                    meterBandHeaderBuilder.setBurstSize(dropBand.getBurstSize());
+                    meterBandHeaderBuilder.setRate(dropBand.getRate());
+                    listBandHeaders.add(meterBandHeaderBuilder.build());
+                }else if (band.getMeterBand() instanceof MeterBandDscpRemark){
+                    MeterBandDscpRemark dscpRemarkBand = (MeterBandDscpRemark)band.getMeterBand();
+                    DscpRemarkBuilder dscpRemarkBuilder = new DscpRemarkBuilder();
+                    dscpRemarkBuilder.setBurstSize(dscpRemarkBand.getBurstSize());
+                    dscpRemarkBuilder.setRate(dscpRemarkBand.getRate());
+                    meterBandHeaderBuilder.setBandType(dscpRemarkBuilder.build());
+                    
+                    meterBandHeaderBuilder.setBurstSize(dscpRemarkBand.getBurstSize());
+                    meterBandHeaderBuilder.setRate(dscpRemarkBand.getRate());
+                    listBandHeaders.add(meterBandHeaderBuilder.build());
+                    
+                }else if (band.getMeterBand() instanceof MeterBandExperimenter){
+                    MeterBandExperimenter experimenterBand = (MeterBandExperimenter)band.getMeterBand();
+                    ExperimenterBuilder experimenterBuilder = new ExperimenterBuilder();
+                    experimenterBuilder.setBurstSize(experimenterBand.getBurstSize());
+                    experimenterBuilder.setRate(experimenterBand.getRate());
+                    meterBandHeaderBuilder.setBandType(experimenterBuilder.build());
+                    
+                    meterBandHeaderBuilder.setBurstSize(experimenterBand.getBurstSize());
+                    meterBandHeaderBuilder.setRate(experimenterBand.getRate());
+                    listBandHeaders.add(meterBandHeaderBuilder.build());
+                    
+                }
+            }
+            meterBandHeadersBuilder.setMeterBandHeader(listBandHeaders);
+            meterConfigStatsBuilder.setMeterBandHeaders(meterBandHeadersBuilder.build());
+            listMeterConfigStats.add(meterConfigStatsBuilder.build());
+        }
+        
+        return listMeterConfigStats;
+    }
+}
index c108c75c3027400bd569ae5d2e130fea227be284..d4529f3bfbf643e9c7dcb5711960273f82d915bb 100644 (file)
@@ -230,5 +230,5 @@ public interface IMessageDispatchService {
      * @return - the future
      */
     Future<RpcResult<java.lang.Void>> tableMod(TableModInput input, SwitchConnectionDistinguisher cookie);
-
+    
 }
index fcb8455ef65141a2c558507df46a0bb6fca480da..3ea8b413d8eda3dfa749449b913d071c7d8a13ec 100644 (file)
@@ -272,5 +272,4 @@ public class MessageDispatchServiceImpl implements IMessageDispatchService {
     public Future<RpcResult<Void>> tableMod(TableModInput input, SwitchConnectionDistinguisher cookie) {
         return getConnectionAdapter(cookie).tableMod(input);
     }
-
 }
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java
new file mode 100644 (file)
index 0000000..019bc49
--- /dev/null
@@ -0,0 +1,225 @@
+package org.opendaylight.openflowplugin.openflow.md.core.translator;
+
+import java.math.BigInteger;
+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.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.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.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;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupFeatures.Capabilities;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupFeatures.Types;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterConfigStatsUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterStatisticsUpdatedBuilder;
+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.yangtools.yang.binding.DataObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class converts multipart reply messages to the notification objects defined
+ * by statistics provider (manager ).
+ * 
+ * @author avishnoi@in.ibm.com
+ *
+ */
+public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,  List<DataObject>> {
+
+    protected static final Logger logger = LoggerFactory
+            .getLogger(MultipartReplyTranslator.class);
+    
+    private static GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor();
+    private static MeterStatsResponseConvertor meterStatsConvertor = new MeterStatsResponseConvertor();
+
+    @Override
+    public  List<DataObject> translate(SwitchConnectionDistinguisher cookie, SessionContext sc, OfHeader msg) {
+        
+        List<DataObject> listDataObject = new CopyOnWriteArrayList<DataObject>();
+
+        if(msg instanceof MultipartReplyMessage){
+            MultipartReplyMessage mpReply = (MultipartReplyMessage)msg;
+            NodeId node = this.nodeIdFromDatapathId(sc.getFeatures().getDatapathId());
+            switch (mpReply.getType()){
+            case OFPMPGROUP:{
+                logger.info("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();
+                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");
+                
+                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()));
+                logger.debug("Converted group statistics : {}",message.toString());
+                listDataObject.add(message.build());
+                return listDataObject;
+            }
+            case OFPMPGROUPFEATURES: {
+                logger.info("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();
+                message.setTypes(new Types(replyBody.getTypes().isOFPGTALL(),
+                                            replyBody.getTypes().isOFPGTSELECT(),
+                                            replyBody.getTypes().isOFPGTINDIRECT(),
+                                            replyBody.getTypes().isOFPGTSELECT()));
+                message.setMaxGroups(replyBody.getMaxGroups());
+                message.setCapabilities(new Capabilities(replyBody.getCapabilities().isOFPGFCCHAINING(),
+                        replyBody.getCapabilities().isOFPGFCCHAININGCHECKS(),
+                        replyBody.getCapabilities().isOFPGFCSELECTLIVENESS(),
+                        replyBody.getCapabilities().isOFPGFCSELECTWEIGHT()));
+                
+                message.setActions(getGroupActionsSupportBitmap(replyBody.getActionsBitmap()));
+                listDataObject.add(message.build());
+                return listDataObject;
+            }
+            case OFPMPMETER: {
+                logger.info("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();
+                message.setMeterStats(meterStatsConvertor.toSALMeterStatsList(replyBody.getMeterStats()));
+
+                listDataObject.add(message.build());
+                return listDataObject;
+            }
+            case OFPMPMETERCONFIG:{
+                logger.info("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();
+                message.setMeterConfigStats(meterStatsConvertor.toSALMeterConfigList(replyBody.getMeterConfig()));
+                listDataObject.add(message.build());
+                return listDataObject;
+            }
+            case OFPMPMETERFEATURES:{
+                logger.info("Received meter features multipart reponse");
+                
+                MeterFeaturesUpdatedBuilder message = new MeterFeaturesUpdatedBuilder();
+                message.setId(node);
+                message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+                message.setTransactionId(generateTransactionId(mpReply.getXid()));
+                
+                MultipartReplyMeterFeatures replyBody = (MultipartReplyMeterFeatures)mpReply.getMultipartReplyBody();
+                message.setMaxBands(replyBody.getMaxBands());
+                message.setMaxColor(replyBody.getMaxColor());
+                message.setMaxMeter(new Counter32(replyBody.getMaxMeter()));
+                message.setCapabilities(new Counter32(getMeterBandCapabilityBitmap(replyBody.getCapabilities())));
+                
+                 // TODO: Band Types is bitmaps, but plugin is receiving enum.
+                 
+                //message.setBandTypes(replyBody.getBandTypes())
+                listDataObject.add(message.build());
+                return listDataObject;
+            }
+            default:
+                logger.info(" Type : {}, not handled yet",mpReply.getType().name() );
+                return listDataObject;
+            }
+        }
+        
+        return listDataObject;
+    }
+    
+    private NodeId nodeIdFromDatapathId(BigInteger datapathId) {
+        String current = datapathId.toString();
+        return new NodeId("openflow:" + current);
+    }
+    
+    private TransactionId generateTransactionId(Long xid){
+        String stringXid =xid.toString();
+        BigInteger bigIntXid = new BigInteger( stringXid );
+        return new TransactionId(bigIntXid);
+
+    }
+
+    /* 
+     * Method returns the bitmap of actions supported by each group.
+     * TODO: My recommendation would be, its good to have a respective model of 
+     * 'type bits', which will generate a class where all these flags will eventually
+     * be stored as boolean. It will be convenient for application to check the
+     * supported action, rather then doing bitmap operation.
+     * @param actionsSupported
+     * @return
+     */
+    private List<Long> getGroupActionsSupportBitmap(List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType> actionsSupported){
+        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));
+        }
+        return supportActionByGroups;
+    }
+    /*
+     * Method returns Capability Bitmap of the meter band.
+     * TODO: I would recommend to use the 'type bits' model to store 
+     * the bitmap for the same reason as i given above for method  
+     * getGroupActionsSupportBitmap.
+     * @param capabilityFlags
+     * @return
+     */
+    
+    private long getMeterBandCapabilityBitmap (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags capabilityFlags){
+        long capabilityBitmap = 0;
+        capabilityBitmap |= capabilityFlags.isOFPMFKBPS()?(1 << 0): ~(1 << 0);
+        capabilityBitmap |= capabilityFlags.isOFPMFPKTPS()?(1 << 1): ~(1 << 1);
+        capabilityBitmap |= capabilityFlags.isOFPMFBURST()?(1 << 2): ~(1 << 2);
+        capabilityBitmap |= capabilityFlags.isOFPMFSTATS()?(1 << 3): ~(1 << 3);
+        return capabilityBitmap;
+    }
+
+}