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

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

    private final XidGenerator xidGenerator = XidGenerators.global();

    public OFActions actions() {
        return OFActionsVer10.INSTANCE;
    }
    public OFInstructions instructions() {
        return OFInstructionsVer10.INSTANCE;
    }
    public OFMeterBands meterBands() {
        return OFMeterBandsVer10.INSTANCE;
    }
    public OFOxms oxms() {
        return OFOxmsVer10.INSTANCE;
    }
    public OFQueueProps queueProps() {
        return OFQueuePropsVer10.INSTANCE;
    }
    public OFErrorMsgs errorMsgs() {
        return OFErrorMsgsVer10.INSTANCE;
    }
    public OFActionIds actionIds() {
        return OFActionIdsVer10.INSTANCE;
    }
    public OFInstructionIds instructionIds() {
        return OFInstructionIdsVer10.INSTANCE;
    }
    public OFBsnTlvs bsnTlvs() {
        return OFBsnTlvsVer10.INSTANCE;
    }


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

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

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

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

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

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

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

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

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

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

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

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

    public OFBsnGetIpMaskReply.Builder buildBsnGetIpMaskReply() {
        return new OFBsnGetIpMaskReplyVer10.Builder().setXid(nextXid());
    }

    public OFBsnGetIpMaskRequest.Builder buildBsnGetIpMaskRequest() {
        return new OFBsnGetIpMaskRequestVer10.Builder().setXid(nextXid());
    }
    public OFBsnGetIpMaskRequest bsnGetIpMaskRequest(short index) {
        return new OFBsnGetIpMaskRequestVer10(
                nextXid(),
                      index
                    );
    }

    public OFBsnGetL2TableReply.Builder buildBsnGetL2TableReply() {
        return new OFBsnGetL2TableReplyVer10.Builder().setXid(nextXid());
    }

    public OFBsnGetL2TableRequest.Builder buildBsnGetL2TableRequest() {
        return new OFBsnGetL2TableRequestVer10.Builder().setXid(nextXid());
    }
    public OFBsnGetL2TableRequest bsnGetL2TableRequest() {
        return new OFBsnGetL2TableRequestVer10(
                nextXid()
                    );
    }

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

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

    public OFBsnHybridGetReply.Builder buildBsnHybridGetReply() {
        return new OFBsnHybridGetReplyVer10.Builder().setXid(nextXid());
    }

    public OFBsnHybridGetRequest.Builder buildBsnHybridGetRequest() {
        return new OFBsnHybridGetRequestVer10.Builder().setXid(nextXid());
    }
    public OFBsnHybridGetRequest bsnHybridGetRequest() {
        return new OFBsnHybridGetRequestVer10(
                nextXid()
                    );
    }

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

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

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

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

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

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

    public OFBsnSetIpMask.Builder buildBsnSetIpMask() {
        return new OFBsnSetIpMaskVer10.Builder().setXid(nextXid());
    }

    public OFBsnSetL2TableReply.Builder buildBsnSetL2TableReply() {
        return new OFBsnSetL2TableReplyVer10.Builder().setXid(nextXid());
    }

    public OFBsnSetL2TableRequest.Builder buildBsnSetL2TableRequest() {
        return new OFBsnSetL2TableRequestVer10.Builder().setXid(nextXid());
    }

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

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

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

    public OFBsnShellCommand.Builder buildBsnShellCommand() {
        return new OFBsnShellCommandVer10.Builder().setXid(nextXid());
    }

    public OFBsnShellOutput.Builder buildBsnShellOutput() {
        return new OFBsnShellOutputVer10.Builder().setXid(nextXid());
    }
    public OFBsnShellOutput bsnShellOutput(byte[] data) {
        return new OFBsnShellOutputVer10(
                nextXid(),
                      data
                    );
    }

    public OFBsnShellStatus.Builder buildBsnShellStatus() {
        return new OFBsnShellStatusVer10.Builder().setXid(nextXid());
    }
    public OFBsnShellStatus bsnShellStatus(long status) {
        return new OFBsnShellStatusVer10(
                nextXid(),
                      status
                    );
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    public OFMatchV1.Builder buildMatchV1() {
        return new OFMatchV1Ver10.Builder();
    }
    public Match.Builder buildMatch() {
        return new OFMatchV1Ver10.Builder();
    }

    final static Match MATCH_WILDCARD_ALL = OFMatchV1Ver10.DEFAULT;

    public Match matchWildcardAll() {
        return MATCH_WILDCARD_ALL;
    }

    public OFNiciraControllerRoleReply.Builder buildNiciraControllerRoleReply() {
        return new OFNiciraControllerRoleReplyVer10.Builder().setXid(nextXid());
    }
    public OFNiciraControllerRoleReply niciraControllerRoleReply(OFNiciraControllerRole role) {
        return new OFNiciraControllerRoleReplyVer10(
                nextXid(),
                      role
                    );
    }

    public OFNiciraControllerRoleRequest.Builder buildNiciraControllerRoleRequest() {
        return new OFNiciraControllerRoleRequestVer10.Builder().setXid(nextXid());
    }
    public OFNiciraControllerRoleRequest niciraControllerRoleRequest(OFNiciraControllerRole role) {
        return new OFNiciraControllerRoleRequestVer10(
                nextXid(),
                      role
                    );
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    public OFTableMod.Builder buildTableMod() {
        throw new UnsupportedOperationException("OFTableMod not supported in version 1.0");
    }

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

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

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

    public OFBucket.Builder buildBucket() {
        throw new UnsupportedOperationException("OFBucket not supported in version 1.0");
    }

    public OFBucketCounter.Builder buildBucketCounter() {
        throw new UnsupportedOperationException("OFBucketCounter not supported in version 1.0");
    }
    public OFBucketCounter bucketCounter(U64 packetCount, U64 byteCount) {
        throw new UnsupportedOperationException("OFBucketCounter not supported in version 1.0");
    }

    public OFGroupAdd.Builder buildGroupAdd() {
        throw new UnsupportedOperationException("OFGroupAdd not supported in version 1.0");
    }

    public OFGroupDelete.Builder buildGroupDelete() {
        throw new UnsupportedOperationException("OFGroupDelete not supported in version 1.0");
    }

    public OFGroupDescStatsEntry.Builder buildGroupDescStatsEntry() {
        throw new UnsupportedOperationException("OFGroupDescStatsEntry not supported in version 1.0");
    }

    public OFGroupDescStatsReply.Builder buildGroupDescStatsReply() {
        throw new UnsupportedOperationException("OFGroupDescStatsReply not supported in version 1.0");
    }

    public OFGroupDescStatsRequest.Builder buildGroupDescStatsRequest() {
        throw new UnsupportedOperationException("OFGroupDescStatsRequest not supported in version 1.0");
    }
    public OFGroupDescStatsRequest groupDescStatsRequest(Set<OFStatsRequestFlags> flags) {
        throw new UnsupportedOperationException("OFGroupDescStatsRequest not supported in version 1.0");
    }

    public OFGroupModify.Builder buildGroupModify() {
        throw new UnsupportedOperationException("OFGroupModify not supported in version 1.0");
    }

    public OFGroupStatsEntry.Builder buildGroupStatsEntry() {
        throw new UnsupportedOperationException("OFGroupStatsEntry not supported in version 1.0");
    }

    public OFGroupStatsReply.Builder buildGroupStatsReply() {
        throw new UnsupportedOperationException("OFGroupStatsReply not supported in version 1.0");
    }

    public OFGroupStatsRequest.Builder buildGroupStatsRequest() {
        throw new UnsupportedOperationException("OFGroupStatsRequest not supported in version 1.0");
    }

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

    public OFGroupFeaturesStatsReply.Builder buildGroupFeaturesStatsReply() {
        throw new UnsupportedOperationException("OFGroupFeaturesStatsReply not supported in version 1.0");
    }

    public OFGroupFeaturesStatsRequest.Builder buildGroupFeaturesStatsRequest() {
        throw new UnsupportedOperationException("OFGroupFeaturesStatsRequest not supported in version 1.0");
    }
    public OFGroupFeaturesStatsRequest groupFeaturesStatsRequest(Set<OFStatsRequestFlags> flags) {
        throw new UnsupportedOperationException("OFGroupFeaturesStatsRequest not supported in version 1.0");
    }

    public OFMatchV3.Builder buildMatchV3() {
        throw new UnsupportedOperationException("OFMatchV3 not supported in version 1.0");
    }
    public OFMatchV3 matchV3(OFOxmList oxmList) {
        throw new UnsupportedOperationException("OFMatchV3 not supported in version 1.0");
    }

    public OFRoleReply.Builder buildRoleReply() {
        throw new UnsupportedOperationException("OFRoleReply not supported in version 1.0");
    }

    public OFRoleRequest.Builder buildRoleRequest() {
        throw new UnsupportedOperationException("OFRoleRequest not supported in version 1.0");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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