// 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.ver13;

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 OFOxmsVer13 implements OFOxms {
    public final static OFOxmsVer13 INSTANCE = new OFOxmsVer13();




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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    public OFOxmTunnelId.Builder buildTunnelId() {
        return new OFOxmTunnelIdVer13.Builder();
    }
    public OFOxmTunnelId tunnelId(U64 value) {
        return new OFOxmTunnelIdVer13(
                value
                    );
    }

    public OFOxmTunnelIdMasked.Builder buildTunnelIdMasked() {
        return new OFOxmTunnelIdMaskedVer13.Builder();
    }
    public OFOxmTunnelIdMasked tunnelIdMasked(U64 value, U64 mask) {
        return new OFOxmTunnelIdMaskedVer13(
                value,
                      mask
                    );
    }

    public OFMessageReader<OFOxm<?>> getReader() {
        return OFOxmVer13.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_13;
    }
}
