// 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_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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Set;
import com.google.common.collect.ImmutableSet;
import org.jboss.netty.buffer.ChannelBuffer;
import com.google.common.hash.PrimitiveSink;
import com.google.common.hash.Funnel;

class OFBsnVportL2GreVer10 implements OFBsnVportL2Gre {
    private static final Logger logger = LoggerFactory.getLogger(OFBsnVportL2GreVer10.class);
    // version: 1.0
    final static byte WIRE_VERSION = 1;
    final static int LENGTH = 60;

        private final static Set<OFBsnVportL2GreFlags> DEFAULT_FLAGS = ImmutableSet.<OFBsnVportL2GreFlags>of();
        private final static OFPort DEFAULT_PORT_NO = OFPort.ANY;
        private final static OFPort DEFAULT_LOOPBACK_PORT_NO = OFPort.ANY;
        private final static MacAddress DEFAULT_LOCAL_MAC = MacAddress.NONE;
        private final static MacAddress DEFAULT_NH_MAC = MacAddress.NONE;
        private final static IPv4Address DEFAULT_SRC_IP = IPv4Address.NONE;
        private final static IPv4Address DEFAULT_DST_IP = IPv4Address.NONE;
        private final static short DEFAULT_DSCP = (short) 0x0;
        private final static short DEFAULT_TTL = (short) 0x0;
        private final static long DEFAULT_VPN = 0x0L;
        private final static long DEFAULT_RATE_LIMIT = 0x0L;
        private final static String DEFAULT_IF_NAME = "";

    // OF message fields
    private final Set<OFBsnVportL2GreFlags> flags;
    private final OFPort portNo;
    private final OFPort loopbackPortNo;
    private final MacAddress localMac;
    private final MacAddress nhMac;
    private final IPv4Address srcIp;
    private final IPv4Address dstIp;
    private final short dscp;
    private final short ttl;
    private final long vpn;
    private final long rateLimit;
    private final String ifName;
//
    // Immutable default instance
    final static OFBsnVportL2GreVer10 DEFAULT = new OFBsnVportL2GreVer10(
        DEFAULT_FLAGS, DEFAULT_PORT_NO, DEFAULT_LOOPBACK_PORT_NO, DEFAULT_LOCAL_MAC, DEFAULT_NH_MAC, DEFAULT_SRC_IP, DEFAULT_DST_IP, DEFAULT_DSCP, DEFAULT_TTL, DEFAULT_VPN, DEFAULT_RATE_LIMIT, DEFAULT_IF_NAME
    );

    // package private constructor - used by readers, builders, and factory
    OFBsnVportL2GreVer10(Set<OFBsnVportL2GreFlags> flags, OFPort portNo, OFPort loopbackPortNo, MacAddress localMac, MacAddress nhMac, IPv4Address srcIp, IPv4Address dstIp, short dscp, short ttl, long vpn, long rateLimit, String ifName) {
        this.flags = flags;
        this.portNo = portNo;
        this.loopbackPortNo = loopbackPortNo;
        this.localMac = localMac;
        this.nhMac = nhMac;
        this.srcIp = srcIp;
        this.dstIp = dstIp;
        this.dscp = dscp;
        this.ttl = ttl;
        this.vpn = vpn;
        this.rateLimit = rateLimit;
        this.ifName = ifName;
    }

    // Accessors for OF message fields
    @Override
    public int getType() {
        return 0x1;
    }

    @Override
    public Set<OFBsnVportL2GreFlags> getFlags() {
        return flags;
    }

    @Override
    public OFPort getPortNo() {
        return portNo;
    }

    @Override
    public OFPort getLoopbackPortNo() {
        return loopbackPortNo;
    }

    @Override
    public MacAddress getLocalMac() {
        return localMac;
    }

    @Override
    public MacAddress getNhMac() {
        return nhMac;
    }

    @Override
    public IPv4Address getSrcIp() {
        return srcIp;
    }

    @Override
    public IPv4Address getDstIp() {
        return dstIp;
    }

    @Override
    public short getDscp() {
        return dscp;
    }

    @Override
    public short getTtl() {
        return ttl;
    }

    @Override
    public long getVpn() {
        return vpn;
    }

    @Override
    public long getRateLimit() {
        return rateLimit;
    }

