diff options
Diffstat (limited to 'framework/src/onos/apps/routing-api')
5 files changed, 200 insertions, 101 deletions
diff --git a/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/IntentRequestListener.java b/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/IntentRequestListener.java index 2d1bb311..1069ec5a 100644 --- a/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/IntentRequestListener.java +++ b/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/IntentRequestListener.java @@ -47,6 +47,16 @@ public interface IntentRequestListener { ConnectPoint srcConnectPoint); /** + * Sets up connectivity for packet from a local host to the Internet. + * + * @param hostIp IP address of the local host + * @param prefix external IP prefix that the host is talking to + * @param nextHopIpAddress IP address of the next hop router for the prefix + */ + void setUpConnectivityHostToInternet(IpAddress hostIp, IpPrefix prefix, + IpAddress nextHopIpAddress); + + /** * Adds one new ingress connect point into ingress points of an existing * intent and resubmits the new intent. * <p> diff --git a/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/IntentSynchronizationService.java b/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/IntentSynchronizationService.java new file mode 100644 index 00000000..dc6a838d --- /dev/null +++ b/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/IntentSynchronizationService.java @@ -0,0 +1,51 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onosproject.routing; + +import org.onosproject.net.intent.Intent; + +/** + * Submits and withdraws intents to the IntentService from a single point in + * the cluster at any one time. The provided intents will be synchronized with + * the IntentService on leadership change. + */ +public interface IntentSynchronizationService { + + /** + * Submits and intent to the synchronizer. + * <p> + * The intent will be submitted directly to the IntentService if this node + * is the leader, otherwise it will be stored in the synchronizer for + * synchronization if this node becomes the leader. + * </p> + * + * @param intent intent to submit + */ + void submit(Intent intent); + + /** + * Withdraws an intent from the synchronizer. + * <p> + * The intent will be withdrawn directly from the IntentService if this node + * is the leader. The intent will be removed from the synchronizer's + * in-memory storage. + * </p> + * + * @param intent intent to withdraw + */ + void withdraw(Intent intent); +} diff --git a/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/RoutingService.java b/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/RoutingService.java index 8b7040e2..7399ed75 100644 --- a/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/RoutingService.java +++ b/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/RoutingService.java @@ -16,8 +16,6 @@ package org.onosproject.routing; import org.onlab.packet.IpAddress; -import org.onlab.packet.MacAddress; -import org.onosproject.net.ConnectPoint; import org.onosproject.routing.config.BgpConfig; import java.util.Collection; @@ -32,63 +30,6 @@ public interface RoutingService { Class<BgpConfig> CONFIG_CLASS = BgpConfig.class; /** - * Specifies the type of an IP address or an IP prefix location. - */ - enum LocationType { - /** - * The location of an IP address or an IP prefix is in local SDN network. - */ - LOCAL, - /** - * The location of an IP address or an IP prefix is outside local SDN network. - */ - INTERNET, - /** - * There is no route for this IP address or IP prefix. - */ - NO_ROUTE - } - - /** - * Specifies the type of traffic. - * <p> - * We classify traffic by the first packet of each traffic. - * </p> - */ - enum TrafficType { - /** - * Traffic from a host located in local SDN network wants to - * communicate with destination host located in Internet (outside - * local SDN network). - */ - HOST_TO_INTERNET, - /** - * Traffic from Internet wants to communicate with a host located - * in local SDN network. - */ - INTERNET_TO_HOST, - /** - * Both the source host and destination host of a traffic are in - * local SDN network. - */ - HOST_TO_HOST, - /** - * Traffic from Internet wants to traverse local SDN network. - */ - INTERNET_TO_INTERNET, - /** - * Any traffic wants to communicate with a destination which has - * no route, or traffic from Internet wants to access a local private - * IP address. - */ - DROP, - /** - * Traffic does not belong to the types above. - */ - UNKNOWN - } - - /** * Starts the routing service. */ void start(); @@ -101,15 +42,6 @@ public interface RoutingService { void addFibListener(FibListener fibListener); /** - * Adds intent creation and submission listener. - * - * @param intentRequestListener listener to send intent creation and - * submission request to - */ - void addIntentRequestListener(IntentRequestListener - intentRequestListener); - - /** * Stops the routing service. */ void stop(); @@ -129,14 +61,6 @@ public interface RoutingService { Collection<RouteEntry> getRoutes6(); /** - * Evaluates the location of an IP address and returns the location type. - * - * @param ipAddress the IP address to evaluate - * @return the IP address location type - */ - LocationType getLocationType(IpAddress ipAddress); - - /** * Finds out the route entry which has the longest matchable IP prefix. * * @param ipAddress IP address used to find out longest matchable IP prefix @@ -145,25 +69,4 @@ public interface RoutingService { */ RouteEntry getLongestMatchableRouteEntry(IpAddress ipAddress); - /** - * Finds out the egress connect point where to emit the first packet - * based on destination IP address. - * - * @param dstIpAddress the destination IP address - * @return the egress connect point if found, otherwise null - */ - ConnectPoint getEgressConnectPoint(IpAddress dstIpAddress); - - /** - * Routes packet reactively. - * - * @param dstIpAddress the destination IP address of a packet - * @param srcIpAddress the source IP address of a packet - * @param srcConnectPoint the connect point where a packet comes from - * @param srcMacAddress the source MAC address of a packet - */ - void packetReactiveProcessor(IpAddress dstIpAddress, - IpAddress srcIpAddress, - ConnectPoint srcConnectPoint, - MacAddress srcMacAddress); } diff --git a/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/SdnIpService.java b/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/SdnIpService.java new file mode 100644 index 00000000..0945336c --- /dev/null +++ b/framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/SdnIpService.java @@ -0,0 +1,39 @@ +/* + * Copyright 2014-2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onosproject.routing; + +/** + * Service interface exported by SDN-IP. + */ +public interface SdnIpService { + + /** + * Changes whether this SDN-IP instance is the primary or not based on the + * boolean parameter. + * + * @param isPrimary true if the instance is primary, false if it is not + */ + void modifyPrimary(boolean isPrimary); + + /** + * Gets the intent synchronization service. + * + * @return intent synchronization service + */ + // TODO fix service resolution in SDN-IP + IntentSynchronizationService getIntentSynchronizationService(); + +} diff --git a/framework/src/onos/apps/routing-api/src/test/java/org/onosproject/routing/RouteEntryTest.java b/framework/src/onos/apps/routing-api/src/test/java/org/onosproject/routing/RouteEntryTest.java index c47d2768..b89eb2d1 100644 --- a/framework/src/onos/apps/routing-api/src/test/java/org/onosproject/routing/RouteEntryTest.java +++ b/framework/src/onos/apps/routing-api/src/test/java/org/onosproject/routing/RouteEntryTest.java @@ -19,10 +19,15 @@ import org.hamcrest.Matchers; 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 static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Unit tests for the RouteEntry class. @@ -35,17 +40,22 @@ public class RouteEntryTest { public void testConstructor() { Ip4Prefix prefix = Ip4Prefix.valueOf("1.2.3.0/24"); Ip4Address nextHop = Ip4Address.valueOf("5.6.7.8"); - RouteEntry routeEntry = new RouteEntry(prefix, nextHop); assertThat(routeEntry.toString(), is("RouteEntry{prefix=1.2.3.0/24, nextHop=5.6.7.8}")); + + Ip6Prefix prefix6 = Ip6Prefix.valueOf("1000::/64"); + Ip6Address nextHop6 = Ip6Address.valueOf("2000::1"); + RouteEntry routeEntry6 = new RouteEntry(prefix6, nextHop6); + assertThat(routeEntry6.toString(), + is("RouteEntry{prefix=1000::/64, nextHop=2000::1}")); } /** * Tests invalid class constructor for null IPv4 prefix. */ @Test(expected = NullPointerException.class) - public void testInvalidConstructorNullPrefix() { + public void testInvalidConstructorNullIpv4Prefix() { Ip4Prefix prefix = null; Ip4Address nextHop = Ip4Address.valueOf("5.6.7.8"); @@ -53,10 +63,21 @@ public class RouteEntryTest { } /** + * Tests invalid class constructor for null IPv6 prefix. + */ + @Test(expected = NullPointerException.class) + public void testInvalidConstructorNullIpv6Prefix() { + Ip6Prefix prefix = null; + Ip6Address nextHop = Ip6Address.valueOf("2000::1"); + + new RouteEntry(prefix, nextHop); + } + + /** * Tests invalid class constructor for null IPv4 next-hop. */ @Test(expected = NullPointerException.class) - public void testInvalidConstructorNullNextHop() { + public void testInvalidConstructorNullIpv4NextHop() { Ip4Prefix prefix = Ip4Prefix.valueOf("1.2.3.0/24"); Ip4Address nextHop = null; @@ -64,16 +85,32 @@ public class RouteEntryTest { } /** + * Tests invalid class constructor for null IPv6 next-hop. + */ + @Test(expected = NullPointerException.class) + public void testInvalidConstructorNullIpv6NextHop() { + Ip6Prefix prefix = Ip6Prefix.valueOf("1000::/64"); + Ip6Address nextHop = null; + + new RouteEntry(prefix, nextHop); + } + + /** * Tests getting the fields of a route entry. */ @Test public void testGetFields() { Ip4Prefix prefix = Ip4Prefix.valueOf("1.2.3.0/24"); Ip4Address nextHop = Ip4Address.valueOf("5.6.7.8"); - RouteEntry routeEntry = new RouteEntry(prefix, nextHop); assertThat(routeEntry.prefix(), is(prefix)); assertThat(routeEntry.nextHop(), is(nextHop)); + + Ip6Prefix prefix6 = Ip6Prefix.valueOf("1000::/64"); + Ip6Address nextHop6 = Ip6Address.valueOf("2000::1"); + RouteEntry routeEntry6 = new RouteEntry(prefix6, nextHop6); + assertThat(routeEntry6.prefix(), is(prefix6)); + assertThat(routeEntry6.nextHop(), is(nextHop6)); } /** @@ -105,6 +142,33 @@ public class RouteEntryTest { prefix = Ip4Prefix.valueOf("255.255.255.255/32"); assertThat(RouteEntry.createBinaryString(prefix), is("11111111111111111111111111111111")); + + Ip6Prefix prefix6; + Pattern pattern; + Matcher matcher; + + prefix6 = Ip6Prefix.valueOf("::/0"); + assertThat(RouteEntry.createBinaryString(prefix6), is("")); + + prefix6 = Ip6Prefix.valueOf("2000::1000/112"); + pattern = Pattern.compile("00100{108}"); + matcher = pattern.matcher(RouteEntry.createBinaryString(prefix6)); + assertTrue(matcher.matches()); + + prefix6 = Ip6Prefix.valueOf("2000::1000/116"); + pattern = Pattern.compile("00100{108}0001"); + matcher = pattern.matcher(RouteEntry.createBinaryString(prefix6)); + assertTrue(matcher.matches()); + + prefix6 = Ip6Prefix.valueOf("2000::2000/116"); + pattern = Pattern.compile("00100{108}0010"); + matcher = pattern.matcher(RouteEntry.createBinaryString(prefix6)); + assertTrue(matcher.matches()); + + prefix6 = Ip6Prefix.valueOf("2000::1234/128"); + pattern = Pattern.compile("00100{108}0001001000110100"); + matcher = pattern.matcher(RouteEntry.createBinaryString(prefix6)); + assertTrue(matcher.matches()); } /** @@ -121,6 +185,16 @@ public class RouteEntryTest { RouteEntry routeEntry2 = new RouteEntry(prefix2, nextHop2); assertThat(routeEntry1, is(routeEntry2)); + + Ip6Prefix prefix3 = Ip6Prefix.valueOf("1000::/64"); + Ip6Address nextHop3 = Ip6Address.valueOf("2000::2"); + RouteEntry routeEntry3 = new RouteEntry(prefix3, nextHop3); + + Ip6Prefix prefix4 = Ip6Prefix.valueOf("1000::/64"); + Ip6Address nextHop4 = Ip6Address.valueOf("2000::2"); + RouteEntry routeEntry4 = new RouteEntry(prefix4, nextHop4); + + assertThat(routeEntry3, is(routeEntry4)); } /** @@ -142,6 +216,21 @@ public class RouteEntryTest { assertThat(routeEntry1, Matchers.is(not(routeEntry2))); assertThat(routeEntry1, Matchers.is(not(routeEntry3))); + + Ip6Prefix prefix4 = Ip6Prefix.valueOf("1000::/64"); + Ip6Address nextHop4 = Ip6Address.valueOf("2000::1"); + RouteEntry routeEntry4 = new RouteEntry(prefix4, nextHop4); + + Ip6Prefix prefix5 = Ip6Prefix.valueOf("1000::/65"); + Ip6Address nextHop5 = Ip6Address.valueOf("2000::1"); + RouteEntry routeEntry5 = new RouteEntry(prefix5, nextHop5); + + Ip6Prefix prefix6 = Ip6Prefix.valueOf("1000::/64"); + Ip6Address nextHop6 = Ip6Address.valueOf("2000::2"); + RouteEntry routeEntry6 = new RouteEntry(prefix6, nextHop6); + + assertThat(routeEntry4, Matchers.is(not(routeEntry5))); + assertThat(routeEntry4, Matchers.is(not(routeEntry6))); } /** @@ -155,5 +244,12 @@ public class RouteEntryTest { assertThat(routeEntry.toString(), is("RouteEntry{prefix=1.2.3.0/24, nextHop=5.6.7.8}")); + + Ip6Prefix prefix6 = Ip6Prefix.valueOf("1000::/64"); + Ip6Address nextHop6 = Ip6Address.valueOf("2000::1"); + RouteEntry routeEntry6 = new RouteEntry(prefix6, nextHop6); + + assertThat(routeEntry6.toString(), + is("RouteEntry{prefix=1000::/64, nextHop=2000::1}")); } } |