Merge "Quickfix - Vlan-vid match entry"
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / util / MatchSerializer.java
index ce40c52f5949e0b04320e90c5940ba49f6ae52ad..bde832c0206aae3ab089da9dd8e00c51cbd5e56e 100644 (file)
@@ -8,7 +8,6 @@ import java.util.HashMap;
 import java.util.List;\r
 import java.util.Map;\r
 \r
-import org.opendaylight.openflowjava.protocol.impl.serialization.factories.EncodeConstants;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntry;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntry;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntry;\r
@@ -83,20 +82,28 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpS
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;\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.protocol.rev130731.flow.mod.Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.Match;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
 /**\r
+ * Serializes ofp_match (OpenFlow v1.3) and its oxm_fields structures\r
  * @author michal.polkorab\r
- *\r
+ * @author timotej.kubas\r
  */\r
 public class MatchSerializer {\r
-    \r
     private static final Logger LOGGER = LoggerFactory.getLogger(MatchSerializer.class);\r
+    private static final byte STANDARD_MATCH_TYPE_CODE = 0;\r
+    private static final byte OXM_MATCH_TYPE_CODE = 1;\r
+    private static final int NXM0_CLASS_CODE = 0x0000;\r
+    private static final int NXM1_CLASS_CODE = 0x0001;\r
+    private static final int OPENFLOW_BASIC_CLASS_CODE = 0x8000;\r
+    private static final int EXPERIMENTER_CLASS_CODE = 0xFFFF;\r
+    private static final byte MATCH_TYPE_AND_LENGTH_SIZE = 4;\r
+    private static final byte MATCH_ENTRY_HEADER_LENGTH = 4;\r
 \r
     /**\r
-     * Encodes OF match\r
+     * Encodes match (OpenFlow v1.3)\r
      * @param match ofp_match object\r
      * @param out output ByteBuf\r
      */\r
@@ -107,7 +114,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
@@ -117,234 +124,229 @@ public class MatchSerializer {
     }\r
 \r
     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
 \r
     /**\r
      * Encodes MatchEntries\r
-     * @param matchEntries\r
-     * @param out\r
+     * @param matchEntries list of match entries (oxm_fields)\r
+     * @param out output ByteBuf\r
      */\r
     public static void encodeMatchEntries(List<MatchEntries> matchEntries, ByteBuf out) {\r
         if (matchEntries == null) {\r
-            LOGGER.warn("Match entry is null");\r
+            LOGGER.warn("Match entries are null");\r
             return;\r
         }\r
         for (MatchEntries entry : matchEntries) {\r
             encodeClass(entry.getOxmClass(), out);\r
-            encodeRest(entry, null);\r
+            encodeRest(entry, out);\r
         }\r
     }\r
 \r
     private static void encodeClass(Class<? extends Clazz> clazz, ByteBuf out) {\r
-        final int NXM0_CLASS_CODE = 0x0000;\r
-        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
-    \r
+\r
     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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_INT_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_INT_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\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
-            int vlanVidValue = vlanVid.getVlanVid() << 1;\r
+            int vlanVidValue = vlanVid.getVlanVid();\r
             if (vlanVid.isCfiBit()) {\r
-                vlanVidValue = vlanVidValue | 1;\r
+                short cfi = 1 << 12; // 13-th bit\r
+                vlanVidValue = vlanVidValue | cfi;\r
             }\r
             if (entry.isHasMask()) {\r
                 fieldValue = fieldValue | 1;\r
                 out.writeByte(fieldValue);\r
                 byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-                out.writeByte(Short.SIZE / Byte.SIZE + mask.length);\r
+                out.writeByte(EncodeConstants.SIZE_OF_SHORT_IN_BYTES + mask.length);\r
                 out.writeShort(vlanVidValue);\r
                 out.writeBytes(mask);\r
             } else {\r
-                writeOxmFieldAndLength(out, fieldValue, Short.SIZE / Byte.SIZE);\r
+                writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\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
                 fieldValue = fieldValue | 1;\r
                 out.writeByte(fieldValue);\r
                 byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-                out.writeByte(Integer.SIZE / Byte.SIZE + mask.length); // 20 b + mask [OF 1.3.2 spec]\r
+                out.writeByte(EncodeConstants.SIZE_OF_INT_IN_BYTES + mask.length); // 20 b + mask [OF 1.3.2 spec]\r
                 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
                 out.writeBytes(entry.getAugmentation(MaskMatchEntry.class).getMask());\r
             } else {\r
                 out.writeByte(fieldValue);\r
-                out.writeByte(Integer.SIZE / Byte.SIZE); // 20 b [OF 1.3.2 spec]\r
+                out.writeByte(EncodeConstants.SIZE_OF_INT_IN_BYTES); // 20 b [OF 1.3.2 spec]\r
                 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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_INT_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\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
+            writeOxmFieldAndLength(out, fieldValue, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\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
                 fieldValue = fieldValue | 1;\r
                 out.writeByte(fieldValue);\r
                 byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-                out.writeByte(Long.SIZE / Byte.SIZE + mask.length);\r
+                out.writeByte(EncodeConstants.SIZE_OF_LONG_IN_BYTES + mask.length);\r
                 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
                 out.writeBytes(mask);\r
             } else {\r
                 out.writeByte(fieldValue);\r
-                out.writeByte(Long.SIZE / Byte.SIZE);\r
+                out.writeByte(EncodeConstants.SIZE_OF_LONG_IN_BYTES);\r
                 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
@@ -363,73 +365,75 @@ public class MatchSerializer {
                 fieldValue = fieldValue | 1;\r
                 out.writeByte(fieldValue);\r
                 byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-                out.writeByte(Short.SIZE / Byte.SIZE + mask.length);\r
+                out.writeByte(EncodeConstants.SIZE_OF_SHORT_IN_BYTES + mask.length);\r
                 out.writeShort(bitmap);\r
                 out.writeBytes(mask);\r
             } else {\r
                 out.writeByte(fieldValue);\r
-                out.writeByte(Short.SIZE / Byte.SIZE);\r
+                out.writeByte(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\r
                 out.writeShort(bitmap);\r
             }\r
         }\r
     }\r
-    \r
+\r
     private static void writeOxmFieldAndLength(ByteBuf out, int fieldValue, int length) {\r
         int fieldAndMask = fieldValue << 1;\r
         out.writeByte(fieldAndMask);\r
         out.writeByte(length);\r
     }\r
-    \r
+\r
     private static void writeMetadataRelatedEntry(MatchEntries entry, ByteBuf out, int value) {\r
         int fieldValue = value << 1;\r
         if (entry.isHasMask()) {\r
             fieldValue = fieldValue | 1;\r
             out.writeByte(fieldValue);\r
             byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-            out.writeByte(Long.SIZE / Byte.SIZE + mask.length);\r
+            out.writeByte(EncodeConstants.SIZE_OF_LONG_IN_BYTES + mask.length);\r
             out.writeBytes(entry.getAugmentation(MetadataMatchEntry.class).getMetadata());\r
             out.writeBytes(mask);\r
         } else {\r
             out.writeByte(fieldValue);\r
-            out.writeByte(Long.SIZE / Byte.SIZE);\r
+            out.writeByte(EncodeConstants.SIZE_OF_LONG_IN_BYTES);\r
             out.writeBytes(entry.getAugmentation(MetadataMatchEntry.class).getMetadata());\r
         }\r
     }\r
-    \r
+\r
     private static void writeMacAddressRelatedEntry(MatchEntries entry, ByteBuf out, int value) {\r
         int fieldValue = value << 1;\r
         if (entry.isHasMask()) {\r
             fieldValue = fieldValue | 1;\r
             out.writeByte(fieldValue);\r
             byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-            out.writeByte((Integer.SIZE + Short.SIZE) / Byte.SIZE + mask.length); // 48 b + mask [OF 1.3.2 spec]\r
-            out.writeBytes(entry.getAugmentation(MacAddressMatchEntry.class).getMacAddress().getValue().getBytes());\r
+            out.writeByte(EncodeConstants.MAC_ADDRESS_LENGTH + mask.length); // 48 b + mask [OF 1.3.2 spec]\r
+            String macAddress = entry.getAugmentation(MacAddressMatchEntry.class).getMacAddress().getValue();\r
+            out.writeBytes(ByteBufUtils.macAddressToBytes(macAddress));\r
             out.writeBytes(mask);\r
         } else {\r
             out.writeByte(fieldValue);\r
-            out.writeByte((Integer.SIZE + Short.SIZE) / Byte.SIZE); // 48 b [OF 1.3.2 spec]\r
-            out.writeBytes(entry.getAugmentation(MacAddressMatchEntry.class).getMacAddress().getValue().getBytes());\r
+            out.writeByte(EncodeConstants.MAC_ADDRESS_LENGTH); // 48 b [OF 1.3.2 spec]\r
+            String macAddress = entry.getAugmentation(MacAddressMatchEntry.class).getMacAddress().getValue();\r
+            out.writeBytes(ByteBufUtils.macAddressToBytes(macAddress));\r
         }\r
     }\r
-    \r
+\r
     private static void writeIpv4AddressRelatedEntry(MatchEntries entry, ByteBuf out, int value) {\r
         int fieldValue = value << 1;\r
         if (entry.isHasMask()) {\r
             fieldValue = fieldValue | 1;\r
             out.writeByte(fieldValue);\r
             byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-            out.writeByte(Integer.SIZE / Byte.SIZE + mask.length);\r
+            out.writeByte(EncodeConstants.SIZE_OF_INT_IN_BYTES + mask.length);\r
             writeIpv4Address(entry, out);\r
             out.writeBytes(mask);\r
         } else {\r
             out.writeByte(fieldValue);\r
-            out.writeByte(Integer.SIZE / Byte.SIZE);\r
+            out.writeByte(EncodeConstants.SIZE_OF_INT_IN_BYTES);\r
             writeIpv4Address(entry, out);\r
         }\r
     }\r
-    \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
@@ -443,14 +447,14 @@ public class MatchSerializer {
             fieldValue = fieldValue | 1;\r
             out.writeByte(fieldValue);\r
             byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-            out.writeByte((8 * Short.SIZE) / Byte.SIZE + mask.length);\r
+            out.writeByte(EncodeConstants.SIZE_OF_IPV6_ADDRESS_IN_BYTES + mask.length);\r
             for (int i = 0; i < address.length; i++) {\r
                 out.writeShort(Integer.parseInt(addressGroups[i], 16));\r
             }\r
             out.writeBytes(mask);\r
         } else {\r
             out.writeByte(fieldValue);\r
-            out.writeByte((8 * Short.SIZE) / Byte.SIZE);\r
+            out.writeByte(EncodeConstants.SIZE_OF_IPV6_ADDRESS_IN_BYTES);\r
             for (int i = 0; i < addressGroups.length; i++) {\r
                 out.writeShort(Integer.parseInt(addressGroups[i], 16));\r
             }\r
@@ -458,20 +462,19 @@ public class MatchSerializer {
     }\r
 \r
     private static String[] parseIpv6Address(String[] addressGroups) {\r
-        final byte GROUPS_IN_IPV6_ADDRESS = 8;\r
         int countEmpty = 0;\r
         for (int i = 0; i < addressGroups.length; i++) {\r
             if (addressGroups[i].equals("")){\r
                 countEmpty++;\r
-            } \r
+            }\r
         }\r
-        String[] ready = new String[GROUPS_IN_IPV6_ADDRESS];\r
+        String[] ready = new String[EncodeConstants.GROUPS_IN_IPV6_ADDRESS];\r
         switch (countEmpty) {\r
         case 0:\r
             ready = addressGroups;\r
             break;\r
         case 1:\r
-            int zerosToBePushed = GROUPS_IN_IPV6_ADDRESS - addressGroups.length + 1;\r
+            int zerosToBePushed = EncodeConstants.GROUPS_IN_IPV6_ADDRESS - addressGroups.length + 1;\r
             int pushed = 0;\r
             for (int i = 0; i < addressGroups.length; i++) {\r
                 if (addressGroups[i].equals("")) {\r
@@ -499,12 +502,11 @@ public class MatchSerializer {
     }\r
 \r
     /**\r
-     * Computes length of ofp_match structure (in bytes)\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
-        final byte MATCH_TYPE_AND_LENGTH_SIZE = 4;\r
+    public static int computeMatchLengthInternal(Match match) {\r
         int length = 0;\r
         if (match != null) {\r
             length += MATCH_TYPE_AND_LENGTH_SIZE + computeMatchEntriesLength(match.getMatchEntries());\r
@@ -512,152 +514,123 @@ public class MatchSerializer {
         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
-     * @param matchEntries\r
+     * @param matchEntries list of match entries (oxm_fields)\r
      * @return length of MatchEntries\r
      */\r
     public static int computeMatchEntriesLength(List<MatchEntries> matchEntries) {\r
         int length = 0;\r
         if (matchEntries != null) {\r
             for (MatchEntries entry : matchEntries) {\r
+                length += MATCH_ENTRY_HEADER_LENGTH;\r
                 Class<? extends MatchField> field = entry.getOxmMatchField();\r
-                if (field.equals(InPort.class)) {\r
-                    length += Integer.SIZE / Byte.SIZE;\r
-                } else if (field.equals(InPhyPort.class)) {\r
-                    length += Integer.SIZE / Byte.SIZE;\r
-                } else if (field.equals(Metadata.class)) {\r
-                    computeMetadataRelatedEntryLength(entry);\r
-                } else if (field.equals(EthDst.class)) {\r
-                    computeMacAddressRelatedEntryLength(entry);\r
-                } else if (field.equals(EthSrc.class)) {\r
-                    computeMacAddressRelatedEntryLength(entry);\r
-                } else if (field.equals(EthType.class)) {\r
-                    length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(VlanVid.class)) {\r
-                    if (entry.isHasMask()) {\r
-                        byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-                        length += Short.SIZE / Byte.SIZE + mask.length;\r
-                    } else {\r
-                        length += Short.SIZE / Byte.SIZE;\r
-                    }\r
-                } else if (field.equals(VlanPcp.class)) {\r
-                    length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(IpDscp.class)) {\r
-                    length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(IpEcn.class)) {\r
-                    length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(IpProto.class)) {\r
-                    length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(Ipv4Src.class)) {\r
-                    computeIpv4AddressRelatedEntryLength(entry);\r
-                } else if (field.equals(Ipv4Dst.class)) {\r
-                    computeIpv4AddressRelatedEntryLength(entry);\r
-                } else if (field.equals(TcpSrc.class)) {\r
-                    length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(TcpDst.class)) {\r
-                    length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(UdpSrc.class)) {\r
-                    length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(UdpDst.class)) {\r
-                    length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(SctpSrc.class)) {\r
-                    length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(SctpDst.class)) {\r
-                    length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(Icmpv4Type.class)) {\r
-                    length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(Icmpv4Code.class)) {\r
-                    length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(ArpOp.class)) {\r
-                    length += Short.SIZE / Byte.SIZE;\r
-                } else if (field.equals(ArpSpa.class)) {\r
-                    computeIpv4AddressRelatedEntryLength(entry);\r
-                } else if (field.equals(ArpTpa.class)) {\r
-                    computeIpv4AddressRelatedEntryLength(entry);\r
-                } else if (field.equals(ArpSha.class)) {\r
-                    computeMacAddressRelatedEntryLength(entry);\r
-                } else if (field.equals(ArpTha.class)) {\r
-                    computeMacAddressRelatedEntryLength(entry);\r
-                } else if (field.equals(Ipv6Src.class)) {\r
-                    computeIpv6AddressRelatedEntryLength(entry);\r
-                } else if (field.equals(Ipv6Dst.class)) {\r
-                    computeIpv6AddressRelatedEntryLength(entry);\r
-                } else if (field.equals(Ipv6Flabel.class)) {\r
-                    if (entry.isHasMask()) {\r
-                        byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-                        length += Integer.SIZE / Byte.SIZE + mask.length; // 20 b + mask [OF 1.3.2 spec]\r
-                    } else {\r
-                        length += Integer.SIZE / Byte.SIZE;\r
-                    }\r
-                } else if (field.equals(Icmpv6Type.class)) {\r
-                    length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(Icmpv6Code.class)) {\r
-                    length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(Ipv6NdTarget.class)) {\r
-                    computeIpv6AddressRelatedEntryLength(entry);\r
-                } else if (field.equals(Ipv6NdSll.class)) {\r
-                    computeMacAddressRelatedEntryLength(entry);\r
-                } else if (field.equals(Ipv6NdTll.class)) {\r
-                    computeMacAddressRelatedEntryLength(entry);\r
-                } else if (field.equals(MplsLabel.class)) {\r
-                    length += Integer.SIZE / Byte.SIZE;\r
-                } else if (field.equals(MplsTc.class)) {\r
-                    length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(MplsBos.class)) {\r
-                    length += Byte.SIZE / Byte.SIZE;\r
-                } else if (field.equals(PbbIsid.class)) {\r
-                    if (entry.isHasMask()) {\r
-                        byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-                        length += Long.SIZE / Byte.SIZE + mask.length;\r
-                    } else {\r
-                        length += Long.SIZE / Byte.SIZE;\r
-                    }\r
-                } else if (field.equals(TunnelId.class)) {\r
-                    computeMetadataRelatedEntryLength(entry);\r
-                } else if (field.equals(Ipv6Exthdr.class)) {\r
-                    if (entry.isHasMask()) {\r
-                        byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-                        length += Short.SIZE / Byte.SIZE + mask.length;\r
-                    } else {\r
-                        length += Short.SIZE / Byte.SIZE;\r
-                    }\r
+                if (field.isAssignableFrom(InPort.class)) {\r
+                    length += EncodeConstants.SIZE_OF_INT_IN_BYTES;\r
+                } else if (field.isAssignableFrom(InPhyPort.class)) {\r
+                    length += EncodeConstants.SIZE_OF_INT_IN_BYTES;\r
+                } else if (field.isAssignableFrom(Metadata.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_LONG_IN_BYTES);\r
+                } else if (field.isAssignableFrom(EthDst.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.MAC_ADDRESS_LENGTH);\r
+                } else if (field.isAssignableFrom(EthSrc.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.MAC_ADDRESS_LENGTH);\r
+                } else if (field.isAssignableFrom(EthType.class)) {\r
+                    length += EncodeConstants.SIZE_OF_SHORT_IN_BYTES;\r
+                } else if (field.isAssignableFrom(VlanVid.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\r
+                } else if (field.isAssignableFrom(VlanPcp.class)) {\r
+                    length += EncodeConstants.SIZE_OF_BYTE_IN_BYTES;\r
+                } else if (field.isAssignableFrom(IpDscp.class)) {\r
+                    length += EncodeConstants.SIZE_OF_BYTE_IN_BYTES;\r
+                } else if (field.isAssignableFrom(IpEcn.class)) {\r
+                    length += EncodeConstants.SIZE_OF_BYTE_IN_BYTES;\r
+                } else if (field.isAssignableFrom(IpProto.class)) {\r
+                    length += EncodeConstants.SIZE_OF_BYTE_IN_BYTES;\r
+                } else if (field.isAssignableFrom(Ipv4Src.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_INT_IN_BYTES);\r
+                } else if (field.isAssignableFrom(Ipv4Dst.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_INT_IN_BYTES);\r
+                } else if (field.isAssignableFrom(TcpSrc.class)) {\r
+                    length += EncodeConstants.SIZE_OF_SHORT_IN_BYTES;\r
+                } else if (field.isAssignableFrom(TcpDst.class)) {\r
+                    length += EncodeConstants.SIZE_OF_SHORT_IN_BYTES;\r
+                } else if (field.isAssignableFrom(UdpSrc.class)) {\r
+                    length += EncodeConstants.SIZE_OF_SHORT_IN_BYTES;\r
+                } else if (field.isAssignableFrom(UdpDst.class)) {\r
+                    length += EncodeConstants.SIZE_OF_SHORT_IN_BYTES;\r
+                } else if (field.isAssignableFrom(SctpSrc.class)) {\r
+                    length += EncodeConstants.SIZE_OF_SHORT_IN_BYTES;\r
+                } else if (field.isAssignableFrom(SctpDst.class)) {\r
+                    length += EncodeConstants.SIZE_OF_SHORT_IN_BYTES;\r
+                } else if (field.isAssignableFrom(Icmpv4Type.class)) {\r
+                    length += EncodeConstants.SIZE_OF_BYTE_IN_BYTES;\r
+                } else if (field.isAssignableFrom(Icmpv4Code.class)) {\r
+                    length += EncodeConstants.SIZE_OF_BYTE_IN_BYTES;\r
+                } else if (field.isAssignableFrom(ArpOp.class)) {\r
+                    length += EncodeConstants.SIZE_OF_SHORT_IN_BYTES;\r
+                } else if (field.isAssignableFrom(ArpSpa.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_INT_IN_BYTES);\r
+                } else if (field.isAssignableFrom(ArpTpa.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_INT_IN_BYTES);\r
+                } else if (field.isAssignableFrom(ArpSha.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.MAC_ADDRESS_LENGTH);\r
+                } else if (field.isAssignableFrom(ArpTha.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.MAC_ADDRESS_LENGTH);\r
+                } else if (field.isAssignableFrom(Ipv6Src.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_IPV6_ADDRESS_IN_BYTES);\r
+                } else if (field.isAssignableFrom(Ipv6Dst.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_IPV6_ADDRESS_IN_BYTES);\r
+                } else if (field.isAssignableFrom(Ipv6Flabel.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_INT_IN_BYTES);\r
+                } else if (field.isAssignableFrom(Icmpv6Type.class)) {\r
+                    length += EncodeConstants.SIZE_OF_BYTE_IN_BYTES;\r
+                } else if (field.isAssignableFrom(Icmpv6Code.class)) {\r
+                    length += EncodeConstants.SIZE_OF_BYTE_IN_BYTES;\r
+                } else if (field.isAssignableFrom(Ipv6NdTarget.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_IPV6_ADDRESS_IN_BYTES);\r
+                } else if (field.isAssignableFrom(Ipv6NdSll.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.MAC_ADDRESS_LENGTH);\r
+                } else if (field.isAssignableFrom(Ipv6NdTll.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.MAC_ADDRESS_LENGTH);\r
+                } else if (field.isAssignableFrom(MplsLabel.class)) {\r
+                    length += EncodeConstants.SIZE_OF_INT_IN_BYTES;\r
+                } else if (field.isAssignableFrom(MplsTc.class)) {\r
+                    length += EncodeConstants.SIZE_OF_BYTE_IN_BYTES;\r
+                } else if (field.isAssignableFrom(MplsBos.class)) {\r
+                    length += EncodeConstants.SIZE_OF_BYTE_IN_BYTES;\r
+                } else if (field.isAssignableFrom(PbbIsid.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_INT_IN_BYTES);\r
+                } else if (field.isAssignableFrom(TunnelId.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_LONG_IN_BYTES);\r
+                } else if (field.isAssignableFrom(Ipv6Exthdr.class)) {\r
+                    length += computePossibleMaskEntryLength(entry, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\r
                 }\r
             }\r
         }\r
         return length;\r
     }\r
-    \r
-    private static int computeMetadataRelatedEntryLength(MatchEntries entry) {\r
-        if (entry.isHasMask()) {\r
-            byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-            return Long.SIZE / Byte.SIZE + mask.length;\r
-        }\r
-        return Long.SIZE / Byte.SIZE;\r
-    }\r
-    \r
-    private static int computeMacAddressRelatedEntryLength(MatchEntries entry) {\r
-        if (entry.isHasMask()) {\r
-            byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-            return (Integer.SIZE + Short.SIZE) / Byte.SIZE + mask.length; // 48 b + mask [OF 1.3.2 spec]\r
-        }\r
-        return (Integer.SIZE + Short.SIZE) / Byte.SIZE; // 48 b [OF 1.3.2 spec]\r
-    }\r
-    \r
-    private static int computeIpv4AddressRelatedEntryLength(MatchEntries entry) {\r
-        if (entry.isHasMask()) {\r
-            byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-            return Integer.SIZE / Byte.SIZE + mask.length;\r
-        }\r
-        return Integer.SIZE / Byte.SIZE;\r
-    }\r
-    \r
-    private static int computeIpv6AddressRelatedEntryLength(MatchEntries entry) {\r
+\r
+    private static int computePossibleMaskEntryLength(MatchEntries entry, int length) {\r
+        int entryLength = length;\r
         if (entry.isHasMask()) {\r
-            byte[] mask = entry.getAugmentation(MaskMatchEntry.class).getMask();\r
-            return (8 * Short.SIZE) / Byte.SIZE + mask.length;\r
+            entryLength *= 2;\r
         }\r
-        return (8 * Short.SIZE) / Byte.SIZE;\r
+        return entryLength;\r
     }\r
 \r
 }\r