    @Override
    public String getIfName() {
        return ifName;
    }

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



    public OFBsnVportL2Gre.Builder createBuilder() {
        return new BuilderWithParent(this);
    }

    static class BuilderWithParent implements OFBsnVportL2Gre.Builder {
        final OFBsnVportL2GreVer10 parentMessage;

        // OF message fields
        private boolean flagsSet;
        private Set<OFBsnVportL2GreFlags> flags;
        private boolean portNoSet;
        private OFPort portNo;
        private boolean loopbackPortNoSet;
        private OFPort loopbackPortNo;
        private boolean localMacSet;
        private MacAddress localMac;
        private boolean nhMacSet;
        private MacAddress nhMac;
        private boolean srcIpSet;
        private IPv4Address srcIp;
        private boolean dstIpSet;
        private IPv4Address dstIp;
        private boolean dscpSet;
        private short dscp;
        private boolean ttlSet;
        private short ttl;
        private boolean vpnSet;
        private long vpn;
        private boolean rateLimitSet;
        private long rateLimit;
        private boolean ifNameSet;
        private String ifName;

        BuilderWithParent(OFBsnVportL2GreVer10 parentMessage) {
            this.parentMessage = parentMessage;
        }

    @Override
    public int getType() {
        return 0x1;
    }

    @Override
    public Set<OFBsnVportL2GreFlags> getFlags() {
        return flags;
    }

    @Override
    public OFBsnVportL2Gre.Builder setFlags(Set<OFBsnVportL2GreFlags> flags) {
        this.flags = flags;
        this.flagsSet = true;
        return this;
    }
    @Override
    public OFPort getPortNo() {
        return portNo;
    }

    @Override
    public OFBsnVportL2Gre.Builder setPortNo(OFPort portNo) {
        this.portNo = portNo;
        this.portNoSet = true;
        return this;
    }
    @Override
    public OFPort getLoopbackPortNo() {
        return loopbackPortNo;
    }

    @Override
    public OFBsnVportL2Gre.Builder setLoopbackPortNo(OFPort loopbackPortNo) {
        this.loopbackPortNo = loopbackPortNo;
        this.loopbackPortNoSet = true;
        return this;
    }
    @Override
    public MacAddress getLocalMac() {
        return localMac;
    }

    @Override
    public OFBsnVportL2Gre.Builder setLocalMac(MacAddress localMac) {
        this.localMac = localMac;
        this.localMacSet = true;
        return this;
    }
    @Override
    public MacAddress getNhMac() {
        return nhMac;
    }

    @Override
    public OFBsnVportL2Gre.Builder setNhMac(MacAddress nhMac) {
        this.nhMac = nhMac;
        this.nhMacSet = true;
        return this;
    }
    @Override
    public IPv4Address getSrcIp() {
        return srcIp;
    }

    @Override
    public OFBsnVportL2Gre.Builder setSrcIp(IPv4Address srcIp) {
        this.srcIp = srcIp;
        this.srcIpSet = true;
        return this;
    }
    @Override
    public IPv4Address getDstIp() {
        return dstIp;
    }

    @Override
    public OFBsnVportL2Gre.Builder setDstIp(IPv4Address dstIp) {
        this.dstIp = dstIp;
        this.dstIpSet = true;
        return this;
    }
    @Override
    public short getDscp() {
        return dscp;
    }

    @Override
    public OFBsnVportL2Gre.Builder setDscp(short dscp) {
        this.dscp = dscp;
        this.dscpSet = true;
        return this;
    }
    @Override
    public short getTtl() {
        return ttl;
    }

    @Override
    public OFBsnVportL2Gre.Builder setTtl(short ttl) {
        this.ttl = ttl;
        this.ttlSet = true;
        return this;
    }
    @Override
    public long getVpn() {
        return vpn;
    }

    @Override
    public OFBsnVportL2Gre.Builder setVpn(long vpn) {
        this.vpn = vpn;
        this.vpnSet = true;
        return this;
    }
    @Override
    public long getRateLimit() {
        return rateLimit;
    }

    @Override
    public OFBsnVportL2Gre.Builder setRateLimit(long rateLimit) {
        this.rateLimit = rateLimit;
        this.rateLimitSet = true;
        return this;
    }
    @Override
    public String getIfName() {
        return ifName;
    }

