@Override public void onPacketReceived(PacketReceived potentialArp) { Arp arp = ArpResolverUtils.getArpFrom(potentialArp); if (arp != null) { if (arp.getOperation() != ArpOperation.REPLY.intValue()) { LOG.trace("Packet is not ARP REPLY packet."); return; } if (LOG.isTraceEnabled()) { LOG.trace("ARP REPLY received - {}", ArpUtils.getArpToStringFormat(arp)); } NodeKey nodeKey = potentialArp.getIngress().getValue().firstKeyOf(Node.class, NodeKey.class); if (nodeKey == null) { LOG.info("Unknown source node of ARP packet: {}", potentialArp); return; } Ipv4Address gatewayIpAddress = ArpUtils.bytesToIp(arp.getSenderProtocolAddress()); MacAddress gatewayMacAddress = ArpUtils.bytesToMac(arp.getSenderHardwareAddress()); ArpResolverMetadata candidateGatewayIp = gatewayToArpMetadataMap.get(gatewayIpAddress); if (candidateGatewayIp != null) { LOG.debug( "Resolved MAC for Gateway Ip {} is {}", gatewayIpAddress.getValue(), gatewayMacAddress.getValue()); candidateGatewayIp.setGatewayMacAddress(gatewayMacAddress); resetFlowToRemove(gatewayIpAddress, candidateGatewayIp); } } }
private ArpResolverMetadata checkAndGetExternalBridgeDpid(ArpResolverMetadata gatewayMetaData) { final Long origDpid = gatewayMetaData.getExternalNetworkBridgeDpid(); // If we are not allowing dpid to change, there is nothing further to do here if (!gatewayMetaData.isRefreshExternalNetworkBridgeDpidIfNeeded()) { return gatewayMetaData; } // If current dpid is null, or if mac is not getting resolved, make an attempt to // grab a different dpid, so a different (or updated) external bridge gets used if (origDpid == null || !gatewayMetaData.isGatewayMacAddressResolved()) { Long newDpid = getAnotherExternalBridgeDpid(origDpid); gatewayMetaData.setExternalNetworkBridgeDpid(newDpid); } return gatewayMetaData; }
private ArpResolverMetadata resetFlowToRemove( final Ipv4Address gatewayIp, ArpResolverMetadata gatewayArpMetadata) { checkNotNull(gatewayIp); // If gatewayArpMetadata was not provided, look it up if (gatewayArpMetadata == null) { gatewayArpMetadata = gatewayToArpMetadataMap.get(gatewayIp); } if (gatewayArpMetadata != null && gatewayArpMetadata.getFlowToRemove() != null) { LOG.debug( "Flow to route ARP Reply to Controller from {} being removed from node {}", gatewayIp, gatewayArpMetadata.getFlowToRemove().getNode()); flowService.removeFlow(gatewayArpMetadata.getFlowToRemove()); gatewayArpMetadata.setFlowToRemove(null); } return gatewayArpMetadata; }