Quickfix - Hello versionBitmap 90/2490/1
authorMichal Polkorab <michal.polkorab@pantheon.sk>
Thu, 7 Nov 2013 12:19:32 +0000 (13:19 +0100)
committerMichal Polkorab <michal.polkorab@pantheon.sk>
Thu, 7 Nov 2013 12:20:52 +0000 (13:20 +0100)
Signed-off-by: Michal Polkorab <michal.polkorab@pantheon.sk>
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/HelloInputMessageFactory.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/ByteBufUtils.java
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/HelloInputMessageFactoryTest.java

index e6877ccc9ff1a1d744de4f74c2ad7321d21b067d..f38980d8107f2bffb21b5863bbd627008b92fbee 100644 (file)
@@ -51,7 +51,7 @@ public class HelloInputMessageFactory implements OFSerializer<HelloInput>{
         encodeElementsList(message, out);\r
         int endWriterIndex = out.writerIndex();\r
         int writtenBytesDiff = computeLength(message) - (endWriterIndex - startWriterIndex);\r
-        LOGGER.info("writtenbytes: " + writtenBytesDiff);\r
+        LOGGER.debug("writtenbytes: " + writtenBytesDiff);\r
         ByteBufUtils.padBuffer(writtenBytesDiff, out);\r
     }\r
 \r
@@ -62,13 +62,14 @@ public class HelloInputMessageFactory implements OFSerializer<HelloInput>{
         if (elements != null) {\r
             for (Elements element : elements) {\r
                 if (HelloElementType.VERSIONBITMAP.equals(element.getType())) {\r
-                    length += computeVersionBitmapLength(element);\r
+                    int bitmapLength = computeVersionBitmapLength(element);\r
+                    int paddingRemainder = bitmapLength % EncodeConstants.PADDING;\r
+                    if (paddingRemainder != 0) {\r
+                        bitmapLength += EncodeConstants.PADDING - paddingRemainder;\r
+                    }\r
+                    length += bitmapLength;\r
                 }\r
             }\r
-            int paddingRemainder = length % EncodeConstants.PADDING;\r
-            if (paddingRemainder != 0) {\r
-                length += EncodeConstants.PADDING - paddingRemainder;\r
-            }\r
         }\r
         return length;\r
     }\r
