blob: ecdb177aa8b40901ba6c7499363c09089776d1cc [file] [log] [blame]
tombe988312014-09-19 18:38:47 -07001package org.onlab.onos.net.host.impl;
Jonathan Hartfca736c2014-09-19 17:26:59 -07002
3import java.util.HashSet;
4import java.util.Set;
5import java.util.concurrent.TimeUnit;
6
7import org.jboss.netty.util.Timeout;
8import org.jboss.netty.util.TimerTask;
Jonathan Hartfca736c2014-09-19 17:26:59 -07009import org.onlab.onos.net.Host;
10import org.onlab.onos.net.Port;
11import org.onlab.onos.net.device.DeviceService;
12import org.onlab.onos.net.host.HostProvider;
13import org.onlab.onos.net.host.HostService;
14import org.onlab.onos.net.packet.PacketProvider;
15import org.onlab.onos.net.topology.TopologyService;
16import org.onlab.packet.IpPrefix;
17import org.onlab.util.Timer;
18
tom202175a2014-09-19 19:00:11 -070019public class HostMonitor implements TimerTask {
Jonathan Hartfca736c2014-09-19 17:26:59 -070020
21 private final HostService hostService;
22 private final TopologyService topologyService;
23 private final DeviceService deviceService;
24 private final HostProvider hostProvider;
25 private final PacketProvider packetProvider;
26
27 private final Set<IpPrefix> monitoredAddresses;
28
29 private final long probeRate;
30
31 private Timeout timeout;
32
tom202175a2014-09-19 19:00:11 -070033 public HostMonitor(HostService hostService, TopologyService topologyService,
34 DeviceService deviceService,
35 HostProvider hostProvider, PacketProvider packetProvider) {
Jonathan Hartfca736c2014-09-19 17:26:59 -070036 this.hostService = hostService;
37 this.topologyService = topologyService;
38 this.deviceService = deviceService;
39 this.hostProvider = hostProvider;
40 this.packetProvider = packetProvider;
41
42 monitoredAddresses = new HashSet<>();
43
44 probeRate = 30000; // milliseconds
45
46 timeout = Timer.getTimer().newTimeout(this, 0, TimeUnit.MILLISECONDS);
47 }
48
49 public void addMonitoringFor(IpPrefix ip) {
50 monitoredAddresses.add(ip);
51 }
52
53 public void stopMonitoring(IpPrefix ip) {
54 monitoredAddresses.remove(ip);
55 }
56
57 public void shutdown() {
58 timeout.cancel();
59 }
60
61 @Override
62 public void run(Timeout timeout) throws Exception {
63 for (IpPrefix ip : monitoredAddresses) {
64 Set<Host> hosts = hostService.getHostsByIp(ip);
65
66 if (hosts.isEmpty()) {
67 sendArpRequest(ip);
68 } else {
69 for (Host host : hosts) {
70 hostProvider.triggerProbe(host);
71 }
72 }
73 }
74
75 timeout = Timer.getTimer().newTimeout(this, probeRate, TimeUnit.MILLISECONDS);
76 }
77
78 /**
79 * Sends an ARP request for the given IP address.
80 *
81 * @param targetIp IP address to ARP for
82 */
83 private void sendArpRequest(IpPrefix targetIp) {
84 // emit ARP packet out appropriate ports
85
86 // if ip in one of the configured (external) subnets
87 // sent out that port
88 // else (ip isn't in any configured subnet)
89 // send out all non-external edge ports
90
Jonathan Hart32129f22014-09-23 11:23:38 -070091 /*for (Device device : deviceService.getDevices()) {
Jonathan Hartfca736c2014-09-19 17:26:59 -070092 for (Port port : deviceService.getPorts(device.id())) {
93 for (IpPrefix ip : port.ipAddresses()) {
94 if (ip.contains(targetIp)) {
95 sendProbe(port, targetIp);
96 continue;
97 }
98 }
99 }
Jonathan Hart32129f22014-09-23 11:23:38 -0700100 }*/
Jonathan Hartfca736c2014-09-19 17:26:59 -0700101
102 }
103
104 private void sendProbe(Port port, IpPrefix targetIp) {
105
106 }
107}