blob: e563c343f7e01a849ed3a1376ba0a491a1ae9ac1 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 Open Networking Laboratory
Thomas Vachuska781d18b2014-10-27 10:31:25 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
Thomas Vachuska781d18b2014-10-27 10:31:25 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
Thomas Vachuska781d18b2014-10-27 10:31:25 -070015 */
tome06f8552014-08-26 16:58:42 -070016package org.onlab.onos.provider.of.host.impl;
17
Jonathan Hart7d1ad602014-10-17 11:48:32 -070018import static org.onlab.onos.net.DeviceId.deviceId;
19import static org.onlab.onos.net.PortNumber.portNumber;
20import static org.slf4j.LoggerFactory.getLogger;
21
tome06f8552014-08-26 16:58:42 -070022import org.apache.felix.scr.annotations.Activate;
23import org.apache.felix.scr.annotations.Component;
24import org.apache.felix.scr.annotations.Deactivate;
25import org.apache.felix.scr.annotations.Reference;
26import org.apache.felix.scr.annotations.ReferenceCardinality;
tom025e09f2014-09-15 15:29:24 -070027import org.onlab.onos.net.ConnectPoint;
tome06f8552014-08-26 16:58:42 -070028import org.onlab.onos.net.Host;
Ayaka Koshibe1a100982014-09-13 19:32:19 -070029import org.onlab.onos.net.HostId;
30import org.onlab.onos.net.HostLocation;
Ayaka Koshibe1a100982014-09-13 19:32:19 -070031import org.onlab.onos.net.host.DefaultHostDescription;
32import org.onlab.onos.net.host.HostDescription;
tome06f8552014-08-26 16:58:42 -070033import org.onlab.onos.net.host.HostProvider;
tom96dfcab2014-08-28 09:26:03 -070034import org.onlab.onos.net.host.HostProviderRegistry;
tome06f8552014-08-26 16:58:42 -070035import org.onlab.onos.net.host.HostProviderService;
36import org.onlab.onos.net.provider.AbstractProvider;
37import org.onlab.onos.net.provider.ProviderId;
tom025e09f2014-09-15 15:29:24 -070038import org.onlab.onos.net.topology.Topology;
39import org.onlab.onos.net.topology.TopologyService;
tom9c94c5b2014-09-17 13:14:42 -070040import org.onlab.onos.openflow.controller.Dpid;
41import org.onlab.onos.openflow.controller.OpenFlowController;
42import org.onlab.onos.openflow.controller.OpenFlowPacketContext;
43import org.onlab.onos.openflow.controller.PacketListener;
Ayaka Koshibe1a100982014-09-13 19:32:19 -070044import org.onlab.packet.ARP;
45import org.onlab.packet.Ethernet;
alshabib0ff17ad2014-09-30 09:46:40 -070046import org.onlab.packet.IPv4;
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -070047import org.onlab.packet.IpAddress;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070048import org.onlab.packet.VlanId;
tome06f8552014-08-26 16:58:42 -070049import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070050
tome06f8552014-08-26 16:58:42 -070051/**
tomb1260e42014-08-26 18:39:57 -070052 * Provider which uses an OpenFlow controller to detect network
tome06f8552014-08-26 16:58:42 -070053 * end-station hosts.
54 */
tomb1260e42014-08-26 18:39:57 -070055@Component(immediate = true)
alshabibe1cf87d2014-10-17 09:23:50 -070056@Deprecated
tome06f8552014-08-26 16:58:42 -070057public class OpenFlowHostProvider extends AbstractProvider implements HostProvider {
58
tom5f38b3a2014-08-27 23:50:54 -070059 private final Logger log = getLogger(getClass());
tome06f8552014-08-26 16:58:42 -070060
61 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom96dfcab2014-08-28 09:26:03 -070062 protected HostProviderRegistry providerRegistry;
tome06f8552014-08-26 16:58:42 -070063
tom5f38b3a2014-08-27 23:50:54 -070064 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
65 protected OpenFlowController controller;
tome06f8552014-08-26 16:58:42 -070066
tom025e09f2014-09-15 15:29:24 -070067 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
68 protected TopologyService topologyService;
69
tom5f38b3a2014-08-27 23:50:54 -070070 private HostProviderService providerService;
tome06f8552014-08-26 16:58:42 -070071
Ayaka Koshibe1a100982014-09-13 19:32:19 -070072 private final InternalHostProvider listener = new InternalHostProvider();
73
tom093340b2014-10-10 00:15:36 -070074 private boolean ipLearn = true;
75
tome06f8552014-08-26 16:58:42 -070076 /**
77 * Creates an OpenFlow host provider.
78 */
79 public OpenFlowHostProvider() {
tom7e02cda2014-09-18 12:05:46 -070080 super(new ProviderId("of", "org.onlab.onos.provider.openflow"));
tome06f8552014-08-26 16:58:42 -070081 }
82
83 @Activate
84 public void activate() {
tom96dfcab2014-08-28 09:26:03 -070085 providerService = providerRegistry.register(this);
Ayaka Koshibe43530be2014-09-15 11:14:52 -070086 controller.addPacketListener(10, listener);
tome06f8552014-08-26 16:58:42 -070087 log.info("Started");
88 }
89
90 @Deactivate
91 public void deactivate() {
tom96dfcab2014-08-28 09:26:03 -070092 providerRegistry.unregister(this);
Ayaka Koshibe1a100982014-09-13 19:32:19 -070093 controller.removePacketListener(listener);
tome06f8552014-08-26 16:58:42 -070094 providerService = null;
95 log.info("Stopped");
96 }
97
98 @Override
99 public void triggerProbe(Host host) {
100 log.info("Triggering probe on device {}", host);
101 }
tomb1260e42014-08-26 18:39:57 -0700102
Ayaka Koshibe1a100982014-09-13 19:32:19 -0700103 private class InternalHostProvider implements PacketListener {
104
105 @Override
106 public void handlePacket(OpenFlowPacketContext pktCtx) {
107 Ethernet eth = pktCtx.parsed();
108
alshabib0ff17ad2014-09-30 09:46:40 -0700109 VlanId vlan = VlanId.vlanId(eth.getVlanID());
110 ConnectPoint heardOn = new ConnectPoint(deviceId(Dpid.uri(pktCtx.dpid())),
tom093340b2014-10-10 00:15:36 -0700111 portNumber(pktCtx.inPort()));
alshabib0ff17ad2014-09-30 09:46:40 -0700112
tom093340b2014-10-10 00:15:36 -0700113 // If this is not an edge port, bail out.
alshabib0ff17ad2014-09-30 09:46:40 -0700114 Topology topology = topologyService.currentTopology();
115 if (topologyService.isInfrastructure(topology, heardOn)) {
116 return;
117 }
118
119 HostLocation hloc = new HostLocation(deviceId(Dpid.uri(pktCtx.dpid())),
tom093340b2014-10-10 00:15:36 -0700120 portNumber(pktCtx.inPort()),
121 System.currentTimeMillis());
122
alshabib0ff17ad2014-09-30 09:46:40 -0700123 HostId hid = HostId.hostId(eth.getSourceMAC(), vlan);
tom093340b2014-10-10 00:15:36 -0700124
tom025e09f2014-09-15 15:29:24 -0700125 // Potentially a new or moved host
Ayaka Koshibe1a100982014-09-13 19:32:19 -0700126 if (eth.getEtherType() == Ethernet.TYPE_ARP) {
Ayaka Koshibe1a100982014-09-13 19:32:19 -0700127 ARP arp = (ARP) eth.getPayload();
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -0700128 IpAddress ip =
129 IpAddress.valueOf(arp.getSenderProtocolAddress());
tom025e09f2014-09-15 15:29:24 -0700130 HostDescription hdescr =
tom093340b2014-10-10 00:15:36 -0700131 new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ip);
Ayaka Koshibe1a100982014-09-13 19:32:19 -0700132 providerService.hostDetected(hid, hdescr);
133
tom093340b2014-10-10 00:15:36 -0700134 } else if (ipLearn && eth.getEtherType() == Ethernet.TYPE_IPV4) {
135 IPv4 pip = (IPv4) eth.getPayload();
Pavlin Radoslavov33f228a2014-10-27 19:33:16 -0700136 IpAddress ip =
137 IpAddress.valueOf(pip.getSourceAddress());
alshabib0ff17ad2014-09-30 09:46:40 -0700138 HostDescription hdescr =
tom093340b2014-10-10 00:15:36 -0700139 new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ip);
alshabib0ff17ad2014-09-30 09:46:40 -0700140 providerService.hostDetected(hid, hdescr);
141
Ayaka Koshibe1a100982014-09-13 19:32:19 -0700142 }
tom025e09f2014-09-15 15:29:24 -0700143
144 // TODO: Use DHCP packets as well later...
Ayaka Koshibe1a100982014-09-13 19:32:19 -0700145 }
146
147 }
tome06f8552014-08-26 16:58:42 -0700148}