blob: 551dec633396285e83516f1521fafa06ecde875e [file] [log] [blame]
package org.onlab.onos.net.host.impl;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.jboss.netty.util.Timeout;
import org.jboss.netty.util.TimerTask;
import org.onlab.onos.net.Device;
import org.onlab.onos.net.Host;
import org.onlab.onos.net.Port;
import org.onlab.onos.net.device.DeviceService;
import org.onlab.onos.net.host.HostProvider;
import org.onlab.onos.net.host.HostService;
import org.onlab.onos.net.packet.PacketProvider;
import org.onlab.onos.net.topology.TopologyService;
import org.onlab.packet.IpPrefix;
import org.onlab.util.Timer;
public class HostMonitor implements TimerTask {
private final HostService hostService;
private final TopologyService topologyService;
private final DeviceService deviceService;
private final HostProvider hostProvider;
private final PacketProvider packetProvider;
private final Set<IpPrefix> monitoredAddresses;
private final long probeRate;
private Timeout timeout;
public HostMonitor(HostService hostService, TopologyService topologyService,
DeviceService deviceService,
HostProvider hostProvider, PacketProvider packetProvider) {
this.hostService = hostService;
this.topologyService = topologyService;
this.deviceService = deviceService;
this.hostProvider = hostProvider;
this.packetProvider = packetProvider;
monitoredAddresses = new HashSet<>();
probeRate = 30000; // milliseconds
timeout = Timer.getTimer().newTimeout(this, 0, TimeUnit.MILLISECONDS);
}
public void addMonitoringFor(IpPrefix ip) {
monitoredAddresses.add(ip);
}
public void stopMonitoring(IpPrefix ip) {
monitoredAddresses.remove(ip);
}
public void shutdown() {
timeout.cancel();
}
@Override
public void run(Timeout timeout) throws Exception {
for (IpPrefix ip : monitoredAddresses) {
Set<Host> hosts = hostService.getHostsByIp(ip);
if (hosts.isEmpty()) {
sendArpRequest(ip);
} else {
for (Host host : hosts) {
hostProvider.triggerProbe(host);
}
}
}
timeout = Timer.getTimer().newTimeout(this, probeRate, TimeUnit.MILLISECONDS);
}
/**
* Sends an ARP request for the given IP address.
*
* @param targetIp IP address to ARP for
*/
private void sendArpRequest(IpPrefix targetIp) {
// emit ARP packet out appropriate ports
// if ip in one of the configured (external) subnets
// sent out that port
// else (ip isn't in any configured subnet)
// send out all non-external edge ports
for (Device device : deviceService.getDevices()) {
for (Port port : deviceService.getPorts(device.id())) {
for (IpPrefix ip : port.ipAddresses()) {
if (ip.contains(targetIp)) {
sendProbe(port, targetIp);
continue;
}
}
}
}
}
private void sendProbe(Port port, IpPrefix targetIp) {
}
}