hello-VersionBitmap fixed
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / HelloInputMessageFactory.java
index 27af163902e6f6a39f682e3434f8943a755284d4..d2b7f33ce080a2d7dd307c4cba8923d681c143d7 100644 (file)
@@ -1,15 +1,17 @@
 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
 \r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
 import io.netty.buffer.ByteBuf;\r
 \r
+import java.util.List;\r
+\r
 import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;\r
 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\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.HelloInput;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.Elements;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
 \r
 /**\r
  * @author michal.polkorab\r
@@ -19,9 +21,14 @@ public class HelloInputMessageFactory implements OFSerializer<HelloInput>{
 \r
     /** Code type of Hello message */\r
     private static final byte MESSAGE_TYPE = 0;\r
-    private static int MESSAGE_LENGTH = 0;\r
+    private static int MESSAGE_LENGTH = 8;\r
+    public static final byte HELLO_ELEMENT_HEADER_SIZE = 4;\r
     private static HelloInputMessageFactory instance;\r
     \r
+    private static final Logger LOGGER = LoggerFactory\r
+            .getLogger(HelloInputMessageFactory.class);\r
+    \r
+    \r
     private HelloInputMessageFactory() {\r
         // do nothing, just singleton\r
     }\r
@@ -38,14 +45,31 @@ public class HelloInputMessageFactory implements OFSerializer<HelloInput>{
 \r
     @Override\r
     public void messageToBuffer(short version, ByteBuf out, HelloInput message) {\r
-        computeElementsLength(message.getElements());\r
+        int startWriterIndex = out.writerIndex();\r
         ByteBufUtils.writeOFHeader(instance, message, out);\r
-        encodeElementsList(message.getElements(), out);\r
+        encodeElementsList(message, out);\r
+        int endWriterIndex = out.writerIndex();\r
+        int writtenBytesDiff = computeLength(message) - (endWriterIndex - startWriterIndex);\r
+        LOGGER.info("writtenbytes: " + writtenBytesDiff);\r
+        ByteBufUtils.padBuffer(writtenBytesDiff, out);\r
     }\r
 \r
     @Override\r
-    public int computeLength() {\r
-        return MESSAGE_LENGTH;\r
+    public int computeLength(HelloInput message) {\r
+        int length = MESSAGE_LENGTH;\r
+        List<Elements> elements = message.getElements();\r
+        if (elements != null) {\r
+            for (Elements element : elements) {\r
+                if (HelloElementType.VERSIONBITMAP.equals(element.getType())) {\r
+                    length += computeVersionBitmapLength(element);\r
+                }\r
+            }\r
+            int paddingRemainder = length % EncodeConstants.PADDING;\r
+            if (paddingRemainder != 0) {\r
+                length += EncodeConstants.PADDING - paddingRemainder;\r
+            }\r
+        }\r
+        return length;\r
     }\r
 \r
     @Override\r
@@ -53,32 +77,33 @@ public class HelloInputMessageFactory implements OFSerializer<HelloInput>{
         return MESSAGE_TYPE;\r
     }\r
     \r
-    private static int computeElementsLength(List<Elements> elements) {\r
-        int versionBitmapSize = 0;\r
-        final int ofHeaderSize = 8;\r
-        int typeSize = 0;\r
-        \r
-        if (elements != null) {\r
-            typeSize = 2;\r
-            versionBitmapSize = elements.get(0).getVersionBitmap().size()/Byte.SIZE;\r
-            } \r
-        MESSAGE_LENGTH = ofHeaderSize + versionBitmapSize + typeSize;\r
-        return MESSAGE_LENGTH;\r
-    }\r
\r
-    private static void encodeElementsList(List<Elements> elements, ByteBuf output) {\r
+    private static void encodeElementsList(HelloInput message, ByteBuf output) {\r
         int[] versionBitmap;\r
         int arraySize = 0;\r
-        if (elements != null) {\r
-            for (Iterator<Elements> iterator = elements.iterator(); iterator.hasNext();) {\r
-                Elements currElement = iterator.next();\r
+        if (message.getElements() != null) {\r
+            for (Elements currElement : message.getElements()) {\r
                 output.writeShort(currElement.getType().getIntValue());\r
-                versionBitmap = ByteBufUtils.fillBitMaskFromList(currElement.getVersionBitmap());\r
-                arraySize = (versionBitmap.length/Integer.SIZE);\r
-                for (int i = 0; i < arraySize; i++) {\r
-                    output.writeInt(versionBitmap[i]);\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
+                        output.writeInt(versionBitmap[i]);\r
+                    }\r
+                    int padding = bitmapLength - arraySize * 4 - HELLO_ELEMENT_HEADER_SIZE;\r
+                    ByteBufUtils.padBuffer(padding , output);\r
                 }\r
             } \r
         }\r
     }\r
+    \r
+    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
+        }\r
+        return elementlength;\r
+    }\r
 }\r