Bump mdsal to 5.0.2
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / match / MatchConvertor.java
index 48ed63281e23ba473707ab75e66ff27723936fb4..6901fe2583376bbb80cc78a578d3457af735af3b 100644 (file)
@@ -5,10 +5,8 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
 
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -51,6 +49,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.PacketTypeMatch;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFields;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatch;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
@@ -82,6 +81,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Mpls
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PacketType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;
@@ -102,6 +102,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.matc
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PacketTypeCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCaseBuilder;
@@ -119,15 +120,19 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.matc
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.bos._case.MplsBosBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.label._case.MplsLabelBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.tc._case.MplsTcBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.packet.type._case.PacketTypeBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.pbb.isid._case.PbbIsidBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tunnel.id._case.TunnelIdBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.vid._case.VlanVidBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionListGrouping;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList;
+import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint8;
 
 /**
- * Utility class for converting a MD-SAL Flow into the OF flow mod
+ * Utility class for converting a MD-SAL Flow into the OF flow mod.
  */
 public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionConvertorData> {
     private static final List<Class<?>> TYPES = Arrays.asList(
@@ -136,10 +141,12 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
             org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.mod.removed.Match.class,
             org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.Match.class,
             org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.in.message.Match.class,
-            org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Match.class,
+            org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature
+                .prop.type.Match.class,
             SetField.class);
 
-    private static final ConvertorProcessor<Layer3Match, List<MatchEntry>, VersionConvertorData> LAYER3_PROCESSOR = new ConvertorProcessor<Layer3Match, List<MatchEntry>, VersionConvertorData>()
+    private static final ConvertorProcessor<Layer3Match, List<MatchEntry>, VersionConvertorData> LAYER3_PROCESSOR =
+        new ConvertorProcessor<Layer3Match, List<MatchEntry>, VersionConvertorData>()
             .addCase(new SalToOfIpv4MatchArbitraryBitMaskCase())
             .addCase(new SalToOfIpv4MatchCase())
             .addCase(new SalToOfTunnelIpv4MatchCase())
@@ -147,7 +154,8 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
             .addCase(new SalToOfIpv6MatchArbitraryBitMaskCase())
             .addCase(new SalToOfIpv6MatchCase());
 
-    private static final ConvertorProcessor<Layer4Match, List<MatchEntry>, VersionConvertorData> LAYER4_PROCESSOR = new ConvertorProcessor<Layer4Match, List<MatchEntry>, VersionConvertorData>()
+    private static final ConvertorProcessor<Layer4Match, List<MatchEntry>, VersionConvertorData> LAYER4_PROCESSOR =
+        new ConvertorProcessor<Layer4Match, List<MatchEntry>, VersionConvertorData>()
             .addCase(new SalToOfTcpMatchCase())
             .addCase(new SalToOfUdpMatchCase())
             .addCase(new SalToOfSctpMatchCase());
@@ -155,7 +163,7 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
     private static final byte[] VLAN_VID_MASK = new byte[]{16, 0};
 
     private static void layer3Match(final List<MatchEntry> matchEntryList, final Layer3Match layer3Match,
-                                    ConvertorExecutor converterExecutor,
+                                    final ConvertorExecutor converterExecutor,
                                     final ExtensionConverterProvider extensionConvertorProvider) {
         java.util.Optional<List<MatchEntry>> result = LAYER3_PROCESSOR.process(layer3Match, converterExecutor
         );
@@ -166,7 +174,7 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
     }
 
     private static void layer4Match(final List<MatchEntry> matchEntryList, final Layer4Match layer4Match,
-                                    ConvertorExecutor converterExecutor, final ExtensionConverterProvider extensionConvertorProvider) {
+            final ConvertorExecutor converterExecutor, final ExtensionConverterProvider extensionConvertorProvider) {
         java.util.Optional<List<MatchEntry>> result = LAYER4_PROCESSOR.process(layer4Match, converterExecutor
         );
 
@@ -175,13 +183,13 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
         }
     }
 
