Match and actions (de)serialization + fix
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / MultipartReplyMessageFactory.java
index a8011b81506e4289687c29f9ed7bfe5a3e81a13d..2a2bba56a9d9cf040b7ebbde1f77f42d76b49ba7 100644 (file)
@@ -8,10 +8,13 @@ import java.util.ArrayList;
 import java.util.List;\r
 \r
 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
-import org.opendaylight.openflowjava.protocol.impl.util.ActionCreator;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ActionsDeserializer;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupCapabilities;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupTypes;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;\r
@@ -23,10 +26,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortState;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.bucket.ActionsList;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.BucketsList;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.BucketsListBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.MultipartReplyBody;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregate;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDesc;\r
@@ -39,6 +44,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDesc;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeter;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfig;\r
@@ -59,8 +65,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.GroupStatsBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc.GroupDesc;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc.GroupDescBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc.group.desc.BucketsList;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc.group.desc.BucketsListBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.group.stats.BucketStats;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.group.stats.BucketStatsBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.MeterStats;\r
@@ -111,8 +115,6 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
         builder.setType(MultipartType.forValue(rawMessage.readUnsignedShort()));\r
         builder.setFlags(new MultipartRequestFlags((rawMessage.readUnsignedShort() & 0x01) != 0));\r
         rawMessage.skipBytes(PADDING_IN_MULTIPART_REPLY_HEADER);\r
-        // TODO - implement body\r
-        //mrmb.setBody(rawMessage.readBytes(rawMessage.readableBytes()).array());\r
 \r
         switch (builder.getType().getIntValue()) {\r
         case 0:  builder.setMultipartReplyBody(setDesc(rawMessage));\r
@@ -131,9 +133,11 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
                  break;\r
         case 7:  builder.setMultipartReplyBody(setGroupDesc(rawMessage));\r
                  break;\r
+        case 8:  builder.setMultipartReplyBody(setGroupFeatures(rawMessage));\r
+                 break;\r
         case 9:  builder.setMultipartReplyBody(setMeter(rawMessage));\r
                  break;\r
-        case 10:  builder.setMultipartReplyBody(setMeterConfig(rawMessage));\r
+        case 10: builder.setMultipartReplyBody(setMeterConfig(rawMessage));\r
                  break;\r
         case 11: builder.setMultipartReplyBody(setMeterFeatures(rawMessage));\r
                  break;\r
@@ -212,11 +216,11 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
     }\r
     \r
     private static FlowModFlags createFlowModFalgsFromBitmap(short input){\r
-        final Boolean _oFPFFSENDFLOWREM = (input & (1 << 0)) > 0;\r
-        final Boolean _oFPFFCHECKOVERLAP = (input & (1 << 1)) > 0;\r
-        final Boolean _oFPFFRESETCOUNTS = (input & (1 << 2)) > 0; \r
-        final Boolean _oFPFFNOPKTCOUNTS = (input & (1 << 3)) > 0;\r
-        final Boolean _oFPFFNOBYTCOUNTS = (input & (1 << 4)) > 0;\r
+        final Boolean _oFPFFSENDFLOWREM = (input & (1 << 0)) != 0;\r
+        final Boolean _oFPFFCHECKOVERLAP = (input & (1 << 1)) != 0;\r
+        final Boolean _oFPFFRESETCOUNTS = (input & (1 << 2)) != 0; \r
+        final Boolean _oFPFFNOPKTCOUNTS = (input & (1 << 3)) != 0;\r
+        final Boolean _oFPFFNOBYTCOUNTS = (input & (1 << 4)) != 0;\r
         return new FlowModFlags(_oFPFFCHECKOVERLAP, _oFPFFNOBYTCOUNTS, _oFPFFNOPKTCOUNTS, _oFPFFRESETCOUNTS, _oFPFFSENDFLOWREM);\r
     }\r
     \r
@@ -416,10 +420,10 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
     }\r
     \r
     private static MeterFlags decodeMeterModFlags(int input){\r
-        final Boolean _oFPMFKBPS = (input & (1 << 0)) > 0;\r
-        final Boolean _oFPMFPKTPS = (input & (1 << 1)) > 0;\r
-        final Boolean _oFPMFBURST = (input & (1 << 2)) > 0; \r
-        final Boolean _oFPMFSTATS = (input & (1 << 3)) > 0;\r
+        final Boolean _oFPMFKBPS = (input & (1 << 0)) != 0;\r
+        final Boolean _oFPMFPKTPS = (input & (1 << 1)) != 0;\r
+        final Boolean _oFPMFBURST = (input & (1 << 2)) != 0; \r
+        final Boolean _oFPMFSTATS = (input & (1 << 3)) != 0;\r
         return new MeterFlags(_oFPMFBURST, _oFPMFKBPS, _oFPMFPKTPS, _oFPMFSTATS);\r
     }\r
     \r
