// 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.*;
import java.util.Set;
import java.util.List;
import org.projectfloodlight.openflow.protocol.OFOxmList;


public class OFFactoryVer12 implements OFFactory {
    public final static OFFactoryVer12 INSTANCE = new OFFactoryVer12();

    private final XidGenerator xidGenerator = XidGenerators.global();

    public OFActions actions() {
        return OFActionsVer12.INSTANCE;
    }
    public OFInstructions instructions() {
        return OFInstructionsVer12.INSTANCE;
    }
    public OFMeterBands meterBands() {
        return OFMeterBandsVer12.INSTANCE;
    }
    public OFOxms oxms() {
        return OFOxmsVer12.INSTANCE;
    }
    public OFQueueProps queueProps() {
        return OFQueuePropsVer12.INSTANCE;
    }
    public OFErrorMsgs errorMsgs() {
        return OFErrorMsgsVer12.INSTANCE;
    }
    public OFActionIds actionIds() {
        return OFActionIdsVer12.INSTANCE;
    }
    public OFInstructionIds instructionIds() {
        return OFInstructionIdsVer12.INSTANCE;
    }
    public OFBsnTlvs bsnTlvs() {
        return OFBsnTlvsVer12.INSTANCE;
    }


    public OFAggregateStatsReply.Builder buildAggregateStatsReply() {
        return new OFAggregateStatsReplyVer12.Builder().setXid(nextXid());
    }

    public OFAggregateStatsRequest.Builder buildAggregateStatsRequest() {
        return new OFAggregateStatsRequestVer12.Builder().setXid(nextXid());
    }

    public OFBarrierReply.Builder buildBarrierReply() {
        return new OFBarrierReplyVer12.Builder().setXid(nextXid());
    }
    public OFBarrierReply barrierReply() {
        return new OFBarrierReplyVer12(
                nextXid()
                    );
    }

    public OFBarrierRequest.Builder buildBarrierRequest() {
        return new OFBarrierRequestVer12.Builder().setXid(nextXid());
    }
    public OFBarrierRequest barrierRequest() {
        return new OFBarrierRequestVer12(
                nextXid()
                    );
    }

    public OFBsnBwClearDataReply.Builder buildBsnBwClearDataReply() {
        return new OFBsnBwClearDataReplyVer12.Builder().setXid(nextXid());
    }
    public OFBsnBwClearDataReply bsnBwClearDataReply(long status) {
        return new OFBsnBwClearDataReplyVer12(
                nextXid(),
                      status
                    );
    }

    public OFBsnBwClearDataRequest.Builder buildBsnBwClearDataRequest() {
        return new OFBsnBwClearDataRequestVer12.Builder().setXid(nextXid());
    }
    public OFBsnBwClearDataRequest bsnBwClearDataRequest() {
        return new OFBsnBwClearDataRequestVer12(
                nextXid()
                    );
    }

    public OFBsnBwEnableGetReply.Builder buildBsnBwEnableGetReply() {
        return new OFBsnBwEnableGetReplyVer12.Builder().setXid(nextXid());
    }
    public OFBsnBwEnableGetReply bsnBwEnableGetReply(long enabled) {
        return new OFBsnBwEnableGetReplyVer12(
                nextXid(),
                      enabled
                    );
    }

    public OFBsnBwEnableGetRequest.Builder buildBsnBwEnableGetRequest() {
        return new OFBsnBwEnableGetRequestVer12.Builder().setXid(nextXid());
    }
    public OFBsnBwEnableGetRequest bsnBwEnableGetRequest() {
        return new OFBsnBwEnableGetRequestVer12(
                nextXid()
                    );
    }

    public OFBsnBwEnableSetReply.Builder buildBsnBwEnableSetReply() {
        return new OFBsnBwEnableSetReplyVer12.Builder().setXid(nextXid());
    }

    public OFBsnBwEnableSetRequest.Builder buildBsnBwEnableSetRequest() {
        return new OFBsnBwEnableSetRequestVer12.Builder().setXid(nextXid());
    }
    public OFBsnBwEnableSetRequest bsnBwEnableSetRequest(long enable) {
        return new OFBsnBwEnableSetRequestVer12(
                nextXid(),
                      enable
                    );
    }

    public OFBsnGetInterfacesReply.Builder buildBsnGetInterfacesReply() {
        return new OFBsnGetInterfacesReplyVer12.Builder().setXid(nextXid());
    }
    public OFBsnGetInterfacesReply bsnGetInterfacesReply(List<OFBsnInterface> interfaces) {
        return new OFBsnGetInterfacesReplyVer12(
                nextXid(),
                      interfaces
                    );
    }

    public OFBsnGetInterfacesRequest.Builder buildBsnGetInterfacesRequest() {
        return new OFBsnGetInterfacesRequestVer12.Builder().setXid(nextXid());
    }
    public OFBsnGetInterfacesRequest bsnGetInterfacesRequest() {
        return new OFBsnGetInterfacesRequestVer12(
                nextXid()
                    );
    }

    public OFBsnGetIpMaskReply.Builder buildBsnGetIpMaskReply() {
        throw new UnsupportedOperationException("OFBsnGetIpMaskReply not supported in version 1.2");
    }

    public OFBsnGetIpMaskRequest.Builder buildBsnGetIpMaskRequest() {
        throw new UnsupportedOperationException("OFBsnGetIpMaskRequest not supported in version 1.2");
    }
    public OFBsnGetIpMaskRequest bsnGetIpMaskRequest(short index) {
        throw new UnsupportedOperationException("OFBsnGetIpMaskRequest not supported in version 1.2");
    }

    public OFBsnGetL2TableReply.Builder buildBsnGetL2TableReply() {
        throw new UnsupportedOperationException("OFBsnGetL2TableReply not supported in version 1.2");
    }

    public OFBsnGetL2TableRequest.Builder buildBsnGetL2TableRequest() {
        throw new UnsupportedOperationException("OFBsnGetL2TableRequest not supported in version 1.2");
    }
    public OFBsnGetL2TableRequest bsnGetL2TableRequest() {
        throw new UnsupportedOperationException("OFBsnGetL2TableRequest not supported in version 1.2");
    }

    public OFBsnGetMirroringReply.Builder buildBsnGetMirroringReply() {
        return new OFBsnGetMirroringReplyVer12.Builder().setXid(nextXid());
    }
    public OFBsnGetMirroringReply bsnGetMirroringReply(short reportMirrorPorts) {
        return new OFBsnGetMirroringReplyVer12(
                nextXid(),
                      reportMirrorPorts
                    );
    }

    public OFBsnGetMirroringRequest.Builder buildBsnGetMirroringRequest() {
        return new OFBsnGetMirroringRequestVer12.Builder().setXid(nextXid());
    }
    public OFBsnGetMirroringRequest bsnGetMirroringRequest(short reportMirrorPorts) {
        return new OFBsnGetMirroringRequestVer12(
                nextXid(),
                      reportMirrorPorts
                    );
    }

    public OFBsnHybridGetReply.Builder buildBsnHybridGetReply() {
        throw new UnsupportedOperationException("OFBsnHybridGetReply not supported in version 1.2");
    }

