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


public class OFActionsVer10 implements OFActions {
    public final static OFActionsVer10 INSTANCE = new OFActionsVer10();




    public OFActionBsnChecksum.Builder buildBsnChecksum() {
        return new OFActionBsnChecksumVer10.Builder();
    }
    public OFActionBsnChecksum bsnChecksum(U128 checksum) {
        return new OFActionBsnChecksumVer10(
                checksum
                    );
    }

    public OFActionBsnMirror.Builder buildBsnMirror() {
        return new OFActionBsnMirrorVer10.Builder();
    }

    public OFActionBsnSetTunnelDst.Builder buildBsnSetTunnelDst() {
        return new OFActionBsnSetTunnelDstVer10.Builder();
    }
    public OFActionBsnSetTunnelDst bsnSetTunnelDst(long dst) {
        return new OFActionBsnSetTunnelDstVer10(
                dst
                    );
    }

    public OFActionEnqueue.Builder buildEnqueue() {
        return new OFActionEnqueueVer10.Builder();
    }
    public OFActionEnqueue enqueue(OFPort port, long queueId) {
        return new OFActionEnqueueVer10(
                port,
                      queueId
                    );
    }

    public OFActionNiciraDecTtl niciraDecTtl() {
        return OFActionNiciraDecTtlVer10.INSTANCE;
    }

    public OFActionOutput.Builder buildOutput() {
        return new OFActionOutputVer10.Builder();
    }
    public OFActionOutput output(OFPort port, int maxLen) {
        return new OFActionOutputVer10(
                port,
                      maxLen
                    );
    }

    public OFActionSetDlDst.Builder buildSetDlDst() {
        return new OFActionSetDlDstVer10.Builder();
    }
    public OFActionSetDlDst setDlDst(MacAddress dlAddr) {
        return new OFActionSetDlDstVer10(
                dlAddr
                    );
    }

    public OFActionSetDlSrc.Builder buildSetDlSrc() {
        return new OFActionSetDlSrcVer10.Builder();
    }
    public OFActionSetDlSrc setDlSrc(MacAddress dlAddr) {
        return new OFActionSetDlSrcVer10(
                dlAddr
                    );
    }

    public OFActionSetNwDst.Builder buildSetNwDst() {
        return new OFActionSetNwDstVer10.Builder();
    }
    public OFActionSetNwDst setNwDst(IPv4Address nwAddr) {
        return new OFActionSetNwDstVer10(
                nwAddr
                    );
    }

    public OFActionSetNwSrc.Builder buildSetNwSrc() {
        return new OFActionSetNwSrcVer10.Builder();
    }
    public OFActionSetNwSrc setNwSrc(IPv4Address nwAddr) {
        return new OFActionSetNwSrcVer10(
                nwAddr
                    );
    }

    public OFActionSetNwTos.Builder buildSetNwTos() {
        return new OFActionSetNwTosVer10.Builder();
    }
    public OFActionSetNwTos setNwTos(short nwTos) {
        return new OFActionSetNwTosVer10(
                nwTos
                    );
    }

    public OFActionSetTpDst.Builder buildSetTpDst() {
        return new OFActionSetTpDstVer10.Builder();
    }
    public OFActionSetTpDst setTpDst(TransportPort tpPort) {
        return new OFActionSetTpDstVer10(
                tpPort
                    );
    }

    public OFActionSetTpSrc.Builder buildSetTpSrc() {
        return new OFActionSetTpSrcVer10.Builder();
    }
    public OFActionSetTpSrc setTpSrc(TransportPort tpPort) {
        return new OFActionSetTpSrcVer10(
                tpPort
                    );
    }

    public OFActionSetVlanPcp.Builder buildSetVlanPcp() {
        return new OFActionSetVlanPcpVer10.Builder();
    }
    public OFActionSetVlanPcp setVlanPcp(VlanPcp vlanPcp) {
        return new OFActionSetVlanPcpVer10(
                vlanPcp
                    );
    }

    public OFActionSetVlanVid.Builder buildSetVlanVid() {
        return new OFActionSetVlanVidVer10.Builder();
    }
    public OFActionSetVlanVid setVlanVid(VlanVid vlanVid) {
        return new OFActionSetVlanVidVer10(
                vlanVid
                    );
    }

    public OFActionStripVlan stripVlan() {
        return OFActionStripVlanVer10.INSTANCE;
    }

    public OFActionCopyTtlIn copyTtlIn() {
        throw new UnsupportedOperationException("OFActionCopyTtlIn not supported in version 1.0");
    }

    public OFActionCopyTtlOut copyTtlOut() {
        throw new UnsupportedOperationException("OFActionCopyTtlOut not supported in version 1.0");
    }