-    private static void inPortMatch(final List<MatchEntry> matchEntryList, NodeConnectorId inPort) {
+    private static void inPortMatch(final List<MatchEntry> matchEntryList, final NodeConnectorId inPort) {
         if (inPort == null) {
             return;
         }
 
         //TODO: currently this matchconverter is mapped to OF1.3 in MatchInjector. Will need to revisit during 1.4+
-        final long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPort);
+        final Uint32 portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPort);
         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
         matchEntryBuilder.setHasMask(false);
@@ -194,13 +202,14 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
         matchEntryList.add(matchEntryBuilder.build());
     }
 
-    private static void inPhyPortMatch(final List<MatchEntry> matchEntryList, NodeConnectorId inPhyPort) {
+    private static void inPhyPortMatch(final List<MatchEntry> matchEntryList, final NodeConnectorId inPhyPort) {
         if (inPhyPort == null) {
             return;
         }
 
         //TODO: currently this matchconverter is mapped to OF1.3 in MatchInjector. Will need to revisit during 1.4+
-        final long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPhyPort);
+        final Uint32 portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13,
+            inPhyPort);
         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
         matchEntryBuilder.setHasMask(false);
@@ -214,21 +223,23 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
     }
 
     private static void metadataMatch(final List<MatchEntry> matchEntryList,
-                                      final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata metadata) {
+            final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata metadata) {
         if (metadata == null) {
             return;
         }
 
         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        boolean hasmask = metadata.getMetadataMask() != null;
+        final boolean hasmask = metadata.getMetadataMask() != null;
         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
         matchEntryBuilder.setOxmMatchField(Metadata.class);
         MetadataCaseBuilder metadataCaseBuilder = new MetadataCaseBuilder();
-        org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder metadataBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder();
-        metadataBuilder.setMetadata(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadata(), OFConstants.SIZE_OF_LONG_IN_BYTES));
+        org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry
+            .value.metadata._case.MetadataBuilder metadataBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight
+                .openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder();
+        metadataBuilder.setMetadata(ByteUtil.uint64toBytes(metadata.getMetadata()));
 
         if (hasmask) {
-            metadataBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadataMask(), OFConstants.SIZE_OF_LONG_IN_BYTES));
+            metadataBuilder.setMask(ByteUtil.uint64toBytes(metadata.getMetadataMask()));
         }
 
         metadataCaseBuilder.setMetadata(metadataBuilder.build());
@@ -237,23 +248,41 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
         matchEntryList.add(matchEntryBuilder.build());
     }
 
+    private static void packetTypeMatch(final List<MatchEntry> matchEntryList, final PacketTypeMatch packetTypeMatch) {
+        if (packetTypeMatch == null) {
+            return;
+        }
+
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+        matchEntryBuilder.setOxmMatchField(PacketType.class);
+        matchEntryBuilder.setHasMask(false);
+        PacketTypeCaseBuilder packetTypeCaseBuilder = new PacketTypeCaseBuilder();
+        PacketTypeBuilder packetTypeBuilder = new PacketTypeBuilder();
+        packetTypeBuilder.setPacketType(packetTypeMatch.getPacketType());
+        packetTypeCaseBuilder.setPacketType(packetTypeBuilder.build());
+        matchEntryBuilder.setMatchEntryValue(packetTypeCaseBuilder.build());
+        matchEntryList.add(matchEntryBuilder.build());
+    }
+
     private static void tunnelMatch(final List<MatchEntry> matchEntryList,
-                                    final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Tunnel tunnel) {
+            final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Tunnel tunnel) {
         if (tunnel == null) {
             return;
         }
 
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
         TunnelIdCaseBuilder tunnelIdCaseBuilder = new TunnelIdCaseBuilder();
         TunnelIdBuilder tunnelIdBuilder = new TunnelIdBuilder();
         boolean hasMask = tunnel.getTunnelMask() != null;
 
         if (hasMask) {
-            tunnelIdBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelMask(), OFConstants.SIZE_OF_LONG_IN_BYTES));
+            tunnelIdBuilder.setMask(ByteUtil.uint64toBytes(tunnel.getTunnelMask()));
         }
 