    public OFBsnHybridGetRequest.Builder buildBsnHybridGetRequest() {
        throw new UnsupportedOperationException("OFBsnHybridGetRequest not supported in version 1.2");
    }
    public OFBsnHybridGetRequest bsnHybridGetRequest() {
        throw new UnsupportedOperationException("OFBsnHybridGetRequest not supported in version 1.2");
    }

    public OFBsnInterface.Builder buildBsnInterface() {
        return new OFBsnInterfaceVer12.Builder();
    }

    public OFBsnPduRxReply.Builder buildBsnPduRxReply() {
        return new OFBsnPduRxReplyVer12.Builder().setXid(nextXid());
    }

    public OFBsnPduRxRequest.Builder buildBsnPduRxRequest() {
        return new OFBsnPduRxRequestVer12.Builder().setXid(nextXid());
    }

    public OFBsnPduRxTimeout.Builder buildBsnPduRxTimeout() {
        return new OFBsnPduRxTimeoutVer12.Builder().setXid(nextXid());
    }

    public OFBsnPduTxReply.Builder buildBsnPduTxReply() {
        return new OFBsnPduTxReplyVer12.Builder().setXid(nextXid());
    }

    public OFBsnPduTxRequest.Builder buildBsnPduTxRequest() {
        return new OFBsnPduTxRequestVer12.Builder().setXid(nextXid());
    }

    public OFBsnSetIpMask.Builder buildBsnSetIpMask() {
        throw new UnsupportedOperationException("OFBsnSetIpMask not supported in version 1.2");
    }

    public OFBsnSetL2TableReply.Builder buildBsnSetL2TableReply() {
        throw new UnsupportedOperationException("OFBsnSetL2TableReply not supported in version 1.2");
    }

    public OFBsnSetL2TableRequest.Builder buildBsnSetL2TableRequest() {
        throw new UnsupportedOperationException("OFBsnSetL2TableRequest not supported in version 1.2");
    }

    public OFBsnSetMirroring.Builder buildBsnSetMirroring() {
        return new OFBsnSetMirroringVer12.Builder().setXid(nextXid());
    }
    public OFBsnSetMirroring bsnSetMirroring(short reportMirrorPorts) {
        return new OFBsnSetMirroringVer12(
                nextXid(),
                      reportMirrorPorts
                    );
    }

    public OFBsnSetPktinSuppressionReply.Builder buildBsnSetPktinSuppressionReply() {
        return new OFBsnSetPktinSuppressionReplyVer12.Builder().setXid(nextXid());
    }
    public OFBsnSetPktinSuppressionReply bsnSetPktinSuppressionReply(long status) {
        return new OFBsnSetPktinSuppressionReplyVer12(
                nextXid(),
                      status
                    );
    }

    public OFBsnSetPktinSuppressionRequest.Builder buildBsnSetPktinSuppressionRequest() {
        return new OFBsnSetPktinSuppressionRequestVer12.Builder().setXid(nextXid());
    }

    public OFBsnShellCommand.Builder buildBsnShellCommand() {
        throw new UnsupportedOperationException("OFBsnShellCommand not supported in version 1.2");
    }

    public OFBsnShellOutput.Builder buildBsnShellOutput() {
        throw new UnsupportedOperationException("OFBsnShellOutput not supported in version 1.2");
    }
    public OFBsnShellOutput bsnShellOutput(byte[] data) {
        throw new UnsupportedOperationException("OFBsnShellOutput not supported in version 1.2");
    }

    public OFBsnShellStatus.Builder buildBsnShellStatus() {
        throw new UnsupportedOperationException("OFBsnShellStatus not supported in version 1.2");
    }
    public OFBsnShellStatus bsnShellStatus(long status) {
        throw new UnsupportedOperationException("OFBsnShellStatus not supported in version 1.2");
    }

    public OFBsnVirtualPortCreateReply.Builder buildBsnVirtualPortCreateReply() {
        return new OFBsnVirtualPortCreateReplyVer12.Builder().setXid(nextXid());
    }

    public OFBsnVirtualPortCreateRequest.Builder buildBsnVirtualPortCreateRequest() {
        return new OFBsnVirtualPortCreateRequestVer12.Builder().setXid(nextXid());
    }
    public OFBsnVirtualPortCreateRequest bsnVirtualPortCreateRequest(OFBsnVport vport) {
        return new OFBsnVirtualPortCreateRequestVer12(
                nextXid(),
                      vport
                    );
    }

    public OFBsnVirtualPortRemoveReply.Builder buildBsnVirtualPortRemoveReply() {
        return new OFBsnVirtualPortRemoveReplyVer12.Builder().setXid(nextXid());
    }
    public OFBsnVirtualPortRemoveReply bsnVirtualPortRemoveReply(long status) {
        return new OFBsnVirtualPortRemoveReplyVer12(
                nextXid(),
                      status
                    );
    }

    public OFBsnVirtualPortRemoveRequest.Builder buildBsnVirtualPortRemoveRequest() {
        return new OFBsnVirtualPortRemoveRequestVer12.Builder().setXid(nextXid());
    }
    public OFBsnVirtualPortRemoveRequest bsnVirtualPortRemoveRequest(long vportNo) {
        return new OFBsnVirtualPortRemoveRequestVer12(
                nextXid(),
                      vportNo
                    );
    }

    public OFBsnVportL2Gre.Builder buildBsnVportL2Gre() {
        return new OFBsnVportL2GreVer12.Builder();
    }

    public OFBsnVportQInQ.Builder buildBsnVportQInQ() {
        return new OFBsnVportQInQVer12.Builder();
    }

    public OFDescStatsReply.Builder buildDescStatsReply() {
        return new OFDescStatsReplyVer12.Builder().setXid(nextXid());
    }

