blob: 6e5d600b631179a6f8b54127d14a01d2e229d504 [file] [log] [blame]
tome06f8552014-08-26 16:58:42 -07001package org.onlab.onos.provider.of.host.impl;
2
Ayaka Koshibe1a100982014-09-13 19:32:19 -07003import java.util.Set;
4
tome06f8552014-08-26 16:58:42 -07005import org.apache.felix.scr.annotations.Activate;
6import org.apache.felix.scr.annotations.Component;
7import org.apache.felix.scr.annotations.Deactivate;
8import org.apache.felix.scr.annotations.Reference;
9import org.apache.felix.scr.annotations.ReferenceCardinality;
Ayaka Koshibe1a100982014-09-13 19:32:19 -070010import org.onlab.onos.net.DeviceId;
tome06f8552014-08-26 16:58:42 -070011import org.onlab.onos.net.Host;
Ayaka Koshibe1a100982014-09-13 19:32:19 -070012import org.onlab.onos.net.HostId;
13import org.onlab.onos.net.HostLocation;
14import org.onlab.onos.net.PortNumber;
15import org.onlab.onos.net.host.DefaultHostDescription;
16import org.onlab.onos.net.host.HostDescription;
tome06f8552014-08-26 16:58:42 -070017import org.onlab.onos.net.host.HostProvider;
tom96dfcab2014-08-28 09:26:03 -070018import org.onlab.onos.net.host.HostProviderRegistry;
tome06f8552014-08-26 16:58:42 -070019import org.onlab.onos.net.host.HostProviderService;
20import org.onlab.onos.net.provider.AbstractProvider;
21import org.onlab.onos.net.provider.ProviderId;
tom5f38b3a2014-08-27 23:50:54 -070022import org.onlab.onos.of.controller.OpenFlowController;
Ayaka Koshibe1a100982014-09-13 19:32:19 -070023import org.onlab.onos.of.controller.OpenFlowPacketContext;
24import org.onlab.onos.of.controller.PacketListener;
25import org.onlab.packet.ARP;
26import org.onlab.packet.Ethernet;
27import org.onlab.packet.IPAddress;
28import org.onlab.packet.VLANID;
tome06f8552014-08-26 16:58:42 -070029import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070030
Ayaka Koshibe1a100982014-09-13 19:32:19 -070031import com.google.common.collect.Sets;
32
tom5f38b3a2014-08-27 23:50:54 -070033import static org.slf4j.LoggerFactory.getLogger;
tome06f8552014-08-26 16:58:42 -070034
35/**
tomb1260e42014-08-26 18:39:57 -070036 * Provider which uses an OpenFlow controller to detect network
tome06f8552014-08-26 16:58:42 -070037 * end-station hosts.
38 */
tomb1260e42014-08-26 18:39:57 -070039@Component(immediate = true)
tome06f8552014-08-26 16:58:42 -070040public class OpenFlowHostProvider extends AbstractProvider implements HostProvider {
41
tom5f38b3a2014-08-27 23:50:54 -070042 private final Logger log = getLogger(getClass());
tome06f8552014-08-26 16:58:42 -070043
44 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom96dfcab2014-08-28 09:26:03 -070045 protected HostProviderRegistry providerRegistry;
tome06f8552014-08-26 16:58:42 -070046
tom5f38b3a2014-08-27 23:50:54 -070047 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
48 protected OpenFlowController controller;
tome06f8552014-08-26 16:58:42 -070049
tom5f38b3a2014-08-27 23:50:54 -070050 private HostProviderService providerService;
tome06f8552014-08-26 16:58:42 -070051
Ayaka Koshibe1a100982014-09-13 19:32:19 -070052 private final InternalHostProvider listener = new InternalHostProvider();
53
tome06f8552014-08-26 16:58:42 -070054 /**
55 * Creates an OpenFlow host provider.
56 */
57 public OpenFlowHostProvider() {
tom578ebdc2014-09-11 11:12:51 -070058 super(new ProviderId("org.onlab.onos.provider.openflow"));
tome06f8552014-08-26 16:58:42 -070059 }
60
61 @Activate
62 public void activate() {
tom96dfcab2014-08-28 09:26:03 -070063 providerService = providerRegistry.register(this);
Ayaka Koshibe1a100982014-09-13 19:32:19 -070064 controller.addPacketListener(0, listener);
65
tome06f8552014-08-26 16:58:42 -070066 log.info("Started");
67 }
68
69 @Deactivate
70 public void deactivate() {
tom96dfcab2014-08-28 09:26:03 -070071 providerRegistry.unregister(this);
Ayaka Koshibe1a100982014-09-13 19:32:19 -070072 controller.removePacketListener(listener);
tome06f8552014-08-26 16:58:42 -070073 providerService = null;
Ayaka Koshibe1a100982014-09-13 19:32:19 -070074
tome06f8552014-08-26 16:58:42 -070075 log.info("Stopped");
76 }
77
78 @Override
79 public void triggerProbe(Host host) {
80 log.info("Triggering probe on device {}", host);
81 }
tomb1260e42014-08-26 18:39:57 -070082
Ayaka Koshibe1a100982014-09-13 19:32:19 -070083 private class InternalHostProvider implements PacketListener {
84
85 @Override
86 public void handlePacket(OpenFlowPacketContext pktCtx) {
87 Ethernet eth = pktCtx.parsed();
88
89 // potentially a new or moved host
90 if (eth.getEtherType() == Ethernet.TYPE_ARP) {
91 VLANID vlan = VLANID.vlanId(eth.getVlanID());
92 HostId hid = HostId.hostId(
93 eth.getSourceMAC(), vlan);
94 HostLocation hloc = new HostLocation(
95 DeviceId.deviceId("of:" + Long.toHexString(pktCtx.dpid().value())),
96 PortNumber.portNumber(pktCtx.inPort()),
97 System.currentTimeMillis());
98 ARP arp = (ARP) eth.getPayload();
99 Set<IPAddress> ips = Sets.newHashSet(IPAddress.valueOf(arp.getSenderProtocolAddress()));
100 HostDescription hdescr = new DefaultHostDescription(
101 eth.getSourceMAC(),
102 vlan,
103 hloc,
104 ips);
105 providerService.hostDetected(hid, hdescr);
106
107 }
108 }
109
110 }
tome06f8552014-08-26 16:58:42 -0700111}