Shashikanth VH
Committed by Gerrit Code Review

[ONOS-2606] Bgp local RIB implementation.

Change-Id: I39eadec95fa1e1328c73efabb2a50bb438075809
...@@ -95,6 +95,20 @@ public interface BgpController { ...@@ -95,6 +95,20 @@ public interface BgpController {
95 int connectedPeerCount(); 95 int connectedPeerCount();
96 96
97 /** 97 /**
98 + * Return BGP local RIB instance with VPN.
99 + *
100 + * @return BGPLocalRibImpl local RIB with VPN
101 + */
102 + BgpLocalRib bgpLocalRibVpn();
103 +
104 + /**
105 + * Return BGP local RIB instance.
106 + *
107 + * @return BGPLocalRibImpl local RIB
108 + */
109 + BgpLocalRib bgpLocalRib();
110 +
111 + /**
98 * Return BGP peer manager. 112 * Return BGP peer manager.
99 * 113 *
100 * @return BGPPeerManager peer manager instance 114 * @return BGPPeerManager peer manager instance
......
...@@ -440,7 +440,9 @@ class BgpChannelHandler extends IdleStateAwareChannelHandler { ...@@ -440,7 +440,9 @@ class BgpChannelHandler extends IdleStateAwareChannelHandler {
440 // which we obviously don't want. 440 // which we obviously don't want.
441 log.debug("{}:removal called", getPeerInfoString()); 441 log.debug("{}:removal called", getPeerInfoString());
442 if (bgpPeer != null) { 442 if (bgpPeer != null) {
443 + BgpPeerImpl peer = (BgpPeerImpl) bgpPeer;
443 peerManager.removeConnectedPeer(thisbgpId); 444 peerManager.removeConnectedPeer(thisbgpId);
445 + peer.updateLocalRIBOnPeerDisconnect();
444 } 446 }
445 447
446 // Retry connection if connection is lost to bgp speaker/peer 448 // Retry connection if connection is lost to bgp speaker/peer
......
...@@ -21,8 +21,14 @@ import java.util.Set; ...@@ -21,8 +21,14 @@ import java.util.Set;
21 import java.util.TreeMap; 21 import java.util.TreeMap;
22 22
23 import org.onlab.packet.Ip4Address; 23 import org.onlab.packet.Ip4Address;
24 +import org.onlab.packet.IpAddress;
24 import org.onosproject.bgp.controller.BgpCfg; 25 import org.onosproject.bgp.controller.BgpCfg;
26 +import org.onosproject.bgp.controller.BgpConnectPeer;
27 +import org.onosproject.bgp.controller.BgpController;
28 +import org.onosproject.bgp.controller.BgpId;
29 +import org.onosproject.bgp.controller.BgpPeer;
25 import org.onosproject.bgp.controller.BgpPeerCfg; 30 import org.onosproject.bgp.controller.BgpPeerCfg;
31 +import org.onosproject.bgp.controller.impl.BgpControllerImpl.BgpPeerManagerImpl;
26 import org.slf4j.Logger; 32 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory; 33 import org.slf4j.LoggerFactory;
28 34
...@@ -48,12 +54,16 @@ public class BgpConfig implements BgpCfg { ...@@ -48,12 +54,16 @@ public class BgpConfig implements BgpCfg {
48 54
49 private Ip4Address routerId = null; 55 private Ip4Address routerId = null;
50 private TreeMap<String, BgpPeerCfg> bgpPeerTree = new TreeMap<>(); 56 private TreeMap<String, BgpPeerCfg> bgpPeerTree = new TreeMap<>();
57 + private BgpConnectPeer connectPeer;
58 + private BgpPeerManagerImpl peerManager;
59 + private BgpController bgpController;
51 60
52 - /** 61 + /*
53 * Constructor to initialize the values. 62 * Constructor to initialize the values.
54 */ 63 */
55 - public BgpConfig() { 64 + public BgpConfig(BgpController bgpController) {
56 - 65 + this.bgpController = bgpController;
66 + this.peerManager = (BgpPeerManagerImpl) bgpController.peerManager();
57 this.holdTime = DEFAULT_HOLD_TIMER; 67 this.holdTime = DEFAULT_HOLD_TIMER;
58 this.maxConnRetryTime = DEFAULT_CONN_RETRY_TIME; 68 this.maxConnRetryTime = DEFAULT_CONN_RETRY_TIME;
59 this.maxConnRetryCount = DEFAULT_CONN_RETRY_COUNT; 69 this.maxConnRetryCount = DEFAULT_CONN_RETRY_COUNT;
...@@ -172,7 +182,12 @@ public class BgpConfig implements BgpCfg { ...@@ -172,7 +182,12 @@ public class BgpConfig implements BgpCfg {
172 182
173 if (lspeer != null) { 183 if (lspeer != null) {
174 lspeer.setSelfInnitConnection(true); 184 lspeer.setSelfInnitConnection(true);
175 - // TODO: initiate peer connection 185 +
186 + if (lspeer.connectPeer() == null) {
187 + connectPeer = new BgpConnectPeerImpl(bgpController, routerid, Controller.getBgpPortNum());
188 + lspeer.setConnectPeer(connectPeer);
189 + connectPeer.connectPeer();
190 + }
176 return true; 191 return true;
177 } 192 }
178 193
...@@ -185,7 +200,6 @@ public class BgpConfig implements BgpCfg { ...@@ -185,7 +200,6 @@ public class BgpConfig implements BgpCfg {
185 200
186 if (lspeer != null) { 201 if (lspeer != null) {
187 202
188 - //TODO DISCONNECT PEER
189 disconnectPeer(routerid); 203 disconnectPeer(routerid);
190 lspeer.setSelfInnitConnection(false); 204 lspeer.setSelfInnitConnection(false);
191 lspeer = this.bgpPeerTree.remove(routerid); 205 lspeer = this.bgpPeerTree.remove(routerid);
...@@ -204,7 +218,12 @@ public class BgpConfig implements BgpCfg { ...@@ -204,7 +218,12 @@ public class BgpConfig implements BgpCfg {
204 218
205 if (lspeer != null) { 219 if (lspeer != null) {
206 220
207 - //TODO DISCONNECT PEER 221 + BgpPeer disconnPeer = peerManager.getPeer(BgpId.bgpId(IpAddress.valueOf(routerid)));
222 + if (disconnPeer != null) {
223 + // TODO: send notification peer deconfigured
224 + disconnPeer.disconnectPeer();
225 + }
226 + lspeer.connectPeer().disconnectPeer();
208 lspeer.setState(BgpPeerCfg.State.IDLE); 227 lspeer.setState(BgpPeerCfg.State.IDLE);
209 lspeer.setSelfInnitConnection(false); 228 lspeer.setSelfInnitConnection(false);
210 log.debug("Disconnected : " + routerid + " successfully"); 229 log.debug("Disconnected : " + routerid + " successfully");
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
16 16
17 package org.onosproject.bgp.controller.impl; 17 package org.onosproject.bgp.controller.impl;
18 18
19 +import java.util.Iterator;
20 +import java.util.List;
19 import java.util.Set; 21 import java.util.Set;
20 import java.util.concurrent.ConcurrentHashMap; 22 import java.util.concurrent.ConcurrentHashMap;
21 import java.util.concurrent.CopyOnWriteArraySet; 23 import java.util.concurrent.CopyOnWriteArraySet;
...@@ -29,11 +31,16 @@ import org.apache.felix.scr.annotations.Service; ...@@ -29,11 +31,16 @@ import org.apache.felix.scr.annotations.Service;
29 import org.onosproject.bgp.controller.BgpCfg; 31 import org.onosproject.bgp.controller.BgpCfg;
30 import org.onosproject.bgp.controller.BgpController; 32 import org.onosproject.bgp.controller.BgpController;
31 import org.onosproject.bgp.controller.BgpId; 33 import org.onosproject.bgp.controller.BgpId;
34 +import org.onosproject.bgp.controller.BgpLocalRib;
32 import org.onosproject.bgp.controller.BgpPeer; 35 import org.onosproject.bgp.controller.BgpPeer;
33 import org.onosproject.bgp.controller.BgpNodeListener; 36 import org.onosproject.bgp.controller.BgpNodeListener;
34 import org.onosproject.bgp.controller.BgpPeerManager; 37 import org.onosproject.bgp.controller.BgpPeerManager;
35 import org.onosproject.bgpio.exceptions.BgpParseException; 38 import org.onosproject.bgpio.exceptions.BgpParseException;
36 import org.onosproject.bgpio.protocol.BgpMessage; 39 import org.onosproject.bgpio.protocol.BgpMessage;
40 +import org.onosproject.bgpio.protocol.BgpUpdateMsg;
41 +import org.onosproject.bgpio.types.BgpValueType;
42 +import org.onosproject.bgpio.types.MpReachNlri;
43 +import org.onosproject.bgpio.types.MpUnReachNlri;
37 import org.slf4j.Logger; 44 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory; 45 import org.slf4j.LoggerFactory;
39 46
...@@ -47,11 +54,14 @@ public class BgpControllerImpl implements BgpController { ...@@ -47,11 +54,14 @@ public class BgpControllerImpl implements BgpController {
47 54
48 protected BgpPeerManagerImpl peerManager = new BgpPeerManagerImpl(); 55 protected BgpPeerManagerImpl peerManager = new BgpPeerManagerImpl();
49 56
57 + private BgpLocalRib bgplocalRIB = new BgpLocalRibImpl(this);
58 + private BgpLocalRib bgplocalRIBVpn = new BgpLocalRibImpl(this);
59 +
50 protected Set<BgpNodeListener> bgpNodeListener = new CopyOnWriteArraySet<>(); 60 protected Set<BgpNodeListener> bgpNodeListener = new CopyOnWriteArraySet<>();
51 61
52 final Controller ctrl = new Controller(this); 62 final Controller ctrl = new Controller(this);
53 63
54 - private BgpConfig bgpconfig = new BgpConfig(); 64 + private BgpConfig bgpconfig = new BgpConfig(this);
55 65
56 @Activate 66 @Activate
57 public void activate() { 67 public void activate() {
...@@ -100,6 +110,8 @@ public class BgpControllerImpl implements BgpController { ...@@ -100,6 +110,8 @@ public class BgpControllerImpl implements BgpController {
100 @Override 110 @Override
101 public void processBGPPacket(BgpId bgpId, BgpMessage msg) throws BgpParseException { 111 public void processBGPPacket(BgpId bgpId, BgpMessage msg) throws BgpParseException {
102 112
113 + BgpPeer peer = getPeer(bgpId);
114 +
103 switch (msg.getType()) { 115 switch (msg.getType()) {
104 case OPEN: 116 case OPEN:
105 // TODO: Process Open message 117 // TODO: Process Open message
...@@ -111,7 +123,23 @@ public class BgpControllerImpl implements BgpController { ...@@ -111,7 +123,23 @@ public class BgpControllerImpl implements BgpController {
111 // TODO: Process notificatoin message 123 // TODO: Process notificatoin message
112 break; 124 break;
113 case UPDATE: 125 case UPDATE:
114 - // TODO: Process update message 126 + BgpUpdateMsg updateMsg = (BgpUpdateMsg) msg;
127 + List<BgpValueType> pathAttr = updateMsg.bgpPathAttributes().pathAttributes();
128 + if (pathAttr == null) {
129 + log.debug("llPathAttr is null, cannot process update message");
130 + break;
131 + }
132 + Iterator<BgpValueType> listIterator = pathAttr.iterator();
133 + boolean isLinkstate = false;
134 + while (listIterator.hasNext()) {
135 + BgpValueType attr = listIterator.next();
136 + if ((attr instanceof MpReachNlri) || (attr instanceof MpUnReachNlri)) {
137 + isLinkstate = true;
138 + }
139 + }
140 + if (isLinkstate) {
141 + peer.buildAdjRibIn(pathAttr);
142 + }
115 break; 143 break;
116 default: 144 default:
117 // TODO: Process other message 145 // TODO: Process other message
...@@ -215,4 +243,24 @@ public class BgpControllerImpl implements BgpController { ...@@ -215,4 +243,24 @@ public class BgpControllerImpl implements BgpController {
215 public int connectedPeerCount() { 243 public int connectedPeerCount() {
216 return connectedPeers.size(); 244 return connectedPeers.size();
217 } 245 }
246 +
247 + /**
248 + * Gets the BGP local RIB.
249 + *
250 + * @return bgplocalRIB BGP local RIB.
251 + */
252 + @Override
253 + public BgpLocalRib bgpLocalRib() {
254 + return bgplocalRIB;
255 + }
256 +
257 + /**
258 + * Gets the BGP local RIB with VPN.
259 + *
260 + * @return bgplocalRIBVpn BGP VPN local RIB .
261 + */
262 + @Override
263 + public BgpLocalRib bgpLocalRibVpn() {
264 + return bgplocalRIBVpn;
265 + }
218 } 266 }
......
1 +/*
2 + * Copyright 2015 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
5 + * the License. You may obtain a copy of the License at
6 + *
7 + * http://www.apache.org/licenses/LICENSE-2.0
8 + *
9 + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
10 + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
11 + * specific language governing permissions and limitations under the License.
12 + */
13 +
14 +package org.onosproject.bgp.controller.impl;
15 +
16 +import java.util.Map;
17 +import java.util.Set;
18 +import java.util.TreeMap;
19 +
20 +import org.onosproject.bgp.controller.BgpController;
21 +import org.onosproject.bgp.controller.BgpId;
22 +import org.onosproject.bgp.controller.BgpLocalRib;
23 +import org.onosproject.bgp.controller.BgpNodeListener;
24 +import org.onosproject.bgp.controller.BgpSessionInfo;
25 +import org.onosproject.bgpio.protocol.BgpLSNlri;
26 +import org.onosproject.bgpio.protocol.linkstate.BgpLinkLSIdentifier;
27 +import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4;
28 +import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSIdentifier;
29 +import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4;
30 +import org.onosproject.bgpio.protocol.linkstate.BgpPrefixIPv4LSNlriVer4;
31 +import org.onosproject.bgpio.protocol.linkstate.BgpPrefixLSIdentifier;
32 +import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetails;
33 +import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetailsLocalRib;
34 +import org.onosproject.bgpio.types.RouteDistinguisher;
35 +import org.slf4j.Logger;
36 +import org.slf4j.LoggerFactory;
37 +
38 +import static com.google.common.base.Preconditions.checkNotNull;
39 +import com.google.common.base.MoreObjects;
40 +
41 +/**
42 + * Implementation of local RIB.
43 + */
44 +public class BgpLocalRibImpl implements BgpLocalRib {
45 +
46 + private static final Logger log = LoggerFactory.getLogger(BgpLocalRibImpl.class);
47 + private BgpController bgpController;
48 +
49 + private Map<BgpNodeLSIdentifier, PathAttrNlriDetailsLocalRib> nodeTree = new TreeMap<>();
50 + private Map<BgpLinkLSIdentifier, PathAttrNlriDetailsLocalRib> linkTree = new TreeMap<>();
51 + private Map<BgpPrefixLSIdentifier, PathAttrNlriDetailsLocalRib> prefixTree = new TreeMap<>();
52 +
53 + private Map<RouteDistinguisher, Map<BgpNodeLSIdentifier, PathAttrNlriDetailsLocalRib>> vpnNodeTree
54 + = new TreeMap<>();
55 + private Map<RouteDistinguisher, Map<BgpLinkLSIdentifier, PathAttrNlriDetailsLocalRib>> vpnLinkTree
56 + = new TreeMap<>();
57 + private Map<RouteDistinguisher, Map<BgpPrefixLSIdentifier, PathAttrNlriDetailsLocalRib>> vpnPrefixTree
58 + = new TreeMap<>();
59 +
60 + public BgpLocalRibImpl(BgpController bgpController) {
61 + this.bgpController = bgpController;
62 + }
63 +
64 + /**
65 + * Gets node NLRI tree.
66 + *
67 + * @return node tree
68 + */
69 + public Map<BgpNodeLSIdentifier, PathAttrNlriDetailsLocalRib> nodeTree() {
70 + return nodeTree;
71 + }
72 +
73 + /**
74 + * Gets link NLRI tree.
75 + *
76 + * @return link tree
77 + */
78 + public Map<BgpLinkLSIdentifier, PathAttrNlriDetailsLocalRib> linkTree() {
79 + return linkTree;
80 + }
81 +
82 + /**
83 + * Gets prefix NLRI tree.
84 + *
85 + * @return prefix tree
86 + */
87 + public Map<BgpPrefixLSIdentifier, PathAttrNlriDetailsLocalRib> prefixTree() {
88 + return prefixTree;
89 + }
90 +
91 + /**
92 + * Gets VPN node NLRI tree.
93 + *
94 + * @return vpn node NLRI tree
95 + */
96 + public Map<RouteDistinguisher, Map<BgpNodeLSIdentifier, PathAttrNlriDetailsLocalRib>> vpnNodeTree() {
97 + return vpnNodeTree;
98 + }
99 +
100 + /**
101 + * Gets VPN link NLRI tree.
102 + *
103 + * @return vpn link NLRI Tree
104 + */
105 + public Map<RouteDistinguisher, Map<BgpLinkLSIdentifier, PathAttrNlriDetailsLocalRib>> vpnLinkTree() {
106 + return vpnLinkTree;
107 + }
108 +
109 + /**
110 + * Gets VPN prefix NLRI tree.
111 + *
112 + * @return vpn prefix NLRI Tree
113 + */
114 + public Map<RouteDistinguisher, Map<BgpPrefixLSIdentifier, PathAttrNlriDetailsLocalRib>> vpnPrefixTree() {
115 + return vpnPrefixTree;
116 + }
117 +
118 + @Override
119 + public void add(BgpSessionInfo sessionInfo, BgpLSNlri nlri, PathAttrNlriDetails details) {
120 + int decisionResult;
121 +
122 + log.debug("Add to local RIB {}", details.toString());
123 +
124 + PathAttrNlriDetailsLocalRib detailsLocRib = new PathAttrNlriDetailsLocalRib(
125 + sessionInfo.remoteBgpId().ipAddress(),
126 + sessionInfo.remoteBgpIdentifier(),
127 + sessionInfo.remoteBgpASNum(),
128 + sessionInfo.isIbgpSession(), details);
129 + if (nlri instanceof BgpNodeLSNlriVer4) {
130 + BgpNodeLSIdentifier nodeLsIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
131 + if (nodeTree.containsKey(nodeLsIdentifier)) {
132 + BgpSelectionAlgo selectionAlgo = new BgpSelectionAlgo();
133 + // Compare local RIB entry with the current attribute
134 + decisionResult = selectionAlgo.compare(nodeTree.get(nodeLsIdentifier), detailsLocRib);
135 + if (decisionResult < 0) {
136 + nodeTree.replace(nodeLsIdentifier, detailsLocRib);
137 + log.debug("Local RIB update node: {}", detailsLocRib.toString());
138 + }
139 + } else {
140 + nodeTree.put(nodeLsIdentifier, detailsLocRib);
141 + for (BgpNodeListener l : bgpController.listener()) {
142 + l.addNode((BgpNodeLSNlriVer4) nlri);
143 + }
144 + log.debug("Local RIB ad node: {}", detailsLocRib.toString());
145 + }
146 + } else if (nlri instanceof BgpLinkLsNlriVer4) {
147 + BgpLinkLSIdentifier linkLsIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
148 + if (linkTree.containsKey(linkLsIdentifier)) {
149 + BgpSelectionAlgo selectionAlgo = new BgpSelectionAlgo();
150 + // Compare local RIB entry with the current attribute
151 + decisionResult = selectionAlgo.compare(linkTree.get(linkLsIdentifier), detailsLocRib);
152 + if (decisionResult < 0) {
153 + linkTree.replace(linkLsIdentifier, detailsLocRib);
154 + log.debug("Local RIB update link: {}", detailsLocRib.toString());
155 + }
156 + } else {
157 + linkTree.put(linkLsIdentifier, detailsLocRib);
158 + log.debug("Local RIB add link: {}", detailsLocRib.toString());
159 + }
160 + } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
161 + BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
162 + if (prefixTree.containsKey(prefixIdentifier)) {
163 + BgpSelectionAlgo selectionAlgo = new BgpSelectionAlgo();
164 + // Compare local RIB entry with the current attribute
165 + decisionResult = selectionAlgo.compare(prefixTree.get(prefixIdentifier), detailsLocRib);
166 + if (decisionResult < 0) {
167 + prefixTree.replace(prefixIdentifier, detailsLocRib);
168 + log.debug("Local RIB update prefix: {}", detailsLocRib.toString());
169 + }
170 + } else {
171 + prefixTree.put(prefixIdentifier, detailsLocRib);
172 + log.debug("Local RIB add prefix: {}", detailsLocRib.toString());
173 + }
174 + }
175 + }
176 +
177 + @Override
178 + public void delete(BgpLSNlri nlri) {
179 + log.debug("Delete from local RIB.");
180 +
181 + // Update local RIB
182 + decisionProcess(nlri);
183 + }
184 +
185 + /**
186 + * Update local RIB based on selection algorithm.
187 + *
188 + * @param nlri NLRI to update
189 + */
190 + public void decisionProcess(BgpLSNlri nlri) {
191 + checkNotNull(nlri);
192 + if (nlri instanceof BgpNodeLSNlriVer4) {
193 + selectionProcessNode(nlri, false);
194 + } else if (nlri instanceof BgpLinkLsNlriVer4) {
195 + selectionProcessLink(nlri, false);
196 + } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
197 + selectionProcessPrefix(nlri, false);
198 + }
199 + }
200 +
201 + /**
202 + * Update VPN local RIB .
203 + *
204 + * @param nlri NLRI to update
205 + * @param routeDistinguisher VPN id to update
206 + */
207 + public void decisionProcess(BgpLSNlri nlri, RouteDistinguisher routeDistinguisher) {
208 + checkNotNull(nlri);
209 + if (nlri instanceof BgpNodeLSNlriVer4) {
210 + if (vpnNodeTree.containsKey(routeDistinguisher)) {
211 + selectionProcessNode(nlri, true);
212 + if (nodeTree.size() == 0) {
213 + vpnNodeTree.remove(routeDistinguisher);
214 + }
215 + }
216 + } else if (nlri instanceof BgpLinkLsNlriVer4) {
217 + if (vpnLinkTree.containsKey(routeDistinguisher)) {
218 + selectionProcessLink(nlri, true);
219 + if (linkTree.size() == 0) {
220 + vpnLinkTree.remove(routeDistinguisher);
221 + }
222 + }
223 + } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
224 + if (vpnPrefixTree.containsKey(routeDistinguisher)) {
225 + selectionProcessPrefix(nlri, true);
226 + if (prefixTree.size() == 0) {
227 + vpnPrefixTree.remove(routeDistinguisher);
228 + }
229 + }
230 + }
231 + }
232 +
233 + /**
234 + * Selection process for local RIB node.
235 + *
236 + * @param nlri NLRI to update
237 + * @param isVpnRib true if VPN local RIB, otherwise false
238 + */
239 + public void selectionProcessNode(BgpLSNlri nlri, boolean isVpnRib) {
240 + BgpPeerImpl peer;
241 + BgpSessionInfo sessionInfo;
242 + int decisionResult;
243 + boolean containsKey;
244 +
245 + BgpNodeLSIdentifier nodeLsIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
246 +
247 + if (nodeTree.containsKey(nodeLsIdentifier)) {
248 + for (BgpNodeListener l : bgpController.listener()) {
249 + l.deleteNode((BgpNodeLSNlriVer4) nlri);
250 + }
251 + log.debug("Local RIB delete node: {}", nodeLsIdentifier.toString());
252 + nodeTree.remove(nodeLsIdentifier);
253 + }
254 +
255 + for (BgpId bgpId : bgpController.connectedPeers().keySet()) {
256 + peer = (BgpPeerImpl) (bgpController.getPeer(bgpId));
257 +
258 + if (nodeTree.containsKey(nodeLsIdentifier)) {
259 + containsKey = (!isVpnRib) ? (peer.adjacencyRib().nodeTree().containsKey(nodeLsIdentifier)) :
260 + (peer.vpnAdjacencyRib().nodeTree().containsKey(nodeLsIdentifier));
261 +
262 + if (!containsKey) {
263 + continue;
264 + }
265 + sessionInfo = peer.sessionInfo();
266 + PathAttrNlriDetailsLocalRib detailsLocRib = new PathAttrNlriDetailsLocalRib(
267 + sessionInfo.remoteBgpId().ipAddress(),
268 + sessionInfo.remoteBgpIdentifier(),
269 + sessionInfo.remoteBgpASNum(),
270 + sessionInfo.isIbgpSession(),
271 + (!isVpnRib) ?
272 + (peer.adjacencyRib().nodeTree()
273 + .get(nodeLsIdentifier)) :
274 + (peer.vpnAdjacencyRib().nodeTree()
275 + .get(nodeLsIdentifier)));
276 + BgpSelectionAlgo selectionAlgo = new BgpSelectionAlgo();
277 + decisionResult = selectionAlgo.compare(nodeTree.get(nodeLsIdentifier), detailsLocRib);
278 + if (decisionResult < 0) {
279 + nodeTree.replace(nodeLsIdentifier, detailsLocRib);
280 + log.debug("Local RIB node updated: {}", detailsLocRib.toString());
281 + }
282 + } else {
283 + if (!isVpnRib) {
284 + if (peer.adjacencyRib().nodeTree().containsKey(nodeLsIdentifier)) {
285 + add(peer.sessionInfo(), nlri, peer.adjacencyRib().nodeTree().get(nodeLsIdentifier));
286 + }
287 + } else {
288 + if (peer.vpnAdjacencyRib().nodeTree().containsKey(nodeLsIdentifier)) {
289 + add(peer.sessionInfo(), nlri, peer.vpnAdjacencyRib().nodeTree().get(nodeLsIdentifier));
290 + }
291 + }
292 + }
293 + }
294 + }
295 +
296 + /**
297 + * Selection process for local RIB link.
298 + *
299 + * @param nlri NLRI to update
300 + * @param isVpnRib true if VPN local RIB, otherwise false
301 + */
302 + public void selectionProcessLink(BgpLSNlri nlri, boolean isVpnRib) {
303 + BgpPeerImpl peer;
304 + BgpSessionInfo sessionInfo;
305 + int decisionResult;
306 + boolean containsKey;
307 +
308 + BgpLinkLSIdentifier linkLsIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
309 +
310 + if (linkTree.containsKey(linkLsIdentifier)) {
311 + log.debug("Local RIB remove link: {}", linkLsIdentifier.toString());
312 + linkTree.remove(linkLsIdentifier);
313 + }
314 +
315 + for (BgpId bgpId : bgpController.connectedPeers().keySet()) {
316 + peer = (BgpPeerImpl) (bgpController.getPeer(bgpId));
317 +
318 + if (linkTree.containsKey(linkLsIdentifier)) {
319 +
320 + containsKey = (!isVpnRib) ? (peer.adjacencyRib().linkTree().containsKey(linkLsIdentifier)) :
321 + (peer.vpnAdjacencyRib().linkTree().containsKey(linkLsIdentifier));
322 +
323 + if (!containsKey) {
324 + continue;
325 + }
326 +
327 + sessionInfo = peer.sessionInfo();
328 +
329 + PathAttrNlriDetailsLocalRib detailsLocRib = new PathAttrNlriDetailsLocalRib(
330 + sessionInfo.remoteBgpId().ipAddress(),
331 + sessionInfo.remoteBgpIdentifier(),
332 + sessionInfo.remoteBgpASNum(),
333 + sessionInfo.isIbgpSession(),
334 + ((!isVpnRib) ?
335 + (peer.adjacencyRib().linkTree().get(linkLsIdentifier)) :
336 + (peer.vpnAdjacencyRib().linkTree()
337 + .get(linkLsIdentifier))));
338 +
339 + BgpSelectionAlgo selectionAlgo = new BgpSelectionAlgo();
340 + decisionResult = selectionAlgo.compare(linkTree.get(linkLsIdentifier), detailsLocRib);
341 + if (decisionResult < 0) {
342 + linkTree.replace(linkLsIdentifier, detailsLocRib);
343 + log.debug("Local RIB link updated: {}", detailsLocRib.toString());
344 + }
345 + } else {
346 + if (!isVpnRib) {
347 + if (peer.adjacencyRib().linkTree().containsKey(linkLsIdentifier)) {
348 + add(peer.sessionInfo(), nlri, peer.adjacencyRib().linkTree().get(linkLsIdentifier));
349 + }
350 + } else {
351 + if (peer.vpnAdjacencyRib().linkTree().containsKey(linkLsIdentifier)) {
352 + add(peer.sessionInfo(), nlri, peer.vpnAdjacencyRib().linkTree().get(linkLsIdentifier));
353 + }
354 + }
355 + }
356 + }
357 + }
358 +
359 + /**
360 + * Selection process for local RIB prefix.
361 + *
362 + * @param nlri NLRI to update
363 + * @param isVpnRib true if VPN local RIB, otherwise false
364 + */
365 + public void selectionProcessPrefix(BgpLSNlri nlri, boolean isVpnRib) {
366 + BgpPeerImpl peer;
367 + BgpSessionInfo sessionInfo;
368 + int decisionResult;
369 + boolean containsKey;
370 +
371 + BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
372 + if (prefixTree.containsKey(prefixIdentifier)) {
373 + log.debug("Local RIB remove prefix: {}", prefixIdentifier.toString());
374 + prefixTree.remove(prefixIdentifier);
375 + }
376 +
377 + for (BgpId bgpId : bgpController.connectedPeers().keySet()) {
378 + peer = (BgpPeerImpl) (bgpController.getPeer(bgpId));
379 +
380 + if (prefixTree.containsKey(prefixIdentifier)) {
381 +
382 + containsKey = (!isVpnRib) ? (peer.adjacencyRib().prefixTree().containsKey(prefixIdentifier)) :
383 + (peer.vpnAdjacencyRib().prefixTree().containsKey(prefixIdentifier));
384 + if (!containsKey) {
385 + continue;
386 + }
387 + sessionInfo = peer.sessionInfo();
388 +
389 + PathAttrNlriDetailsLocalRib detailsLocRib = new PathAttrNlriDetailsLocalRib(
390 + sessionInfo.remoteBgpId().ipAddress(),
391 + sessionInfo.remoteBgpIdentifier(),
392 + sessionInfo.remoteBgpASNum(),
393 + sessionInfo.isIbgpSession(),
394 + ((!isVpnRib) ?
395 + (peer.adjacencyRib().prefixTree()
396 + .get(prefixIdentifier)) :
397 + (peer.vpnAdjacencyRib().prefixTree()
398 + .get(prefixIdentifier))));
399 +
400 + BgpSelectionAlgo selectionAlgo = new BgpSelectionAlgo();
401 + decisionResult = selectionAlgo.compare(prefixTree.get(prefixIdentifier), detailsLocRib);
402 + if (decisionResult < 0) {
403 + prefixTree.replace(prefixIdentifier, detailsLocRib);
404 + log.debug("local RIB prefix updated: {}", detailsLocRib.toString());
405 + }
406 + } else {
407 + if (!isVpnRib) {
408 + if (peer.adjacencyRib().prefixTree().containsKey(prefixIdentifier)) {
409 + add(peer.sessionInfo(), nlri, peer.adjacencyRib().prefixTree().get(prefixIdentifier));
410 + } else {
411 + if (peer.vpnAdjacencyRib().prefixTree().containsKey(prefixIdentifier)) {
412 + add(peer.sessionInfo(), nlri, peer.vpnAdjacencyRib().prefixTree().get(prefixIdentifier));
413 + }
414 + }
415 + }
416 + }
417 + }
418 + }
419 +
420 + @Override
421 + public void add(BgpSessionInfo sessionInfo, BgpLSNlri nlri, PathAttrNlriDetails details,
422 + RouteDistinguisher routeDistinguisher) {
423 + add(sessionInfo, nlri, details);
424 + if (nlri instanceof BgpNodeLSNlriVer4) {
425 + if (!vpnNodeTree.containsKey(routeDistinguisher)) {
426 + vpnNodeTree.put(routeDistinguisher, nodeTree);
427 + }
428 + } else if (nlri instanceof BgpLinkLsNlriVer4) {
429 + if (!vpnLinkTree.containsKey(routeDistinguisher)) {
430 + vpnLinkTree.put(routeDistinguisher, linkTree);
431 + }
432 + } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
433 + if (!vpnPrefixTree.containsKey(routeDistinguisher)) {
434 + vpnPrefixTree.put(routeDistinguisher, prefixTree);
435 + }
436 + }
437 + }
438 +
439 + @Override
440 + public void delete(BgpLSNlri nlri, RouteDistinguisher routeDistinguisher) {
441 + // Update local RIB
442 + decisionProcess(nlri, routeDistinguisher);
443 + }
444 +
445 + /**
446 + * Update local RIB node based on avaliable peer adjacency RIB.
447 + *
448 + * @param o adjacency-in/VPN adjacency-in
449 + */
450 + public void localRIBUpdateNode(Object o) {
451 +
452 + if (o instanceof AdjRibIn) {
453 + AdjRibIn adjRib = (AdjRibIn) o;
454 + log.debug("Update local RIB node.");
455 +
456 + Set<BgpNodeLSIdentifier> nodeKeys = adjRib.nodeTree().keySet();
457 + for (BgpNodeLSIdentifier key : nodeKeys) {
458 + PathAttrNlriDetails pathAttrNlri = adjRib.nodeTree().get(key);
459 +
460 + BgpNodeLSNlriVer4 nodeNlri = new BgpNodeLSNlriVer4(pathAttrNlri.identifier(), pathAttrNlri
461 + .protocolID().getType(), key, false, null);
462 + decisionProcess(nodeNlri);
463 + }
464 + }
465 +
466 + if (o instanceof VpnAdjRibIn) {
467 + VpnAdjRibIn vpnAdjRib = (VpnAdjRibIn) o;
468 + log.debug("Update local RIB VPN node.");
469 + Set<RouteDistinguisher> nodeKeysVpn = vpnAdjRib.vpnNodeTree().keySet();
470 + Map<BgpNodeLSIdentifier, PathAttrNlriDetails> node;
471 + for (RouteDistinguisher keyVpnNode : nodeKeysVpn) {
472 + node = vpnAdjRib.vpnNodeTree().get(keyVpnNode);
473 +
474 + Set<BgpNodeLSIdentifier> vpnNodeKeys = node.keySet();
475 + for (BgpNodeLSIdentifier key : vpnNodeKeys) {
476 + PathAttrNlriDetails pathAttrNlri = vpnAdjRib.nodeTree().get(key);
477 + BgpNodeLSNlriVer4 nodeNlri = new BgpNodeLSNlriVer4(pathAttrNlri.identifier(),
478 + pathAttrNlri.protocolID().getType(),
479 + key, true, keyVpnNode);
480 + decisionProcess(nodeNlri, keyVpnNode);
481 + }
482 + }
483 + }
484 + }
485 +
486 + /**
487 + * Update localRIB link based on avaliable peer adjacency RIB.
488 + *
489 + * @param o adjacency-in/VPN adjacency-in
490 + */
491 + public void localRIBUpdateLink(Object o) {
492 +
493 + if (o instanceof AdjRibIn) {
494 + AdjRibIn adjRib = (AdjRibIn) o;
495 + log.debug("Update local RIB link.");
496 +
497 + Set<BgpLinkLSIdentifier> linkKeys = adjRib.linkTree().keySet();
498 + for (BgpLinkLSIdentifier key : linkKeys) {
499 + PathAttrNlriDetails pathAttrNlri = adjRib.linkTree().get(key);
500 + BgpLinkLsNlriVer4 linkNlri = new BgpLinkLsNlriVer4(pathAttrNlri.protocolID().getType(),
501 + pathAttrNlri.identifier(), key, null, false);
502 + decisionProcess(linkNlri);
503 + }
504 + }
505 +
506 + if (o instanceof VpnAdjRibIn) {
507 + VpnAdjRibIn vpnAdjRib = (VpnAdjRibIn) o;
508 + log.debug("Update local RIB VPN link");
509 +
510 + Set<RouteDistinguisher> linkKeysVpn = vpnAdjRib.vpnLinkTree().keySet();
511 + Map<BgpLinkLSIdentifier, PathAttrNlriDetails> link;
512 + for (RouteDistinguisher keyVpnLink : linkKeysVpn) {
513 + link = vpnAdjRib.vpnLinkTree().get(keyVpnLink);
514 +
515 + Set<BgpLinkLSIdentifier> vpnLinkKeys = link.keySet();
516 + for (BgpLinkLSIdentifier key : vpnLinkKeys) {
517 + PathAttrNlriDetails pathAttrNlri = vpnAdjRib.linkTree().get(key);
518 + BgpLinkLsNlriVer4 linkNlri = new BgpLinkLsNlriVer4(pathAttrNlri.protocolID().getType(),
519 + pathAttrNlri.identifier(), key, keyVpnLink,
520 + true);
521 + decisionProcess(linkNlri, keyVpnLink);
522 + }
523 + }
524 + }
525 + }
526 +
527 + /**
528 + * Update localRIB prefix based on avaliable peer adjacency RIB.
529 + *
530 + * @param o instance of adjacency-in/VPN adjacency-in
531 + */
532 + public void localRIBUpdatePrefix(Object o) {
533 +
534 + if (o instanceof AdjRibIn) {
535 + AdjRibIn adjRib = (AdjRibIn) o;
536 + log.debug("Update local RIB prefix.");
537 +
538 + Set<BgpPrefixLSIdentifier> prefixKeys = adjRib.prefixTree().keySet();
539 + for (BgpPrefixLSIdentifier key : prefixKeys) {
540 + PathAttrNlriDetails pathAttrNlri = adjRib.prefixTree().get(key);
541 + BgpPrefixIPv4LSNlriVer4 prefixNlri = new BgpPrefixIPv4LSNlriVer4(
542 + pathAttrNlri.identifier(),
543 + pathAttrNlri.protocolID().getType(),
544 + key, null, false);
545 + decisionProcess(prefixNlri);
546 + }
547 + }
548 +
549 + if (o instanceof VpnAdjRibIn) {
550 + VpnAdjRibIn vpnAdjRib = (VpnAdjRibIn) o;
551 + log.debug("Update local RIB VPN prefix.");
552 +
553 + Set<RouteDistinguisher> prefixKeysVpn = vpnAdjRib.vpnPrefixTree().keySet();
554 + Map<BgpPrefixLSIdentifier, PathAttrNlriDetails> prefix;
555 + for (RouteDistinguisher keyVpnPrefix : prefixKeysVpn) {
556 + prefix = vpnAdjRib.vpnPrefixTree().get(keyVpnPrefix);
557 +
558 + Set<BgpPrefixLSIdentifier> vpnPrefixKeys = prefix.keySet();
559 + for (BgpPrefixLSIdentifier key : vpnPrefixKeys) {
560 + PathAttrNlriDetails pathAttrNlri = vpnAdjRib.prefixTree().get(key);
561 + BgpPrefixIPv4LSNlriVer4 prefixNlri = new BgpPrefixIPv4LSNlriVer4(pathAttrNlri.identifier(),
562 + pathAttrNlri.protocolID()
563 + .getType(), key,
564 + keyVpnPrefix, true);
565 + decisionProcess(prefixNlri, keyVpnPrefix);
566 + }
567 + }
568 + }
569 + }
570 +
571 + /**
572 + * Update localRIB.
573 + *
574 + * @param adjRibIn adjacency RIB-in
575 + */
576 + public void localRIBUpdate(AdjRibIn adjRibIn) {
577 + log.debug("Update local RIB.");
578 +
579 + localRIBUpdateNode(adjRibIn);
580 + localRIBUpdateLink(adjRibIn);
581 + localRIBUpdatePrefix(adjRibIn);
582 + }
583 +
584 + /**
585 + * Update localRIB.
586 + *
587 + * @param vpnAdjRibIn VPN adjacency RIB-in
588 + */
589 + public void localRIBUpdate(VpnAdjRibIn vpnAdjRibIn) {
590 + log.debug("Update VPN local RIB.");
591 +
592 + localRIBUpdateNode(vpnAdjRibIn);
593 + localRIBUpdateLink(vpnAdjRibIn);
594 + localRIBUpdatePrefix(vpnAdjRibIn);
595 + }
596 +
597 + @Override
598 + public String toString() {
599 + return MoreObjects.toStringHelper(getClass()).omitNullValues().add("nodeTree", nodeTree)
600 + .add("linkTree", linkTree).add("prefixTree", prefixTree).add("vpnNodeTree", vpnNodeTree)
601 + .add("vpnLinkTree", vpnLinkTree).add("vpnPrefixTree", vpnPrefixTree).toString();
602 + }
603 +}
...@@ -28,6 +28,7 @@ import org.onlab.packet.IpAddress; ...@@ -28,6 +28,7 @@ import org.onlab.packet.IpAddress;
28 import org.onosproject.bgp.controller.BgpController; 28 import org.onosproject.bgp.controller.BgpController;
29 import org.onosproject.bgp.controller.BgpPeer; 29 import org.onosproject.bgp.controller.BgpPeer;
30 import org.onosproject.bgp.controller.BgpSessionInfo; 30 import org.onosproject.bgp.controller.BgpSessionInfo;
31 +import org.onosproject.bgp.controller.BgpLocalRib;
31 import org.onosproject.bgpio.exceptions.BgpParseException; 32 import org.onosproject.bgpio.exceptions.BgpParseException;
32 import org.onosproject.bgpio.protocol.BgpFactories; 33 import org.onosproject.bgpio.protocol.BgpFactories;
33 import org.onosproject.bgpio.protocol.BgpFactory; 34 import org.onosproject.bgpio.protocol.BgpFactory;
...@@ -61,9 +62,28 @@ public class BgpPeerImpl implements BgpPeer { ...@@ -61,9 +62,28 @@ public class BgpPeerImpl implements BgpPeer {
61 protected boolean isHandShakeComplete = false; 62 protected boolean isHandShakeComplete = false;
62 private BgpSessionInfo sessionInfo; 63 private BgpSessionInfo sessionInfo;
63 private BgpPacketStatsImpl pktStats; 64 private BgpPacketStatsImpl pktStats;
65 + private BgpLocalRib bgplocalRIB;
66 + private BgpLocalRib bgplocalRIBVpn;
64 private AdjRibIn adjRib; 67 private AdjRibIn adjRib;
65 private VpnAdjRibIn vpnAdjRib; 68 private VpnAdjRibIn vpnAdjRib;
66 69
70 + /**
71 + * Return the adjacency RIB-IN.
72 + *
73 + * @return adjRib the adjacency RIB-IN
74 + */
75 + public AdjRibIn adjacencyRib() {
76 + return adjRib;
77 + }
78 +
79 + /**
80 + * Return the adjacency RIB-IN with VPN.
81 + *
82 + * @return vpnAdjRib the adjacency RIB-IN with VPN
83 + */
84 + public VpnAdjRibIn vpnAdjacencyRib() {
85 + return vpnAdjRib;
86 + }
67 87
68 @Override 88 @Override
69 public BgpSessionInfo sessionInfo() { 89 public BgpSessionInfo sessionInfo() {
...@@ -81,6 +101,8 @@ public class BgpPeerImpl implements BgpPeer { ...@@ -81,6 +101,8 @@ public class BgpPeerImpl implements BgpPeer {
81 this.bgpController = bgpController; 101 this.bgpController = bgpController;
82 this.sessionInfo = sessionInfo; 102 this.sessionInfo = sessionInfo;
83 this.pktStats = pktStats; 103 this.pktStats = pktStats;
104 + this.bgplocalRIB = bgpController.bgpLocalRib();
105 + this.bgplocalRIBVpn = bgpController.bgpLocalRibVpn();
84 this.adjRib = new AdjRibIn(); 106 this.adjRib = new AdjRibIn();
85 this.vpnAdjRib = new VpnAdjRibIn(); 107 this.vpnAdjRib = new VpnAdjRibIn();
86 } 108 }
...@@ -119,22 +141,31 @@ public class BgpPeerImpl implements BgpPeer { ...@@ -119,22 +141,31 @@ public class BgpPeerImpl implements BgpPeer {
119 PathAttrNlriDetails details = setPathAttrDetails(nlriInfo, pathAttr); 141 PathAttrNlriDetails details = setPathAttrDetails(nlriInfo, pathAttr);
120 if (!((BgpNodeLSNlriVer4) nlriInfo).isVpnPresent()) { 142 if (!((BgpNodeLSNlriVer4) nlriInfo).isVpnPresent()) {
121 adjRib.add(nlriInfo, details); 143 adjRib.add(nlriInfo, details);
144 + bgplocalRIB.add(sessionInfo(), nlriInfo, details);
122 } else { 145 } else {
123 vpnAdjRib.addVpn(nlriInfo, details, ((BgpNodeLSNlriVer4) nlriInfo).getRouteDistinguisher()); 146 vpnAdjRib.addVpn(nlriInfo, details, ((BgpNodeLSNlriVer4) nlriInfo).getRouteDistinguisher());
147 + bgplocalRIBVpn.add(sessionInfo(), nlriInfo, details,
148 + ((BgpNodeLSNlriVer4) nlriInfo).getRouteDistinguisher());
124 } 149 }
125 } else if (nlriInfo instanceof BgpLinkLsNlriVer4) { 150 } else if (nlriInfo instanceof BgpLinkLsNlriVer4) {
126 PathAttrNlriDetails details = setPathAttrDetails(nlriInfo, pathAttr); 151 PathAttrNlriDetails details = setPathAttrDetails(nlriInfo, pathAttr);
127 if (!((BgpLinkLsNlriVer4) nlriInfo).isVpnPresent()) { 152 if (!((BgpLinkLsNlriVer4) nlriInfo).isVpnPresent()) {
128 adjRib.add(nlriInfo, details); 153 adjRib.add(nlriInfo, details);
154 + bgplocalRIB.add(sessionInfo(), nlriInfo, details);
129 } else { 155 } else {
130 vpnAdjRib.addVpn(nlriInfo, details, ((BgpLinkLsNlriVer4) nlriInfo).getRouteDistinguisher()); 156 vpnAdjRib.addVpn(nlriInfo, details, ((BgpLinkLsNlriVer4) nlriInfo).getRouteDistinguisher());
157 + bgplocalRIBVpn.add(sessionInfo(), nlriInfo, details,
158 + ((BgpLinkLsNlriVer4) nlriInfo).getRouteDistinguisher());
131 } 159 }
132 } else if (nlriInfo instanceof BgpPrefixIPv4LSNlriVer4) { 160 } else if (nlriInfo instanceof BgpPrefixIPv4LSNlriVer4) {
133 PathAttrNlriDetails details = setPathAttrDetails(nlriInfo, pathAttr); 161 PathAttrNlriDetails details = setPathAttrDetails(nlriInfo, pathAttr);
134 if (!((BgpPrefixIPv4LSNlriVer4) nlriInfo).isVpnPresent()) { 162 if (!((BgpPrefixIPv4LSNlriVer4) nlriInfo).isVpnPresent()) {
135 adjRib.add(nlriInfo, details); 163 adjRib.add(nlriInfo, details);
164 + bgplocalRIB.add(sessionInfo(), nlriInfo, details);
136 } else { 165 } else {
137 vpnAdjRib.addVpn(nlriInfo, details, ((BgpPrefixIPv4LSNlriVer4) nlriInfo).getRouteDistinguisher()); 166 vpnAdjRib.addVpn(nlriInfo, details, ((BgpPrefixIPv4LSNlriVer4) nlriInfo).getRouteDistinguisher());
167 + bgplocalRIBVpn.add(sessionInfo(), nlriInfo, details,
168 + ((BgpPrefixIPv4LSNlriVer4) nlriInfo).getRouteDistinguisher());
138 } 169 }
139 } 170 }
140 } 171 }
...@@ -170,20 +201,26 @@ public class BgpPeerImpl implements BgpPeer { ...@@ -170,20 +201,26 @@ public class BgpPeerImpl implements BgpPeer {
170 if (nlriInfo instanceof BgpNodeLSNlriVer4) { 201 if (nlriInfo instanceof BgpNodeLSNlriVer4) {
171 if (!((BgpNodeLSNlriVer4) nlriInfo).isVpnPresent()) { 202 if (!((BgpNodeLSNlriVer4) nlriInfo).isVpnPresent()) {
172 adjRib.remove(nlriInfo); 203 adjRib.remove(nlriInfo);
204 + bgplocalRIB.delete(nlriInfo);
173 } else { 205 } else {
174 vpnAdjRib.removeVpn(nlriInfo, ((BgpNodeLSNlriVer4) nlriInfo).getRouteDistinguisher()); 206 vpnAdjRib.removeVpn(nlriInfo, ((BgpNodeLSNlriVer4) nlriInfo).getRouteDistinguisher());
207 + bgplocalRIBVpn.delete(nlriInfo, ((BgpNodeLSNlriVer4) nlriInfo).getRouteDistinguisher());
175 } 208 }
176 } else if (nlriInfo instanceof BgpLinkLsNlriVer4) { 209 } else if (nlriInfo instanceof BgpLinkLsNlriVer4) {
177 if (!((BgpLinkLsNlriVer4) nlriInfo).isVpnPresent()) { 210 if (!((BgpLinkLsNlriVer4) nlriInfo).isVpnPresent()) {
178 adjRib.remove(nlriInfo); 211 adjRib.remove(nlriInfo);
212 + bgplocalRIB.delete(nlriInfo);
179 } else { 213 } else {
180 vpnAdjRib.removeVpn(nlriInfo, ((BgpLinkLsNlriVer4) nlriInfo).getRouteDistinguisher()); 214 vpnAdjRib.removeVpn(nlriInfo, ((BgpLinkLsNlriVer4) nlriInfo).getRouteDistinguisher());
215 + bgplocalRIBVpn.delete(nlriInfo, ((BgpLinkLsNlriVer4) nlriInfo).getRouteDistinguisher());
181 } 216 }
182 } else if (nlriInfo instanceof BgpPrefixIPv4LSNlriVer4) { 217 } else if (nlriInfo instanceof BgpPrefixIPv4LSNlriVer4) {
183 if (!((BgpPrefixIPv4LSNlriVer4) nlriInfo).isVpnPresent()) { 218 if (!((BgpPrefixIPv4LSNlriVer4) nlriInfo).isVpnPresent()) {
184 adjRib.remove(nlriInfo); 219 adjRib.remove(nlriInfo);
220 + bgplocalRIB.delete(nlriInfo);
185 } else { 221 } else {
186 vpnAdjRib.removeVpn(nlriInfo, ((BgpPrefixIPv4LSNlriVer4) nlriInfo).getRouteDistinguisher()); 222 vpnAdjRib.removeVpn(nlriInfo, ((BgpPrefixIPv4LSNlriVer4) nlriInfo).getRouteDistinguisher());
223 + bgplocalRIBVpn.delete(nlriInfo, ((BgpPrefixIPv4LSNlriVer4) nlriInfo).getRouteDistinguisher());
187 } 224 }
188 } 225 }
189 } 226 }
...@@ -207,6 +244,18 @@ public class BgpPeerImpl implements BgpPeer { ...@@ -207,6 +244,18 @@ public class BgpPeerImpl implements BgpPeer {
207 return vpnAdjRib; 244 return vpnAdjRib;
208 } 245 }
209 246
247 + /**
248 + * Update localRIB on peer disconnect.
249 + *
250 + */
251 + public void updateLocalRIBOnPeerDisconnect() {
252 + BgpLocalRibImpl localRib = (BgpLocalRibImpl) bgplocalRIB;
253 + BgpLocalRibImpl localRibVpn = (BgpLocalRibImpl) bgplocalRIBVpn;
254 +
255 + localRib.localRIBUpdate(adjacencyRib());
256 + localRibVpn.localRIBUpdate(vpnAdjacencyRib());
257 + }
258 +
210 // ************************ 259 // ************************
211 // Channel related 260 // Channel related
212 // ************************ 261 // ************************
......
...@@ -31,6 +31,7 @@ import org.onosproject.bgp.controller.BgpCfg; ...@@ -31,6 +31,7 @@ import org.onosproject.bgp.controller.BgpCfg;
31 import org.onosproject.bgp.controller.BgpController; 31 import org.onosproject.bgp.controller.BgpController;
32 import org.onosproject.bgp.controller.BgpId; 32 import org.onosproject.bgp.controller.BgpId;
33 import org.onosproject.bgp.controller.BgpPeer; 33 import org.onosproject.bgp.controller.BgpPeer;
34 +import org.onosproject.bgp.controller.BgpLocalRib;
34 import org.onosproject.bgp.controller.BgpNodeListener; 35 import org.onosproject.bgp.controller.BgpNodeListener;
35 import org.onosproject.bgp.controller.BgpPeerManager; 36 import org.onosproject.bgp.controller.BgpPeerManager;
36 import org.onosproject.bgpio.exceptions.BgpParseException; 37 import org.onosproject.bgpio.exceptions.BgpParseException;
...@@ -208,6 +209,17 @@ public class BgpTopologyProviderTest { ...@@ -208,6 +209,17 @@ public class BgpTopologyProviderTest {
208 return 0; 209 return 0;
209 } 210 }
210 211
212 + @Override
213 + public BgpLocalRib bgpLocalRibVpn() {
214 + // TODO Auto-generated method stub
215 + return null;
216 + }
217 +
218 + @Override
219 + public BgpLocalRib bgpLocalRib() {
220 + // TODO Auto-generated method stub
221 + return null;
222 + }
211 223
212 @Override 224 @Override
213 public BgpPeerManager peerManager() { 225 public BgpPeerManager peerManager() {
......