multipart reply message updated
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / MultipartReplyMessageFactory.java
index ffa36485441eb2da8bf87ca49e681842d5304c1a..a8011b81506e4289687c29f9ed7bfe5a3e81a13d 100644 (file)
@@ -8,8 +8,10 @@ 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.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.types.rev130731.FlowModFlags;\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.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
@@ -17,9 +19,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfig;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortFeatures;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
 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.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
@@ -33,6 +37,8 @@ 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.MultipartReplyFlowBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroup;\r
 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.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
@@ -51,6 +57,10 @@ 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.flow.FlowStatsBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.GroupStats;\r
 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
@@ -119,6 +129,8 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
                  break;         \r
         case 6:  builder.setMultipartReplyBody(setGroup(rawMessage));\r
                  break;\r
+        case 7:  builder.setMultipartReplyBody(setGroupDesc(rawMessage));\r
+                 break;\r
         case 9:  builder.setMultipartReplyBody(setMeter(rawMessage));\r
                  break;\r
         case 10:  builder.setMultipartReplyBody(setMeterConfig(rawMessage));\r
@@ -166,12 +178,12 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
     private static MultipartReplyFlow setFlow(ByteBuf input) {\r
         final byte PADDING_IN_FLOW_STATS_HEADER_01 = 1;\r
         final byte PADDING_IN_FLOW_STATS_HEADER_02 = 4;\r
+        final byte flowLength = 2;\r
         MultipartReplyFlowBuilder flowBuilder = new MultipartReplyFlowBuilder();\r
         List<FlowStats> flowStatsList = new ArrayList<>();\r
         FlowStatsBuilder flowStatsBuilder = new FlowStatsBuilder();\r
-        int flowLen = 0;\r
         while (input.readableBytes() > 0) {\r
-            flowLen = input.readUnsignedShort();\r
+            input.skipBytes(flowLength);\r
             flowStatsBuilder.setTableId(input.readUnsignedByte());\r
             input.skipBytes(PADDING_IN_FLOW_STATS_HEADER_01);\r
             flowStatsBuilder.setDurationSec(input.readUnsignedInt());\r
@@ -461,6 +473,7 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
     private static MultipartReplyMeterConfig setMeterConfig(ByteBuf input) {\r
         final byte METER_BAND_LENGTH = 16;\r
         final byte METER_CONFIG_LENGTH = 8;\r
+        final byte bandLength = 2;\r
         int actualLength;\r
         MultipartReplyMeterConfigBuilder builder = new MultipartReplyMeterConfigBuilder();\r
         List<MeterConfig> meterConfigList = new ArrayList<>();\r
@@ -481,18 +494,17 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
                 MeterBandDscpRemarkBuilder bandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder();\r
                 final byte PADDING_IN_METER_BAND_DSCP_HEADER = 3;\r
                 MeterBandExperimenterBuilder bandExperimenterBuilder = new MeterBandExperimenterBuilder(); \r
-                int bandLen = 0;\r
                 int bandType = input.readUnsignedShort();\r
                 switch (bandType) {\r
                     case 1: bandDropBuilder.setType(MeterBandType.forValue(bandType));\r
-                            bandLen = input.readUnsignedShort();\r
+                            input.skipBytes(bandLength);\r
                             bandDropBuilder.setRate(input.readUnsignedInt());\r
                             bandDropBuilder.setBurstSize(input.readUnsignedInt());\r
                             input.skipBytes(PADDING_IN_METER_BAND_DROP_HEADER);\r
                             bandsBuilder.setMeterBand(bandDropBuilder.build());\r
                             break;\r
                     case 2: bandDscpRemarkBuilder.setType(MeterBandType.forValue(bandType));\r
-                            bandLen = input.readUnsignedShort();\r
+                            input.skipBytes(bandLength);\r
                             bandDscpRemarkBuilder.setRate(input.readUnsignedInt());\r
                             bandDscpRemarkBuilder.setBurstSize(input.readUnsignedInt());\r
                             bandDscpRemarkBuilder.setPrecLevel(input.readUnsignedByte());\r
@@ -500,7 +512,7 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
                             bandsBuilder.setMeterBand(bandDscpRemarkBuilder.build());\r
                             break;\r
                     case 0xFFFF: bandExperimenterBuilder.setType(MeterBandType.forValue(bandType));\r
-                                 bandLen = input.readUnsignedShort();          \r
+                                 input.skipBytes(bandLength);\r
                                  bandExperimenterBuilder.setRate(input.readUnsignedInt());\r
                                  bandExperimenterBuilder.setBurstSize(input.readUnsignedInt());\r
                                  bandExperimenterBuilder.setExperimenter(input.readUnsignedInt());\r
@@ -607,4 +619,52 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
         return new PortFeatures(_10mbHd, _10mbFd, _100mbHd, _100mbFd, _1gbHd, _1gbFd, _10gbFd,\r
                 _40gbFd, _100gbFd, _1tbFd, _other, _copper, _fiber, _autoneg, _pause, _pauseAsym);\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
+        final byte GROUP_DESC_HEADER_LENGTH = 8;\r
+        int actualLength;\r
+        int bucketsLength = 0;\r
+        int bucketsCurrentLength = 0;\r
+        int bodyLength = 0;\r
+        MultipartReplyGroupDescBuilder builder = new MultipartReplyGroupDescBuilder();\r
+        GroupDescBuilder groupDescBuilder = new GroupDescBuilder();\r
+        List<GroupDesc> groupDescsList = new ArrayList<>();\r
+        BucketsListBuilder bucketsBuilder = new BucketsListBuilder();\r
+        List<BucketsList> bucketsList = new ArrayList<>();\r
+        List<ActionsList> actionsList = new ArrayList<>();\r
+        \r
+        while (input.readableBytes() > 0) {\r
+            bodyLength = input.readUnsignedShort();\r
+            actualLength = 0;\r
+            \r
+            groupDescBuilder.setType(GroupType.forValue(input.readUnsignedByte())); // TODO enum or class?\r
+            input.skipBytes(PADDING_IN_GROUP_DESC_HEADER);\r
+            groupDescBuilder.setGroupId(input.readUnsignedInt());\r
+            actualLength = GROUP_DESC_HEADER_LENGTH;\r
+            \r
+            while (actualLength < bodyLength) {\r
+                \r
+                bucketsLength = input.readUnsignedShort();\r
+                bucketsBuilder.setWeight(input.readUnsignedShort());\r
+                bucketsBuilder.setWatchPort(new PortNumber(input.readUnsignedInt()));\r
+                bucketsBuilder.setWatchGroup(input.readUnsignedInt());\r
+                input.skipBytes(PADDING_IN_BUCKETS_HEADER);\r
+                bucketsCurrentLength = bucketsLength;\r
+                actionsList = ActionCreator.createActionsList(input, bucketsLength);\r
+                bucketsBuilder.setActionsList(new ArrayList<>(actionsList));\r
+                actionsList.clear();\r
+                bucketsList.add(bucketsBuilder.build());\r
+                actualLength = actualLength + bucketsCurrentLength;\r
+            }\r
+            groupDescBuilder.setBucketsList(new ArrayList<>(bucketsList));\r
+            bucketsList.clear();\r
+            groupDescsList.add(groupDescBuilder.build());\r
+        }\r
+        builder.setGroupDesc(new ArrayList<>(groupDescsList));\r
+        groupDescsList.clear();\r
+        return builder.build();\r
+    }\r
+    \r
 }\r