Merge "OF1.0 fixes"
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / OF10FeaturesReplyMessageFactory.java
index 9a82c776695e288774f0581f8362988da81ebacd..7c6dc262a265e53466724d7d9eace891f7ff7432 100644 (file)
@@ -4,8 +4,12 @@ package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
 import io.netty.buffer.ByteBuf;\r
 \r
 import java.math.BigInteger;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
 \r
 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
+import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;\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.ActionTypeV10;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.CapabilitiesV10;\r
@@ -14,16 +18,15 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortStateV10;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutputBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.features.reply.PhyPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.features.reply.PhyPortBuilder;\r
 \r
 /**\r
+ * Translates FeaturesReply messages (OpenFlow v1.0)\r
  * @author michal.polkorab\r
- *\r
  */\r
 public class OF10FeaturesReplyMessageFactory implements OFDeserializer<GetFeaturesOutput> {\r
     \r
-    private static final byte MAC_ADDRESS_LENGTH = 6;\r
-    private static final byte MAX_PORT_NAME_LENGTH = 16;\r
-    \r
     private static final byte PADDING_IN_FEATURES_REPLY_HEADER = 3;\r
     \r
     private static OF10FeaturesReplyMessageFactory instance;\r
@@ -55,7 +58,11 @@ public class OF10FeaturesReplyMessageFactory implements OFDeserializer<GetFeatur
         rawMessage.skipBytes(PADDING_IN_FEATURES_REPLY_HEADER);\r
         builder.setCapabilitiesV10(createCapabilitiesV10(rawMessage.readUnsignedInt()));\r
         builder.setActionsV10(createActionsV10(rawMessage.readUnsignedInt()));\r
-        deserializePort(rawMessage, builder);\r
+        List<PhyPort> ports = new ArrayList<>();\r
+        while (rawMessage.readableBytes() > 0) {\r
+            ports.add(deserializePort(rawMessage));\r
+        }\r
+        builder.setPhyPort(ports);\r
         return builder.build();\r
     }\r
 \r
@@ -91,24 +98,23 @@ public class OF10FeaturesReplyMessageFactory implements OFDeserializer<GetFeatur
                 SET_VLAN_PCP, SET_VLAN_VID, STRIP_VLAN, VENDOR);\r
     }\r
     \r
-    private static void deserializePort(ByteBuf rawMessage, GetFeaturesOutputBuilder builder) {\r
+    private static PhyPort deserializePort(ByteBuf rawMessage) {\r
+        PhyPortBuilder builder = new PhyPortBuilder();\r
         builder.setPortNo((long) rawMessage.readUnsignedShort());\r
-        StringBuffer macToString = new StringBuffer();\r
-        for(int i = 0; i < MAC_ADDRESS_LENGTH; i++){\r
-            short mac = rawMessage.readUnsignedByte();\r
-            macToString.append(String.format("%02X", mac));\r
-        }\r
-        builder.setHwAddr(new MacAddress(macToString.toString()));\r
-        byte[] name = new byte[MAX_PORT_NAME_LENGTH];\r
-        rawMessage.readBytes(name);\r
-        builder.setName(name.toString());\r
+        byte[] address = new byte[EncodeConstants.MAC_ADDRESS_LENGTH];\r
+        rawMessage.readBytes(address);\r
+        builder.setHwAddr(new MacAddress(ByteBufUtils.macAddressToString(address)));\r
+        builder.setName(ByteBufUtils.decodeNullTerminatedString(rawMessage, EncodeConstants.MAX_PORT_NAME_LENGTH));\r
         builder.setConfigV10(createPortConfig(rawMessage.readUnsignedInt()));\r
         builder.setStateV10(createPortState(rawMessage.readUnsignedInt()));\r
         builder.setCurrentFeaturesV10(createPortFeatures(rawMessage.readUnsignedInt()));\r
         builder.setAdvertisedFeaturesV10(createPortFeatures(rawMessage.readUnsignedInt()));\r
         builder.setSupportedFeaturesV10(createPortFeatures(rawMessage.readUnsignedInt()));\r
         builder.setPeerFeaturesV10(createPortFeatures(rawMessage.readUnsignedInt()));\r
+        return builder.build();\r
     }\r
+\r
+    \r
     \r
     private static PortStateV10 createPortState(long input){\r
         final Boolean _linkDown = ((input) & (1<<0)) != 0;\r