Bug fix for route population optimization
Change-Id: Ibdaeaff86a03a64670e08db45b050af93a092df7
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/RoutingRulePopulator.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/RoutingRulePopulator.java
index cacde7b..f3ccaa0 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/RoutingRulePopulator.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/RoutingRulePopulator.java
@@ -265,7 +265,7 @@
.withPriority(100))
.withFlag(ForwardingObjective.Flag.SPECIFIC);
log.debug("Installing MPLS forwarding objective in switch {}",
- deviceId);
+ deviceId);
srManager.flowObjectiveService.forward(deviceId,
fwdObjBuilder.add());
rulePopulationCounter.incrementAndGet();
@@ -299,15 +299,15 @@
}
if (!isECMPSupportedInTransitRouter() && !config.isEdgeDevice(deviceId)) {
- Link link = selectOneLink(deviceId, nextHops);
+ PortNumber port = selectOnePort(deviceId, nextHops);
DeviceId nextHop = (DeviceId) nextHops.toArray()[0];
- if (link == null) {
+ if (port == null) {
log.warn("No link from {} to {}", deviceId, nextHops);
return null;
}
tbuilder.setEthSrc(config.getDeviceMac(deviceId))
.setEthDst(config.getDeviceMac(nextHop))
- .setOutput(link.src().port());
+ .setOutput(port);
fwdBuilder.withTreatment(tbuilder.build());
} else {
NeighborSet ns = new NeighborSet(nextHops);
@@ -356,13 +356,16 @@
srManager.flowObjectiveService.filter(deviceId, fob.add());
}
- private Link selectOneLink(DeviceId srcId, Set<DeviceId> destIds) {
+ private PortNumber selectOnePort(DeviceId srcId, Set<DeviceId> destIds) {
- Set<Link> links = srManager.linkService.getDeviceEgressLinks(srcId);
- DeviceId destId = (DeviceId) destIds.toArray()[0];
- for (Link link : links) {
- if (link.dst().deviceId().equals(destId)) {
- return link;
+ Set<Link> links = srManager.linkService.getDeviceLinks(srcId);
+ for (DeviceId destId: destIds) {
+ for (Link link : links) {
+ if (link.dst().deviceId().equals(destId)) {
+ return link.src().port();
+ } else if (link.src().deviceId().equals(destId)) {
+ return link.dst().port();
+ }
}
}