aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/apps/routing-api
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-api
parente6d71622143ff9b2421a1abbe8434b954b5b1099 (diff)
Updated master to commit id 6ee8aa3e67ce89908a8c93aa9445c6f71a18f986
Change-Id: I94b055ee2f298daf71e2ec794fd0f2495bd8081f
Diffstat (limited to 'framework/src/onos/apps/routing-api')
-rw-r--r--framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/IntentRequestListener.java10
-rw-r--r--framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/IntentSynchronizationService.java51
-rw-r--r--framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/RoutingService.java97
-rw-r--r--framework/src/onos/apps/routing-api/src/main/java/org/onosproject/routing/SdnIpService.java39
-rw-r--r--framework/src/onos/apps/routing-api/src/test/java/org/onosproject/routing/RouteEntryTest.java104
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}"));
}
}