| /* |
| * Copyright 2015-present Open Networking Foundation |
| * |
| * 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.bgp.controller.impl; |
| |
| import java.util.Map; |
| import java.util.TreeMap; |
| |
| import org.onosproject.bgpio.protocol.BgpLSNlri; |
| import org.onosproject.bgpio.protocol.linkstate.BgpLinkLSIdentifier; |
| import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4; |
| import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSIdentifier; |
| import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4; |
| import org.onosproject.bgpio.protocol.linkstate.BgpPrefixIPv4LSNlriVer4; |
| import org.onosproject.bgpio.protocol.linkstate.BgpPrefixLSIdentifier; |
| import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetails; |
| import org.onosproject.bgpio.types.RouteDistinguisher; |
| |
| import com.google.common.base.MoreObjects; |
| |
| /** |
| * Implementation of Adj-RIB-In with VPN for each peer. |
| */ |
| public class VpnAdjRibIn { |
| private Map<BgpNodeLSIdentifier, PathAttrNlriDetails> nodeTree = new TreeMap<>(); |
| private Map<BgpLinkLSIdentifier, PathAttrNlriDetails> linkTree = new TreeMap<>(); |
| private Map<BgpPrefixLSIdentifier, PathAttrNlriDetails> prefixTree = new TreeMap<>(); |
| |
| private Map<RouteDistinguisher, Map<BgpNodeLSIdentifier, PathAttrNlriDetails>> vpnNodeTree |
| = new TreeMap<>(); |
| private Map<RouteDistinguisher, Map<BgpLinkLSIdentifier, PathAttrNlriDetails>> vpnLinkTree |
| = new TreeMap<>(); |
| private Map<RouteDistinguisher, Map<BgpPrefixLSIdentifier, PathAttrNlriDetails>> vpnPrefixTree |
| = new TreeMap<>(); |
| /** |
| * Returns the adjacency node. |
| * |
| * @return node adjacency RIB node |
| */ |
| public Map<BgpNodeLSIdentifier, PathAttrNlriDetails> nodeTree() { |
| return nodeTree; |
| } |
| |
| /** |
| * Returns the adjacency link. |
| * |
| * @return link adjacency RIB node |
| */ |
| public Map<BgpLinkLSIdentifier, PathAttrNlriDetails> linkTree() { |
| return linkTree; |
| } |
| |
| /** |
| * Returns the adjacency prefix. |
| * |
| * @return prefix adjacency RIB node |
| */ |
| public Map<BgpPrefixLSIdentifier, PathAttrNlriDetails> prefixTree() { |
| return prefixTree; |
| } |
| |
| /** |
| * Returns the adjacency vpnNode. |
| * |
| * @return vpnNode adjacency RIB node |
| */ |
| public Map<RouteDistinguisher, Map<BgpNodeLSIdentifier, PathAttrNlriDetails>> vpnNodeTree() { |
| return vpnNodeTree; |
| } |
| |
| /** |
| * Returns the adjacency vpnLink. |
| * |
| * @return vpnLink adjacency RIB node |
| */ |
| public Map<RouteDistinguisher, Map<BgpLinkLSIdentifier, PathAttrNlriDetails>> vpnLinkTree() { |
| return vpnLinkTree; |
| } |
| |
| /** |
| * Returns the adjacency vpnPrefix. |
| * |
| * @return vpnPrefix adjacency RIB node |
| */ |
| public Map<RouteDistinguisher, Map<BgpPrefixLSIdentifier, PathAttrNlriDetails>> vpnPrefixTree() { |
| return vpnPrefixTree; |
| } |
| |
| /** |
| * Update vpn nlri identifier into the tree if nlri identifier exists in tree otherwise add this to the tree. |
| * |
| * @param nlri NLRI info |
| * @param details has pathattribute , protocolID and identifier |
| */ |
| public void add(BgpLSNlri nlri, PathAttrNlriDetails details) { |
| if (nlri instanceof BgpNodeLSNlriVer4) { |
| BgpNodeLSIdentifier nodeLSIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors(); |
| if (nodeTree.containsKey(nodeLSIdentifier)) { |
| nodeTree.replace(nodeLSIdentifier, details); |
| } else { |
| nodeTree.put(nodeLSIdentifier, details); |
| } |
| } else if (nlri instanceof BgpLinkLsNlriVer4) { |
| BgpLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier(); |
| if (linkTree.containsKey(linkLSIdentifier)) { |
| linkTree.replace(linkLSIdentifier, details); |
| } else { |
| linkTree.put(linkLSIdentifier, details); |
| } |
| } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) { |
| BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier(); |
| if (prefixTree.containsKey(prefixIdentifier)) { |
| prefixTree.replace(prefixIdentifier, details); |
| } else { |
| prefixTree.put(prefixIdentifier, details); |
| } |
| } |
| } |
| |
| /** |
| * Update nlri identifier mapped with route distinguisher if it exists in tree otherwise add nlri information mapped |
| * to respective route distinguisher in tree. |
| * |
| * @param nlri NLRI info |
| * @param details has pathattribute , protocolID and identifier |
| * @param routeDistinguisher unique for for each vpn |
| */ |
| public void addVpn(BgpLSNlri nlri, PathAttrNlriDetails details, RouteDistinguisher routeDistinguisher) { |
| add(nlri, details); |
| if (nlri instanceof BgpNodeLSNlriVer4) { |
| if (!vpnNodeTree.containsKey(routeDistinguisher)) { |
| vpnNodeTree.put(routeDistinguisher, nodeTree); |
| } |
| } else if (nlri instanceof BgpLinkLsNlriVer4) { |
| if (!vpnLinkTree.containsKey(routeDistinguisher)) { |
| vpnLinkTree.put(routeDistinguisher, linkTree); |
| } |
| } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) { |
| if (!vpnPrefixTree.containsKey(routeDistinguisher)) { |
| vpnPrefixTree.put(routeDistinguisher, prefixTree); |
| } |
| } |
| } |
| |
| /** |
| * Removes vpn nlri identifier mapped to route distinguisher if it exists in tree. |
| * |
| * @param nlri NLRI Info |
| * @param routeDistinguisher unique for for each vpn |
| */ |
| public void removeVpn(BgpLSNlri nlri, RouteDistinguisher routeDistinguisher) { |
| if (nlri instanceof BgpNodeLSNlriVer4) { |
| if (vpnNodeTree.containsKey(routeDistinguisher)) { |
| BgpNodeLSIdentifier nodeLSIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors(); |
| if (nodeTree.containsKey(nodeLSIdentifier)) { |
| nodeTree.remove(nodeLSIdentifier); |
| } |
| if ((vpnNodeTree.get(routeDistinguisher)).isEmpty()) { |
| vpnNodeTree.remove(routeDistinguisher); |
| } |
| } |
| } else if (nlri instanceof BgpLinkLsNlriVer4) { |
| if (vpnLinkTree.containsKey(routeDistinguisher)) { |
| BgpLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier(); |
| if (linkTree.containsKey(linkLSIdentifier)) { |
| linkTree.remove(linkLSIdentifier); |
| } |
| if ((vpnLinkTree.get(routeDistinguisher)).isEmpty()) { |
| vpnLinkTree.remove(routeDistinguisher); |
| } |
| } |
| } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) { |
| if (vpnPrefixTree.containsKey(routeDistinguisher)) { |
| BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier(); |
| if (prefixTree.containsKey(prefixIdentifier)) { |
| prefixTree.remove(prefixIdentifier); |
| } |
| if ((vpnPrefixTree.get(routeDistinguisher)).isEmpty()) { |
| vpnPrefixTree.remove(routeDistinguisher); |
| } |
| } |
| } |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .omitNullValues().add("nodeTree", nodeTree) |
| .add("linkTree", linkTree) |
| .add("prefixTree", prefixTree) |
| .add("vpnNodeTree", vpnNodeTree) |
| .add("vpnLinkTree", vpnLinkTree) |
| .add("vpnPrefixTree", vpnPrefixTree) |
| .toString(); |
| } |
| } |