    public OFDescStatsRequest.Builder buildDescStatsRequest() {
        return new OFDescStatsRequestVer12.Builder().setXid(nextXid());
    }
    public OFDescStatsRequest descStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFDescStatsRequestVer12(
                nextXid(),
                      flags
                    );
    }

    public OFEchoReply.Builder buildEchoReply() {
        return new OFEchoReplyVer12.Builder().setXid(nextXid());
    }
    public OFEchoReply echoReply(byte[] data) {
        return new OFEchoReplyVer12(
                nextXid(),
                      data
                    );
    }

    public OFEchoRequest.Builder buildEchoRequest() {
        return new OFEchoRequestVer12.Builder().setXid(nextXid());
    }
    public OFEchoRequest echoRequest(byte[] data) {
        return new OFEchoRequestVer12(
                nextXid(),
                      data
                    );
    }

    public OFFeaturesReply.Builder buildFeaturesReply() {
        return new OFFeaturesReplyVer12.Builder().setXid(nextXid());
    }

    public OFFeaturesRequest.Builder buildFeaturesRequest() {
        return new OFFeaturesRequestVer12.Builder().setXid(nextXid());
    }
    public OFFeaturesRequest featuresRequest() {
        return new OFFeaturesRequestVer12(
                nextXid()
                    );
    }

    public OFFlowAdd.Builder buildFlowAdd() {
        return new OFFlowAddVer12.Builder().setXid(nextXid());
    }

    public OFFlowDelete.Builder buildFlowDelete() {
        return new OFFlowDeleteVer12.Builder().setXid(nextXid());
    }

    public OFFlowDeleteStrict.Builder buildFlowDeleteStrict() {
        return new OFFlowDeleteStrictVer12.Builder().setXid(nextXid());
    }

    public OFFlowModify.Builder buildFlowModify() {
        return new OFFlowModifyVer12.Builder().setXid(nextXid());
    }

    public OFFlowModifyStrict.Builder buildFlowModifyStrict() {
        return new OFFlowModifyStrictVer12.Builder().setXid(nextXid());
    }

    public OFFlowRemoved.Builder buildFlowRemoved() {
        return new OFFlowRemovedVer12.Builder().setXid(nextXid());
    }

    public OFFlowStatsEntry.Builder buildFlowStatsEntry() {
        return new OFFlowStatsEntryVer12.Builder();
    }

    public OFFlowStatsReply.Builder buildFlowStatsReply() {
        return new OFFlowStatsReplyVer12.Builder().setXid(nextXid());
    }

    public OFFlowStatsRequest.Builder buildFlowStatsRequest() {
        return new OFFlowStatsRequestVer12.Builder().setXid(nextXid());
    }

    public OFGetConfigReply.Builder buildGetConfigReply() {
        return new OFGetConfigReplyVer12.Builder().setXid(nextXid());
    }

    public OFGetConfigRequest.Builder buildGetConfigRequest() {
        return new OFGetConfigRequestVer12.Builder().setXid(nextXid());
    }
    public OFGetConfigRequest getConfigRequest() {
        return new OFGetConfigRequestVer12(
                nextXid()
                    );
    }

    public OFHello.Builder buildHello() {
        return new OFHelloVer12.Builder().setXid(nextXid());
    }
    public OFHello hello(List<OFHelloElem> elements) {
        return new OFHelloVer12(
                nextXid()
                    );
    }

    public OFMatchV1.Builder buildMatchV1() {
        throw new UnsupportedOperationException("OFMatchV1 not supported in version 1.2");
    }

    public OFNiciraControllerRoleReply.Builder buildNiciraControllerRoleReply() {
        throw new UnsupportedOperationException("OFNiciraControllerRoleReply not supported in version 1.2");
    }
    public OFNiciraControllerRoleReply niciraControllerRoleReply(OFNiciraControllerRole role) {
        throw new UnsupportedOperationException("OFNiciraControllerRoleReply not supported in version 1.2");
    }

    public OFNiciraControllerRoleRequest.Builder buildNiciraControllerRoleRequest() {
        throw new UnsupportedOperationException("OFNiciraControllerRoleRequest not supported in version 1.2");
    }
    public OFNiciraControllerRoleRequest niciraControllerRoleRequest(OFNiciraControllerRole role) {
        throw new UnsupportedOperationException("OFNiciraControllerRoleRequest not supported in version 1.2");
    }

    public OFPacketIn.Builder buildPacketIn() {
        return new OFPacketInVer12.Builder().setXid(nextXid());
    }

    public OFPacketOut.Builder buildPacketOut() {
        return new OFPacketOutVer12.Builder().setXid(nextXid());
    }

    public OFPacketQueue.Builder buildPacketQueue() {
        return new OFPacketQueueVer12.Builder();
    }

    public OFPortDesc.Builder buildPortDesc() {
        return new OFPortDescVer12.Builder();
    }

    public OFPortMod.Builder buildPortMod() {
        return new OFPortModVer12.Builder().setXid(nextXid());
    }

    public OFPortStatsEntry.Builder buildPortStatsEntry() {
        return new OFPortStatsEntryVer12.Builder();
    }

    public OFPortStatsReply.Builder buildPortStatsReply() {
        return new OFPortStatsReplyVer12.Builder().setXid(nextXid());
    }

    public OFPortStatsRequest.Builder buildPortStatsRequest() {
        return new OFPortStatsRequestVer12.Builder().setXid(nextXid());
    }

    public OFPortStatus.Builder buildPortStatus() {
        return new OFPortStatusVer12.Builder().setXid(nextXid());
    }

    public OFQueueGetConfigReply.Builder buildQueueGetConfigReply() {
        return new OFQueueGetConfigReplyVer12.Builder().setXid(nextXid());
    }

    public OFQueueGetConfigRequest.Builder buildQueueGetConfigRequest() {
        return new OFQueueGetConfigRequestVer12.Builder().setXid(nextXid());
    }
    public OFQueueGetConfigRequest queueGetConfigRequest(OFPort port) {
        return new OFQueueGetConfigRequestVer12(
                nextXid(),
                      port
                    );
    }

    public OFQueueStatsEntry.Builder buildQueueStatsEntry() {
        return new OFQueueStatsEntryVer12.Builder();
    }

    public OFQueueStatsReply.Builder buildQueueStatsReply() {
        return new OFQueueStatsReplyVer12.Builder().setXid(nextXid());
    }

    public OFQueueStatsRequest.Builder buildQueueStatsRequest() {
        return new OFQueueStatsRequestVer12.Builder().setXid(nextXid());
    }

    public OFSetConfig.Builder buildSetConfig() {
        return new OFSetConfigVer12.Builder().setXid(nextXid());
    }

    public OFTableMod.Builder buildTableMod() {
        return new OFTableModVer12.Builder().setXid(nextXid());
    }

    public OFTableStatsEntry.Builder buildTableStatsEntry() {
        return new OFTableStatsEntryVer12.Builder();
    }

    public OFTableStatsReply.Builder buildTableStatsReply() {
        return new OFTableStatsReplyVer12.Builder().setXid(nextXid());
    }

    public OFTableStatsRequest.Builder buildTableStatsRequest() {
        return new OFTableStatsRequestVer12.Builder().setXid(nextXid());
    }
    public OFTableStatsRequest tableStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFTableStatsRequestVer12(
                nextXid(),
                      flags
                    );
    }

    public OFBucket.Builder buildBucket() {
        return new OFBucketVer12.Builder();
    }

    public OFBucketCounter.Builder buildBucketCounter() {
        return new OFBucketCounterVer12.Builder();
    }
    public OFBucketCounter bucketCounter(U64 packetCount, U64 byteCount) {
        return new OFBucketCounterVer12(
                packetCount,
                      byteCount
                    );
    }

    public OFGroupAdd.Builder buildGroupAdd() {
        return new OFGroupAddVer12.Builder().setXid(nextXid());
    }

    public OFGroupDelete.Builder buildGroupDelete() {
        return new OFGroupDeleteVer12.Builder().setXid(nextXid());
    }

    public OFGroupDescStatsEntry.Builder buildGroupDescStatsEntry() {
        return new OFGroupDescStatsEntryVer12.Builder();
    }

    public OFGroupDescStatsReply.Builder buildGroupDescStatsReply() {
        return new OFGroupDescStatsReplyVer12.Builder().setXid(nextXid());
    }

    public OFGroupDescStatsRequest.Builder buildGroupDescStatsRequest() {
        return new OFGroupDescStatsRequestVer12.Builder().setXid(nextXid());
    }
    public OFGroupDescStatsRequest groupDescStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFGroupDescStatsRequestVer12(
                nextXid(),
                      flags
                    );
    }

    public OFGroupModify.Builder buildGroupModify() {
        return new OFGroupModifyVer12.Builder().setXid(nextXid());
    }

    public OFGroupStatsEntry.Builder buildGroupStatsEntry() {
        return new OFGroupStatsEntryVer12.Builder();
    }

    public OFGroupStatsReply.Builder buildGroupStatsReply() {
        return new OFGroupStatsReplyVer12.Builder().setXid(nextXid());
    }

    public OFGroupStatsRequest.Builder buildGroupStatsRequest() {
        return new OFGroupStatsRequestVer12.Builder().setXid(nextXid());
    }

    public OFMatchV2.Builder buildMatchV2() {
        throw new UnsupportedOperationException("OFMatchV2 not supported in version 1.2");
    }

    public OFGroupFeaturesStatsReply.Builder buildGroupFeaturesStatsReply() {
        return new OFGroupFeaturesStatsReplyVer12.Builder().setXid(nextXid());
    }

    public OFGroupFeaturesStatsRequest.Builder buildGroupFeaturesStatsRequest() {
        return new OFGroupFeaturesStatsRequestVer12.Builder().setXid(nextXid());
    }
    public OFGroupFeaturesStatsRequest groupFeaturesStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFGroupFeaturesStatsRequestVer12(
                nextXid(),
                      flags
                    );
    }

    public OFMatchV3.Builder buildMatchV3() {
        return new OFMatchV3Ver12.Builder();
    }
    public Match.Builder buildMatch() {
        return new OFMatchV3Ver12.Builder();
    }

    final static Match MATCH_WILDCARD_ALL = OFMatchV3Ver12.DEFAULT;

    public Match matchWildcardAll() {
        return MATCH_WILDCARD_ALL;
    }
    public OFMatchV3 matchV3(OFOxmList oxmList) {
        return new OFMatchV3Ver12(
                oxmList
                    );
    }

    public OFRoleReply.Builder buildRoleReply() {
        return new OFRoleReplyVer12.Builder().setXid(nextXid());
    }

    public OFRoleRequest.Builder buildRoleRequest() {
        return new OFRoleRequestVer12.Builder().setXid(nextXid());
    }

    public OFAsyncGetReply.Builder buildAsyncGetReply() {
        throw new UnsupportedOperationException("OFAsyncGetReply not supported in version 1.2");
    }

    public OFAsyncGetRequest.Builder buildAsyncGetRequest() {
        throw new UnsupportedOperationException("OFAsyncGetRequest not supported in version 1.2");
    }

    public OFAsyncSet.Builder buildAsyncSet() {
        throw new UnsupportedOperationException("OFAsyncSet not supported in version 1.2");
    }

    public OFBsnArpIdle.Builder buildBsnArpIdle() {
        throw new UnsupportedOperationException("OFBsnArpIdle not supported in version 1.2");
    }

    public OFBsnControllerConnection.Builder buildBsnControllerConnection() {
        throw new UnsupportedOperationException("OFBsnControllerConnection not supported in version 1.2");
    }

    public OFBsnControllerConnectionsReply.Builder buildBsnControllerConnectionsReply() {
        throw new UnsupportedOperationException("OFBsnControllerConnectionsReply not supported in version 1.2");
    }
    public OFBsnControllerConnectionsReply bsnControllerConnectionsReply(List<OFBsnControllerConnection> connections) {
        throw new UnsupportedOperationException("OFBsnControllerConnectionsReply not supported in version 1.2");
    }

    public OFBsnControllerConnectionsRequest.Builder buildBsnControllerConnectionsRequest() {
        throw new UnsupportedOperationException("OFBsnControllerConnectionsRequest not supported in version 1.2");
    }
    public OFBsnControllerConnectionsRequest bsnControllerConnectionsRequest() {
        throw new UnsupportedOperationException("OFBsnControllerConnectionsRequest not supported in version 1.2");
    }

    public OFBsnDebugCounterDescStatsEntry.Builder buildBsnDebugCounterDescStatsEntry() {
        throw new UnsupportedOperationException("OFBsnDebugCounterDescStatsEntry not supported in version 1.2");
    }

    public OFBsnDebugCounterDescStatsReply.Builder buildBsnDebugCounterDescStatsReply() {
        throw new UnsupportedOperationException("OFBsnDebugCounterDescStatsReply not supported in version 1.2");
    }

    public OFBsnDebugCounterDescStatsRequest.Builder buildBsnDebugCounterDescStatsRequest() {
        throw new UnsupportedOperationException("OFBsnDebugCounterDescStatsRequest not supported in version 1.2");
    }
    public OFBsnDebugCounterDescStatsRequest bsnDebugCounterDescStatsRequest(Set<OFStatsRequestFlags> flags) {
        throw new UnsupportedOperationException("OFBsnDebugCounterDescStatsRequest not supported in version 1.2");
    }

    public OFBsnDebugCounterStatsEntry.Builder buildBsnDebugCounterStatsEntry() {
        throw new UnsupportedOperationException("OFBsnDebugCounterStatsEntry not supported in version 1.2");
    }
    public OFBsnDebugCounterStatsEntry bsnDebugCounterStatsEntry(U64 counterId, U64 value) {
        throw new UnsupportedOperationException("OFBsnDebugCounterStatsEntry not supported in version 1.2");
    }

    public OFBsnDebugCounterStatsReply.Builder buildBsnDebugCounterStatsReply() {
        throw new UnsupportedOperationException("OFBsnDebugCounterStatsReply not supported in version 1.2");
    }

    public OFBsnDebugCounterStatsRequest.Builder buildBsnDebugCounterStatsRequest() {
        throw new UnsupportedOperationException("OFBsnDebugCounterStatsRequest not supported in version 1.2");
    }
    public OFBsnDebugCounterStatsRequest bsnDebugCounterStatsRequest(Set<OFStatsRequestFlags> flags) {
        throw new UnsupportedOperationException("OFBsnDebugCounterStatsRequest not supported in version 1.2");
    }

    public OFBsnFlowChecksumBucketStatsEntry.Builder buildBsnFlowChecksumBucketStatsEntry() {
        throw new UnsupportedOperationException("OFBsnFlowChecksumBucketStatsEntry not supported in version 1.2");
    }
    public OFBsnFlowChecksumBucketStatsEntry bsnFlowChecksumBucketStatsEntry(U64 checksum) {
        throw new UnsupportedOperationException("OFBsnFlowChecksumBucketStatsEntry not supported in version 1.2");
    }

    public OFBsnFlowChecksumBucketStatsReply.Builder buildBsnFlowChecksumBucketStatsReply() {
        throw new UnsupportedOperationException("OFBsnFlowChecksumBucketStatsReply not supported in version 1.2");
    }

    public OFBsnFlowChecksumBucketStatsRequest.Builder buildBsnFlowChecksumBucketStatsRequest() {
        throw new UnsupportedOperationException("OFBsnFlowChecksumBucketStatsRequest not supported in version 1.2");
    }

    public OFBsnFlowIdle.Builder buildBsnFlowIdle() {
        throw new UnsupportedOperationException("OFBsnFlowIdle not supported in version 1.2");
    }

    public OFBsnFlowIdleEnableGetReply.Builder buildBsnFlowIdleEnableGetReply() {
        throw new UnsupportedOperationException("OFBsnFlowIdleEnableGetReply not supported in version 1.2");
    }
    public OFBsnFlowIdleEnableGetReply bsnFlowIdleEnableGetReply(long enabled) {
        throw new UnsupportedOperationException("OFBsnFlowIdleEnableGetReply not supported in version 1.2");
    }

    public OFBsnFlowIdleEnableGetRequest.Builder buildBsnFlowIdleEnableGetRequest() {
        throw new UnsupportedOperationException("OFBsnFlowIdleEnableGetRequest not supported in version 1.2");
    }
    public OFBsnFlowIdleEnableGetRequest bsnFlowIdleEnableGetRequest() {
        throw new UnsupportedOperationException("OFBsnFlowIdleEnableGetRequest not supported in version 1.2");
    }

    public OFBsnFlowIdleEnableSetReply.Builder buildBsnFlowIdleEnableSetReply() {
        throw new UnsupportedOperationException("OFBsnFlowIdleEnableSetReply not supported in version 1.2");
    }

    public OFBsnFlowIdleEnableSetRequest.Builder buildBsnFlowIdleEnableSetRequest() {
        throw new UnsupportedOperationException("OFBsnFlowIdleEnableSetRequest not supported in version 1.2");
    }
    public OFBsnFlowIdleEnableSetRequest bsnFlowIdleEnableSetRequest(long enable) {
        throw new UnsupportedOperationException("OFBsnFlowIdleEnableSetRequest not supported in version 1.2");
    }

    public OFBsnGentableBucketStatsEntry.Builder buildBsnGentableBucketStatsEntry() {
        throw new UnsupportedOperationException("OFBsnGentableBucketStatsEntry not supported in version 1.2");
    }
    public OFBsnGentableBucketStatsEntry bsnGentableBucketStatsEntry(U128 checksum) {
        throw new UnsupportedOperationException("OFBsnGentableBucketStatsEntry not supported in version 1.2");
    }

    public OFBsnGentableBucketStatsReply.Builder buildBsnGentableBucketStatsReply() {
        throw new UnsupportedOperationException("OFBsnGentableBucketStatsReply not supported in version 1.2");
    }

    public OFBsnGentableBucketStatsRequest.Builder buildBsnGentableBucketStatsRequest() {
        throw new UnsupportedOperationException("OFBsnGentableBucketStatsRequest not supported in version 1.2");
    }

    public OFBsnGentableClearReply.Builder buildBsnGentableClearReply() {
        throw new UnsupportedOperationException("OFBsnGentableClearReply not supported in version 1.2");
    }

    public OFBsnGentableClearRequest.Builder buildBsnGentableClearRequest() {
        throw new UnsupportedOperationException("OFBsnGentableClearRequest not supported in version 1.2");
    }

    public OFBsnGentableDescStatsEntry.Builder buildBsnGentableDescStatsEntry() {
        throw new UnsupportedOperationException("OFBsnGentableDescStatsEntry not supported in version 1.2");
    }

    public OFBsnGentableDescStatsReply.Builder buildBsnGentableDescStatsReply() {
        throw new UnsupportedOperationException("OFBsnGentableDescStatsReply not supported in version 1.2");
    }

    public OFBsnGentableDescStatsRequest.Builder buildBsnGentableDescStatsRequest() {
        throw new UnsupportedOperationException("OFBsnGentableDescStatsRequest not supported in version 1.2");
    }
    public OFBsnGentableDescStatsRequest bsnGentableDescStatsRequest(Set<OFStatsRequestFlags> flags) {
        throw new UnsupportedOperationException("OFBsnGentableDescStatsRequest not supported in version 1.2");
    }

    public OFBsnGentableEntryAdd.Builder buildBsnGentableEntryAdd() {
        throw new UnsupportedOperationException("OFBsnGentableEntryAdd not supported in version 1.2");
    }

    public OFBsnGentableEntryDelete.Builder buildBsnGentableEntryDelete() {
        throw new UnsupportedOperationException("OFBsnGentableEntryDelete not supported in version 1.2");
    }

    public OFBsnGentableEntryDescStatsEntry.Builder buildBsnGentableEntryDescStatsEntry() {
        throw new UnsupportedOperationException("OFBsnGentableEntryDescStatsEntry not supported in version 1.2");
    }

    public OFBsnGentableEntryDescStatsReply.Builder buildBsnGentableEntryDescStatsReply() {
        throw new UnsupportedOperationException("OFBsnGentableEntryDescStatsReply not supported in version 1.2");
    }

    public OFBsnGentableEntryDescStatsRequest.Builder buildBsnGentableEntryDescStatsRequest() {
        throw new UnsupportedOperationException("OFBsnGentableEntryDescStatsRequest not supported in version 1.2");
    }

    public OFBsnGentableEntryStatsEntry.Builder buildBsnGentableEntryStatsEntry() {
        throw new UnsupportedOperationException("OFBsnGentableEntryStatsEntry not supported in version 1.2");
    }
    public OFBsnGentableEntryStatsEntry bsnGentableEntryStatsEntry(List<OFBsnTlv> key, List<OFBsnTlv> stats) {
        throw new UnsupportedOperationException("OFBsnGentableEntryStatsEntry not supported in version 1.2");
    }

    public OFBsnGentableEntryStatsReply.Builder buildBsnGentableEntryStatsReply() {
        throw new UnsupportedOperationException("OFBsnGentableEntryStatsReply not supported in version 1.2");
    }

    public OFBsnGentableEntryStatsRequest.Builder buildBsnGentableEntryStatsRequest() {
        throw new UnsupportedOperationException("OFBsnGentableEntryStatsRequest not supported in version 1.2");
    }

    public OFBsnGentableSetBucketsSize.Builder buildBsnGentableSetBucketsSize() {
        throw new UnsupportedOperationException("OFBsnGentableSetBucketsSize not supported in version 1.2");
    }

    public OFBsnGentableStatsEntry.Builder buildBsnGentableStatsEntry() {
        throw new UnsupportedOperationException("OFBsnGentableStatsEntry not supported in version 1.2");
    }

    public OFBsnGentableStatsReply.Builder buildBsnGentableStatsReply() {
        throw new UnsupportedOperationException("OFBsnGentableStatsReply not supported in version 1.2");
    }

    public OFBsnGentableStatsRequest.Builder buildBsnGentableStatsRequest() {
        throw new UnsupportedOperationException("OFBsnGentableStatsRequest not supported in version 1.2");
    }
    public OFBsnGentableStatsRequest bsnGentableStatsRequest(Set<OFStatsRequestFlags> flags) {
        throw new UnsupportedOperationException("OFBsnGentableStatsRequest not supported in version 1.2");
    }

    public OFBsnGetSwitchPipelineReply.Builder buildBsnGetSwitchPipelineReply() {
        throw new UnsupportedOperationException("OFBsnGetSwitchPipelineReply not supported in version 1.2");
    }
    public OFBsnGetSwitchPipelineReply bsnGetSwitchPipelineReply(String pipeline) {
        throw new UnsupportedOperationException("OFBsnGetSwitchPipelineReply not supported in version 1.2");
    }

    public OFBsnGetSwitchPipelineRequest.Builder buildBsnGetSwitchPipelineRequest() {
        throw new UnsupportedOperationException("OFBsnGetSwitchPipelineRequest not supported in version 1.2");
    }
    public OFBsnGetSwitchPipelineRequest bsnGetSwitchPipelineRequest() {
        throw new UnsupportedOperationException("OFBsnGetSwitchPipelineRequest not supported in version 1.2");
    }

    public OFBsnImageDescStatsReply.Builder buildBsnImageDescStatsReply() {
        throw new UnsupportedOperationException("OFBsnImageDescStatsReply not supported in version 1.2");
    }

    public OFBsnImageDescStatsRequest.Builder buildBsnImageDescStatsRequest() {
        throw new UnsupportedOperationException("OFBsnImageDescStatsRequest not supported in version 1.2");
    }
    public OFBsnImageDescStatsRequest bsnImageDescStatsRequest(Set<OFStatsRequestFlags> flags) {
        throw new UnsupportedOperationException("OFBsnImageDescStatsRequest not supported in version 1.2");
    }

    public OFBsnLacpConvergenceNotif.Builder buildBsnLacpConvergenceNotif() {
        throw new UnsupportedOperationException("OFBsnLacpConvergenceNotif not supported in version 1.2");
    }

    public OFBsnLacpStatsEntry.Builder buildBsnLacpStatsEntry() {
        throw new UnsupportedOperationException("OFBsnLacpStatsEntry not supported in version 1.2");
    }

    public OFBsnLacpStatsReply.Builder buildBsnLacpStatsReply() {
        throw new UnsupportedOperationException("OFBsnLacpStatsReply not supported in version 1.2");
    }

    public OFBsnLacpStatsRequest.Builder buildBsnLacpStatsRequest() {
        throw new UnsupportedOperationException("OFBsnLacpStatsRequest not supported in version 1.2");
    }
    public OFBsnLacpStatsRequest bsnLacpStatsRequest(Set<OFStatsRequestFlags> flags) {
        throw new UnsupportedOperationException("OFBsnLacpStatsRequest not supported in version 1.2");
    }

    public OFBsnLog.Builder buildBsnLog() {
        throw new UnsupportedOperationException("OFBsnLog not supported in version 1.2");
    }

    public OFBsnPortCounterStatsEntry.Builder buildBsnPortCounterStatsEntry() {
        throw new UnsupportedOperationException("OFBsnPortCounterStatsEntry not supported in version 1.2");
    }
    public OFBsnPortCounterStatsEntry bsnPortCounterStatsEntry(OFPort portNo, List<U64> values) {
        throw new UnsupportedOperationException("OFBsnPortCounterStatsEntry not supported in version 1.2");
    }

    public OFBsnPortCounterStatsReply.Builder buildBsnPortCounterStatsReply() {
        throw new UnsupportedOperationException("OFBsnPortCounterStatsReply not supported in version 1.2");
    }

    public OFBsnPortCounterStatsRequest.Builder buildBsnPortCounterStatsRequest() {
        throw new UnsupportedOperationException("OFBsnPortCounterStatsRequest not supported in version 1.2");
    }

    public OFBsnRoleStatus.Builder buildBsnRoleStatus() {
        throw new UnsupportedOperationException("OFBsnRoleStatus not supported in version 1.2");
    }

    public OFBsnSetAuxCxnsReply.Builder buildBsnSetAuxCxnsReply() {
        throw new UnsupportedOperationException("OFBsnSetAuxCxnsReply not supported in version 1.2");
    }

    public OFBsnSetAuxCxnsRequest.Builder buildBsnSetAuxCxnsRequest() {
        throw new UnsupportedOperationException("OFBsnSetAuxCxnsRequest not supported in version 1.2");
    }
    public OFBsnSetAuxCxnsRequest bsnSetAuxCxnsRequest(long numAux) {
        throw new UnsupportedOperationException("OFBsnSetAuxCxnsRequest not supported in version 1.2");
    }

    public OFBsnSetLacpReply.Builder buildBsnSetLacpReply() {
        throw new UnsupportedOperationException("OFBsnSetLacpReply not supported in version 1.2");
    }

    public OFBsnSetLacpRequest.Builder buildBsnSetLacpRequest() {
        throw new UnsupportedOperationException("OFBsnSetLacpRequest not supported in version 1.2");
    }

    public OFBsnSetSwitchPipelineReply.Builder buildBsnSetSwitchPipelineReply() {
        throw new UnsupportedOperationException("OFBsnSetSwitchPipelineReply not supported in version 1.2");
    }
    public OFBsnSetSwitchPipelineReply bsnSetSwitchPipelineReply(long status) {
        throw new UnsupportedOperationException("OFBsnSetSwitchPipelineReply not supported in version 1.2");
    }

    public OFBsnSetSwitchPipelineRequest.Builder buildBsnSetSwitchPipelineRequest() {
        throw new UnsupportedOperationException("OFBsnSetSwitchPipelineRequest not supported in version 1.2");
    }
    public OFBsnSetSwitchPipelineRequest bsnSetSwitchPipelineRequest(String pipeline) {
        throw new UnsupportedOperationException("OFBsnSetSwitchPipelineRequest not supported in version 1.2");
    }

    public OFBsnSwitchPipelineStatsEntry.Builder buildBsnSwitchPipelineStatsEntry() {
        throw new UnsupportedOperationException("OFBsnSwitchPipelineStatsEntry not supported in version 1.2");
    }
    public OFBsnSwitchPipelineStatsEntry bsnSwitchPipelineStatsEntry(String pipeline) {
        throw new UnsupportedOperationException("OFBsnSwitchPipelineStatsEntry not supported in version 1.2");
    }

    public OFBsnSwitchPipelineStatsReply.Builder buildBsnSwitchPipelineStatsReply() {
        throw new UnsupportedOperationException("OFBsnSwitchPipelineStatsReply not supported in version 1.2");
    }

    public OFBsnSwitchPipelineStatsRequest.Builder buildBsnSwitchPipelineStatsRequest() {
        throw new UnsupportedOperationException("OFBsnSwitchPipelineStatsRequest not supported in version 1.2");
    }
    public OFBsnSwitchPipelineStatsRequest bsnSwitchPipelineStatsRequest(Set<OFStatsRequestFlags> flags) {
        throw new UnsupportedOperationException("OFBsnSwitchPipelineStatsRequest not supported in version 1.2");
    }

    public OFBsnTableChecksumStatsEntry.Builder buildBsnTableChecksumStatsEntry() {
        throw new UnsupportedOperationException("OFBsnTableChecksumStatsEntry not supported in version 1.2");
    }
    public OFBsnTableChecksumStatsEntry bsnTableChecksumStatsEntry(TableId tableId, U64 checksum) {
        throw new UnsupportedOperationException("OFBsnTableChecksumStatsEntry not supported in version 1.2");
    }

    public OFBsnTableChecksumStatsReply.Builder buildBsnTableChecksumStatsReply() {
        throw new UnsupportedOperationException("OFBsnTableChecksumStatsReply not supported in version 1.2");
    }

    public OFBsnTableChecksumStatsRequest.Builder buildBsnTableChecksumStatsRequest() {
        throw new UnsupportedOperationException("OFBsnTableChecksumStatsRequest not supported in version 1.2");
    }
    public OFBsnTableChecksumStatsRequest bsnTableChecksumStatsRequest(Set<OFStatsRequestFlags> flags) {
        throw new UnsupportedOperationException("OFBsnTableChecksumStatsRequest not supported in version 1.2");
    }

    public OFBsnTableSetBucketsSize.Builder buildBsnTableSetBucketsSize() {
        throw new UnsupportedOperationException("OFBsnTableSetBucketsSize not supported in version 1.2");
    }

    public OFBsnTimeReply.Builder buildBsnTimeReply() {
        throw new UnsupportedOperationException("OFBsnTimeReply not supported in version 1.2");
    }
    public OFBsnTimeReply bsnTimeReply(U64 timeMs) {
        throw new UnsupportedOperationException("OFBsnTimeReply not supported in version 1.2");
    }

    public OFBsnTimeRequest.Builder buildBsnTimeRequest() {
        throw new UnsupportedOperationException("OFBsnTimeRequest not supported in version 1.2");
    }
    public OFBsnTimeRequest bsnTimeRequest() {
        throw new UnsupportedOperationException("OFBsnTimeRequest not supported in version 1.2");
    }

    public OFBsnVlanCounterStatsEntry.Builder buildBsnVlanCounterStatsEntry() {
        throw new UnsupportedOperationException("OFBsnVlanCounterStatsEntry not supported in version 1.2");
    }
    public OFBsnVlanCounterStatsEntry bsnVlanCounterStatsEntry(int vlanVid, List<U64> values) {
        throw new UnsupportedOperationException("OFBsnVlanCounterStatsEntry not supported in version 1.2");
    }

    public OFBsnVlanCounterStatsReply.Builder buildBsnVlanCounterStatsReply() {
        throw new UnsupportedOperationException("OFBsnVlanCounterStatsReply not supported in version 1.2");
    }

    public OFBsnVlanCounterStatsRequest.Builder buildBsnVlanCounterStatsRequest() {
        throw new UnsupportedOperationException("OFBsnVlanCounterStatsRequest not supported in version 1.2");
    }

    public OFBsnVrfCounterStatsEntry.Builder buildBsnVrfCounterStatsEntry() {
        throw new UnsupportedOperationException("OFBsnVrfCounterStatsEntry not supported in version 1.2");
    }
    public OFBsnVrfCounterStatsEntry bsnVrfCounterStatsEntry(long vrf, List<U64> values) {
        throw new UnsupportedOperationException("OFBsnVrfCounterStatsEntry not supported in version 1.2");
    }

    public OFBsnVrfCounterStatsReply.Builder buildBsnVrfCounterStatsReply() {
        throw new UnsupportedOperationException("OFBsnVrfCounterStatsReply not supported in version 1.2");
    }

    public OFBsnVrfCounterStatsRequest.Builder buildBsnVrfCounterStatsRequest() {
        throw new UnsupportedOperationException("OFBsnVrfCounterStatsRequest not supported in version 1.2");
    }

    public OFHelloElemVersionbitmap.Builder buildHelloElemVersionbitmap() {
        throw new UnsupportedOperationException("OFHelloElemVersionbitmap not supported in version 1.2");
    }
    public OFHelloElemVersionbitmap helloElemVersionbitmap(List<U32> bitmaps) {
        throw new UnsupportedOperationException("OFHelloElemVersionbitmap not supported in version 1.2");
    }

    public OFMeterBandStats.Builder buildMeterBandStats() {
        throw new UnsupportedOperationException("OFMeterBandStats not supported in version 1.2");
    }
    public OFMeterBandStats meterBandStats(U64 packetBandCount, U64 byteBandCount) {
        throw new UnsupportedOperationException("OFMeterBandStats not supported in version 1.2");
    }

    public OFMeterConfig.Builder buildMeterConfig() {
        throw new UnsupportedOperationException("OFMeterConfig not supported in version 1.2");
    }

    public OFMeterConfigStatsReply.Builder buildMeterConfigStatsReply() {
        throw new UnsupportedOperationException("OFMeterConfigStatsReply not supported in version 1.2");
    }

    public OFMeterConfigStatsRequest.Builder buildMeterConfigStatsRequest() {
        throw new UnsupportedOperationException("OFMeterConfigStatsRequest not supported in version 1.2");
    }

    public OFMeterFeatures.Builder buildMeterFeatures() {
        throw new UnsupportedOperationException("OFMeterFeatures not supported in version 1.2");
    }

    public OFMeterFeaturesStatsReply.Builder buildMeterFeaturesStatsReply() {
        throw new UnsupportedOperationException("OFMeterFeaturesStatsReply not supported in version 1.2");
    }

    public OFMeterFeaturesStatsRequest.Builder buildMeterFeaturesStatsRequest() {
        throw new UnsupportedOperationException("OFMeterFeaturesStatsRequest not supported in version 1.2");
    }
    public OFMeterFeaturesStatsRequest meterFeaturesStatsRequest(Set<OFStatsRequestFlags> flags) {
        throw new UnsupportedOperationException("OFMeterFeaturesStatsRequest not supported in version 1.2");
    }

    public OFMeterMod.Builder buildMeterMod() {
        throw new UnsupportedOperationException("OFMeterMod not supported in version 1.2");
    }

    public OFMeterStats.Builder buildMeterStats() {
        throw new UnsupportedOperationException("OFMeterStats not supported in version 1.2");
    }

    public OFMeterStatsReply.Builder buildMeterStatsReply() {
        throw new UnsupportedOperationException("OFMeterStatsReply not supported in version 1.2");
    }

    public OFMeterStatsRequest.Builder buildMeterStatsRequest() {
        throw new UnsupportedOperationException("OFMeterStatsRequest not supported in version 1.2");
    }

    public OFPortDescStatsReply.Builder buildPortDescStatsReply() {
        throw new UnsupportedOperationException("OFPortDescStatsReply not supported in version 1.2");
    }

    public OFPortDescStatsRequest.Builder buildPortDescStatsRequest() {
        throw new UnsupportedOperationException("OFPortDescStatsRequest not supported in version 1.2");
    }
    public OFPortDescStatsRequest portDescStatsRequest(Set<OFStatsRequestFlags> flags) {
        throw new UnsupportedOperationException("OFPortDescStatsRequest not supported in version 1.2");
    }

    public OFTableFeaturePropApplyActions.Builder buildTableFeaturePropApplyActions() {
        throw new UnsupportedOperationException("OFTableFeaturePropApplyActions not supported in version 1.2");
    }
    public OFTableFeaturePropApplyActions tableFeaturePropApplyActions(List<OFActionId> actionIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropApplyActions not supported in version 1.2");
    }

    public OFTableFeaturePropApplyActionsMiss.Builder buildTableFeaturePropApplyActionsMiss() {
        throw new UnsupportedOperationException("OFTableFeaturePropApplyActionsMiss not supported in version 1.2");
    }
    public OFTableFeaturePropApplyActionsMiss tableFeaturePropApplyActionsMiss(List<OFActionId> actionIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropApplyActionsMiss not supported in version 1.2");
    }

    public OFTableFeaturePropApplySetfield.Builder buildTableFeaturePropApplySetfield() {
        throw new UnsupportedOperationException("OFTableFeaturePropApplySetfield not supported in version 1.2");
    }
    public OFTableFeaturePropApplySetfield tableFeaturePropApplySetfield(List<U32> oxmIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropApplySetfield not supported in version 1.2");
    }

    public OFTableFeaturePropApplySetfieldMiss.Builder buildTableFeaturePropApplySetfieldMiss() {
        throw new UnsupportedOperationException("OFTableFeaturePropApplySetfieldMiss not supported in version 1.2");
    }
    public OFTableFeaturePropApplySetfieldMiss tableFeaturePropApplySetfieldMiss(List<U32> oxmIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropApplySetfieldMiss not supported in version 1.2");
    }

    public OFTableFeaturePropExperimenter.Builder buildTableFeaturePropExperimenter() {
        throw new UnsupportedOperationException("OFTableFeaturePropExperimenter not supported in version 1.2");
    }

    public OFTableFeaturePropExperimenterMiss.Builder buildTableFeaturePropExperimenterMiss() {
        throw new UnsupportedOperationException("OFTableFeaturePropExperimenterMiss not supported in version 1.2");
    }

    public OFTableFeaturePropInstructions.Builder buildTableFeaturePropInstructions() {
        throw new UnsupportedOperationException("OFTableFeaturePropInstructions not supported in version 1.2");
    }
    public OFTableFeaturePropInstructions tableFeaturePropInstructions(List<OFInstructionId> instructionIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropInstructions not supported in version 1.2");
    }

    public OFTableFeaturePropInstructionsMiss.Builder buildTableFeaturePropInstructionsMiss() {
        throw new UnsupportedOperationException("OFTableFeaturePropInstructionsMiss not supported in version 1.2");
    }
    public OFTableFeaturePropInstructionsMiss tableFeaturePropInstructionsMiss(List<OFInstructionId> instructionIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropInstructionsMiss not supported in version 1.2");
    }

    public OFTableFeaturePropMatch.Builder buildTableFeaturePropMatch() {
        throw new UnsupportedOperationException("OFTableFeaturePropMatch not supported in version 1.2");
    }
    public OFTableFeaturePropMatch tableFeaturePropMatch(List<U32> oxmIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropMatch not supported in version 1.2");
    }

    public OFTableFeaturePropNextTables.Builder buildTableFeaturePropNextTables() {
        throw new UnsupportedOperationException("OFTableFeaturePropNextTables not supported in version 1.2");
    }
    public OFTableFeaturePropNextTables tableFeaturePropNextTables(List<U8> nextTableIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropNextTables not supported in version 1.2");
    }

    public OFTableFeaturePropNextTablesMiss.Builder buildTableFeaturePropNextTablesMiss() {
        throw new UnsupportedOperationException("OFTableFeaturePropNextTablesMiss not supported in version 1.2");
    }
    public OFTableFeaturePropNextTablesMiss tableFeaturePropNextTablesMiss(List<U8> nextTableIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropNextTablesMiss not supported in version 1.2");
    }

    public OFTableFeaturePropWildcards.Builder buildTableFeaturePropWildcards() {
        throw new UnsupportedOperationException("OFTableFeaturePropWildcards not supported in version 1.2");
    }
    public OFTableFeaturePropWildcards tableFeaturePropWildcards(List<U32> oxmIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropWildcards not supported in version 1.2");
    }

    public OFTableFeaturePropWriteActions.Builder buildTableFeaturePropWriteActions() {
        throw new UnsupportedOperationException("OFTableFeaturePropWriteActions not supported in version 1.2");
    }
    public OFTableFeaturePropWriteActions tableFeaturePropWriteActions(List<OFActionId> actionIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropWriteActions not supported in version 1.2");
    }

    public OFTableFeaturePropWriteActionsMiss.Builder buildTableFeaturePropWriteActionsMiss() {
        throw new UnsupportedOperationException("OFTableFeaturePropWriteActionsMiss not supported in version 1.2");
    }
    public OFTableFeaturePropWriteActionsMiss tableFeaturePropWriteActionsMiss(List<OFActionId> actionIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropWriteActionsMiss not supported in version 1.2");
    }

    public OFTableFeaturePropWriteSetfield.Builder buildTableFeaturePropWriteSetfield() {
        throw new UnsupportedOperationException("OFTableFeaturePropWriteSetfield not supported in version 1.2");
    }
    public OFTableFeaturePropWriteSetfield tableFeaturePropWriteSetfield(List<U32> oxmIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropWriteSetfield not supported in version 1.2");
    }

    public OFTableFeaturePropWriteSetfieldMiss.Builder buildTableFeaturePropWriteSetfieldMiss() {
        throw new UnsupportedOperationException("OFTableFeaturePropWriteSetfieldMiss not supported in version 1.2");
    }
    public OFTableFeaturePropWriteSetfieldMiss tableFeaturePropWriteSetfieldMiss(List<U32> oxmIds) {
        throw new UnsupportedOperationException("OFTableFeaturePropWriteSetfieldMiss not supported in version 1.2");
    }

    public OFTableFeatures.Builder buildTableFeatures() {
        throw new UnsupportedOperationException("OFTableFeatures not supported in version 1.2");
    }

    public OFTableFeaturesStatsReply.Builder buildTableFeaturesStatsReply() {
        throw new UnsupportedOperationException("OFTableFeaturesStatsReply not supported in version 1.2");
    }

    public OFTableFeaturesStatsRequest.Builder buildTableFeaturesStatsRequest() {
        throw new UnsupportedOperationException("OFTableFeaturesStatsRequest not supported in version 1.2");
    }

    public OFUint64.Builder buildUint64() {
        throw new UnsupportedOperationException("OFUint64 not supported in version 1.2");
    }
    public OFUint64 uint64(U64 value) {
        throw new UnsupportedOperationException("OFUint64 not supported in version 1.2");
    }

    public OFMessageReader<OFMessage> getReader() {
        return OFMessageVer12.READER;
    }

    public long nextXid() {
        return xidGenerator.nextXid();
    }

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