@@ -478,7 +482,7 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
         MultipartReplyMeterConfigBuilder builder = new MultipartReplyMeterConfigBuilder();\r
         List<MeterConfig> meterConfigList = new ArrayList<>();\r
         MeterConfigBuilder meterConfigBuilder = new MeterConfigBuilder();\r
-        List<Bands> bandsList = new ArrayList<Bands>();\r
+        List<Bands> bandsList = new ArrayList<>();\r
         BandsBuilder bandsBuilder = new BandsBuilder();\r
         \r
         while (input.readableBytes() > 0) {\r
@@ -620,6 +624,37 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
                 _40gbFd, _100gbFd, _1tbFd, _other, _copper, _fiber, _autoneg, _pause, _pauseAsym);\r
     }\r
     \r
+    private static MultipartReplyBody setGroupFeatures(ByteBuf rawMessage) {\r
+        final int SIZE_OF_MAX_GROUPS = 4;\r
+        MultipartReplyGroupFeaturesBuilder featuresBuilder = new MultipartReplyGroupFeaturesBuilder();\r
+        featuresBuilder.setTypes(createGroupType(rawMessage.readUnsignedInt()));\r
+        featuresBuilder.setCapabilities(createCapabilities(rawMessage.readUnsignedInt()));\r
+        List<Long> maxGroupsList = new ArrayList<>();\r
+        for (int i = 0; i < SIZE_OF_MAX_GROUPS ; i++) {\r
+            maxGroupsList.add(rawMessage.readUnsignedInt());\r
+        }\r
+        featuresBuilder.setMaxGroups(maxGroupsList);\r
+        // TODO - groupfeatures - actions bitmap\r
+        rawMessage.skipBytes(4);\r
+        return featuresBuilder.build();\r
+    }\r
+\r
+    private static GroupCapabilities createCapabilities(long input) {\r
+        final Boolean OFOFPGFC_SELECT_WEIGHT = ((input) & (1<<0)) != 0;\r
+        final Boolean OFPGFC_SELECT_LIVENESS = ((input) & (1<<1)) != 0;\r
+        final Boolean OFPGFC_CHAINING = ((input) & (1<<2)) != 0;\r
+        final Boolean OFPGFC_CHAINING_CHECKS = ((input) & (1<<3)) != 0;\r
+        return new GroupCapabilities(OFPGFC_CHAINING, OFPGFC_CHAINING_CHECKS, OFPGFC_SELECT_LIVENESS, OFOFPGFC_SELECT_WEIGHT);\r
+    }\r
+\r
+    private static GroupTypes createGroupType(long input) {\r
+        final Boolean OFPGT_ALL = ((input) & (1<<0)) != 0;\r
+        final Boolean OFPGT_SELECT = ((input) & (1<<1)) != 0;\r
+        final Boolean OFPGT_INDIRECT = ((input) & (1<<2)) != 0;\r
+        final Boolean OFPGT_FF = ((input) & (1<<3)) != 0;\r
+        return new GroupTypes(OFPGT_ALL, OFPGT_FF, OFPGT_INDIRECT, OFPGT_SELECT);\r
+    }\r
+    \r
     private static MultipartReplyGroupDesc setGroupDesc(ByteBuf input) {\r
         final byte PADDING_IN_GROUP_DESC_HEADER = 1;\r
         final byte PADDING_IN_BUCKETS_HEADER = 4;\r
@@ -652,7 +687,7 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
                 bucketsBuilder.setWatchGroup(input.readUnsignedInt());\r
                 input.skipBytes(PADDING_IN_BUCKETS_HEADER);\r
                 bucketsCurrentLength = bucketsLength;\r
-                actionsList = ActionCreator.createActionsList(input, bucketsLength);\r
+                actionsList = ActionsDeserializer.createActionsList(input, bucketsLength);\r
                 bucketsBuilder.setActionsList(new ArrayList<>(actionsList));\r
                 actionsList.clear();\r
                 bucketsList.add(bucketsBuilder.build());\r