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

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

package org.projectfloodlight.openflow.protocol.ver13;

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


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

    private final XidGenerator xidGenerator = XidGenerators.global();

    public OFActions actions() {
        return OFActionsVer13.INSTANCE;
    }
    public OFInstructions instructions() {
        return OFInstructionsVer13.INSTANCE;
    }
    public OFMeterBands meterBands() {
        return OFMeterBandsVer13.INSTANCE;
    }
    public OFOxms oxms() {
        return OFOxmsVer13.INSTANCE;
    }
    public OFQueueProps queueProps() {
        return OFQueuePropsVer13.INSTANCE;
    }
    public OFErrorMsgs errorMsgs() {
        return OFErrorMsgsVer13.INSTANCE;
    }
    public OFActionIds actionIds() {
        return OFActionIdsVer13.INSTANCE;
    }
    public OFInstructionIds instructionIds() {
        return OFInstructionIdsVer13.INSTANCE;
    }
    public OFBsnTlvs bsnTlvs() {
        return OFBsnTlvsVer13.INSTANCE;
    }


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    final static Match MATCH_WILDCARD_ALL = OFMatchV3Ver13.DEFAULT;

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

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

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

    public OFAsyncGetReply.Builder buildAsyncGetReply() {
        return new OFAsyncGetReplyVer13.Builder().setXid(nextXid());
    }

    public OFAsyncGetRequest.Builder buildAsyncGetRequest() {
        return new OFAsyncGetRequestVer13.Builder().setXid(nextXid());
    }

    public OFAsyncSet.Builder buildAsyncSet() {
        return new OFAsyncSetVer13.Builder().setXid(nextXid());
    }

    public OFBsnArpIdle.Builder buildBsnArpIdle() {
        return new OFBsnArpIdleVer13.Builder().setXid(nextXid());
    }

    public OFBsnControllerConnection.Builder buildBsnControllerConnection() {
        return new OFBsnControllerConnectionVer13.Builder();
    }

    public OFBsnControllerConnectionsReply.Builder buildBsnControllerConnectionsReply() {
        return new OFBsnControllerConnectionsReplyVer13.Builder().setXid(nextXid());
    }
    public OFBsnControllerConnectionsReply bsnControllerConnectionsReply(List<OFBsnControllerConnection> connections) {
        return new OFBsnControllerConnectionsReplyVer13(
                nextXid(),
                      connections
                    );
    }

    public OFBsnControllerConnectionsRequest.Builder buildBsnControllerConnectionsRequest() {
        return new OFBsnControllerConnectionsRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnControllerConnectionsRequest bsnControllerConnectionsRequest() {
        return new OFBsnControllerConnectionsRequestVer13(
                nextXid()
                    );
    }

    public OFBsnDebugCounterDescStatsEntry.Builder buildBsnDebugCounterDescStatsEntry() {
        return new OFBsnDebugCounterDescStatsEntryVer13.Builder();
    }

    public OFBsnDebugCounterDescStatsReply.Builder buildBsnDebugCounterDescStatsReply() {
        return new OFBsnDebugCounterDescStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnDebugCounterDescStatsRequest.Builder buildBsnDebugCounterDescStatsRequest() {
        return new OFBsnDebugCounterDescStatsRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnDebugCounterDescStatsRequest bsnDebugCounterDescStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFBsnDebugCounterDescStatsRequestVer13(
                nextXid(),
                      flags
                    );
    }

    public OFBsnDebugCounterStatsEntry.Builder buildBsnDebugCounterStatsEntry() {
        return new OFBsnDebugCounterStatsEntryVer13.Builder();
    }
    public OFBsnDebugCounterStatsEntry bsnDebugCounterStatsEntry(U64 counterId, U64 value) {
        return new OFBsnDebugCounterStatsEntryVer13(
                counterId,
                      value
                    );
    }

    public OFBsnDebugCounterStatsReply.Builder buildBsnDebugCounterStatsReply() {
        return new OFBsnDebugCounterStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnDebugCounterStatsRequest.Builder buildBsnDebugCounterStatsRequest() {
        return new OFBsnDebugCounterStatsRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnDebugCounterStatsRequest bsnDebugCounterStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFBsnDebugCounterStatsRequestVer13(
                nextXid(),
                      flags
                    );
    }

    public OFBsnFlowChecksumBucketStatsEntry.Builder buildBsnFlowChecksumBucketStatsEntry() {
        return new OFBsnFlowChecksumBucketStatsEntryVer13.Builder();
    }
    public OFBsnFlowChecksumBucketStatsEntry bsnFlowChecksumBucketStatsEntry(U64 checksum) {
        return new OFBsnFlowChecksumBucketStatsEntryVer13(
                checksum
                    );
    }

    public OFBsnFlowChecksumBucketStatsReply.Builder buildBsnFlowChecksumBucketStatsReply() {
        return new OFBsnFlowChecksumBucketStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnFlowChecksumBucketStatsRequest.Builder buildBsnFlowChecksumBucketStatsRequest() {
        return new OFBsnFlowChecksumBucketStatsRequestVer13.Builder().setXid(nextXid());
    }

    public OFBsnFlowIdle.Builder buildBsnFlowIdle() {
        return new OFBsnFlowIdleVer13.Builder().setXid(nextXid());
    }

    public OFBsnFlowIdleEnableGetReply.Builder buildBsnFlowIdleEnableGetReply() {
        return new OFBsnFlowIdleEnableGetReplyVer13.Builder().setXid(nextXid());
    }
    public OFBsnFlowIdleEnableGetReply bsnFlowIdleEnableGetReply(long enabled) {
        return new OFBsnFlowIdleEnableGetReplyVer13(
                nextXid(),
                      enabled
                    );
    }

    public OFBsnFlowIdleEnableGetRequest.Builder buildBsnFlowIdleEnableGetRequest() {
        return new OFBsnFlowIdleEnableGetRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnFlowIdleEnableGetRequest bsnFlowIdleEnableGetRequest() {
        return new OFBsnFlowIdleEnableGetRequestVer13(
                nextXid()
                    );
    }

    public OFBsnFlowIdleEnableSetReply.Builder buildBsnFlowIdleEnableSetReply() {
        return new OFBsnFlowIdleEnableSetReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnFlowIdleEnableSetRequest.Builder buildBsnFlowIdleEnableSetRequest() {
        return new OFBsnFlowIdleEnableSetRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnFlowIdleEnableSetRequest bsnFlowIdleEnableSetRequest(long enable) {
        return new OFBsnFlowIdleEnableSetRequestVer13(
                nextXid(),
                      enable
                    );
    }

    public OFBsnGentableBucketStatsEntry.Builder buildBsnGentableBucketStatsEntry() {
        return new OFBsnGentableBucketStatsEntryVer13.Builder();
    }
    public OFBsnGentableBucketStatsEntry bsnGentableBucketStatsEntry(U128 checksum) {
        return new OFBsnGentableBucketStatsEntryVer13(
                checksum
                    );
    }

    public OFBsnGentableBucketStatsReply.Builder buildBsnGentableBucketStatsReply() {
        return new OFBsnGentableBucketStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableBucketStatsRequest.Builder buildBsnGentableBucketStatsRequest() {
        return new OFBsnGentableBucketStatsRequestVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableClearReply.Builder buildBsnGentableClearReply() {
        return new OFBsnGentableClearReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableClearRequest.Builder buildBsnGentableClearRequest() {
        return new OFBsnGentableClearRequestVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableDescStatsEntry.Builder buildBsnGentableDescStatsEntry() {
        return new OFBsnGentableDescStatsEntryVer13.Builder();
    }

    public OFBsnGentableDescStatsReply.Builder buildBsnGentableDescStatsReply() {
        return new OFBsnGentableDescStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableDescStatsRequest.Builder buildBsnGentableDescStatsRequest() {
        return new OFBsnGentableDescStatsRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnGentableDescStatsRequest bsnGentableDescStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFBsnGentableDescStatsRequestVer13(
                nextXid(),
                      flags
                    );
    }

    public OFBsnGentableEntryAdd.Builder buildBsnGentableEntryAdd() {
        return new OFBsnGentableEntryAddVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableEntryDelete.Builder buildBsnGentableEntryDelete() {
        return new OFBsnGentableEntryDeleteVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableEntryDescStatsEntry.Builder buildBsnGentableEntryDescStatsEntry() {
        return new OFBsnGentableEntryDescStatsEntryVer13.Builder();
    }

    public OFBsnGentableEntryDescStatsReply.Builder buildBsnGentableEntryDescStatsReply() {
        return new OFBsnGentableEntryDescStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableEntryDescStatsRequest.Builder buildBsnGentableEntryDescStatsRequest() {
        return new OFBsnGentableEntryDescStatsRequestVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableEntryStatsEntry.Builder buildBsnGentableEntryStatsEntry() {
        return new OFBsnGentableEntryStatsEntryVer13.Builder();
    }
    public OFBsnGentableEntryStatsEntry bsnGentableEntryStatsEntry(List<OFBsnTlv> key, List<OFBsnTlv> stats) {
        return new OFBsnGentableEntryStatsEntryVer13(
                key,
                      stats
                    );
    }

    public OFBsnGentableEntryStatsReply.Builder buildBsnGentableEntryStatsReply() {
        return new OFBsnGentableEntryStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableEntryStatsRequest.Builder buildBsnGentableEntryStatsRequest() {
        return new OFBsnGentableEntryStatsRequestVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableSetBucketsSize.Builder buildBsnGentableSetBucketsSize() {
        return new OFBsnGentableSetBucketsSizeVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableStatsEntry.Builder buildBsnGentableStatsEntry() {
        return new OFBsnGentableStatsEntryVer13.Builder();
    }

    public OFBsnGentableStatsReply.Builder buildBsnGentableStatsReply() {
        return new OFBsnGentableStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnGentableStatsRequest.Builder buildBsnGentableStatsRequest() {
        return new OFBsnGentableStatsRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnGentableStatsRequest bsnGentableStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFBsnGentableStatsRequestVer13(
                nextXid(),
                      flags
                    );
    }

    public OFBsnGetSwitchPipelineReply.Builder buildBsnGetSwitchPipelineReply() {
        return new OFBsnGetSwitchPipelineReplyVer13.Builder().setXid(nextXid());
    }
    public OFBsnGetSwitchPipelineReply bsnGetSwitchPipelineReply(String pipeline) {
        return new OFBsnGetSwitchPipelineReplyVer13(
                nextXid(),
                      pipeline
                    );
    }

    public OFBsnGetSwitchPipelineRequest.Builder buildBsnGetSwitchPipelineRequest() {
        return new OFBsnGetSwitchPipelineRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnGetSwitchPipelineRequest bsnGetSwitchPipelineRequest() {
        return new OFBsnGetSwitchPipelineRequestVer13(
                nextXid()
                    );
    }

    public OFBsnImageDescStatsReply.Builder buildBsnImageDescStatsReply() {
        return new OFBsnImageDescStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnImageDescStatsRequest.Builder buildBsnImageDescStatsRequest() {
        return new OFBsnImageDescStatsRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnImageDescStatsRequest bsnImageDescStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFBsnImageDescStatsRequestVer13(
                nextXid(),
                      flags
                    );
    }

    public OFBsnLacpConvergenceNotif.Builder buildBsnLacpConvergenceNotif() {
        return new OFBsnLacpConvergenceNotifVer13.Builder().setXid(nextXid());
    }

    public OFBsnLacpStatsEntry.Builder buildBsnLacpStatsEntry() {
        return new OFBsnLacpStatsEntryVer13.Builder();
    }

    public OFBsnLacpStatsReply.Builder buildBsnLacpStatsReply() {
        return new OFBsnLacpStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnLacpStatsRequest.Builder buildBsnLacpStatsRequest() {
        return new OFBsnLacpStatsRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnLacpStatsRequest bsnLacpStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFBsnLacpStatsRequestVer13(
                nextXid(),
                      flags
                    );
    }

    public OFBsnLog.Builder buildBsnLog() {
        return new OFBsnLogVer13.Builder().setXid(nextXid());
    }

    public OFBsnPortCounterStatsEntry.Builder buildBsnPortCounterStatsEntry() {
        return new OFBsnPortCounterStatsEntryVer13.Builder();
    }
    public OFBsnPortCounterStatsEntry bsnPortCounterStatsEntry(OFPort portNo, List<U64> values) {
        return new OFBsnPortCounterStatsEntryVer13(
                portNo,
                      values
                    );
    }

    public OFBsnPortCounterStatsReply.Builder buildBsnPortCounterStatsReply() {
        return new OFBsnPortCounterStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnPortCounterStatsRequest.Builder buildBsnPortCounterStatsRequest() {
        return new OFBsnPortCounterStatsRequestVer13.Builder().setXid(nextXid());
    }

    public OFBsnRoleStatus.Builder buildBsnRoleStatus() {
        return new OFBsnRoleStatusVer13.Builder().setXid(nextXid());
    }

    public OFBsnSetAuxCxnsReply.Builder buildBsnSetAuxCxnsReply() {
        return new OFBsnSetAuxCxnsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnSetAuxCxnsRequest.Builder buildBsnSetAuxCxnsRequest() {
        return new OFBsnSetAuxCxnsRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnSetAuxCxnsRequest bsnSetAuxCxnsRequest(long numAux) {
        return new OFBsnSetAuxCxnsRequestVer13(
                nextXid(),
                      numAux
                    );
    }

    public OFBsnSetLacpReply.Builder buildBsnSetLacpReply() {
        return new OFBsnSetLacpReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnSetLacpRequest.Builder buildBsnSetLacpRequest() {
        return new OFBsnSetLacpRequestVer13.Builder().setXid(nextXid());
    }

    public OFBsnSetSwitchPipelineReply.Builder buildBsnSetSwitchPipelineReply() {
        return new OFBsnSetSwitchPipelineReplyVer13.Builder().setXid(nextXid());
    }
    public OFBsnSetSwitchPipelineReply bsnSetSwitchPipelineReply(long status) {
        return new OFBsnSetSwitchPipelineReplyVer13(
                nextXid(),
                      status
                    );
    }

    public OFBsnSetSwitchPipelineRequest.Builder buildBsnSetSwitchPipelineRequest() {
        return new OFBsnSetSwitchPipelineRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnSetSwitchPipelineRequest bsnSetSwitchPipelineRequest(String pipeline) {
        return new OFBsnSetSwitchPipelineRequestVer13(
                nextXid(),
                      pipeline
                    );
    }

    public OFBsnSwitchPipelineStatsEntry.Builder buildBsnSwitchPipelineStatsEntry() {
        return new OFBsnSwitchPipelineStatsEntryVer13.Builder();
    }
    public OFBsnSwitchPipelineStatsEntry bsnSwitchPipelineStatsEntry(String pipeline) {
        return new OFBsnSwitchPipelineStatsEntryVer13(
                pipeline
                    );
    }

    public OFBsnSwitchPipelineStatsReply.Builder buildBsnSwitchPipelineStatsReply() {
        return new OFBsnSwitchPipelineStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnSwitchPipelineStatsRequest.Builder buildBsnSwitchPipelineStatsRequest() {
        return new OFBsnSwitchPipelineStatsRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnSwitchPipelineStatsRequest bsnSwitchPipelineStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFBsnSwitchPipelineStatsRequestVer13(
                nextXid(),
                      flags
                    );
    }

    public OFBsnTableChecksumStatsEntry.Builder buildBsnTableChecksumStatsEntry() {
        return new OFBsnTableChecksumStatsEntryVer13.Builder();
    }
    public OFBsnTableChecksumStatsEntry bsnTableChecksumStatsEntry(TableId tableId, U64 checksum) {
        return new OFBsnTableChecksumStatsEntryVer13(
                tableId,
                      checksum
                    );
    }

    public OFBsnTableChecksumStatsReply.Builder buildBsnTableChecksumStatsReply() {
        return new OFBsnTableChecksumStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnTableChecksumStatsRequest.Builder buildBsnTableChecksumStatsRequest() {
        return new OFBsnTableChecksumStatsRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnTableChecksumStatsRequest bsnTableChecksumStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFBsnTableChecksumStatsRequestVer13(
                nextXid(),
                      flags
                    );
    }

    public OFBsnTableSetBucketsSize.Builder buildBsnTableSetBucketsSize() {
        return new OFBsnTableSetBucketsSizeVer13.Builder().setXid(nextXid());
    }

    public OFBsnTimeReply.Builder buildBsnTimeReply() {
        return new OFBsnTimeReplyVer13.Builder().setXid(nextXid());
    }
    public OFBsnTimeReply bsnTimeReply(U64 timeMs) {
        return new OFBsnTimeReplyVer13(
                nextXid(),
                      timeMs
                    );
    }

    public OFBsnTimeRequest.Builder buildBsnTimeRequest() {
        return new OFBsnTimeRequestVer13.Builder().setXid(nextXid());
    }
    public OFBsnTimeRequest bsnTimeRequest() {
        return new OFBsnTimeRequestVer13(
                nextXid()
                    );
    }

    public OFBsnVlanCounterStatsEntry.Builder buildBsnVlanCounterStatsEntry() {
        return new OFBsnVlanCounterStatsEntryVer13.Builder();
    }
    public OFBsnVlanCounterStatsEntry bsnVlanCounterStatsEntry(int vlanVid, List<U64> values) {
        return new OFBsnVlanCounterStatsEntryVer13(
                vlanVid,
                      values
                    );
    }

    public OFBsnVlanCounterStatsReply.Builder buildBsnVlanCounterStatsReply() {
        return new OFBsnVlanCounterStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnVlanCounterStatsRequest.Builder buildBsnVlanCounterStatsRequest() {
        return new OFBsnVlanCounterStatsRequestVer13.Builder().setXid(nextXid());
    }

    public OFBsnVrfCounterStatsEntry.Builder buildBsnVrfCounterStatsEntry() {
        return new OFBsnVrfCounterStatsEntryVer13.Builder();
    }
    public OFBsnVrfCounterStatsEntry bsnVrfCounterStatsEntry(long vrf, List<U64> values) {
        return new OFBsnVrfCounterStatsEntryVer13(
                vrf,
                      values
                    );
    }

    public OFBsnVrfCounterStatsReply.Builder buildBsnVrfCounterStatsReply() {
        return new OFBsnVrfCounterStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFBsnVrfCounterStatsRequest.Builder buildBsnVrfCounterStatsRequest() {
        return new OFBsnVrfCounterStatsRequestVer13.Builder().setXid(nextXid());
    }

    public OFHelloElemVersionbitmap.Builder buildHelloElemVersionbitmap() {
        return new OFHelloElemVersionbitmapVer13.Builder();
    }
    public OFHelloElemVersionbitmap helloElemVersionbitmap(List<U32> bitmaps) {
        return new OFHelloElemVersionbitmapVer13(
                bitmaps
                    );
    }

    public OFMeterBandStats.Builder buildMeterBandStats() {
        return new OFMeterBandStatsVer13.Builder();
    }
    public OFMeterBandStats meterBandStats(U64 packetBandCount, U64 byteBandCount) {
        return new OFMeterBandStatsVer13(
                packetBandCount,
                      byteBandCount
                    );
    }

    public OFMeterConfig.Builder buildMeterConfig() {
        return new OFMeterConfigVer13.Builder();
    }

    public OFMeterConfigStatsReply.Builder buildMeterConfigStatsReply() {
        return new OFMeterConfigStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFMeterConfigStatsRequest.Builder buildMeterConfigStatsRequest() {
        return new OFMeterConfigStatsRequestVer13.Builder().setXid(nextXid());
    }

    public OFMeterFeatures.Builder buildMeterFeatures() {
        return new OFMeterFeaturesVer13.Builder();
    }

    public OFMeterFeaturesStatsReply.Builder buildMeterFeaturesStatsReply() {
        return new OFMeterFeaturesStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFMeterFeaturesStatsRequest.Builder buildMeterFeaturesStatsRequest() {
        return new OFMeterFeaturesStatsRequestVer13.Builder().setXid(nextXid());
    }
    public OFMeterFeaturesStatsRequest meterFeaturesStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFMeterFeaturesStatsRequestVer13(
                nextXid(),
                      flags
                    );
    }

    public OFMeterMod.Builder buildMeterMod() {
        return new OFMeterModVer13.Builder().setXid(nextXid());
    }

    public OFMeterStats.Builder buildMeterStats() {
        return new OFMeterStatsVer13.Builder();
    }

    public OFMeterStatsReply.Builder buildMeterStatsReply() {
        return new OFMeterStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFMeterStatsRequest.Builder buildMeterStatsRequest() {
        return new OFMeterStatsRequestVer13.Builder().setXid(nextXid());
    }

    public OFPortDescStatsReply.Builder buildPortDescStatsReply() {
        return new OFPortDescStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFPortDescStatsRequest.Builder buildPortDescStatsRequest() {
        return new OFPortDescStatsRequestVer13.Builder().setXid(nextXid());
    }
    public OFPortDescStatsRequest portDescStatsRequest(Set<OFStatsRequestFlags> flags) {
        return new OFPortDescStatsRequestVer13(
                nextXid(),
                      flags
                    );
    }

    public OFTableFeaturePropApplyActions.Builder buildTableFeaturePropApplyActions() {
        return new OFTableFeaturePropApplyActionsVer13.Builder();
    }
    public OFTableFeaturePropApplyActions tableFeaturePropApplyActions(List<OFActionId> actionIds) {
        return new OFTableFeaturePropApplyActionsVer13(
                actionIds
                    );
    }

    public OFTableFeaturePropApplyActionsMiss.Builder buildTableFeaturePropApplyActionsMiss() {
        return new OFTableFeaturePropApplyActionsMissVer13.Builder();
    }
    public OFTableFeaturePropApplyActionsMiss tableFeaturePropApplyActionsMiss(List<OFActionId> actionIds) {
        return new OFTableFeaturePropApplyActionsMissVer13(
                actionIds
                    );
    }

    public OFTableFeaturePropApplySetfield.Builder buildTableFeaturePropApplySetfield() {
        return new OFTableFeaturePropApplySetfieldVer13.Builder();
    }
    public OFTableFeaturePropApplySetfield tableFeaturePropApplySetfield(List<U32> oxmIds) {
        return new OFTableFeaturePropApplySetfieldVer13(
                oxmIds
                    );
    }

    public OFTableFeaturePropApplySetfieldMiss.Builder buildTableFeaturePropApplySetfieldMiss() {
        return new OFTableFeaturePropApplySetfieldMissVer13.Builder();
    }
    public OFTableFeaturePropApplySetfieldMiss tableFeaturePropApplySetfieldMiss(List<U32> oxmIds) {
        return new OFTableFeaturePropApplySetfieldMissVer13(
                oxmIds
                    );
    }

    public OFTableFeaturePropExperimenter.Builder buildTableFeaturePropExperimenter() {
        return new OFTableFeaturePropExperimenterVer13.Builder();
    }

    public OFTableFeaturePropExperimenterMiss.Builder buildTableFeaturePropExperimenterMiss() {
        return new OFTableFeaturePropExperimenterMissVer13.Builder();
    }

    public OFTableFeaturePropInstructions.Builder buildTableFeaturePropInstructions() {
        return new OFTableFeaturePropInstructionsVer13.Builder();
    }
    public OFTableFeaturePropInstructions tableFeaturePropInstructions(List<OFInstructionId> instructionIds) {
        return new OFTableFeaturePropInstructionsVer13(
                instructionIds
                    );
    }

    public OFTableFeaturePropInstructionsMiss.Builder buildTableFeaturePropInstructionsMiss() {
        return new OFTableFeaturePropInstructionsMissVer13.Builder();
    }
    public OFTableFeaturePropInstructionsMiss tableFeaturePropInstructionsMiss(List<OFInstructionId> instructionIds) {
        return new OFTableFeaturePropInstructionsMissVer13(
                instructionIds
                    );
    }

    public OFTableFeaturePropMatch.Builder buildTableFeaturePropMatch() {
        return new OFTableFeaturePropMatchVer13.Builder();
    }
    public OFTableFeaturePropMatch tableFeaturePropMatch(List<U32> oxmIds) {
        return new OFTableFeaturePropMatchVer13(
                oxmIds
                    );
    }

    public OFTableFeaturePropNextTables.Builder buildTableFeaturePropNextTables() {
        return new OFTableFeaturePropNextTablesVer13.Builder();
    }
    public OFTableFeaturePropNextTables tableFeaturePropNextTables(List<U8> nextTableIds) {
        return new OFTableFeaturePropNextTablesVer13(
                nextTableIds
                    );
    }

    public OFTableFeaturePropNextTablesMiss.Builder buildTableFeaturePropNextTablesMiss() {
        return new OFTableFeaturePropNextTablesMissVer13.Builder();
    }
    public OFTableFeaturePropNextTablesMiss tableFeaturePropNextTablesMiss(List<U8> nextTableIds) {
        return new OFTableFeaturePropNextTablesMissVer13(
                nextTableIds
                    );
    }

    public OFTableFeaturePropWildcards.Builder buildTableFeaturePropWildcards() {
        return new OFTableFeaturePropWildcardsVer13.Builder();
    }
    public OFTableFeaturePropWildcards tableFeaturePropWildcards(List<U32> oxmIds) {
        return new OFTableFeaturePropWildcardsVer13(
                oxmIds
                    );
    }

    public OFTableFeaturePropWriteActions.Builder buildTableFeaturePropWriteActions() {
        return new OFTableFeaturePropWriteActionsVer13.Builder();
    }
    public OFTableFeaturePropWriteActions tableFeaturePropWriteActions(List<OFActionId> actionIds) {
        return new OFTableFeaturePropWriteActionsVer13(
                actionIds
                    );
    }

    public OFTableFeaturePropWriteActionsMiss.Builder buildTableFeaturePropWriteActionsMiss() {
        return new OFTableFeaturePropWriteActionsMissVer13.Builder();
    }
    public OFTableFeaturePropWriteActionsMiss tableFeaturePropWriteActionsMiss(List<OFActionId> actionIds) {
        return new OFTableFeaturePropWriteActionsMissVer13(
                actionIds
                    );
    }

    public OFTableFeaturePropWriteSetfield.Builder buildTableFeaturePropWriteSetfield() {
        return new OFTableFeaturePropWriteSetfieldVer13.Builder();
    }
    public OFTableFeaturePropWriteSetfield tableFeaturePropWriteSetfield(List<U32> oxmIds) {
        return new OFTableFeaturePropWriteSetfieldVer13(
                oxmIds
                    );
    }

    public OFTableFeaturePropWriteSetfieldMiss.Builder buildTableFeaturePropWriteSetfieldMiss() {
        return new OFTableFeaturePropWriteSetfieldMissVer13.Builder();
    }
    public OFTableFeaturePropWriteSetfieldMiss tableFeaturePropWriteSetfieldMiss(List<U32> oxmIds) {
        return new OFTableFeaturePropWriteSetfieldMissVer13(
                oxmIds
                    );
    }

    public OFTableFeatures.Builder buildTableFeatures() {
        return new OFTableFeaturesVer13.Builder();
    }

    public OFTableFeaturesStatsReply.Builder buildTableFeaturesStatsReply() {
        return new OFTableFeaturesStatsReplyVer13.Builder().setXid(nextXid());
    }

    public OFTableFeaturesStatsRequest.Builder buildTableFeaturesStatsRequest() {
        return new OFTableFeaturesStatsRequestVer13.Builder().setXid(nextXid());
    }

    public OFUint64.Builder buildUint64() {
        return new OFUint64Ver13.Builder();
    }
    public OFUint64 uint64(U64 value) {
        return new OFUint64Ver13(
                value
                    );
    }

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

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

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