    @Override
    public OFBsnVportL2Gre.Builder setIfName(String ifName) {
        this.ifName = ifName;
        this.ifNameSet = true;
        return this;
    }
    @Override
    public OFVersion getVersion() {
        return OFVersion.OF_10;
    }



        @Override
        public OFBsnVportL2Gre build() {
                Set<OFBsnVportL2GreFlags> flags = this.flagsSet ? this.flags : parentMessage.flags;
                if(flags == null)
                    throw new NullPointerException("Property flags must not be null");
                OFPort portNo = this.portNoSet ? this.portNo : parentMessage.portNo;
                if(portNo == null)
                    throw new NullPointerException("Property portNo must not be null");
                OFPort loopbackPortNo = this.loopbackPortNoSet ? this.loopbackPortNo : parentMessage.loopbackPortNo;
                if(loopbackPortNo == null)
                    throw new NullPointerException("Property loopbackPortNo must not be null");
                MacAddress localMac = this.localMacSet ? this.localMac : parentMessage.localMac;
                if(localMac == null)
                    throw new NullPointerException("Property localMac must not be null");
                MacAddress nhMac = this.nhMacSet ? this.nhMac : parentMessage.nhMac;
                if(nhMac == null)
                    throw new NullPointerException("Property nhMac must not be null");
                IPv4Address srcIp = this.srcIpSet ? this.srcIp : parentMessage.srcIp;
                if(srcIp == null)
                    throw new NullPointerException("Property srcIp must not be null");
                IPv4Address dstIp = this.dstIpSet ? this.dstIp : parentMessage.dstIp;
                if(dstIp == null)
                    throw new NullPointerException("Property dstIp must not be null");
                short dscp = this.dscpSet ? this.dscp : parentMessage.dscp;
                short ttl = this.ttlSet ? this.ttl : parentMessage.ttl;
                long vpn = this.vpnSet ? this.vpn : parentMessage.vpn;
                long rateLimit = this.rateLimitSet ? this.rateLimit : parentMessage.rateLimit;
                String ifName = this.ifNameSet ? this.ifName : parentMessage.ifName;
                if(ifName == null)
                    throw new NullPointerException("Property ifName must not be null");

                //
                return new OFBsnVportL2GreVer10(
                    flags,
                    portNo,
                    loopbackPortNo,
                    localMac,
                    nhMac,
                    srcIp,
                    dstIp,
                    dscp,
                    ttl,
                    vpn,
                    rateLimit,
                    ifName
                );
        }

    }

    static class Builder implements OFBsnVportL2Gre.Builder {
        // OF message fields
        private boolean flagsSet;
        private Set<OFBsnVportL2GreFlags> flags;
        private boolean portNoSet;
        private OFPort portNo;
        private boolean loopbackPortNoSet;
        private OFPort loopbackPortNo;
        private boolean localMacSet;
        private MacAddress localMac;
        private boolean nhMacSet;
        private MacAddress nhMac;
        private boolean srcIpSet;
        private IPv4Address srcIp;
        private boolean dstIpSet;
        private IPv4Address dstIp;
        private boolean dscpSet;
        private short dscp;
        private boolean ttlSet;
        private short ttl;
        private boolean vpnSet;
        private long vpn;
        private boolean rateLimitSet;
        private long rateLimit;
        private boolean ifNameSet;
        private String ifName;

    @Override
    public int getType() {
        return 0x1;
    }

    @Override
    public Set<OFBsnVportL2GreFlags> getFlags() {
        return flags;
    }

    @Override
    public OFBsnVportL2Gre.Builder setFlags(Set<OFBsnVportL2GreFlags> flags) {
        this.flags = flags;
        this.flagsSet = true;
        return this;
    }
    @Override
    public OFPort getPortNo() {
        return portNo;
    }

    @Override
    public OFBsnVportL2Gre.Builder setPortNo(OFPort portNo) {
        this.portNo = portNo;
        this.portNoSet = true;
        return this;
    }
    @Override
    public OFPort getLoopbackPortNo() {
        return loopbackPortNo;
    }

    @Override
    public OFBsnVportL2Gre.Builder setLoopbackPortNo(OFPort loopbackPortNo) {
        this.loopbackPortNo = loopbackPortNo;
        this.loopbackPortNoSet = true;
        return this;
    }
    @Override
    public MacAddress getLocalMac() {
        return localMac;
    }

