blob: ba02f6d1bf2fdcf659a2013a1fb41f358360736f [file] [log] [blame]
/*
* Copyright 2015 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.bgpio.types.attr;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.bgpio.exceptions.BGPParseException;
import org.onosproject.bgpio.types.BGPErrorType;
import org.onosproject.bgpio.types.BGPValueType;
import org.onosproject.bgpio.util.Validation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Implements BGP attribute node flag.
*/
public class BgpAttrNodeFlagBitTlv implements BGPValueType {
protected static final Logger log = LoggerFactory
.getLogger(BgpAttrNodeFlagBitTlv.class);
public static final int ATTRNODE_FLAGBIT = 1024;
/* Node flag bit TLV */
private boolean bOverloadBit;
private boolean bAttachedBit;
private boolean bExternalBit;
private boolean bABRBit;
public static final int BIT_SET = 1;
public static final int FIRST_BIT = 0x80;
public static final int SECOND_BIT = 0x40;
public static final int THIRD_BIT = 0x20;
public static final int FOURTH_BIT = 0x01;
/**
* Constructor to initialize parameters.
*
* @param bOverloadBit Overload bit
* @param bAttachedBit Attached bit
* @param bExternalBit External bit
* @param bABRBit ABR Bit
*/
BgpAttrNodeFlagBitTlv(boolean bOverloadBit, boolean bAttachedBit,
boolean bExternalBit, boolean bABRBit) {
this.bOverloadBit = bOverloadBit;
this.bAttachedBit = bAttachedBit;
this.bExternalBit = bExternalBit;
this.bABRBit = bABRBit;
}
/**
* Reads the Node Flag Bits.
*
* @param cb ChannelBuffer
* @return attribute node flag bit tlv
* @throws BGPParseException while parsing BgpAttrNodeFlagBitTlv
*/
public static BgpAttrNodeFlagBitTlv read(ChannelBuffer cb)
throws BGPParseException {
boolean bOverloadBit = false;
boolean bAttachedBit = false;
boolean bExternalBit = false;
boolean bABRBit = false;
short lsAttrLength = cb.readShort();
if (lsAttrLength != 1) {
Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
lsAttrLength);
}
byte nodeFlagBits = cb.readByte();
bOverloadBit = ((nodeFlagBits & (byte) FIRST_BIT) == FIRST_BIT);
bAttachedBit = ((nodeFlagBits & (byte) SECOND_BIT) == SECOND_BIT);
bExternalBit = ((nodeFlagBits & (byte) THIRD_BIT) == THIRD_BIT);
bABRBit = ((nodeFlagBits & (byte) FOURTH_BIT) == FOURTH_BIT);
return new BgpAttrNodeFlagBitTlv(bOverloadBit, bAttachedBit,
bExternalBit, bABRBit);
}
/**
* Returns Overload Bit.
*
* @return Overload Bit
*/
boolean getOverLoadBit() {
return bOverloadBit;
}
/**
* Returns Attached Bit.
*
* @return Attached Bit
*/
boolean getAttachedBit() {
return bAttachedBit;
}
/**
* Returns External Bit.
*
* @return External Bit
*/
boolean getExternalBit() {
return bExternalBit;
}
/**
* Returns ABR Bit.
*
* @return ABR Bit
*/
boolean getABRBit() {
return bABRBit;
}
@Override
public short getType() {
return ATTRNODE_FLAGBIT;
}
@Override
public int write(ChannelBuffer cb) {
// TODO will be implementing it later
return 0;
}
@Override
public int hashCode() {
return Objects.hash(bOverloadBit, bAttachedBit, bExternalBit, bABRBit);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof BgpAttrNodeFlagBitTlv) {
BgpAttrNodeFlagBitTlv other = (BgpAttrNodeFlagBitTlv) obj;
return Objects.equals(bOverloadBit, other.bOverloadBit)
&& Objects.equals(bAttachedBit, other.bAttachedBit)
&& Objects.equals(bExternalBit, other.bExternalBit)
&& Objects.equals(bABRBit, other.bABRBit);
}
return false;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("bOverloadBit", bOverloadBit)
.add("bAttachedBit", bAttachedBit)
.add("bExternalBit", bExternalBit).add("bABRBit", bABRBit)
.toString();
}
}