blob: d0e44f77ad3be18966eb86effdb9aa49f0dbe974 [file] [log] [blame]
tome06f8552014-08-26 16:58:42 -07001package org.onlab.onos.provider.of.host.impl;
2
3import org.apache.felix.scr.annotations.Activate;
4import org.apache.felix.scr.annotations.Component;
5import org.apache.felix.scr.annotations.Deactivate;
6import org.apache.felix.scr.annotations.Reference;
7import org.apache.felix.scr.annotations.ReferenceCardinality;
tom025e09f2014-09-15 15:29:24 -07008import org.onlab.onos.net.ConnectPoint;
tome06f8552014-08-26 16:58:42 -07009import org.onlab.onos.net.Host;
Ayaka Koshibe1a100982014-09-13 19:32:19 -070010import org.onlab.onos.net.HostId;
11import org.onlab.onos.net.HostLocation;
Ayaka Koshibe1a100982014-09-13 19:32:19 -070012import org.onlab.onos.net.host.DefaultHostDescription;
13import org.onlab.onos.net.host.HostDescription;
tome06f8552014-08-26 16:58:42 -070014import org.onlab.onos.net.host.HostProvider;
tom96dfcab2014-08-28 09:26:03 -070015import org.onlab.onos.net.host.HostProviderRegistry;
tome06f8552014-08-26 16:58:42 -070016import org.onlab.onos.net.host.HostProviderService;
17import org.onlab.onos.net.provider.AbstractProvider;
18import org.onlab.onos.net.provider.ProviderId;
tom025e09f2014-09-15 15:29:24 -070019import org.onlab.onos.net.topology.Topology;
20import org.onlab.onos.net.topology.TopologyService;
tom9c94c5b2014-09-17 13:14:42 -070021import org.onlab.onos.openflow.controller.Dpid;
22import org.onlab.onos.openflow.controller.OpenFlowController;
23import org.onlab.onos.openflow.controller.OpenFlowPacketContext;
24import org.onlab.onos.openflow.controller.PacketListener;
Ayaka Koshibe1a100982014-09-13 19:32:19 -070025import org.onlab.packet.ARP;
26import org.onlab.packet.Ethernet;
alshabib0ff17ad2014-09-30 09:46:40 -070027import org.onlab.packet.IPv4;
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070028import org.onlab.packet.IpPrefix;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070029import org.onlab.packet.VlanId;
tome06f8552014-08-26 16:58:42 -070030import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070031
tom093340b2014-10-10 00:15:36 -070032import static org.onlab.onos.net.DeviceId.deviceId;
33import static org.onlab.onos.net.PortNumber.portNumber;
34import static org.slf4j.LoggerFactory.getLogger;
35
tome06f8552014-08-26 16:58:42 -070036/**
tomb1260e42014-08-26 18:39:57 -070037 * Provider which uses an OpenFlow controller to detect network
tome06f8552014-08-26 16:58:42 -070038 * end-station hosts.
39 */
tomb1260e42014-08-26 18:39:57 -070040@Component(immediate = true)
alshabibe1cf87d2014-10-17 09:23:50 -070041@Deprecated
tome06f8552014-08-26 16:58:42 -070042public class OpenFlowHostProvider extends AbstractProvider implements HostProvider {
43
tom5f38b3a2014-08-27 23:50:54 -070044 private final Logger log = getLogger(getClass());
tome06f8552014-08-26 16:58:42 -070045
46 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom96dfcab2014-08-28 09:26:03 -070047 protected HostProviderRegistry providerRegistry;
tome06f8552014-08-26 16:58:42 -070048
tom5f38b3a2014-08-27 23:50:54 -070049 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
50 protected OpenFlowController controller;
tome06f8552014-08-26 16:58:42 -070051
tom025e09f2014-09-15 15:29:24 -070052 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
53 protected TopologyService topologyService;
54
tom5f38b3a2014-08-27 23:50:54 -070055 private HostProviderService providerService;
tome06f8552014-08-26 16:58:42 -070056
Ayaka Koshibe1a100982014-09-13 19:32:19 -070057 private final InternalHostProvider listener = new InternalHostProvider();
58
tom093340b2014-10-10 00:15:36 -070059 private boolean ipLearn = true;
60
tome06f8552014-08-26 16:58:42 -070061 /**
62 * Creates an OpenFlow host provider.
63 */
64 public OpenFlowHostProvider() {
tom7e02cda2014-09-18 12:05:46 -070065 super(new ProviderId("of", "org.onlab.onos.provider.openflow"));
tome06f8552014-08-26 16:58:42 -070066 }
67
68 @Activate
69 public void activate() {
tom96dfcab2014-08-28 09:26:03 -070070 providerService = providerRegistry.register(this);
Ayaka Koshibe43530be2014-09-15 11:14:52 -070071 controller.addPacketListener(10, listener);
tome06f8552014-08-26 16:58:42 -070072 log.info("Started");
73 }
74
75 @Deactivate
76 public void deactivate() {
tom96dfcab2014-08-28 09:26:03 -070077 providerRegistry.unregister(this);
Ayaka Koshibe1a100982014-09-13 19:32:19 -070078 controller.removePacketListener(listener);
tome06f8552014-08-26 16:58:42 -070079 providerService = null;
80 log.info("Stopped");
81 }
82
83 @Override
84 public void triggerProbe(Host host) {
85 log.info("Triggering probe on device {}", host);
86 }
tomb1260e42014-08-26 18:39:57 -070087
Ayaka Koshibe1a100982014-09-13 19:32:19 -070088 private class InternalHostProvider implements PacketListener {
89
90 @Override
91 public void handlePacket(OpenFlowPacketContext pktCtx) {
92 Ethernet eth = pktCtx.parsed();
93
alshabib0ff17ad2014-09-30 09:46:40 -070094 VlanId vlan = VlanId.vlanId(eth.getVlanID());
95 ConnectPoint heardOn = new ConnectPoint(deviceId(Dpid.uri(pktCtx.dpid())),
tom093340b2014-10-10 00:15:36 -070096 portNumber(pktCtx.inPort()));
alshabib0ff17ad2014-09-30 09:46:40 -070097
tom093340b2014-10-10 00:15:36 -070098 // If this is not an edge port, bail out.
alshabib0ff17ad2014-09-30 09:46:40 -070099 Topology topology = topologyService.currentTopology();
100 if (topologyService.isInfrastructure(topology, heardOn)) {
101 return;
102 }
103
104 HostLocation hloc = new HostLocation(deviceId(Dpid.uri(pktCtx.dpid())),
tom093340b2014-10-10 00:15:36 -0700105 portNumber(pktCtx.inPort()),
106 System.currentTimeMillis());
107
alshabib0ff17ad2014-09-30 09:46:40 -0700108 HostId hid = HostId.hostId(eth.getSourceMAC(), vlan);
tom093340b2014-10-10 00:15:36 -0700109
tom025e09f2014-09-15 15:29:24 -0700110 // Potentially a new or moved host
Ayaka Koshibe1a100982014-09-13 19:32:19 -0700111 if (eth.getEtherType() == Ethernet.TYPE_ARP) {
Ayaka Koshibe1a100982014-09-13 19:32:19 -0700112 ARP arp = (ARP) eth.getPayload();
tom093340b2014-10-10 00:15:36 -0700113 IpPrefix ip = IpPrefix.valueOf(arp.getSenderProtocolAddress());
tom025e09f2014-09-15 15:29:24 -0700114 HostDescription hdescr =
tom093340b2014-10-10 00:15:36 -0700115 new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ip);
Ayaka Koshibe1a100982014-09-13 19:32:19 -0700116 providerService.hostDetected(hid, hdescr);
117
tom093340b2014-10-10 00:15:36 -0700118 } else if (ipLearn && eth.getEtherType() == Ethernet.TYPE_IPV4) {
119 IPv4 pip = (IPv4) eth.getPayload();
120 IpPrefix ip = IpPrefix.valueOf(pip.getSourceAddress());
alshabib0ff17ad2014-09-30 09:46:40 -0700121 HostDescription hdescr =
tom093340b2014-10-10 00:15:36 -0700122 new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ip);
alshabib0ff17ad2014-09-30 09:46:40 -0700123 providerService.hostDetected(hid, hdescr);
124
Ayaka Koshibe1a100982014-09-13 19:32:19 -0700125 }
tom025e09f2014-09-15 15:29:24 -0700126
127 // TODO: Use DHCP packets as well later...
Ayaka Koshibe1a100982014-09-13 19:32:19 -0700128 }
129
130 }
tome06f8552014-08-26 16:58:42 -0700131}