aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/apps/routing
diff options
context:
space:
mode:
authorAshlee Young <ashlee@onosfw.com>2015-10-09 18:32:44 -0700
committerAshlee Young <ashlee@onosfw.com>2015-10-09 18:32:44 -0700
commit6a07d2d622eaa06953f3353e39c080984076e8de (patch)
treebfb50a2090fce186c2cc545a400c969bf2ea702b /framework/src/onos/apps/routing
parente6d71622143ff9b2421a1abbe8434b954b5b1099 (diff)
Updated master to commit id 6ee8aa3e67ce89908a8c93aa9445c6f71a18f986
Change-Id: I94b055ee2f298daf71e2ec794fd0f2495bd8081f
Diffstat (limited to 'framework/src/onos/apps/routing')
-rw-r--r--framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/config/impl/Configuration.java4
-rw-r--r--framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/config/impl/RoutingConfigurationImpl.java17
-rw-r--r--framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/impl/Router.java166
-rw-r--r--framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/impl/StaticRouter.java24
-rw-r--r--framework/src/onos/apps/routing/src/test/java/org/onosproject/routing/impl/RouterTest.java192
5 files changed, 194 insertions, 209 deletions
diff --git a/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/config/impl/Configuration.java b/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/config/impl/Configuration.java
index 45206903..c58bc1b9 100644
--- a/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/config/impl/Configuration.java
+++ b/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/config/impl/Configuration.java
@@ -32,8 +32,8 @@ import java.util.List;
public class Configuration {
// We call the BGP routers in our SDN network the BGP speakers, and call
// the BGP routers outside our SDN network the BGP peers.
- private List<BgpSpeaker> bgpSpeakers;
- private List<BgpPeer> peers;
+ private List<BgpSpeaker> bgpSpeakers = Collections.emptyList();
+ private List<BgpPeer> peers = Collections.emptyList();
private MacAddress virtualGatewayMacAddress;
// All IP prefixes from the configuration are local
diff --git a/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/config/impl/RoutingConfigurationImpl.java b/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/config/impl/RoutingConfigurationImpl.java
index 0a6f9d4c..19c3f70b 100644
--- a/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/config/impl/RoutingConfigurationImpl.java
+++ b/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/config/impl/RoutingConfigurationImpl.java
@@ -195,13 +195,16 @@ public class RoutingConfigurationImpl implements RoutingConfigurationService {
}
BgpConfig bgpConfig = configService.getConfig(routerAppId, BgpConfig.class);
-
- return bgpConfig.bgpSpeakers().stream()
- .flatMap(speaker -> speaker.peers().stream())
- .map(peer -> interfaceService.getMatchingInterface(peer))
- .filter(intf -> intf != null)
- .map(intf -> intf.connectPoint())
- .collect(Collectors.toSet());
+ if (bgpConfig == null) {
+ return Collections.emptySet();
+ } else {
+ return bgpConfig.bgpSpeakers().stream()
+ .flatMap(speaker -> speaker.peers().stream())
+ .map(peer -> interfaceService.getMatchingInterface(peer))
+ .filter(intf -> intf != null)
+ .map(intf -> intf.connectPoint())
+ .collect(Collectors.toSet());
+ }
}
@Override
diff --git a/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/impl/Router.java b/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/impl/Router.java
index 6700d530..75d789ab 100644
--- a/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/impl/Router.java
+++ b/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/impl/Router.java
@@ -35,9 +35,7 @@ import org.onlab.packet.IpAddress;
import org.onlab.packet.IpPrefix;
import org.onlab.packet.MacAddress;
import org.onosproject.core.CoreService;
-import org.onosproject.incubator.net.intf.Interface;
import org.onosproject.incubator.net.intf.InterfaceService;
-import org.onosproject.net.ConnectPoint;
import org.onosproject.net.Host;
import org.onosproject.net.host.HostEvent;
import org.onosproject.net.host.HostListener;
@@ -46,7 +44,6 @@ import org.onosproject.routing.BgpService;
import org.onosproject.routing.FibEntry;
import org.onosproject.routing.FibListener;
import org.onosproject.routing.FibUpdate;
-import org.onosproject.routing.IntentRequestListener;
import org.onosproject.routing.RouteEntry;
import org.onosproject.routing.RouteListener;
import org.onosproject.routing.RouteUpdate;
@@ -61,7 +58,6 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
@@ -100,7 +96,6 @@ public class Router implements RoutingService {
private final Map<IpAddress, MacAddress> ip2Mac = new ConcurrentHashMap<>();
private FibListener fibComponent;
- private IntentRequestListener intentRequestListener;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected CoreService coreService;
@@ -145,12 +140,6 @@ public class Router implements RoutingService {
@Override
public void addFibListener(FibListener fibListener) {
this.fibComponent = checkNotNull(fibListener);
-
- }
-
- @Override
- public void addIntentRequestListener(IntentRequestListener intentRequestListener) {
- this.intentRequestListener = checkNotNull(intentRequestListener);
}
@Override
@@ -287,12 +276,10 @@ public class Router implements RoutingService {
void addRibRoute(RouteEntry routeEntry) {
if (routeEntry.isIp4()) {
// IPv4
- ribTable4.put(createBinaryString(routeEntry.prefix()),
- routeEntry);
+ ribTable4.put(createBinaryString(routeEntry.prefix()), routeEntry);
} else {
// IPv6
- ribTable6.put(createBinaryString(routeEntry.prefix()),
- routeEntry);
+ ribTable6.put(createBinaryString(routeEntry.prefix()), routeEntry);
}
}
@@ -553,17 +540,6 @@ public class Router implements RoutingService {
}
@Override
- public LocationType getLocationType(IpAddress ipAddress) {
- if (routingConfigurationService.isIpAddressLocal(ipAddress)) {
- return LocationType.LOCAL;
- } else if (getLongestMatchableRouteEntry(ipAddress) != null) {
- return LocationType.INTERNET;
- } else {
- return LocationType.NO_ROUTE;
- }
- }
-
- @Override
public RouteEntry getLongestMatchableRouteEntry(IpAddress ipAddress) {
RouteEntry routeEntry = null;
Iterable<RouteEntry> routeEntries;
@@ -587,142 +563,4 @@ public class Router implements RoutingService {
return routeEntry;
}
- @Override
- public ConnectPoint getEgressConnectPoint(IpAddress dstIpAddress) {
- LocationType type = getLocationType(dstIpAddress);
- if (type == LocationType.LOCAL) {
- Set<Host> hosts = hostService.getHostsByIp(dstIpAddress);
- if (!hosts.isEmpty()) {
- return hosts.iterator().next().location();
- } else {
- hostService.startMonitoringIp(dstIpAddress);
- return null;
- }
- } else if (type == LocationType.INTERNET) {
- IpAddress nextHopIpAddress = null;
- RouteEntry routeEntry = getLongestMatchableRouteEntry(dstIpAddress);
- if (routeEntry != null) {
- nextHopIpAddress = routeEntry.nextHop();
- Interface it = interfaceService.getMatchingInterface(nextHopIpAddress);
- if (it != null) {
- return it.connectPoint();
- } else {
- return null;
- }
- } else {
- return null;
- }
- } else {
- return null;
- }
- }
-
- @Override
- public void packetReactiveProcessor(IpAddress dstIpAddress,
- IpAddress srcIpAddress,
- ConnectPoint srcConnectPoint,
- MacAddress srcMacAddress) {
- checkNotNull(dstIpAddress);
- checkNotNull(srcIpAddress);
- checkNotNull(srcConnectPoint);
- checkNotNull(srcMacAddress);
-
- //
- // Step1: Try to update the existing intent first if it exists.
- //
- IpPrefix ipPrefix = null;
- if (routingConfigurationService.isIpAddressLocal(dstIpAddress)) {
- if (dstIpAddress.isIp4()) {
- ipPrefix = IpPrefix.valueOf(dstIpAddress,
- Ip4Address.BIT_LENGTH);
- } else {
- ipPrefix = IpPrefix.valueOf(dstIpAddress,
- Ip6Address.BIT_LENGTH);
- }
- } else {
- // Get IP prefix from BGP route table
- RouteEntry routeEntry = getLongestMatchableRouteEntry(dstIpAddress);
- if (routeEntry != null) {
- ipPrefix = routeEntry.prefix();
- }
- }
- if (ipPrefix != null
- && intentRequestListener.mp2pIntentExists(ipPrefix)) {
- intentRequestListener.updateExistingMp2pIntent(ipPrefix,
- srcConnectPoint);
- return;
- }
-
- //
- // Step2: There is no existing intent for the destination IP address.
- // Check whether it is necessary to create a new one. If necessary then
- // create a new one.
- //
- TrafficType trafficType =
- trafficTypeClassifier(srcConnectPoint, dstIpAddress);
-
- switch (trafficType) {
- case HOST_TO_INTERNET:
- // If the destination IP address is outside the local SDN network.
- // The Step 1 has already handled it. We do not need to do anything here.
- break;
- case INTERNET_TO_HOST:
- intentRequestListener.setUpConnectivityInternetToHost(dstIpAddress);
- break;
- case HOST_TO_HOST:
- intentRequestListener.setUpConnectivityHostToHost(dstIpAddress,
- srcIpAddress, srcMacAddress, srcConnectPoint);
- break;
- case INTERNET_TO_INTERNET:
- log.trace("This is transit traffic, "
- + "the intent should be preinstalled already");
- break;
- case DROP:
- // TODO here should setUpDropPaccketIntent(...);
- // We need a new type of intent here.
- break;
- case UNKNOWN:
- log.trace("This is unknown traffic, so we do nothing");
- break;
- default:
- break;
- }
- }
-
- /**
- * Classifies the traffic and return the traffic type.
- *
- * @param srcConnectPoint the connect point where the packet comes from
- * @param dstIp the destination IP address in packet
- * @return the traffic type which this packet belongs to
- */
- private TrafficType trafficTypeClassifier(ConnectPoint srcConnectPoint,
- IpAddress dstIp) {
- LocationType dstIpLocationType = getLocationType(dstIp);
- Optional<Interface> srcInterface =
- interfaceService.getInterfacesByPort(srcConnectPoint).stream().findFirst();
-
- switch (dstIpLocationType) {
- case INTERNET:
- if (!srcInterface.isPresent()) {
- return TrafficType.HOST_TO_INTERNET;
- } else {
- return TrafficType.INTERNET_TO_INTERNET;
- }
- case LOCAL:
- if (!srcInterface.isPresent()) {
- return TrafficType.HOST_TO_HOST;
- } else {
- // TODO Currently we only consider local public prefixes.
- // In the future, we will consider the local private prefixes.
- // If dstIpLocationType is a local private, we should return
- // TrafficType.DROP.
- return TrafficType.INTERNET_TO_HOST;
- }
- case NO_ROUTE:
- return TrafficType.DROP;
- default:
- return TrafficType.UNKNOWN;
- }
- }
}
diff --git a/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/impl/StaticRouter.java b/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/impl/StaticRouter.java
index 29526fff..3c868202 100644
--- a/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/impl/StaticRouter.java
+++ b/framework/src/onos/apps/routing/src/main/java/org/onosproject/routing/impl/StaticRouter.java
@@ -18,10 +18,7 @@ package org.onosproject.routing.impl;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onosproject.net.ConnectPoint;
import org.onosproject.routing.FibListener;
-import org.onosproject.routing.IntentRequestListener;
import org.onosproject.routing.RouteEntry;
import org.onosproject.routing.RoutingService;
import org.onosproject.routing.StaticRoutingService;
@@ -49,11 +46,6 @@ public class StaticRouter implements RoutingService, StaticRoutingService {
}
@Override
- public void addIntentRequestListener(IntentRequestListener intentRequestListener) {
-
- }
-
- @Override
public void stop() {
}
@@ -69,27 +61,11 @@ public class StaticRouter implements RoutingService, StaticRoutingService {
}
@Override
- public LocationType getLocationType(IpAddress ipAddress) {
- return null;
- }
-
- @Override
public RouteEntry getLongestMatchableRouteEntry(IpAddress ipAddress) {
return null;
}
@Override
- public ConnectPoint getEgressConnectPoint(IpAddress dstIpAddress) {
- return null;
- }
-
- @Override
- public void packetReactiveProcessor(IpAddress dstIpAddress, IpAddress srcIpAddress,
- ConnectPoint srcConnectPoint, MacAddress srcMacAddress) {
-
- }
-
- @Override
public FibListener getFibListener() {
return fibListener;
}
diff --git a/framework/src/onos/apps/routing/src/test/java/org/onosproject/routing/impl/RouterTest.java b/framework/src/onos/apps/routing/src/test/java/org/onosproject/routing/impl/RouterTest.java
index 45bc309f..c73e18cb 100644
--- a/framework/src/onos/apps/routing/src/test/java/org/onosproject/routing/impl/RouterTest.java
+++ b/framework/src/onos/apps/routing/src/test/java/org/onosproject/routing/impl/RouterTest.java
@@ -22,6 +22,8 @@ import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.Ip4Address;
import org.onlab.packet.Ip4Prefix;
+import org.onlab.packet.Ip6Address;
+import org.onlab.packet.Ip6Prefix;
import org.onlab.packet.IpAddress;
import org.onlab.packet.IpPrefix;
import org.onlab.packet.MacAddress;
@@ -81,6 +83,13 @@ public class RouterTest {
DeviceId.deviceId("of:0000000000000004"),
PortNumber.portNumber(1));
+ private static final ConnectPoint SW5_ETH1 = new ConnectPoint(
+ DeviceId.deviceId("of:0000000000000005"),
+ PortNumber.portNumber(1));
+
+ private static final ConnectPoint SW6_ETH1 = new ConnectPoint(
+ DeviceId.deviceId("of:0000000000000006"),
+ PortNumber.portNumber(1));
private Router router;
@Before
@@ -132,7 +141,6 @@ public class RouterTest {
hostService.startMonitoringIp(host1Address);
expectLastCall().anyTimes();
-
IpAddress host2Address = IpAddress.valueOf("192.168.20.1");
Host host2 = new DefaultHost(ProviderId.NONE, HostId.NONE,
MacAddress.valueOf("00:00:00:00:00:02"), VlanId.NONE,
@@ -148,7 +156,7 @@ public class RouterTest {
IpAddress host3Address = IpAddress.valueOf("192.168.40.1");
Host host3 = new DefaultHost(ProviderId.NONE, HostId.NONE,
MacAddress.valueOf("00:00:00:00:00:03"), VlanId.vlanId((short) 1),
- new HostLocation(SW4_ETH1, 1),
+ new HostLocation(SW3_ETH1, 1),
Sets.newHashSet(host3Address));
expect(hostService.getHostsByIp(host3Address))
@@ -156,6 +164,41 @@ public class RouterTest {
hostService.startMonitoringIp(host3Address);
expectLastCall().anyTimes();
+ IpAddress host4Address = IpAddress.valueOf("1000::1");
+ Host host4 = new DefaultHost(ProviderId.NONE, HostId.NONE,
+ MacAddress.valueOf("00:00:00:00:00:04"), VlanId.NONE,
+ new HostLocation(SW4_ETH1, 1),
+ Sets.newHashSet(host4Address));
+
+ expect(hostService.getHostsByIp(host4Address))
+ .andReturn(Sets.newHashSet(host4)).anyTimes();
+ hostService.startMonitoringIp(host4Address);
+ expectLastCall().anyTimes();
+
+ IpAddress host5Address = IpAddress.valueOf("2000::1");
+ Host host5 = new DefaultHost(ProviderId.NONE, HostId.NONE,
+ MacAddress.valueOf("00:00:00:00:00:05"), VlanId.NONE,
+ new HostLocation(SW5_ETH1, 1),
+ Sets.newHashSet(host5Address));
+
+ expect(hostService.getHostsByIp(host5Address))
+ .andReturn(Sets.newHashSet(host5)).anyTimes();
+ hostService.startMonitoringIp(host5Address);
+ expectLastCall().anyTimes();
+
+ // Next hop on a VLAN
+ IpAddress host6Address = IpAddress.valueOf("3000::1");
+ Host host6 = new DefaultHost(ProviderId.NONE, HostId.NONE,
+ MacAddress.valueOf("00:00:00:00:00:06"), VlanId.vlanId((short) 1),
+ new HostLocation(SW6_ETH1, 1),
+ Sets.newHashSet(host6Address));
+
+ expect(hostService.getHostsByIp(host6Address))
+ .andReturn(Sets.newHashSet(host6)).anyTimes();
+ hostService.startMonitoringIp(host6Address);
+ expectLastCall().anyTimes();
+
+
// Called during shutdown
hostService.removeListener(anyObject(HostListener.class));
@@ -163,10 +206,10 @@ public class RouterTest {
}
/**
- * Tests adding a route entry.
+ * Tests adding a IPv4 route entry.
*/
@Test
- public void testRouteAdd() {
+ public void testIpv4RouteAdd() {
// Construct a route entry
IpPrefix prefix = Ip4Prefix.valueOf("1.1.1.0/24");
IpAddress nextHopIp = Ip4Address.valueOf("192.168.10.1");
@@ -175,7 +218,34 @@ public class RouterTest {
// Expected FIB entry
FibEntry fibEntry = new FibEntry(prefix, nextHopIp,
- MacAddress.valueOf("00:00:00:00:00:01"));
+ MacAddress.valueOf("00:00:00:00:00:01"));
+
+ fibListener.update(Collections.singletonList(new FibUpdate(
+ FibUpdate.Type.UPDATE, fibEntry)), Collections.emptyList());
+
+ replay(fibListener);
+
+ router.processRouteUpdates(Collections.singletonList(
+ new RouteUpdate(RouteUpdate.Type.UPDATE, routeEntry)));
+
+ verify(fibListener);
+ }
+
+
+ /**
+ * Tests adding a IPv6 route entry.
+ */
+ @Test
+ public void testIpv6RouteAdd() {
+ // Construct a route entry
+ IpPrefix prefix = Ip6Prefix.valueOf("4000::/64");
+ IpAddress nextHopIp = Ip6Address.valueOf("1000::1");
+
+ RouteEntry routeEntry = new RouteEntry(prefix, nextHopIp);
+
+ // Expected FIB entry
+ FibEntry fibEntry = new FibEntry(prefix, nextHopIp,
+ MacAddress.valueOf("00:00:00:00:00:04"));
fibListener.update(Collections.singletonList(new FibUpdate(
FibUpdate.Type.UPDATE, fibEntry)), Collections.emptyList());
@@ -188,13 +258,14 @@ public class RouterTest {
verify(fibListener);
}
+
/**
- * Tests updating a route entry.
+ * Tests updating a IPv4 route entry.
*/
@Test
public void testRouteUpdate() {
// Firstly add a route
- testRouteAdd();
+ testIpv4RouteAdd();
// Route entry with updated next hop for the original prefix
RouteEntry routeEntryUpdate = new RouteEntry(
@@ -230,12 +301,53 @@ public class RouterTest {
}
/**
- * Tests deleting a route entry.
+ * Tests updating a IPv6 route entry.
*/
@Test
- public void testRouteDelete() {
+ public void testIpv6RouteUpdate() {
// Firstly add a route
- testRouteAdd();
+ testIpv6RouteAdd();
+
+ // Route entry with updated next hop for the original prefix
+ RouteEntry routeEntryUpdate = new RouteEntry(
+ Ip6Prefix.valueOf("4000::/64"),
+ Ip6Address.valueOf("2000::1"));
+
+ // The old FIB entry will be withdrawn
+ FibEntry withdrawFibEntry = new FibEntry(
+ Ip6Prefix.valueOf("4000::/64"), null, null);
+
+ // A new FIB entry will be added
+ FibEntry updateFibEntry = new FibEntry(
+ Ip6Prefix.valueOf("4000::/64"),
+ Ip6Address.valueOf("2000::1"),
+ MacAddress.valueOf("00:00:00:00:00:05"));
+
+ reset(fibListener);
+ fibListener.update(Collections.singletonList(new FibUpdate(
+ FibUpdate.Type.UPDATE, updateFibEntry)),
+ Collections.singletonList(new FibUpdate(
+ FibUpdate.Type.DELETE, withdrawFibEntry)));
+ replay(fibListener);
+
+ reset(routingConfigurationService);
+ expect(routingConfigurationService.isIpPrefixLocal(
+ anyObject(IpPrefix.class))).andReturn(false);
+ replay(routingConfigurationService);
+
+ router.processRouteUpdates(Collections.singletonList(new RouteUpdate(
+ RouteUpdate.Type.UPDATE, routeEntryUpdate)));
+
+ verify(fibListener);
+ }
+
+ /**
+ * Tests deleting a IPv4 route entry.
+ */
+ @Test
+ public void testIpv4RouteDelete() {
+ // Firstly add a route
+ testIpv4RouteAdd();
RouteEntry deleteRouteEntry = new RouteEntry(
Ip4Prefix.valueOf("1.1.1.0/24"),
@@ -257,10 +369,37 @@ public class RouterTest {
}
/**
- * Tests adding a route whose next hop is the local BGP speaker.
+ * Tests deleting a IPv6 route entry.
*/
@Test
- public void testLocalRouteAdd() {
+ public void testIpv6RouteDelete() {
+ // Firstly add a route
+ testIpv6RouteAdd();
+
+ RouteEntry deleteRouteEntry = new RouteEntry(
+ Ip6Prefix.valueOf("4000::/64"),
+ Ip6Address.valueOf("1000::1"));
+
+ FibEntry deleteFibEntry = new FibEntry(
+ Ip6Prefix.valueOf("4000::/64"), null, null);
+
+ reset(fibListener);
+ fibListener.update(Collections.emptyList(), Collections.singletonList(
+ new FibUpdate(FibUpdate.Type.DELETE, deleteFibEntry)));
+
+ replay(fibListener);
+
+ router.processRouteUpdates(Collections.singletonList(
+ new RouteUpdate(RouteUpdate.Type.DELETE, deleteRouteEntry)));
+
+ verify(fibListener);
+ }
+
+ /**
+ * Tests adding a IPv4 route whose next hop is the local BGP speaker.
+ */
+ @Test
+ public void testIpv4LocalRouteAdd() {
// Construct a route entry, the next hop is the local BGP speaker
RouteEntry routeEntry = new RouteEntry(
Ip4Prefix.valueOf("1.1.1.0/24"),
@@ -284,4 +423,33 @@ public class RouterTest {
assertTrue(router.getRoutes4().contains(routeEntry));
verify(fibListener);
}
+
+ /**
+ * Tests adding a IPv6 route whose next hop is the local BGP speaker.
+ */
+ @Test
+ public void testIpv6LocalRouteAdd() {
+ // Construct a route entry, the next hop is the local BGP speaker
+ RouteEntry routeEntry = new RouteEntry(
+ Ip6Prefix.valueOf("4000::/64"),
+ Ip6Address.valueOf("::"));
+
+ // No methods on the FIB listener should be called
+ replay(fibListener);
+
+ reset(routingConfigurationService);
+ expect(routingConfigurationService.isIpPrefixLocal(
+ anyObject(IpPrefix.class))).andReturn(true);
+ replay(routingConfigurationService);
+
+ // Call the processRouteUpdates() method in Router class
+ RouteUpdate routeUpdate = new RouteUpdate(RouteUpdate.Type.UPDATE,
+ routeEntry);
+ router.processRouteUpdates(Collections.singletonList(routeUpdate));
+
+ // Verify
+ assertEquals(1, router.getRoutes6().size());
+ assertTrue(router.getRoutes6().contains(routeEntry));
+ verify(fibListener);
+ }
}