-        tunnelIdBuilder.setTunnelId(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelId(), OFConstants.SIZE_OF_LONG_IN_BYTES));
+        tunnelIdBuilder.setTunnelId(ByteUtil.uint64toBytes(tunnel.getTunnelId()));
         tunnelIdCaseBuilder.setTunnelId(tunnelIdBuilder.build());
+
+        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
         matchEntryBuilder.setMatchEntryValue(tunnelIdCaseBuilder.build());
         matchEntryBuilder.setHasMask(hasMask);
         matchEntryBuilder.setOxmMatchField(TunnelId.class);
@@ -340,10 +369,9 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
             MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
             matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
             matchEntryBuilder.setOxmMatchField(VlanVid.class);
-            VlanVidCaseBuilder vlanVidCaseBuilder = new VlanVidCaseBuilder();
             VlanVidBuilder vlanVidBuilder = new VlanVidBuilder();
             boolean setCfiBit = false;
-            Integer vidEntryValue = 0;
+            Uint16 vidEntryValue = Uint16.ZERO;
             boolean hasmask = false;
 
             if (Boolean.TRUE.equals(vlanId.isVlanIdPresent())) {
@@ -352,7 +380,7 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
                     vidEntryValue = vlanId.getVlanId().getValue();
                 }
 
-                hasmask = vidEntryValue == 0;
+                hasmask = vidEntryValue.toJava() == 0;
                 if (hasmask) {
                     vlanVidBuilder.setMask(VLAN_VID_MASK);
                 }
@@ -360,6 +388,7 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
 
             vlanVidBuilder.setCfiBit(setCfiBit);
             vlanVidBuilder.setVlanVid(vidEntryValue);
+            VlanVidCaseBuilder vlanVidCaseBuilder = new VlanVidCaseBuilder();
             vlanVidCaseBuilder.setVlanVid(vlanVidBuilder.build());
             matchEntryBuilder.setMatchEntryValue(vlanVidCaseBuilder.build());
             matchEntryBuilder.setHasMask(hasmask);
@@ -421,7 +450,7 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
         }
     }
 
