Fix: handles ARP Reply msg only if it is received by gateway node
Change-Id: I3a434fac506ba4aaffeb6eb1bc9bfa1a1f2231e5
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
index dced0df..5736e88 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
@@ -39,6 +39,7 @@
import org.onosproject.cluster.NodeId;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
+import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DeviceId;
import org.onosproject.net.Host;
import org.onosproject.net.PortNumber;
@@ -268,23 +269,41 @@
}
if (arp.getOpCode() == ARP.OP_REPLY) {
- PortNumber receivedPortNum = context.inPacket().receivedFrom().port();
- log.debug("ARP reply ip: {}, mac: {}",
- Ip4Address.valueOf(arp.getSenderProtocolAddress()),
- MacAddress.valueOf(arp.getSenderHardwareAddress()));
+ ConnectPoint cp = context.inPacket().receivedFrom();
+ PortNumber receivedPortNum = cp.port();
+ IpAddress spa = Ip4Address.valueOf(arp.getSenderProtocolAddress());
+ MacAddress sha = MacAddress.valueOf(arp.getSenderHardwareAddress());
+
+ log.debug("ARP reply ip: {}, mac: {}", spa, sha);
+
try {
- if (receivedPortNum.equals(
- osNodeService.node(context.inPacket().receivedFrom()
- .deviceId()).uplinkPortNum())) {
- osNetworkAdminService.updateExternalPeerRouterMac(
- Ip4Address.valueOf(arp.getSenderProtocolAddress()),
- MacAddress.valueOf(arp.getSenderHardwareAddress()));
+
+ Set<String> fipSet = osRouterService.floatingIps().stream()
+ .map(NetFloatingIP::getFloatingIpAddress).collect(Collectors.toSet());
+
+ // if the SPA is floating IP, we simply ignores it
+ if (fipSet.contains(spa.toString())) {
+ return;
+ }
+
+ OpenstackNode node = osNodeService.node(cp.deviceId());
+
+ if (node == null) {
+ return;
+ }
+
+ // we only handles the ARP-Reply message received by gateway node
+ if (node.type() != GATEWAY) {
+ return;
+ }
+
+ if (receivedPortNum.equals(node.uplinkPortNum())) {
+ osNetworkAdminService.updateExternalPeerRouterMac(spa, sha);
}
} catch (Exception e) {
- log.error("Exception occurred because of {}", e.toString());
+ log.error("Exception occurred because of {}", e);
}
}
-
}
private class InternalPacketProcessor implements PacketProcessor {