blob: 2398acf3b75fc84bb6ad11113c7e105d800494db [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
tome06f8552014-08-26 16:58:42 -070019package org.onlab.onos.provider.of.link.impl;
20
alshabib63d5afe2014-09-15 09:40:24 -070021import static org.slf4j.LoggerFactory.getLogger;
22
23import java.util.Map;
24import java.util.concurrent.ConcurrentHashMap;
25
tome06f8552014-08-26 16:58:42 -070026import org.apache.felix.scr.annotations.Activate;
27import org.apache.felix.scr.annotations.Component;
28import org.apache.felix.scr.annotations.Deactivate;
29import org.apache.felix.scr.annotations.Reference;
30import org.apache.felix.scr.annotations.ReferenceCardinality;
alshabibdf652ad2014-09-09 11:53:19 -070031import org.onlab.onos.net.DeviceId;
tome06f8552014-08-26 16:58:42 -070032import org.onlab.onos.net.link.LinkProvider;
tom96dfcab2014-08-28 09:26:03 -070033import org.onlab.onos.net.link.LinkProviderRegistry;
tome06f8552014-08-26 16:58:42 -070034import org.onlab.onos.net.link.LinkProviderService;
35import org.onlab.onos.net.provider.AbstractProvider;
36import org.onlab.onos.net.provider.ProviderId;
tom9c94c5b2014-09-17 13:14:42 -070037import org.onlab.onos.openflow.controller.Dpid;
38import org.onlab.onos.openflow.controller.OpenFlowController;
39import org.onlab.onos.openflow.controller.OpenFlowPacketContext;
40import org.onlab.onos.openflow.controller.OpenFlowSwitch;
41import org.onlab.onos.openflow.controller.OpenFlowSwitchListener;
42import org.onlab.onos.openflow.controller.PacketListener;
Ayaka Koshibeab91cc42014-09-25 10:20:52 -070043import org.onlab.onos.openflow.controller.RoleState;
alshabibdf652ad2014-09-09 11:53:19 -070044import org.projectfloodlight.openflow.protocol.OFPortConfig;
45import org.projectfloodlight.openflow.protocol.OFPortDesc;
46import org.projectfloodlight.openflow.protocol.OFPortState;
alshabib289652c2014-09-07 19:09:28 -070047import org.projectfloodlight.openflow.protocol.OFPortStatus;
tome06f8552014-08-26 16:58:42 -070048import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070049
alshabib64231d82014-09-25 18:25:31 -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 * infrastructure links.
54 */
tomb1260e42014-08-26 18:39:57 -070055@Component(immediate = true)
alshabib75e77422014-10-16 18:03:40 -070056@Deprecated
tome06f8552014-08-26 16:58:42 -070057public class OpenFlowLinkProvider extends AbstractProvider implements LinkProvider {
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 LinkProviderRegistry 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
tom5f38b3a2014-08-27 23:50:54 -070067 private LinkProviderService providerService;
tome06f8552014-08-26 16:58:42 -070068
alshabibdf652ad2014-09-09 11:53:19 -070069 private final boolean useBDDP = true;
70
alshabib289652c2014-09-07 19:09:28 -070071 private final InternalLinkProvider listener = new InternalLinkProvider();
alshabibc4901cd2014-09-05 16:50:40 -070072
alshabib64231d82014-09-25 18:25:31 -070073 protected final Map<Dpid, LinkDiscovery> discoverers = new ConcurrentHashMap<>();
alshabibc944fd02014-09-10 17:55:17 -070074
tome06f8552014-08-26 16:58:42 -070075 /**
76 * Creates an OpenFlow link provider.
77 */
78 public OpenFlowLinkProvider() {
tom7e02cda2014-09-18 12:05:46 -070079 super(new ProviderId("of", "org.onlab.onos.provider.openflow"));
tome06f8552014-08-26 16:58:42 -070080 }
81
82 @Activate
83 public void activate() {
tom96dfcab2014-08-28 09:26:03 -070084 providerService = providerRegistry.register(this);
alshabib289652c2014-09-07 19:09:28 -070085 controller.addListener(listener);
alshabibc4901cd2014-09-05 16:50:40 -070086 controller.addPacketListener(0, listener);
alshabibc944fd02014-09-10 17:55:17 -070087 for (OpenFlowSwitch sw : controller.getSwitches()) {
88 listener.switchAdded(new Dpid(sw.getId()));
89 }
tome06f8552014-08-26 16:58:42 -070090 log.info("Started");
91 }
92
93 @Deactivate
94 public void deactivate() {
alshabibc944fd02014-09-10 17:55:17 -070095 for (LinkDiscovery ld : discoverers.values()) {
96 ld.stop();
97 }
tom96dfcab2014-08-28 09:26:03 -070098 providerRegistry.unregister(this);
alshabib289652c2014-09-07 19:09:28 -070099 controller.removeListener(listener);
alshabibc4901cd2014-09-05 16:50:40 -0700100 controller.removePacketListener(listener);
tome06f8552014-08-26 16:58:42 -0700101 providerService = null;
alshabibc944fd02014-09-10 17:55:17 -0700102
tome06f8552014-08-26 16:58:42 -0700103 log.info("Stopped");
104 }
105
alshabibc4901cd2014-09-05 16:50:40 -0700106
alshabib289652c2014-09-07 19:09:28 -0700107 private class InternalLinkProvider implements PacketListener, OpenFlowSwitchListener {
alshabibc4901cd2014-09-05 16:50:40 -0700108
alshabibdf652ad2014-09-09 11:53:19 -0700109
alshabibc4901cd2014-09-05 16:50:40 -0700110 @Override
alshabibe7031562014-09-12 18:17:37 -0700111 public void handlePacket(OpenFlowPacketContext pktCtx) {
alshabibdf652ad2014-09-09 11:53:19 -0700112 LinkDiscovery ld = discoverers.get(pktCtx.dpid());
113 if (ld == null) {
114 return;
115 }
alshabib505bc6b2014-09-09 15:04:13 -0700116 if (ld.handleLLDP(pktCtx.unparsed(), pktCtx.inPort())) {
alshabib7b2748f2014-09-16 20:21:11 -0700117 pktCtx.block();
alshabib505bc6b2014-09-09 15:04:13 -0700118 }
alshabibc4901cd2014-09-05 16:50:40 -0700119
120 }
121
alshabib289652c2014-09-07 19:09:28 -0700122 @Override
123 public void switchAdded(Dpid dpid) {
alshabibdf652ad2014-09-09 11:53:19 -0700124 discoverers.put(dpid, new LinkDiscovery(controller.getSwitch(dpid),
alshabib63d5afe2014-09-15 09:40:24 -0700125 controller, providerService, useBDDP));
alshabib289652c2014-09-07 19:09:28 -0700126
127 }
128
129 @Override
130 public void switchRemoved(Dpid dpid) {
alshabibc944fd02014-09-10 17:55:17 -0700131 LinkDiscovery ld = discoverers.remove(dpid);
alshabibdf652ad2014-09-09 11:53:19 -0700132 if (ld != null) {
133 ld.removeAllPorts();
134 }
135 providerService.linksVanished(
136 DeviceId.deviceId("of:" + Long.toHexString(dpid.value())));
alshabib289652c2014-09-07 19:09:28 -0700137 }
138
Ayaka Koshibe38594c22014-10-22 13:36:12 -0700139
140 @Override
141 public void switchChanged(Dpid dpid) {
142 //might not need to do anything since DeviceManager is notified
143 }
144
alshabib289652c2014-09-07 19:09:28 -0700145 @Override
146 public void portChanged(Dpid dpid, OFPortStatus status) {
alshabibdf652ad2014-09-09 11:53:19 -0700147 LinkDiscovery ld = discoverers.get(dpid);
148 if (ld == null) {
149 return;
150 }
151 final OFPortDesc port = status.getDesc();
152 final boolean enabled = !port.getState().contains(OFPortState.LINK_DOWN) &&
153 !port.getConfig().contains(OFPortConfig.PORT_DOWN);
154 if (enabled) {
155 ld.addPort(port);
156 } else {
alshabibc944fd02014-09-10 17:55:17 -0700157 /*
158 * remove port calls linkVanished
159 */
alshabiba159a322014-09-09 14:50:51 -0700160 ld.removePort(port);
alshabibdf652ad2014-09-09 11:53:19 -0700161 }
alshabib289652c2014-09-07 19:09:28 -0700162
163 }
164
Ayaka Koshibeab91cc42014-09-25 10:20:52 -0700165 @Override
166 public void roleAssertFailed(Dpid dpid, RoleState role) {
alshabib64231d82014-09-25 18:25:31 -0700167 // do nothing for this.
Ayaka Koshibeab91cc42014-09-25 10:20:52 -0700168 }
169
alshabibc4901cd2014-09-05 16:50:40 -0700170 }
171
tome06f8552014-08-26 16:58:42 -0700172}