blob: acffe5458b62a3cd7caec17cb40f3abd24e69259 [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);
74
75 log.info("Started");
76 }
77
78 @Deactivate
79 public void deactivate() {
80 for (LinkDiscovery ld : discoverers.values()) {
81 ld.stop();
82 }
83 providerRegistry.unregister(this);
84 deviceService.removeListener(listener);
85 packetSevice.removeProcessor(listener);
86 providerService = null;
87
88 log.info("Stopped");
89 }
90
91
92 private class InternalLinkProvider implements PacketProcessor, DeviceListener {
93
94 @Override
95 public void event(DeviceEvent event) {
96 LinkDiscovery ld = null;
97 Device device = event.subject();
alshabibacd91832014-10-17 14:38:41 -070098 Port port = event.port();
alshabib7911a052014-10-16 17:49:37 -070099 switch (event.type()) {
100 case DEVICE_ADDED:
alshabibacd91832014-10-17 14:38:41 -0700101 discoverers.put(device.id(),
alshabib875d6262014-10-17 16:19:40 -0700102 new LinkDiscovery(device, packetSevice, masterService,
alshabib7911a052014-10-16 17:49:37 -0700103 providerService, useBDDP));
104 break;
105 case PORT_ADDED:
106 case PORT_UPDATED:
107 if (event.port().isEnabled()) {
alshabibacd91832014-10-17 14:38:41 -0700108 ld = discoverers.get(device.id());
alshabib7911a052014-10-16 17:49:37 -0700109 if (ld == null) {
110 return;
111 }
alshabibacd91832014-10-17 14:38:41 -0700112 ld.addPort(port);
alshabib7911a052014-10-16 17:49:37 -0700113 } else {
alshabibacd91832014-10-17 14:38:41 -0700114 ConnectPoint point = new ConnectPoint(device.id(),
115 port.number());
alshabib7911a052014-10-16 17:49:37 -0700116 providerService.linksVanished(point);
117 }
118 break;
119 case PORT_REMOVED:
alshabibacd91832014-10-17 14:38:41 -0700120 ConnectPoint point = new ConnectPoint(device.id(),
121 port.number());
alshabib7911a052014-10-16 17:49:37 -0700122 providerService.linksVanished(point);
123 break;
124 case DEVICE_REMOVED:
125 case DEVICE_SUSPENDED:
alshabibacd91832014-10-17 14:38:41 -0700126 ld = discoverers.get(device.id());
alshabib7911a052014-10-16 17:49:37 -0700127 if (ld == null) {
128 return;
129 }
130 ld.stop();
alshabibacd91832014-10-17 14:38:41 -0700131 providerService.linksVanished(device.id());
alshabib7911a052014-10-16 17:49:37 -0700132 break;
133 case DEVICE_AVAILABILITY_CHANGED:
alshabibacd91832014-10-17 14:38:41 -0700134 ld = discoverers.get(device.id());
alshabib7911a052014-10-16 17:49:37 -0700135 if (ld == null) {
136 return;
137 }
alshabibacd91832014-10-17 14:38:41 -0700138 if (deviceService.isAvailable(device.id())) {
alshabib7911a052014-10-16 17:49:37 -0700139 ld.start();
140 } else {
alshabibacd91832014-10-17 14:38:41 -0700141 providerService.linksVanished(device.id());
alshabib7911a052014-10-16 17:49:37 -0700142 ld.stop();
143 }
144 break;
145 case DEVICE_UPDATED:
146 case DEVICE_MASTERSHIP_CHANGED:
147 break;
148 default:
149 log.debug("Unknown event {}", event);
150 }
151 }
152
153 @Override
154 public void process(PacketContext context) {
155 LinkDiscovery ld = discoverers.get(
156 context.inPacket().receivedFrom().deviceId());
157 if (ld == null) {
158 return;
159 }
160
161 if (ld.handleLLDP(context)) {
162 context.block();
163 }
164 }
165 }
166
167}