MacAddress (de)serialization fixed
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / MultipartReplyMessageFactory.java
index 020cd21549ebc050c129cea58d3ad56a4b97c735..15944d6bb896b431f0ed96098ecb060dab1f939a 100644 (file)
@@ -9,6 +9,7 @@ import java.util.List;
 \r
 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
 import org.opendaylight.openflowjava.protocol.impl.util.ActionsDeserializer;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
 import org.opendaylight.openflowjava.protocol.impl.util.InstructionsDeserializer;\r
 import org.opendaylight.openflowjava.protocol.impl.util.MatchDeserializer;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
@@ -31,14 +32,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.GroupType;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupTypes;\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.MeterBandTypeBitmap;\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
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;\r
 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.common.types.rev130731.TableConfig;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesPropType;\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
@@ -306,7 +308,7 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
             byte[] metadataWrite = new byte[Long.SIZE / Byte.SIZE];\r
             input.readBytes(metadataWrite);\r
             featuresBuilder.setMetadataWrite(metadataWrite);\r
-            featuresBuilder.setConfig(createPortConfig(input.readUnsignedInt()));\r
+            featuresBuilder.setConfig(createTableConfig(input.readUnsignedInt()));\r
             featuresBuilder.setMaxEntries(input.readUnsignedInt());\r
             featuresBuilder.setTableFeatureProperties(createTableFeaturesProperties(input, \r
                     length - MULTIPART_REPLY_TABLE_FEATURES_STRUCTURE_LENGTH));\r
@@ -316,6 +318,11 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
         return builder.build();\r
     }\r
     \r
+    private static TableConfig createTableConfig(long input) {\r
+        boolean deprecated = (input & 3) != 0;\r
+        return new TableConfig(deprecated);\r
+    }\r
+    \r
     private static List<TableFeatureProperties> createTableFeaturesProperties(ByteBuf input, int length) {\r
         final byte COMMON_PROPERTY_LENGTH = 4;\r
         List<TableFeatureProperties> properties = new ArrayList<>();\r
@@ -497,22 +504,28 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
         final byte PADDING_IN_METER_FEATURES_HEADER = 2;\r
         MultipartReplyMeterFeaturesBuilder builder = new MultipartReplyMeterFeaturesBuilder();\r
         builder.setMaxMeter(input.readUnsignedInt());\r
-        builder.setBandTypes(MeterBandType.forValue(input.readInt()));\r
-        builder.setCapabilities(decodeMeterModFlags(input.readUnsignedInt()));\r
+        builder.setBandTypes(createMeterBandsBitmap(input.readUnsignedInt()));\r
+        builder.setCapabilities(createMeterFlags(input.readUnsignedInt()));\r
         builder.setMaxBands(input.readUnsignedByte());\r
         builder.setMaxColor(input.readUnsignedByte());\r
         input.skipBytes(PADDING_IN_METER_FEATURES_HEADER);\r
         return builder.build();\r
     }\r
     \r
-    private static MeterFlags decodeMeterModFlags(long input){\r
+    private static MeterFlags createMeterFlags(long input){\r
         final Boolean _oFPMFKBPS = (input & (1 << 0)) != 0;\r
         final Boolean _oFPMFPKTPS = (input & (1 << 1)) != 0;\r
-        final Boolean _oFPMFBURST = (input & (1 << 2)) != 0; \r
+        final Boolean _oFPMFBURST = (input & (1 << 2)) != 0;\r
         final Boolean _oFPMFSTATS = (input & (1 << 3)) != 0;\r
         return new MeterFlags(_oFPMFBURST, _oFPMFKBPS, _oFPMFPKTPS, _oFPMFSTATS);\r
     }\r
     \r
+    private static MeterBandTypeBitmap createMeterBandsBitmap(long input) {\r
+        final Boolean _oFPMBTDROP = (input & (1 << 0)) != 0;\r
+        final Boolean _oFPMBTDSCPREMARK = (input & (1 << 1)) != 0;\r
+        return new MeterBandTypeBitmap(_oFPMBTDROP, _oFPMBTDSCPREMARK);\r
+    }\r
+    \r
     private static MultipartReplyMeter setMeter(ByteBuf input) {\r
         final byte PADDING_IN_METER_STATS_HEADER = 6;\r
         final byte METER_BAND_STATS_LENGTH = 16;\r
@@ -562,7 +575,7 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
         while (input.readableBytes() > 0) {\r
             MeterConfigBuilder meterConfigBuilder = new MeterConfigBuilder();\r
             int meterConfigBodyLength = input.readUnsignedShort();\r
-            meterConfigBuilder.setFlags(MeterModCommand.forValue(input.readUnsignedShort()));\r
+            meterConfigBuilder.setFlags(createMeterFlags(input.readUnsignedShort()));\r
             meterConfigBuilder.setMeterId(input.readUnsignedInt());\r
             int actualLength = METER_CONFIG_LENGTH;\r
             List<Bands> bandsList = new ArrayList<>();\r
@@ -623,7 +636,7 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
     private static MultipartReplyPortDesc setPortDesc(ByteBuf input) {\r
         final byte PADDING_IN_PORT_DESC_HEADER_01 = 4;\r
         final byte PADDING_IN_PORT_DESC_HEADER_02 = 2;\r
-        final int macAddressLength = 6;\r
+        final int MAC_ADDRESS_LENGTH = 6;\r
         final byte MAX_PORT_NAME_LEN = 16;\r
         MultipartReplyPortDescBuilder builder = new MultipartReplyPortDescBuilder();\r
         List<Ports> portsList = new ArrayList<>();\r
@@ -631,13 +644,9 @@ public class MultipartReplyMessageFactory implements OFDeserializer<MultipartRep
             PortsBuilder portsBuilder = new PortsBuilder();\r
             portsBuilder.setPortNo(input.readUnsignedInt());\r
             input.skipBytes(PADDING_IN_PORT_DESC_HEADER_01);\r
-            StringBuffer macToString = new StringBuffer();\r
-            for(int i=0; i<macAddressLength; i++){\r
-                short mac = 0;\r
-                mac = input.readUnsignedByte();\r
-                macToString.append(String.format("%02X", mac));\r
-            }\r
-            portsBuilder.setHwAddr(new MacAddress(macToString.toString()));\r
+            byte[] hwAddress = new byte[MAC_ADDRESS_LENGTH];\r
+            input.readBytes(hwAddress);\r
+            portsBuilder.setHwAddr(new MacAddress(ByteBufUtils.macAddressToString(hwAddress)));\r
             input.skipBytes(PADDING_IN_PORT_DESC_HEADER_02);\r
             byte[] portNameBytes = new byte[MAX_PORT_NAME_LEN];\r
             input.readBytes(portNameBytes);\r