blob: f0244144511d4a6e291f2bba8b27508f6a952dbf [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())) {
Yuta HIGUCHI00b476f2014-10-25 21:33:07 -070080 if (!p.number().isLogical()) {
81 ld.addPort(p);
82 }
alshabibdfc7afb2014-10-21 20:13:27 -070083 }
84 }
alshabib7911a052014-10-16 17:49:37 -070085
86 log.info("Started");
87 }
88
89 @Deactivate
90 public void deactivate() {
91 for (LinkDiscovery ld : discoverers.values()) {
92 ld.stop();
93 }
94 providerRegistry.unregister(this);
95 deviceService.removeListener(listener);
96 packetSevice.removeProcessor(listener);
97 providerService = null;
98
99 log.info("Stopped");
100 }
101
102
103 private class InternalLinkProvider implements PacketProcessor, DeviceListener {
104
105 @Override
106 public void event(DeviceEvent event) {
107 LinkDiscovery ld = null;
108 Device device = event.subject();
alshabibacd91832014-10-17 14:38:41 -0700109 Port port = event.port();
alshabibdfc7afb2014-10-21 20:13:27 -0700110 if (device == null) {
111 log.error("Device is null.");
112 return;
113 }
alshabib7911a052014-10-16 17:49:37 -0700114 switch (event.type()) {
115 case DEVICE_ADDED:
alshabibacd91832014-10-17 14:38:41 -0700116 discoverers.put(device.id(),
alshabib875d6262014-10-17 16:19:40 -0700117 new LinkDiscovery(device, packetSevice, masterService,
alshabib7911a052014-10-16 17:49:37 -0700118 providerService, useBDDP));
119 break;
120 case PORT_ADDED:
121 case PORT_UPDATED:
122 if (event.port().isEnabled()) {
alshabibacd91832014-10-17 14:38:41 -0700123 ld = discoverers.get(device.id());
alshabib7911a052014-10-16 17:49:37 -0700124 if (ld == null) {
125 return;
126 }
Yuta HIGUCHI00b476f2014-10-25 21:33:07 -0700127 if (!port.number().isLogical()) {
128 ld.addPort(port);
129 }
alshabib7911a052014-10-16 17:49:37 -0700130 } else {
alshabibacd91832014-10-17 14:38:41 -0700131 ConnectPoint point = new ConnectPoint(device.id(),
132 port.number());
alshabib7911a052014-10-16 17:49:37 -0700133 providerService.linksVanished(point);
134 }
135 break;
136 case PORT_REMOVED:
alshabibacd91832014-10-17 14:38:41 -0700137 ConnectPoint point = new ConnectPoint(device.id(),
138 port.number());
alshabib7911a052014-10-16 17:49:37 -0700139 providerService.linksVanished(point);
140 break;
141 case DEVICE_REMOVED:
142 case DEVICE_SUSPENDED:
alshabibacd91832014-10-17 14:38:41 -0700143 ld = discoverers.get(device.id());
alshabib7911a052014-10-16 17:49:37 -0700144 if (ld == null) {
145 return;
146 }
147 ld.stop();
alshabibacd91832014-10-17 14:38:41 -0700148 providerService.linksVanished(device.id());
alshabib7911a052014-10-16 17:49:37 -0700149 break;
150 case DEVICE_AVAILABILITY_CHANGED:
alshabibacd91832014-10-17 14:38:41 -0700151 ld = discoverers.get(device.id());
alshabib7911a052014-10-16 17:49:37 -0700152 if (ld == null) {
153 return;
154 }
alshabibacd91832014-10-17 14:38:41 -0700155 if (deviceService.isAvailable(device.id())) {
alshabib7911a052014-10-16 17:49:37 -0700156 ld.start();
157 } else {
alshabibacd91832014-10-17 14:38:41 -0700158 providerService.linksVanished(device.id());
alshabib7911a052014-10-16 17:49:37 -0700159 ld.stop();
160 }
161 break;
162 case DEVICE_UPDATED:
163 case DEVICE_MASTERSHIP_CHANGED:
alshabibdfc7afb2014-10-21 20:13:27 -0700164 if (!discoverers.containsKey(device.id())) {
165 discoverers.put(device.id(),
166 new LinkDiscovery(device, packetSevice, masterService,
167 providerService, useBDDP));
168 }
alshabib7911a052014-10-16 17:49:37 -0700169 break;
170 default:
171 log.debug("Unknown event {}", event);
172 }
173 }
174
175 @Override
176 public void process(PacketContext context) {
alshabib4a179dc2014-10-17 17:17:01 -0700177 if (context == null) {
178 return;
179 }
alshabib7911a052014-10-16 17:49:37 -0700180 LinkDiscovery ld = discoverers.get(
181 context.inPacket().receivedFrom().deviceId());
182 if (ld == null) {
183 return;
184 }
185
186 if (ld.handleLLDP(context)) {
187 context.block();
188 }
189 }
190 }
191
192}