Merge "Ip address is now send correctly"
authorAdam Brcek <adam.brcek@pantheon.sk>
Mon, 2 Dec 2013 15:57:08 +0000 (15:57 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Mon, 2 Dec 2013 15:57:08 +0000 (15:57 +0000)
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/ActionsSerializer.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/InstructionsSerializer.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/MatchDeserializer.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/MatchSerializer.java
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/util/MatchSerializerTest.java [new file with mode: 0644]

index 89920c2fc3eb461784408279d6769d5f846a55c5..c7e07ee716f179494a941388af99c22eba5a4fa3 100644 (file)
@@ -53,39 +53,39 @@ public abstract class ActionsSerializer {
         }\r
         for (ActionsList list : actionsList) {\r
             Action action = list.getAction();\r
-            if (action.getType().equals(Output.class)) {\r
+            if (action.getType().isAssignableFrom(Output.class)) {\r
                 encodeOutputAction(action, outBuffer);\r
-            } else if (action.getType().equals(CopyTtlOut.class)) {\r
+            } else if (action.getType().isAssignableFrom(CopyTtlOut.class)) {\r
                 encodeCopyTtlOutAction(outBuffer);\r
-            } else if (action.getType().equals(CopyTtlIn.class)) {\r
+            } else if (action.getType().isAssignableFrom(CopyTtlIn.class)) {\r
                 encodeCopyTtlInAction(outBuffer);\r
-            } else if (action.getType().equals(SetMplsTtl.class)) {\r
+            } else if (action.getType().isAssignableFrom(SetMplsTtl.class)) {\r
                 encodeSetMplsTtltAction(action, outBuffer);\r
-            } else if (action.getType().equals(DecMplsTtl.class)) {\r
+            } else if (action.getType().isAssignableFrom(DecMplsTtl.class)) {\r
                 encodeDecMplsTtlAction(outBuffer);\r
-            } else if (action.getType().equals(PushVlan.class)) {\r
+            } else if (action.getType().isAssignableFrom(PushVlan.class)) {\r
                 encodePushVlanAction(action, outBuffer);\r
-            } else if (action.getType().equals(PopVlan.class)) {\r
+            } else if (action.getType().isAssignableFrom(PopVlan.class)) {\r
                 encodePopVlanAction(outBuffer);\r
-            } else if (action.getType().equals(PushMpls.class)) {\r
+            } else if (action.getType().isAssignableFrom(PushMpls.class)) {\r
                 encodePushMplsAction(action, outBuffer);\r
-            } else if (action.getType().equals(PopMpls.class)) {\r
+            } else if (action.getType().isAssignableFrom(PopMpls.class)) {\r
                 encodePopMplsAction(action, outBuffer);\r
-            } else if (action.getType().equals(SetQueue.class)) {\r
+            } else if (action.getType().isAssignableFrom(SetQueue.class)) {\r
                 encodeSetQueueAction(action, outBuffer);\r
-            } else if (action.getType().equals(Group.class)) {\r
+            } else if (action.getType().isAssignableFrom(Group.class)) {\r
                 encodeGroupAction(action, outBuffer);\r
-            } else if (action.getType().equals(SetNwTtl.class)) {\r
+            } else if (action.getType().isAssignableFrom(SetNwTtl.class)) {\r
                 encodeSetNwTtlAction(action, outBuffer);\r
-            } else if (action.getType().equals(DecNwTtl.class)) {\r
+            } else if (action.getType().isAssignableFrom(DecNwTtl.class)) {\r
                 encodeDecNwTtlAction(outBuffer);\r
-            } else if (action.getType().equals(SetField.class)) {\r
+            } else if (action.getType().isAssignableFrom(SetField.class)) {\r
                 encodeSetFieldAction(action, outBuffer);\r
-            } else if (action.getType().equals(PushPbb.class)) {\r
+            } else if (action.getType().isAssignableFrom(PushPbb.class)) {\r
                 encodePushPbbAction(action, outBuffer);\r
-            } else if (action.getType().equals(PopPbb.class)) {\r
+            } else if (action.getType().isAssignableFrom(PopPbb.class)) {\r
                 encodePopPbbAction(outBuffer);\r
-            } else if (action.getType().equals(Experimenter.class)) {\r
+            } else if (action.getType().isAssignableFrom(Experimenter.class)) {\r
                 encodeExperimenterAction(action, outBuffer);\r
             } \r
         }\r
@@ -257,9 +257,9 @@ public abstract class ActionsSerializer {
         if (actionsList != null) {\r
             for (ActionsList list : actionsList) {\r
                 Action action = list.getAction();\r
-                if (action.getType().equals(Output.class)) {\r
+                if (action.getType().isAssignableFrom(Output.class)) {\r
                     lengthOfActions += OUTPUT_LENGTH;\r
-                } else if (action.getType().equals(SetField.class)){\r
+                } else if (action.getType().isAssignableFrom(SetField.class)){\r
                     List<MatchEntries> entries = action.getAugmentation(OxmFieldsAction.class).getMatchEntries();\r
                     int actionLength = ACTION_HEADER_LENGTH + MatchSerializer.computeMatchEntriesLength(entries);\r
                     lengthOfActions += actionLength;\r
index aa998bcabe02aaad6b84adcfab69907e7eb675cc..8106459c631edac39244c9065e7289b4afeaf24a 100644 (file)
@@ -37,14 +37,14 @@ public abstract class InstructionsSerializer {
         if (instructions != null) {\r
             for (Instructions instruction : instructions) {\r
                 Class<? extends Instruction> type = instruction.getType();\r
-                if (type.equals(GotoTable.class)) {\r
+                if (type.isAssignableFrom(GotoTable.class)) {\r
                     final byte GOTO_TABLE_TYPE = 1;\r
                     final byte GOTO_TABLE_LENGTH = 8;\r
                     final byte PADDING_IN_GOTO_TABLE = 3;\r
                     writeTypeAndLength(out, GOTO_TABLE_TYPE, GOTO_TABLE_LENGTH);\r
                     out.writeByte(instruction.getAugmentation(TableIdInstruction.class).getTableId());\r
                     ByteBufUtils.padBuffer(PADDING_IN_GOTO_TABLE, out);\r
-                } else if (type.equals(WriteMetadata.class)) {\r
+                } else if (type.isAssignableFrom(WriteMetadata.class)) {\r
                     final byte WRITE_METADATA_TYPE = 2;\r
                     final byte WRITE_METADATA_LENGTH = 24;\r
                     final byte PADDING_IN_WRITE_METADATA = 4;\r
@@ -53,24 +53,24 @@ public abstract class InstructionsSerializer {
                     MetadataInstruction metadata = instruction.getAugmentation(MetadataInstruction.class);\r
                     out.writeBytes(metadata.getMetadata());\r
                     out.writeBytes(metadata.getMetadataMask());\r
-                } else if (type.equals(WriteActions.class)) {\r
+                } else if (type.isAssignableFrom(WriteActions.class)) {\r
                     final byte WRITE_ACTIONS_TYPE = 3;\r
                     writeActionsInstruction(out, instruction, WRITE_ACTIONS_TYPE);\r
-                } else if (type.equals(ApplyActions.class)) {\r
+                } else if (type.isAssignableFrom(ApplyActions.class)) {\r
                     final byte APPLY_ACTIONS_TYPE = 4;\r
                     writeActionsInstruction(out, instruction, APPLY_ACTIONS_TYPE);\r
-                } else if (type.equals(ClearActions.class)) {\r
+                } else if (type.isAssignableFrom(ClearActions.class)) {\r
                     final byte CLEAR_ACTIONS_TYPE = 5;\r
                     final byte CLEAR_ACTIONS_LENGTH = 8;\r
                     final byte PADDING_IN_CLEAR_ACTIONS = 4;\r
                     writeTypeAndLength(out, CLEAR_ACTIONS_TYPE, CLEAR_ACTIONS_LENGTH);\r
                     ByteBufUtils.padBuffer(PADDING_IN_CLEAR_ACTIONS, out);\r
-                } else if (type.equals(Meter.class)) {\r
+                } else if (type.isAssignableFrom(Meter.class)) {\r
                     final byte METER_TYPE = 6;\r
                     final byte METER_LENGTH = 8;\r
                     writeTypeAndLength(out, METER_TYPE, METER_LENGTH);\r
                     out.writeInt(instruction.getAugmentation(MeterIdInstruction.class).getMeterId().intValue());\r
-                } else if (type.equals(Experimenter.class)) {\r
+                } else if (type.isAssignableFrom(Experimenter.class)) {\r
                     final byte EXPERIMENTER_TYPE = 7;\r
                     final byte EXPERIMENTER_LENGTH = 8;\r
                     ExperimenterInstruction experimenter = instruction.getAugmentation(ExperimenterInstruction.class);\r
@@ -110,27 +110,27 @@ public abstract class InstructionsSerializer {
         if (instructions != null) {\r
             for (Instructions instruction : instructions) {\r
                 Class<? extends Instruction> type = instruction.getType();\r
-                if (type.equals(GotoTable.class)) {\r
+                if (type.isAssignableFrom(GotoTable.class)) {\r
                     final byte GOTO_TABLE_LENGTH = 8;\r
                     length += GOTO_TABLE_LENGTH;\r
-                } else if (type.equals(WriteMetadata.class)) {\r
+                } else if (type.isAssignableFrom(WriteMetadata.class)) {\r
                     final byte WRITE_METADATA_LENGTH = 24;\r
                     length += WRITE_METADATA_LENGTH;\r
-                } else if (type.equals(WriteActions.class)) {\r
+                } else if (type.isAssignableFrom(WriteActions.class)) {\r
                     final byte WRITE_ACTIONS_LENGTH = 8;\r
                     length += WRITE_ACTIONS_LENGTH + ActionsSerializer.computeLengthOfActions(\r
                             instruction.getAugmentation(ActionsInstruction.class).getActionsList());\r
-                } else if (type.equals(ApplyActions.class)) {\r
+                } else if (type.isAssignableFrom(ApplyActions.class)) {\r
                     final byte APPLY_ACTIONS_LENGTH = 8;\r
                     length += APPLY_ACTIONS_LENGTH + ActionsSerializer.computeLengthOfActions(\r
                             instruction.getAugmentation(ActionsInstruction.class).getActionsList());\r
-                } else if (type.equals(ClearActions.class)) {\r
+                } else if (type.isAssignableFrom(ClearActions.class)) {\r
                     final byte CLEAR_ACTIONS_LENGTH = 8;\r
                     length += CLEAR_ACTIONS_LENGTH;\r
-                } else if (type.equals(Meter.class)) {\r
+                } else if (type.isAssignableFrom(Meter.class)) {\r
                     final byte METER_LENGTH = 8;\r
                     length += METER_LENGTH;\r
-                } else if (type.equals(Experimenter.class)) {\r
+                } else if (type.isAssignableFrom(Experimenter.class)) {\r
                     final byte EXPERIMENTER_LENGTH = 8;\r
                     ExperimenterInstruction experimenter = instruction.getAugmentation(ExperimenterInstruction.class);\r
                     byte[] data = experimenter.getData();\r
index 98b01c4b0745b39ed4295519876f19a71c28172c..0717180e6529dc17f1030c92413e047e0902f1b7 100644 (file)
@@ -204,6 +204,7 @@ public abstract class MatchDeserializer {
 \r
             int fieldAndMask = in.readUnsignedByte();\r
             boolean hasMask = (fieldAndMask & 1) != 0;\r
+            matchEntriesBuilder.setHasMask(hasMask);\r
             int matchField =  fieldAndMask >> 1;\r
             int matchEntryLength = in.readUnsignedByte();\r
             currLength += SIZE_OF_SHORT_IN_BYTES + (2 * SIZE_OF_BYTE_IN_BYTES) + matchEntryLength;\r
index e4028c369a1c657d842108a33fb78c8f8099a68f..6e3edcf00149bc0170eb68c2eada21413df838da 100644 (file)
@@ -107,7 +107,7 @@ public class MatchSerializer {
         }\r
         encodeType(match, out);\r
         // Length of ofp_match (excluding padding)\r
-        int length = computeMatchLength(match);\r
+        int length = computeMatchLengthInternal(match);\r
         out.writeShort(length);\r
         encodeMatchEntries(match.getMatchEntries(), out);\r
         int paddingRemainder = length % EncodeConstants.PADDING;\r
@@ -119,9 +119,9 @@ public class MatchSerializer {
     private static void encodeType(Match match, ByteBuf out) {\r
         final byte STANDARD_MATCH_TYPE_CODE = 0;\r
         final byte OXM_MATCH_TYPE_CODE = 1;\r
-        if (match.getType().equals(StandardMatchType.class)) {\r
+        if (match.getType().isAssignableFrom(StandardMatchType.class)) {\r
             out.writeShort(STANDARD_MATCH_TYPE_CODE);\r
-        } else if (match.getType().equals(OxmMatchType.class)) {\r
+        } else if (match.getType().isAssignableFrom(OxmMatchType.class)) {\r
             out.writeShort(OXM_MATCH_TYPE_CODE);\r
         }\r
     }\r
@@ -147,13 +147,13 @@ public class MatchSerializer {
         final int NXM1_CLASS_CODE = 0x0001;\r
         final int OPENFLOW_BASIC_CLASS_CODE = 0x8000;\r
         final int EXPERIMENTER_CLASS_CODE = 0xFFFF;\r
-        if (Nxm0Class.class.equals(clazz)) {\r
+        if (clazz.isAssignableFrom(Nxm0Class.class)) {\r
             out.writeShort(NXM0_CLASS_CODE);\r
-        } else if (Nxm1Class.class.equals(clazz)) {\r
+        } else if (clazz.isAssignableFrom(Nxm1Class.class)) {\r
             out.writeShort(NXM1_CLASS_CODE);\r
-        } else if (OpenflowBasicClass.class.equals(clazz)) {\r
+        } else if (clazz.isAssignableFrom(OpenflowBasicClass.class)) {\r
             out.writeShort(OPENFLOW_BASIC_CLASS_CODE);\r
-        } else if (ExperimenterClass.class.equals(clazz)) {\r
+        } else if (clazz.isAssignableFrom(ExperimenterClass.class)) {\r
             out.writeShort(EXPERIMENTER_CLASS_CODE);\r
         }\r
     }\r
@@ -161,28 +161,28 @@ public class MatchSerializer {
     private static void encodeRest(MatchEntries entry, ByteBuf out) {\r
         int fieldValue = 0;\r
         Class<? extends MatchField> field = entry.getOxmMatchField();\r
-        if (field.equals(InPort.class)) {\r
+        if (field.isAssignableFrom(InPort.class)) {\r
             fieldValue = 0;\r
             writeOxmFieldAndLength(out, fieldValue, Integer.SIZE / Byte.SIZE);\r
             out.writeInt(entry.getAugmentation(PortNumberMatchEntry.class).getPortNumber().getValue().intValue());\r
-        } else if (field.equals(InPhyPort.class)) {\r
+        } else if (field.isAssignableFrom(InPhyPort.class)) {\r
             fieldValue = 1;\r
             writeOxmFieldAndLength(out, fieldValue, Integer.SIZE / Byte.SIZE);\r
             out.writeInt(entry.getAugmentation(PortNumberMatchEntry.class).getPortNumber().getValue().intValue());\r
-        } else if (field.equals(Metadata.class)) {\r
+        } else if (field.isAssignableFrom(Metadata.class)) {\r
             fieldValue = 2;\r
             writeMetadataRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(EthDst.class)) {\r
+        } else if (field.isAssignableFrom(EthDst.class)) {\r
             fieldValue = 3;\r
             writeMacAddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(EthSrc.class)) {\r
+        } else if (field.isAssignableFrom(EthSrc.class)) {\r
             fieldValue = 4;\r
             writeMacAddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(EthType.class)) {\r
+        } else if (field.isAssignableFrom(EthType.class)) {\r
             fieldValue = 5;\r
             writeOxmFieldAndLength(out, fieldValue, Short.SIZE / Byte.SIZE);\r
             out.writeShort(entry.getAugmentation(EthTypeMatchEntry.class).getEthType().getValue().shortValue());\r
-        } else if (field.equals(VlanVid.class)) {\r
+        } else if (field.isAssignableFrom(VlanVid.class)) {\r
             fieldValue = 6;\r
             fieldValue = fieldValue << 1;\r
             VlanVidMatchEntry vlanVid = entry.getAugmentation(VlanVidMatchEntry.class);\r
@@ -201,83 +201,83 @@ public class MatchSerializer {
                 writeOxmFieldAndLength(out, fieldValue, Short.SIZE / Byte.SIZE);\r
                 out.writeShort(vlanVidValue);\r
             }\r
-        } else if (field.equals(VlanPcp.class)) {\r
+        } else if (field.isAssignableFrom(VlanPcp.class)) {\r
             fieldValue = 7;\r
             writeOxmFieldAndLength(out, fieldValue, Byte.SIZE / Byte.SIZE);\r
             out.writeByte(entry.getAugmentation(VlanPcpMatchEntry.class).getVlanPcp().byteValue());\r
-        } else if (field.equals(IpDscp.class)) {\r
+        } else if (field.isAssignableFrom(IpDscp.class)) {\r
             fieldValue = 8;\r
             writeOxmFieldAndLength(out, fieldValue, Byte.SIZE / Byte.SIZE);\r
             out.writeByte(entry.getAugmentation(DscpMatchEntry.class).getDscp().getValue());\r
-        } else if (field.equals(IpEcn.class)) {\r
+        } else if (field.isAssignableFrom(IpEcn.class)) {\r
             fieldValue = 9;\r
             writeOxmFieldAndLength(out, fieldValue, Byte.SIZE / Byte.SIZE);\r
             out.writeByte(entry.getAugmentation(EcnMatchEntry.class).getEcn());\r
-        } else if (field.equals(IpProto.class)) {\r
+        } else if (field.isAssignableFrom(IpProto.class)) {\r
             fieldValue = 10;\r
             writeOxmFieldAndLength(out, fieldValue, Byte.SIZE / Byte.SIZE);\r
             out.writeByte(entry.getAugmentation(ProtocolNumberMatchEntry.class).getProtocolNumber());\r
-        } else if (field.equals(Ipv4Src.class)) {\r
+        } else if (field.isAssignableFrom(Ipv4Src.class)) {\r
             fieldValue = 11;\r
             writeIpv4AddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(Ipv4Dst.class)) {\r
+        } else if (field.isAssignableFrom(Ipv4Dst.class)) {\r
             fieldValue = 12;\r
             writeIpv4AddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(TcpSrc.class)) {\r
+        } else if (field.isAssignableFrom(TcpSrc.class)) {\r
             fieldValue = 13;\r
             writeOxmFieldAndLength(out, fieldValue, Short.SIZE / Byte.SIZE);\r
             out.writeShort(entry.getAugmentation(PortMatchEntry.class).getPort().getValue().intValue());\r
-        } else if (field.equals(TcpDst.class)) {\r
+        } else if (field.isAssignableFrom(TcpDst.class)) {\r
             fieldValue = 14;\r
             writeOxmFieldAndLength(out, fieldValue, Short.SIZE / Byte.SIZE);\r
             out.writeShort(entry.getAugmentation(PortMatchEntry.class).getPort().getValue().intValue());\r
-        } else if (field.equals(UdpSrc.class)) {\r
+        } else if (field.isAssignableFrom(UdpSrc.class)) {\r
             fieldValue = 15;\r
             writeOxmFieldAndLength(out, fieldValue, Short.SIZE / Byte.SIZE);\r
             out.writeShort(entry.getAugmentation(PortMatchEntry.class).getPort().getValue().intValue());\r
-        } else if (field.equals(UdpDst.class)) {\r
+        } else if (field.isAssignableFrom(UdpDst.class)) {\r
             fieldValue = 16;\r
             writeOxmFieldAndLength(out, fieldValue, Short.SIZE / Byte.SIZE);\r
             out.writeShort(entry.getAugmentation(PortMatchEntry.class).getPort().getValue().intValue());\r
-        } else if (field.equals(SctpSrc.class)) {\r
+        } else if (field.isAssignableFrom(SctpSrc.class)) {\r
             fieldValue = 17;\r
             writeOxmFieldAndLength(out, fieldValue, Short.SIZE / Byte.SIZE);\r
             out.writeShort(entry.getAugmentation(PortMatchEntry.class).getPort().getValue().intValue());\r
-        } else if (field.equals(SctpDst.class)) {\r
+        } else if (field.isAssignableFrom(SctpDst.class)) {\r
             fieldValue = 18;\r
             writeOxmFieldAndLength(out, fieldValue, Short.SIZE / Byte.SIZE);\r
             out.writeShort(entry.getAugmentation(PortMatchEntry.class).getPort().getValue().intValue());\r
-        } else if (field.equals(Icmpv4Type.class)) {\r
+        } else if (field.isAssignableFrom(Icmpv4Type.class)) {\r
             fieldValue = 19;\r
             writeOxmFieldAndLength(out, fieldValue, Byte.SIZE / Byte.SIZE);\r
             out.writeByte(entry.getAugmentation(Icmpv4TypeMatchEntry.class).getIcmpv4Type());\r
-        } else if (field.equals(Icmpv4Code.class)) {\r
+        } else if (field.isAssignableFrom(Icmpv4Code.class)) {\r
             fieldValue = 20;\r
             writeOxmFieldAndLength(out, fieldValue, Byte.SIZE / Byte.SIZE);\r
             out.writeByte(entry.getAugmentation(Icmpv4CodeMatchEntry.class).getIcmpv4Code());\r
-        } else if (field.equals(ArpOp.class)) {\r
+        } else if (field.isAssignableFrom(ArpOp.class)) {\r
             fieldValue = 21;\r
             writeOxmFieldAndLength(out, fieldValue, Short.SIZE / Byte.SIZE);\r
             out.writeShort(entry.getAugmentation(OpCodeMatchEntry.class).getOpCode());\r
-        } else if (field.equals(ArpSpa.class)) {\r
+        } else if (field.isAssignableFrom(ArpSpa.class)) {\r
             fieldValue = 22;\r
             writeIpv4AddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(ArpTpa.class)) {\r
+        } else if (field.isAssignableFrom(ArpTpa.class)) {\r
             fieldValue = 23;\r
             writeIpv4AddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(ArpSha.class)) {\r
+        } else if (field.isAssignableFrom(ArpSha.class)) {\r
             fieldValue = 24;\r
             writeMacAddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(ArpTha.class)) {\r
+        } else if (field.isAssignableFrom(ArpTha.class)) {\r
             fieldValue = 25;\r
             writeMacAddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(Ipv6Src.class)) {\r
+        } else if (field.isAssignableFrom(Ipv6Src.class)) {\r
             fieldValue = 26;\r
             writeIpv6AddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(Ipv6Dst.class)) {\r
+        } else if (field.isAssignableFrom(Ipv6Dst.class)) {\r
             fieldValue = 27;\r
             writeIpv6AddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(Ipv6Flabel.class)) {\r
+        } else if (field.isAssignableFrom(Ipv6Flabel.class)) {\r
             fieldValue = 28;\r
             fieldValue = fieldValue << 1;\r
             if (entry.isHasMask()) {\r
@@ -294,37 +294,37 @@ public class MatchSerializer {
                 LOGGER.warn("Ipv6Flabel match entry: possible wrong length written (wrote 4 - maybe must be 3)");\r
                 out.writeInt(entry.getAugmentation(Ipv6FlabelMatchEntry.class).getIpv6Flabel().getValue().intValue());\r
             }\r
-        } else if (field.equals(Icmpv6Type.class)) {\r
+        } else if (field.isAssignableFrom(Icmpv6Type.class)) {\r
             fieldValue = 29;\r
             writeOxmFieldAndLength(out, fieldValue, Byte.SIZE / Byte.SIZE);\r
             out.writeByte(entry.getAugmentation(Icmpv6TypeMatchEntry.class).getIcmpv6Type());\r
-        } else if (field.equals(Icmpv6Code.class)) {\r
+        } else if (field.isAssignableFrom(Icmpv6Code.class)) {\r
             fieldValue = 30;\r
             writeOxmFieldAndLength(out, fieldValue, Byte.SIZE / Byte.SIZE);\r
             out.writeByte(entry.getAugmentation(Icmpv6CodeMatchEntry.class).getIcmpv6Code());\r
-        } else if (field.equals(Ipv6NdTarget.class)) {\r
+        } else if (field.isAssignableFrom(Ipv6NdTarget.class)) {\r
             fieldValue = 31;\r
             writeIpv6AddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(Ipv6NdSll.class)) {\r
+        } else if (field.isAssignableFrom(Ipv6NdSll.class)) {\r
             fieldValue = 32;\r
             writeMacAddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(Ipv6NdTll.class)) {\r
+        } else if (field.isAssignableFrom(Ipv6NdTll.class)) {\r
             fieldValue = 33;\r
             writeMacAddressRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(MplsLabel.class)) {\r
+        } else if (field.isAssignableFrom(MplsLabel.class)) {\r
             fieldValue = 34;\r
             writeOxmFieldAndLength(out, fieldValue, Integer.SIZE / Byte.SIZE);\r
             LOGGER.warn("MplsLabel match entry: possible wrong length written (wrote 4 - maybe must be 3)");\r
             out.writeInt(entry.getAugmentation(MplsLabelMatchEntry.class).getMplsLabel().intValue());\r
-        } else if (field.equals(MplsTc.class)) {\r
+        } else if (field.isAssignableFrom(MplsTc.class)) {\r
             fieldValue = 35;\r
             writeOxmFieldAndLength(out, fieldValue, Byte.SIZE / Byte.SIZE);\r
             out.writeByte(entry.getAugmentation(TcMatchEntry.class).getTc());\r
-        } else if (field.equals(MplsBos.class)) {\r
+        } else if (field.isAssignableFrom(MplsBos.class)) {\r
             fieldValue = 36;\r
             writeOxmFieldAndLength(out, fieldValue, Byte.SIZE / Byte.SIZE);\r
             out.writeBoolean(entry.getAugmentation(BosMatchEntry.class).isBos().booleanValue());\r
-        } else if (field.equals(PbbIsid.class)) {\r
+        } else if (field.isAssignableFrom(PbbIsid.class)) {\r
             fieldValue = 37;\r
             fieldValue = fieldValue << 1;\r
             if (entry.isHasMask()) {\r
@@ -341,10 +341,10 @@ public class MatchSerializer {
                 LOGGER.warn("PbbIsid match entry: possible wrong length written (wrote 4 - maybe must be 3)");\r
                 out.writeInt(entry.getAugmentation(IsidMatchEntry.class).getIsid().intValue());\r
             }\r
-        } else if (field.equals(TunnelId.class)) {\r
+        } else if (field.isAssignableFrom(TunnelId.class)) {\r
             fieldValue = 38;\r
             writeMetadataRelatedEntry(entry, out, fieldValue);\r
-        } else if (field.equals(Ipv6Exthdr.class)) {\r
+        } else if (field.isAssignableFrom(Ipv6Exthdr.class)) {\r
             fieldValue = 39;\r
             fieldValue = fieldValue << 1;\r
             PseudoField pseudoField = entry.getAugmentation(PseudoFieldMatchEntry.class).getPseudoField();\r
@@ -429,7 +429,7 @@ public class MatchSerializer {
     }\r
     \r
     private static void writeIpv4Address(MatchEntries entry, ByteBuf out) {\r
-        String[] addressGroups = entry.getAugmentation(Ipv4AddressMatchEntry.class).getIpv4Address().getValue().split(".");\r
+        String[] addressGroups = entry.getAugmentation(Ipv4AddressMatchEntry.class).getIpv4Address().getValue().split("\\.");\r
         for (int i = 0; i < addressGroups.length; i++) {\r
             out.writeByte(Integer.parseInt(addressGroups[i]));\r
         }\r
@@ -503,7 +503,7 @@ public class MatchSerializer {
      * @param match\r
      * @return length of ofp_match (excluding padding)\r
      */\r
-    public static int computeMatchLength(Match match) {\r
+    public static int computeMatchLengthInternal(Match match) {\r
         final byte MATCH_TYPE_AND_LENGTH_SIZE = 4;\r
         int length = 0;\r
         if (match != null) {\r
@@ -511,6 +511,20 @@ public class MatchSerializer {
         }\r
         return length;\r
     }\r
+    \r
+    /**\r
+     * Computes length of match (in bytes)\r
+     * @param match\r
+     * @return length of ofp_match (excluding padding)\r
+     */\r
+    public static int computeMatchLength(Match match) {\r
+        int length = computeMatchLengthInternal(match);\r
+        int paddingRemainder = length % EncodeConstants.PADDING;\r
+        if (paddingRemainder != 0) {\r
+            length += EncodeConstants.PADDING - paddingRemainder;\r
+        }\r
+        return length;\r
+    }\r
 \r
     /**\r
      * Computes length of MatchEntries (in bytes)\r
@@ -524,85 +538,85 @@ public class MatchSerializer {
             for (MatchEntries entry : matchEntries) {\r
                 length += MATCH_ENTRY_HEADER_LENGTH;\r
                 Class<? extends MatchField> field = entry.getOxmMatchField();\r
-                if (field.equals(InPort.class)) {\r
+                if (field.isAssignableFrom(InPort.class)) {\r
                     length += Integer.SIZE / Byte.SIZE;\r
-                } else if (field.equals(InPhyPort.class)) {\r
+                } else if (field.isAssignableFrom(InPhyPort.class)) {\r
                     length += Integer.SIZE / Byte.SIZE;\r
-                } else if (field.equals(Metadata.class)) {\r
+                } else if (field.isAssignableFrom(Metadata.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Long.SIZE / Byte.SIZE);\r
-                } else if (field.equals(EthDst.class)) {\r
+                } else if (field.isAssignableFrom(EthDst.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Long.SIZE / Byte.SIZE);\r
-                } else if (field.equals(EthSrc.class)) {\r
+                } else if (field.isAssignableFrom(EthSrc.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Long.SIZE / Byte.SIZE);\r
-                } else if (field.equals(EthType.class)) {\r
+                } else if (field.isAssignableFrom(EthType.class)) {\r
                     length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(VlanVid.class)) {\r
+                } else if (field.isAssignableFrom(VlanVid.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Short.SIZE / Byte.SIZE);\r
-                } else if (field.equals(VlanPcp.class)) {\r
+                } else if (field.isAssignableFrom(VlanPcp.class)) {\r
                     length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(IpDscp.class)) {\r
+                } else if (field.isAssignableFrom(IpDscp.class)) {\r
                     length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(IpEcn.class)) {\r
+                } else if (field.isAssignableFrom(IpEcn.class)) {\r
                     length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(IpProto.class)) {\r
+                } else if (field.isAssignableFrom(IpProto.class)) {\r
                     length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(Ipv4Src.class)) {\r
+                } else if (field.isAssignableFrom(Ipv4Src.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Integer.SIZE / Byte.SIZE);\r
-                } else if (field.equals(Ipv4Dst.class)) {\r
+                } else if (field.isAssignableFrom(Ipv4Dst.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Integer.SIZE / Byte.SIZE);\r
-                } else if (field.equals(TcpSrc.class)) {\r
+                } else if (field.isAssignableFrom(TcpSrc.class)) {\r
                     length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(TcpDst.class)) {\r
+                } else if (field.isAssignableFrom(TcpDst.class)) {\r
                     length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(UdpSrc.class)) {\r
+                } else if (field.isAssignableFrom(UdpSrc.class)) {\r
                     length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(UdpDst.class)) {\r
+                } else if (field.isAssignableFrom(UdpDst.class)) {\r
                     length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(SctpSrc.class)) {\r
+                } else if (field.isAssignableFrom(SctpSrc.class)) {\r
                     length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(SctpDst.class)) {\r
+                } else if (field.isAssignableFrom(SctpDst.class)) {\r
                     length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(Icmpv4Type.class)) {\r
+                } else if (field.isAssignableFrom(Icmpv4Type.class)) {\r
                     length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(Icmpv4Code.class)) {\r
+                } else if (field.isAssignableFrom(Icmpv4Code.class)) {\r
                     length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(ArpOp.class)) {\r
+                } else if (field.isAssignableFrom(ArpOp.class)) {\r
                     length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(ArpSpa.class)) {\r
+                } else if (field.isAssignableFrom(ArpSpa.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Integer.SIZE / Byte.SIZE);\r
-                } else if (field.equals(ArpTpa.class)) {\r
+                } else if (field.isAssignableFrom(ArpTpa.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Integer.SIZE / Byte.SIZE);\r
-                } else if (field.equals(ArpSha.class)) {\r
+                } else if (field.isAssignableFrom(ArpSha.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Long.SIZE / Byte.SIZE);\r
-                } else if (field.equals(ArpTha.class)) {\r
+                } else if (field.isAssignableFrom(ArpTha.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Long.SIZE / Byte.SIZE);\r
-                } else if (field.equals(Ipv6Src.class)) {\r
+                } else if (field.isAssignableFrom(Ipv6Src.class)) {\r
                     length += computePossibleMaskEntryLength(entry, 8 * (Short.SIZE / Byte.SIZE));\r
-                } else if (field.equals(Ipv6Dst.class)) {\r
+                } else if (field.isAssignableFrom(Ipv6Dst.class)) {\r
                     length += computePossibleMaskEntryLength(entry, 8 * (Short.SIZE / Byte.SIZE));\r
-                } else if (field.equals(Ipv6Flabel.class)) {\r
+                } else if (field.isAssignableFrom(Ipv6Flabel.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Integer.SIZE / Byte.SIZE);\r
-                } else if (field.equals(Icmpv6Type.class)) {\r
+                } else if (field.isAssignableFrom(Icmpv6Type.class)) {\r
                     length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(Icmpv6Code.class)) {\r
+                } else if (field.isAssignableFrom(Icmpv6Code.class)) {\r
                     length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(Ipv6NdTarget.class)) {\r
+                } else if (field.isAssignableFrom(Ipv6NdTarget.class)) {\r
                     length += computePossibleMaskEntryLength(entry, 8 * (Short.SIZE / Byte.SIZE));\r
-                } else if (field.equals(Ipv6NdSll.class)) {\r
+                } else if (field.isAssignableFrom(Ipv6NdSll.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Long.SIZE / Byte.SIZE);\r
-                } else if (field.equals(Ipv6NdTll.class)) {\r
+                } else if (field.isAssignableFrom(Ipv6NdTll.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Long.SIZE / Byte.SIZE);\r
-                } else if (field.equals(MplsLabel.class)) {\r
+                } else if (field.isAssignableFrom(MplsLabel.class)) {\r
                     length += Integer.SIZE / Byte.SIZE;\r
-                } else if (field.equals(MplsTc.class)) {\r
+                } else if (field.isAssignableFrom(MplsTc.class)) {\r
                     length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(MplsBos.class)) {\r
+                } else if (field.isAssignableFrom(MplsBos.class)) {\r
                     length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(PbbIsid.class)) {\r
+                } else if (field.isAssignableFrom(PbbIsid.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Integer.SIZE / Byte.SIZE);\r
-                } else if (field.equals(TunnelId.class)) {\r
+                } else if (field.isAssignableFrom(TunnelId.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Long.SIZE / Byte.SIZE);\r
-                } else if (field.equals(Ipv6Exthdr.class)) {\r
+                } else if (field.isAssignableFrom(Ipv6Exthdr.class)) {\r
                     length += computePossibleMaskEntryLength(entry, Short.SIZE / Byte.SIZE);\r
                 }\r
             }\r
diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/util/MatchSerializerTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/util/MatchSerializerTest.java
new file mode 100644 (file)
index 0000000..175f468
--- /dev/null
@@ -0,0 +1,62 @@
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.util;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+import io.netty.buffer.UnpooledByteBufAllocator;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmMatchType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntriesBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.MatchBuilder;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class MatchSerializerTest {\r
+\r
+    /**\r
+     * Test for correct serialization of Ipv4Address match entry\r
+     */\r
+    @Test\r
+    public void test() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        List<MatchEntries> entries = new ArrayList<>();\r
+        MatchEntriesBuilder entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Src.class);\r
+        entriesBuilder.setHasMask(false);\r
+        Ipv4AddressMatchEntryBuilder addressBuilder = new Ipv4AddressMatchEntryBuilder();\r
+        addressBuilder.setIpv4Address(new Ipv4Address("1.2.3.4"));\r
+        entriesBuilder.addAugmentation(Ipv4AddressMatchEntry.class, addressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        builder.setMatchEntries(entries);\r
+        Match match = builder.build();\r
+        \r
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
+        MatchSerializer.encodeMatch(match, out);\r
+        \r
+        Assert.assertEquals("Wrong type", 1, out.readUnsignedShort());\r
+        out.skipBytes(Short.SIZE / Byte.SIZE);\r
+        Assert.assertEquals("Wrong class", 0x8000, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong field and mask", 22, out.readUnsignedByte());\r
+        out.skipBytes(Byte.SIZE / Byte.SIZE);\r
+        Assert.assertEquals("Wrong ip address (first number)", 1, out.readUnsignedByte());\r
+        Assert.assertEquals("Wrong ip address (second number)", 2, out.readUnsignedByte());\r
+        Assert.assertEquals("Wrong ip address (third number)", 3, out.readUnsignedByte());\r
+        Assert.assertEquals("Wrong ip address (fourth number)", 4, out.readUnsignedByte());\r
+    }\r
+\r
+}\r