hello-VersionBitmap fixed
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / HelloMessageFactory.java
index cbfa3551984d3beca388a8e0c24ef5b8026578be..4f8113ee9d6e3c55e958579c2bcc7779c734bfb1 100644 (file)
@@ -7,6 +7,8 @@ import java.util.List;
 import io.netty.buffer.ByteBuf;\r
 \r
 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.EncodeConstants;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.HelloInputMessageFactory;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloElementType;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessage;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessageBuilder;\r
@@ -47,16 +49,25 @@ public class HelloMessageFactory implements OFDeserializer<HelloMessage> {
     }\r
     \r
     private static List<Elements> readElement(ByteBuf input) {\r
-        ElementsBuilder elementsBuilder = new ElementsBuilder();\r
-        List<Elements> elementsList = new ArrayList<Elements>();\r
-        elementsBuilder.setType(HelloElementType.forValue(input.readUnsignedShort()));\r
-        int arrayLength = input.readableBytes()/4;\r
-        int[] versionBitmap = new int[arrayLength];\r
-        for (int i = 0; i < arrayLength; i++) {\r
-            versionBitmap[i] = (int) input.readUnsignedInt();\r
+        List<Elements> elementsList = new ArrayList<>();\r
+        while (input.readableBytes() > 0) {\r
+            ElementsBuilder elementsBuilder = new ElementsBuilder();\r
+            int type = input.readUnsignedShort();\r
+            int elementLength = input.readUnsignedShort();\r
+            if (type == HelloElementType.VERSIONBITMAP.getIntValue()) {\r
+                elementsBuilder.setType(HelloElementType.forValue(type));\r
+                int[] versionBitmap = new int[(elementLength - HelloInputMessageFactory.HELLO_ELEMENT_HEADER_SIZE) / 4];\r
+                for (int i = 0; i < versionBitmap.length; i++) {\r
+                    versionBitmap[i] = (int) input.readUnsignedInt();\r
+                }\r
+                elementsBuilder.setVersionBitmap(readVersionBitmap(versionBitmap));\r
+                int paddingRemainder = elementLength % EncodeConstants.PADDING;\r
+                if (paddingRemainder != 0) {\r
+                    input.readBytes(EncodeConstants.PADDING - paddingRemainder);\r
+                }\r
+            }\r
+            elementsList.add(elementsBuilder.build());\r
         }\r
-        elementsBuilder.setVersionBitmap(readVersionBitmap(versionBitmap));\r
-        elementsList.add(elementsBuilder.build());\r
         return elementsList;\r
     }\r
     \r