Added IPv6 routing support to SDN-IP, and integrated it with BGP:
 * The routing entries as received from BGP can be either IPv4 or IPv6
 * The CLI prints the IPv4 and IPv6 routes
 * The BGP peering is still over IPv4, so configuration-wise the IPv6
   routes from the eBGP peers have to be configured to use the IPv4 peering.
 * The integration/testing with the IPv6 Network Discovery Protocol is not
   done yet.
 * The integration/testing with IPv6 intents is not done yet.

Also:
 * Moved nested class BgpSessionManager.BgpRouteSelector out of the
   BgpSessionManager class.
 * Code cleanup.

Change-Id: I9f2dbe4395a72d353bbf215a8a14b01b53c3423f
diff --git a/apps/sdnip/src/main/java/org/onosproject/sdnip/bgp/BgpUpdate.java b/apps/sdnip/src/main/java/org/onosproject/sdnip/bgp/BgpUpdate.java
index 2dabfd9..ddce3a7 100644
--- a/apps/sdnip/src/main/java/org/onosproject/sdnip/bgp/BgpUpdate.java
+++ b/apps/sdnip/src/main/java/org/onosproject/sdnip/bgp/BgpUpdate.java
@@ -25,8 +25,8 @@
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.onlab.packet.Ip4Address;
-import org.onlab.packet.Ip6Address;
 import org.onlab.packet.Ip4Prefix;
+import org.onlab.packet.Ip6Address;
 import org.onlab.packet.Ip6Prefix;
 import org.onosproject.sdnip.bgp.BgpConstants.Notifications.UpdateMessageError;
 import org.onosproject.sdnip.bgp.BgpConstants.Open.Capabilities.MultiprotocolExtensions;
@@ -112,7 +112,7 @@
         for (Ip4Prefix prefix : withdrawnPrefixes) {
             log.debug("BGP RX UPDATE message WITHDRAWN from {}: {}",
                       bgpSession.getRemoteAddress(), prefix);
-            BgpRouteEntry bgpRouteEntry = bgpSession.bgpRibIn4().get(prefix);
+            BgpRouteEntry bgpRouteEntry = bgpSession.findBgpRoute(prefix);
             if (bgpRouteEntry != null) {
                 decodedBgpRoutes.deletedUnicastRoutes4.put(prefix,
                                                            bgpRouteEntry);
@@ -134,35 +134,30 @@
         //
         // Update the BGP RIB-IN
         //
-        Collection<BgpRouteEntry> bgpRoutes;
-        //
-        bgpRoutes = decodedBgpRoutes.deletedUnicastRoutes4.values();
-        for (BgpRouteEntry bgpRouteEntry : bgpRoutes) {
-            bgpSession.bgpRibIn4().remove(bgpRouteEntry.prefix());
+        for (Ip4Prefix ip4Prefix :
+                 decodedBgpRoutes.deletedUnicastRoutes4.keySet()) {
+            bgpSession.removeBgpRoute(ip4Prefix);
         }
         //
-        bgpRoutes = decodedBgpRoutes.addedUnicastRoutes4.values();
-        for (BgpRouteEntry bgpRouteEntry : bgpRoutes) {
-            bgpSession.bgpRibIn4().put(bgpRouteEntry.prefix(), bgpRouteEntry);
+        for (BgpRouteEntry bgpRouteEntry :
+                 decodedBgpRoutes.addedUnicastRoutes4.values()) {
+            bgpSession.addBgpRoute(bgpRouteEntry);
         }
         //
-        bgpRoutes = decodedBgpRoutes.deletedUnicastRoutes6.values();
-        for (BgpRouteEntry bgpRouteEntry : bgpRoutes) {
-            bgpSession.bgpRibIn6().remove(bgpRouteEntry.prefix());
+        for (Ip6Prefix ip6Prefix :
+                 decodedBgpRoutes.deletedUnicastRoutes6.keySet()) {
+            bgpSession.removeBgpRoute(ip6Prefix);
         }
         //
-        bgpRoutes = decodedBgpRoutes.addedUnicastRoutes6.values();
-        // TODO: fix/enable for IPv6
-        /*
-        for (BgpRouteEntry bgpRouteEntry : bgpRoutes) {
-            bgpSession.bgpRibIn6().put(bgpRouteEntry.prefix(), bgpRouteEntry);
+        for (BgpRouteEntry bgpRouteEntry :
+                 decodedBgpRoutes.addedUnicastRoutes6.values()) {
+            bgpSession.addBgpRoute(bgpRouteEntry);
         }
-        */
 
         //
         // Push the updates to the BGP Merged RIB
         //
-        BgpSessionManager.BgpRouteSelector bgpRouteSelector =
+        BgpRouteSelector bgpRouteSelector =
             bgpSession.getBgpSessionManager().getBgpRouteSelector();
         bgpRouteSelector.routeUpdates(bgpSession,
                                 decodedBgpRoutes.addedUnicastRoutes4.values(),
@@ -408,7 +403,7 @@
 
             // The deleted IPv4 routes
             for (Ip4Prefix prefix : mpNlri.nlri4) {
-                bgpRouteEntry = bgpSession.bgpRibIn4().get(prefix);
+                bgpRouteEntry = bgpSession.findBgpRoute(prefix);
                 if (bgpRouteEntry != null) {
                     decodedBgpRoutes.deletedUnicastRoutes4.put(prefix,
                                                                bgpRouteEntry);
@@ -417,7 +412,7 @@
 
             // The deleted IPv6 routes
             for (Ip6Prefix prefix : mpNlri.nlri6) {
-                bgpRouteEntry = bgpSession.bgpRibIn6().get(prefix);
+                bgpRouteEntry = bgpSession.findBgpRoute(prefix);
                 if (bgpRouteEntry != null) {
                     decodedBgpRoutes.deletedUnicastRoutes6.put(prefix,
                                                                bgpRouteEntry);
@@ -456,8 +451,6 @@
             }
 
             // The added IPv6 routes
-            // TODO: fix/enable for IPv6
-            /*
             for (Ip6Prefix prefix : mpNlri.nlri6) {
                 bgpRouteEntry =
                     new BgpRouteEntry(bgpSession, prefix, mpNlri.nextHop6,
@@ -479,7 +472,6 @@
                 decodedBgpRoutes.addedUnicastRoutes6.put(prefix,
                                                          bgpRouteEntry);
             }
-            */
         }
     }