Ejemplo n.º 1
0
 @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);
     }
   }
 }
Ejemplo n.º 2
0
  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;
  }
Ejemplo n.º 3
0
  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;
  }