// Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior University
// Copyright (c) 2011, 2012 Open Networking Foundation
// Copyright (c) 2012, 2013 Big Switch Networks, Inc.
// This library was generated by the LoxiGen Compiler.
// See the file LICENSE.txt which should have been included in the source distribution

// Automatically generated by LOXI from template of_factory_class.java
// Do not modify

package org.projectfloodlight.openflow.protocol.ver12;

import org.projectfloodlight.openflow.protocol.*;
import org.projectfloodlight.openflow.protocol.action.*;
import org.projectfloodlight.openflow.protocol.actionid.*;
import org.projectfloodlight.openflow.protocol.bsntlv.*;
import org.projectfloodlight.openflow.protocol.errormsg.*;
import org.projectfloodlight.openflow.protocol.meterband.*;
import org.projectfloodlight.openflow.protocol.instruction.*;
import org.projectfloodlight.openflow.protocol.instructionid.*;
import org.projectfloodlight.openflow.protocol.match.*;
import org.projectfloodlight.openflow.protocol.oxm.*;
import org.projectfloodlight.openflow.protocol.queueprop.*;
import org.projectfloodlight.openflow.types.*;
import org.projectfloodlight.openflow.util.*;
import org.projectfloodlight.openflow.exceptions.*;


public class OFOxmsVer12 implements OFOxms {
    public final static OFOxmsVer12 INSTANCE = new OFOxmsVer12();




    public OFOxmArpOp.Builder buildArpOp() {
        return new OFOxmArpOpVer12.Builder();
    }
    public OFOxmArpOp arpOp(ArpOpcode value) {
        return new OFOxmArpOpVer12(
                value
                    );
    }

