// 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_interface.java
// Do not modify

package org.projectfloodlight.openflow.protocol.bsntlv;

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

public interface OFBsnTlvs {
    // Subfactories

    OFBsnTlvBroadcastQueryTimeout.Builder buildBroadcastQueryTimeout() throws UnsupportedOperationException;
    OFBsnTlvBroadcastQueryTimeout broadcastQueryTimeout(long value);
    OFBsnTlvCircuitId.Builder buildCircuitId() throws UnsupportedOperationException;
    OFBsnTlvCircuitId circuitId(byte[] value);
    OFBsnTlvCrcEnabled.Builder buildCrcEnabled() throws UnsupportedOperationException;
    OFBsnTlvCrcEnabled crcEnabled(short value);
    OFBsnTlvIdleNotification idleNotification();
    OFBsnTlvIdleTime.Builder buildIdleTime() throws UnsupportedOperationException;
    OFBsnTlvIdleTime idleTime(U64 value);
    OFBsnTlvIdleTimeout.Builder buildIdleTimeout() throws UnsupportedOperationException;
    OFBsnTlvIdleTimeout idleTimeout(long value);
    OFBsnTlvIpv4.Builder buildIpv4() throws UnsupportedOperationException;
    OFBsnTlvIpv4 ipv4(IPv4Address value);
    OFBsnTlvMac.Builder buildMac() throws UnsupportedOperationException;
    OFBsnTlvMac mac(MacAddress value);
    OFBsnTlvMissPackets.Builder buildMissPackets() throws UnsupportedOperationException;
    OFBsnTlvMissPackets missPackets(U64 value);
    OFBsnTlvPort.Builder buildPort() throws UnsupportedOperationException;
    OFBsnTlvPort port(OFPort value);
    OFBsnTlvQueueId.Builder buildQueueId() throws UnsupportedOperationException;
    OFBsnTlvQueueId queueId(long value);
    OFBsnTlvQueueWeight.Builder buildQueueWeight() throws UnsupportedOperationException;
    OFBsnTlvQueueWeight queueWeight(long value);
    OFBsnTlvReplyPackets.Builder buildReplyPackets() throws UnsupportedOperationException;
    OFBsnTlvReplyPackets replyPackets(U64 value);
    OFBsnTlvRequestPackets.Builder buildRequestPackets() throws UnsupportedOperationException;
    OFBsnTlvRequestPackets requestPackets(U64 value);
    OFBsnTlvRxPackets.Builder buildRxPackets() throws UnsupportedOperationException;
    OFBsnTlvRxPackets rxPackets(U64 value);
    OFBsnTlvTxPackets.Builder buildTxPackets() throws UnsupportedOperationException;
    OFBsnTlvTxPackets txPackets(U64 value);
    OFBsnTlvUdfAnchor.Builder buildUdfAnchor() throws UnsupportedOperationException;
    OFBsnTlvUdfAnchor udfAnchor(OFBsnUdfAnchor value);
    OFBsnTlvUdfId.Builder buildUdfId() throws UnsupportedOperationException;
    OFBsnTlvUdfId udfId(int value);
    OFBsnTlvUdfLength.Builder buildUdfLength() throws UnsupportedOperationException;
    OFBsnTlvUdfLength udfLength(int value);
    OFBsnTlvUdfOffset.Builder buildUdfOffset() throws UnsupportedOperationException;
    OFBsnTlvUdfOffset udfOffset(int value);
    OFBsnTlvUnicastQueryTimeout.Builder buildUnicastQueryTimeout() throws UnsupportedOperationException;
    OFBsnTlvUnicastQueryTimeout unicastQueryTimeout(long value);
    OFBsnTlvVlanVid.Builder buildVlanVid() throws UnsupportedOperationException;
    OFBsnTlvVlanVid vlanVid(VlanVid value);
    OFBsnTlvVrf.Builder buildVrf() throws UnsupportedOperationException;
    OFBsnTlvVrf vrf(long value);

    OFMessageReader<OFBsnTlv> getReader();
    OFVersion getVersion();
}
