Adding a few checks in SR to ignore link events for links
that should not be allowed.
Change-Id: I3e4042e20de899f426f508d8307808c48325a18d
diff --git a/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java b/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
index 7a17d39..6bcfd99 100644
--- a/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
@@ -1240,12 +1240,7 @@
private void processLinkAdded(Link link) {
log.info("** LINK ADDED {}", link.toString());
- if (link.type() != Link.Type.DIRECT) {
- // NOTE: A DIRECT link might be transiently marked as INDIRECT
- // if BDDP is received before LLDP. We can safely ignore that
- // until the LLDP is received and the link is marked as DIRECT.
- log.info("Ignore link {}->{}. Link type is {} instead of DIRECT.",
- link.src(), link.dst(), link.type());
+ if (!isLinkValid(link)) {
return;
}
if (!deviceConfiguration.isConfigured(link.src().deviceId())) {
@@ -1320,6 +1315,9 @@
private void processLinkRemoved(Link link) {
log.info("** LINK REMOVED {}", link.toString());
+ if (!isLinkValid(link)) {
+ return;
+ }
defaultRoutingHandler.populateRoutingRulesForLinkStatusChange(link, null, null);
// update local groupHandler stores
@@ -1345,6 +1343,58 @@
l2TunnelHandler.processLinkDown(link);
}
+ private boolean isLinkValid(Link link) {
+ if (link.type() != Link.Type.DIRECT) {
+ // NOTE: A DIRECT link might be transiently marked as INDIRECT
+ // if BDDP is received before LLDP. We can safely ignore that
+ // until the LLDP is received and the link is marked as DIRECT.
+ log.info("Ignore link {}->{}. Link type is {} instead of DIRECT.",
+ link.src(), link.dst(), link.type());
+ return false;
+ }
+ DeviceId srcId = link.src().deviceId();
+ DeviceId dstId = link.dst().deviceId();
+ if (srcId.equals(dstId)) {
+ log.warn("Links between ports on the same switch are not "
+ + "allowed .. ignoring link {}", link);
+ return false;
+ }
+ try {
+ if (!deviceConfiguration.isEdgeDevice(srcId)
+ && !deviceConfiguration.isEdgeDevice(dstId)) {
+ // ignore links between spines
+ // XXX revisit when handling multi-stage fabrics
+ log.warn("Links between spines not allowed...ignoring "
+ + "link {}", link);
+ return false;
+ }
+ if (deviceConfiguration.isEdgeDevice(srcId)
+ && deviceConfiguration.isEdgeDevice(dstId)) {
+ // ignore links between leaves if they are not pair-links
+ // XXX revisit if removing pair-link config or allowing more than
+ // one pair-link
+ if (deviceConfiguration.getPairDeviceId(srcId).equals(dstId)
+ && deviceConfiguration.getPairLocalPort(srcId)
+ .equals(link.src().port())
+ && deviceConfiguration.getPairLocalPort(dstId)
+ .equals(link.dst().port())) {
+ // found pair link - allow it
+ return true;
+ } else {
+ log.warn("Links between leaves other than pair-links are "
+ + "not allowed...ignoring link {}", link);
+ return false;
+ }
+ }
+ } catch (DeviceConfigNotFoundException e) {
+ // We still want to count the links in seenLinks even though there
+ // is no config. So we let it return true
+ log.warn("Could not check validity of link {} as subtending devices "
+ + "are not yet configured", link);
+ }
+ return true;
+ }
+
private void processDeviceAdded(Device device) {
log.info("** DEVICE ADDED with ID {}", device.id());