blob: 1dd673fcab7ea2999e905b6501554823ed9546d9 [file] [log] [blame]
alshabib7911a052014-10-16 17:49:37 -07001package org.onlab.onos.provider.lldp.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;
alshabib875d6262014-10-17 16:19:40 -07008import org.onlab.onos.mastership.MastershipService;
alshabib7911a052014-10-16 17:49:37 -07009import org.onlab.onos.net.ConnectPoint;
10import org.onlab.onos.net.Device;
11import org.onlab.onos.net.DeviceId;
alshabibacd91832014-10-17 14:38:41 -070012import org.onlab.onos.net.Port;
alshabib7911a052014-10-16 17:49:37 -070013import org.onlab.onos.net.device.DeviceEvent;
14import org.onlab.onos.net.device.DeviceListener;
15import org.onlab.onos.net.device.DeviceService;
16import org.onlab.onos.net.link.LinkProvider;
17import org.onlab.onos.net.link.LinkProviderRegistry;
18import org.onlab.onos.net.link.LinkProviderService;
19import org.onlab.onos.net.packet.PacketContext;
20import org.onlab.onos.net.packet.PacketProcessor;
21import org.onlab.onos.net.packet.PacketService;
22import org.onlab.onos.net.provider.AbstractProvider;
23import org.onlab.onos.net.provider.ProviderId;
24import org.slf4j.Logger;
25
26import java.util.Map;
27import java.util.concurrent.ConcurrentHashMap;
28
29import static org.slf4j.LoggerFactory.getLogger;
30
31
32/**
33 * Provider which uses an OpenFlow controller to detect network
34 * infrastructure links.
35 */
36@Component(immediate = true)
37public class LLDPLinkProvider extends AbstractProvider implements LinkProvider {
38
39 private final Logger log = getLogger(getClass());
40
41 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
42 protected LinkProviderRegistry providerRegistry;
43
44 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
45 protected DeviceService deviceService;
46
47 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
48 protected PacketService packetSevice;
49
alshabib875d6262014-10-17 16:19:40 -070050 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
51 protected MastershipService masterService;
52
alshabib7911a052014-10-16 17:49:37 -070053 private LinkProviderService providerService;
54
55 private final boolean useBDDP = true;
56
57
58 private final InternalLinkProvider listener = new InternalLinkProvider();
59
60 protected final Map<DeviceId, LinkDiscovery> discoverers = new ConcurrentHashMap<>();
61
62 /**
63 * Creates an OpenFlow link provider.
64 */
65 public LLDPLinkProvider() {
66 super(new ProviderId("lldp", "org.onlab.onos.provider.lldp"));
67 }
68
69 @Activate
70 public void activate() {
71 providerService = providerRegistry.register(this);
72 deviceService.addListener(listener);
73 packetSevice.addProcessor(listener, 0);
alshabibdfc7afb2014-10-21 20:13:27 -070074 LinkDiscovery ld;
75 for (Device device : deviceService.getDevices()) {
76 ld = new LinkDiscovery(device, packetSevice, masterService,
77 providerService, useBDDP);
78 discoverers.put(device.id(), ld);
79 for (Port p : deviceService.getPorts(device.id())) {
80 ld.addPort(p);
81 }
82 }
alshabib7911a052014-10-16 17:49:37 -070083
84 log.info("Started");
85 }
86
87 @Deactivate
88 public void deactivate() {
89 for (LinkDiscovery ld : discoverers.values()) {
90 ld.stop();
91 }
92 providerRegistry.unregister(this);
93 deviceService.removeListener(listener);
94 packetSevice.removeProcessor(listener);
95 providerService = null;
96
97 log.info("Stopped");
98 }
99
100
101 private class InternalLinkProvider implements PacketProcessor, DeviceListener {
102
103 @Override
104 public void event(DeviceEvent event) {
105 LinkDiscovery ld = null;
106 Device device = event.subject();
alshabibacd91832014-10-17 14:38:41 -0700107 Port port = event.port();
alshabibdfc7afb2014-10-21 20:13:27 -0700108 if (device == null) {
109 log.error("Device is null.");
110 return;
111 }
alshabib7911a052014-10-16 17:49:37 -0700112 switch (event.type()) {
113 case DEVICE_ADDED:
alshabibacd91832014-10-17 14:38:41 -0700114 discoverers.put(device.id(),
alshabib875d6262014-10-17 16:19:40 -0700115 new LinkDiscovery(device, packetSevice, masterService,
alshabib7911a052014-10-16 17:49:37 -0700116 providerService, useBDDP));
117 break;
118 case PORT_ADDED:
119 case PORT_UPDATED:
120 if (event.port().isEnabled()) {
alshabibacd91832014-10-17 14:38:41 -0700121 ld = discoverers.get(device.id());
alshabib7911a052014-10-16 17:49:37 -0700122 if (ld == null) {
123 return;
124 }
alshabibacd91832014-10-17 14:38:41 -0700125 ld.addPort(port);
alshabib7911a052014-10-16 17:49:37 -0700126 } else {
alshabibacd91832014-10-17 14:38:41 -0700127 ConnectPoint point = new ConnectPoint(device.id(),
128 port.number());
alshabib7911a052014-10-16 17:49:37 -0700129 providerService.linksVanished(point);
130 }
131 break;
132 case PORT_REMOVED:
alshabibacd91832014-10-17 14:38:41 -0700133 ConnectPoint point = new ConnectPoint(device.id(),
134 port.number());
alshabib7911a052014-10-16 17:49:37 -0700135 providerService.linksVanished(point);
136 break;
137 case DEVICE_REMOVED:
138 case DEVICE_SUSPENDED:
alshabibacd91832014-10-17 14:38:41 -0700139 ld = discoverers.get(device.id());
alshabib7911a052014-10-16 17:49:37 -0700140 if (ld == null) {
141 return;
142 }
143 ld.stop();
alshabibacd91832014-10-17 14:38:41 -0700144 providerService.linksVanished(device.id());
alshabib7911a052014-10-16 17:49:37 -0700145 break;
146 case DEVICE_AVAILABILITY_CHANGED:
alshabibacd91832014-10-17 14:38:41 -0700147 ld = discoverers.get(device.id());
alshabib7911a052014-10-16 17:49:37 -0700148 if (ld == null) {
149 return;
150 }
alshabibacd91832014-10-17 14:38:41 -0700151 if (deviceService.isAvailable(device.id())) {
alshabib7911a052014-10-16 17:49:37 -0700152 ld.start();
153 } else {
alshabibacd91832014-10-17 14:38:41 -0700154 providerService.linksVanished(device.id());
alshabib7911a052014-10-16 17:49:37 -0700155 ld.stop();
156 }
157 break;
158 case DEVICE_UPDATED:
159 case DEVICE_MASTERSHIP_CHANGED:
alshabibdfc7afb2014-10-21 20:13:27 -0700160 if (!discoverers.containsKey(device.id())) {
161 discoverers.put(device.id(),
162 new LinkDiscovery(device, packetSevice, masterService,
163 providerService, useBDDP));
164 }
alshabib7911a052014-10-16 17:49:37 -0700165 break;
166 default:
167 log.debug("Unknown event {}", event);
168 }
169 }
170
171 @Override
172 public void process(PacketContext context) {
alshabib4a179dc2014-10-17 17:17:01 -0700173 if (context == null) {
174 return;
175 }
alshabib7911a052014-10-16 17:49:37 -0700176 LinkDiscovery ld = discoverers.get(
177 context.inPacket().receivedFrom().deviceId());
178 if (ld == null) {
179 return;
180 }
181
182 if (ld.handleLLDP(context)) {
183 context.block();
184 }
185 }
186 }
187
188}