    public OFActionDecMplsTtl decMplsTtl() {
        throw new UnsupportedOperationException("OFActionDecMplsTtl not supported in version 1.0");
    }

    public OFActionDecNwTtl decNwTtl() {
        throw new UnsupportedOperationException("OFActionDecNwTtl not supported in version 1.0");
    }

    public OFActionGroup.Builder buildGroup() {
        throw new UnsupportedOperationException("OFActionGroup not supported in version 1.0");
    }
    public OFActionGroup group(OFGroup group) {
        throw new UnsupportedOperationException("OFActionGroup not supported in version 1.0");
    }

    public OFActionPopMpls.Builder buildPopMpls() {
        throw new UnsupportedOperationException("OFActionPopMpls not supported in version 1.0");
    }
    public OFActionPopMpls popMpls(EthType ethertype) {
        throw new UnsupportedOperationException("OFActionPopMpls not supported in version 1.0");
    }

    public OFActionPopVlan popVlan() {
        throw new UnsupportedOperationException("OFActionPopVlan not supported in version 1.0");
    }

    public OFActionPushMpls.Builder buildPushMpls() {
        throw new UnsupportedOperationException("OFActionPushMpls not supported in version 1.0");
    }
    public OFActionPushMpls pushMpls(EthType ethertype) {
        throw new UnsupportedOperationException("OFActionPushMpls not supported in version 1.0");
    }

    public OFActionPushVlan.Builder buildPushVlan() {
        throw new UnsupportedOperationException("OFActionPushVlan not supported in version 1.0");
    }
    public OFActionPushVlan pushVlan(EthType ethertype) {
        throw new UnsupportedOperationException("OFActionPushVlan not supported in version 1.0");
    }

    public OFActionSetMplsLabel.Builder buildSetMplsLabel() {
        throw new UnsupportedOperationException("OFActionSetMplsLabel not supported in version 1.0");
    }
    public OFActionSetMplsLabel setMplsLabel(long mplsLabel) {
        throw new UnsupportedOperationException("OFActionSetMplsLabel not supported in version 1.0");
    }

    public OFActionSetMplsTc.Builder buildSetMplsTc() {
        throw new UnsupportedOperationException("OFActionSetMplsTc not supported in version 1.0");
    }
    public OFActionSetMplsTc setMplsTc(short mplsTc) {
        throw new UnsupportedOperationException("OFActionSetMplsTc not supported in version 1.0");
    }

    public OFActionSetMplsTtl.Builder buildSetMplsTtl() {
        throw new UnsupportedOperationException("OFActionSetMplsTtl not supported in version 1.0");
    }
    public OFActionSetMplsTtl setMplsTtl(short mplsTtl) {
        throw new UnsupportedOperationException("OFActionSetMplsTtl not supported in version 1.0");
    }

    public OFActionSetNwEcn.Builder buildSetNwEcn() {
        throw new UnsupportedOperationException("OFActionSetNwEcn not supported in version 1.0");
    }
    public OFActionSetNwEcn setNwEcn(IpEcn nwEcn) {
        throw new UnsupportedOperationException("OFActionSetNwEcn not supported in version 1.0");
    }

    public OFActionSetNwTtl.Builder buildSetNwTtl() {
        throw new UnsupportedOperationException("OFActionSetNwTtl not supported in version 1.0");
    }
    public OFActionSetNwTtl setNwTtl(short nwTtl) {
        throw new UnsupportedOperationException("OFActionSetNwTtl not supported in version 1.0");
    }

    public OFActionSetQueue.Builder buildSetQueue() {
        throw new UnsupportedOperationException("OFActionSetQueue not supported in version 1.0");
    }
    public OFActionSetQueue setQueue(long queueId) {
        throw new UnsupportedOperationException("OFActionSetQueue not supported in version 1.0");
    }

    public OFActionSetField.Builder buildSetField() {
        throw new UnsupportedOperationException("OFActionSetField not supported in version 1.0");
    }
    public OFActionSetField setField(OFOxm<?> field) {
        throw new UnsupportedOperationException("OFActionSetField not supported in version 1.0");
    }

    public OFActionPopPbb popPbb() {
        throw new UnsupportedOperationException("OFActionPopPbb not supported in version 1.0");
    }

    public OFActionPushPbb.Builder buildPushPbb() {
        throw new UnsupportedOperationException("OFActionPushPbb not supported in version 1.0");
    }
    public OFActionPushPbb pushPbb(EthType ethertype) {
        throw new UnsupportedOperationException("OFActionPushPbb not supported in version 1.0");
    }

    public OFMessageReader<OFAction> getReader() {
        return OFActionVer10.READER;
    }


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