diff options
author | Ashlee Young <ashlee@onosfw.com> | 2015-10-09 18:32:44 -0700 |
---|---|---|
committer | Ashlee Young <ashlee@onosfw.com> | 2015-10-09 18:32:44 -0700 |
commit | 6a07d2d622eaa06953f3353e39c080984076e8de (patch) | |
tree | bfb50a2090fce186c2cc545a400c969bf2ea702b /framework/src/onos/apps/routing | |
parent | e6d71622143ff9b2421a1abbe8434b954b5b1099 (diff) |
Updated master to commit id 6ee8aa3e67ce89908a8c93aa9445c6f71a18f986
Change-Id: I94b055ee2f298daf71e2ec794fd0f2495bd8081f
Diffstat (limited to 'framework/src/onos/apps/routing')
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); + } } |