@@ -80,20 +81,19 @@ public class HelloInputMessageFactory implements OFSerializer<HelloInput>{
     \r
     private static void encodeElementsList(HelloInput message, ByteBuf output) {\r
         int[] versionBitmap;\r
-        int arraySize = 0;\r
         if (message.getElements() != null) {\r
             for (Elements currElement : message.getElements()) {\r
                 output.writeShort(currElement.getType().getIntValue());\r
-                \r
                 if (currElement.getType().equals(HelloElementType.VERSIONBITMAP)) {\r
                     short bitmapLength = computeVersionBitmapLength(currElement);\r
                     output.writeShort(bitmapLength);\r
                     versionBitmap = ByteBufUtils.fillBitMaskFromList(currElement.getVersionBitmap());\r
-                    arraySize = (versionBitmap.length/Integer.SIZE);\r
-                    for (int i = 0; i < arraySize; i++) {\r
+                    LOGGER.info("vbs: " + versionBitmap.length);\r
+                    for (int i = 0; i < versionBitmap.length; i++) {\r
+                        LOGGER.info(Integer.toBinaryString(versionBitmap[i]));\r
                         output.writeInt(versionBitmap[i]);\r
                     }\r
-                    int padding = bitmapLength - arraySize * 4 - HELLO_ELEMENT_HEADER_SIZE;\r
+                    int padding = bitmapLength - versionBitmap.length * 4 - HELLO_ELEMENT_HEADER_SIZE;\r
                     ByteBufUtils.padBuffer(padding , output);\r
                 }\r
             } \r
@@ -103,7 +103,7 @@ public class HelloInputMessageFactory implements OFSerializer<HelloInput>{
     private static short computeVersionBitmapLength(Elements element) {\r
         short elementlength = HELLO_ELEMENT_HEADER_SIZE;\r
         if (!element.getVersionBitmap().isEmpty()) {\r
-            elementlength += ((element.getVersionBitmap().size() - 1) / Integer.SIZE + 1) * 4;\r
+            elementlength += ((element.getVersionBitmap().size() - 1) / Integer.SIZE + 1) * (Integer.SIZE / Byte.SIZE);\r
         }\r
         return elementlength;\r
     }\r
index 4c2125145a00f0166bfe3d659c21123928283734..196e44d39edd23ed083e32d3da6465cc6fc09ad3 100644 (file)
@@ -18,6 +18,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
  */\r
 public abstract class ByteBufUtils {\r
 \r
+\r
     /**\r
      * Converts ByteBuf into String\r
      * @param bb input ByteBuf\r
@@ -128,17 +129,20 @@ public abstract class ByteBufUtils {
      * @return bit mask\r
      */\r
     public static int[] fillBitMaskFromList(List<Boolean> booleanList) {\r
-        final int intLength = 32;\r
-        int[] bitmask = new int[booleanList.size()];\r
+        int[] bitmask;\r
         int index = 0;\r
         int arrayIndex = 0;\r
-        \r
+        if ((booleanList.size() % Integer.SIZE) != 0) {\r
+            bitmask = new int[booleanList.size() / Integer.SIZE + 1];\r
+        } else {\r
+            bitmask = new int[booleanList.size() / Integer.SIZE];\r
+        }\r
         for (Boolean currElement : booleanList) {\r
             if (currElement != null && currElement.booleanValue()) {\r
                 bitmask[arrayIndex] |= 1 << index;\r
             }\r
             index++;\r
-            arrayIndex = index/intLength;\r
+            arrayIndex = index / Integer.SIZE;\r
         }\r
         return bitmask;\r
     }\r
index 1e5f360bf6d11c429d118df45ecbc30b8cd71bd4..8f710bc1f0686d55bdf5ec6af7712c5de7309971 100644 (file)
@@ -50,10 +50,11 @@ public class HelloInputMessageFactoryTest {
      * @throws Exception \r
      */\r
     @Test\r
-    public void testWithElementsSet() throws Exception {\r
+    public void testWith4BitVersionBitmap() throws Exception {\r
+        int lengthOfBitmap = 4;\r
         HelloInputBuilder builder = new HelloInputBuilder();\r
         BufferHelper.setupHeader(builder);\r
-        List<Elements> expectedElement = createElement();\r
+        List<Elements> expectedElement = createElement(lengthOfBitmap);\r
         builder.setElements(expectedElement);\r
         HelloInput message = builder.build();\r
         \r
@@ -65,24 +66,64 @@ public class HelloInputMessageFactoryTest {
         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
         Elements element = readElement(out).get(0);\r
         Assert.assertEquals("Wrong element type", expectedElement.get(0).getType(), element.getType());\r
-        LOGGER.debug(expectedElement.get(0).getVersionBitmap().toString());\r
-        LOGGER.debug(element.getVersionBitmap().toString());\r
-        Assert.assertArrayEquals("Wrong element bitmap", expectedElement.get(0).getVersionBitmap().toArray(), element.getVersionBitmap().toArray());\r
+        Elements comparation = createComparationElement(lengthOfBitmap).get(0);\r
+        Assert.assertArrayEquals("Wrong element bitmap", comparation.getVersionBitmap().toArray(), element.getVersionBitmap().toArray());\r
     }\r
     \r
-    private static List<Elements> createElement() {\r
+    /**\r
+     * Testing of {@link HelloInputMessageFactory} for correct translation from POJO\r
+     * @throws Exception \r
+     */\r
+    @Test\r
+    public void testWith64BitVersionBitmap() throws Exception {\r
+        int lengthOfBitmap = 64;\r
+        HelloInputBuilder builder = new HelloInputBuilder();\r
+        BufferHelper.setupHeader(builder);\r
+        List<Elements> expectedElement = createElement(lengthOfBitmap);\r
+        builder.setElements(expectedElement);\r
+        HelloInput message = builder.build();\r
+        \r
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
+        HelloInputMessageFactory factory = HelloInputMessageFactory.getInstance();\r
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
+        LOGGER.debug("bytebuf: " + ByteBufUtils.byteBufToHexString(out));\r
+        \r
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
+        Elements element = readElement(out).get(0);\r
+        Assert.assertEquals("Wrong element type", expectedElement.get(0).getType(), element.getType());\r
+        Elements comparation = createComparationElement(lengthOfBitmap).get(0);\r
+        Assert.assertArrayEquals("Wrong element bitmap", comparation.getVersionBitmap().toArray(), element.getVersionBitmap().toArray());\r
+    }\r
+    \r
+    private static List<Elements> createElement(int lengthOfBitmap) {\r
         ElementsBuilder elementsBuilder = new ElementsBuilder();\r
         List<Elements> elementsList = new ArrayList<>();\r
         List<Boolean> booleanList = new ArrayList<>();\r
-\r
-        for (int i = 0; i < 64; i++) {\r
+        for (int i = 0; i < lengthOfBitmap; i++) {\r
             booleanList.add(true);\r
         }\r
-\r
         elementsBuilder.setType(HelloElementType.forValue(1));\r
         elementsBuilder.setVersionBitmap(booleanList);\r
         elementsList.add(elementsBuilder.build());\r
-        \r
+        return elementsList;\r
+    }\r
+    \r
+    private static List<Elements> createComparationElement(int lengthOfBitmap) {\r
+        ElementsBuilder elementsBuilder = new ElementsBuilder();\r
+        List<Elements> elementsList = new ArrayList<>();\r
+        List<Boolean> booleanList = new ArrayList<>();\r
+        for (int i = 0; i < lengthOfBitmap; i++) {\r
+            booleanList.add(true);\r
+        }\r
+        if ((lengthOfBitmap % Integer.SIZE) != 0) {\r
+            for (int i = 0; i < (Integer.SIZE - (lengthOfBitmap % Integer.SIZE)); i++) {\r
+                booleanList.add(false);\r
+            }\r
+        }\r
+        LOGGER.debug("boolsize " + booleanList.size());\r
+        elementsBuilder.setType(HelloElementType.forValue(1));\r
+        elementsBuilder.setVersionBitmap(booleanList);\r
+        elementsList.add(elementsBuilder.build());\r
         return elementsList;\r
     }\r
     \r