- logger.debug(
- "Sending ARP Reply with src {}/{}, target {}/{}",
- new Object[] { sourceMAC, sourceIP,
- host.getDataLayerAddressBytes(),
- host.getNetworkAddress() });
- sendARPReply(host.getnodeConnector(), sourceMAC, sourceIP,
- host.getDataLayerAddressBytes(), host.getNetworkAddress());
+ log.trace("Sending ARP Reply with src {}/{}, target {}/{}",
+ new Object[] { sourceMAC, sourceIP, host.getDataLayerAddressBytes(), host.getNetworkAddress() });
+
+ if (connectionManager.isLocal(host.getnodeconnectorNode())){
+ sendARPReply(host.getnodeConnector(),
+ sourceMAC,
+ sourceIP,
+ host.getDataLayerAddressBytes(),
+ host.getNetworkAddress());
+ } else {
+ arpRequestReplyEvent.put(
+ new ARPReply(
+ host.getnodeConnector(),
+ sourceIP,
+ sourceMAC,
+ host.getNetworkAddress(),
+ host.getDataLayerAddressBytes()), false);
+ }
+ }
+ }
+
+
+ @Override
+ public void entryUpdated(ARPEvent key, Boolean new_value, String cacheName, boolean originLocal) {
+ if (key instanceof ARPRequest) {
+ ARPRequest req = (ARPRequest) key;
+ // If broadcast request
+ if (req.getHost() == null) {
+ sendBcastARPRequest(req.getTargetIP(), req.getSubnet());
+
+ //If unicast and local, send reply
+ } else if (connectionManager.isLocal(req.getHost().getnodeconnectorNode())) {
+ sendUcastARPRequest(req.getHost(), req.getSubnet());
+ }
+ } else if (key instanceof ARPReply) {
+ ARPReply rep = (ARPReply) key;
+ // New reply received by controller, notify all awaiting requestors across the cluster
+ if (new_value) {
+ generateAndSendReply(rep.getTargetIP(), rep.getTargetMac());
+
+ // Otherwise, a specific reply. If local, send out.
+ } else if (connectionManager.isLocal(rep.getPort().getNode())) {
+ sendARPReply(rep.getPort(),
+ rep.getSourceMac(),
+ rep.getSourceIP(),
+ rep.getTargetMac(),
+ rep.getTargetIP());
+ }