Use pair link before the 2nd location of a dual-homed host is not discovered
In addition,
- Improve host added log message
- Improve false cache eviction log message
Change-Id: Iece05d4a2ba76a3da4ad736c4e072ced43fecacc
(cherry picked from commit 9ff637e3089ae2160f53eab52e9cec2ec6ef4c46)
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/HostHandler.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/HostHandler.java
index 7a205ee..539af62 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/HostHandler.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/HostHandler.java
@@ -86,20 +86,36 @@
void processHostAddedAtLocation(Host host, HostLocation location) {
checkArgument(host.locations().contains(location), "{} is not a location of {}", location, host);
- if (!srManager.isMasterOf(location)) {
- return;
- }
-
- MacAddress mac = host.mac();
- VlanId vlanId = host.vlan();
+ MacAddress hostMac = host.mac();
+ VlanId hostVlanId = host.vlan();
Set<HostLocation> locations = host.locations();
Set<IpAddress> ips = host.ipAddresses();
- log.info("Host {}/{} is added at {}", mac, vlanId, locations);
+ log.info("Host {}/{} is added at {}", hostMac, hostVlanId, locations);
- processBridgingRule(location.deviceId(), location.port(), mac, vlanId, false);
- ips.forEach(ip ->
- processRoutingRule(location.deviceId(), location.port(), mac, vlanId, ip, false)
- );
+ if (srManager.isMasterOf(location)) {
+ processBridgingRule(location.deviceId(), location.port(), hostMac, hostVlanId, false);
+ ips.forEach(ip ->
+ processRoutingRule(location.deviceId(), location.port(), hostMac, hostVlanId, ip, false)
+ );
+ }
+
+ // Use the pair link temporarily before the second location of a dual-homed host shows up.
+ // This do not affect single-homed hosts since the flow will be blocked in
+ // processBridgingRule or processRoutingRule due to VLAN or IP mismatch respectively
+ srManager.getPairDeviceId(location.deviceId()).ifPresent(pairDeviceId -> {
+ if (srManager.mastershipService.isLocalMaster(pairDeviceId) &&
+ host.locations().stream().noneMatch(l -> l.deviceId().equals(pairDeviceId))) {
+ srManager.getPairLocalPorts(pairDeviceId).ifPresent(pairRemotePort -> {
+ // NOTE: Since the pairLocalPort is trunk port, use assigned vlan of original port
+ // when the host is untagged
+ VlanId vlanId = Optional.ofNullable(srManager.getInternalVlanId(location)).orElse(hostVlanId);
+
+ processBridgingRule(pairDeviceId, pairRemotePort, hostMac, vlanId, false);
+ ips.forEach(ip -> processRoutingRule(pairDeviceId, pairRemotePort, hostMac, vlanId,
+ ip, false));
+ });
+ }
+ });
}
void processHostRemovedEvent(HostEvent event) {