-    private static void tcpFlagsMatch(List<MatchEntry> matchEntryList, TcpFlagsMatch tcpFlagsMatch) {
+    private static void tcpFlagsMatch(final List<MatchEntry> matchEntryList, final TcpFlagsMatch tcpFlagsMatch) {
         ExperimenterIdCaseBuilder expIdCaseBuilder = new ExperimenterIdCaseBuilder();
         if (tcpFlagsMatch != null) {
             MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
@@ -432,7 +461,7 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
             TcpFlagsContainerBuilder tcpFlagsContainerBuilder = new TcpFlagsContainerBuilder();
             TcpFlagsBuilder tcpFlagsBuilder = new TcpFlagsBuilder();
             tcpFlagsBuilder.setFlags(tcpFlagsMatch.getTcpFlags());
-            if(tcpFlagsMatch.getTcpFlagsMask() != null) {
+            if (tcpFlagsMatch.getTcpFlagsMask() != null) {
                 matchEntryBuilder.setHasMask(true);
                 tcpFlagsBuilder.setMask(ByteUtil.unsignedShortToBytes(tcpFlagsMatch.getTcpFlagsMask()));
             }
@@ -451,7 +480,7 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
 
     private static MatchEntry toOfMplsPbb(final Pbb pbb) {
         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        boolean hasmask = pbb.getPbbMask() != null;
+        final boolean hasmask = pbb.getPbbMask() != null;
         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
         matchEntryBuilder.setOxmMatchField(PbbIsid.class);
         PbbIsidCaseBuilder pbbIsidCaseBuilder = new PbbIsidCaseBuilder();
@@ -468,43 +497,37 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
         return matchEntryBuilder.build();
     }
 
-    private static MatchEntry toOfMplsTc(final Short mplsTc) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(MplsTc.class);
-        MplsTcCaseBuilder mplsTcCaseBuilder = new MplsTcCaseBuilder();
-        MplsTcBuilder mplsTcBuilder = new MplsTcBuilder();
-        mplsTcBuilder.setTc(mplsTc);
-        mplsTcCaseBuilder.setMplsTc(mplsTcBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(mplsTcCaseBuilder.build());
-        return matchEntryBuilder.build();
+    private static MatchEntry toOfMplsTc(final Uint8 mplsTc) {
+        return new MatchEntryBuilder()
+                .setOxmClass(OpenflowBasicClass.class)
+                .setHasMask(Boolean.FALSE)
+                .setOxmMatchField(MplsTc.class)
+                .setMatchEntryValue(new MplsTcCaseBuilder()
+                    .setMplsTc(new MplsTcBuilder().setTc(mplsTc).build())
+                    .build())
+                .build();
     }
 
-    private static MatchEntry toOfMplsBos(final Short mplsBos) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(MplsBos.class);
-        MplsBosCaseBuilder mplsBosCaseBuilder = new MplsBosCaseBuilder();
-        MplsBosBuilder mplsBosBuilder = new MplsBosBuilder();
-        mplsBosBuilder.setBos(mplsBos != 0);
-        mplsBosCaseBuilder.setMplsBos(mplsBosBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(mplsBosCaseBuilder.build());
-        return matchEntryBuilder.build();
+    private static MatchEntry toOfMplsBos(final Uint8 mplsBos) {
+        return new MatchEntryBuilder()
+                .setOxmClass(OpenflowBasicClass.class)
+                .setHasMask(Boolean.FALSE)
+                .setOxmMatchField(MplsBos.class)
+                .setMatchEntryValue(new MplsBosCaseBuilder()
+                    .setMplsBos(new MplsBosBuilder().setBos(mplsBos.toJava() != 0).build())
+                    .build())
+                .build();
     }
 
-    private static MatchEntry toOfMplsLabel(final Long mplsLabel) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(MplsLabel.class);
-        MplsLabelCaseBuilder mplsLabelCaseBuilder = new MplsLabelCaseBuilder();
-        MplsLabelBuilder mplsLabelBuilder = new MplsLabelBuilder();
-        mplsLabelBuilder.setMplsLabel(mplsLabel);
-        mplsLabelCaseBuilder.setMplsLabel(mplsLabelBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(mplsLabelCaseBuilder.build());
-        return matchEntryBuilder.build();
+    private static MatchEntry toOfMplsLabel(final Uint32 mplsLabel) {
+        return new MatchEntryBuilder()
+                .setOxmClass(OpenflowBasicClass.class)
+                .setHasMask(Boolean.FALSE)
+                .setOxmMatchField(MplsLabel.class)
+                .setMatchEntryValue(new MplsLabelCaseBuilder()
+                    .setMplsLabel(new MplsLabelBuilder().setMplsLabel(mplsLabel).build())
+                    .build())
+                .build();
     }
 
     private static MatchEntry toOfEthernetType(final EthernetType ethernetType) {
@@ -521,82 +544,67 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
         return matchEntryBuilder.build();
     }
 
-    private static MatchEntry toOfIcmpv4Type(final Short icmpv4Type) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(Icmpv4Type.class);
-        Icmpv4TypeCaseBuilder icmpv4TypeCaseBuilder = new Icmpv4TypeCaseBuilder();
-        Icmpv4TypeBuilder icmpv4TypeBuilder = new Icmpv4TypeBuilder();
-        icmpv4TypeBuilder.setIcmpv4Type(icmpv4Type);
-        icmpv4TypeCaseBuilder.setIcmpv4Type(icmpv4TypeBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(icmpv4TypeCaseBuilder.build());
-        return matchEntryBuilder.build();
+    private static MatchEntry toOfIcmpv4Type(final Uint8 icmpv4Type) {
+        return new MatchEntryBuilder()
+                .setOxmClass(OpenflowBasicClass.class)
+                .setHasMask(Boolean.FALSE)
+                .setOxmMatchField(Icmpv4Type.class)
+                .setMatchEntryValue(new Icmpv4TypeCaseBuilder()
+                    .setIcmpv4Type(new Icmpv4TypeBuilder().setIcmpv4Type(icmpv4Type).build())
+                    .build())
+                .build();
     }
 
-    private static MatchEntry toOfIcmpv4Code(final Short icmpv4Code) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(Icmpv4Code.class);
-        Icmpv4CodeCaseBuilder icmpv4CodeCaseBuilder = new Icmpv4CodeCaseBuilder();
-        Icmpv4CodeBuilder icmpv4CodeBuilder = new Icmpv4CodeBuilder();
-        icmpv4CodeBuilder.setIcmpv4Code(icmpv4Code);
-        icmpv4CodeCaseBuilder.setIcmpv4Code(icmpv4CodeBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(icmpv4CodeCaseBuilder.build());
-        return matchEntryBuilder.build();
+    private static MatchEntry toOfIcmpv4Code(final Uint8 icmpv4Code) {
+        return new MatchEntryBuilder()
+                .setOxmClass(OpenflowBasicClass.class)
+                .setHasMask(Boolean.FALSE)
+                .setOxmMatchField(Icmpv4Code.class)
+                .setMatchEntryValue(new Icmpv4CodeCaseBuilder()
+                    .setIcmpv4Code(new Icmpv4CodeBuilder().setIcmpv4Code(icmpv4Code).build()).build())
+                .build();
     }
 
-    private static MatchEntry toOfIcmpv6Type(final Short icmpv6Type) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(Icmpv6Type.class);
-        Icmpv6TypeCaseBuilder icmpv6TypeCaseBuilder = new Icmpv6TypeCaseBuilder();
-        Icmpv6TypeBuilder icmpv6TypeBuilder = new Icmpv6TypeBuilder();
-        icmpv6TypeBuilder.setIcmpv6Type(icmpv6Type);
-        icmpv6TypeCaseBuilder.setIcmpv6Type(icmpv6TypeBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(icmpv6TypeCaseBuilder.build());
-        return matchEntryBuilder.build();
+    private static MatchEntry toOfIcmpv6Type(final Uint8 icmpv6Type) {
+        return new MatchEntryBuilder()
+                .setOxmClass(OpenflowBasicClass.class)
+                .setHasMask(Boolean.FALSE)
+                .setOxmMatchField(Icmpv6Type.class)
+                .setMatchEntryValue(new Icmpv6TypeCaseBuilder()
+                    .setIcmpv6Type(new Icmpv6TypeBuilder().setIcmpv6Type(icmpv6Type).build())
+                    .build())
+                .build();
     }
 
-    private static MatchEntry toOfIcmpv6Code(final Short icmpv6Code) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(Icmpv6Code.class);
-        Icmpv6CodeCaseBuilder icmpv6CodeCaseBuilder = new Icmpv6CodeCaseBuilder();
-        Icmpv6CodeBuilder icmpv6CodeBuilder = new Icmpv6CodeBuilder();
-        icmpv6CodeBuilder.setIcmpv6Code(icmpv6Code);
-        icmpv6CodeCaseBuilder.setIcmpv6Code(icmpv6CodeBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(icmpv6CodeCaseBuilder.build());
-        return matchEntryBuilder.build();
+    private static MatchEntry toOfIcmpv6Code(final Uint8 icmpv6Code) {
+        return new MatchEntryBuilder()
+                .setOxmClass(OpenflowBasicClass.class)
+                .setHasMask(Boolean.FALSE)
+                .setOxmMatchField(Icmpv6Code.class)
+                .setMatchEntryValue(new Icmpv6CodeCaseBuilder()
+                    .setIcmpv6Code(new Icmpv6CodeBuilder().setIcmpv6Code(icmpv6Code).build())
+                    .build())
+                .build();
     }
 
-    private static MatchEntry toOfIpProto(final Short ipProtocol) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(IpProto.class);
-        IpProtoCaseBuilder ipProtoCaseBuilder = new IpProtoCaseBuilder();
-        IpProtoBuilder ipProtoBuilder = new IpProtoBuilder();
-        ipProtoBuilder.setProtocolNumber(ipProtocol);
-        ipProtoCaseBuilder.setIpProto(ipProtoBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(ipProtoCaseBuilder.build());
-        return matchEntryBuilder.build();
+    private static MatchEntry toOfIpProto(final Uint8 ipProtocol) {
+        return new MatchEntryBuilder()
+                .setOxmClass(OpenflowBasicClass.class)
+                .setHasMask(Boolean.FALSE)
+                .setOxmMatchField(IpProto.class)
+                .setMatchEntryValue(new IpProtoCaseBuilder()
+                    .setIpProto(new IpProtoBuilder().setProtocolNumber(ipProtocol).build())
+                    .build())
+                .build();
     }
 
-    private static MatchEntry toOfIpEcn(final Short ipEcn) {
-        MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
-        matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
-        matchEntryBuilder.setHasMask(false);
-        matchEntryBuilder.setOxmMatchField(IpEcn.class);
-        IpEcnCaseBuilder ipEcnCaseBuilder = new IpEcnCaseBuilder();
-        IpEcnBuilder ipEcnBuilder = new IpEcnBuilder();
-        ipEcnBuilder.setEcn(ipEcn);
-        ipEcnCaseBuilder.setIpEcn(ipEcnBuilder.build());
-        matchEntryBuilder.setMatchEntryValue(ipEcnCaseBuilder.build());
-        return matchEntryBuilder.build();
+    private static MatchEntry toOfIpEcn(final Uint8 ipEcn) {
+        return new MatchEntryBuilder()
+                .setOxmClass(OpenflowBasicClass.class)
+                .setHasMask(Boolean.FALSE)
+                .setOxmMatchField(IpEcn.class)
+                .setMatchEntryValue(new IpEcnCaseBuilder().setIpEcn(new IpEcnBuilder().setEcn(ipEcn).build()).build())
+                .build();
     }
 
     /**
@@ -625,6 +633,7 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
         inPortMatch(result, source.getInPort());
         inPhyPortMatch(result, source.getInPhyPort());
         metadataMatch(result, source.getMetadata());
+        packetTypeMatch(result, source.getPacketTypeMatch());
         ethernetMatch(result, source.getEthernetMatch());
         vlanMatch(result, source.getVlanMatch());
         ipMatch(result, source.getIpMatch());
@@ -636,16 +645,18 @@ public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionCo
         tunnelMatch(result, source.getTunnel());
         tcpFlagsMatch(result, source.getTcpFlagsMatch());
 
-        /**
+        /*
          * TODO: EXTENSION PROPOSAL (source, MD-SAL to OFJava)
          * - we might need version for conversion and for key
          */
-        Optional<GeneralExtensionListGrouping> extensionListOpt = ExtensionResolvers.getMatchExtensionResolver().getExtension(source);
+        Optional<GeneralExtensionListGrouping> extensionListOpt =
+                ExtensionResolvers.getMatchExtensionResolver().getExtension(source);
         if (extensionListOpt.isPresent()) {
             List<ExtensionList> extensionListList = extensionListOpt.get().getExtensionList();
             for (ExtensionList extensionItem : extensionListList) {
                 // TODO: get real version
-                ConverterExtensionKey<? extends ExtensionKey> key = new ConverterExtensionKey<>(extensionItem.getExtensionKey(), OFConstants.OFP_VERSION_1_3);
+                ConverterExtensionKey<? extends ExtensionKey> key =
+                        new ConverterExtensionKey<>(extensionItem.getExtensionKey(), OFConstants.OFP_VERSION_1_3);
                 ConvertorToOFJava<MatchEntry> convertor = extensionConvertorProvider.getConverter(key);
                 if (convertor == null) {
                     throw new IllegalStateException("No converter found for key: " + key.toString());