support for create/remove terminatingserviceActions
[vpnservice.git] / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / vpnservice / mdsalutil / MatchFieldType.java
index f38acf70f89fec17f55bca292a4873ffc873d4c2..57a7f38d048d7e11b8fdc8d64fc6b24c6acca392 100644 (file)
@@ -1,7 +1,9 @@
 /*
- * Copyright (c) 2013 Ericsson AB.  All rights reserved.
- *
+ * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
  *
+ * This program and the accompanying materials are made available under the
+ * 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.vpnservice.mdsalutil;
 
@@ -55,596 +57,566 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelId;
 
 public enum MatchFieldType {
-       eth_src {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return EthSrc.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
-                                       .get(EthernetMatchBuilder.class);
-
-                       if (ethernetMatchBuilder == null) {
-                               ethernetMatchBuilder = new EthernetMatchBuilder();
-                               mapMatchBuilder.put(EthernetMatchBuilder.class, ethernetMatchBuilder);
-                       }
-
-                       ethernetMatchBuilder.setEthernetSource(new EthernetSourceBuilder().setAddress(
-                                       new MacAddress(matchInfo.getStringMatchValues()[0])).build());
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
-                                       .remove(EthernetMatchBuilder.class);
-
-                       if (ethernetMatchBuilder != null) {
-                               matchBuilderInOut.setEthernetMatch(ethernetMatchBuilder.build());
-                       }
-               }
-       },
-
-       eth_dst {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return EthDst.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
-                                       .get(EthernetMatchBuilder.class);
-
-                       if (ethernetMatchBuilder == null) {
-                               ethernetMatchBuilder = new EthernetMatchBuilder();
-                               mapMatchBuilder.put(EthernetMatchBuilder.class, ethernetMatchBuilder);
-                       }
-
-                       ethernetMatchBuilder.setEthernetDestination(new EthernetDestinationBuilder().setAddress(
-                                       new MacAddress(matchInfo.getStringMatchValues()[0])).build());
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
-                                       .remove(EthernetMatchBuilder.class);
-
-                       if (ethernetMatchBuilder != null) {
-                               matchBuilderInOut.setEthernetMatch(ethernetMatchBuilder.build());
-                       }
-               }
-       },
-
-       eth_type {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return EthType.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
-                                       .get(EthernetMatchBuilder.class);
-
-                       if (ethernetMatchBuilder == null) {
-                               ethernetMatchBuilder = new EthernetMatchBuilder();
-                               mapMatchBuilder.put(EthernetMatchBuilder.class, ethernetMatchBuilder);
-                       }
-
-                       ethernetMatchBuilder.setEthernetType(new EthernetTypeBuilder().setType(
-                                       new EtherType(matchInfo.getMatchValues()[0])).build());
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
-                                       .remove(EthernetMatchBuilder.class);
-
-                       if (ethernetMatchBuilder != null) {
-                               matchBuilderInOut.setEthernetMatch(ethernetMatchBuilder.build());
-                       }
-               }
-       },
-
-       in_port {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return InPort.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       // NodeConnectorId format -> openflow:<dpnId>:<portId>
-                       StringBuffer nodeConnectorId = new StringBuffer().append("openflow:").append(matchInfo.getMatchValues()[0])
-                       .append(':').append(matchInfo.getMatchValues()[1]);
-                       matchBuilderInOut.setInPort(new NodeConnectorId(nodeConnectorId.toString()));
-               }
-       },
-
-       ip_proto {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return IpProto.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       IpMatchBuilder ipMatchBuilder = (IpMatchBuilder) mapMatchBuilder.get(IpMatchBuilder.class);
-
-                       if (ipMatchBuilder == null) {
-                               ipMatchBuilder = new IpMatchBuilder();
-                               mapMatchBuilder.put(IpMatchBuilder.class, ipMatchBuilder);
-                       }
-
-                       ipMatchBuilder.setIpProtocol(Short.valueOf((short) matchInfo.getMatchValues()[0])).build();
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       IpMatchBuilder ipMatchBuilder = (IpMatchBuilder) mapMatchBuilder.remove(IpMatchBuilder.class);
-
-                       if (ipMatchBuilder != null) {
-                               matchBuilderInOut.setIpMatch(ipMatchBuilder.build());
-                       }
-               }
-       },
-
-       ipv4_dst {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return Ipv4Dst.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.get(Ipv4MatchBuilder.class);
-
-                       if (ipv4MatchBuilder == null) {
-                               ipv4MatchBuilder = new Ipv4MatchBuilder();
-                               mapMatchBuilder.put(Ipv4MatchBuilder.class, ipv4MatchBuilder);
-                       }
-
-                       long[] prefix = matchInfo.getMatchValues();
-                       ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1]))).build();
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.remove(Ipv4MatchBuilder.class);
-
-                       if (ipv4MatchBuilder != null) {
-                               matchBuilderInOut.setLayer3Match(ipv4MatchBuilder.build());
-                       }
-               }
-       },
-
-       ipv4_src {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return Ipv4Src.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.get(Ipv4MatchBuilder.class);
-
-                       if (ipv4MatchBuilder == null) {
-                               ipv4MatchBuilder = new Ipv4MatchBuilder();
-                               mapMatchBuilder.put(Ipv4MatchBuilder.class, ipv4MatchBuilder);
-                       }
-
-                       long[] prefix = matchInfo.getMatchValues();
-                       ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1]))).build();
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.remove(Ipv4MatchBuilder.class);
-
-                       if (ipv4MatchBuilder != null) {
-                               matchBuilderInOut.setLayer3Match(ipv4MatchBuilder.build());
-                       }
-               }
-       },
-
-       arp_op {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return ArpOp.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
-
-                       if (arpMatchBuilder == null) {
-                               arpMatchBuilder = new ArpMatchBuilder();
-                               mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
-                       }
-
-                       arpMatchBuilder.setArpOp(Integer.valueOf((int) matchInfo.getMatchValues()[0]));
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
-
-                       if (arpMatchBuilder != null) {
-                               matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
-                       }
-               }
-       },
-
-       arp_tpa {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return ArpTpa.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
-
-                       if (arpMatchBuilder == null) {
-                               arpMatchBuilder = new ArpMatchBuilder();
-                               mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
-                       }
-
-                       long[] prefix = matchInfo.getMatchValues();
-                       arpMatchBuilder.setArpTargetTransportAddress(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1])));
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
-
-                       if (arpMatchBuilder != null) {
-                               matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
-                       }
-               }
-       },
-
-       arp_spa {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return ArpSpa.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
-
-                       if (arpMatchBuilder == null) {
-                               arpMatchBuilder = new ArpMatchBuilder();
-                               mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
-                       }
-
-                       long[] prefix = matchInfo.getMatchValues();
-                       arpMatchBuilder.setArpSourceTransportAddress(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1])));
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
-
-                       if (arpMatchBuilder != null) {
-                               matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
-                       }
-               }
-       },
-
-       metadata {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return Metadata.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       MetadataBuilder metadataBuilder = (MetadataBuilder) mapMatchBuilder.get(MetadataBuilder.class);
-
-                       if (metadataBuilder == null) {
-                               metadataBuilder = new MetadataBuilder();
-                               mapMatchBuilder.put(MetadataBuilder.class, metadataBuilder);
-                       }
-
-                       BigInteger[] metadataValues = matchInfo.getBigMatchValues();
-                       metadataBuilder.setMetadata(metadataValues[0]).setMetadataMask(metadataValues[1]).build();
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       MetadataBuilder metadataBuilder = (MetadataBuilder) mapMatchBuilder.remove(MetadataBuilder.class);
-
-                       if (metadataBuilder != null) {
-                               matchBuilderInOut.setMetadata(metadataBuilder.build());
-                       }
-               }
-       },
-
-       mpls_label {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return MplsLabel.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
-                                       .get(ProtocolMatchFieldsBuilder.class);
-
-                       if (protocolMatchFieldsBuilder == null) {
-                               protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
-                               mapMatchBuilder.put(ProtocolMatchFieldsBuilder.class, protocolMatchFieldsBuilder);
-                       }
-
-                       protocolMatchFieldsBuilder.setMplsLabel(Long.valueOf(matchInfo.getStringMatchValues()[0])).build();
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
-                                       .remove(ProtocolMatchFieldsBuilder.class);
-
-                       if (protocolMatchFieldsBuilder != null) {
-                               matchBuilderInOut.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
-                       }
-               }
-       },
-
-       pbb_isid {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return PbbIsid.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
-                                       .get(ProtocolMatchFieldsBuilder.class);
-
-                       if (protocolMatchFieldsBuilder == null) {
-                               protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
-                               mapMatchBuilder.put(ProtocolMatchFieldsBuilder.class, protocolMatchFieldsBuilder);
-                       }
-
-                       protocolMatchFieldsBuilder.setPbb(new PbbBuilder().setPbbIsid(Long.valueOf(matchInfo.getMatchValues()[0]))
-                                       .build());
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
-                                       .remove(ProtocolMatchFieldsBuilder.class);
-
-                       if (protocolMatchFieldsBuilder != null) {
-                               matchBuilderInOut.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
-                       }
-               }
-       },
-
-       tcp_dst {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return TcpDst.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.get(TcpMatchBuilder.class);
-
-                       if (tcpMatchBuilder == null) {
-                               tcpMatchBuilder = new TcpMatchBuilder();
-                               mapMatchBuilder.put(TcpMatchBuilder.class, tcpMatchBuilder);
-                       }
-
-                       tcpMatchBuilder.setTcpDestinationPort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.remove(TcpMatchBuilder.class);
-
-                       if (tcpMatchBuilder != null) {
-                               matchBuilderInOut.setLayer4Match(tcpMatchBuilder.build());
-                       }
-               }
-       },
-
-       tcp_src {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return TcpSrc.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.get(TcpMatchBuilder.class);
-
-                       if (tcpMatchBuilder == null) {
-                               tcpMatchBuilder = new TcpMatchBuilder();
-                               mapMatchBuilder.put(TcpMatchBuilder.class, tcpMatchBuilder);
-                       }
-
-                       tcpMatchBuilder.setTcpSourcePort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.remove(TcpMatchBuilder.class);
-
-                       if (tcpMatchBuilder != null) {
-                               matchBuilderInOut.setLayer4Match(tcpMatchBuilder.build());
-                       }
-               }
-       },
-
-       udp_dst {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return UdpDst.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.get(UdpMatchBuilder.class);
-
-                       if (udpMatchBuilder == null) {
-                               udpMatchBuilder = new UdpMatchBuilder();
-                               mapMatchBuilder.put(UdpMatchBuilder.class, udpMatchBuilder);
-                       }
-
-                       udpMatchBuilder.setUdpDestinationPort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.remove(UdpMatchBuilder.class);
-
-                       if (udpMatchBuilder != null) {
-                               matchBuilderInOut.setLayer4Match(udpMatchBuilder.build());
-                       }
-               }
-       },
-
-       udp_src {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return UdpSrc.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.get(UdpMatchBuilder.class);
-
-                       if (udpMatchBuilder == null) {
-                               udpMatchBuilder = new UdpMatchBuilder();
-                               mapMatchBuilder.put(UdpMatchBuilder.class, udpMatchBuilder);
-                       }
-
-                       udpMatchBuilder.setUdpSourcePort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.remove(UdpMatchBuilder.class);
-
-                       if (udpMatchBuilder != null) {
-                               matchBuilderInOut.setLayer4Match(udpMatchBuilder.build());
-                       }
-               }
-       },
-       tunnel_id {
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       TunnelBuilder tunnelBuilder = (TunnelBuilder) mapMatchBuilder.get(TunnelBuilder.class);
-
-                       if (tunnelBuilder == null) {
-                               tunnelBuilder = new TunnelBuilder();
-                               mapMatchBuilder.put(TunnelBuilder.class, tunnelBuilder);
-                       }
-
-                       BigInteger[] tunnelIdValues = matchInfo.getBigMatchValues();
-                       tunnelBuilder.setTunnelId(tunnelIdValues[0]).setTunnelMask(tunnelIdValues[1]).build();
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       TunnelBuilder tunnelBuilder = (TunnelBuilder) mapMatchBuilder.remove(TunnelBuilder.class);
-
-                       if (tunnelBuilder != null) {
-                               matchBuilderInOut.setTunnel(tunnelBuilder.build());
-                       }
-               }
-
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return TunnelId.class;
-               }
-
-       },
-
-       vlan_vid {
-               @Override
-               protected Class<? extends MatchField> getMatchType() {
-                       return VlanVid.class;
-               }
-
-               @Override
-               public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       VlanMatchBuilder vlanMatchBuilder = (VlanMatchBuilder) mapMatchBuilder.get(VlanMatchBuilder.class);
-
-                       if (vlanMatchBuilder == null) {
-                               vlanMatchBuilder = new VlanMatchBuilder();
-                               mapMatchBuilder.put(VlanMatchBuilder.class, vlanMatchBuilder);
-                       }
-
-                       vlanMatchBuilder.setVlanId(new VlanIdBuilder()
-                       .setVlanId(new VlanId(Integer.valueOf((int) matchInfo.getMatchValues()[0])))
-                       .setVlanIdPresent(((int) matchInfo.getMatchValues()[0] == 0) ? Boolean.FALSE : Boolean.TRUE)
-                       .build());
-               }
-
-               @Override
-               public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
-                       VlanMatchBuilder vlanMatchBuilder = (VlanMatchBuilder) mapMatchBuilder.remove(VlanMatchBuilder.class);
-
-                       if (vlanMatchBuilder != null) {
-                               matchBuilderInOut.setVlanMatch(vlanMatchBuilder.build());
-                       }
-               }
-       };
-
-       /*
-       public SetFieldMatch buildSetFieldMatch(XtensionType xtype) {
-               if (xtype == null || xtype.getMatchMaskType() == 
-                               SalOfaMatchMaskType.OFPMMNOMASK) {
-                       return new 
-                                       SetFieldMatchBuilder().setHasMask(false).setMatchType(getMatchType())
-                                       .setSalOxmClass(SalOpenflowBasicClass.class).build();
-               }
-
-               return new SetFieldMatchBuilder()
-               .setHasMask(true)
-               .setMatchType(getMatchType())
-               .setSalOxmClass(SalOpenflowBasicClass.class)
-               .addAugmentation(
-                               ExperimenterSetFieldMatch.class,
-                               new 
-                               ExperimenterSetFieldMatchBuilder().setMatchMaskType(xtype.getMatchMaskType())
-                               .setTlvMatchMask(xtype.getByteBuf()).build()).build();
-
-
-       }
-*/
-
-       // New one for ODL without the Extension --CHECK
-       /*
-       public SetFieldMatch buildSetFieldMatch() {
-               
-               return new SetFieldMatchBuilder().setHasMask(false).setMatchType(getMatchType())
-                                       .setSalOxmClass(SalOpenflowBasicClass.class).build();
-                                       
-               return null;
-               }
-*/
-               
-       
-       public abstract void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder);
-
-       public abstract void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo,
-                       Map<Class<?>, Object> mapMatchBuilder);
-
-       protected abstract Class<? extends MatchField> getMatchType();
-
-       protected boolean hasMatchFieldMask() {
-               // Override this to return true
-                               return false;
-       }
+    eth_src {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return EthSrc.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
+                    .get(EthernetMatchBuilder.class);
+
+            if (ethernetMatchBuilder == null) {
+                ethernetMatchBuilder = new EthernetMatchBuilder();
+                mapMatchBuilder.put(EthernetMatchBuilder.class, ethernetMatchBuilder);
+            }
+
+            ethernetMatchBuilder.setEthernetSource(new EthernetSourceBuilder().setAddress(
+                    new MacAddress(matchInfo.getStringMatchValues()[0])).build());
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
+                    .remove(EthernetMatchBuilder.class);
+
+            if (ethernetMatchBuilder != null) {
+                matchBuilderInOut.setEthernetMatch(ethernetMatchBuilder.build());
+            }
+        }
+    },
+
+    eth_dst {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return EthDst.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
+                    .get(EthernetMatchBuilder.class);
+
+            if (ethernetMatchBuilder == null) {
+                ethernetMatchBuilder = new EthernetMatchBuilder();
+                mapMatchBuilder.put(EthernetMatchBuilder.class, ethernetMatchBuilder);
+            }
+
+            ethernetMatchBuilder.setEthernetDestination(new EthernetDestinationBuilder().setAddress(
+                    new MacAddress(matchInfo.getStringMatchValues()[0])).build());
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
+                    .remove(EthernetMatchBuilder.class);
+
+            if (ethernetMatchBuilder != null) {
+                matchBuilderInOut.setEthernetMatch(ethernetMatchBuilder.build());
+            }
+        }
+    },
+
+    eth_type {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return EthType.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
+                    .get(EthernetMatchBuilder.class);
+
+            if (ethernetMatchBuilder == null) {
+                ethernetMatchBuilder = new EthernetMatchBuilder();
+                mapMatchBuilder.put(EthernetMatchBuilder.class, ethernetMatchBuilder);
+            }
+
+            ethernetMatchBuilder.setEthernetType(new EthernetTypeBuilder().setType(
+                    new EtherType(matchInfo.getMatchValues()[0])).build());
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
+                    .remove(EthernetMatchBuilder.class);
+
+            if (ethernetMatchBuilder != null) {
+                matchBuilderInOut.setEthernetMatch(ethernetMatchBuilder.build());
+            }
+        }
+    },
+
+    in_port {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return InPort.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+
+            StringBuffer nodeConnectorId = new StringBuffer().append("openflow:").append(matchInfo.getBigMatchValues()[0])
+            .append(':').append(matchInfo.getBigMatchValues()[1]);
+            matchBuilderInOut.setInPort(new NodeConnectorId(nodeConnectorId.toString()));
+        }
+    },
+
+    ip_proto {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return IpProto.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            IpMatchBuilder ipMatchBuilder = (IpMatchBuilder) mapMatchBuilder.get(IpMatchBuilder.class);
+
+            if (ipMatchBuilder == null) {
+                ipMatchBuilder = new IpMatchBuilder();
+                mapMatchBuilder.put(IpMatchBuilder.class, ipMatchBuilder);
+            }
+
+            ipMatchBuilder.setIpProtocol(Short.valueOf((short) matchInfo.getMatchValues()[0])).build();
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            IpMatchBuilder ipMatchBuilder = (IpMatchBuilder) mapMatchBuilder.remove(IpMatchBuilder.class);
+
+            if (ipMatchBuilder != null) {
+                matchBuilderInOut.setIpMatch(ipMatchBuilder.build());
+            }
+        }
+    },
+
+    ipv4_dst {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return Ipv4Dst.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.get(Ipv4MatchBuilder.class);
+
+            if (ipv4MatchBuilder == null) {
+                ipv4MatchBuilder = new Ipv4MatchBuilder();
+                mapMatchBuilder.put(Ipv4MatchBuilder.class, ipv4MatchBuilder);
+            }
+
+            long[] prefix = matchInfo.getMatchValues();
+            ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1]))).build();
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.remove(Ipv4MatchBuilder.class);
+
+            if (ipv4MatchBuilder != null) {
+                matchBuilderInOut.setLayer3Match(ipv4MatchBuilder.build());
+            }
+        }
+    },
+
+    ipv4_src {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return Ipv4Src.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.get(Ipv4MatchBuilder.class);
+
+            if (ipv4MatchBuilder == null) {
+                ipv4MatchBuilder = new Ipv4MatchBuilder();
+                mapMatchBuilder.put(Ipv4MatchBuilder.class, ipv4MatchBuilder);
+            }
+
+            long[] prefix = matchInfo.getMatchValues();
+            ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1]))).build();
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.remove(Ipv4MatchBuilder.class);
+
+            if (ipv4MatchBuilder != null) {
+                matchBuilderInOut.setLayer3Match(ipv4MatchBuilder.build());
+            }
+        }
+    },
+
+    arp_op {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return ArpOp.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
+
+            if (arpMatchBuilder == null) {
+                arpMatchBuilder = new ArpMatchBuilder();
+                mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
+            }
+
+            arpMatchBuilder.setArpOp(Integer.valueOf((int) matchInfo.getMatchValues()[0]));
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
+
+            if (arpMatchBuilder != null) {
+                matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
+            }
+        }
+    },
+
+    arp_tpa {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return ArpTpa.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
+
+            if (arpMatchBuilder == null) {
+                arpMatchBuilder = new ArpMatchBuilder();
+                mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
+            }
+
+            long[] prefix = matchInfo.getMatchValues();
+            arpMatchBuilder.setArpTargetTransportAddress(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1])));
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
+
+            if (arpMatchBuilder != null) {
+                matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
+            }
+        }
+    },
+
+    arp_spa {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return ArpSpa.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
+
+            if (arpMatchBuilder == null) {
+                arpMatchBuilder = new ArpMatchBuilder();
+                mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
+            }
+
+            long[] prefix = matchInfo.getMatchValues();
+            arpMatchBuilder.setArpSourceTransportAddress(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1])));
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
+
+            if (arpMatchBuilder != null) {
+                matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
+            }
+        }
+    },
+
+    metadata {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return Metadata.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            MetadataBuilder metadataBuilder = (MetadataBuilder) mapMatchBuilder.get(MetadataBuilder.class);
+
+            if (metadataBuilder == null) {
+                metadataBuilder = new MetadataBuilder();
+                mapMatchBuilder.put(MetadataBuilder.class, metadataBuilder);
+            }
+
+            BigInteger[] metadataValues = matchInfo.getBigMatchValues();
+            metadataBuilder.setMetadata(metadataValues[0]).setMetadataMask(metadataValues[1]).build();
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            MetadataBuilder metadataBuilder = (MetadataBuilder) mapMatchBuilder.remove(MetadataBuilder.class);
+
+            if (metadataBuilder != null) {
+                matchBuilderInOut.setMetadata(metadataBuilder.build());
+            }
+        }
+    },
+
+    mpls_label {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return MplsLabel.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
+                    .get(ProtocolMatchFieldsBuilder.class);
+
+            if (protocolMatchFieldsBuilder == null) {
+                protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
+                mapMatchBuilder.put(ProtocolMatchFieldsBuilder.class, protocolMatchFieldsBuilder);
+            }
+
+            protocolMatchFieldsBuilder.setMplsLabel(Long.valueOf(matchInfo.getStringMatchValues()[0])).build();
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
+                    .remove(ProtocolMatchFieldsBuilder.class);
+
+            if (protocolMatchFieldsBuilder != null) {
+                matchBuilderInOut.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
+            }
+        }
+    },
+
+    pbb_isid {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return PbbIsid.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
+                    .get(ProtocolMatchFieldsBuilder.class);
+
+            if (protocolMatchFieldsBuilder == null) {
+                protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
+                mapMatchBuilder.put(ProtocolMatchFieldsBuilder.class, protocolMatchFieldsBuilder);
+            }
+
+            protocolMatchFieldsBuilder.setPbb(new PbbBuilder().setPbbIsid(Long.valueOf(matchInfo.getMatchValues()[0]))
+                    .build());
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
+                    .remove(ProtocolMatchFieldsBuilder.class);
+
+            if (protocolMatchFieldsBuilder != null) {
+                matchBuilderInOut.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
+            }
+        }
+    },
+
+    tcp_dst {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return TcpDst.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.get(TcpMatchBuilder.class);
+
+            if (tcpMatchBuilder == null) {
+                tcpMatchBuilder = new TcpMatchBuilder();
+                mapMatchBuilder.put(TcpMatchBuilder.class, tcpMatchBuilder);
+            }
+
+            tcpMatchBuilder.setTcpDestinationPort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.remove(TcpMatchBuilder.class);
+
+            if (tcpMatchBuilder != null) {
+                matchBuilderInOut.setLayer4Match(tcpMatchBuilder.build());
+            }
+        }
+    },
+
+    tcp_src {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return TcpSrc.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.get(TcpMatchBuilder.class);
+
+            if (tcpMatchBuilder == null) {
+                tcpMatchBuilder = new TcpMatchBuilder();
+                mapMatchBuilder.put(TcpMatchBuilder.class, tcpMatchBuilder);
+            }
+
+            tcpMatchBuilder.setTcpSourcePort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.remove(TcpMatchBuilder.class);
+
+            if (tcpMatchBuilder != null) {
+                matchBuilderInOut.setLayer4Match(tcpMatchBuilder.build());
+            }
+        }
+    },
+
+    udp_dst {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return UdpDst.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.get(UdpMatchBuilder.class);
+
+            if (udpMatchBuilder == null) {
+                udpMatchBuilder = new UdpMatchBuilder();
+                mapMatchBuilder.put(UdpMatchBuilder.class, udpMatchBuilder);
+            }
+
+            udpMatchBuilder.setUdpDestinationPort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.remove(UdpMatchBuilder.class);
+
+            if (udpMatchBuilder != null) {
+                matchBuilderInOut.setLayer4Match(udpMatchBuilder.build());
+            }
+        }
+    },
+
+    udp_src {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return UdpSrc.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.get(UdpMatchBuilder.class);
+
+            if (udpMatchBuilder == null) {
+                udpMatchBuilder = new UdpMatchBuilder();
+                mapMatchBuilder.put(UdpMatchBuilder.class, udpMatchBuilder);
+            }
+
+            udpMatchBuilder.setUdpSourcePort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.remove(UdpMatchBuilder.class);
+
+            if (udpMatchBuilder != null) {
+                matchBuilderInOut.setLayer4Match(udpMatchBuilder.build());
+            }
+        }
+    },
+    tunnel_id {
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            TunnelBuilder tunnelBuilder = (TunnelBuilder) mapMatchBuilder.get(TunnelBuilder.class);
+
+            if (tunnelBuilder == null) {
+                tunnelBuilder = new TunnelBuilder();
+                mapMatchBuilder.put(TunnelBuilder.class, tunnelBuilder);
+            }
+
+            BigInteger[] tunnelIdValues = matchInfo.getBigMatchValues();
+            tunnelBuilder.setTunnelId(tunnelIdValues[0]);
+            if(tunnelIdValues.length > 1){
+                tunnelBuilder.setTunnelMask(tunnelIdValues[1]);
+            }
+            tunnelBuilder.build();
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            TunnelBuilder tunnelBuilder = (TunnelBuilder) mapMatchBuilder.remove(TunnelBuilder.class);
+
+            if (tunnelBuilder != null) {
+                matchBuilderInOut.setTunnel(tunnelBuilder.build());
+            }
+        }
+
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return TunnelId.class;
+        }
+
+    },
+
+    vlan_vid {
+        @Override
+        protected Class<? extends MatchField> getMatchType() {
+            return VlanVid.class;
+        }
+
+        @Override
+        public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            VlanMatchBuilder vlanMatchBuilder = (VlanMatchBuilder) mapMatchBuilder.get(VlanMatchBuilder.class);
+
+            if (vlanMatchBuilder == null) {
+                vlanMatchBuilder = new VlanMatchBuilder();
+                mapMatchBuilder.put(VlanMatchBuilder.class, vlanMatchBuilder);
+            }
+
+            vlanMatchBuilder.setVlanId(new VlanIdBuilder()
+            .setVlanId(new VlanId(Integer.valueOf((int) matchInfo.getMatchValues()[0])))
+            .setVlanIdPresent(((int) matchInfo.getMatchValues()[0] == 0) ? Boolean.FALSE : Boolean.TRUE)
+            .build());
+        }
+
+        @Override
+        public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
+            VlanMatchBuilder vlanMatchBuilder = (VlanMatchBuilder) mapMatchBuilder.remove(VlanMatchBuilder.class);
+
+            if (vlanMatchBuilder != null) {
+                matchBuilderInOut.setVlanMatch(vlanMatchBuilder.build());
+            }
+        }
+    };
+
+
+    public abstract void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder);
+
+    public abstract void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo,
+            Map<Class<?>, Object> mapMatchBuilder);
+
+    protected abstract Class<? extends MatchField> getMatchType();
+
+    protected boolean hasMatchFieldMask() {
+        // Override this to return true
+                return false;
+    }
 }