blob: 7f16eaa503827eb357c4c70fd664aeafdf88cf10 [file] [log] [blame]
tome06f8552014-08-26 16:58:42 -07001package org.onlab.onos.provider.of.link.impl;
2
alshabib63d5afe2014-09-15 09:40:24 -07003import static org.slf4j.LoggerFactory.getLogger;
4
5import java.util.Map;
6import java.util.concurrent.ConcurrentHashMap;
7
tome06f8552014-08-26 16:58:42 -07008import org.apache.felix.scr.annotations.Activate;
9import org.apache.felix.scr.annotations.Component;
10import org.apache.felix.scr.annotations.Deactivate;
11import org.apache.felix.scr.annotations.Reference;
12import org.apache.felix.scr.annotations.ReferenceCardinality;
alshabibdf652ad2014-09-09 11:53:19 -070013import org.onlab.onos.net.DeviceId;
tome06f8552014-08-26 16:58:42 -070014import org.onlab.onos.net.link.LinkProvider;
tom96dfcab2014-08-28 09:26:03 -070015import org.onlab.onos.net.link.LinkProviderRegistry;
tome06f8552014-08-26 16:58:42 -070016import org.onlab.onos.net.link.LinkProviderService;
17import org.onlab.onos.net.provider.AbstractProvider;
18import org.onlab.onos.net.provider.ProviderId;
tom9c94c5b2014-09-17 13:14:42 -070019import org.onlab.onos.openflow.controller.Dpid;
20import org.onlab.onos.openflow.controller.OpenFlowController;
21import org.onlab.onos.openflow.controller.OpenFlowPacketContext;
22import org.onlab.onos.openflow.controller.OpenFlowSwitch;
23import org.onlab.onos.openflow.controller.OpenFlowSwitchListener;
24import org.onlab.onos.openflow.controller.PacketListener;
Ayaka Koshibeab91cc42014-09-25 10:20:52 -070025import org.onlab.onos.openflow.controller.RoleState;
alshabibdf652ad2014-09-09 11:53:19 -070026import org.projectfloodlight.openflow.protocol.OFPortConfig;
27import org.projectfloodlight.openflow.protocol.OFPortDesc;
28import org.projectfloodlight.openflow.protocol.OFPortState;
alshabib289652c2014-09-07 19:09:28 -070029import org.projectfloodlight.openflow.protocol.OFPortStatus;
tome06f8552014-08-26 16:58:42 -070030import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070031
alshabib64231d82014-09-25 18:25:31 -070032
tome06f8552014-08-26 16:58:42 -070033/**
tomb1260e42014-08-26 18:39:57 -070034 * Provider which uses an OpenFlow controller to detect network
tome06f8552014-08-26 16:58:42 -070035 * infrastructure links.
36 */
tomb1260e42014-08-26 18:39:57 -070037@Component(immediate = true)
alshabib75e77422014-10-16 18:03:40 -070038@Deprecated
tome06f8552014-08-26 16:58:42 -070039public class OpenFlowLinkProvider extends AbstractProvider implements LinkProvider {
40
tom5f38b3a2014-08-27 23:50:54 -070041 private final Logger log = getLogger(getClass());
tome06f8552014-08-26 16:58:42 -070042
43 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom96dfcab2014-08-28 09:26:03 -070044 protected LinkProviderRegistry providerRegistry;
tome06f8552014-08-26 16:58:42 -070045
tom5f38b3a2014-08-27 23:50:54 -070046 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
47 protected OpenFlowController controller;
tome06f8552014-08-26 16:58:42 -070048
tom5f38b3a2014-08-27 23:50:54 -070049 private LinkProviderService providerService;
tome06f8552014-08-26 16:58:42 -070050
alshabibdf652ad2014-09-09 11:53:19 -070051 private final boolean useBDDP = true;
52
alshabib289652c2014-09-07 19:09:28 -070053 private final InternalLinkProvider listener = new InternalLinkProvider();
alshabibc4901cd2014-09-05 16:50:40 -070054
alshabib64231d82014-09-25 18:25:31 -070055 protected final Map<Dpid, LinkDiscovery> discoverers = new ConcurrentHashMap<>();
alshabibc944fd02014-09-10 17:55:17 -070056
tome06f8552014-08-26 16:58:42 -070057 /**
58 * Creates an OpenFlow link provider.
59 */
60 public OpenFlowLinkProvider() {
tom7e02cda2014-09-18 12:05:46 -070061 super(new ProviderId("of", "org.onlab.onos.provider.openflow"));
tome06f8552014-08-26 16:58:42 -070062 }
63
64 @Activate
65 public void activate() {
tom96dfcab2014-08-28 09:26:03 -070066 providerService = providerRegistry.register(this);
alshabib289652c2014-09-07 19:09:28 -070067 controller.addListener(listener);
alshabibc4901cd2014-09-05 16:50:40 -070068 controller.addPacketListener(0, listener);
alshabibc944fd02014-09-10 17:55:17 -070069 for (OpenFlowSwitch sw : controller.getSwitches()) {
70 listener.switchAdded(new Dpid(sw.getId()));
71 }
tome06f8552014-08-26 16:58:42 -070072 log.info("Started");
73 }
74
75 @Deactivate
76 public void deactivate() {
alshabibc944fd02014-09-10 17:55:17 -070077 for (LinkDiscovery ld : discoverers.values()) {
78 ld.stop();
79 }
tom96dfcab2014-08-28 09:26:03 -070080 providerRegistry.unregister(this);
alshabib289652c2014-09-07 19:09:28 -070081 controller.removeListener(listener);
alshabibc4901cd2014-09-05 16:50:40 -070082 controller.removePacketListener(listener);
tome06f8552014-08-26 16:58:42 -070083 providerService = null;
alshabibc944fd02014-09-10 17:55:17 -070084
tome06f8552014-08-26 16:58:42 -070085 log.info("Stopped");
86 }
87
alshabibc4901cd2014-09-05 16:50:40 -070088
alshabib289652c2014-09-07 19:09:28 -070089 private class InternalLinkProvider implements PacketListener, OpenFlowSwitchListener {
alshabibc4901cd2014-09-05 16:50:40 -070090
alshabibdf652ad2014-09-09 11:53:19 -070091
alshabibc4901cd2014-09-05 16:50:40 -070092 @Override
alshabibe7031562014-09-12 18:17:37 -070093 public void handlePacket(OpenFlowPacketContext pktCtx) {
alshabibdf652ad2014-09-09 11:53:19 -070094 LinkDiscovery ld = discoverers.get(pktCtx.dpid());
95 if (ld == null) {
96 return;
97 }
alshabib505bc6b2014-09-09 15:04:13 -070098 if (ld.handleLLDP(pktCtx.unparsed(), pktCtx.inPort())) {
alshabib7b2748f2014-09-16 20:21:11 -070099 pktCtx.block();
alshabib505bc6b2014-09-09 15:04:13 -0700100 }
alshabibc4901cd2014-09-05 16:50:40 -0700101
102 }
103
alshabib289652c2014-09-07 19:09:28 -0700104 @Override
105 public void switchAdded(Dpid dpid) {
alshabibdf652ad2014-09-09 11:53:19 -0700106 discoverers.put(dpid, new LinkDiscovery(controller.getSwitch(dpid),
alshabib63d5afe2014-09-15 09:40:24 -0700107 controller, providerService, useBDDP));
alshabib289652c2014-09-07 19:09:28 -0700108
109 }
110
111 @Override
112 public void switchRemoved(Dpid dpid) {
alshabibc944fd02014-09-10 17:55:17 -0700113 LinkDiscovery ld = discoverers.remove(dpid);
alshabibdf652ad2014-09-09 11:53:19 -0700114 if (ld != null) {
115 ld.removeAllPorts();
116 }
117 providerService.linksVanished(
118 DeviceId.deviceId("of:" + Long.toHexString(dpid.value())));
alshabib289652c2014-09-07 19:09:28 -0700119 }
120
121 @Override
122 public void portChanged(Dpid dpid, OFPortStatus status) {
alshabibdf652ad2014-09-09 11:53:19 -0700123 LinkDiscovery ld = discoverers.get(dpid);
124 if (ld == null) {
125 return;
126 }
127 final OFPortDesc port = status.getDesc();
128 final boolean enabled = !port.getState().contains(OFPortState.LINK_DOWN) &&
129 !port.getConfig().contains(OFPortConfig.PORT_DOWN);
130 if (enabled) {
131 ld.addPort(port);
132 } else {
alshabibc944fd02014-09-10 17:55:17 -0700133 /*
134 * remove port calls linkVanished
135 */
alshabiba159a322014-09-09 14:50:51 -0700136 ld.removePort(port);
alshabibdf652ad2014-09-09 11:53:19 -0700137 }
alshabib289652c2014-09-07 19:09:28 -0700138
139 }
140
Ayaka Koshibeab91cc42014-09-25 10:20:52 -0700141 @Override
142 public void roleAssertFailed(Dpid dpid, RoleState role) {
alshabib64231d82014-09-25 18:25:31 -0700143 // do nothing for this.
Ayaka Koshibeab91cc42014-09-25 10:20:52 -0700144 }
145
alshabibc4901cd2014-09-05 16:50:40 -0700146 }
147
tome06f8552014-08-26 16:58:42 -0700148}