ONOS-6604 Translation of all criterion types in PiFlowRuleTranslationService

Change-Id: I62d34c1f5d4718c4865933bf60eb4f1266125232
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslatorHelper.java b/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslatorHelper.java
index 3069e27..47c944a 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslatorHelper.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslatorHelper.java
@@ -24,10 +24,74 @@
 import org.onosproject.net.flow.criteria.EthTypeCriterion;
 import org.onosproject.net.flow.criteria.IPCriterion;
 import org.onosproject.net.flow.criteria.PortCriterion;
+import org.onosproject.net.flow.criteria.VlanIdCriterion;
+import org.onosproject.net.flow.criteria.UdpPortCriterion;
+import org.onosproject.net.flow.criteria.ExtensionCriterion;
+import org.onosproject.net.flow.criteria.IPDscpCriterion;
+import org.onosproject.net.flow.criteria.IPProtocolCriterion;
+import org.onosproject.net.flow.criteria.IPv6ExthdrFlagsCriterion;
+import org.onosproject.net.flow.criteria.IPv6FlowLabelCriterion;
+import org.onosproject.net.flow.criteria.IPv6NDLinkLayerAddressCriterion;
+import org.onosproject.net.flow.criteria.IPv6NDTargetAddressCriterion;
+import org.onosproject.net.flow.criteria.IcmpCodeCriterion;
+import org.onosproject.net.flow.criteria.IcmpTypeCriterion;
+import org.onosproject.net.flow.criteria.Icmpv6CodeCriterion;
+import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion;
+import org.onosproject.net.flow.criteria.LambdaCriterion;
+import org.onosproject.net.flow.criteria.MplsBosCriterion;
+import org.onosproject.net.flow.criteria.MplsCriterion;
+import org.onosproject.net.flow.criteria.MplsTcCriterion;
+import org.onosproject.net.flow.criteria.OchSignalCriterion;
+import org.onosproject.net.flow.criteria.OchSignalTypeCriterion;
+import org.onosproject.net.flow.criteria.OduSignalIdCriterion;
+import org.onosproject.net.flow.criteria.OduSignalTypeCriterion;
+import org.onosproject.net.flow.criteria.PbbIsidCriterion;
+import org.onosproject.net.flow.criteria.PiCriterion;
+import org.onosproject.net.flow.criteria.SctpPortCriterion;
+import org.onosproject.net.flow.criteria.TcpFlagsCriterion;
+import org.onosproject.net.flow.criteria.TcpPortCriterion;
+import org.onosproject.net.flow.criteria.TunnelIdCriterion;
+import org.onosproject.net.flow.criteria.VlanPcpCriterion;
+import org.onosproject.net.flow.criteria.ArpHaCriterion;
+import org.onosproject.net.flow.criteria.ArpOpCriterion;
+import org.onosproject.net.flow.criteria.ArpPaCriterion;
+
 import org.onosproject.net.pi.impl.CriterionTranslators.EthCriterionTranslator;
 import org.onosproject.net.pi.impl.CriterionTranslators.EthTypeCriterionTranslator;
 import org.onosproject.net.pi.impl.CriterionTranslators.IpCriterionTranslator;
 import org.onosproject.net.pi.impl.CriterionTranslators.PortCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.VlanIdCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.UdpPortCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.ExtensionCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IPDscpCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IPProtocolCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IPv6ExthdrFlagsCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IPv6FlowLabelCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IPv6NDLinkLayerAddressCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IPv6NDTargetAddressCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IcmpCodeCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.IcmpTypeCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.Icmpv6CodeCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.Icmpv6TypeCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.LambdaCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.MplsBosCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.MplsCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.MplsTcCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.OchSignalCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.OchSignalTypeCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.OduSignalIdCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.OduSignalTypeCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.PbbIsidCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.PiCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.SctpPortCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.TcpFlagsCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.TcpPortCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.TunnelIdCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.VlanPcpCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.ArpHaCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.ArpOpCriterionTranslator;
