Work toward IPv6 support in BGP: implement decoding of the
BGP UPDATE attributes: MP_REACH_NLRI and MP_UNREACH_NLRI (RFC 4760). Note: currently, the IPv6 NLRI is decoded, but it not used. This work is in the context of ONOS-422. Change-Id: Ia61b94dedfe0b1a7d7f563e805a3086f56d4da03
Showing
5 changed files
with
107 additions
and
23 deletions
... | @@ -376,6 +376,46 @@ public final class BgpConstants { | ... | @@ -376,6 +376,46 @@ public final class BgpConstants { |
376 | /** BGP UPDATE Attributes Type Code AGGREGATOR length. */ | 376 | /** BGP UPDATE Attributes Type Code AGGREGATOR length. */ |
377 | public static final int LENGTH = 6; | 377 | public static final int LENGTH = 6; |
378 | } | 378 | } |
379 | + | ||
380 | + /** | ||
381 | + * BGP UPDATE: MP_REACH_NLRI related constants. | ||
382 | + */ | ||
383 | + public static final class MpReachNlri { | ||
384 | + /** | ||
385 | + * Default constructor. | ||
386 | + * <p> | ||
387 | + * The constructor is private to prevent creating an instance of | ||
388 | + * this utility class. | ||
389 | + */ | ||
390 | + private MpReachNlri() { | ||
391 | + } | ||
392 | + | ||
393 | + /** BGP UPDATE Attributes Type Code MP_REACH_NLRI. */ | ||
394 | + public static final int TYPE = 14; | ||
395 | + | ||
396 | + /** BGP UPDATE Attributes Type Code MP_REACH_NLRI min length. */ | ||
397 | + public static final int MIN_LENGTH = 5; | ||
398 | + } | ||
399 | + | ||
400 | + /** | ||
401 | + * BGP UPDATE: MP_UNREACH_NLRI related constants. | ||
402 | + */ | ||
403 | + public static final class MpUnreachNlri { | ||
404 | + /** | ||
405 | + * Default constructor. | ||
406 | + * <p> | ||
407 | + * The constructor is private to prevent creating an instance of | ||
408 | + * this utility class. | ||
409 | + */ | ||
410 | + private MpUnreachNlri() { | ||
411 | + } | ||
412 | + | ||
413 | + /** BGP UPDATE Attributes Type Code MP_UNREACH_NLRI. */ | ||
414 | + public static final int TYPE = 15; | ||
415 | + | ||
416 | + /** BGP UPDATE Attributes Type Code MP_UNREACH_NLRI min length. */ | ||
417 | + public static final int MIN_LENGTH = 3; | ||
418 | + } | ||
379 | } | 419 | } |
380 | 420 | ||
381 | /** | 421 | /** | ... | ... |
... | @@ -36,6 +36,7 @@ import org.jboss.netty.util.Timer; | ... | @@ -36,6 +36,7 @@ import org.jboss.netty.util.Timer; |
36 | import org.jboss.netty.util.TimerTask; | 36 | import org.jboss.netty.util.TimerTask; |
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.onosproject.sdnip.bgp.BgpConstants.Notifications; | 40 | import org.onosproject.sdnip.bgp.BgpConstants.Notifications; |
40 | import org.onosproject.sdnip.bgp.BgpConstants.Notifications.HoldTimerExpired; | 41 | import org.onosproject.sdnip.bgp.BgpConstants.Notifications.HoldTimerExpired; |
41 | import org.slf4j.Logger; | 42 | import org.slf4j.Logger; |
... | @@ -62,6 +63,8 @@ public class BgpSession extends SimpleChannelHandler { | ... | @@ -62,6 +63,8 @@ public class BgpSession extends SimpleChannelHandler { |
62 | private long remoteAs4Octet; // 4 octets | 63 | private long remoteAs4Octet; // 4 octets |
63 | private long remoteHoldtime; // 2 octets | 64 | private long remoteHoldtime; // 2 octets |
64 | private Ip4Address remoteBgpId; // 4 octets -> IPv4 address | 65 | private Ip4Address remoteBgpId; // 4 octets -> IPv4 address |
66 | + private boolean remoteMpExtensions; // Peer Multiprotocol | ||
67 | + // Extensions enabled: RFC 4760 | ||
65 | private boolean remoteIpv4Unicast; // Peer IPv4/UNICAST AFI/SAFI | 68 | private boolean remoteIpv4Unicast; // Peer IPv4/UNICAST AFI/SAFI |
66 | private boolean remoteIpv4Multicast; // Peer IPv4/MULTICAST AFI/SAFI | 69 | private boolean remoteIpv4Multicast; // Peer IPv4/MULTICAST AFI/SAFI |
67 | private boolean remoteIpv6Unicast; // Peer IPv6/UNICAST AFI/SAFI | 70 | private boolean remoteIpv6Unicast; // Peer IPv6/UNICAST AFI/SAFI |
... | @@ -74,6 +77,8 @@ public class BgpSession extends SimpleChannelHandler { | ... | @@ -74,6 +77,8 @@ public class BgpSession extends SimpleChannelHandler { |
74 | private long localAs; // 2 octets | 77 | private long localAs; // 2 octets |
75 | private long localHoldtime; // 2 octets | 78 | private long localHoldtime; // 2 octets |
76 | private Ip4Address localBgpId; // 4 octets -> IPv4 address | 79 | private Ip4Address localBgpId; // 4 octets -> IPv4 address |
80 | + private boolean localMpExtensions; // Local Multiprotocol | ||
81 | + // Extensions enabled: RFC 4760 | ||
77 | private boolean localIpv4Unicast; // Local IPv4/UNICAST AFI/SAFI | 82 | private boolean localIpv4Unicast; // Local IPv4/UNICAST AFI/SAFI |
78 | private boolean localIpv4Multicast; // Local IPv4/MULTICAST AFI/SAFI | 83 | private boolean localIpv4Multicast; // Local IPv4/MULTICAST AFI/SAFI |
79 | private boolean localIpv6Unicast; // Local IPv6/UNICAST AFI/SAFI | 84 | private boolean localIpv6Unicast; // Local IPv6/UNICAST AFI/SAFI |
... | @@ -88,7 +93,9 @@ public class BgpSession extends SimpleChannelHandler { | ... | @@ -88,7 +93,9 @@ public class BgpSession extends SimpleChannelHandler { |
88 | private volatile Timeout sessionTimeout; // Session timeout | 93 | private volatile Timeout sessionTimeout; // Session timeout |
89 | 94 | ||
90 | // BGP RIB-IN routing entries from this peer | 95 | // BGP RIB-IN routing entries from this peer |
91 | - private ConcurrentMap<Ip4Prefix, BgpRouteEntry> bgpRibIn = | 96 | + private ConcurrentMap<Ip4Prefix, BgpRouteEntry> bgpRibIn4 = |
97 | + new ConcurrentHashMap<>(); | ||
98 | + private ConcurrentMap<Ip6Prefix, BgpRouteEntry> bgpRibIn6 = | ||
92 | new ConcurrentHashMap<>(); | 99 | new ConcurrentHashMap<>(); |
93 | 100 | ||
94 | /** | 101 | /** |
... | @@ -113,22 +120,41 @@ public class BgpSession extends SimpleChannelHandler { | ... | @@ -113,22 +120,41 @@ public class BgpSession extends SimpleChannelHandler { |
113 | } | 120 | } |
114 | 121 | ||
115 | /** | 122 | /** |
116 | - * Gets the BGP RIB-IN routing entries. | 123 | + * Gets the BGP RIB-IN IPv4 routing entries. |
124 | + * | ||
125 | + * @return the BGP RIB-IN IPv4 routing entries | ||
126 | + */ | ||
127 | + public Map<Ip4Prefix, BgpRouteEntry> bgpRibIn4() { | ||
128 | + return bgpRibIn4; | ||
129 | + } | ||
130 | + | ||
131 | + /** | ||
132 | + * Gets the BGP RIB-IN IPv6 routing entries. | ||
117 | * | 133 | * |
118 | - * @return the BGP RIB-IN routing entries | 134 | + * @return the BGP RIB-IN IPv6 routing entries |
119 | */ | 135 | */ |
120 | - public Map<Ip4Prefix, BgpRouteEntry> bgpRibIn() { | 136 | + public Map<Ip6Prefix, BgpRouteEntry> bgpRibIn6() { |
121 | - return bgpRibIn; | 137 | + return bgpRibIn6; |
122 | } | 138 | } |
123 | 139 | ||
124 | /** | 140 | /** |
125 | - * Finds a BGP routing entry in the BGP RIB-IN. | 141 | + * Finds a BGP IPv4 routing entry in the BGP RIB-IN. |
126 | * | 142 | * |
127 | - * @param prefix the prefix of the route to search for | 143 | + * @param prefix the IPv4 prefix of the route to search for |
128 | - * @return the BGP routing entry if found, otherwise null | 144 | + * @return the IPv4 BGP routing entry if found, otherwise null |
129 | */ | 145 | */ |
130 | public BgpRouteEntry findBgpRouteEntry(Ip4Prefix prefix) { | 146 | public BgpRouteEntry findBgpRouteEntry(Ip4Prefix prefix) { |
131 | - return bgpRibIn.get(prefix); | 147 | + return bgpRibIn4.get(prefix); |
148 | + } | ||
149 | + | ||
150 | + /** | ||
151 | + * Finds a BGP IPv6 routing entry in the BGP RIB-IN. | ||
152 | + * | ||
153 | + * @param prefix the IPv6 prefix of the route to search for | ||
154 | + * @return the IPv6 BGP routing entry if found, otherwise null | ||
155 | + */ | ||
156 | + public BgpRouteEntry findBgpRouteEntry(Ip6Prefix prefix) { | ||
157 | + return bgpRibIn6.get(prefix); | ||
132 | } | 158 | } |
133 | 159 | ||
134 | /** | 160 | /** |
... | @@ -256,6 +282,16 @@ public class BgpSession extends SimpleChannelHandler { | ... | @@ -256,6 +282,16 @@ public class BgpSession extends SimpleChannelHandler { |
256 | } | 282 | } |
257 | 283 | ||
258 | /** | 284 | /** |
285 | + * Gets the BGP Multiprotocol Extensions for the session. | ||
286 | + * | ||
287 | + * @return true if the BGP Multiprotocol Extensions are enabled for the | ||
288 | + * session, otherwise false | ||
289 | + */ | ||
290 | + public boolean getMpExtensions() { | ||
291 | + return remoteMpExtensions && localMpExtensions; | ||
292 | + } | ||
293 | + | ||
294 | + /** | ||
259 | * Gets the BGP session remote AFI/SAFI configuration for IPv4 unicast. | 295 | * Gets the BGP session remote AFI/SAFI configuration for IPv4 unicast. |
260 | * | 296 | * |
261 | * @return the BGP session remote AFI/SAFI configuration for IPv4 unicast | 297 | * @return the BGP session remote AFI/SAFI configuration for IPv4 unicast |
... | @@ -268,10 +304,11 @@ public class BgpSession extends SimpleChannelHandler { | ... | @@ -268,10 +304,11 @@ public class BgpSession extends SimpleChannelHandler { |
268 | * Sets the BGP session remote AFI/SAFI configuration for IPv4 unicast. | 304 | * Sets the BGP session remote AFI/SAFI configuration for IPv4 unicast. |
269 | */ | 305 | */ |
270 | void setRemoteIpv4Unicast() { | 306 | void setRemoteIpv4Unicast() { |
307 | + this.remoteMpExtensions = true; | ||
271 | this.remoteIpv4Unicast = true; | 308 | this.remoteIpv4Unicast = true; |
272 | // Copy the remote AFI/SAFI setting to the local configuration | 309 | // Copy the remote AFI/SAFI setting to the local configuration |
273 | - // NOTE: Uncomment the line below if the AFI/SAFI is supported locally | 310 | + this.localMpExtensions = true; |
274 | - // this.localIpv4Unicast = true; | 311 | + this.localIpv4Unicast = true; |
275 | } | 312 | } |
276 | 313 | ||
277 | /** | 314 | /** |
... | @@ -287,10 +324,11 @@ public class BgpSession extends SimpleChannelHandler { | ... | @@ -287,10 +324,11 @@ public class BgpSession extends SimpleChannelHandler { |
287 | * Sets the BGP session remote AFI/SAFI configuration for IPv4 multicast. | 324 | * Sets the BGP session remote AFI/SAFI configuration for IPv4 multicast. |
288 | */ | 325 | */ |
289 | void setRemoteIpv4Multicast() { | 326 | void setRemoteIpv4Multicast() { |
327 | + this.remoteMpExtensions = true; | ||
290 | this.remoteIpv4Multicast = true; | 328 | this.remoteIpv4Multicast = true; |
291 | // Copy the remote AFI/SAFI setting to the local configuration | 329 | // Copy the remote AFI/SAFI setting to the local configuration |
292 | - // NOTE: Uncomment the line below if the AFI/SAFI is supported locally | 330 | + this.localMpExtensions = true; |
293 | - // this.localIpv4Multicast = true; | 331 | + this.localIpv4Multicast = true; |
294 | } | 332 | } |
295 | 333 | ||
296 | /** | 334 | /** |
... | @@ -306,10 +344,11 @@ public class BgpSession extends SimpleChannelHandler { | ... | @@ -306,10 +344,11 @@ public class BgpSession extends SimpleChannelHandler { |
306 | * Sets the BGP session remote AFI/SAFI configuration for IPv6 unicast. | 344 | * Sets the BGP session remote AFI/SAFI configuration for IPv6 unicast. |
307 | */ | 345 | */ |
308 | void setRemoteIpv6Unicast() { | 346 | void setRemoteIpv6Unicast() { |
347 | + this.remoteMpExtensions = true; | ||
309 | this.remoteIpv6Unicast = true; | 348 | this.remoteIpv6Unicast = true; |
310 | // Copy the remote AFI/SAFI setting to the local configuration | 349 | // Copy the remote AFI/SAFI setting to the local configuration |
311 | - // NOTE: Uncomment the line below if the AFI/SAFI is supported locally | 350 | + this.localMpExtensions = true; |
312 | - // this.localIpv6Unicast = true; | 351 | + this.localIpv6Unicast = true; |
313 | } | 352 | } |
314 | 353 | ||
315 | /** | 354 | /** |
... | @@ -325,10 +364,11 @@ public class BgpSession extends SimpleChannelHandler { | ... | @@ -325,10 +364,11 @@ public class BgpSession extends SimpleChannelHandler { |
325 | * Sets the BGP session remote AFI/SAFI configuration for IPv6 multicast. | 364 | * Sets the BGP session remote AFI/SAFI configuration for IPv6 multicast. |
326 | */ | 365 | */ |
327 | void setRemoteIpv6Multicast() { | 366 | void setRemoteIpv6Multicast() { |
367 | + this.remoteMpExtensions = true; | ||
328 | this.remoteIpv6Multicast = true; | 368 | this.remoteIpv6Multicast = true; |
329 | // Copy the remote AFI/SAFI setting to the local configuration | 369 | // Copy the remote AFI/SAFI setting to the local configuration |
330 | - // NOTE: Uncomment the line below if the AFI/SAFI is supported locally | 370 | + this.localMpExtensions = true; |
331 | - // this.localIpv6Multicast = true; | 371 | + this.localIpv6Multicast = true; |
332 | } | 372 | } |
333 | 373 | ||
334 | /** | 374 | /** |
... | @@ -576,14 +616,17 @@ public class BgpSession extends SimpleChannelHandler { | ... | @@ -576,14 +616,17 @@ public class BgpSession extends SimpleChannelHandler { |
576 | // for further processing. Otherwise, the BGP Decision Process | 616 | // for further processing. Otherwise, the BGP Decision Process |
577 | // will use those routes again. | 617 | // will use those routes again. |
578 | // | 618 | // |
579 | - Collection<BgpRouteEntry> deletedRoutes = bgpRibIn.values(); | 619 | + Collection<BgpRouteEntry> deletedRoutes4 = bgpRibIn4.values(); |
580 | - bgpRibIn = new ConcurrentHashMap<>(); | 620 | + Collection<BgpRouteEntry> deletedRoutes6 = bgpRibIn6.values(); |
621 | + bgpRibIn4 = new ConcurrentHashMap<>(); | ||
622 | + bgpRibIn6 = new ConcurrentHashMap<>(); | ||
581 | 623 | ||
582 | // Push the updates to the BGP Merged RIB | 624 | // Push the updates to the BGP Merged RIB |
583 | BgpSessionManager.BgpRouteSelector bgpRouteSelector = | 625 | BgpSessionManager.BgpRouteSelector bgpRouteSelector = |
584 | bgpSessionManager.getBgpRouteSelector(); | 626 | bgpSessionManager.getBgpRouteSelector(); |
585 | Collection<BgpRouteEntry> addedRoutes = Collections.emptyList(); | 627 | Collection<BgpRouteEntry> addedRoutes = Collections.emptyList(); |
586 | - bgpRouteSelector.routeUpdates(this, addedRoutes, deletedRoutes); | 628 | + bgpRouteSelector.routeUpdates(this, addedRoutes, deletedRoutes4); |
629 | + bgpRouteSelector.routeUpdates(this, addedRoutes, deletedRoutes6); | ||
587 | 630 | ||
588 | bgpSessionManager.peerDisconnected(this); | 631 | bgpSessionManager.peerDisconnected(this); |
589 | } | 632 | } | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -81,7 +81,8 @@ public class BgpRoutesListCommand extends AbstractShellCommand { | ... | @@ -81,7 +81,8 @@ public class BgpRoutesListCommand extends AbstractShellCommand { |
81 | 81 | ||
82 | // Print the routes | 82 | // Print the routes |
83 | if (foundBgpSession != null) { | 83 | if (foundBgpSession != null) { |
84 | - printRoutes(foundBgpSession.bgpRibIn().values()); | 84 | + printRoutes(foundBgpSession.bgpRibIn4().values()); |
85 | + printRoutes(foundBgpSession.bgpRibIn6().values()); | ||
85 | } else { | 86 | } else { |
86 | printRoutes(service.getBgpRoutes()); | 87 | printRoutes(service.getBgpRoutes()); |
87 | } | 88 | } | ... | ... |
... | @@ -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.bgpRibIn().values(); | 306 | + Collection<BgpRouteEntry> bgpRibIn = bgpSession.bgpRibIn4().values(); |
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.bgpRibIn().values(); | 314 | + bgpRibIn = bgpSession.bgpRibIn4().values(); |
315 | } | 315 | } |
316 | 316 | ||
317 | return bgpRibIn; | 317 | return bgpRibIn; | ... | ... |
-
Please register or login to post a comment