| /* |
| * Copyright 2015-present 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.protocol.linkstate; |
| |
| import java.util.List; |
| |
| import org.jboss.netty.buffer.ChannelBuffer; |
| import org.onosproject.bgpio.exceptions.BgpParseException; |
| import org.onosproject.bgpio.protocol.BgpLinkLsNlri; |
| import org.onosproject.bgpio.protocol.NlriType; |
| import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4.ProtocolType; |
| import org.onosproject.bgpio.types.BgpErrorType; |
| import org.onosproject.bgpio.types.BgpValueType; |
| import org.onosproject.bgpio.types.RouteDistinguisher; |
| import org.onosproject.bgpio.util.Constants; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| import com.google.common.base.MoreObjects; |
| |
| /** |
| * Implementation of Link LS NLRI. |
| */ |
| public class BgpLinkLsNlriVer4 implements BgpLinkLsNlri { |
| |
| /* |
| * REFERENCE : draft-ietf-idr-ls-distribution-11 |
| 0 1 2 3 |
| 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
| +-+-+-+-+-+-+-+-+ |
| | Protocol-ID | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | Identifier | |
| | (64 bits) | |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| // Local Node Descriptors (variable) // |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| // Remote Node Descriptors (variable) // |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| // Link Descriptors (variable) // |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| Figure : The Link NLRI format |
| */ |
| private static final Logger log = LoggerFactory.getLogger(BgpLinkLsNlriVer4.class); |
| public static final int LINK_NLRITYPE = 2; |
| |
| private BgpLinkLSIdentifier linkLSIdentifier; |
| private byte protocolId; |
| private long identifier; |
| private RouteDistinguisher routeDistinguisher; |
| private boolean isVpn; |
| |
| /** |
| * Initialize fields. |
| */ |
| public BgpLinkLsNlriVer4() { |
| this.protocolId = 0; |
| this.identifier = 0; |
| this.linkLSIdentifier = null; |
| this.routeDistinguisher = null; |
| this.isVpn = false; |
| } |
| |
| /** |
| * Constructor to initialize parameters for BGP LinkLSNlri. |
| * |
| * @param protocolId protocol Id |
| * @param identifier field in BGP LinkLSNlri |
| * @param linkLSIdentifier link LS identifier |
| * @param routeDistinguisher route distinguisher from message |
| * @param isVpn vpn info availability in message |
| */ |
| public BgpLinkLsNlriVer4(byte protocolId, long identifier, BgpLinkLSIdentifier linkLSIdentifier, |
| RouteDistinguisher routeDistinguisher, boolean isVpn) { |
| this.protocolId = protocolId; |
| this.identifier = identifier; |
| this.linkLSIdentifier = linkLSIdentifier; |
| this.routeDistinguisher = routeDistinguisher; |
| this.isVpn = isVpn; |
| } |
| |
| /** |
| * Reads from channelBuffer and parses Link LS Nlri. |
| * |
| * @param cb ChannelBuffer |
| * @param afi Address Family Identifier |
| * @param safi Subsequent Address Family Identifier |
| * @return object of this class |
| * @throws BgpParseException while parsing Link LS NLRI |
| */ |
| public static BgpLinkLsNlriVer4 read(ChannelBuffer cb, short afi, byte safi) throws BgpParseException { |
| boolean isVpn = false; |
| RouteDistinguisher routeDistinguisher = null; |
| if ((afi == Constants.AFI_VALUE) && (safi == Constants.VPN_SAFI_VALUE)) { |
| routeDistinguisher = new RouteDistinguisher(); |
| routeDistinguisher = RouteDistinguisher.read(cb); |
| isVpn = true; |
| } else { |
| isVpn = false; |
| } |
| byte protocolId = cb.readByte(); |
| long identifier = cb.readLong(); |
| |
| BgpLinkLSIdentifier linkLSIdentifier = new BgpLinkLSIdentifier(); |
| linkLSIdentifier = BgpLinkLSIdentifier.parseLinkIdendifier(cb, protocolId); |
| return new BgpLinkLsNlriVer4(protocolId, identifier, linkLSIdentifier, routeDistinguisher, isVpn); |
| } |
| |
| @Override |
| public NlriType getNlriType() { |
| return NlriType.LINK; |
| } |
| |
| @Override |
| public long getIdentifier() { |
| return this.identifier; |
| } |
| |
| /** |
| * Set the link LS identifier. |
| * |
| * @param linkLSIdentifier link LS identifier to set |
| */ |
| public void setLinkLSIdentifier(BgpLinkLSIdentifier linkLSIdentifier) { |
| this.linkLSIdentifier = linkLSIdentifier; |
| } |
| |
| @Override |
| public ProtocolType getProtocolId() throws BgpParseException { |
| switch (protocolId) { |
| case Constants.ISIS_LEVELONE: |
| return ProtocolType.ISIS_LEVEL_ONE; |
| case Constants.ISIS_LEVELTWO: |
| return ProtocolType.ISIS_LEVEL_TWO; |
| case Constants.OSPFV2: |
| return ProtocolType.OSPF_V2; |
| case Constants.DIRECT: |
| return ProtocolType.DIRECT; |
| case Constants.STATIC_CONFIGURATION: |
| return ProtocolType.STATIC_CONFIGURATION; |
| case Constants.OSPFV3: |
| return ProtocolType.OSPF_V3; |
| default: |
| throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, (byte) 0, null); |
| } |
| } |
| |
| @Override |
| public NodeDescriptors localNodeDescriptors() { |
| return this.linkLSIdentifier.localNodeDescriptors(); |
| } |
| |
| @Override |
| public NodeDescriptors remoteNodeDescriptors() { |
| return this.linkLSIdentifier.remoteNodeDescriptors(); |
| } |
| |
| /** |
| * Returns whether VPN is present or not. |
| * |
| * @return whether VPN is present or not |
| */ |
| public boolean isVpnPresent() { |
| return this.isVpn; |
| } |
| |
| @Override |
| public RouteDistinguisher getRouteDistinguisher() { |
| return this.routeDistinguisher; |
| } |
| |
| /** |
| * Returns link identifier. |
| * |
| * @return link identifier |
| */ |
| public BgpLinkLSIdentifier getLinkIdentifier() { |
| return this.linkLSIdentifier; |
| } |
| |
| @Override |
| public List<BgpValueType> linkDescriptors() { |
| return this.linkLSIdentifier.linkDescriptors(); |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .omitNullValues() |
| .add("protocolId", protocolId) |
| .add("identifier", identifier) |
| .add("RouteDistinguisher ", routeDistinguisher) |
| .add("linkLSIdentifier", linkLSIdentifier) |
| .toString(); |
| } |
| } |