blob: f4ab71d58e01c86c1defa61b84d64010f7ec94fd [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;
8import org.onlab.onos.net.ConnectPoint;
9import org.onlab.onos.net.Device;
10import org.onlab.onos.net.DeviceId;
alshabibacd91832014-10-17 14:38:41 -070011import org.onlab.onos.net.Port;
alshabib7911a052014-10-16 17:49:37 -070012import org.onlab.onos.net.device.DeviceEvent;
13import org.onlab.onos.net.device.DeviceListener;
14import org.onlab.onos.net.device.DeviceService;
15import org.onlab.onos.net.link.LinkProvider;
16import org.onlab.onos.net.link.LinkProviderRegistry;
17import org.onlab.onos.net.link.LinkProviderService;
18import org.onlab.onos.net.packet.PacketContext;
19import org.onlab.onos.net.packet.PacketProcessor;
20import org.onlab.onos.net.packet.PacketService;
21import org.onlab.onos.net.provider.AbstractProvider;
22import org.onlab.onos.net.provider.ProviderId;
23import org.slf4j.Logger;
24
25import java.util.Map;
26import java.util.concurrent.ConcurrentHashMap;
27
28import static org.slf4j.LoggerFactory.getLogger;
29
30
31/**
32 * Provider which uses an OpenFlow controller to detect network
33 * infrastructure links.
34 */
35@Component(immediate = true)
36public class LLDPLinkProvider extends AbstractProvider implements LinkProvider {
37
38 private final Logger log = getLogger(getClass());
39
40 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
41 protected LinkProviderRegistry providerRegistry;
42
43 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
44 protected DeviceService deviceService;
45
46 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
47 protected PacketService packetSevice;
48
49 private LinkProviderService providerService;
50
51 private final boolean useBDDP = true;
52
53
54 private final InternalLinkProvider listener = new InternalLinkProvider();
55
56 protected final Map<DeviceId, LinkDiscovery> discoverers = new ConcurrentHashMap<>();
57
58 /**
59 * Creates an OpenFlow link provider.
60 */
61 public LLDPLinkProvider() {
62 super(new ProviderId("lldp", "org.onlab.onos.provider.lldp"));
63 }
64
65 @Activate
66 public void activate() {
67 providerService = providerRegistry.register(this);
68 deviceService.addListener(listener);
69 packetSevice.addProcessor(listener, 0);
70
71 log.info("Started");
72 }
73
74 @Deactivate
75 public void deactivate() {
76 for (LinkDiscovery ld : discoverers.values()) {
77 ld.stop();
78 }
79 providerRegistry.unregister(this);
80 deviceService.removeListener(listener);
81 packetSevice.removeProcessor(listener);
82 providerService = null;
83
84 log.info("Stopped");
85 }
86
87
88 private class InternalLinkProvider implements PacketProcessor, DeviceListener {
89
90 @Override
91 public void event(DeviceEvent event) {
92 LinkDiscovery ld = null;
93 Device device = event.subject();
alshabibacd91832014-10-17 14:38:41 -070094 Port port = event.port();
alshabib7911a052014-10-16 17:49:37 -070095 switch (event.type()) {
96 case DEVICE_ADDED:
alshabibacd91832014-10-17 14:38:41 -070097 discoverers.put(device.id(),
98 new LinkDiscovery(device, packetSevice,
alshabib7911a052014-10-16 17:49:37 -070099 providerService, useBDDP));
100 break;
101 case PORT_ADDED:
102 case PORT_UPDATED:
103 if (event.port().isEnabled()) {
alshabibacd91832014-10-17 14:38:41 -0700104 ld = discoverers.get(device.id());
alshabib7911a052014-10-16 17:49:37 -0700105 if (ld == null) {
106 return;
107 }
alshabibacd91832014-10-17 14:38:41 -0700108 ld.addPort(port);
alshabib7911a052014-10-16 17:49:37 -0700109 } else {
alshabibacd91832014-10-17 14:38:41 -0700110 ConnectPoint point = new ConnectPoint(device.id(),
111 port.number());
alshabib7911a052014-10-16 17:49:37 -0700112 providerService.linksVanished(point);
113 }
114 break;
115 case PORT_REMOVED:
alshabibacd91832014-10-17 14:38:41 -0700116 ConnectPoint point = new ConnectPoint(device.id(),
117 port.number());
alshabib7911a052014-10-16 17:49:37 -0700118 providerService.linksVanished(point);
119 break;
120 case DEVICE_REMOVED:
121 case DEVICE_SUSPENDED:
alshabibacd91832014-10-17 14:38:41 -0700122 ld = discoverers.get(device.id());
alshabib7911a052014-10-16 17:49:37 -0700123 if (ld == null) {
124 return;
125 }
126 ld.stop();
alshabibacd91832014-10-17 14:38:41 -0700127 providerService.linksVanished(device.id());
alshabib7911a052014-10-16 17:49:37 -0700128 break;
129 case DEVICE_AVAILABILITY_CHANGED:
alshabibacd91832014-10-17 14:38:41 -0700130 ld = discoverers.get(device.id());
alshabib7911a052014-10-16 17:49:37 -0700131 if (ld == null) {
132 return;
133 }
alshabibacd91832014-10-17 14:38:41 -0700134 if (deviceService.isAvailable(device.id())) {
alshabib7911a052014-10-16 17:49:37 -0700135 ld.start();
136 } else {
alshabibacd91832014-10-17 14:38:41 -0700137 providerService.linksVanished(device.id());
alshabib7911a052014-10-16 17:49:37 -0700138 ld.stop();
139 }
140 break;
141 case DEVICE_UPDATED:
142 case DEVICE_MASTERSHIP_CHANGED:
143 break;
144 default:
145 log.debug("Unknown event {}", event);
146 }
147 }
148
149 @Override
150 public void process(PacketContext context) {
151 LinkDiscovery ld = discoverers.get(
152 context.inPacket().receivedFrom().deviceId());
153 if (ld == null) {
154 return;
155 }
156
157 if (ld.handleLLDP(context)) {
158 context.block();
159 }
160 }
161 }
162
163}