Jonathan Hart
Committed by Gerrit Code Review

Fix issue with link discovery missing ports.

ONOS-2477.

Change-Id: I8d82ac687d6a3177b5216a19c99f0823a047529e
...@@ -163,16 +163,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { ...@@ -163,16 +163,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider {
163 ld = new LinkDiscovery(device, packetService, masterService, 163 ld = new LinkDiscovery(device, packetService, masterService,
164 providerService, useBDDP); 164 providerService, useBDDP);
165 discoverers.put(device.id(), ld); 165 discoverers.put(device.id(), ld);
166 - for (Port p : deviceService.getPorts(device.id())) { 166 + addPorts(ld, device.id());
167 - if (rules.isSuppressed(p)) {
168 - log.debug("LinkDiscovery from {}@{} disabled by configuration",
169 - p.number(), device.id());
170 - continue;
171 - }
172 - if (!p.number().isLogical()) {
173 - ld.addPort(p);
174 - }
175 - }
176 } 167 }
177 168
178 executor = newSingleThreadScheduledExecutor(groupedThreads("onos/device", "sync-%d")); 169 executor = newSingleThreadScheduledExecutor(groupedThreads("onos/device", "sync-%d"));
...@@ -183,6 +174,17 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { ...@@ -183,6 +174,17 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider {
183 log.info("Started"); 174 log.info("Started");
184 } 175 }
185 176
177 + private void addPorts(LinkDiscovery discoverer, DeviceId deviceId) {
178 + for (Port p : deviceService.getPorts(deviceId)) {
179 + if (rules.isSuppressed(p)) {
180 + continue;
181 + }
182 + if (!p.number().isLogical()) {
183 + discoverer.addPort(p);
184 + }
185 + }
186 + }
187 +
186 @Deactivate 188 @Deactivate
187 public void deactivate() { 189 public void deactivate() {
188 // TODO revoke all packet requests when deactivate 190 // TODO revoke all packet requests when deactivate
...@@ -252,7 +254,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { ...@@ -252,7 +254,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider {
252 TrafficSelector.Builder lldpSelector = DefaultTrafficSelector.builder(); 254 TrafficSelector.Builder lldpSelector = DefaultTrafficSelector.builder();
253 lldpSelector.matchEthType(Ethernet.TYPE_LLDP); 255 lldpSelector.matchEthType(Ethernet.TYPE_LLDP);
254 packetService.requestPackets(lldpSelector.build(), 256 packetService.requestPackets(lldpSelector.build(),
255 - PacketPriority.CONTROL, appId); 257 + PacketPriority.CONTROL, appId);
256 258
257 if (useBDDP) { 259 if (useBDDP) {
258 TrafficSelector.Builder bddpSelector = DefaultTrafficSelector.builder(); 260 TrafficSelector.Builder bddpSelector = DefaultTrafficSelector.builder();
...@@ -419,26 +421,20 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { ...@@ -419,26 +421,20 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider {
419 } 421 }
420 // check what deviceService sees, to see if we are missing anything 422 // check what deviceService sees, to see if we are missing anything
421 try { 423 try {
422 - LinkDiscovery ld = null;
423 for (Device dev : deviceService.getDevices()) { 424 for (Device dev : deviceService.getDevices()) {
424 if (rules.isSuppressed(dev)) { 425 if (rules.isSuppressed(dev)) {
425 continue; 426 continue;
426 } 427 }
427 DeviceId did = dev.id(); 428 DeviceId did = dev.id();
428 synchronized (discoverers) { 429 synchronized (discoverers) {
429 - if (!discoverers.containsKey(did)) { 430 + LinkDiscovery discoverer = discoverers.get(did);
430 - ld = new LinkDiscovery(dev, packetService, 431 + if (discoverer == null) {
431 - masterService, providerService, useBDDP); 432 + discoverer = new LinkDiscovery(dev, packetService,
432 - discoverers.put(did, ld); 433 + masterService, providerService, useBDDP);
433 - for (Port p : deviceService.getPorts(did)) { 434 + discoverers.put(did, discoverer);
434 - if (rules.isSuppressed(p)) {
435 - continue;
436 - }
437 - if (!p.number().isLogical()) {
438 - ld.addPort(p);
439 - }
440 - }
441 } 435 }
436 +
437 + addPorts(discoverer, did);
442 } 438 }
443 } 439 }
444 } catch (Exception e) { 440 } catch (Exception e) {
......
...@@ -15,22 +15,6 @@ ...@@ -15,22 +15,6 @@
15 */ 15 */
16 package org.onosproject.provider.lldp.impl; 16 package org.onosproject.provider.lldp.impl;
17 17
18 -import static com.google.common.base.Preconditions.checkNotNull;
19 -import static java.util.concurrent.TimeUnit.MILLISECONDS;
20 -import static org.onosproject.net.MastershipRole.MASTER;
21 -import static org.onosproject.net.PortNumber.portNumber;
22 -import static org.onosproject.net.flow.DefaultTrafficTreatment.builder;
23 -import static org.slf4j.LoggerFactory.getLogger;
24 -
25 -import java.nio.ByteBuffer;
26 -import java.util.Collections;
27 -import java.util.HashMap;
28 -import java.util.HashSet;
29 -import java.util.Iterator;
30 -import java.util.Map;
31 -import java.util.Set;
32 -import java.util.concurrent.atomic.AtomicInteger;
33 -
34 import org.jboss.netty.util.Timeout; 18 import org.jboss.netty.util.Timeout;
35 import org.jboss.netty.util.TimerTask; 19 import org.jboss.netty.util.TimerTask;
36 import org.onlab.packet.Ethernet; 20 import org.onlab.packet.Ethernet;
...@@ -52,6 +36,22 @@ import org.onosproject.net.packet.PacketContext; ...@@ -52,6 +36,22 @@ import org.onosproject.net.packet.PacketContext;
52 import org.onosproject.net.packet.PacketService; 36 import org.onosproject.net.packet.PacketService;
53 import org.slf4j.Logger; 37 import org.slf4j.Logger;
54 38
39 +import java.nio.ByteBuffer;
40 +import java.util.Collections;
41 +import java.util.HashMap;
42 +import java.util.HashSet;
43 +import java.util.Iterator;
44 +import java.util.Map;
45 +import java.util.Set;
46 +import java.util.concurrent.atomic.AtomicInteger;
47 +
48 +import static com.google.common.base.Preconditions.checkNotNull;
49 +import static java.util.concurrent.TimeUnit.MILLISECONDS;
50 +import static org.onosproject.net.MastershipRole.MASTER;
51 +import static org.onosproject.net.PortNumber.portNumber;
52 +import static org.onosproject.net.flow.DefaultTrafficTreatment.builder;
53 +import static org.slf4j.LoggerFactory.getLogger;
54 +
55 // TODO: add 'fast discovery' mode: drop LLDPs in destination switch but listen for flow_removed messages 55 // TODO: add 'fast discovery' mode: drop LLDPs in destination switch but listen for flow_removed messages
56 56
57 /** 57 /**
...@@ -143,13 +143,19 @@ public class LinkDiscovery implements TimerTask { ...@@ -143,13 +143,19 @@ public class LinkDiscovery implements TimerTask {
143 public void addPort(final Port port) { 143 public void addPort(final Port port) {
144 this.log.debug("Sending init probe to port {}@{}", 144 this.log.debug("Sending init probe to port {}@{}",
145 port.number().toLong(), device.id()); 145 port.number().toLong(), device.id());
146 +
147 + boolean newPort = false;
148 + synchronized (this) {
149 + if (!containsPort(port.number().toLong())) {
150 + newPort = true;
151 + this.slowPorts.add(port.number().toLong());
152 + }
153 + }
154 +
146 boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER; 155 boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER;
147 - if (isMaster) { 156 + if (newPort && isMaster) {
148 sendProbes(port.number().toLong()); 157 sendProbes(port.number().toLong());
149 } 158 }
150 - synchronized (this) {
151 - this.slowPorts.add(port.number().toLong());
152 - }
153 } 159 }
154 160
155 /** 161 /**
......