Added IPv6 routing support to SDN-IP, and integrated it with BGP:
* The routing entries as received from BGP can be either IPv4 or IPv6 * The CLI prints the IPv4 and IPv6 routes * The BGP peering is still over IPv4, so configuration-wise the IPv6 routes from the eBGP peers have to be configured to use the IPv4 peering. * The integration/testing with the IPv6 Network Discovery Protocol is not done yet. * The integration/testing with IPv6 intents is not done yet. Also: * Moved nested class BgpSessionManager.BgpRouteSelector out of the BgpSessionManager class. * Code cleanup. Change-Id: I9f2dbe4395a72d353bbf215a8a14b01b53c3423f
Showing
17 changed files
with
502 additions
and
147 deletions
... | @@ -29,7 +29,7 @@ import java.util.concurrent.Executors; | ... | @@ -29,7 +29,7 @@ import java.util.concurrent.Executors; |
29 | import java.util.concurrent.Semaphore; | 29 | import java.util.concurrent.Semaphore; |
30 | 30 | ||
31 | import org.apache.commons.lang3.tuple.Pair; | 31 | import org.apache.commons.lang3.tuple.Pair; |
32 | -import org.onlab.packet.Ip4Prefix; | 32 | +import org.onlab.packet.IpPrefix; |
33 | import org.onosproject.core.ApplicationId; | 33 | import org.onosproject.core.ApplicationId; |
34 | import org.onosproject.net.flow.criteria.Criteria.IPCriterion; | 34 | import org.onosproject.net.flow.criteria.Criteria.IPCriterion; |
35 | import org.onosproject.net.flow.criteria.Criterion; | 35 | import org.onosproject.net.flow.criteria.Criterion; |
... | @@ -55,7 +55,7 @@ public class IntentSynchronizer { | ... | @@ -55,7 +55,7 @@ public class IntentSynchronizer { |
55 | private final ApplicationId appId; | 55 | private final ApplicationId appId; |
56 | private final IntentService intentService; | 56 | private final IntentService intentService; |
57 | private final Map<IntentKey, PointToPointIntent> peerIntents; | 57 | private final Map<IntentKey, PointToPointIntent> peerIntents; |
58 | - private final Map<Ip4Prefix, MultiPointToSinglePointIntent> routeIntents; | 58 | + private final Map<IpPrefix, MultiPointToSinglePointIntent> routeIntents; |
59 | 59 | ||
60 | // | 60 | // |
61 | // State to deal with SDN-IP Leader election and pushing Intents | 61 | // State to deal with SDN-IP Leader election and pushing Intents |
... | @@ -182,7 +182,7 @@ public class IntentSynchronizer { | ... | @@ -182,7 +182,7 @@ public class IntentSynchronizer { |
182 | public Collection<MultiPointToSinglePointIntent> getRouteIntents() { | 182 | public Collection<MultiPointToSinglePointIntent> getRouteIntents() { |
183 | List<MultiPointToSinglePointIntent> result = new LinkedList<>(); | 183 | List<MultiPointToSinglePointIntent> result = new LinkedList<>(); |
184 | 184 | ||
185 | - for (Map.Entry<Ip4Prefix, MultiPointToSinglePointIntent> entry : | 185 | + for (Map.Entry<IpPrefix, MultiPointToSinglePointIntent> entry : |
186 | routeIntents.entrySet()) { | 186 | routeIntents.entrySet()) { |
187 | result.add(entry.getValue()); | 187 | result.add(entry.getValue()); |
188 | } | 188 | } |
... | @@ -247,12 +247,12 @@ public class IntentSynchronizer { | ... | @@ -247,12 +247,12 @@ public class IntentSynchronizer { |
247 | * Updates multi-point-to-single-point route intents. | 247 | * Updates multi-point-to-single-point route intents. |
248 | * | 248 | * |
249 | * @param submitIntents the intents to submit | 249 | * @param submitIntents the intents to submit |
250 | - * @param withdrawPrefixes the IPv4 matching prefixes for the intents | 250 | + * @param withdrawPrefixes the IPv4 or IPv6 matching prefixes for the |
251 | - * to withdraw | 251 | + * intents to withdraw |
252 | */ | 252 | */ |
253 | void updateRouteIntents( | 253 | void updateRouteIntents( |
254 | - Collection<Pair<Ip4Prefix, MultiPointToSinglePointIntent>> submitIntents, | 254 | + Collection<Pair<IpPrefix, MultiPointToSinglePointIntent>> submitIntents, |
255 | - Collection<Ip4Prefix> withdrawPrefixes) { | 255 | + Collection<IpPrefix> withdrawPrefixes) { |
256 | 256 | ||
257 | // | 257 | // |
258 | // NOTE: Semantically, we MUST withdraw existing intents before | 258 | // NOTE: Semantically, we MUST withdraw existing intents before |
... | @@ -269,7 +269,7 @@ public class IntentSynchronizer { | ... | @@ -269,7 +269,7 @@ public class IntentSynchronizer { |
269 | // | 269 | // |
270 | IntentOperations.Builder withdrawBuilder = | 270 | IntentOperations.Builder withdrawBuilder = |
271 | IntentOperations.builder(appId); | 271 | IntentOperations.builder(appId); |
272 | - for (Ip4Prefix prefix : withdrawPrefixes) { | 272 | + for (IpPrefix prefix : withdrawPrefixes) { |
273 | intent = routeIntents.remove(prefix); | 273 | intent = routeIntents.remove(prefix); |
274 | if (intent == null) { | 274 | if (intent == null) { |
275 | log.trace("SDN-IP No intent in routeIntents to delete " + | 275 | log.trace("SDN-IP No intent in routeIntents to delete " + |
... | @@ -287,9 +287,9 @@ public class IntentSynchronizer { | ... | @@ -287,9 +287,9 @@ public class IntentSynchronizer { |
287 | // | 287 | // |
288 | IntentOperations.Builder submitBuilder = | 288 | IntentOperations.Builder submitBuilder = |
289 | IntentOperations.builder(appId); | 289 | IntentOperations.builder(appId); |
290 | - for (Pair<Ip4Prefix, MultiPointToSinglePointIntent> pair : | 290 | + for (Pair<IpPrefix, MultiPointToSinglePointIntent> pair : |
291 | submitIntents) { | 291 | submitIntents) { |
292 | - Ip4Prefix prefix = pair.getLeft(); | 292 | + IpPrefix prefix = pair.getLeft(); |
293 | intent = pair.getRight(); | 293 | intent = pair.getRight(); |
294 | MultiPointToSinglePointIntent oldIntent = | 294 | MultiPointToSinglePointIntent oldIntent = |
295 | routeIntents.put(prefix, intent); | 295 | routeIntents.put(prefix, intent); |
... | @@ -382,18 +382,23 @@ public class IntentSynchronizer { | ... | @@ -382,18 +382,23 @@ public class IntentSynchronizer { |
382 | // Find the IP prefix | 382 | // Find the IP prefix |
383 | Criterion c = | 383 | Criterion c = |
384 | mp2pIntent.selector().getCriterion(Criterion.Type.IPV4_DST); | 384 | mp2pIntent.selector().getCriterion(Criterion.Type.IPV4_DST); |
385 | + if (c == null) { | ||
386 | + // Try IPv6 | ||
387 | + c = | ||
388 | + mp2pIntent.selector().getCriterion(Criterion.Type.IPV6_DST); | ||
389 | + } | ||
385 | if (c != null && c instanceof IPCriterion) { | 390 | if (c != null && c instanceof IPCriterion) { |
386 | IPCriterion ipCriterion = (IPCriterion) c; | 391 | IPCriterion ipCriterion = (IPCriterion) c; |
387 | - Ip4Prefix ip4Prefix = ipCriterion.ip().getIp4Prefix(); | 392 | + IpPrefix ipPrefix = ipCriterion.ip(); |
388 | - if (ip4Prefix == null) { | 393 | + if (ipPrefix == null) { |
389 | continue; | 394 | continue; |
390 | } | 395 | } |
391 | log.trace("SDN-IP Intent Synchronizer: updating " + | 396 | log.trace("SDN-IP Intent Synchronizer: updating " + |
392 | "in-memory Route Intent for prefix {}", | 397 | "in-memory Route Intent for prefix {}", |
393 | - ip4Prefix); | 398 | + ipPrefix); |
394 | - routeIntents.put(ip4Prefix, mp2pIntent); | 399 | + routeIntents.put(ipPrefix, mp2pIntent); |
395 | } else { | 400 | } else { |
396 | - log.warn("SDN-IP no IPV4_DST criterion found for Intent {}", | 401 | + log.warn("SDN-IP no IPV4_DST or IPV6_DST criterion found for Intent {}", |
397 | mp2pIntent.id()); | 402 | mp2pIntent.id()); |
398 | } | 403 | } |
399 | continue; | 404 | continue; | ... | ... |
... | @@ -19,8 +19,8 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -19,8 +19,8 @@ import static com.google.common.base.Preconditions.checkNotNull; |
19 | 19 | ||
20 | import java.util.Objects; | 20 | import java.util.Objects; |
21 | 21 | ||
22 | -import org.onlab.packet.Ip4Address; | 22 | +import org.onlab.packet.IpAddress; |
23 | -import org.onlab.packet.Ip4Prefix; | 23 | +import org.onlab.packet.IpPrefix; |
24 | 24 | ||
25 | import com.google.common.base.MoreObjects; | 25 | import com.google.common.base.MoreObjects; |
26 | 26 | ||
... | @@ -28,8 +28,8 @@ import com.google.common.base.MoreObjects; | ... | @@ -28,8 +28,8 @@ import com.google.common.base.MoreObjects; |
28 | * Represents a route entry for an IP prefix. | 28 | * Represents a route entry for an IP prefix. |
29 | */ | 29 | */ |
30 | public class RouteEntry { | 30 | public class RouteEntry { |
31 | - private final Ip4Prefix prefix; // The IP prefix | 31 | + private final IpPrefix prefix; // The IP prefix |
32 | - private final Ip4Address nextHop; // Next-hop IP address | 32 | + private final IpAddress nextHop; // Next-hop IP address |
33 | 33 | ||
34 | /** | 34 | /** |
35 | * Class constructor. | 35 | * Class constructor. |
... | @@ -37,17 +37,26 @@ public class RouteEntry { | ... | @@ -37,17 +37,26 @@ public class RouteEntry { |
37 | * @param prefix the IP prefix of the route | 37 | * @param prefix the IP prefix of the route |
38 | * @param nextHop the next hop IP address for the route | 38 | * @param nextHop the next hop IP address for the route |
39 | */ | 39 | */ |
40 | - public RouteEntry(Ip4Prefix prefix, Ip4Address nextHop) { | 40 | + public RouteEntry(IpPrefix prefix, IpAddress nextHop) { |
41 | this.prefix = checkNotNull(prefix); | 41 | this.prefix = checkNotNull(prefix); |
42 | this.nextHop = checkNotNull(nextHop); | 42 | this.nextHop = checkNotNull(nextHop); |
43 | } | 43 | } |
44 | 44 | ||
45 | /** | 45 | /** |
46 | + * Returns the IP version of the route. | ||
47 | + * | ||
48 | + * @return the IP version of the route | ||
49 | + */ | ||
50 | + public IpAddress.Version version() { | ||
51 | + return nextHop.version(); | ||
52 | + } | ||
53 | + | ||
54 | + /** | ||
46 | * Returns the IP prefix of the route. | 55 | * Returns the IP prefix of the route. |
47 | * | 56 | * |
48 | * @return the IP prefix of the route | 57 | * @return the IP prefix of the route |
49 | */ | 58 | */ |
50 | - public Ip4Prefix prefix() { | 59 | + public IpPrefix prefix() { |
51 | return prefix; | 60 | return prefix; |
52 | } | 61 | } |
53 | 62 | ||
... | @@ -56,27 +65,32 @@ public class RouteEntry { | ... | @@ -56,27 +65,32 @@ public class RouteEntry { |
56 | * | 65 | * |
57 | * @return the next hop IP address for the route | 66 | * @return the next hop IP address for the route |
58 | */ | 67 | */ |
59 | - public Ip4Address nextHop() { | 68 | + public IpAddress nextHop() { |
60 | return nextHop; | 69 | return nextHop; |
61 | } | 70 | } |
62 | 71 | ||
63 | /** | 72 | /** |
64 | - * Creates the binary string representation of an IPv4 prefix. | 73 | + * Creates the binary string representation of an IP prefix. |
74 | + * The prefix can be either IPv4 or IPv6. | ||
65 | * The string length is equal to the prefix length. | 75 | * The string length is equal to the prefix length. |
66 | * | 76 | * |
67 | - * @param ip4Prefix the IPv4 prefix to use | 77 | + * @param ipPrefix the IP prefix to use |
68 | * @return the binary string representation | 78 | * @return the binary string representation |
69 | */ | 79 | */ |
70 | - static String createBinaryString(Ip4Prefix ip4Prefix) { | 80 | + static String createBinaryString(IpPrefix ipPrefix) { |
71 | - if (ip4Prefix.prefixLength() == 0) { | 81 | + if (ipPrefix.prefixLength() == 0) { |
72 | return ""; | 82 | return ""; |
73 | } | 83 | } |
74 | 84 | ||
75 | - StringBuilder result = new StringBuilder(ip4Prefix.prefixLength()); | 85 | + byte[] octets = ipPrefix.address().toOctets(); |
76 | - long value = ip4Prefix.address().toInt() & 0xffffffffL; | 86 | + StringBuilder result = new StringBuilder(ipPrefix.prefixLength()); |
77 | - for (int i = 0; i < ip4Prefix.prefixLength(); i++) { | 87 | + for (int i = 0; i < ipPrefix.prefixLength(); i++) { |
78 | - long mask = 1 << (Ip4Prefix.MAX_MASK_LENGTH - 1 - i); | 88 | + int byteOffset = i / Byte.SIZE; |
79 | - result.append(((value & mask) == 0) ? "0" : "1"); | 89 | + int bitOffset = i % Byte.SIZE; |
90 | + int mask = 1 << (Byte.SIZE - 1 - bitOffset); | ||
91 | + byte value = octets[byteOffset]; | ||
92 | + boolean isSet = ((value & mask) != 0); | ||
93 | + result.append(isSet ? "1" : "0"); | ||
80 | } | 94 | } |
81 | return result.toString(); | 95 | return result.toString(); |
82 | } | 96 | } | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -164,13 +164,23 @@ public class SdnIp implements SdnIpService { | ... | @@ -164,13 +164,23 @@ public class SdnIp implements SdnIpService { |
164 | } | 164 | } |
165 | 165 | ||
166 | @Override | 166 | @Override |
167 | - public Collection<BgpRouteEntry> getBgpRoutes() { | 167 | + public Collection<BgpRouteEntry> getBgpRoutes4() { |
168 | - return bgpSessionManager.getBgpRoutes(); | 168 | + return bgpSessionManager.getBgpRoutes4(); |
169 | } | 169 | } |
170 | 170 | ||
171 | @Override | 171 | @Override |
172 | - public Collection<RouteEntry> getRoutes() { | 172 | + public Collection<BgpRouteEntry> getBgpRoutes6() { |
173 | - return router.getRoutes(); | 173 | + return bgpSessionManager.getBgpRoutes6(); |
174 | + } | ||
175 | + | ||
176 | + @Override | ||
177 | + public Collection<RouteEntry> getRoutes4() { | ||
178 | + return router.getRoutes4(); | ||
179 | + } | ||
180 | + | ||
181 | + @Override | ||
182 | + public Collection<RouteEntry> getRoutes6() { | ||
183 | + return router.getRoutes6(); | ||
174 | } | 184 | } |
175 | 185 | ||
176 | @Override | 186 | @Override | ... | ... |
... | @@ -32,18 +32,32 @@ public interface SdnIpService { | ... | @@ -32,18 +32,32 @@ public interface SdnIpService { |
32 | public Collection<BgpSession> getBgpSessions(); | 32 | public Collection<BgpSession> getBgpSessions(); |
33 | 33 | ||
34 | /** | 34 | /** |
35 | - * Gets the BGP routes. | 35 | + * Gets the selected IPv4 BGP routes among all BGP sessions. |
36 | * | 36 | * |
37 | - * @return the BGP routes | 37 | + * @return the selected IPv4 BGP routes among all BGP sessions |
38 | */ | 38 | */ |
39 | - public Collection<BgpRouteEntry> getBgpRoutes(); | 39 | + public Collection<BgpRouteEntry> getBgpRoutes4(); |
40 | 40 | ||
41 | /** | 41 | /** |
42 | - * Gets all the routes known to SDN-IP. | 42 | + * Gets the selected IPv6 BGP routes among all BGP sessions. |
43 | * | 43 | * |
44 | - * @return the SDN-IP routes | 44 | + * @return the selected IPv6 BGP routes among all BGP sessions |
45 | */ | 45 | */ |
46 | - public Collection<RouteEntry> getRoutes(); | 46 | + public Collection<BgpRouteEntry> getBgpRoutes6(); |
47 | + | ||
48 | + /** | ||
49 | + * Gets all IPv4 routes known to SDN-IP. | ||
50 | + * | ||
51 | + * @return the SDN-IP IPv4 routes | ||
52 | + */ | ||
53 | + public Collection<RouteEntry> getRoutes4(); | ||
54 | + | ||
55 | + /** | ||
56 | + * Gets all IPv6 routes known to SDN-IP. | ||
57 | + * | ||
58 | + * @return the SDN-IP IPv6 routes | ||
59 | + */ | ||
60 | + public Collection<RouteEntry> getRoutes6(); | ||
47 | 61 | ||
48 | /** | 62 | /** |
49 | * Changes whether this SDN-IP instance is the primary or not based on the | 63 | * Changes whether this SDN-IP instance is the primary or not based on the | ... | ... |
... | @@ -20,8 +20,9 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -20,8 +20,9 @@ import static com.google.common.base.Preconditions.checkNotNull; |
20 | import java.util.ArrayList; | 20 | import java.util.ArrayList; |
21 | import java.util.Objects; | 21 | import java.util.Objects; |
22 | 22 | ||
23 | +import org.onlab.packet.IpAddress; | ||
24 | +import org.onlab.packet.IpPrefix; | ||
23 | import org.onlab.packet.Ip4Address; | 25 | import org.onlab.packet.Ip4Address; |
24 | -import org.onlab.packet.Ip4Prefix; | ||
25 | import org.onosproject.sdnip.RouteEntry; | 26 | import org.onosproject.sdnip.RouteEntry; |
26 | import org.onosproject.sdnip.bgp.BgpConstants.Update; | 27 | import org.onosproject.sdnip.bgp.BgpConstants.Update; |
27 | 28 | ||
... | @@ -48,8 +49,8 @@ public class BgpRouteEntry extends RouteEntry { | ... | @@ -48,8 +49,8 @@ public class BgpRouteEntry extends RouteEntry { |
48 | * @param asPath the AS path | 49 | * @param asPath the AS path |
49 | * @param localPref the route local preference | 50 | * @param localPref the route local preference |
50 | */ | 51 | */ |
51 | - public BgpRouteEntry(BgpSession bgpSession, Ip4Prefix prefix, | 52 | + public BgpRouteEntry(BgpSession bgpSession, IpPrefix prefix, |
52 | - Ip4Address nextHop, byte origin, | 53 | + IpAddress nextHop, byte origin, |
53 | BgpRouteEntry.AsPath asPath, long localPref) { | 54 | BgpRouteEntry.AsPath asPath, long localPref) { |
54 | super(prefix, nextHop); | 55 | super(prefix, nextHop); |
55 | this.bgpSession = checkNotNull(bgpSession); | 56 | this.bgpSession = checkNotNull(bgpSession); | ... | ... |
1 | +/* | ||
2 | + * Copyright 2015 Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.onosproject.sdnip.bgp; | ||
17 | + | ||
18 | +import java.util.Collection; | ||
19 | +import java.util.LinkedList; | ||
20 | + | ||
21 | +import org.onlab.packet.IpPrefix; | ||
22 | +import org.onosproject.sdnip.RouteUpdate; | ||
23 | +import org.slf4j.Logger; | ||
24 | +import org.slf4j.LoggerFactory; | ||
25 | + | ||
26 | +/** | ||
27 | + * Class to receive and process the BGP routes from each BGP Session/Peer. | ||
28 | + */ | ||
29 | +class BgpRouteSelector { | ||
30 | + private static final Logger log = | ||
31 | + LoggerFactory.getLogger(BgpRouteSelector.class); | ||
32 | + | ||
33 | + private BgpSessionManager bgpSessionManager; | ||
34 | + | ||
35 | + /** | ||
36 | + * Constructor. | ||
37 | + * | ||
38 | + * @param bgpSessionManager the BGP Session Manager to use | ||
39 | + */ | ||
40 | + BgpRouteSelector(BgpSessionManager bgpSessionManager) { | ||
41 | + this.bgpSessionManager = bgpSessionManager; | ||
42 | + } | ||
43 | + | ||
44 | + /** | ||
45 | + * Processes route entry updates: added/updated and deleted route | ||
46 | + * entries. | ||
47 | + * | ||
48 | + * @param bgpSession the BGP session the route entry updates were | ||
49 | + * received on | ||
50 | + * @param addedBgpRouteEntries the added/updated route entries to process | ||
51 | + * @param deletedBgpRouteEntries the deleted route entries to process | ||
52 | + */ | ||
53 | + synchronized void routeUpdates(BgpSession bgpSession, | ||
54 | + Collection<BgpRouteEntry> addedBgpRouteEntries, | ||
55 | + Collection<BgpRouteEntry> deletedBgpRouteEntries) { | ||
56 | + Collection<RouteUpdate> routeUpdates = new LinkedList<>(); | ||
57 | + RouteUpdate routeUpdate; | ||
58 | + | ||
59 | + if (bgpSessionManager.isShutdown()) { | ||
60 | + return; // Ignore any leftover updates if shutdown | ||
61 | + } | ||
62 | + // Process the deleted route entries | ||
63 | + for (BgpRouteEntry bgpRouteEntry : deletedBgpRouteEntries) { | ||
64 | + routeUpdate = processDeletedRoute(bgpSession, bgpRouteEntry); | ||
65 | + if (routeUpdate != null) { | ||
66 | + routeUpdates.add(routeUpdate); | ||
67 | + } | ||
68 | + } | ||
69 | + | ||
70 | + // Process the added/updated route entries | ||
71 | + for (BgpRouteEntry bgpRouteEntry : addedBgpRouteEntries) { | ||
72 | + routeUpdate = processAddedRoute(bgpSession, bgpRouteEntry); | ||
73 | + if (routeUpdate != null) { | ||
74 | + routeUpdates.add(routeUpdate); | ||
75 | + } | ||
76 | + } | ||
77 | + bgpSessionManager.getRouteListener().update(routeUpdates); | ||
78 | + } | ||
79 | + | ||
80 | + /** | ||
81 | + * Processes an added/updated route entry. | ||
82 | + * | ||
83 | + * @param bgpSession the BGP session the route entry update was received on | ||
84 | + * @param bgpRouteEntry the added/updated route entry | ||
85 | + * @return the result route update that should be forwarded to the | ||
86 | + * Route Listener, or null if no route update should be forwarded | ||
87 | + */ | ||
88 | + private RouteUpdate processAddedRoute(BgpSession bgpSession, | ||
89 | + BgpRouteEntry bgpRouteEntry) { | ||
90 | + RouteUpdate routeUpdate; | ||
91 | + BgpRouteEntry bestBgpRouteEntry = | ||
92 | + bgpSessionManager.findBgpRoute(bgpRouteEntry.prefix()); | ||
93 | + | ||
94 | + // | ||
95 | + // Install the new route entry if it is better than the | ||
96 | + // current best route. | ||
97 | + // | ||
98 | + if ((bestBgpRouteEntry == null) || | ||
99 | + bgpRouteEntry.isBetterThan(bestBgpRouteEntry)) { | ||
100 | + bgpSessionManager.addBgpRoute(bgpRouteEntry); | ||
101 | + routeUpdate = | ||
102 | + new RouteUpdate(RouteUpdate.Type.UPDATE, bgpRouteEntry); | ||
103 | + return routeUpdate; | ||
104 | + } | ||
105 | + | ||
106 | + // | ||
107 | + // If the route entry arrived on the same BGP Session as | ||
108 | + // the current best route, then elect the next best route | ||
109 | + // and install it. | ||
110 | + // | ||
111 | + if (bestBgpRouteEntry.getBgpSession() != | ||
112 | + bgpRouteEntry.getBgpSession()) { | ||
113 | + return null; // Nothing to do | ||
114 | + } | ||
115 | + | ||
116 | + // Find the next best route | ||
117 | + bestBgpRouteEntry = findBestBgpRoute(bgpRouteEntry.prefix()); | ||
118 | + if (bestBgpRouteEntry == null) { | ||
119 | + // | ||
120 | + // TODO: Shouldn't happen. Install the new route as a | ||
121 | + // pre-caution. | ||
122 | + // | ||
123 | + log.debug("BGP next best route for prefix {} is missing. " + | ||
124 | + "Adding the route that is currently processed.", | ||
125 | + bgpRouteEntry.prefix()); | ||
126 | + bestBgpRouteEntry = bgpRouteEntry; | ||
127 | + } | ||
128 | + | ||
129 | + // Install the next best route | ||
130 | + bgpSessionManager.addBgpRoute(bestBgpRouteEntry); | ||
131 | + routeUpdate = new RouteUpdate(RouteUpdate.Type.UPDATE, | ||
132 | + bestBgpRouteEntry); | ||
133 | + return routeUpdate; | ||
134 | + } | ||
135 | + | ||
136 | + /** | ||
137 | + * Processes a deleted route entry. | ||
138 | + * | ||
139 | + * @param bgpSession the BGP session the route entry update was received on | ||
140 | + * @param bgpRouteEntry the deleted route entry | ||
141 | + * @return the result route update that should be forwarded to the | ||
142 | + * Route Listener, or null if no route update should be forwarded | ||
143 | + */ | ||
144 | + private RouteUpdate processDeletedRoute(BgpSession bgpSession, | ||
145 | + BgpRouteEntry bgpRouteEntry) { | ||
146 | + RouteUpdate routeUpdate; | ||
147 | + BgpRouteEntry bestBgpRouteEntry = | ||
148 | + bgpSessionManager.findBgpRoute(bgpRouteEntry.prefix()); | ||
149 | + | ||
150 | + // | ||
151 | + // Remove the route entry only if it was the best one. | ||
152 | + // Install the the next best route if it exists. | ||
153 | + // | ||
154 | + // NOTE: We intentionally use "==" instead of method equals(), | ||
155 | + // because we need to check whether this is same object. | ||
156 | + // | ||
157 | + if (bgpRouteEntry != bestBgpRouteEntry) { | ||
158 | + return null; // Nothing to do | ||
159 | + } | ||
160 | + | ||
161 | + // | ||
162 | + // Find the next best route | ||
163 | + // | ||
164 | + bestBgpRouteEntry = findBestBgpRoute(bgpRouteEntry.prefix()); | ||
165 | + if (bestBgpRouteEntry != null) { | ||
166 | + // Install the next best route | ||
167 | + bgpSessionManager.addBgpRoute(bestBgpRouteEntry); | ||
168 | + routeUpdate = new RouteUpdate(RouteUpdate.Type.UPDATE, | ||
169 | + bestBgpRouteEntry); | ||
170 | + return routeUpdate; | ||
171 | + } | ||
172 | + | ||
173 | + // | ||
174 | + // No route found. Remove the route entry | ||
175 | + // | ||
176 | + bgpSessionManager.removeBgpRoute(bgpRouteEntry.prefix()); | ||
177 | + routeUpdate = new RouteUpdate(RouteUpdate.Type.DELETE, bgpRouteEntry); | ||
178 | + return routeUpdate; | ||
179 | + } | ||
180 | + | ||
181 | + /** | ||
182 | + * Finds the best route entry among all BGP Sessions. | ||
183 | + * | ||
184 | + * @param prefix the prefix of the route | ||
185 | + * @return the best route if found, otherwise null | ||
186 | + */ | ||
187 | + private BgpRouteEntry findBestBgpRoute(IpPrefix prefix) { | ||
188 | + BgpRouteEntry bestRoute = null; | ||
189 | + | ||
190 | + // Iterate across all BGP Sessions and select the best route | ||
191 | + for (BgpSession bgpSession : bgpSessionManager.getBgpSessions()) { | ||
192 | + BgpRouteEntry route = bgpSession.findBgpRoute(prefix); | ||
193 | + if (route == null) { | ||
194 | + continue; | ||
195 | + } | ||
196 | + if ((bestRoute == null) || route.isBetterThan(bestRoute)) { | ||
197 | + bestRoute = route; | ||
198 | + } | ||
199 | + } | ||
200 | + return bestRoute; | ||
201 | + } | ||
202 | +} |
... | @@ -20,7 +20,6 @@ import java.net.InetSocketAddress; | ... | @@ -20,7 +20,6 @@ import java.net.InetSocketAddress; |
20 | import java.net.SocketAddress; | 20 | import java.net.SocketAddress; |
21 | import java.util.Collection; | 21 | import java.util.Collection; |
22 | import java.util.Collections; | 22 | import java.util.Collections; |
23 | -import java.util.Map; | ||
24 | import java.util.concurrent.ConcurrentHashMap; | 23 | import java.util.concurrent.ConcurrentHashMap; |
25 | import java.util.concurrent.ConcurrentMap; | 24 | import java.util.concurrent.ConcurrentMap; |
26 | import java.util.concurrent.TimeUnit; | 25 | import java.util.concurrent.TimeUnit; |
... | @@ -34,6 +33,7 @@ import org.jboss.netty.util.HashedWheelTimer; | ... | @@ -34,6 +33,7 @@ import org.jboss.netty.util.HashedWheelTimer; |
34 | import org.jboss.netty.util.Timeout; | 33 | import org.jboss.netty.util.Timeout; |
35 | import org.jboss.netty.util.Timer; | 34 | import org.jboss.netty.util.Timer; |
36 | import org.jboss.netty.util.TimerTask; | 35 | import org.jboss.netty.util.TimerTask; |
36 | +import org.onlab.packet.IpPrefix; | ||
37 | import org.onlab.packet.Ip4Address; | 37 | import org.onlab.packet.Ip4Address; |
38 | import org.onlab.packet.Ip4Prefix; | 38 | import org.onlab.packet.Ip4Prefix; |
39 | import org.onlab.packet.Ip6Prefix; | 39 | import org.onlab.packet.Ip6Prefix; |
... | @@ -120,44 +120,113 @@ public class BgpSession extends SimpleChannelHandler { | ... | @@ -120,44 +120,113 @@ public class BgpSession extends SimpleChannelHandler { |
120 | } | 120 | } |
121 | 121 | ||
122 | /** | 122 | /** |
123 | - * Gets the BGP RIB-IN IPv4 routing entries. | 123 | + * Gets the IPv4 BGP RIB-IN routing entries. |
124 | * | 124 | * |
125 | - * @return the BGP RIB-IN IPv4 routing entries | 125 | + * @return the IPv4 BGP RIB-IN routing entries |
126 | */ | 126 | */ |
127 | - public Map<Ip4Prefix, BgpRouteEntry> bgpRibIn4() { | 127 | + public Collection<BgpRouteEntry> getBgpRibIn4() { |
128 | - return bgpRibIn4; | 128 | + return bgpRibIn4.values(); |
129 | } | 129 | } |
130 | 130 | ||
131 | /** | 131 | /** |
132 | - * Gets the BGP RIB-IN IPv6 routing entries. | 132 | + * Gets the IPv6 BGP RIB-IN routing entries. |
133 | * | 133 | * |
134 | - * @return the BGP RIB-IN IPv6 routing entries | 134 | + * @return the IPv6 BGP RIB-IN routing entries |
135 | */ | 135 | */ |
136 | - public Map<Ip6Prefix, BgpRouteEntry> bgpRibIn6() { | 136 | + public Collection<BgpRouteEntry> getBgpRibIn6() { |
137 | - return bgpRibIn6; | 137 | + return bgpRibIn6.values(); |
138 | } | 138 | } |
139 | 139 | ||
140 | /** | 140 | /** |
141 | - * Finds a BGP IPv4 routing entry in the BGP RIB-IN. | 141 | + * Finds an IPv4 BGP routing entry for a prefix in the IPv4 BGP RIB-IN. |
142 | * | 142 | * |
143 | * @param prefix the IPv4 prefix of the route to search for | 143 | * @param prefix the IPv4 prefix of the route to search for |
144 | * @return the IPv4 BGP routing entry if found, otherwise null | 144 | * @return the IPv4 BGP routing entry if found, otherwise null |
145 | */ | 145 | */ |
146 | - public BgpRouteEntry findBgpRouteEntry(Ip4Prefix prefix) { | 146 | + public BgpRouteEntry findBgpRoute(Ip4Prefix prefix) { |
147 | return bgpRibIn4.get(prefix); | 147 | return bgpRibIn4.get(prefix); |
148 | } | 148 | } |
149 | 149 | ||
150 | /** | 150 | /** |
151 | - * Finds a BGP IPv6 routing entry in the BGP RIB-IN. | 151 | + * Finds an IPv6 BGP routing entry for a prefix in the IPv6 BGP RIB-IN. |
152 | * | 152 | * |
153 | * @param prefix the IPv6 prefix of the route to search for | 153 | * @param prefix the IPv6 prefix of the route to search for |
154 | * @return the IPv6 BGP routing entry if found, otherwise null | 154 | * @return the IPv6 BGP routing entry if found, otherwise null |
155 | */ | 155 | */ |
156 | - public BgpRouteEntry findBgpRouteEntry(Ip6Prefix prefix) { | 156 | + public BgpRouteEntry findBgpRoute(Ip6Prefix prefix) { |
157 | return bgpRibIn6.get(prefix); | 157 | return bgpRibIn6.get(prefix); |
158 | } | 158 | } |
159 | 159 | ||
160 | /** | 160 | /** |
161 | + * Finds a BGP routing entry for a prefix in the BGP RIB-IN. The prefix | ||
162 | + * can be either IPv4 or IPv6. | ||
163 | + * | ||
164 | + * @param prefix the IP prefix of the route to search for | ||
165 | + * @return the BGP routing entry if found, otherwise null | ||
166 | + */ | ||
167 | + public BgpRouteEntry findBgpRoute(IpPrefix prefix) { | ||
168 | + if (prefix.version() == Ip4Address.VERSION) { | ||
169 | + // IPv4 prefix | ||
170 | + Ip4Prefix ip4Prefix = prefix.getIp4Prefix(); | ||
171 | + return bgpRibIn4.get(ip4Prefix); | ||
172 | + } | ||
173 | + | ||
174 | + // IPv6 prefix | ||
175 | + Ip6Prefix ip6Prefix = prefix.getIp6Prefix(); | ||
176 | + return bgpRibIn6.get(ip6Prefix); | ||
177 | + } | ||
178 | + | ||
179 | + /** | ||
180 | + * Adds a BGP route. The route can be either IPv4 or IPv6. | ||
181 | + * | ||
182 | + * @param bgpRouteEntry the BGP route entry to use | ||
183 | + */ | ||
184 | + void addBgpRoute(BgpRouteEntry bgpRouteEntry) { | ||
185 | + if (bgpRouteEntry.version() == Ip4Address.VERSION) { | ||
186 | + // IPv4 route | ||
187 | + Ip4Prefix ip4Prefix = bgpRouteEntry.prefix().getIp4Prefix(); | ||
188 | + bgpRibIn4.put(ip4Prefix, bgpRouteEntry); | ||
189 | + } else { | ||
190 | + // IPv6 route | ||
191 | + Ip6Prefix ip6Prefix = bgpRouteEntry.prefix().getIp6Prefix(); | ||
192 | + bgpRibIn6.put(ip6Prefix, bgpRouteEntry); | ||
193 | + } | ||
194 | + } | ||
195 | + | ||
196 | + /** | ||
197 | + * Removes an IPv4 BGP route for a prefix. | ||
198 | + * | ||
199 | + * @param prefix the prefix to use | ||
200 | + * @return true if the route was found and removed, otherwise false | ||
201 | + */ | ||
202 | + boolean removeBgpRoute(Ip4Prefix prefix) { | ||
203 | + return (bgpRibIn4.remove(prefix) != null); | ||
204 | + } | ||
205 | + | ||
206 | + /** | ||
207 | + * Removes an IPv6 BGP route for a prefix. | ||
208 | + * | ||
209 | + * @param prefix the prefix to use | ||
210 | + * @return true if the route was found and removed, otherwise false | ||
211 | + */ | ||
212 | + boolean removeBgpRoute(Ip6Prefix prefix) { | ||
213 | + return (bgpRibIn6.remove(prefix) != null); | ||
214 | + } | ||
215 | + | ||
216 | + /** | ||
217 | + * Removes a BGP route for a prefix. The prefix can be either IPv4 or IPv6. | ||
218 | + * | ||
219 | + * @param prefix the prefix to use | ||
220 | + * @return true if the route was found and removed, otherwise false | ||
221 | + */ | ||
222 | + boolean removeBgpRoute(IpPrefix prefix) { | ||
223 | + if (prefix.version() == Ip4Address.VERSION) { | ||
224 | + return (bgpRibIn4.remove(prefix.getIp4Prefix()) != null); // IPv4 | ||
225 | + } | ||
226 | + return (bgpRibIn6.remove(prefix.getIp6Prefix()) != null); // IPv6 | ||
227 | + } | ||
228 | + | ||
229 | + /** | ||
161 | * Gets the BGP session remote address. | 230 | * Gets the BGP session remote address. |
162 | * | 231 | * |
163 | * @return the BGP session remote address | 232 | * @return the BGP session remote address |
... | @@ -622,7 +691,7 @@ public class BgpSession extends SimpleChannelHandler { | ... | @@ -622,7 +691,7 @@ public class BgpSession extends SimpleChannelHandler { |
622 | bgpRibIn6 = new ConcurrentHashMap<>(); | 691 | bgpRibIn6 = new ConcurrentHashMap<>(); |
623 | 692 | ||
624 | // Push the updates to the BGP Merged RIB | 693 | // Push the updates to the BGP Merged RIB |
625 | - BgpSessionManager.BgpRouteSelector bgpRouteSelector = | 694 | + BgpRouteSelector bgpRouteSelector = |
626 | bgpSessionManager.getBgpRouteSelector(); | 695 | bgpSessionManager.getBgpRouteSelector(); |
627 | Collection<BgpRouteEntry> addedRoutes = Collections.emptyList(); | 696 | Collection<BgpRouteEntry> addedRoutes = Collections.emptyList(); |
628 | bgpRouteSelector.routeUpdates(this, addedRoutes, deletedRoutes4); | 697 | bgpRouteSelector.routeUpdates(this, addedRoutes, deletedRoutes4); | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -25,8 +25,8 @@ import org.jboss.netty.buffer.ChannelBuffer; | ... | @@ -25,8 +25,8 @@ import org.jboss.netty.buffer.ChannelBuffer; |
25 | import org.jboss.netty.buffer.ChannelBuffers; | 25 | import org.jboss.netty.buffer.ChannelBuffers; |
26 | import org.jboss.netty.channel.ChannelHandlerContext; | 26 | import org.jboss.netty.channel.ChannelHandlerContext; |
27 | import org.onlab.packet.Ip4Address; | 27 | import org.onlab.packet.Ip4Address; |
28 | -import org.onlab.packet.Ip6Address; | ||
29 | import org.onlab.packet.Ip4Prefix; | 28 | import org.onlab.packet.Ip4Prefix; |
29 | +import org.onlab.packet.Ip6Address; | ||
30 | import org.onlab.packet.Ip6Prefix; | 30 | import org.onlab.packet.Ip6Prefix; |
31 | import org.onosproject.sdnip.bgp.BgpConstants.Notifications.UpdateMessageError; | 31 | import org.onosproject.sdnip.bgp.BgpConstants.Notifications.UpdateMessageError; |
32 | import org.onosproject.sdnip.bgp.BgpConstants.Open.Capabilities.MultiprotocolExtensions; | 32 | import org.onosproject.sdnip.bgp.BgpConstants.Open.Capabilities.MultiprotocolExtensions; |
... | @@ -112,7 +112,7 @@ final class BgpUpdate { | ... | @@ -112,7 +112,7 @@ final class BgpUpdate { |
112 | for (Ip4Prefix prefix : withdrawnPrefixes) { | 112 | for (Ip4Prefix prefix : withdrawnPrefixes) { |
113 | log.debug("BGP RX UPDATE message WITHDRAWN from {}: {}", | 113 | log.debug("BGP RX UPDATE message WITHDRAWN from {}: {}", |
114 | bgpSession.getRemoteAddress(), prefix); | 114 | bgpSession.getRemoteAddress(), prefix); |
115 | - BgpRouteEntry bgpRouteEntry = bgpSession.bgpRibIn4().get(prefix); | 115 | + BgpRouteEntry bgpRouteEntry = bgpSession.findBgpRoute(prefix); |
116 | if (bgpRouteEntry != null) { | 116 | if (bgpRouteEntry != null) { |
117 | decodedBgpRoutes.deletedUnicastRoutes4.put(prefix, | 117 | decodedBgpRoutes.deletedUnicastRoutes4.put(prefix, |
118 | bgpRouteEntry); | 118 | bgpRouteEntry); |
... | @@ -134,35 +134,30 @@ final class BgpUpdate { | ... | @@ -134,35 +134,30 @@ final class BgpUpdate { |
134 | // | 134 | // |
135 | // Update the BGP RIB-IN | 135 | // Update the BGP RIB-IN |
136 | // | 136 | // |
137 | - Collection<BgpRouteEntry> bgpRoutes; | 137 | + for (Ip4Prefix ip4Prefix : |
138 | - // | 138 | + decodedBgpRoutes.deletedUnicastRoutes4.keySet()) { |
139 | - bgpRoutes = decodedBgpRoutes.deletedUnicastRoutes4.values(); | 139 | + bgpSession.removeBgpRoute(ip4Prefix); |
140 | - for (BgpRouteEntry bgpRouteEntry : bgpRoutes) { | ||
141 | - bgpSession.bgpRibIn4().remove(bgpRouteEntry.prefix()); | ||
142 | } | 140 | } |
143 | // | 141 | // |
144 | - bgpRoutes = decodedBgpRoutes.addedUnicastRoutes4.values(); | 142 | + for (BgpRouteEntry bgpRouteEntry : |
145 | - for (BgpRouteEntry bgpRouteEntry : bgpRoutes) { | 143 | + decodedBgpRoutes.addedUnicastRoutes4.values()) { |
146 | - bgpSession.bgpRibIn4().put(bgpRouteEntry.prefix(), bgpRouteEntry); | 144 | + bgpSession.addBgpRoute(bgpRouteEntry); |
147 | } | 145 | } |
148 | // | 146 | // |
149 | - bgpRoutes = decodedBgpRoutes.deletedUnicastRoutes6.values(); | 147 | + for (Ip6Prefix ip6Prefix : |
150 | - for (BgpRouteEntry bgpRouteEntry : bgpRoutes) { | 148 | + decodedBgpRoutes.deletedUnicastRoutes6.keySet()) { |
151 | - bgpSession.bgpRibIn6().remove(bgpRouteEntry.prefix()); | 149 | + bgpSession.removeBgpRoute(ip6Prefix); |
152 | } | 150 | } |
153 | // | 151 | // |
154 | - bgpRoutes = decodedBgpRoutes.addedUnicastRoutes6.values(); | 152 | + for (BgpRouteEntry bgpRouteEntry : |
155 | - // TODO: fix/enable for IPv6 | 153 | + decodedBgpRoutes.addedUnicastRoutes6.values()) { |
156 | - /* | 154 | + bgpSession.addBgpRoute(bgpRouteEntry); |
157 | - for (BgpRouteEntry bgpRouteEntry : bgpRoutes) { | ||
158 | - bgpSession.bgpRibIn6().put(bgpRouteEntry.prefix(), bgpRouteEntry); | ||
159 | } | 155 | } |
160 | - */ | ||
161 | 156 | ||
162 | // | 157 | // |
163 | // Push the updates to the BGP Merged RIB | 158 | // Push the updates to the BGP Merged RIB |
164 | // | 159 | // |
165 | - BgpSessionManager.BgpRouteSelector bgpRouteSelector = | 160 | + BgpRouteSelector bgpRouteSelector = |
166 | bgpSession.getBgpSessionManager().getBgpRouteSelector(); | 161 | bgpSession.getBgpSessionManager().getBgpRouteSelector(); |
167 | bgpRouteSelector.routeUpdates(bgpSession, | 162 | bgpRouteSelector.routeUpdates(bgpSession, |
168 | decodedBgpRoutes.addedUnicastRoutes4.values(), | 163 | decodedBgpRoutes.addedUnicastRoutes4.values(), |
... | @@ -408,7 +403,7 @@ final class BgpUpdate { | ... | @@ -408,7 +403,7 @@ final class BgpUpdate { |
408 | 403 | ||
409 | // The deleted IPv4 routes | 404 | // The deleted IPv4 routes |
410 | for (Ip4Prefix prefix : mpNlri.nlri4) { | 405 | for (Ip4Prefix prefix : mpNlri.nlri4) { |
411 | - bgpRouteEntry = bgpSession.bgpRibIn4().get(prefix); | 406 | + bgpRouteEntry = bgpSession.findBgpRoute(prefix); |
412 | if (bgpRouteEntry != null) { | 407 | if (bgpRouteEntry != null) { |
413 | decodedBgpRoutes.deletedUnicastRoutes4.put(prefix, | 408 | decodedBgpRoutes.deletedUnicastRoutes4.put(prefix, |
414 | bgpRouteEntry); | 409 | bgpRouteEntry); |
... | @@ -417,7 +412,7 @@ final class BgpUpdate { | ... | @@ -417,7 +412,7 @@ final class BgpUpdate { |
417 | 412 | ||
418 | // The deleted IPv6 routes | 413 | // The deleted IPv6 routes |
419 | for (Ip6Prefix prefix : mpNlri.nlri6) { | 414 | for (Ip6Prefix prefix : mpNlri.nlri6) { |
420 | - bgpRouteEntry = bgpSession.bgpRibIn6().get(prefix); | 415 | + bgpRouteEntry = bgpSession.findBgpRoute(prefix); |
421 | if (bgpRouteEntry != null) { | 416 | if (bgpRouteEntry != null) { |
422 | decodedBgpRoutes.deletedUnicastRoutes6.put(prefix, | 417 | decodedBgpRoutes.deletedUnicastRoutes6.put(prefix, |
423 | bgpRouteEntry); | 418 | bgpRouteEntry); |
... | @@ -456,8 +451,6 @@ final class BgpUpdate { | ... | @@ -456,8 +451,6 @@ final class BgpUpdate { |
456 | } | 451 | } |
457 | 452 | ||
458 | // The added IPv6 routes | 453 | // The added IPv6 routes |
459 | - // TODO: fix/enable for IPv6 | ||
460 | - /* | ||
461 | for (Ip6Prefix prefix : mpNlri.nlri6) { | 454 | for (Ip6Prefix prefix : mpNlri.nlri6) { |
462 | bgpRouteEntry = | 455 | bgpRouteEntry = |
463 | new BgpRouteEntry(bgpSession, prefix, mpNlri.nextHop6, | 456 | new BgpRouteEntry(bgpSession, prefix, mpNlri.nextHop6, |
... | @@ -479,7 +472,6 @@ final class BgpUpdate { | ... | @@ -479,7 +472,6 @@ final class BgpUpdate { |
479 | decodedBgpRoutes.addedUnicastRoutes6.put(prefix, | 472 | decodedBgpRoutes.addedUnicastRoutes6.put(prefix, |
480 | bgpRouteEntry); | 473 | bgpRouteEntry); |
481 | } | 474 | } |
482 | - */ | ||
483 | } | 475 | } |
484 | } | 476 | } |
485 | 477 | ... | ... |
... | @@ -46,7 +46,10 @@ public class BgpRoutesListCommand extends AbstractShellCommand { | ... | @@ -46,7 +46,10 @@ public class BgpRoutesListCommand extends AbstractShellCommand { |
46 | required = false, multiValued = false) | 46 | required = false, multiValued = false) |
47 | private String bgpNeighbor; | 47 | private String bgpNeighbor; |
48 | 48 | ||
49 | - private static final String FORMAT_SUMMARY = "Total BGP routes = %d"; | 49 | + private static final String FORMAT_SUMMARY_V4 = |
50 | + "Total BGP IPv4 routes = %d"; | ||
51 | + private static final String FORMAT_SUMMARY_V6 = | ||
52 | + "Total BGP IPv6 routes = %d"; | ||
50 | private static final String FORMAT_HEADER = | 53 | private static final String FORMAT_HEADER = |
51 | " Network Next Hop Origin LocalPref MED BGP-ID"; | 54 | " Network Next Hop Origin LocalPref MED BGP-ID"; |
52 | private static final String FORMAT_ROUTE_LINE1 = | 55 | private static final String FORMAT_ROUTE_LINE1 = |
... | @@ -60,7 +63,7 @@ public class BgpRoutesListCommand extends AbstractShellCommand { | ... | @@ -60,7 +63,7 @@ public class BgpRoutesListCommand extends AbstractShellCommand { |
60 | 63 | ||
61 | // Print summary of the routes | 64 | // Print summary of the routes |
62 | if (routesSummary) { | 65 | if (routesSummary) { |
63 | - printSummary(service.getBgpRoutes()); | 66 | + printSummary(service.getBgpRoutes4(), service.getBgpRoutes6()); |
64 | return; | 67 | return; |
65 | } | 68 | } |
66 | 69 | ||
... | @@ -81,43 +84,61 @@ public class BgpRoutesListCommand extends AbstractShellCommand { | ... | @@ -81,43 +84,61 @@ public class BgpRoutesListCommand extends AbstractShellCommand { |
81 | 84 | ||
82 | // Print the routes | 85 | // Print the routes |
83 | if (foundBgpSession != null) { | 86 | if (foundBgpSession != null) { |
84 | - printRoutes(foundBgpSession.bgpRibIn4().values()); | 87 | + printRoutes(foundBgpSession.getBgpRibIn4(), |
85 | - printRoutes(foundBgpSession.bgpRibIn6().values()); | 88 | + foundBgpSession.getBgpRibIn6()); |
86 | } else { | 89 | } else { |
87 | - printRoutes(service.getBgpRoutes()); | 90 | + printRoutes(service.getBgpRoutes4(), service.getBgpRoutes6()); |
88 | } | 91 | } |
89 | } | 92 | } |
90 | 93 | ||
91 | /** | 94 | /** |
92 | * Prints summary of the routes. | 95 | * Prints summary of the routes. |
93 | * | 96 | * |
94 | - * @param routes the routes | 97 | + * @param routes4 the IPv4 routes |
98 | + * @param routes6 the IPv6 routes | ||
95 | */ | 99 | */ |
96 | - private void printSummary(Collection<BgpRouteEntry> routes) { | 100 | + private void printSummary(Collection<BgpRouteEntry> routes4, |
101 | + Collection<BgpRouteEntry> routes6) { | ||
97 | if (outputJson()) { | 102 | if (outputJson()) { |
98 | ObjectMapper mapper = new ObjectMapper(); | 103 | ObjectMapper mapper = new ObjectMapper(); |
99 | ObjectNode result = mapper.createObjectNode(); | 104 | ObjectNode result = mapper.createObjectNode(); |
100 | - result.put("totalRoutes", routes.size()); | 105 | + result.put("totalRoutes4", routes4.size()); |
106 | + result.put("totalRoutes6", routes6.size()); | ||
101 | print("%s", result); | 107 | print("%s", result); |
102 | } else { | 108 | } else { |
103 | - print(FORMAT_SUMMARY, routes.size()); | 109 | + print(FORMAT_SUMMARY_V4, routes4.size()); |
110 | + print(FORMAT_SUMMARY_V6, routes6.size()); | ||
104 | } | 111 | } |
105 | } | 112 | } |
106 | 113 | ||
107 | /** | 114 | /** |
108 | * Prints all routes. | 115 | * Prints all routes. |
109 | * | 116 | * |
110 | - * @param routes the routes to print | 117 | + * @param routes4 the IPv4 routes to print |
118 | + * @param routes6 the IPv6 routes to print | ||
111 | */ | 119 | */ |
112 | - private void printRoutes(Collection<BgpRouteEntry> routes) { | 120 | + private void printRoutes(Collection<BgpRouteEntry> routes4, |
121 | + Collection<BgpRouteEntry> routes6) { | ||
113 | if (outputJson()) { | 122 | if (outputJson()) { |
114 | - print("%s", json(routes)); | 123 | + ObjectMapper mapper = new ObjectMapper(); |
124 | + ObjectNode result = mapper.createObjectNode(); | ||
125 | + result.put("routes4", json(routes4)); | ||
126 | + result.put("routes6", json(routes6)); | ||
127 | + print("%s", result); | ||
115 | } else { | 128 | } else { |
129 | + // The IPv4 routes | ||
116 | print(FORMAT_HEADER); | 130 | print(FORMAT_HEADER); |
117 | - for (BgpRouteEntry route : routes) { | 131 | + for (BgpRouteEntry route : routes4) { |
132 | + printRoute(route); | ||
133 | + } | ||
134 | + print(FORMAT_SUMMARY_V4, routes4.size()); | ||
135 | + print(""); // Empty separator line | ||
136 | + // The IPv6 routes | ||
137 | + print(FORMAT_HEADER); | ||
138 | + for (BgpRouteEntry route : routes6) { | ||
118 | printRoute(route); | 139 | printRoute(route); |
119 | } | 140 | } |
120 | - print(FORMAT_SUMMARY, routes.size()); | 141 | + print(FORMAT_SUMMARY_V6, routes6.size()); |
121 | } | 142 | } |
122 | } | 143 | } |
123 | 144 | ... | ... |
... | @@ -38,7 +38,10 @@ public class RoutesListCommand extends AbstractShellCommand { | ... | @@ -38,7 +38,10 @@ public class RoutesListCommand extends AbstractShellCommand { |
38 | required = false, multiValued = false) | 38 | required = false, multiValued = false) |
39 | private boolean routesSummary = false; | 39 | private boolean routesSummary = false; |
40 | 40 | ||
41 | - private static final String FORMAT_SUMMARY = "Total SDN-IP routes = %d"; | 41 | + private static final String FORMAT_SUMMARY_V4 = |
42 | + "Total SDN-IP IPv4 routes = %d"; | ||
43 | + private static final String FORMAT_SUMMARY_V6 = | ||
44 | + "Total SDN-IP IPv6 routes = %d"; | ||
42 | private static final String FORMAT_HEADER = | 45 | private static final String FORMAT_HEADER = |
43 | " Network Next Hop"; | 46 | " Network Next Hop"; |
44 | private static final String FORMAT_ROUTE = | 47 | private static final String FORMAT_ROUTE = |
... | @@ -50,44 +53,62 @@ public class RoutesListCommand extends AbstractShellCommand { | ... | @@ -50,44 +53,62 @@ public class RoutesListCommand extends AbstractShellCommand { |
50 | 53 | ||
51 | // Print summary of the routes | 54 | // Print summary of the routes |
52 | if (routesSummary) { | 55 | if (routesSummary) { |
53 | - printSummary(service.getRoutes()); | 56 | + printSummary(service.getRoutes4(), service.getRoutes6()); |
54 | return; | 57 | return; |
55 | } | 58 | } |
56 | 59 | ||
57 | // Print all routes | 60 | // Print all routes |
58 | - printRoutes(service.getRoutes()); | 61 | + printRoutes(service.getRoutes4(), service.getRoutes6()); |
59 | } | 62 | } |
60 | 63 | ||
61 | /** | 64 | /** |
62 | * Prints summary of the routes. | 65 | * Prints summary of the routes. |
63 | * | 66 | * |
64 | - * @param routes the routes | 67 | + * @param routes4 the IPv4 routes |
68 | + * @param routes6 the IPv6 routes | ||
65 | */ | 69 | */ |
66 | - private void printSummary(Collection<RouteEntry> routes) { | 70 | + private void printSummary(Collection<RouteEntry> routes4, |
71 | + Collection<RouteEntry> routes6) { | ||
67 | if (outputJson()) { | 72 | if (outputJson()) { |
68 | ObjectMapper mapper = new ObjectMapper(); | 73 | ObjectMapper mapper = new ObjectMapper(); |
69 | ObjectNode result = mapper.createObjectNode(); | 74 | ObjectNode result = mapper.createObjectNode(); |
70 | - result.put("totalRoutes", routes.size()); | 75 | + result.put("totalRoutes4", routes4.size()); |
76 | + result.put("totalRoutes6", routes6.size()); | ||
71 | print("%s", result); | 77 | print("%s", result); |
72 | } else { | 78 | } else { |
73 | - print(FORMAT_SUMMARY, routes.size()); | 79 | + print(FORMAT_SUMMARY_V4, routes4.size()); |
80 | + print(FORMAT_SUMMARY_V6, routes6.size()); | ||
74 | } | 81 | } |
75 | } | 82 | } |
76 | 83 | ||
77 | /** | 84 | /** |
78 | * Prints all routes. | 85 | * Prints all routes. |
79 | * | 86 | * |
80 | - * @param routes the routes to print | 87 | + * @param routes4 the IPv4 routes to print |
88 | + * @param routes6 the IPv6 routes to print | ||
81 | */ | 89 | */ |
82 | - private void printRoutes(Collection<RouteEntry> routes) { | 90 | + private void printRoutes(Collection<RouteEntry> routes4, |
91 | + Collection<RouteEntry> routes6) { | ||
83 | if (outputJson()) { | 92 | if (outputJson()) { |
84 | - print("%s", json(routes)); | 93 | + ObjectMapper mapper = new ObjectMapper(); |
94 | + ObjectNode result = mapper.createObjectNode(); | ||
95 | + result.put("routes4", json(routes4)); | ||
96 | + result.put("routes6", json(routes6)); | ||
97 | + print("%s", result); | ||
85 | } else { | 98 | } else { |
99 | + // The IPv4 routes | ||
86 | print(FORMAT_HEADER); | 100 | print(FORMAT_HEADER); |
87 | - for (RouteEntry route : routes) { | 101 | + for (RouteEntry route : routes4) { |
102 | + printRoute(route); | ||
103 | + } | ||
104 | + print(FORMAT_SUMMARY_V4, routes4.size()); | ||
105 | + print(""); // Empty separator line | ||
106 | + // The IPv6 routes | ||
107 | + print(FORMAT_HEADER); | ||
108 | + for (RouteEntry route : routes6) { | ||
88 | printRoute(route); | 109 | printRoute(route); |
89 | } | 110 | } |
90 | - print(FORMAT_SUMMARY, routes.size()); | 111 | + print(FORMAT_SUMMARY_V6, routes6.size()); |
91 | } | 112 | } |
92 | } | 113 | } |
93 | 114 | ... | ... |
... | @@ -61,8 +61,8 @@ import org.onosproject.net.provider.ProviderId; | ... | @@ -61,8 +61,8 @@ import org.onosproject.net.provider.ProviderId; |
61 | import org.onosproject.sdnip.config.Interface; | 61 | import org.onosproject.sdnip.config.Interface; |
62 | import org.onlab.packet.Ethernet; | 62 | import org.onlab.packet.Ethernet; |
63 | import org.onlab.packet.IpAddress; | 63 | import org.onlab.packet.IpAddress; |
64 | -import org.onlab.packet.Ip4Address; | ||
65 | import org.onlab.packet.IpPrefix; | 64 | import org.onlab.packet.IpPrefix; |
65 | +import org.onlab.packet.Ip4Address; | ||
66 | import org.onlab.packet.Ip4Prefix; | 66 | import org.onlab.packet.Ip4Prefix; |
67 | import org.onlab.packet.MacAddress; | 67 | import org.onlab.packet.MacAddress; |
68 | import org.onlab.packet.VlanId; | 68 | import org.onlab.packet.VlanId; |
... | @@ -308,9 +308,9 @@ public class IntentSyncTest extends AbstractIntentTest { | ... | @@ -308,9 +308,9 @@ public class IntentSyncTest extends AbstractIntentTest { |
308 | routeEntry6); | 308 | routeEntry6); |
309 | ribTable.put(RouteEntry.createBinaryString(routeEntry7.prefix()), | 309 | ribTable.put(RouteEntry.createBinaryString(routeEntry7.prefix()), |
310 | routeEntry7); | 310 | routeEntry7); |
311 | - TestUtils.setField(router, "ribTable", ribTable); | 311 | + TestUtils.setField(router, "ribTable4", ribTable); |
312 | 312 | ||
313 | - ConcurrentHashMap<Ip4Prefix, MultiPointToSinglePointIntent> | 313 | + ConcurrentHashMap<IpPrefix, MultiPointToSinglePointIntent> |
314 | routeIntents = new ConcurrentHashMap<>(); | 314 | routeIntents = new ConcurrentHashMap<>(); |
315 | routeIntents.put(routeEntry1.prefix(), intent1); | 315 | routeIntents.put(routeEntry1.prefix(), intent1); |
316 | routeIntents.put(routeEntry3.prefix(), intent3); | 316 | routeIntents.put(routeEntry3.prefix(), intent3); |
... | @@ -364,12 +364,12 @@ public class IntentSyncTest extends AbstractIntentTest { | ... | @@ -364,12 +364,12 @@ public class IntentSyncTest extends AbstractIntentTest { |
364 | intentSynchronizer.synchronizeIntents(); | 364 | intentSynchronizer.synchronizeIntents(); |
365 | 365 | ||
366 | // Verify | 366 | // Verify |
367 | - assertEquals(router.getRoutes().size(), 6); | 367 | + assertEquals(router.getRoutes4().size(), 6); |
368 | - assertTrue(router.getRoutes().contains(routeEntry1)); | 368 | + assertTrue(router.getRoutes4().contains(routeEntry1)); |
369 | - assertTrue(router.getRoutes().contains(routeEntry3)); | 369 | + assertTrue(router.getRoutes4().contains(routeEntry3)); |
370 | - assertTrue(router.getRoutes().contains(routeEntry4Update)); | 370 | + assertTrue(router.getRoutes4().contains(routeEntry4Update)); |
371 | - assertTrue(router.getRoutes().contains(routeEntry5)); | 371 | + assertTrue(router.getRoutes4().contains(routeEntry5)); |
372 | - assertTrue(router.getRoutes().contains(routeEntry6)); | 372 | + assertTrue(router.getRoutes4().contains(routeEntry6)); |
373 | 373 | ||
374 | assertEquals(intentSynchronizer.getRouteIntents().size(), 6); | 374 | assertEquals(intentSynchronizer.getRouteIntents().size(), 6); |
375 | assertTrue(intentSynchronizer.getRouteIntents().contains(intent1)); | 375 | assertTrue(intentSynchronizer.getRouteIntents().contains(intent1)); |
... | @@ -390,12 +390,17 @@ public class IntentSyncTest extends AbstractIntentTest { | ... | @@ -390,12 +390,17 @@ public class IntentSyncTest extends AbstractIntentTest { |
390 | * @param egressPoint to which packets should be sent | 390 | * @param egressPoint to which packets should be sent |
391 | * @return the constructed MultiPointToSinglePointIntent | 391 | * @return the constructed MultiPointToSinglePointIntent |
392 | */ | 392 | */ |
393 | - private MultiPointToSinglePointIntent intentBuilder(Ip4Prefix ipPrefix, | 393 | + private MultiPointToSinglePointIntent intentBuilder(IpPrefix ipPrefix, |
394 | String nextHopMacAddress, ConnectPoint egressPoint) { | 394 | String nextHopMacAddress, ConnectPoint egressPoint) { |
395 | 395 | ||
396 | TrafficSelector.Builder selectorBuilder = | 396 | TrafficSelector.Builder selectorBuilder = |
397 | DefaultTrafficSelector.builder(); | 397 | DefaultTrafficSelector.builder(); |
398 | - selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(ipPrefix); | 398 | + if (ipPrefix.version() == Ip4Address.VERSION) { |
399 | + selectorBuilder.matchEthType(Ethernet.TYPE_IPV4); // IPv4 | ||
400 | + } else { | ||
401 | + selectorBuilder.matchEthType(Ethernet.TYPE_IPV6); // IPv6 | ||
402 | + } | ||
403 | + selectorBuilder.matchIPDst(ipPrefix); | ||
399 | 404 | ||
400 | TrafficTreatment.Builder treatmentBuilder = | 405 | TrafficTreatment.Builder treatmentBuilder = |
401 | DefaultTrafficTreatment.builder(); | 406 | DefaultTrafficTreatment.builder(); | ... | ... |
... | @@ -63,8 +63,8 @@ import org.onosproject.sdnip.config.Interface; | ... | @@ -63,8 +63,8 @@ import org.onosproject.sdnip.config.Interface; |
63 | import org.onosproject.sdnip.config.SdnIpConfigurationService; | 63 | import org.onosproject.sdnip.config.SdnIpConfigurationService; |
64 | import org.onlab.packet.Ethernet; | 64 | import org.onlab.packet.Ethernet; |
65 | import org.onlab.packet.IpAddress; | 65 | import org.onlab.packet.IpAddress; |
66 | -import org.onlab.packet.Ip4Address; | ||
67 | import org.onlab.packet.IpPrefix; | 66 | import org.onlab.packet.IpPrefix; |
67 | +import org.onlab.packet.Ip4Address; | ||
68 | import org.onlab.packet.Ip4Prefix; | 68 | import org.onlab.packet.Ip4Prefix; |
69 | import org.onlab.packet.MacAddress; | 69 | import org.onlab.packet.MacAddress; |
70 | import org.onlab.packet.VlanId; | 70 | import org.onlab.packet.VlanId; |
... | @@ -239,8 +239,8 @@ public class RouterAsyncArpTest extends AbstractIntentTest { | ... | @@ -239,8 +239,8 @@ public class RouterAsyncArpTest extends AbstractIntentTest { |
239 | new HostEvent(HostEvent.Type.HOST_ADDED, host)); | 239 | new HostEvent(HostEvent.Type.HOST_ADDED, host)); |
240 | 240 | ||
241 | // Verify | 241 | // Verify |
242 | - assertEquals(router.getRoutes().size(), 1); | 242 | + assertEquals(router.getRoutes4().size(), 1); |
243 | - assertTrue(router.getRoutes().contains(routeEntry)); | 243 | + assertTrue(router.getRoutes4().contains(routeEntry)); |
244 | assertEquals(intentSynchronizer.getRouteIntents().size(), 1); | 244 | assertEquals(intentSynchronizer.getRouteIntents().size(), 1); |
245 | Intent firstIntent = | 245 | Intent firstIntent = |
246 | intentSynchronizer.getRouteIntents().iterator().next(); | 246 | intentSynchronizer.getRouteIntents().iterator().next(); |
... | @@ -333,8 +333,8 @@ public class RouterAsyncArpTest extends AbstractIntentTest { | ... | @@ -333,8 +333,8 @@ public class RouterAsyncArpTest extends AbstractIntentTest { |
333 | new HostEvent(HostEvent.Type.HOST_ADDED, host)); | 333 | new HostEvent(HostEvent.Type.HOST_ADDED, host)); |
334 | 334 | ||
335 | // Verify | 335 | // Verify |
336 | - assertEquals(router.getRoutes().size(), 1); | 336 | + assertEquals(router.getRoutes4().size(), 1); |
337 | - assertTrue(router.getRoutes().contains(routeEntryUpdate)); | 337 | + assertTrue(router.getRoutes4().contains(routeEntryUpdate)); |
338 | assertEquals(intentSynchronizer.getRouteIntents().size(), 1); | 338 | assertEquals(intentSynchronizer.getRouteIntents().size(), 1); |
339 | Intent firstIntent = | 339 | Intent firstIntent = |
340 | intentSynchronizer.getRouteIntents().iterator().next(); | 340 | intentSynchronizer.getRouteIntents().iterator().next(); |
... | @@ -380,7 +380,7 @@ public class RouterAsyncArpTest extends AbstractIntentTest { | ... | @@ -380,7 +380,7 @@ public class RouterAsyncArpTest extends AbstractIntentTest { |
380 | router.processRouteUpdates(Collections.<RouteUpdate>singletonList(routeUpdate)); | 380 | router.processRouteUpdates(Collections.<RouteUpdate>singletonList(routeUpdate)); |
381 | 381 | ||
382 | // Verify | 382 | // Verify |
383 | - assertEquals(router.getRoutes().size(), 0); | 383 | + assertEquals(router.getRoutes4().size(), 0); |
384 | assertEquals(intentSynchronizer.getRouteIntents().size(), 0); | 384 | assertEquals(intentSynchronizer.getRouteIntents().size(), 0); |
385 | verify(intentService); | 385 | verify(intentService); |
386 | } | 386 | } |
... | @@ -424,7 +424,7 @@ public class RouterAsyncArpTest extends AbstractIntentTest { | ... | @@ -424,7 +424,7 @@ public class RouterAsyncArpTest extends AbstractIntentTest { |
424 | new DefaultByteArrayNodeFactory()); | 424 | new DefaultByteArrayNodeFactory()); |
425 | ribTable.put(RouteEntry.createBinaryString(routeEntry.prefix()), | 425 | ribTable.put(RouteEntry.createBinaryString(routeEntry.prefix()), |
426 | routeEntry); | 426 | routeEntry); |
427 | - TestUtils.setField(router, "ribTable", ribTable); | 427 | + TestUtils.setField(router, "ribTable4", ribTable); |
428 | } | 428 | } |
429 | 429 | ||
430 | /** | 430 | /** |
... | @@ -436,7 +436,7 @@ public class RouterAsyncArpTest extends AbstractIntentTest { | ... | @@ -436,7 +436,7 @@ public class RouterAsyncArpTest extends AbstractIntentTest { |
436 | MultiPointToSinglePointIntent intent) | 436 | MultiPointToSinglePointIntent intent) |
437 | throws TestUtilsException { | 437 | throws TestUtilsException { |
438 | 438 | ||
439 | - ConcurrentHashMap<Ip4Prefix, MultiPointToSinglePointIntent> | 439 | + ConcurrentHashMap<IpPrefix, MultiPointToSinglePointIntent> |
440 | routeIntents = new ConcurrentHashMap<>(); | 440 | routeIntents = new ConcurrentHashMap<>(); |
441 | routeIntents.put(routeEntry.prefix(), intent); | 441 | routeIntents.put(routeEntry.prefix(), intent); |
442 | TestUtils.setField(intentSynchronizer, "routeIntents", routeIntents); | 442 | TestUtils.setField(intentSynchronizer, "routeIntents", routeIntents); | ... | ... |
... | @@ -36,10 +36,10 @@ import org.junit.Test; | ... | @@ -36,10 +36,10 @@ import org.junit.Test; |
36 | import org.onlab.junit.TestUtils; | 36 | import org.onlab.junit.TestUtils; |
37 | import org.onlab.junit.TestUtils.TestUtilsException; | 37 | import org.onlab.junit.TestUtils.TestUtilsException; |
38 | import org.onlab.packet.Ethernet; | 38 | import org.onlab.packet.Ethernet; |
39 | -import org.onlab.packet.Ip4Address; | ||
40 | -import org.onlab.packet.Ip4Prefix; | ||
41 | import org.onlab.packet.IpAddress; | 39 | import org.onlab.packet.IpAddress; |
42 | import org.onlab.packet.IpPrefix; | 40 | import org.onlab.packet.IpPrefix; |
41 | +import org.onlab.packet.Ip4Address; | ||
42 | +import org.onlab.packet.Ip4Prefix; | ||
43 | import org.onlab.packet.MacAddress; | 43 | import org.onlab.packet.MacAddress; |
44 | import org.onlab.packet.VlanId; | 44 | import org.onlab.packet.VlanId; |
45 | import org.onosproject.core.ApplicationId; | 45 | import org.onosproject.core.ApplicationId; |
... | @@ -278,8 +278,8 @@ public class RouterTest extends AbstractIntentTest { | ... | @@ -278,8 +278,8 @@ public class RouterTest extends AbstractIntentTest { |
278 | router.processRouteUpdates(Collections.<RouteUpdate>singletonList(routeUpdate)); | 278 | router.processRouteUpdates(Collections.<RouteUpdate>singletonList(routeUpdate)); |
279 | 279 | ||
280 | // Verify | 280 | // Verify |
281 | - assertEquals(router.getRoutes().size(), 1); | 281 | + assertEquals(router.getRoutes4().size(), 1); |
282 | - assertTrue(router.getRoutes().contains(routeEntry)); | 282 | + assertTrue(router.getRoutes4().contains(routeEntry)); |
283 | assertEquals(intentSynchronizer.getRouteIntents().size(), 1); | 283 | assertEquals(intentSynchronizer.getRouteIntents().size(), 1); |
284 | Intent firstIntent = | 284 | Intent firstIntent = |
285 | intentSynchronizer.getRouteIntents().iterator().next(); | 285 | intentSynchronizer.getRouteIntents().iterator().next(); |
... | @@ -349,8 +349,8 @@ public class RouterTest extends AbstractIntentTest { | ... | @@ -349,8 +349,8 @@ public class RouterTest extends AbstractIntentTest { |
349 | router.processRouteUpdates(Collections.<RouteUpdate>singletonList(routeUpdate)); | 349 | router.processRouteUpdates(Collections.<RouteUpdate>singletonList(routeUpdate)); |
350 | 350 | ||
351 | // Verify | 351 | // Verify |
352 | - assertEquals(router.getRoutes().size(), 1); | 352 | + assertEquals(router.getRoutes4().size(), 1); |
353 | - assertTrue(router.getRoutes().contains(routeEntryUpdate)); | 353 | + assertTrue(router.getRoutes4().contains(routeEntryUpdate)); |
354 | assertEquals(intentSynchronizer.getRouteIntents().size(), 1); | 354 | assertEquals(intentSynchronizer.getRouteIntents().size(), 1); |
355 | Intent firstIntent = | 355 | Intent firstIntent = |
356 | intentSynchronizer.getRouteIntents().iterator().next(); | 356 | intentSynchronizer.getRouteIntents().iterator().next(); |
... | @@ -393,7 +393,7 @@ public class RouterTest extends AbstractIntentTest { | ... | @@ -393,7 +393,7 @@ public class RouterTest extends AbstractIntentTest { |
393 | router.processRouteUpdates(Collections.<RouteUpdate>singletonList(routeUpdate)); | 393 | router.processRouteUpdates(Collections.<RouteUpdate>singletonList(routeUpdate)); |
394 | 394 | ||
395 | // Verify | 395 | // Verify |
396 | - assertEquals(router.getRoutes().size(), 0); | 396 | + assertEquals(router.getRoutes4().size(), 0); |
397 | assertEquals(intentSynchronizer.getRouteIntents().size(), 0); | 397 | assertEquals(intentSynchronizer.getRouteIntents().size(), 0); |
398 | verify(intentService); | 398 | verify(intentService); |
399 | } | 399 | } |
... | @@ -422,8 +422,8 @@ public class RouterTest extends AbstractIntentTest { | ... | @@ -422,8 +422,8 @@ public class RouterTest extends AbstractIntentTest { |
422 | router.processRouteUpdates(Collections.<RouteUpdate>singletonList(routeUpdate)); | 422 | router.processRouteUpdates(Collections.<RouteUpdate>singletonList(routeUpdate)); |
423 | 423 | ||
424 | // Verify | 424 | // Verify |
425 | - assertEquals(router.getRoutes().size(), 1); | 425 | + assertEquals(router.getRoutes4().size(), 1); |
426 | - assertTrue(router.getRoutes().contains(routeEntry)); | 426 | + assertTrue(router.getRoutes4().contains(routeEntry)); |
427 | assertEquals(intentSynchronizer.getRouteIntents().size(), 0); | 427 | assertEquals(intentSynchronizer.getRouteIntents().size(), 0); |
428 | verify(intentService); | 428 | verify(intentService); |
429 | } | 429 | } | ... | ... |
... | @@ -59,10 +59,10 @@ import org.onosproject.sdnip.config.BgpPeer; | ... | @@ -59,10 +59,10 @@ import org.onosproject.sdnip.config.BgpPeer; |
59 | import org.onosproject.sdnip.config.Interface; | 59 | import org.onosproject.sdnip.config.Interface; |
60 | import org.onosproject.sdnip.config.SdnIpConfigurationService; | 60 | import org.onosproject.sdnip.config.SdnIpConfigurationService; |
61 | import org.onlab.packet.Ethernet; | 61 | import org.onlab.packet.Ethernet; |
62 | -import org.onlab.packet.Ip4Address; | ||
63 | -import org.onlab.packet.Ip4Prefix; | ||
64 | import org.onlab.packet.IpAddress; | 62 | import org.onlab.packet.IpAddress; |
65 | import org.onlab.packet.IpPrefix; | 63 | import org.onlab.packet.IpPrefix; |
64 | +import org.onlab.packet.Ip4Address; | ||
65 | +import org.onlab.packet.Ip4Prefix; | ||
66 | import org.onlab.packet.MacAddress; | 66 | import org.onlab.packet.MacAddress; |
67 | 67 | ||
68 | import com.google.common.collect.Sets; | 68 | import com.google.common.collect.Sets; |
... | @@ -226,7 +226,7 @@ public class SdnIpTest extends AbstractIntentTest { | ... | @@ -226,7 +226,7 @@ public class SdnIpTest extends AbstractIntentTest { |
226 | reset(intentService); | 226 | reset(intentService); |
227 | 227 | ||
228 | for (RouteUpdate update : routeUpdates) { | 228 | for (RouteUpdate update : routeUpdates) { |
229 | - Ip4Address nextHopAddress = update.routeEntry().nextHop(); | 229 | + IpAddress nextHopAddress = update.routeEntry().nextHop(); |
230 | 230 | ||
231 | // Find out the egress ConnectPoint | 231 | // Find out the egress ConnectPoint |
232 | ConnectPoint egressConnectPoint = getConnectPoint(nextHopAddress); | 232 | ConnectPoint egressConnectPoint = getConnectPoint(nextHopAddress); |
... | @@ -255,7 +255,7 @@ public class SdnIpTest extends AbstractIntentTest { | ... | @@ -255,7 +255,7 @@ public class SdnIpTest extends AbstractIntentTest { |
255 | 255 | ||
256 | latch.await(5000, TimeUnit.MILLISECONDS); | 256 | latch.await(5000, TimeUnit.MILLISECONDS); |
257 | 257 | ||
258 | - assertEquals(router.getRoutes().size(), numRoutes); | 258 | + assertEquals(router.getRoutes4().size(), numRoutes); |
259 | assertEquals(intentSynchronizer.getRouteIntents().size(), | 259 | assertEquals(intentSynchronizer.getRouteIntents().size(), |
260 | numRoutes); | 260 | numRoutes); |
261 | 261 | ||
... | @@ -286,7 +286,7 @@ public class SdnIpTest extends AbstractIntentTest { | ... | @@ -286,7 +286,7 @@ public class SdnIpTest extends AbstractIntentTest { |
286 | reset(intentService); | 286 | reset(intentService); |
287 | 287 | ||
288 | for (RouteUpdate update : routeUpdates) { | 288 | for (RouteUpdate update : routeUpdates) { |
289 | - Ip4Address nextHopAddress = update.routeEntry().nextHop(); | 289 | + IpAddress nextHopAddress = update.routeEntry().nextHop(); |
290 | 290 | ||
291 | // Find out the egress ConnectPoint | 291 | // Find out the egress ConnectPoint |
292 | ConnectPoint egressConnectPoint = getConnectPoint(nextHopAddress); | 292 | ConnectPoint egressConnectPoint = getConnectPoint(nextHopAddress); |
... | @@ -333,7 +333,7 @@ public class SdnIpTest extends AbstractIntentTest { | ... | @@ -333,7 +333,7 @@ public class SdnIpTest extends AbstractIntentTest { |
333 | 333 | ||
334 | deleteCount.await(5000, TimeUnit.MILLISECONDS); | 334 | deleteCount.await(5000, TimeUnit.MILLISECONDS); |
335 | 335 | ||
336 | - assertEquals(0, router.getRoutes().size()); | 336 | + assertEquals(0, router.getRoutes4().size()); |
337 | assertEquals(0, intentSynchronizer.getRouteIntents().size()); | 337 | assertEquals(0, intentSynchronizer.getRouteIntents().size()); |
338 | verify(intentService); | 338 | verify(intentService); |
339 | } | 339 | } | ... | ... |
... | @@ -303,7 +303,7 @@ public class BgpSessionManagerTest { | ... | @@ -303,7 +303,7 @@ public class BgpSessionManagerTest { |
303 | private Collection<BgpRouteEntry> waitForBgpRibIn(BgpSession bgpSession, | 303 | private Collection<BgpRouteEntry> waitForBgpRibIn(BgpSession bgpSession, |
304 | long expectedRoutes) | 304 | long expectedRoutes) |
305 | throws InterruptedException { | 305 | throws InterruptedException { |
306 | - Collection<BgpRouteEntry> bgpRibIn = bgpSession.bgpRibIn4().values(); | 306 | + Collection<BgpRouteEntry> bgpRibIn = bgpSession.getBgpRibIn4(); |
307 | 307 | ||
308 | final int maxChecks = 500; // Max wait of 5 seconds | 308 | final int maxChecks = 500; // Max wait of 5 seconds |
309 | for (int i = 0; i < maxChecks; i++) { | 309 | for (int i = 0; i < maxChecks; i++) { |
... | @@ -311,7 +311,7 @@ public class BgpSessionManagerTest { | ... | @@ -311,7 +311,7 @@ public class BgpSessionManagerTest { |
311 | break; | 311 | break; |
312 | } | 312 | } |
313 | Thread.sleep(10); | 313 | Thread.sleep(10); |
314 | - bgpRibIn = bgpSession.bgpRibIn4().values(); | 314 | + bgpRibIn = bgpSession.getBgpRibIn4(); |
315 | } | 315 | } |
316 | 316 | ||
317 | return bgpRibIn; | 317 | return bgpRibIn; |
... | @@ -329,7 +329,8 @@ public class BgpSessionManagerTest { | ... | @@ -329,7 +329,8 @@ public class BgpSessionManagerTest { |
329 | */ | 329 | */ |
330 | private Collection<BgpRouteEntry> waitForBgpRoutes(long expectedRoutes) | 330 | private Collection<BgpRouteEntry> waitForBgpRoutes(long expectedRoutes) |
331 | throws InterruptedException { | 331 | throws InterruptedException { |
332 | - Collection<BgpRouteEntry> bgpRoutes = bgpSessionManager.getBgpRoutes(); | 332 | + Collection<BgpRouteEntry> bgpRoutes = |
333 | + bgpSessionManager.getBgpRoutes4(); | ||
333 | 334 | ||
334 | final int maxChecks = 500; // Max wait of 5 seconds | 335 | final int maxChecks = 500; // Max wait of 5 seconds |
335 | for (int i = 0; i < maxChecks; i++) { | 336 | for (int i = 0; i < maxChecks; i++) { |
... | @@ -337,7 +338,7 @@ public class BgpSessionManagerTest { | ... | @@ -337,7 +338,7 @@ public class BgpSessionManagerTest { |
337 | break; | 338 | break; |
338 | } | 339 | } |
339 | Thread.sleep(10); | 340 | Thread.sleep(10); |
340 | - bgpRoutes = bgpSessionManager.getBgpRoutes(); | 341 | + bgpRoutes = bgpSessionManager.getBgpRoutes4(); |
341 | } | 342 | } |
342 | 343 | ||
343 | return bgpRoutes; | 344 | return bgpRoutes; | ... | ... |
-
Please register or login to post a comment