| /* |
| * 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 link protection type attribute. |
| */ |
| public final class BgpLinkAttrProtectionType implements BGPValueType { |
| |
| protected static final Logger log = LoggerFactory |
| .getLogger(BgpLinkAttrProtectionType.class); |
| |
| public static final int ATTRLINK_PROTECTIONTYPE = 1093; |
| public static final int LINK_PROTECTION_LEN = 2; |
| |
| public static final int EXTRA_TRAFFIC = 0x01; |
| public static final int UNPROTECTED = 0x02; |
| public static final int SHARED = 0x04; |
| public static final int DEDICATED_ONE_ISTO_ONE = 0x08; |
| public static final int DEDICATED_ONE_PLUS_ONE = 0x10; |
| public static final int ENHANCED = 0x20; |
| |
| /* Link Protection type flags */ |
| private final boolean bExtraTraffic; |
| private final boolean bUnprotected; |
| private final boolean bShared; |
| private final boolean bDedOneIstoOne; |
| private final boolean bDedOnePlusOne; |
| private final boolean bEnhanced; |
| |
| /** |
| * Constructor to initialize the value. |
| * |
| * @param bExtraTraffic Extra Traffic |
| * @param bUnprotected Unprotected |
| * @param bShared Shared |
| * @param bDedOneIstoOne Dedicated 1:1 |
| * @param bDedOnePlusOne Dedicated 1+1 |
| * @param bEnhanced Enhanced |
| */ |
| private BgpLinkAttrProtectionType(boolean bExtraTraffic, |
| boolean bUnprotected, |
| boolean bShared, boolean bDedOneIstoOne, |
| boolean bDedOnePlusOne, boolean bEnhanced) { |
| this.bExtraTraffic = bExtraTraffic; |
| this.bUnprotected = bUnprotected; |
| this.bShared = bShared; |
| this.bDedOneIstoOne = bDedOneIstoOne; |
| this.bDedOnePlusOne = bDedOnePlusOne; |
| this.bEnhanced = bEnhanced; |
| } |
| |
| /** |
| * Returns object of this class with specified values. |
| * |
| * @param bExtraTraffic Extra Traffic |
| * @param bUnprotected Unprotected |
| * @param bShared Shared |
| * @param bDedOneIstoOne Dedicated 1:1 |
| * @param bDedOnePlusOne Dedicated 1+1 |
| * @param bEnhanced Enhanced |
| * @return object of BgpLinkAttrProtectionType |
| */ |
| public static BgpLinkAttrProtectionType of(boolean bExtraTraffic, |
| boolean bUnprotected, |
| boolean bShared, |
| boolean bDedOneIstoOne, |
| boolean bDedOnePlusOne, |
| boolean bEnhanced) { |
| return new BgpLinkAttrProtectionType(bExtraTraffic, bUnprotected, |
| bShared, bDedOneIstoOne, |
| bDedOnePlusOne, bEnhanced); |
| } |
| |
| /** |
| * Reads the BGP link attributes protection type. |
| * |
| * @param cb Channel buffer |
| * @return object of type BgpLinkAttrProtectionType |
| * @throws BGPParseException while parsing BgpLinkAttrProtectionType |
| */ |
| public static BgpLinkAttrProtectionType read(ChannelBuffer cb) |
| throws BGPParseException { |
| short linkProtectionType; |
| byte higherByte; |
| short lsAttrLength = cb.readShort(); |
| |
| boolean bExtraTraffic; |
| boolean bUnprotected; |
| boolean bShared; |
| boolean bDedOneIstoOne; |
| boolean bDedOnePlusOne; |
| boolean bEnhanced; |
| |
| if ((lsAttrLength != LINK_PROTECTION_LEN) |
| || (cb.readableBytes() < lsAttrLength)) { |
| Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR, |
| BGPErrorType.ATTRIBUTE_LENGTH_ERROR, |
| lsAttrLength); |
| } |
| |
| linkProtectionType = cb.readShort(); |
| higherByte = (byte) (linkProtectionType >> 8); |
| |
| bExtraTraffic = ((higherByte & (byte) EXTRA_TRAFFIC) == EXTRA_TRAFFIC); |
| bUnprotected = ((higherByte & (byte) UNPROTECTED) == UNPROTECTED); |
| bShared = ((higherByte & (byte) SHARED) == SHARED); |
| bDedOneIstoOne = ((higherByte & (byte) DEDICATED_ONE_ISTO_ONE) == DEDICATED_ONE_ISTO_ONE); |
| bDedOnePlusOne = ((higherByte & (byte) DEDICATED_ONE_PLUS_ONE) == DEDICATED_ONE_PLUS_ONE); |
| bEnhanced = ((higherByte & (byte) ENHANCED) == ENHANCED); |
| |
| return BgpLinkAttrProtectionType.of(bExtraTraffic, bUnprotected, |
| bShared, bDedOneIstoOne, |
| bDedOnePlusOne, bEnhanced); |
| } |
| |
| /** |
| * Returns ExtraTraffic Bit. |
| * |
| * @return ExtraTraffic Bit |
| */ |
| public boolean extraTraffic() { |
| return bExtraTraffic; |
| } |
| |
| /** |
| * Returns Unprotected Bit. |
| * |
| * @return Unprotected Bit |
| */ |
| public boolean unprotected() { |
| return bUnprotected; |
| } |
| |
| /** |
| * Returns Shared Bit. |
| * |
| * @return Shared Bit |
| */ |
| public boolean shared() { |
| return bShared; |
| } |
| |
| /** |
| * Returns DedOneIstoOne Bit. |
| * |
| * @return DedOneIstoOne Bit |
| */ |
| public boolean dedOneIstoOne() { |
| return bDedOneIstoOne; |
| } |
| |
| /** |
| * Returns DedOnePlusOne Bit. |
| * |
| * @return DedOnePlusOne Bit |
| */ |
| public boolean dedOnePlusOne() { |
| return bDedOnePlusOne; |
| } |
| |
| /** |
| * Returns Enhanced Bit. |
| * |
| * @return Enhanced Bit |
| */ |
| public boolean enhanced() { |
| return bEnhanced; |
| } |
| |
| @Override |
| public short getType() { |
| return ATTRLINK_PROTECTIONTYPE; |
| } |
| |
| @Override |
| public int hashCode() { |
| return Objects.hash(bExtraTraffic, bUnprotected, bShared, |
| bDedOneIstoOne, bDedOnePlusOne, bEnhanced); |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (this == obj) { |
| return true; |
| } |
| |
| if (obj instanceof BgpLinkAttrProtectionType) { |
| BgpLinkAttrProtectionType other = (BgpLinkAttrProtectionType) obj; |
| return Objects.equals(bExtraTraffic, other.bExtraTraffic) |
| && Objects.equals(bUnprotected, other.bUnprotected) |
| && Objects.equals(bShared, other.bShared) |
| && Objects.equals(bDedOneIstoOne, other.bDedOneIstoOne) |
| && Objects.equals(bDedOnePlusOne, other.bDedOnePlusOne) |
| && Objects.equals(bEnhanced, other.bEnhanced); |
| } |
| return false; |
| } |
| |
| @Override |
| public int write(ChannelBuffer cb) { |
| // TODO This will be implemented in the next version |
| return 0; |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .add("bExtraTraffic", bExtraTraffic) |
| .add("bUnprotected", bUnprotected).add("bShared", bShared) |
| .add("bDedOneIstoOne", bDedOneIstoOne) |
| .add("bDedOnePlusOne", bDedOnePlusOne) |
| .add("bEnhanced", bEnhanced).toString(); |
| } |
| } |