    @Override
    public OFBsnVportL2Gre.Builder setLocalMac(MacAddress localMac) {
        this.localMac = localMac;
        this.localMacSet = true;
        return this;
    }
    @Override
    public MacAddress getNhMac() {
        return nhMac;
    }

    @Override
    public OFBsnVportL2Gre.Builder setNhMac(MacAddress nhMac) {
        this.nhMac = nhMac;
        this.nhMacSet = true;
        return this;
    }
    @Override
    public IPv4Address getSrcIp() {
        return srcIp;
    }

    @Override
    public OFBsnVportL2Gre.Builder setSrcIp(IPv4Address srcIp) {
        this.srcIp = srcIp;
        this.srcIpSet = true;
        return this;
    }
    @Override
    public IPv4Address getDstIp() {
        return dstIp;
    }

    @Override
    public OFBsnVportL2Gre.Builder setDstIp(IPv4Address dstIp) {
        this.dstIp = dstIp;
        this.dstIpSet = true;
        return this;
    }
    @Override
    public short getDscp() {
        return dscp;
    }

    @Override
    public OFBsnVportL2Gre.Builder setDscp(short dscp) {
        this.dscp = dscp;
        this.dscpSet = true;
        return this;
    }
    @Override
    public short getTtl() {
        return ttl;
    }

    @Override
    public OFBsnVportL2Gre.Builder setTtl(short ttl) {
        this.ttl = ttl;
        this.ttlSet = true;
        return this;
    }
    @Override
    public long getVpn() {
        return vpn;
    }

    @Override
    public OFBsnVportL2Gre.Builder setVpn(long vpn) {
        this.vpn = vpn;
        this.vpnSet = true;
        return this;
    }
    @Override
    public long getRateLimit() {
        return rateLimit;
    }

    @Override
    public OFBsnVportL2Gre.Builder setRateLimit(long rateLimit) {
        this.rateLimit = rateLimit;
        this.rateLimitSet = true;
        return this;
    }
    @Override
    public String getIfName() {
        return ifName;
    }

    @Override
    public OFBsnVportL2Gre.Builder setIfName(String ifName) {
        this.ifName = ifName;
        this.ifNameSet = true;
        return this;
    }
    @Override
    public OFVersion getVersion() {
        return OFVersion.OF_10;
    }

//
        @Override
        public OFBsnVportL2Gre build() {
            Set<OFBsnVportL2GreFlags> flags = this.flagsSet ? this.flags : DEFAULT_FLAGS;
            if(flags == null)
                throw new NullPointerException("Property flags must not be null");
            OFPort portNo = this.portNoSet ? this.portNo : DEFAULT_PORT_NO;
            if(portNo == null)
                throw new NullPointerException("Property portNo must not be null");
            OFPort loopbackPortNo = this.loopbackPortNoSet ? this.loopbackPortNo : DEFAULT_LOOPBACK_PORT_NO;
            if(loopbackPortNo == null)
                throw new NullPointerException("Property loopbackPortNo must not be null");
            MacAddress localMac = this.localMacSet ? this.localMac : DEFAULT_LOCAL_MAC;
            if(localMac == null)
                throw new NullPointerException("Property localMac must not be null");
            MacAddress nhMac = this.nhMacSet ? this.nhMac : DEFAULT_NH_MAC;
            if(nhMac == null)
                throw new NullPointerException("Property nhMac must not be null");
            IPv4Address srcIp = this.srcIpSet ? this.srcIp : DEFAULT_SRC_IP;
            if(srcIp == null)
                throw new NullPointerException("Property srcIp must not be null");
            IPv4Address dstIp = this.dstIpSet ? this.dstIp : DEFAULT_DST_IP;
            if(dstIp == null)
                throw new NullPointerException("Property dstIp must not be null");
            short dscp = this.dscpSet ? this.dscp : DEFAULT_DSCP;
            short ttl = this.ttlSet ? this.ttl : DEFAULT_TTL;
            long vpn = this.vpnSet ? this.vpn : DEFAULT_VPN;
            long rateLimit = this.rateLimitSet ? this.rateLimit : DEFAULT_RATE_LIMIT;
            String ifName = this.ifNameSet ? this.ifName : DEFAULT_IF_NAME;
            if(ifName == null)
                throw new NullPointerException("Property ifName must not be null");


            return new OFBsnVportL2GreVer10(
                    flags,
                    portNo,
                    loopbackPortNo,
                    localMac,
                    nhMac,
                    srcIp,
                    dstIp,
                    dscp,
                    ttl,
                    vpn,
                    rateLimit,
                    ifName
                );
        }

    }


