/* * 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.BgpPrefixLSNlri; import org.onosproject.bgpio.protocol.NlriType; import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4.ProtocolType; 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 Prefix IPV4 LS NLRI. */ public class BgpPrefixIPv4LSNlriVer4 implements BgpPrefixLSNlri { /* * 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 Descriptor (variable) // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // Prefix Descriptors (variable) // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Figure : The IPv4/IPv6 Topology Prefix NLRI format */ protected static final Logger log = LoggerFactory.getLogger(BgpPrefixIPv4LSNlriVer4.class); public static final int PREFIX_IPV4_NLRITYPE = 3; public static final int IDENTIFIER_LENGTH = 16; private long identifier; private byte protocolId; private RouteDistinguisher routeDistinguisher; private boolean isVpn; private BgpPrefixLSIdentifier bgpPrefixLSIdentifier; /** * Resets parameters. */ public BgpPrefixIPv4LSNlriVer4() { this.identifier = 0; this.protocolId = 0; this.bgpPrefixLSIdentifier = null; this.routeDistinguisher = null; this.isVpn = false; } /** * Constructor to initialize parameters for BGP PrefixLSNlri. * * @param identifier field in BGP PrefixLSNlri * @param protocolId protocol Id * @param bgpPrefixLSIdentifier prefix LS Identifier * @param routeDistinguisher RouteDistinguisher * @param isVpn vpn availability in message */ public BgpPrefixIPv4LSNlriVer4(long identifier, byte protocolId, BgpPrefixLSIdentifier bgpPrefixLSIdentifier, RouteDistinguisher routeDistinguisher, boolean isVpn) { this.identifier = identifier; this.protocolId = protocolId; this.bgpPrefixLSIdentifier = bgpPrefixLSIdentifier; this.routeDistinguisher = routeDistinguisher; this.isVpn = isVpn; } /** * Reads from channelBuffer and parses Prefix LS Nlri. * * @param cb ChannelBuffer * @param afi Address family identifier * @param safi Subsequent address family identifier * @return object of BGPPrefixIPv4LSNlriVer4 * @throws BgpParseException while parsing Prefix LS Nlri */ public static BgpPrefixIPv4LSNlriVer4 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(); BgpPrefixLSIdentifier bgpPrefixLSIdentifier = new BgpPrefixLSIdentifier(); bgpPrefixLSIdentifier = BgpPrefixLSIdentifier.parsePrefixIdendifier(cb, protocolId); return new BgpPrefixIPv4LSNlriVer4(identifier, protocolId, bgpPrefixLSIdentifier, routeDistinguisher, isVpn); } @Override public NlriType getNlriType() { return NlriType.PREFIX_IPV4; } @Override public NodeDescriptors getLocalNodeDescriptors() { return this.bgpPrefixLSIdentifier.getLocalNodeDescriptors(); } @Override public long getIdentifier() { return this.identifier; } /** * Set the prefix LS identifier. * * @param bgpPrefixLSIdentifier prefix identifier to set */ public void setPrefixLSIdentifier(BgpPrefixLSIdentifier bgpPrefixLSIdentifier) { this.bgpPrefixLSIdentifier = bgpPrefixLSIdentifier; } @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("protocol id not valid"); } } /** * Returns whether VPN is present or not. * * @return whether VPN is present or not */ public boolean isVpnPresent() { return this.isVpn; } /** * Returns Prefix Identifier. * * @return Prefix Identifier */ public BgpPrefixLSIdentifier getPrefixIdentifier() { return this.bgpPrefixLSIdentifier; } @Override public RouteDistinguisher getRouteDistinguisher() { return this.routeDistinguisher; } @Override public List<BgpValueType> getPrefixdescriptor() { return this.bgpPrefixLSIdentifier.getPrefixdescriptor(); } @Override public String toString() { return MoreObjects.toStringHelper(getClass()) .omitNullValues() .add("protocolId", protocolId) .add("identifier", identifier) .add("RouteDistinguisher ", routeDistinguisher) .add("bgpPrefixLSIdentifier", bgpPrefixLSIdentifier) .toString(); } }