/* * 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 org.jboss.netty.buffer.ChannelBuffer; import org.onosproject.bgpio.exceptions.BgpParseException; import org.onosproject.bgpio.protocol.BgpNodeLSNlri; import org.onosproject.bgpio.protocol.NlriType; import org.onosproject.bgpio.types.BgpErrorType; 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 Node LS NLRI. */ public class BgpNodeLSNlriVer4 implements BgpNodeLSNlri { /* *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) // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Figure : The Node NLRI format */ protected static final Logger log = LoggerFactory.getLogger(BgpNodeLSNlriVer4.class); public static final int NODE_NLRITYPE = 1; public static final int IDENTIFIER_LENGTH = 16; private long identifier; private byte protocolId; private BgpNodeLSIdentifier localNodeDescriptors; private RouteDistinguisher routeDistinguisher; private boolean isVpn; /** * Enum to provide PROTOCOLTYPE. */ public enum ProtocolType { ISIS_LEVEL_ONE(1), ISIS_LEVEL_TWO(2), OSPF_V2(3), DIRECT(4), STATIC_CONFIGURATION(5), OSPF_V3(6); int value; /** * Assign val with the value as the protocol type. * * @param val protocol type */ ProtocolType(int val) { value = val; } /** * Returns value of protocol type. * * @return protocol type */ public byte getType() { return (byte) value; } } /** * Reset fields. */ public BgpNodeLSNlriVer4() { this.identifier = 0; this.protocolId = 0; this.localNodeDescriptors = null; this.routeDistinguisher = null; this.isVpn = false; } /** * Constructors to initialize its parameters. * * @param identifier of LinkState Nlri * @param protocolId of LinkState Nlri * @param localNodeDescriptors local node descriptors * @param isVpn true if VPN info is present * @param routeDistinguisher unique for each VPN */ public BgpNodeLSNlriVer4(long identifier, byte protocolId, BgpNodeLSIdentifier localNodeDescriptors, boolean isVpn, RouteDistinguisher routeDistinguisher) { this.identifier = identifier; this.protocolId = protocolId; this.localNodeDescriptors = localNodeDescriptors; this.routeDistinguisher = routeDistinguisher; this.isVpn = isVpn; } /** * Reads from channelBuffer and parses Node 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 node descriptors */ public static BgpNodeLSNlriVer4 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(); log.debug("Parse local node descriptors"); BgpNodeLSIdentifier localNodeDescriptors = new BgpNodeLSIdentifier(); localNodeDescriptors = BgpNodeLSIdentifier.parseLocalNodeDescriptors(cb, protocolId); return new BgpNodeLSNlriVer4(identifier, protocolId, localNodeDescriptors, isVpn, routeDistinguisher); } @Override public NlriType getNlriType() { return NlriType.NODE; } @Override public BgpNodeLSIdentifier getLocalNodeDescriptors() { return this.localNodeDescriptors; } /** * 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; } @Override public long getIdentifier() { return this.identifier; } /** * Set the node LS identifier. * * @param localNodeDescriptors node LS identifier to set */ public void setNodeLSIdentifier(BgpNodeLSIdentifier localNodeDescriptors) { this.localNodeDescriptors = localNodeDescriptors; } @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 String toString() { return MoreObjects.toStringHelper(getClass()) .omitNullValues() .add("protocolId", protocolId) .add("identifier", identifier) .add("RouteDistinguisher ", routeDistinguisher) .add("localNodeDescriptors", localNodeDescriptors) .toString(); } }