    final static Reader READER = new Reader();
    static class Reader implements OFMessageReader<OFBsnVportL2Gre> {
        @Override
        public OFBsnVportL2Gre readFrom(ChannelBuffer bb) throws OFParseError {
            int start = bb.readerIndex();
            // fixed value property type == 0x1
            short type = bb.readShort();
            if(type != (short) 0x1)
                throw new OFParseError("Wrong type: Expected=0x1(0x1), got="+type);
            int length = U16.f(bb.readShort());
            if(length != 60)
                throw new OFParseError("Wrong length: Expected=60(60), got="+length);
            if(bb.readableBytes() + (bb.readerIndex() - start) < length) {
                // Buffer does not have all data yet
                bb.readerIndex(start);
                return null;
            }
            if(logger.isTraceEnabled())
                logger.trace("readFrom - length={}", length);
            Set<OFBsnVportL2GreFlags> flags = OFBsnVportL2GreFlagsSerializerVer10.readFrom(bb);
            OFPort portNo = OFPort.read2Bytes(bb);
            OFPort loopbackPortNo = OFPort.read2Bytes(bb);
            MacAddress localMac = MacAddress.read6Bytes(bb);
            MacAddress nhMac = MacAddress.read6Bytes(bb);
            IPv4Address srcIp = IPv4Address.read4Bytes(bb);
            IPv4Address dstIp = IPv4Address.read4Bytes(bb);
            short dscp = U8.f(bb.readByte());
            short ttl = U8.f(bb.readByte());
            // pad: 2 bytes
            bb.skipBytes(2);
            long vpn = U32.f(bb.readInt());
            long rateLimit = U32.f(bb.readInt());
            String ifName = ChannelUtils.readFixedLengthString(bb, 16);

            OFBsnVportL2GreVer10 bsnVportL2GreVer10 = new OFBsnVportL2GreVer10(
                    flags,
                      portNo,
                      loopbackPortNo,
                      localMac,
                      nhMac,
                      srcIp,
                      dstIp,
                      dscp,
                      ttl,
                      vpn,
                      rateLimit,
                      ifName
                    );
            if(logger.isTraceEnabled())
                logger.trace("readFrom - read={}", bsnVportL2GreVer10);
            return bsnVportL2GreVer10;
        }
    }

    public void putTo(PrimitiveSink sink) {
        FUNNEL.funnel(this, sink);
    }

    final static OFBsnVportL2GreVer10Funnel FUNNEL = new OFBsnVportL2GreVer10Funnel();
    static class OFBsnVportL2GreVer10Funnel implements Funnel<OFBsnVportL2GreVer10> {
        private static final long serialVersionUID = 1L;
        @Override
        public void funnel(OFBsnVportL2GreVer10 message, PrimitiveSink sink) {
            // fixed value property type = 0x1
            sink.putShort((short) 0x1);
            // fixed value property length = 60
            sink.putShort((short) 0x3c);
            OFBsnVportL2GreFlagsSerializerVer10.putTo(message.flags, sink);
            message.portNo.putTo(sink);
            message.loopbackPortNo.putTo(sink);
            message.localMac.putTo(sink);
            message.nhMac.putTo(sink);
            message.srcIp.putTo(sink);
            message.dstIp.putTo(sink);
            sink.putShort(message.dscp);
            sink.putShort(message.ttl);
            // skip pad (2 bytes)
            sink.putLong(message.vpn);
            sink.putLong(message.rateLimit);
            sink.putUnencodedChars(message.ifName);
        }
    }


    public void writeTo(ChannelBuffer bb) {
        WRITER.write(bb, this);
    }