+import org.onosproject.net.pi.impl.CriterionTranslators.ArpPaCriterionTranslator;
+
 import org.onosproject.net.pi.model.PiMatchType;
 import org.onosproject.net.pi.runtime.PiExactFieldMatch;
 import org.onosproject.net.pi.runtime.PiFieldMatch;
@@ -46,7 +110,6 @@
  * Helper class to translate criterion instances to PI field matches.
  */
 final class CriterionTranslatorHelper {
-
     private static final Map<Class<? extends Criterion>, CriterionTranslator> TRANSLATORS =
             // Add here new CriterionTranslator implementations.
             new ImmutableMap.Builder<Class<? extends Criterion>, CriterionTranslator>()
@@ -54,6 +117,37 @@
                     .put(EthCriterion.class, new EthCriterionTranslator())
                     .put(EthTypeCriterion.class, new EthTypeCriterionTranslator())
                     .put(IPCriterion.class, new IpCriterionTranslator())
+                    .put(VlanIdCriterion.class, new VlanIdCriterionTranslator())
+                    .put(UdpPortCriterion.class, new UdpPortCriterionTranslator())
+                    .put(ExtensionCriterion.class, new ExtensionCriterionTranslator())
+                    .put(IPDscpCriterion.class, new IPDscpCriterionTranslator())
+                    .put(IPProtocolCriterion.class, new IPProtocolCriterionTranslator())
+                    .put(IPv6ExthdrFlagsCriterion.class, new IPv6ExthdrFlagsCriterionTranslator())
+                    .put(IPv6FlowLabelCriterion.class, new IPv6FlowLabelCriterionTranslator())
+                    .put(IPv6NDLinkLayerAddressCriterion.class, new IPv6NDLinkLayerAddressCriterionTranslator())
+                    .put(IPv6NDTargetAddressCriterion.class, new IPv6NDTargetAddressCriterionTranslator())
+                    .put(IcmpCodeCriterion.class, new IcmpCodeCriterionTranslator())
+                    .put(IcmpTypeCriterion.class, new IcmpTypeCriterionTranslator())
+                    .put(Icmpv6CodeCriterion.class, new Icmpv6CodeCriterionTranslator())
+                    .put(Icmpv6TypeCriterion.class, new Icmpv6TypeCriterionTranslator())
+                    .put(LambdaCriterion.class, new LambdaCriterionTranslator())
+                    .put(MplsBosCriterion.class, new MplsBosCriterionTranslator())
+                    .put(MplsCriterion.class, new MplsCriterionTranslator())
+                    .put(MplsTcCriterion.class, new MplsTcCriterionTranslator())
+                    .put(OchSignalCriterion.class, new OchSignalCriterionTranslator())
+                    .put(OchSignalTypeCriterion.class, new OchSignalTypeCriterionTranslator())
+                    .put(OduSignalIdCriterion.class, new OduSignalIdCriterionTranslator())
+                    .put(OduSignalTypeCriterion.class, new OduSignalTypeCriterionTranslator())
+                    .put(PbbIsidCriterion.class, new PbbIsidCriterionTranslator())
+                    .put(PiCriterion.class, new PiCriterionTranslator())
+                    .put(SctpPortCriterion.class, new SctpPortCriterionTranslator())
+                    .put(TcpFlagsCriterion.class, new TcpFlagsCriterionTranslator())
+                    .put(TcpPortCriterion.class, new TcpPortCriterionTranslator())
+                    .put(TunnelIdCriterion.class, new TunnelIdCriterionTranslator())
+                    .put(VlanPcpCriterion.class, new VlanPcpCriterionTranslator())
+                    .put(ArpHaCriterion.class, new ArpHaCriterionTranslator())
+                    .put(ArpOpCriterion.class, new ArpOpCriterionTranslator())
+                    .put(ArpPaCriterion.class, new ArpPaCriterionTranslator())
                     .build();
 
     private CriterionTranslatorHelper() {
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslators.java b/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslators.java
index 089f80a..11153cc 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslators.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/CriterionTranslators.java
@@ -22,6 +22,38 @@
 import org.onosproject.net.flow.criteria.EthTypeCriterion;
 import org.onosproject.net.flow.criteria.IPCriterion;
 import org.onosproject.net.flow.criteria.PortCriterion;
+import org.onosproject.net.flow.criteria.VlanIdCriterion;
+import org.onosproject.net.flow.criteria.UdpPortCriterion;
+import org.onosproject.net.flow.criteria.ExtensionCriterion;
+import org.onosproject.net.flow.criteria.IPDscpCriterion;
+import org.onosproject.net.flow.criteria.IPProtocolCriterion;
+import org.onosproject.net.flow.criteria.IPv6ExthdrFlagsCriterion;
+import org.onosproject.net.flow.criteria.IPv6FlowLabelCriterion;
+import org.onosproject.net.flow.criteria.IcmpCodeCriterion;
+import org.onosproject.net.flow.criteria.IcmpTypeCriterion;
+import org.onosproject.net.flow.criteria.Icmpv6CodeCriterion;
+import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion;
+import org.onosproject.net.flow.criteria.LambdaCriterion;
+import org.onosproject.net.flow.criteria.MetadataCriterion;
+import org.onosproject.net.flow.criteria.MplsBosCriterion;
+import org.onosproject.net.flow.criteria.MplsCriterion;
+import org.onosproject.net.flow.criteria.MplsTcCriterion;
+import org.onosproject.net.flow.criteria.OchSignalCriterion;
+import org.onosproject.net.flow.criteria.OchSignalTypeCriterion;
+import org.onosproject.net.flow.criteria.OduSignalIdCriterion;
+import org.onosproject.net.flow.criteria.OduSignalTypeCriterion;
+import org.onosproject.net.flow.criteria.PbbIsidCriterion;
+import org.onosproject.net.flow.criteria.PiCriterion;
+import org.onosproject.net.flow.criteria.SctpPortCriterion;
+import org.onosproject.net.flow.criteria.TcpFlagsCriterion;
+import org.onosproject.net.flow.criteria.TcpPortCriterion;
+import org.onosproject.net.flow.criteria.TunnelIdCriterion;
+import org.onosproject.net.flow.criteria.VlanPcpCriterion;
+import org.onosproject.net.flow.criteria.ArpHaCriterion;
+import org.onosproject.net.flow.criteria.ArpOpCriterion;
+import org.onosproject.net.flow.criteria.ArpPaCriterion;
+import org.onosproject.net.flow.criteria.IPv6NDLinkLayerAddressCriterion;
+import org.onosproject.net.flow.criteria.IPv6NDTargetAddressCriterion;
 
 import static org.onlab.util.ImmutableByteSequence.ByteSequenceTrimException;
 import static org.onlab.util.ImmutableByteSequence.copyFrom;
@@ -74,9 +106,388 @@
      * Translator of IpCriterion.
      */
     static final class IpCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
         public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
             IPCriterion c = (IPCriterion) criterion;
             initAsLpm(copyFrom(c.ip().address().toOctets()), c.ip().prefixLength(), bitWidth);
         }
     }