    public OFOxmArpOpMasked.Builder buildArpOpMasked() {
        return new OFOxmArpOpMaskedVer12.Builder();
    }
    public OFOxmArpOpMasked arpOpMasked(ArpOpcode value, ArpOpcode mask) {
        return new OFOxmArpOpMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmArpSha.Builder buildArpSha() {
        return new OFOxmArpShaVer12.Builder();
    }
    public OFOxmArpSha arpSha(MacAddress value) {
        return new OFOxmArpShaVer12(
                value
                    );
    }

    public OFOxmArpShaMasked.Builder buildArpShaMasked() {
        return new OFOxmArpShaMaskedVer12.Builder();
    }
    public OFOxmArpShaMasked arpShaMasked(MacAddress value, MacAddress mask) {
        return new OFOxmArpShaMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmArpSpa.Builder buildArpSpa() {
        return new OFOxmArpSpaVer12.Builder();
    }
    public OFOxmArpSpa arpSpa(IPv4Address value) {
        return new OFOxmArpSpaVer12(
                value
                    );
    }

    public OFOxmArpSpaMasked.Builder buildArpSpaMasked() {
        return new OFOxmArpSpaMaskedVer12.Builder();
    }
    public OFOxmArpSpaMasked arpSpaMasked(IPv4Address value, IPv4Address mask) {
        return new OFOxmArpSpaMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmArpTha.Builder buildArpTha() {
        return new OFOxmArpThaVer12.Builder();
    }
    public OFOxmArpTha arpTha(MacAddress value) {
        return new OFOxmArpThaVer12(
                value
                    );
    }

    public OFOxmArpThaMasked.Builder buildArpThaMasked() {
        return new OFOxmArpThaMaskedVer12.Builder();
    }
    public OFOxmArpThaMasked arpThaMasked(MacAddress value, MacAddress mask) {
        return new OFOxmArpThaMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmArpTpa.Builder buildArpTpa() {
        return new OFOxmArpTpaVer12.Builder();
    }
    public OFOxmArpTpa arpTpa(IPv4Address value) {
        return new OFOxmArpTpaVer12(
                value
                    );
    }

    public OFOxmArpTpaMasked.Builder buildArpTpaMasked() {
        return new OFOxmArpTpaMaskedVer12.Builder();
    }
    public OFOxmArpTpaMasked arpTpaMasked(IPv4Address value, IPv4Address mask) {
        return new OFOxmArpTpaMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnEgrPortGroupId.Builder buildBsnEgrPortGroupId() {
        return new OFOxmBsnEgrPortGroupIdVer12.Builder();
    }
    public OFOxmBsnEgrPortGroupId bsnEgrPortGroupId(ClassId value) {
        return new OFOxmBsnEgrPortGroupIdVer12(
                value
                    );
    }

    public OFOxmBsnEgrPortGroupIdMasked.Builder buildBsnEgrPortGroupIdMasked() {
        return new OFOxmBsnEgrPortGroupIdMaskedVer12.Builder();
    }
    public OFOxmBsnEgrPortGroupIdMasked bsnEgrPortGroupIdMasked(ClassId value, ClassId mask) {
        return new OFOxmBsnEgrPortGroupIdMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnGlobalVrfAllowed.Builder buildBsnGlobalVrfAllowed() {
        return new OFOxmBsnGlobalVrfAllowedVer12.Builder();
    }
    public OFOxmBsnGlobalVrfAllowed bsnGlobalVrfAllowed(OFBooleanValue value) {
        return new OFOxmBsnGlobalVrfAllowedVer12(
                value
                    );
    }

    public OFOxmBsnGlobalVrfAllowedMasked.Builder buildBsnGlobalVrfAllowedMasked() {
        return new OFOxmBsnGlobalVrfAllowedMaskedVer12.Builder();
    }
    public OFOxmBsnGlobalVrfAllowedMasked bsnGlobalVrfAllowedMasked(OFBooleanValue value, OFBooleanValue mask) {
        return new OFOxmBsnGlobalVrfAllowedMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnInPorts128.Builder buildBsnInPorts128() {
        return new OFOxmBsnInPorts128Ver12.Builder();
    }
    public OFOxmBsnInPorts128 bsnInPorts128(OFBitMask128 value) {
        return new OFOxmBsnInPorts128Ver12(
                value
                    );
    }

    public OFOxmBsnInPorts128Masked.Builder buildBsnInPorts128Masked() {
        return new OFOxmBsnInPorts128MaskedVer12.Builder();
    }
    public OFOxmBsnInPorts128Masked bsnInPorts128Masked(OFBitMask128 value, OFBitMask128 mask) {
        return new OFOxmBsnInPorts128MaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnL3DstClassId.Builder buildBsnL3DstClassId() {
        return new OFOxmBsnL3DstClassIdVer12.Builder();
    }
    public OFOxmBsnL3DstClassId bsnL3DstClassId(ClassId value) {
        return new OFOxmBsnL3DstClassIdVer12(
                value
                    );
    }

    public OFOxmBsnL3DstClassIdMasked.Builder buildBsnL3DstClassIdMasked() {
        return new OFOxmBsnL3DstClassIdMaskedVer12.Builder();
    }
    public OFOxmBsnL3DstClassIdMasked bsnL3DstClassIdMasked(ClassId value, ClassId mask) {
        return new OFOxmBsnL3DstClassIdMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnL3InterfaceClassId.Builder buildBsnL3InterfaceClassId() {
        return new OFOxmBsnL3InterfaceClassIdVer12.Builder();
    }
    public OFOxmBsnL3InterfaceClassId bsnL3InterfaceClassId(ClassId value) {
        return new OFOxmBsnL3InterfaceClassIdVer12(
                value
                    );
    }

    public OFOxmBsnL3InterfaceClassIdMasked.Builder buildBsnL3InterfaceClassIdMasked() {
        return new OFOxmBsnL3InterfaceClassIdMaskedVer12.Builder();
    }
    public OFOxmBsnL3InterfaceClassIdMasked bsnL3InterfaceClassIdMasked(ClassId value, ClassId mask) {
        return new OFOxmBsnL3InterfaceClassIdMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnL3SrcClassId.Builder buildBsnL3SrcClassId() {
        return new OFOxmBsnL3SrcClassIdVer12.Builder();
    }
    public OFOxmBsnL3SrcClassId bsnL3SrcClassId(ClassId value) {
        return new OFOxmBsnL3SrcClassIdVer12(
                value
                    );
    }

    public OFOxmBsnL3SrcClassIdMasked.Builder buildBsnL3SrcClassIdMasked() {
        return new OFOxmBsnL3SrcClassIdMaskedVer12.Builder();
    }
    public OFOxmBsnL3SrcClassIdMasked bsnL3SrcClassIdMasked(ClassId value, ClassId mask) {
        return new OFOxmBsnL3SrcClassIdMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnLagId.Builder buildBsnLagId() {
        return new OFOxmBsnLagIdVer12.Builder();
    }
    public OFOxmBsnLagId bsnLagId(LagId value) {
        return new OFOxmBsnLagIdVer12(
                value
                    );
    }

    public OFOxmBsnLagIdMasked.Builder buildBsnLagIdMasked() {
        return new OFOxmBsnLagIdMaskedVer12.Builder();
    }
    public OFOxmBsnLagIdMasked bsnLagIdMasked(LagId value, LagId mask) {
        return new OFOxmBsnLagIdMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnTcpFlags.Builder buildBsnTcpFlags() {
        return new OFOxmBsnTcpFlagsVer12.Builder();
    }
    public OFOxmBsnTcpFlags bsnTcpFlags(U16 value) {
        return new OFOxmBsnTcpFlagsVer12(
                value
                    );
    }

    public OFOxmBsnTcpFlagsMasked.Builder buildBsnTcpFlagsMasked() {
        return new OFOxmBsnTcpFlagsMaskedVer12.Builder();
    }
    public OFOxmBsnTcpFlagsMasked bsnTcpFlagsMasked(U16 value, U16 mask) {
        return new OFOxmBsnTcpFlagsMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnUdf0.Builder buildBsnUdf0() {
        return new OFOxmBsnUdf0Ver12.Builder();
    }
    public OFOxmBsnUdf0 bsnUdf0(UDF value) {
        return new OFOxmBsnUdf0Ver12(
                value
                    );
    }

    public OFOxmBsnUdf0Masked.Builder buildBsnUdf0Masked() {
        return new OFOxmBsnUdf0MaskedVer12.Builder();
    }
    public OFOxmBsnUdf0Masked bsnUdf0Masked(UDF value, UDF mask) {
        return new OFOxmBsnUdf0MaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnUdf1.Builder buildBsnUdf1() {
        return new OFOxmBsnUdf1Ver12.Builder();
    }
    public OFOxmBsnUdf1 bsnUdf1(UDF value) {
        return new OFOxmBsnUdf1Ver12(
                value
                    );
    }

    public OFOxmBsnUdf1Masked.Builder buildBsnUdf1Masked() {
        return new OFOxmBsnUdf1MaskedVer12.Builder();
    }
    public OFOxmBsnUdf1Masked bsnUdf1Masked(UDF value, UDF mask) {
        return new OFOxmBsnUdf1MaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnUdf2.Builder buildBsnUdf2() {
        return new OFOxmBsnUdf2Ver12.Builder();
    }
    public OFOxmBsnUdf2 bsnUdf2(UDF value) {
        return new OFOxmBsnUdf2Ver12(
                value
                    );
    }

    public OFOxmBsnUdf2Masked.Builder buildBsnUdf2Masked() {
        return new OFOxmBsnUdf2MaskedVer12.Builder();
    }
    public OFOxmBsnUdf2Masked bsnUdf2Masked(UDF value, UDF mask) {
        return new OFOxmBsnUdf2MaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnUdf3.Builder buildBsnUdf3() {
        return new OFOxmBsnUdf3Ver12.Builder();
    }
    public OFOxmBsnUdf3 bsnUdf3(UDF value) {
        return new OFOxmBsnUdf3Ver12(
                value
                    );
    }

    public OFOxmBsnUdf3Masked.Builder buildBsnUdf3Masked() {
        return new OFOxmBsnUdf3MaskedVer12.Builder();
    }
    public OFOxmBsnUdf3Masked bsnUdf3Masked(UDF value, UDF mask) {
        return new OFOxmBsnUdf3MaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnUdf4.Builder buildBsnUdf4() {
        return new OFOxmBsnUdf4Ver12.Builder();
    }
    public OFOxmBsnUdf4 bsnUdf4(UDF value) {
        return new OFOxmBsnUdf4Ver12(
                value
                    );
    }

    public OFOxmBsnUdf4Masked.Builder buildBsnUdf4Masked() {
        return new OFOxmBsnUdf4MaskedVer12.Builder();
    }
    public OFOxmBsnUdf4Masked bsnUdf4Masked(UDF value, UDF mask) {
        return new OFOxmBsnUdf4MaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnUdf5.Builder buildBsnUdf5() {
        return new OFOxmBsnUdf5Ver12.Builder();
    }
    public OFOxmBsnUdf5 bsnUdf5(UDF value) {
        return new OFOxmBsnUdf5Ver12(
                value
                    );
    }

    public OFOxmBsnUdf5Masked.Builder buildBsnUdf5Masked() {
        return new OFOxmBsnUdf5MaskedVer12.Builder();
    }
    public OFOxmBsnUdf5Masked bsnUdf5Masked(UDF value, UDF mask) {
        return new OFOxmBsnUdf5MaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnUdf6.Builder buildBsnUdf6() {
        return new OFOxmBsnUdf6Ver12.Builder();
    }
    public OFOxmBsnUdf6 bsnUdf6(UDF value) {
        return new OFOxmBsnUdf6Ver12(
                value
                    );
    }

    public OFOxmBsnUdf6Masked.Builder buildBsnUdf6Masked() {
        return new OFOxmBsnUdf6MaskedVer12.Builder();
    }
    public OFOxmBsnUdf6Masked bsnUdf6Masked(UDF value, UDF mask) {
        return new OFOxmBsnUdf6MaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnUdf7.Builder buildBsnUdf7() {
        return new OFOxmBsnUdf7Ver12.Builder();
    }
    public OFOxmBsnUdf7 bsnUdf7(UDF value) {
        return new OFOxmBsnUdf7Ver12(
                value
                    );
    }

    public OFOxmBsnUdf7Masked.Builder buildBsnUdf7Masked() {
        return new OFOxmBsnUdf7MaskedVer12.Builder();
    }
    public OFOxmBsnUdf7Masked bsnUdf7Masked(UDF value, UDF mask) {
        return new OFOxmBsnUdf7MaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnVlanXlatePortGroupId.Builder buildBsnVlanXlatePortGroupId() {
        return new OFOxmBsnVlanXlatePortGroupIdVer12.Builder();
    }
    public OFOxmBsnVlanXlatePortGroupId bsnVlanXlatePortGroupId(ClassId value) {
        return new OFOxmBsnVlanXlatePortGroupIdVer12(
                value
                    );
    }

    public OFOxmBsnVlanXlatePortGroupIdMasked.Builder buildBsnVlanXlatePortGroupIdMasked() {
        return new OFOxmBsnVlanXlatePortGroupIdMaskedVer12.Builder();
    }
    public OFOxmBsnVlanXlatePortGroupIdMasked bsnVlanXlatePortGroupIdMasked(ClassId value, ClassId mask) {
        return new OFOxmBsnVlanXlatePortGroupIdMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmBsnVrf.Builder buildBsnVrf() {
        return new OFOxmBsnVrfVer12.Builder();
    }
    public OFOxmBsnVrf bsnVrf(VRF value) {
        return new OFOxmBsnVrfVer12(
                value
                    );
    }

    public OFOxmBsnVrfMasked.Builder buildBsnVrfMasked() {
        return new OFOxmBsnVrfMaskedVer12.Builder();
    }
    public OFOxmBsnVrfMasked bsnVrfMasked(VRF value, VRF mask) {
        return new OFOxmBsnVrfMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmEthDst.Builder buildEthDst() {
        return new OFOxmEthDstVer12.Builder();
    }
    public OFOxmEthDst ethDst(MacAddress value) {
        return new OFOxmEthDstVer12(
                value
                    );
    }

    public OFOxmEthDstMasked.Builder buildEthDstMasked() {
        return new OFOxmEthDstMaskedVer12.Builder();
    }
    public OFOxmEthDstMasked ethDstMasked(MacAddress value, MacAddress mask) {
        return new OFOxmEthDstMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmEthSrc.Builder buildEthSrc() {
        return new OFOxmEthSrcVer12.Builder();
    }
    public OFOxmEthSrc ethSrc(MacAddress value) {
        return new OFOxmEthSrcVer12(
                value
                    );
    }

    public OFOxmEthSrcMasked.Builder buildEthSrcMasked() {
        return new OFOxmEthSrcMaskedVer12.Builder();
    }
    public OFOxmEthSrcMasked ethSrcMasked(MacAddress value, MacAddress mask) {
        return new OFOxmEthSrcMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmEthType.Builder buildEthType() {
        return new OFOxmEthTypeVer12.Builder();
    }
    public OFOxmEthType ethType(EthType value) {
        return new OFOxmEthTypeVer12(
                value
                    );
    }

    public OFOxmEthTypeMasked.Builder buildEthTypeMasked() {
        return new OFOxmEthTypeMaskedVer12.Builder();
    }
    public OFOxmEthTypeMasked ethTypeMasked(EthType value, EthType mask) {
        return new OFOxmEthTypeMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIcmpv4Code.Builder buildIcmpv4Code() {
        return new OFOxmIcmpv4CodeVer12.Builder();
    }
    public OFOxmIcmpv4Code icmpv4Code(ICMPv4Code value) {
        return new OFOxmIcmpv4CodeVer12(
                value
                    );
    }

    public OFOxmIcmpv4CodeMasked.Builder buildIcmpv4CodeMasked() {
        return new OFOxmIcmpv4CodeMaskedVer12.Builder();
    }
    public OFOxmIcmpv4CodeMasked icmpv4CodeMasked(ICMPv4Code value, ICMPv4Code mask) {
        return new OFOxmIcmpv4CodeMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIcmpv4Type.Builder buildIcmpv4Type() {
        return new OFOxmIcmpv4TypeVer12.Builder();
    }
    public OFOxmIcmpv4Type icmpv4Type(ICMPv4Type value) {
        return new OFOxmIcmpv4TypeVer12(
                value
                    );
    }

    public OFOxmIcmpv4TypeMasked.Builder buildIcmpv4TypeMasked() {
        return new OFOxmIcmpv4TypeMaskedVer12.Builder();
    }
    public OFOxmIcmpv4TypeMasked icmpv4TypeMasked(ICMPv4Type value, ICMPv4Type mask) {
        return new OFOxmIcmpv4TypeMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIcmpv6Code.Builder buildIcmpv6Code() {
        return new OFOxmIcmpv6CodeVer12.Builder();
    }
    public OFOxmIcmpv6Code icmpv6Code(U8 value) {
        return new OFOxmIcmpv6CodeVer12(
                value
                    );
    }

    public OFOxmIcmpv6CodeMasked.Builder buildIcmpv6CodeMasked() {
        return new OFOxmIcmpv6CodeMaskedVer12.Builder();
    }
    public OFOxmIcmpv6CodeMasked icmpv6CodeMasked(U8 value, U8 mask) {
        return new OFOxmIcmpv6CodeMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIcmpv6Type.Builder buildIcmpv6Type() {
        return new OFOxmIcmpv6TypeVer12.Builder();
    }
    public OFOxmIcmpv6Type icmpv6Type(U8 value) {
        return new OFOxmIcmpv6TypeVer12(
                value
                    );
    }

    public OFOxmIcmpv6TypeMasked.Builder buildIcmpv6TypeMasked() {
        return new OFOxmIcmpv6TypeMaskedVer12.Builder();
    }
    public OFOxmIcmpv6TypeMasked icmpv6TypeMasked(U8 value, U8 mask) {
        return new OFOxmIcmpv6TypeMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmInPhyPort.Builder buildInPhyPort() {
        return new OFOxmInPhyPortVer12.Builder();
    }
    public OFOxmInPhyPort inPhyPort(OFPort value) {
        return new OFOxmInPhyPortVer12(
                value
                    );
    }

    public OFOxmInPhyPortMasked.Builder buildInPhyPortMasked() {
        return new OFOxmInPhyPortMaskedVer12.Builder();
    }
    public OFOxmInPhyPortMasked inPhyPortMasked(OFPort value, OFPort mask) {
        return new OFOxmInPhyPortMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmInPort.Builder buildInPort() {
        return new OFOxmInPortVer12.Builder();
    }
    public OFOxmInPort inPort(OFPort value) {
        return new OFOxmInPortVer12(
                value
                    );
    }

    public OFOxmInPortMasked.Builder buildInPortMasked() {
        return new OFOxmInPortMaskedVer12.Builder();
    }
    public OFOxmInPortMasked inPortMasked(OFPort value, OFPort mask) {
        return new OFOxmInPortMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIpDscp.Builder buildIpDscp() {
        return new OFOxmIpDscpVer12.Builder();
    }
    public OFOxmIpDscp ipDscp(IpDscp value) {
        return new OFOxmIpDscpVer12(
                value
                    );
    }

    public OFOxmIpDscpMasked.Builder buildIpDscpMasked() {
        return new OFOxmIpDscpMaskedVer12.Builder();
    }
    public OFOxmIpDscpMasked ipDscpMasked(IpDscp value, IpDscp mask) {
        return new OFOxmIpDscpMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIpEcn.Builder buildIpEcn() {
        return new OFOxmIpEcnVer12.Builder();
    }
    public OFOxmIpEcn ipEcn(IpEcn value) {
        return new OFOxmIpEcnVer12(
                value
                    );
    }

    public OFOxmIpEcnMasked.Builder buildIpEcnMasked() {
        return new OFOxmIpEcnMaskedVer12.Builder();
    }
    public OFOxmIpEcnMasked ipEcnMasked(IpEcn value, IpEcn mask) {
        return new OFOxmIpEcnMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIpProto.Builder buildIpProto() {
        return new OFOxmIpProtoVer12.Builder();
    }
    public OFOxmIpProto ipProto(IpProtocol value) {
        return new OFOxmIpProtoVer12(
                value
                    );
    }

    public OFOxmIpProtoMasked.Builder buildIpProtoMasked() {
        return new OFOxmIpProtoMaskedVer12.Builder();
    }
    public OFOxmIpProtoMasked ipProtoMasked(IpProtocol value, IpProtocol mask) {
        return new OFOxmIpProtoMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIpv4Dst.Builder buildIpv4Dst() {
        return new OFOxmIpv4DstVer12.Builder();
    }
    public OFOxmIpv4Dst ipv4Dst(IPv4Address value) {
        return new OFOxmIpv4DstVer12(
                value
                    );
    }

    public OFOxmIpv4DstMasked.Builder buildIpv4DstMasked() {
        return new OFOxmIpv4DstMaskedVer12.Builder();
    }
    public OFOxmIpv4DstMasked ipv4DstMasked(IPv4Address value, IPv4Address mask) {
        return new OFOxmIpv4DstMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIpv4Src.Builder buildIpv4Src() {
        return new OFOxmIpv4SrcVer12.Builder();
    }
    public OFOxmIpv4Src ipv4Src(IPv4Address value) {
        return new OFOxmIpv4SrcVer12(
                value
                    );
    }

    public OFOxmIpv4SrcMasked.Builder buildIpv4SrcMasked() {
        return new OFOxmIpv4SrcMaskedVer12.Builder();
    }
    public OFOxmIpv4SrcMasked ipv4SrcMasked(IPv4Address value, IPv4Address mask) {
        return new OFOxmIpv4SrcMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIpv6Dst.Builder buildIpv6Dst() {
        return new OFOxmIpv6DstVer12.Builder();
    }
    public OFOxmIpv6Dst ipv6Dst(IPv6Address value) {
        return new OFOxmIpv6DstVer12(
                value
                    );
    }

    public OFOxmIpv6DstMasked.Builder buildIpv6DstMasked() {
        return new OFOxmIpv6DstMaskedVer12.Builder();
    }
    public OFOxmIpv6DstMasked ipv6DstMasked(IPv6Address value, IPv6Address mask) {
        return new OFOxmIpv6DstMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIpv6Flabel.Builder buildIpv6Flabel() {
        return new OFOxmIpv6FlabelVer12.Builder();
    }
    public OFOxmIpv6Flabel ipv6Flabel(IPv6FlowLabel value) {
        return new OFOxmIpv6FlabelVer12(
                value
                    );
    }

    public OFOxmIpv6FlabelMasked.Builder buildIpv6FlabelMasked() {
        return new OFOxmIpv6FlabelMaskedVer12.Builder();
    }
    public OFOxmIpv6FlabelMasked ipv6FlabelMasked(IPv6FlowLabel value, IPv6FlowLabel mask) {
        return new OFOxmIpv6FlabelMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIpv6NdSll.Builder buildIpv6NdSll() {
        return new OFOxmIpv6NdSllVer12.Builder();
    }
    public OFOxmIpv6NdSll ipv6NdSll(MacAddress value) {
        return new OFOxmIpv6NdSllVer12(
                value
                    );
    }

    public OFOxmIpv6NdSllMasked.Builder buildIpv6NdSllMasked() {
        return new OFOxmIpv6NdSllMaskedVer12.Builder();
    }
    public OFOxmIpv6NdSllMasked ipv6NdSllMasked(MacAddress value, MacAddress mask) {
        return new OFOxmIpv6NdSllMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIpv6NdTarget.Builder buildIpv6NdTarget() {
        return new OFOxmIpv6NdTargetVer12.Builder();
    }
    public OFOxmIpv6NdTarget ipv6NdTarget(IPv6Address value) {
        return new OFOxmIpv6NdTargetVer12(
                value
                    );
    }

    public OFOxmIpv6NdTargetMasked.Builder buildIpv6NdTargetMasked() {
        return new OFOxmIpv6NdTargetMaskedVer12.Builder();
    }
    public OFOxmIpv6NdTargetMasked ipv6NdTargetMasked(IPv6Address value, IPv6Address mask) {
        return new OFOxmIpv6NdTargetMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIpv6NdTll.Builder buildIpv6NdTll() {
        return new OFOxmIpv6NdTllVer12.Builder();
    }
    public OFOxmIpv6NdTll ipv6NdTll(MacAddress value) {
        return new OFOxmIpv6NdTllVer12(
                value
                    );
    }

    public OFOxmIpv6NdTllMasked.Builder buildIpv6NdTllMasked() {
        return new OFOxmIpv6NdTllMaskedVer12.Builder();
    }
    public OFOxmIpv6NdTllMasked ipv6NdTllMasked(MacAddress value, MacAddress mask) {
        return new OFOxmIpv6NdTllMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmIpv6Src.Builder buildIpv6Src() {
        return new OFOxmIpv6SrcVer12.Builder();
    }
    public OFOxmIpv6Src ipv6Src(IPv6Address value) {
        return new OFOxmIpv6SrcVer12(
                value
                    );
    }

    public OFOxmIpv6SrcMasked.Builder buildIpv6SrcMasked() {
        return new OFOxmIpv6SrcMaskedVer12.Builder();
    }
    public OFOxmIpv6SrcMasked ipv6SrcMasked(IPv6Address value, IPv6Address mask) {
        return new OFOxmIpv6SrcMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmMetadata.Builder buildMetadata() {
        return new OFOxmMetadataVer12.Builder();
    }
    public OFOxmMetadata metadata(OFMetadata value) {
        return new OFOxmMetadataVer12(
                value
                    );
    }

    public OFOxmMetadataMasked.Builder buildMetadataMasked() {
        return new OFOxmMetadataMaskedVer12.Builder();
    }
    public OFOxmMetadataMasked metadataMasked(OFMetadata value, OFMetadata mask) {
        return new OFOxmMetadataMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmMplsLabel.Builder buildMplsLabel() {
        return new OFOxmMplsLabelVer12.Builder();
    }
    public OFOxmMplsLabel mplsLabel(U32 value) {
        return new OFOxmMplsLabelVer12(
                value
                    );
    }

    public OFOxmMplsLabelMasked.Builder buildMplsLabelMasked() {
        return new OFOxmMplsLabelMaskedVer12.Builder();
    }
    public OFOxmMplsLabelMasked mplsLabelMasked(U32 value, U32 mask) {
        return new OFOxmMplsLabelMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmMplsTc.Builder buildMplsTc() {
        return new OFOxmMplsTcVer12.Builder();
    }
    public OFOxmMplsTc mplsTc(U8 value) {
        return new OFOxmMplsTcVer12(
                value
                    );
    }

    public OFOxmMplsTcMasked.Builder buildMplsTcMasked() {
        return new OFOxmMplsTcMaskedVer12.Builder();
    }
    public OFOxmMplsTcMasked mplsTcMasked(U8 value, U8 mask) {
        return new OFOxmMplsTcMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmSctpDst.Builder buildSctpDst() {
        return new OFOxmSctpDstVer12.Builder();
    }
    public OFOxmSctpDst sctpDst(TransportPort value) {
        return new OFOxmSctpDstVer12(
                value
                    );
    }

    public OFOxmSctpDstMasked.Builder buildSctpDstMasked() {
        return new OFOxmSctpDstMaskedVer12.Builder();
    }
    public OFOxmSctpDstMasked sctpDstMasked(TransportPort value, TransportPort mask) {
        return new OFOxmSctpDstMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmSctpSrc.Builder buildSctpSrc() {
        return new OFOxmSctpSrcVer12.Builder();
    }
    public OFOxmSctpSrc sctpSrc(TransportPort value) {
        return new OFOxmSctpSrcVer12(
                value
                    );
    }

    public OFOxmSctpSrcMasked.Builder buildSctpSrcMasked() {
        return new OFOxmSctpSrcMaskedVer12.Builder();
    }
    public OFOxmSctpSrcMasked sctpSrcMasked(TransportPort value, TransportPort mask) {
        return new OFOxmSctpSrcMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmTcpDst.Builder buildTcpDst() {
        return new OFOxmTcpDstVer12.Builder();
    }
    public OFOxmTcpDst tcpDst(TransportPort value) {
        return new OFOxmTcpDstVer12(
                value
                    );
    }

    public OFOxmTcpDstMasked.Builder buildTcpDstMasked() {
        return new OFOxmTcpDstMaskedVer12.Builder();
    }
    public OFOxmTcpDstMasked tcpDstMasked(TransportPort value, TransportPort mask) {
        return new OFOxmTcpDstMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmTcpSrc.Builder buildTcpSrc() {
        return new OFOxmTcpSrcVer12.Builder();
    }
    public OFOxmTcpSrc tcpSrc(TransportPort value) {
        return new OFOxmTcpSrcVer12(
                value
                    );
    }

    public OFOxmTcpSrcMasked.Builder buildTcpSrcMasked() {
        return new OFOxmTcpSrcMaskedVer12.Builder();
    }
    public OFOxmTcpSrcMasked tcpSrcMasked(TransportPort value, TransportPort mask) {
        return new OFOxmTcpSrcMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmUdpDst.Builder buildUdpDst() {
        return new OFOxmUdpDstVer12.Builder();
    }
    public OFOxmUdpDst udpDst(TransportPort value) {
        return new OFOxmUdpDstVer12(
                value
                    );
    }

    public OFOxmUdpDstMasked.Builder buildUdpDstMasked() {
        return new OFOxmUdpDstMaskedVer12.Builder();
    }
    public OFOxmUdpDstMasked udpDstMasked(TransportPort value, TransportPort mask) {
        return new OFOxmUdpDstMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmUdpSrc.Builder buildUdpSrc() {
        return new OFOxmUdpSrcVer12.Builder();
    }
    public OFOxmUdpSrc udpSrc(TransportPort value) {
        return new OFOxmUdpSrcVer12(
                value
                    );
    }

    public OFOxmUdpSrcMasked.Builder buildUdpSrcMasked() {
        return new OFOxmUdpSrcMaskedVer12.Builder();
    }
    public OFOxmUdpSrcMasked udpSrcMasked(TransportPort value, TransportPort mask) {
        return new OFOxmUdpSrcMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmVlanPcp.Builder buildVlanPcp() {
        return new OFOxmVlanPcpVer12.Builder();
    }
    public OFOxmVlanPcp vlanPcp(VlanPcp value) {
        return new OFOxmVlanPcpVer12(
                value
                    );
    }

    public OFOxmVlanPcpMasked.Builder buildVlanPcpMasked() {
        return new OFOxmVlanPcpMaskedVer12.Builder();
    }
    public OFOxmVlanPcpMasked vlanPcpMasked(VlanPcp value, VlanPcp mask) {
        return new OFOxmVlanPcpMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmVlanVid.Builder buildVlanVid() {
        return new OFOxmVlanVidVer12.Builder();
    }
    public OFOxmVlanVid vlanVid(OFVlanVidMatch value) {
        return new OFOxmVlanVidVer12(
                value
                    );
    }

    public OFOxmVlanVidMasked.Builder buildVlanVidMasked() {
        return new OFOxmVlanVidMaskedVer12.Builder();
    }
    public OFOxmVlanVidMasked vlanVidMasked(OFVlanVidMatch value, OFVlanVidMatch mask) {
        return new OFOxmVlanVidMaskedVer12(
                value,
                      mask
                    );
    }

    public OFOxmTunnelId.Builder buildTunnelId() {
        throw new UnsupportedOperationException("OFOxmTunnelId not supported in version 1.2");
    }
    public OFOxmTunnelId tunnelId(U64 value) {
        throw new UnsupportedOperationException("OFOxmTunnelId not supported in version 1.2");
    }

    public OFOxmTunnelIdMasked.Builder buildTunnelIdMasked() {
        throw new UnsupportedOperationException("OFOxmTunnelIdMasked not supported in version 1.2");
    }
    public OFOxmTunnelIdMasked tunnelIdMasked(U64 value, U64 mask) {
        throw new UnsupportedOperationException("OFOxmTunnelIdMasked not supported in version 1.2");
    }

    public OFMessageReader<OFOxm<?>> getReader() {
        return OFOxmVer12.READER;
    }

    @SuppressWarnings("unchecked")
    public <F extends OFValueType<F>> OFOxm<F> fromValue(F value, MatchField<F> field) {
        switch (field.id) {
            case ARP_OP:
                return (OFOxm<F>)((Object)arpOp((ArpOpcode)((Object)value)));
            case ARP_SHA:
                return (OFOxm<F>)((Object)arpSha((MacAddress)((Object)value)));
            case ARP_SPA:
                return (OFOxm<F>)((Object)arpSpa((IPv4Address)((Object)value)));
            case ARP_THA:
                return (OFOxm<F>)((Object)arpTha((MacAddress)((Object)value)));
            case ARP_TPA:
                return (OFOxm<F>)((Object)arpTpa((IPv4Address)((Object)value)));
            case BSN_EGR_PORT_GROUP_ID:
                return (OFOxm<F>)((Object)bsnEgrPortGroupId((ClassId)((Object)value)));
            case BSN_GLOBAL_VRF_ALLOWED:
                return (OFOxm<F>)((Object)bsnGlobalVrfAllowed((OFBooleanValue)((Object)value)));
            case BSN_IN_PORTS_128:
                return (OFOxm<F>)((Object)bsnInPorts128((OFBitMask128)((Object)value)));
            case BSN_L3_DST_CLASS_ID:
                return (OFOxm<F>)((Object)bsnL3DstClassId((ClassId)((Object)value)));
            case BSN_L3_INTERFACE_CLASS_ID:
                return (OFOxm<F>)((Object)bsnL3InterfaceClassId((ClassId)((Object)value)));
            case BSN_L3_SRC_CLASS_ID:
                return (OFOxm<F>)((Object)bsnL3SrcClassId((ClassId)((Object)value)));
            case BSN_LAG_ID:
                return (OFOxm<F>)((Object)bsnLagId((LagId)((Object)value)));
            case BSN_TCP_FLAGS:
                return (OFOxm<F>)((Object)bsnTcpFlags((U16)((Object)value)));
            case BSN_UDF0:
                return (OFOxm<F>)((Object)bsnUdf0((UDF)((Object)value)));
            case BSN_UDF1:
                return (OFOxm<F>)((Object)bsnUdf1((UDF)((Object)value)));
            case BSN_UDF2:
                return (OFOxm<F>)((Object)bsnUdf2((UDF)((Object)value)));
            case BSN_UDF3:
                return (OFOxm<F>)((Object)bsnUdf3((UDF)((Object)value)));
            case BSN_UDF4:
                return (OFOxm<F>)((Object)bsnUdf4((UDF)((Object)value)));
            case BSN_UDF5:
                return (OFOxm<F>)((Object)bsnUdf5((UDF)((Object)value)));
            case BSN_UDF6:
                return (OFOxm<F>)((Object)bsnUdf6((UDF)((Object)value)));
            case BSN_UDF7:
                return (OFOxm<F>)((Object)bsnUdf7((UDF)((Object)value)));
            case BSN_VLAN_XLATE_PORT_GROUP_ID:
                return (OFOxm<F>)((Object)bsnVlanXlatePortGroupId((ClassId)((Object)value)));
            case BSN_VRF:
                return (OFOxm<F>)((Object)bsnVrf((VRF)((Object)value)));
            case ETH_DST:
                return (OFOxm<F>)((Object)ethDst((MacAddress)((Object)value)));
            case ETH_SRC:
                return (OFOxm<F>)((Object)ethSrc((MacAddress)((Object)value)));
            case ETH_TYPE:
                return (OFOxm<F>)((Object)ethType((EthType)((Object)value)));
            case ICMPV4_CODE:
                return (OFOxm<F>)((Object)icmpv4Code((ICMPv4Code)((Object)value)));
            case ICMPV4_TYPE:
                return (OFOxm<F>)((Object)icmpv4Type((ICMPv4Type)((Object)value)));
            case ICMPV6_CODE:
                return (OFOxm<F>)((Object)icmpv6Code((U8)((Object)value)));
            case ICMPV6_TYPE:
                return (OFOxm<F>)((Object)icmpv6Type((U8)((Object)value)));
            case IN_PHY_PORT:
                return (OFOxm<F>)((Object)inPhyPort((OFPort)((Object)value)));
            case IN_PORT:
                return (OFOxm<F>)((Object)inPort((OFPort)((Object)value)));
            case IP_DSCP:
                return (OFOxm<F>)((Object)ipDscp((IpDscp)((Object)value)));
            case IP_ECN:
                return (OFOxm<F>)((Object)ipEcn((IpEcn)((Object)value)));
            case IP_PROTO:
                return (OFOxm<F>)((Object)ipProto((IpProtocol)((Object)value)));
            case IPV4_DST:
                return (OFOxm<F>)((Object)ipv4Dst((IPv4Address)((Object)value)));
            case IPV4_SRC:
                return (OFOxm<F>)((Object)ipv4Src((IPv4Address)((Object)value)));
            case IPV6_DST:
                return (OFOxm<F>)((Object)ipv6Dst((IPv6Address)((Object)value)));
            case IPV6_FLABEL:
                return (OFOxm<F>)((Object)ipv6Flabel((IPv6FlowLabel)((Object)value)));
            case IPV6_ND_SLL:
                return (OFOxm<F>)((Object)ipv6NdSll((MacAddress)((Object)value)));
            case IPV6_ND_TARGET:
                return (OFOxm<F>)((Object)ipv6NdTarget((IPv6Address)((Object)value)));
            case IPV6_ND_TLL:
                return (OFOxm<F>)((Object)ipv6NdTll((MacAddress)((Object)value)));
            case IPV6_SRC:
                return (OFOxm<F>)((Object)ipv6Src((IPv6Address)((Object)value)));
            case METADATA:
                return (OFOxm<F>)((Object)metadata((OFMetadata)((Object)value)));
            case MPLS_LABEL:
                return (OFOxm<F>)((Object)mplsLabel((U32)((Object)value)));
            case MPLS_TC:
                return (OFOxm<F>)((Object)mplsTc((U8)((Object)value)));
            case SCTP_DST:
                return (OFOxm<F>)((Object)sctpDst((TransportPort)((Object)value)));
            case SCTP_SRC:
                return (OFOxm<F>)((Object)sctpSrc((TransportPort)((Object)value)));
            case TCP_DST:
                return (OFOxm<F>)((Object)tcpDst((TransportPort)((Object)value)));
            case TCP_SRC:
                return (OFOxm<F>)((Object)tcpSrc((TransportPort)((Object)value)));
            case UDP_DST:
                return (OFOxm<F>)((Object)udpDst((TransportPort)((Object)value)));
            case UDP_SRC:
                return (OFOxm<F>)((Object)udpSrc((TransportPort)((Object)value)));
            case VLAN_PCP:
                return (OFOxm<F>)((Object)vlanPcp((VlanPcp)((Object)value)));
            case VLAN_VID:
                return (OFOxm<F>)((Object)vlanVid((OFVlanVidMatch)((Object)value)));
            case TUNNEL_ID:
                return (OFOxm<F>)((Object)tunnelId((U64)((Object)value)));
            default:
                throw new IllegalArgumentException("No OXM known for match field " + field);
        }
    }

    @SuppressWarnings("unchecked")
    public <F extends OFValueType<F>> OFOxm<F> fromValueAndMask(F value, F mask, MatchField<F> field) {
        switch (field.id) {
            case ARP_OP:
                return (OFOxm<F>)((Object)arpOpMasked((ArpOpcode)((Object)value), (ArpOpcode)((Object)mask)));
            case ARP_SHA:
                return (OFOxm<F>)((Object)arpShaMasked((MacAddress)((Object)value), (MacAddress)((Object)mask)));
            case ARP_SPA:
                return (OFOxm<F>)((Object)arpSpaMasked((IPv4Address)((Object)value), (IPv4Address)((Object)mask)));
            case ARP_THA:
                return (OFOxm<F>)((Object)arpThaMasked((MacAddress)((Object)value), (MacAddress)((Object)mask)));
            case ARP_TPA:
                return (OFOxm<F>)((Object)arpTpaMasked((IPv4Address)((Object)value), (IPv4Address)((Object)mask)));
            case BSN_EGR_PORT_GROUP_ID:
                return (OFOxm<F>)((Object)bsnEgrPortGroupIdMasked((ClassId)((Object)value), (ClassId)((Object)mask)));
            case BSN_GLOBAL_VRF_ALLOWED:
                return (OFOxm<F>)((Object)bsnGlobalVrfAllowedMasked((OFBooleanValue)((Object)value), (OFBooleanValue)((Object)mask)));
            case BSN_IN_PORTS_128:
                return (OFOxm<F>)((Object)bsnInPorts128Masked((OFBitMask128)((Object)value), (OFBitMask128)((Object)mask)));
            case BSN_L3_DST_CLASS_ID:
                return (OFOxm<F>)((Object)bsnL3DstClassIdMasked((ClassId)((Object)value), (ClassId)((Object)mask)));
            case BSN_L3_INTERFACE_CLASS_ID:
                return (OFOxm<F>)((Object)bsnL3InterfaceClassIdMasked((ClassId)((Object)value), (ClassId)((Object)mask)));
            case BSN_L3_SRC_CLASS_ID:
                return (OFOxm<F>)((Object)bsnL3SrcClassIdMasked((ClassId)((Object)value), (ClassId)((Object)mask)));
            case BSN_LAG_ID:
                return (OFOxm<F>)((Object)bsnLagIdMasked((LagId)((Object)value), (LagId)((Object)mask)));
            case BSN_TCP_FLAGS:
                return (OFOxm<F>)((Object)bsnTcpFlagsMasked((U16)((Object)value), (U16)((Object)mask)));
            case BSN_UDF0:
                return (OFOxm<F>)((Object)bsnUdf0Masked((UDF)((Object)value), (UDF)((Object)mask)));
            case BSN_UDF1:
                return (OFOxm<F>)((Object)bsnUdf1Masked((UDF)((Object)value), (UDF)((Object)mask)));
            case BSN_UDF2:
                return (OFOxm<F>)((Object)bsnUdf2Masked((UDF)((Object)value), (UDF)((Object)mask)));
            case BSN_UDF3:
                return (OFOxm<F>)((Object)bsnUdf3Masked((UDF)((Object)value), (UDF)((Object)mask)));
            case BSN_UDF4:
                return (OFOxm<F>)((Object)bsnUdf4Masked((UDF)((Object)value), (UDF)((Object)mask)));
            case BSN_UDF5:
                return (OFOxm<F>)((Object)bsnUdf5Masked((UDF)((Object)value), (UDF)((Object)mask)));
            case BSN_UDF6:
                return (OFOxm<F>)((Object)bsnUdf6Masked((UDF)((Object)value), (UDF)((Object)mask)));
            case BSN_UDF7:
                return (OFOxm<F>)((Object)bsnUdf7Masked((UDF)((Object)value), (UDF)((Object)mask)));
            case BSN_VLAN_XLATE_PORT_GROUP_ID:
                return (OFOxm<F>)((Object)bsnVlanXlatePortGroupIdMasked((ClassId)((Object)value), (ClassId)((Object)mask)));
            case BSN_VRF:
                return (OFOxm<F>)((Object)bsnVrfMasked((VRF)((Object)value), (VRF)((Object)mask)));
            case ETH_DST:
                return (OFOxm<F>)((Object)ethDstMasked((MacAddress)((Object)value), (MacAddress)((Object)mask)));
            case ETH_SRC:
                return (OFOxm<F>)((Object)ethSrcMasked((MacAddress)((Object)value), (MacAddress)((Object)mask)));
            case ETH_TYPE:
                return (OFOxm<F>)((Object)ethTypeMasked((EthType)((Object)value), (EthType)((Object)mask)));
            case ICMPV4_CODE:
                return (OFOxm<F>)((Object)icmpv4CodeMasked((ICMPv4Code)((Object)value), (ICMPv4Code)((Object)mask)));
            case ICMPV4_TYPE:
                return (OFOxm<F>)((Object)icmpv4TypeMasked((ICMPv4Type)((Object)value), (ICMPv4Type)((Object)mask)));
            case ICMPV6_CODE:
                return (OFOxm<F>)((Object)icmpv6CodeMasked((U8)((Object)value), (U8)((Object)mask)));
            case ICMPV6_TYPE:
                return (OFOxm<F>)((Object)icmpv6TypeMasked((U8)((Object)value), (U8)((Object)mask)));
            case IN_PHY_PORT:
                return (OFOxm<F>)((Object)inPhyPortMasked((OFPort)((Object)value), (OFPort)((Object)mask)));
            case IN_PORT:
                return (OFOxm<F>)((Object)inPortMasked((OFPort)((Object)value), (OFPort)((Object)mask)));
            case IP_DSCP:
                return (OFOxm<F>)((Object)ipDscpMasked((IpDscp)((Object)value), (IpDscp)((Object)mask)));
            case IP_ECN:
                return (OFOxm<F>)((Object)ipEcnMasked((IpEcn)((Object)value), (IpEcn)((Object)mask)));
            case IP_PROTO:
                return (OFOxm<F>)((Object)ipProtoMasked((IpProtocol)((Object)value), (IpProtocol)((Object)mask)));
            case IPV4_DST:
                return (OFOxm<F>)((Object)ipv4DstMasked((IPv4Address)((Object)value), (IPv4Address)((Object)mask)));
            case IPV4_SRC:
                return (OFOxm<F>)((Object)ipv4SrcMasked((IPv4Address)((Object)value), (IPv4Address)((Object)mask)));
            case IPV6_DST:
                return (OFOxm<F>)((Object)ipv6DstMasked((IPv6Address)((Object)value), (IPv6Address)((Object)mask)));
            case IPV6_FLABEL:
                return (OFOxm<F>)((Object)ipv6FlabelMasked((IPv6FlowLabel)((Object)value), (IPv6FlowLabel)((Object)mask)));
            case IPV6_ND_SLL:
                return (OFOxm<F>)((Object)ipv6NdSllMasked((MacAddress)((Object)value), (MacAddress)((Object)mask)));
            case IPV6_ND_TARGET:
                return (OFOxm<F>)((Object)ipv6NdTargetMasked((IPv6Address)((Object)value), (IPv6Address)((Object)mask)));
            case IPV6_ND_TLL:
                return (OFOxm<F>)((Object)ipv6NdTllMasked((MacAddress)((Object)value), (MacAddress)((Object)mask)));
            case IPV6_SRC:
                return (OFOxm<F>)((Object)ipv6SrcMasked((IPv6Address)((Object)value), (IPv6Address)((Object)mask)));
            case METADATA:
                return (OFOxm<F>)((Object)metadataMasked((OFMetadata)((Object)value), (OFMetadata)((Object)mask)));
            case MPLS_LABEL:
                return (OFOxm<F>)((Object)mplsLabelMasked((U32)((Object)value), (U32)((Object)mask)));
            case MPLS_TC:
                return (OFOxm<F>)((Object)mplsTcMasked((U8)((Object)value), (U8)((Object)mask)));
            case SCTP_DST:
                return (OFOxm<F>)((Object)sctpDstMasked((TransportPort)((Object)value), (TransportPort)((Object)mask)));
            case SCTP_SRC:
                return (OFOxm<F>)((Object)sctpSrcMasked((TransportPort)((Object)value), (TransportPort)((Object)mask)));
            case TCP_DST:
                return (OFOxm<F>)((Object)tcpDstMasked((TransportPort)((Object)value), (TransportPort)((Object)mask)));
            case TCP_SRC:
                return (OFOxm<F>)((Object)tcpSrcMasked((TransportPort)((Object)value), (TransportPort)((Object)mask)));
            case UDP_DST:
                return (OFOxm<F>)((Object)udpDstMasked((TransportPort)((Object)value), (TransportPort)((Object)mask)));
            case UDP_SRC:
                return (OFOxm<F>)((Object)udpSrcMasked((TransportPort)((Object)value), (TransportPort)((Object)mask)));
            case VLAN_PCP:
                return (OFOxm<F>)((Object)vlanPcpMasked((VlanPcp)((Object)value), (VlanPcp)((Object)mask)));
            case VLAN_VID:
                return (OFOxm<F>)((Object)vlanVidMasked((OFVlanVidMatch)((Object)value), (OFVlanVidMatch)((Object)mask)));
            case TUNNEL_ID:
                return (OFOxm<F>)((Object)tunnelIdMasked((U64)((Object)value), (U64)((Object)mask)));
            default:
                throw new IllegalArgumentException("No OXM known for match field " + field);
        }
    }

    @SuppressWarnings("unchecked")
    public <F extends OFValueType<F>> OFOxm<F> fromMasked(Masked<F> masked, MatchField<F> field) {
        switch (field.id) {
            case ARP_OP:
                return (OFOxm<F>)((Object)arpOpMasked((ArpOpcode)((Object)(masked.getValue())), (ArpOpcode)((Object)(masked.getMask()))));
            case ARP_SHA:
                return (OFOxm<F>)((Object)arpShaMasked((MacAddress)((Object)(masked.getValue())), (MacAddress)((Object)(masked.getMask()))));
            case ARP_SPA:
                return (OFOxm<F>)((Object)arpSpaMasked((IPv4Address)((Object)(masked.getValue())), (IPv4Address)((Object)(masked.getMask()))));
            case ARP_THA:
                return (OFOxm<F>)((Object)arpThaMasked((MacAddress)((Object)(masked.getValue())), (MacAddress)((Object)(masked.getMask()))));
            case ARP_TPA:
                return (OFOxm<F>)((Object)arpTpaMasked((IPv4Address)((Object)(masked.getValue())), (IPv4Address)((Object)(masked.getMask()))));
            case BSN_EGR_PORT_GROUP_ID:
                return (OFOxm<F>)((Object)bsnEgrPortGroupIdMasked((ClassId)((Object)(masked.getValue())), (ClassId)((Object)(masked.getMask()))));
            case BSN_GLOBAL_VRF_ALLOWED:
                return (OFOxm<F>)((Object)bsnGlobalVrfAllowedMasked((OFBooleanValue)((Object)(masked.getValue())), (OFBooleanValue)((Object)(masked.getMask()))));
            case BSN_IN_PORTS_128:
                return (OFOxm<F>)((Object)bsnInPorts128Masked((OFBitMask128)((Object)(masked.getValue())), (OFBitMask128)((Object)(masked.getMask()))));
            case BSN_L3_DST_CLASS_ID:
                return (OFOxm<F>)((Object)bsnL3DstClassIdMasked((ClassId)((Object)(masked.getValue())), (ClassId)((Object)(masked.getMask()))));
            case BSN_L3_INTERFACE_CLASS_ID:
                return (OFOxm<F>)((Object)bsnL3InterfaceClassIdMasked((ClassId)((Object)(masked.getValue())), (ClassId)((Object)(masked.getMask()))));
            case BSN_L3_SRC_CLASS_ID:
                return (OFOxm<F>)((Object)bsnL3SrcClassIdMasked((ClassId)((Object)(masked.getValue())), (ClassId)((Object)(masked.getMask()))));
            case BSN_LAG_ID:
                return (OFOxm<F>)((Object)bsnLagIdMasked((LagId)((Object)(masked.getValue())), (LagId)((Object)(masked.getMask()))));
            case BSN_TCP_FLAGS:
                return (OFOxm<F>)((Object)bsnTcpFlagsMasked((U16)((Object)(masked.getValue())), (U16)((Object)(masked.getMask()))));
            case BSN_UDF0:
                return (OFOxm<F>)((Object)bsnUdf0Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
            case BSN_UDF1:
                return (OFOxm<F>)((Object)bsnUdf1Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
            case BSN_UDF2:
                return (OFOxm<F>)((Object)bsnUdf2Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
            case BSN_UDF3:
                return (OFOxm<F>)((Object)bsnUdf3Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
            case BSN_UDF4:
                return (OFOxm<F>)((Object)bsnUdf4Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
            case BSN_UDF5:
                return (OFOxm<F>)((Object)bsnUdf5Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
            case BSN_UDF6:
                return (OFOxm<F>)((Object)bsnUdf6Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
            case BSN_UDF7:
                return (OFOxm<F>)((Object)bsnUdf7Masked((UDF)((Object)(masked.getValue())), (UDF)((Object)(masked.getMask()))));
            case BSN_VLAN_XLATE_PORT_GROUP_ID:
                return (OFOxm<F>)((Object)bsnVlanXlatePortGroupIdMasked((ClassId)((Object)(masked.getValue())), (ClassId)((Object)(masked.getMask()))));
            case BSN_VRF:
                return (OFOxm<F>)((Object)bsnVrfMasked((VRF)((Object)(masked.getValue())), (VRF)((Object)(masked.getMask()))));
            case ETH_DST:
                return (OFOxm<F>)((Object)ethDstMasked((MacAddress)((Object)(masked.getValue())), (MacAddress)((Object)(masked.getMask()))));
            case ETH_SRC:
                return (OFOxm<F>)((Object)ethSrcMasked((MacAddress)((Object)(masked.getValue())), (MacAddress)((Object)(masked.getMask()))));
            case ETH_TYPE:
                return (OFOxm<F>)((Object)ethTypeMasked((EthType)((Object)(masked.getValue())), (EthType)((Object)(masked.getMask()))));
            case ICMPV4_CODE:
                return (OFOxm<F>)((Object)icmpv4CodeMasked((ICMPv4Code)((Object)(masked.getValue())), (ICMPv4Code)((Object)(masked.getMask()))));
            case ICMPV4_TYPE:
                return (OFOxm<F>)((Object)icmpv4TypeMasked((ICMPv4Type)((Object)(masked.getValue())), (ICMPv4Type)((Object)(masked.getMask()))));
            case ICMPV6_CODE:
                return (OFOxm<F>)((Object)icmpv6CodeMasked((U8)((Object)(masked.getValue())), (U8)((Object)(masked.getMask()))));
            case ICMPV6_TYPE:
                return (OFOxm<F>)((Object)icmpv6TypeMasked((U8)((Object)(masked.getValue())), (U8)((Object)(masked.getMask()))));
            case IN_PHY_PORT:
                return (OFOxm<F>)((Object)inPhyPortMasked((OFPort)((Object)(masked.getValue())), (OFPort)((Object)(masked.getMask()))));
            case IN_PORT:
                return (OFOxm<F>)((Object)inPortMasked((OFPort)((Object)(masked.getValue())), (OFPort)((Object)(masked.getMask()))));
            case IP_DSCP:
                return (OFOxm<F>)((Object)ipDscpMasked((IpDscp)((Object)(masked.getValue())), (IpDscp)((Object)(masked.getMask()))));
            case IP_ECN:
                return (OFOxm<F>)((Object)ipEcnMasked((IpEcn)((Object)(masked.getValue())), (IpEcn)((Object)(masked.getMask()))));
            case IP_PROTO:
                return (OFOxm<F>)((Object)ipProtoMasked((IpProtocol)((Object)(masked.getValue())), (IpProtocol)((Object)(masked.getMask()))));
            case IPV4_DST:
                return (OFOxm<F>)((Object)ipv4DstMasked((IPv4Address)((Object)(masked.getValue())), (IPv4Address)((Object)(masked.getMask()))));
            case IPV4_SRC:
                return (OFOxm<F>)((Object)ipv4SrcMasked((IPv4Address)((Object)(masked.getValue())), (IPv4Address)((Object)(masked.getMask()))));
            case IPV6_DST:
                return (OFOxm<F>)((Object)ipv6DstMasked((IPv6Address)((Object)(masked.getValue())), (IPv6Address)((Object)(masked.getMask()))));
            case IPV6_FLABEL:
                return (OFOxm<F>)((Object)ipv6FlabelMasked((IPv6FlowLabel)((Object)(masked.getValue())), (IPv6FlowLabel)((Object)(masked.getMask()))));
            case IPV6_ND_SLL:
                return (OFOxm<F>)((Object)ipv6NdSllMasked((MacAddress)((Object)(masked.getValue())), (MacAddress)((Object)(masked.getMask()))));
            case IPV6_ND_TARGET:
                return (OFOxm<F>)((Object)ipv6NdTargetMasked((IPv6Address)((Object)(masked.getValue())), (IPv6Address)((Object)(masked.getMask()))));
            case IPV6_ND_TLL:
                return (OFOxm<F>)((Object)ipv6NdTllMasked((MacAddress)((Object)(masked.getValue())), (MacAddress)((Object)(masked.getMask()))));
            case IPV6_SRC:
                return (OFOxm<F>)((Object)ipv6SrcMasked((IPv6Address)((Object)(masked.getValue())), (IPv6Address)((Object)(masked.getMask()))));
            case METADATA:
                return (OFOxm<F>)((Object)metadataMasked((OFMetadata)((Object)(masked.getValue())), (OFMetadata)((Object)(masked.getMask()))));
            case MPLS_LABEL:
                return (OFOxm<F>)((Object)mplsLabelMasked((U32)((Object)(masked.getValue())), (U32)((Object)(masked.getMask()))));
            case MPLS_TC:
                return (OFOxm<F>)((Object)mplsTcMasked((U8)((Object)(masked.getValue())), (U8)((Object)(masked.getMask()))));
            case SCTP_DST:
                return (OFOxm<F>)((Object)sctpDstMasked((TransportPort)((Object)(masked.getValue())), (TransportPort)((Object)(masked.getMask()))));
            case SCTP_SRC:
                return (OFOxm<F>)((Object)sctpSrcMasked((TransportPort)((Object)(masked.getValue())), (TransportPort)((Object)(masked.getMask()))));
            case TCP_DST:
                return (OFOxm<F>)((Object)tcpDstMasked((TransportPort)((Object)(masked.getValue())), (TransportPort)((Object)(masked.getMask()))));
            case TCP_SRC:
                return (OFOxm<F>)((Object)tcpSrcMasked((TransportPort)((Object)(masked.getValue())), (TransportPort)((Object)(masked.getMask()))));
            case UDP_DST:
                return (OFOxm<F>)((Object)udpDstMasked((TransportPort)((Object)(masked.getValue())), (TransportPort)((Object)(masked.getMask()))));
            case UDP_SRC:
                return (OFOxm<F>)((Object)udpSrcMasked((TransportPort)((Object)(masked.getValue())), (TransportPort)((Object)(masked.getMask()))));
            case VLAN_PCP:
                return (OFOxm<F>)((Object)vlanPcpMasked((VlanPcp)((Object)(masked.getValue())), (VlanPcp)((Object)(masked.getMask()))));
            case VLAN_VID:
                return (OFOxm<F>)((Object)vlanVidMasked((OFVlanVidMatch)((Object)(masked.getValue())), (OFVlanVidMatch)((Object)(masked.getMask()))));
            case TUNNEL_ID:
                return (OFOxm<F>)((Object)tunnelIdMasked((U64)((Object)(masked.getValue())), (U64)((Object)(masked.getMask()))));
            default:
                return null;
        }
    }

    public OFVersion getVersion() {
            return OFVersion.OF_12;
    }
}