    final static Writer WRITER = new Writer();
    static class Writer implements OFMessageWriter<OFBsnVportL2GreVer10> {
        @Override
        public void write(ChannelBuffer bb, OFBsnVportL2GreVer10 message) {
            // fixed value property type = 0x1
            bb.writeShort((short) 0x1);
            // fixed value property length = 60
            bb.writeShort((short) 0x3c);
            OFBsnVportL2GreFlagsSerializerVer10.writeTo(bb, message.flags);
            message.portNo.write2Bytes(bb);
            message.loopbackPortNo.write2Bytes(bb);
            message.localMac.write6Bytes(bb);
            message.nhMac.write6Bytes(bb);
            message.srcIp.write4Bytes(bb);
            message.dstIp.write4Bytes(bb);
            bb.writeByte(U8.t(message.dscp));
            bb.writeByte(U8.t(message.ttl));
            // pad: 2 bytes
            bb.writeZero(2);
            bb.writeInt(U32.t(message.vpn));
            bb.writeInt(U32.t(message.rateLimit));
            ChannelUtils.writeFixedLengthString(bb, message.ifName, 16);


        }
    }

    @Override
    public String toString() {
        StringBuilder b = new StringBuilder("OFBsnVportL2GreVer10(");
        b.append("flags=").append(flags);
        b.append(", ");
        b.append("portNo=").append(portNo);
        b.append(", ");
        b.append("loopbackPortNo=").append(loopbackPortNo);
        b.append(", ");
        b.append("localMac=").append(localMac);
        b.append(", ");
        b.append("nhMac=").append(nhMac);
        b.append(", ");
        b.append("srcIp=").append(srcIp);
        b.append(", ");
        b.append("dstIp=").append(dstIp);
        b.append(", ");
        b.append("dscp=").append(dscp);
        b.append(", ");
        b.append("ttl=").append(ttl);
        b.append(", ");
        b.append("vpn=").append(vpn);
        b.append(", ");
        b.append("rateLimit=").append(rateLimit);
        b.append(", ");
        b.append("ifName=").append(ifName);
        b.append(")");
        return b.toString();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        OFBsnVportL2GreVer10 other = (OFBsnVportL2GreVer10) obj;

        if (flags == null) {
            if (other.flags != null)
                return false;
        } else if (!flags.equals(other.flags))
            return false;
        if (portNo == null) {
            if (other.portNo != null)
                return false;
        } else if (!portNo.equals(other.portNo))
            return false;
        if (loopbackPortNo == null) {
            if (other.loopbackPortNo != null)
                return false;
        } else if (!loopbackPortNo.equals(other.loopbackPortNo))
            return false;
        if (localMac == null) {
            if (other.localMac != null)
                return false;
        } else if (!localMac.equals(other.localMac))
            return false;
        if (nhMac == null) {
            if (other.nhMac != null)
                return false;
        } else if (!nhMac.equals(other.nhMac))
            return false;
        if (srcIp == null) {
            if (other.srcIp != null)
                return false;
        } else if (!srcIp.equals(other.srcIp))
            return false;
        if (dstIp == null) {
            if (other.dstIp != null)
                return false;
        } else if (!dstIp.equals(other.dstIp))
            return false;
        if( dscp != other.dscp)
            return false;
        if( ttl != other.ttl)
            return false;
        if( vpn != other.vpn)
            return false;
        if( rateLimit != other.rateLimit)
            return false;
        if (ifName == null) {
            if (other.ifName != null)
                return false;
        } else if (!ifName.equals(other.ifName))
            return false;
        return true;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;

        result = prime * result + ((flags == null) ? 0 : flags.hashCode());
        result = prime * result + ((portNo == null) ? 0 : portNo.hashCode());
        result = prime * result + ((loopbackPortNo == null) ? 0 : loopbackPortNo.hashCode());
        result = prime * result + ((localMac == null) ? 0 : localMac.hashCode());
        result = prime * result + ((nhMac == null) ? 0 : nhMac.hashCode());
        result = prime * result + ((srcIp == null) ? 0 : srcIp.hashCode());
        result = prime * result + ((dstIp == null) ? 0 : dstIp.hashCode());
        result = prime * result + dscp;
        result = prime * result + ttl;
        result = prime *  (int) (vpn ^ (vpn >>> 32));
        result = prime *  (int) (rateLimit ^ (rateLimit >>> 32));
        result = prime * result + ((ifName == null) ? 0 : ifName.hashCode());
        return result;
    }

}
