[ONOS-2606] Bgp local RIB implementation.

Change-Id: I39eadec95fa1e1328c73efabb2a50bb438075809
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerImpl.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerImpl.java
index 57a924a..e3f09f3 100644
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerImpl.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerImpl.java
@@ -28,6 +28,7 @@
 import org.onosproject.bgp.controller.BgpController;
 import org.onosproject.bgp.controller.BgpPeer;
 import org.onosproject.bgp.controller.BgpSessionInfo;
+import org.onosproject.bgp.controller.BgpLocalRib;
 import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.protocol.BgpFactories;
 import org.onosproject.bgpio.protocol.BgpFactory;
@@ -61,9 +62,28 @@
     protected boolean isHandShakeComplete = false;
     private BgpSessionInfo sessionInfo;
     private BgpPacketStatsImpl pktStats;
+    private BgpLocalRib bgplocalRIB;
+    private BgpLocalRib bgplocalRIBVpn;
     private AdjRibIn adjRib;
     private VpnAdjRibIn vpnAdjRib;
 
+    /**
+     * Return the adjacency RIB-IN.
+     *
+     * @return adjRib the adjacency RIB-IN
+     */
+    public AdjRibIn adjacencyRib() {
+        return adjRib;
+    }
+
+    /**
+     * Return the adjacency RIB-IN with VPN.
+     *
+     * @return vpnAdjRib the adjacency RIB-IN with VPN
+     */
+    public VpnAdjRibIn vpnAdjacencyRib() {
+        return vpnAdjRib;
+    }
 
     @Override
     public BgpSessionInfo sessionInfo() {
@@ -81,6 +101,8 @@
         this.bgpController = bgpController;
         this.sessionInfo = sessionInfo;
         this.pktStats = pktStats;
+        this.bgplocalRIB =  bgpController.bgpLocalRib();
+        this.bgplocalRIBVpn =  bgpController.bgpLocalRibVpn();
         this.adjRib = new AdjRibIn();
         this.vpnAdjRib = new VpnAdjRibIn();
     }
@@ -119,22 +141,31 @@
                 PathAttrNlriDetails details = setPathAttrDetails(nlriInfo, pathAttr);
                 if (!((BgpNodeLSNlriVer4) nlriInfo).isVpnPresent()) {
                     adjRib.add(nlriInfo, details);
+                    bgplocalRIB.add(sessionInfo(), nlriInfo, details);
                 } else {
                     vpnAdjRib.addVpn(nlriInfo, details, ((BgpNodeLSNlriVer4) nlriInfo).getRouteDistinguisher());
+                    bgplocalRIBVpn.add(sessionInfo(), nlriInfo, details,
+                                       ((BgpNodeLSNlriVer4) nlriInfo).getRouteDistinguisher());
                 }
             } else if (nlriInfo instanceof BgpLinkLsNlriVer4) {
                 PathAttrNlriDetails details = setPathAttrDetails(nlriInfo, pathAttr);
                 if (!((BgpLinkLsNlriVer4) nlriInfo).isVpnPresent()) {
                     adjRib.add(nlriInfo, details);
+                    bgplocalRIB.add(sessionInfo(), nlriInfo, details);
                 } else {
                     vpnAdjRib.addVpn(nlriInfo, details, ((BgpLinkLsNlriVer4) nlriInfo).getRouteDistinguisher());
+                    bgplocalRIBVpn.add(sessionInfo(), nlriInfo, details,
+                                       ((BgpLinkLsNlriVer4) nlriInfo).getRouteDistinguisher());
                 }
             } else if (nlriInfo instanceof BgpPrefixIPv4LSNlriVer4) {
                 PathAttrNlriDetails details = setPathAttrDetails(nlriInfo, pathAttr);
                 if (!((BgpPrefixIPv4LSNlriVer4) nlriInfo).isVpnPresent()) {
                     adjRib.add(nlriInfo, details);
+                    bgplocalRIB.add(sessionInfo(), nlriInfo, details);
                 } else {
                     vpnAdjRib.addVpn(nlriInfo, details, ((BgpPrefixIPv4LSNlriVer4) nlriInfo).getRouteDistinguisher());
+                    bgplocalRIBVpn.add(sessionInfo(), nlriInfo, details,
+                                       ((BgpPrefixIPv4LSNlriVer4) nlriInfo).getRouteDistinguisher());
                 }
             }
         }
@@ -170,20 +201,26 @@
             if (nlriInfo instanceof BgpNodeLSNlriVer4) {
                 if (!((BgpNodeLSNlriVer4) nlriInfo).isVpnPresent()) {
                     adjRib.remove(nlriInfo);
+                    bgplocalRIB.delete(nlriInfo);
                 } else {
                     vpnAdjRib.removeVpn(nlriInfo, ((BgpNodeLSNlriVer4) nlriInfo).getRouteDistinguisher());
+                    bgplocalRIBVpn.delete(nlriInfo, ((BgpNodeLSNlriVer4) nlriInfo).getRouteDistinguisher());
                 }
             } else if (nlriInfo instanceof BgpLinkLsNlriVer4) {
                 if (!((BgpLinkLsNlriVer4) nlriInfo).isVpnPresent()) {
                     adjRib.remove(nlriInfo);
+                    bgplocalRIB.delete(nlriInfo);
                 } else {
                     vpnAdjRib.removeVpn(nlriInfo, ((BgpLinkLsNlriVer4) nlriInfo).getRouteDistinguisher());
+                    bgplocalRIBVpn.delete(nlriInfo, ((BgpLinkLsNlriVer4) nlriInfo).getRouteDistinguisher());
                 }
             } else if (nlriInfo instanceof BgpPrefixIPv4LSNlriVer4) {
                 if (!((BgpPrefixIPv4LSNlriVer4) nlriInfo).isVpnPresent()) {
                     adjRib.remove(nlriInfo);
+                    bgplocalRIB.delete(nlriInfo);
                 } else {
                     vpnAdjRib.removeVpn(nlriInfo, ((BgpPrefixIPv4LSNlriVer4) nlriInfo).getRouteDistinguisher());
+                    bgplocalRIBVpn.delete(nlriInfo, ((BgpPrefixIPv4LSNlriVer4) nlriInfo).getRouteDistinguisher());
                 }
             }
         }
@@ -207,6 +244,18 @@
         return vpnAdjRib;
     }
 
+    /**
+     * Update localRIB on peer disconnect.
+     *
+     */
+    public void updateLocalRIBOnPeerDisconnect() {
+        BgpLocalRibImpl localRib = (BgpLocalRibImpl) bgplocalRIB;
+        BgpLocalRibImpl localRibVpn = (BgpLocalRibImpl) bgplocalRIBVpn;
+
+        localRib.localRIBUpdate(adjacencyRib());
+        localRibVpn.localRIBUpdate(vpnAdjacencyRib());
+    }
+
     // ************************
     // Channel related
     // ************************