+
+    /**
+     * Translator of VlanIdCriterion.
+     */
+    static final class VlanIdCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            VlanIdCriterion c = (VlanIdCriterion) criterion;
+            initAsExactMatch(copyFrom(c.vlanId().toShort()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of UdpPortCriterion.
+     */
+    static final class UdpPortCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            UdpPortCriterion c = (UdpPortCriterion) criterion;
+            ImmutableByteSequence value = copyFrom(c.udpPort().toInt());
+            if (c.mask() == null) {
+                initAsExactMatch(value, bitWidth);
+            } else {
+                ImmutableByteSequence mask = copyFrom(c.mask().toInt());
+                initAsTernaryMatch(value, mask, bitWidth);
+            }
+        }
+    }
+
+    /**
+     * Translator of ExtensionCriterion.
+     */
+    static final class ExtensionCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            ExtensionCriterion c = (ExtensionCriterion) criterion;
+            initAsExactMatch(copyFrom(c.extensionSelector().type().toInt()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IPDscpCriterion.
+     */
+    static final class IPDscpCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IPDscpCriterion c = (IPDscpCriterion) criterion;
+            ImmutableByteSequence value = copyFrom(c.ipDscp());
+            initAsExactMatch(value, bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IPProtocolCriterion.
+     */
+    static final class IPProtocolCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IPProtocolCriterion c = (IPProtocolCriterion) criterion;
+            initAsExactMatch(copyFrom(c.protocol()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IPv6ExthdrFlagsCriterion.
+     */
+    static final class IPv6ExthdrFlagsCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IPv6ExthdrFlagsCriterion c = (IPv6ExthdrFlagsCriterion) criterion;
+            initAsExactMatch(copyFrom(c.exthdrFlags()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IPv6FlowLabelCriterion.
+     */
+    static final class IPv6FlowLabelCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IPv6FlowLabelCriterion c = (IPv6FlowLabelCriterion) criterion;
+            initAsExactMatch(copyFrom(c.flowLabel()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IPv6NDLinkLayerAddressCriterion.
+     */
+    static final class IPv6NDLinkLayerAddressCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IPv6NDLinkLayerAddressCriterion c = (IPv6NDLinkLayerAddressCriterion) criterion;
+            initAsExactMatch(copyFrom(c.mac().toLong()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IPv6NDTargetAddressCriterion.
+     */
+    static final class IPv6NDTargetAddressCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IPv6NDTargetAddressCriterion c = (IPv6NDTargetAddressCriterion) criterion;
+            initAsExactMatch(copyFrom(c.targetAddress().getIp6Address().toOctets()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IcmpCodeCriterion.
+     */
+    static final class IcmpCodeCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IcmpCodeCriterion c = (IcmpCodeCriterion) criterion;
+            initAsExactMatch(copyFrom(c.icmpCode()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of IcmpTypeCriterion.
+     */
+    static final class IcmpTypeCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            IcmpTypeCriterion c = (IcmpTypeCriterion) criterion;
+            initAsExactMatch(copyFrom(c.icmpType()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of Icmpv6CodeCriterion.
+     */
+    static final class Icmpv6CodeCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            Icmpv6CodeCriterion c = (Icmpv6CodeCriterion) criterion;
+            initAsExactMatch(copyFrom(c.icmpv6Code()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of Icmpv6TypeCriterion.
+     */
+    static final class Icmpv6TypeCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            Icmpv6TypeCriterion c = (Icmpv6TypeCriterion) criterion;
+            initAsExactMatch(copyFrom(c.icmpv6Type()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of LambdaCriterion.
+     */
+    static final class LambdaCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            LambdaCriterion c = (LambdaCriterion) criterion;
+            initAsExactMatch(copyFrom(c.lambda()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of MetadataCriterion.
+     */
+    static final class MetadataCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            MetadataCriterion c = (MetadataCriterion) criterion;
+            initAsExactMatch(copyFrom(c.metadata()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of MplsBosCriterion.
+     */
+    static final class MplsBosCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            MplsBosCriterion c = (MplsBosCriterion) criterion;
+            int iMplsBos = c.mplsBos() ? 0 : 1;
+            initAsExactMatch(copyFrom(iMplsBos), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of MplsCriterion.
+     */
+    static final class MplsCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            MplsCriterion c = (MplsCriterion) criterion;
+            initAsExactMatch(copyFrom(c.label().toInt()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of MplsTcCriterion.
+     */
+    static final class MplsTcCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            MplsTcCriterion c = (MplsTcCriterion) criterion;
+            initAsExactMatch(copyFrom(c.tc()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of OchSignalCriterion.
+     */
+    static final class OchSignalCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            OchSignalCriterion c = (OchSignalCriterion) criterion;
+            initAsExactMatch(copyFrom(c.lambda().slotGranularity()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of OchSignalTypeCriterion.
+     */
+    static final class OchSignalTypeCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            OchSignalTypeCriterion c = (OchSignalTypeCriterion) criterion;
+            initAsExactMatch(copyFrom(c.signalType().ordinal()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of OduSignalIdCriterion.
+     */
+    static final class OduSignalIdCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            OduSignalIdCriterion c = (OduSignalIdCriterion) criterion;
+            initAsExactMatch(copyFrom(c.oduSignalId().tributaryPortNumber()), bitWidth);
+        }
+    }
+
+
+    /**
+     * Translator of OduSignalTypeCriterion.
+     */
+    static final class OduSignalTypeCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            OduSignalTypeCriterion c = (OduSignalTypeCriterion) criterion;
+            initAsExactMatch(copyFrom(c.signalType().bitRate()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of PbbIsidCriterion.
+     */
+    static final class PbbIsidCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            PbbIsidCriterion c = (PbbIsidCriterion) criterion;
+            initAsExactMatch(copyFrom(c.pbbIsid()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of PiCriterion.
+     */
+    static final class PiCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            PiCriterion c = (PiCriterion) criterion;
+            initAsExactMatch(copyFrom(c.fieldMatches().size()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of SctpPortCriterion.
+     */
+    static final class SctpPortCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            SctpPortCriterion c = (SctpPortCriterion) criterion;
+            ImmutableByteSequence value = copyFrom(c.sctpPort().toInt());
+            if (c.mask() == null) {
+                initAsExactMatch(value, bitWidth);
+            } else {
+                ImmutableByteSequence mask = copyFrom(c.mask().toInt());
+                initAsTernaryMatch(value, mask, bitWidth);
+            }
+        }
+    }
+
+    /**
+     * Translator of TcpFlagsCriterion.
+     */
+    static final class TcpFlagsCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            TcpFlagsCriterion c = (TcpFlagsCriterion) criterion;
+            initAsExactMatch(copyFrom(c.flags()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of TcpPortCriterion.
+     */
+    static final class TcpPortCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            TcpPortCriterion c = (TcpPortCriterion) criterion;
+            ImmutableByteSequence value = copyFrom(c.tcpPort().toInt());
+            if (c.mask() == null) {
+                initAsExactMatch(value, bitWidth);
+            } else {
+                ImmutableByteSequence mask = copyFrom(c.mask().toInt());
+                initAsTernaryMatch(value, mask, bitWidth);
+            }
+
+        }
+    }
+
+    /**
+     * Translator of TunnelIdCriterion.
+     */
+    static final class TunnelIdCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            TunnelIdCriterion c = (TunnelIdCriterion) criterion;
+            initAsExactMatch(copyFrom(c.tunnelId()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of  VlanPcpCriterion.
+     */
+    static final class VlanPcpCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            VlanPcpCriterion c = (VlanPcpCriterion) criterion;
+            initAsExactMatch(copyFrom(c.priority()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of  ArpHaCriterion.
+     */
+    static final class ArpHaCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            ArpHaCriterion c = (ArpHaCriterion) criterion;
+            initAsExactMatch(copyFrom(c.mac().toLong()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of  ArpOpCriterion.
+     */
+    static final class ArpOpCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            ArpOpCriterion c = (ArpOpCriterion) criterion;
+            initAsExactMatch(copyFrom(c.arpOp()), bitWidth);
+        }
+    }
+
+    /**
+     * Translator of  ArpPaCriterion.
+     */
+    static final class ArpPaCriterionTranslator extends AbstractCriterionTranslator {
+        @Override
+        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
+            ArpPaCriterion c = (ArpPaCriterion) criterion;
+            initAsExactMatch(copyFrom(c.ip().toInt()), bitWidth);
+        }
+    }
+
+
+
+
 }