Carry location of next hop in ResolvedRoute

Change-Id: I64ca6ecc5cfcffc3ed19621053b0ee266c4093ea
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/routing/impl/RouteManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/routing/impl/RouteManager.java
index a362316..4c0f59e 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/routing/impl/RouteManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/routing/impl/RouteManager.java
@@ -23,8 +23,8 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
 import org.onosproject.event.ListenerService;
+import org.onosproject.incubator.net.routing.NextHopData;
 import org.onosproject.incubator.net.routing.NextHop;
 import org.onosproject.incubator.net.routing.ResolvedRoute;
 import org.onosproject.incubator.net.routing.Route;
@@ -118,9 +118,12 @@
             routeStore.getRouteTables().forEach(table -> {
                 Collection<Route> routes = routeStore.getRoutes(table);
                 if (routes != null) {
-                    routes.forEach(route ->
-                        l.post(new RouteEvent(RouteEvent.Type.ROUTE_UPDATED,
-                                        new ResolvedRoute(route, routeStore.getNextHop(route.nextHop())))));
+                    routes.forEach(route -> {
+                        NextHopData nextHopData = routeStore.getNextHop(route.nextHop());
+                            l.post(new RouteEvent(RouteEvent.Type.ROUTE_UPDATED,
+                                    new ResolvedRoute(route, nextHopData.mac(),
+                                            nextHopData.location())));
+                    });
                 }
             });
 
@@ -174,7 +177,7 @@
     @Override
     public Set<NextHop> getNextHops() {
         return routeStore.getNextHops().entrySet().stream()
-                .map(entry -> new NextHop(entry.getKey(), entry.getValue()))
+                .map(entry -> new NextHop(entry.getKey(), entry.getValue().mac()))
                 .collect(Collectors.toSet());
     }
 
@@ -203,24 +206,24 @@
         // Monitor the IP address for updates of the MAC address
         hostService.startMonitoringIp(route.nextHop());
 
-        MacAddress nextHopMac = routeStore.getNextHop(route.nextHop());
-        if (nextHopMac == null) {
+        NextHopData nextHopData = routeStore.getNextHop(route.nextHop());
+        if (nextHopData == null) {
             Set<Host> hosts = hostService.getHostsByIp(route.nextHop());
             Optional<Host> host = hosts.stream().findFirst();
             if (host.isPresent()) {
-                nextHopMac = host.get().mac();
+                nextHopData = NextHopData.fromHost(host.get());
             }
         }
 
-        if (nextHopMac != null) {
-            routeStore.updateNextHop(route.nextHop(), nextHopMac);
+        if (nextHopData != null) {
+            routeStore.updateNextHop(route.nextHop(), nextHopData);
         }
     }
 
     private void hostUpdated(Host host) {
         synchronized (this) {
             for (IpAddress ip : host.ipAddresses()) {
-                routeStore.updateNextHop(ip, host.mac());
+                routeStore.updateNextHop(ip, NextHopData.fromHost(host));
             }
         }
     }
@@ -228,7 +231,7 @@
     private void hostRemoved(Host host) {
         synchronized (this) {
             for (IpAddress ip : host.ipAddresses()) {
-                routeStore.removeNextHop(ip, host.mac());
+                routeStore.removeNextHop(ip, NextHopData.fromHost(host));
             }
         }
     }
diff --git a/incubator/net/src/test/java/org/onosproject/incubator/net/routing/impl/RouteManagerTest.java b/incubator/net/src/test/java/org/onosproject/incubator/net/routing/impl/RouteManagerTest.java
index 9393062..86ba6f6 100644
--- a/incubator/net/src/test/java/org/onosproject/incubator/net/routing/impl/RouteManagerTest.java
+++ b/incubator/net/src/test/java/org/onosproject/incubator/net/routing/impl/RouteManagerTest.java
@@ -178,12 +178,12 @@
     @Test
     public void testRouteAdd() {
         Route route = new Route(Route.Source.STATIC, V4_PREFIX1, V4_NEXT_HOP1);
-        ResolvedRoute resolvedRoute = new ResolvedRoute(route, MAC1);
+        ResolvedRoute resolvedRoute = new ResolvedRoute(route, MAC1, CP1);
 
         verifyRouteAdd(route, resolvedRoute);
 
         route = new Route(Route.Source.STATIC, V6_PREFIX1, V6_NEXT_HOP1);
-        resolvedRoute = new ResolvedRoute(route, MAC3);
+        resolvedRoute = new ResolvedRoute(route, MAC3, CP1);
 
         verifyRouteAdd(route, resolvedRoute);
     }
@@ -215,7 +215,7 @@
     public void testRouteUpdate() {
         Route route = new Route(Route.Source.STATIC, V4_PREFIX1, V4_NEXT_HOP1);
         Route updatedRoute = new Route(Route.Source.STATIC, V4_PREFIX1, V4_NEXT_HOP2);
-        ResolvedRoute updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC2);
+        ResolvedRoute updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC2, CP1);
 
         verifyRouteRemoveThenAdd(route, updatedRoute, updatedResolvedRoute);
 
@@ -223,13 +223,13 @@
         // In this case we expect to receive a ROUTE_UPDATED event.
         route = new Route(Route.Source.STATIC, V4_PREFIX2, V4_NEXT_HOP1);
         updatedRoute = new Route(Route.Source.STATIC, V4_PREFIX2, V4_NEXT_HOP2);
-        updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC2);
+        updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC2, CP1);
 
         verifyRouteUpdated(route, updatedRoute, updatedResolvedRoute);
 
         route = new Route(Route.Source.STATIC, V6_PREFIX1, V6_NEXT_HOP1);
         updatedRoute = new Route(Route.Source.STATIC, V6_PREFIX1, V6_NEXT_HOP2);
-        updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC4);
+        updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC4, CP1);
 
         verifyRouteRemoveThenAdd(route, updatedRoute, updatedResolvedRoute);
     }
@@ -248,7 +248,8 @@
         // First add the original route
         addRoute(original);
 
-        routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_REMOVED, new ResolvedRoute(original, null)));
+        routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_REMOVED,
+                new ResolvedRoute(original, null, null)));
         expectLastCall().once();
         routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_ADDED, updatedResolvedRoute));
         expectLastCall().once();
@@ -308,7 +309,7 @@
         addRoute(route);
 
         RouteEvent withdrawRouteEvent = new RouteEvent(RouteEvent.Type.ROUTE_REMOVED,
-                new ResolvedRoute(route, null));
+                new ResolvedRoute(route, null, null));
 
         reset(routeListener);
         routeListener.event(withdrawRouteEvent);
@@ -346,7 +347,7 @@
         // Now when we send the event, we expect the FIB update to be sent
         reset(routeListener);
         routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_ADDED,
-                new ResolvedRoute(route, MAC1)));
+                new ResolvedRoute(route, MAC1, CP1)));
         replay(routeListener);
 
         // Send in the host event