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

package org.projectfloodlight.openflow.protocol;

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 org.jboss.netty.buffer.ChannelBuffer;

public interface OFMatchV2 extends OFObject, Match {
    int getType();
    OFPort getInPort();
    int getWildcards();
    MacAddress getEthSrc();
    MacAddress getEthSrcMask();
    MacAddress getEthDst();
    MacAddress getEthDstMask();
    int getVlanVid();
    short getVlanPcp();
    int getEthType();
    short getIpDscp();
    short getIpProto();
    IPv4Address getIpv4Src();
    IPv4Address getIpv4SrcMask();
    IPv4Address getIpv4Dst();
    IPv4Address getIpv4DstMask();
    int getTcpSrc();
    int getTcpDst();
    long getMplsLabel();
    short getMplsTc();
    U64 getMetadata();
    U64 getMetadataMask();
    OFVersion getVersion();

    void writeTo(ChannelBuffer channelBuffer);

    Builder createBuilder();
    public interface Builder extends Match.Builder {
        OFMatchV2 build();
        int getType();
        OFPort getInPort();
        Builder setInPort(OFPort inPort);
        int getWildcards();
        Builder setWildcards(int wildcards);
        MacAddress getEthSrc();
        Builder setEthSrc(MacAddress ethSrc);
        MacAddress getEthSrcMask();
        Builder setEthSrcMask(MacAddress ethSrcMask);
        MacAddress getEthDst();
        Builder setEthDst(MacAddress ethDst);
        MacAddress getEthDstMask();
        Builder setEthDstMask(MacAddress ethDstMask);
        int getVlanVid();
        Builder setVlanVid(int vlanVid);
        short getVlanPcp();
        Builder setVlanPcp(short vlanPcp);
        int getEthType();
        Builder setEthType(int ethType);
        short getIpDscp();
        Builder setIpDscp(short ipDscp);
        short getIpProto();
        Builder setIpProto(short ipProto);
        IPv4Address getIpv4Src();
        Builder setIpv4Src(IPv4Address ipv4Src);
        IPv4Address getIpv4SrcMask();
        Builder setIpv4SrcMask(IPv4Address ipv4SrcMask);
        IPv4Address getIpv4Dst();
        Builder setIpv4Dst(IPv4Address ipv4Dst);
        IPv4Address getIpv4DstMask();
        Builder setIpv4DstMask(IPv4Address ipv4DstMask);
        int getTcpSrc();
        Builder setTcpSrc(int tcpSrc);
        int getTcpDst();
        Builder setTcpDst(int tcpDst);
        long getMplsLabel();
        Builder setMplsLabel(long mplsLabel);
        short getMplsTc();
        Builder setMplsTc(short mplsTc);
        U64 getMetadata();
        Builder setMetadata(U64 metadata);
        U64 getMetadataMask();
        Builder setMetadataMask(U64 metadataMask);
        OFVersion getVersion();
    }
}
