ONOS-2812 Refactored the link code in search of a defect; the root cause was old…
… OVS-based switch which is wrongly forwarding LLDP frames. ONOS can fix this later by tracking links to be pruned using port pairs. Change-Id: Ia79ec69946daff80636f5ab4b75a3dcdba91465d
Showing
2 changed files
with
124 additions
and
138 deletions
... | @@ -275,6 +275,10 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -275,6 +275,10 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
275 | packetService.cancelPackets(selector.build(), PacketPriority.CONTROL, appId); | 275 | packetService.cancelPackets(selector.build(), PacketPriority.CONTROL, appId); |
276 | } | 276 | } |
277 | 277 | ||
278 | + private LinkDiscovery createLinkDiscovery(Device device) { | ||
279 | + return new LinkDiscovery(device, packetService, masterService, | ||
280 | + providerService, useBDDP); | ||
281 | + } | ||
278 | 282 | ||
279 | private class InternalRoleListener implements MastershipListener { | 283 | private class InternalRoleListener implements MastershipListener { |
280 | 284 | ||
... | @@ -297,11 +301,8 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -297,11 +301,8 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
297 | synchronized (discoverers) { | 301 | synchronized (discoverers) { |
298 | if (!discoverers.containsKey(deviceId)) { | 302 | if (!discoverers.containsKey(deviceId)) { |
299 | // ideally, should never reach here | 303 | // ideally, should never reach here |
300 | - log.debug("Device mastership changed ({}) {}", | 304 | + log.debug("Device mastership changed ({}) {}", event.type(), deviceId); |
301 | - event.type(), deviceId); | 305 | + discoverers.put(deviceId, createLinkDiscovery(device)); |
302 | - discoverers.put(deviceId, new LinkDiscovery(device, | ||
303 | - packetService, masterService, providerService, | ||
304 | - useBDDP)); | ||
305 | } | 306 | } |
306 | } | 307 | } |
307 | } | 308 | } |
... | @@ -331,15 +332,11 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -331,15 +332,11 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
331 | log.debug("LinkDiscovery from {} disabled by configuration", device.id()); | 332 | log.debug("LinkDiscovery from {} disabled by configuration", device.id()); |
332 | return; | 333 | return; |
333 | } | 334 | } |
334 | - log.debug("Device added ({}) {}", event.type(), | 335 | + log.debug("Device added ({}) {}", event.type(), deviceId); |
335 | - deviceId); | 336 | + discoverers.put(deviceId, createLinkDiscovery(device)); |
336 | - discoverers.put(deviceId, new LinkDiscovery(device, | ||
337 | - packetService, masterService, | ||
338 | - providerService, useBDDP)); | ||
339 | } else { | 337 | } else { |
340 | if (ld.isStopped()) { | 338 | if (ld.isStopped()) { |
341 | - log.debug("Device restarted ({}) {}", event.type(), | 339 | + log.debug("Device restarted ({}) {}", event.type(), deviceId); |
342 | - deviceId); | ||
343 | ld.start(); | 340 | ld.start(); |
344 | } | 341 | } |
345 | } | 342 | } |
... | @@ -363,15 +360,13 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -363,15 +360,13 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
363 | } | 360 | } |
364 | } else { | 361 | } else { |
365 | log.debug("Port down {}", port); | 362 | log.debug("Port down {}", port); |
366 | - ConnectPoint point = new ConnectPoint(deviceId, | 363 | + ConnectPoint point = new ConnectPoint(deviceId, port.number()); |
367 | - port.number()); | ||
368 | providerService.linksVanished(point); | 364 | providerService.linksVanished(point); |
369 | } | 365 | } |
370 | break; | 366 | break; |
371 | case PORT_REMOVED: | 367 | case PORT_REMOVED: |
372 | log.debug("Port removed {}", port); | 368 | log.debug("Port removed {}", port); |
373 | - ConnectPoint point = new ConnectPoint(deviceId, | 369 | + ConnectPoint point = new ConnectPoint(deviceId, port.number()); |
374 | - port.number()); | ||
375 | providerService.linksVanished(point); | 370 | providerService.linksVanished(point); |
376 | 371 | ||
377 | break; | 372 | break; |
... | @@ -411,8 +406,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -411,8 +406,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
411 | if (context == null) { | 406 | if (context == null) { |
412 | return; | 407 | return; |
413 | } | 408 | } |
414 | - LinkDiscovery ld = discoverers.get( | 409 | + LinkDiscovery ld = discoverers.get(context.inPacket().receivedFrom().deviceId()); |
415 | - context.inPacket().receivedFrom().deviceId()); | ||
416 | if (ld == null) { | 410 | if (ld == null) { |
417 | return; | 411 | return; |
418 | } | 412 | } |
... | @@ -441,8 +435,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -441,8 +435,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
441 | synchronized (discoverers) { | 435 | synchronized (discoverers) { |
442 | LinkDiscovery discoverer = discoverers.get(did); | 436 | LinkDiscovery discoverer = discoverers.get(did); |
443 | if (discoverer == null) { | 437 | if (discoverer == null) { |
444 | - discoverer = new LinkDiscovery(dev, packetService, | 438 | + discoverer = createLinkDiscovery(dev); |
445 | - masterService, providerService, useBDDP); | ||
446 | discoverers.put(did, discoverer); | 439 | discoverers.put(did, discoverer); |
447 | } | 440 | } |
448 | 441 | ... | ... |
... | @@ -15,21 +15,8 @@ | ... | @@ -15,21 +15,8 @@ |
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; | 18 | +import com.google.common.collect.Maps; |
19 | -import static java.util.concurrent.TimeUnit.MILLISECONDS; | 19 | +import com.google.common.collect.Sets; |
20 | -import static org.onosproject.net.PortNumber.portNumber; | ||
21 | -import static org.onosproject.net.flow.DefaultTrafficTreatment.builder; | ||
22 | -import static org.slf4j.LoggerFactory.getLogger; | ||
23 | - | ||
24 | -import java.nio.ByteBuffer; | ||
25 | -import java.util.Collections; | ||
26 | -import java.util.HashMap; | ||
27 | -import java.util.HashSet; | ||
28 | -import java.util.Iterator; | ||
29 | -import java.util.Map; | ||
30 | -import java.util.Set; | ||
31 | -import java.util.concurrent.atomic.AtomicInteger; | ||
32 | - | ||
33 | import org.jboss.netty.util.Timeout; | 20 | import org.jboss.netty.util.Timeout; |
34 | import org.jboss.netty.util.TimerTask; | 21 | import org.jboss.netty.util.TimerTask; |
35 | import org.onlab.packet.Ethernet; | 22 | import org.onlab.packet.Ethernet; |
... | @@ -51,7 +38,20 @@ import org.onosproject.net.packet.PacketContext; | ... | @@ -51,7 +38,20 @@ import org.onosproject.net.packet.PacketContext; |
51 | import org.onosproject.net.packet.PacketService; | 38 | import org.onosproject.net.packet.PacketService; |
52 | import org.slf4j.Logger; | 39 | import org.slf4j.Logger; |
53 | 40 | ||
41 | +import java.nio.ByteBuffer; | ||
42 | +import java.util.Iterator; | ||
43 | +import java.util.Map; | ||
44 | +import java.util.Set; | ||
45 | +import java.util.concurrent.atomic.AtomicInteger; | ||
46 | + | ||
47 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
48 | +import static java.util.concurrent.TimeUnit.MILLISECONDS; | ||
49 | +import static org.onosproject.net.PortNumber.portNumber; | ||
50 | +import static org.onosproject.net.flow.DefaultTrafficTreatment.builder; | ||
51 | +import static org.slf4j.LoggerFactory.getLogger; | ||
52 | + | ||
54 | // TODO: add 'fast discovery' mode: drop LLDPs in destination switch but listen for flow_removed messages | 53 | // TODO: add 'fast discovery' mode: drop LLDPs in destination switch but listen for flow_removed messages |
54 | +// FIXME: add ability to track links using port pairs or the link inventory | ||
55 | 55 | ||
56 | /** | 56 | /** |
57 | * Run discovery process from a physical switch. Ports are initially labeled as | 57 | * Run discovery process from a physical switch. Ports are initially labeled as |
... | @@ -62,74 +62,79 @@ import org.slf4j.Logger; | ... | @@ -62,74 +62,79 @@ import org.slf4j.Logger; |
62 | */ | 62 | */ |
63 | public class LinkDiscovery implements TimerTask { | 63 | public class LinkDiscovery implements TimerTask { |
64 | 64 | ||
65 | + private final Logger log = getLogger(getClass()); | ||
66 | + | ||
67 | + private static final short MAX_PROBE_COUNT = 3; // probes to send before link is removed | ||
68 | + private static final short DEFAULT_PROBE_RATE = 3000; // millis | ||
69 | + private static final String SRC_MAC = "DE:AD:BE:EF:BA:11"; | ||
70 | + private static final String SERVICE_NULL = "Service cannot be null"; | ||
71 | + | ||
65 | private final Device device; | 72 | private final Device device; |
73 | + | ||
66 | // send 1 probe every probeRate milliseconds | 74 | // send 1 probe every probeRate milliseconds |
67 | - private final long probeRate; | 75 | + private final long probeRate = DEFAULT_PROBE_RATE; |
68 | - private final Set<Long> slowPorts; | 76 | + |
77 | + private final Set<Long> slowPorts = Sets.newConcurrentHashSet(); | ||
69 | // ports, known to have incoming links | 78 | // ports, known to have incoming links |
70 | - private final Set<Long> fastPorts; | 79 | + private final Set<Long> fastPorts = Sets.newConcurrentHashSet(); |
80 | + | ||
71 | // number of unacknowledged probes per port | 81 | // number of unacknowledged probes per port |
72 | - private final Map<Long, AtomicInteger> portProbeCount; | 82 | + private final Map<Long, AtomicInteger> portProbeCount = Maps.newHashMap(); |
73 | - // number of probes to send before link is removed | 83 | + |
74 | - private static final short MAX_PROBE_COUNT = 3; | ||
75 | - private final Logger log = getLogger(getClass()); | ||
76 | private final ONOSLLDP lldpPacket; | 84 | private final ONOSLLDP lldpPacket; |
77 | private final Ethernet ethPacket; | 85 | private final Ethernet ethPacket; |
78 | private Ethernet bddpEth; | 86 | private Ethernet bddpEth; |
79 | private final boolean useBDDP; | 87 | private final boolean useBDDP; |
88 | + | ||
89 | + private Timeout timeout; | ||
90 | + private volatile boolean isStopped; | ||
91 | + | ||
80 | private final LinkProviderService linkProvider; | 92 | private final LinkProviderService linkProvider; |
81 | private final PacketService pktService; | 93 | private final PacketService pktService; |
82 | private final MastershipService mastershipService; | 94 | private final MastershipService mastershipService; |
83 | - private Timeout timeout; | ||
84 | - private volatile boolean isStopped; | ||
85 | 95 | ||
86 | /** | 96 | /** |
87 | * Instantiates discovery manager for the given physical switch. Creates a | 97 | * Instantiates discovery manager for the given physical switch. Creates a |
88 | * generic LLDP packet that will be customized for the port it is sent out on. | 98 | * generic LLDP packet that will be customized for the port it is sent out on. |
89 | * Starts the the timer for the discovery process. | 99 | * Starts the the timer for the discovery process. |
90 | * | 100 | * |
91 | - * @param device the physical switch | 101 | + * @param device the physical switch |
92 | - * @param pktService packet service | 102 | + * @param pktService packet service |
93 | - * @param masterService mastership service | 103 | + * @param masterService mastership service |
94 | * @param providerService link provider service | 104 | * @param providerService link provider service |
95 | - * @param useBDDP flag to also use BDDP for discovery | 105 | + * @param useBDDP flag to also use BDDP for discovery |
96 | */ | 106 | */ |
97 | public LinkDiscovery(Device device, PacketService pktService, | 107 | public LinkDiscovery(Device device, PacketService pktService, |
98 | MastershipService masterService, | 108 | MastershipService masterService, |
99 | LinkProviderService providerService, Boolean... useBDDP) { | 109 | LinkProviderService providerService, Boolean... useBDDP) { |
100 | this.device = device; | 110 | this.device = device; |
101 | - this.probeRate = 3000; | 111 | + this.linkProvider = checkNotNull(providerService, SERVICE_NULL); |
102 | - this.linkProvider = providerService; | 112 | + this.pktService = checkNotNull(pktService, SERVICE_NULL); |
103 | - this.pktService = pktService; | 113 | + this.mastershipService = checkNotNull(masterService, SERVICE_NULL); |
104 | - | 114 | + |
105 | - this.mastershipService = checkNotNull(masterService, "WTF!"); | 115 | + lldpPacket = new ONOSLLDP(); |
106 | - this.slowPorts = Collections.synchronizedSet(new HashSet<>()); | 116 | + lldpPacket.setChassisId(device.chassisId()); |
107 | - this.fastPorts = Collections.synchronizedSet(new HashSet<>()); | 117 | + lldpPacket.setDevice(device.id().toString()); |
108 | - this.portProbeCount = new HashMap<>(); | 118 | + |
109 | - this.lldpPacket = new ONOSLLDP(); | 119 | + ethPacket = new Ethernet(); |
110 | - this.lldpPacket.setChassisId(device.chassisId()); | 120 | + ethPacket.setEtherType(Ethernet.TYPE_LLDP); |
111 | - this.lldpPacket.setDevice(device.id().toString()); | 121 | + ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_NICIRA); |
112 | - | 122 | + ethPacket.setPayload(this.lldpPacket); |
113 | - | 123 | + ethPacket.setPad(true); |
114 | - this.ethPacket = new Ethernet(); | 124 | + |
115 | - this.ethPacket.setEtherType(Ethernet.TYPE_LLDP); | ||
116 | - this.ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_NICIRA); | ||
117 | - this.ethPacket.setPayload(this.lldpPacket); | ||
118 | - this.ethPacket.setPad(true); | ||
119 | this.useBDDP = useBDDP.length > 0 ? useBDDP[0] : false; | 125 | this.useBDDP = useBDDP.length > 0 ? useBDDP[0] : false; |
120 | if (this.useBDDP) { | 126 | if (this.useBDDP) { |
121 | - this.bddpEth = new Ethernet(); | 127 | + bddpEth = new Ethernet(); |
122 | - this.bddpEth.setPayload(this.lldpPacket); | 128 | + bddpEth.setPayload(lldpPacket); |
123 | - this.bddpEth.setEtherType(Ethernet.TYPE_BSN); | 129 | + bddpEth.setEtherType(Ethernet.TYPE_BSN); |
124 | - this.bddpEth.setDestinationMACAddress(ONOSLLDP.BDDP_MULTICAST); | 130 | + bddpEth.setDestinationMACAddress(ONOSLLDP.BDDP_MULTICAST); |
125 | - this.bddpEth.setPad(true); | 131 | + bddpEth.setPad(true); |
126 | log.info("Using BDDP to discover network"); | 132 | log.info("Using BDDP to discover network"); |
127 | } | 133 | } |
128 | 134 | ||
129 | - this.isStopped = true; | 135 | + isStopped = true; |
130 | start(); | 136 | start(); |
131 | - this.log.debug("Started discovery manager for switch {}", | 137 | + log.debug("Started discovery manager for switch {}", device.id()); |
132 | - device.id()); | ||
133 | 138 | ||
134 | } | 139 | } |
135 | 140 | ||
... | @@ -139,19 +144,18 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -139,19 +144,18 @@ public class LinkDiscovery implements TimerTask { |
139 | * | 144 | * |
140 | * @param port the port | 145 | * @param port the port |
141 | */ | 146 | */ |
142 | - public void addPort(final Port port) { | 147 | + public void addPort(Port port) { |
143 | boolean newPort = false; | 148 | boolean newPort = false; |
144 | synchronized (this) { | 149 | synchronized (this) { |
145 | if (!containsPort(port.number().toLong())) { | 150 | if (!containsPort(port.number().toLong())) { |
146 | newPort = true; | 151 | newPort = true; |
147 | - this.slowPorts.add(port.number().toLong()); | 152 | + slowPorts.add(port.number().toLong()); |
148 | } | 153 | } |
149 | } | 154 | } |
150 | 155 | ||
151 | boolean isMaster = mastershipService.isLocalMaster(device.id()); | 156 | boolean isMaster = mastershipService.isLocalMaster(device.id()); |
152 | if (newPort && isMaster) { | 157 | if (newPort && isMaster) { |
153 | - this.log.debug("Sending init probe to port {}@{}", | 158 | + log.debug("Sending init probe to port {}@{}", port.number().toLong(), device.id()); |
154 | - port.number().toLong(), device.id()); | ||
155 | sendProbes(port.number().toLong()); | 159 | sendProbes(port.number().toLong()); |
156 | } | 160 | } |
157 | } | 161 | } |
... | @@ -161,21 +165,19 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -161,21 +165,19 @@ public class LinkDiscovery implements TimerTask { |
161 | * | 165 | * |
162 | * @param port the port | 166 | * @param port the port |
163 | */ | 167 | */ |
164 | - public void removePort(final Port port) { | 168 | + public void removePort(Port port) { |
165 | // Ignore ports that are not on this switch | 169 | // Ignore ports that are not on this switch |
166 | - | ||
167 | long portnum = port.number().toLong(); | 170 | long portnum = port.number().toLong(); |
168 | synchronized (this) { | 171 | synchronized (this) { |
169 | - if (this.slowPorts.contains(portnum)) { | 172 | + if (slowPorts.contains(portnum)) { |
170 | - this.slowPorts.remove(portnum); | 173 | + slowPorts.remove(portnum); |
171 | 174 | ||
172 | - } else if (this.fastPorts.contains(portnum)) { | 175 | + } else if (fastPorts.contains(portnum)) { |
173 | - this.fastPorts.remove(portnum); | 176 | + fastPorts.remove(portnum); |
174 | - this.portProbeCount.remove(portnum); | 177 | + portProbeCount.remove(portnum); |
175 | // no iterator to update | 178 | // no iterator to update |
176 | } else { | 179 | } else { |
177 | - this.log.warn("Tried to dynamically remove non-existing port {}", | 180 | + log.warn("Tried to dynamically remove non-existing port {}", portnum); |
178 | - portnum); | ||
179 | } | 181 | } |
180 | } | 182 | } |
181 | } | 183 | } |
... | @@ -187,18 +189,17 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -187,18 +189,17 @@ public class LinkDiscovery implements TimerTask { |
187 | * | 189 | * |
188 | * @param portNumber the port | 190 | * @param portNumber the port |
189 | */ | 191 | */ |
190 | - public void ackProbe(final Long portNumber) { | 192 | + public void ackProbe(Long portNumber) { |
191 | synchronized (this) { | 193 | synchronized (this) { |
192 | - if (this.slowPorts.contains(portNumber)) { | 194 | + if (slowPorts.contains(portNumber)) { |
193 | - this.log.debug("Setting slow port to fast: {}:{}", | 195 | + log.debug("Setting slow port to fast: {}:{}", device.id(), portNumber); |
194 | - this.device.id(), portNumber); | 196 | + slowPorts.remove(portNumber); |
195 | - this.slowPorts.remove(portNumber); | 197 | + fastPorts.add(portNumber); |
196 | - this.fastPorts.add(portNumber); | 198 | + portProbeCount.put(portNumber, new AtomicInteger(0)); |
197 | - this.portProbeCount.put(portNumber, new AtomicInteger(0)); | 199 | + } else if (fastPorts.contains(portNumber)) { |
198 | - } else if (this.fastPorts.contains(portNumber)) { | 200 | + portProbeCount.get(portNumber).set(0); |
199 | - this.portProbeCount.get(portNumber).set(0); | ||
200 | } else { | 201 | } else { |
201 | - this.log.debug("Got ackProbe for non-existing port: {}", portNumber); | 202 | + log.debug("Got ackProbe for non-existing port: {}", portNumber); |
202 | } | 203 | } |
203 | } | 204 | } |
204 | } | 205 | } |
... | @@ -207,6 +208,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -207,6 +208,7 @@ public class LinkDiscovery implements TimerTask { |
207 | /** | 208 | /** |
208 | * Handles an incoming LLDP packet. Creates link in topology and sends ACK | 209 | * Handles an incoming LLDP packet. Creates link in topology and sends ACK |
209 | * to port where LLDP originated. | 210 | * to port where LLDP originated. |
211 | + * | ||
210 | * @param context packet context | 212 | * @param context packet context |
211 | * @return true if handled | 213 | * @return true if handled |
212 | */ | 214 | */ |
... | @@ -218,21 +220,18 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -218,21 +220,18 @@ public class LinkDiscovery implements TimerTask { |
218 | 220 | ||
219 | ONOSLLDP onoslldp = ONOSLLDP.parseONOSLLDP(eth); | 221 | ONOSLLDP onoslldp = ONOSLLDP.parseONOSLLDP(eth); |
220 | if (onoslldp != null) { | 222 | if (onoslldp != null) { |
221 | - final PortNumber dstPort = | 223 | + PortNumber srcPort = portNumber(onoslldp.getPort()); |
222 | - context.inPacket().receivedFrom().port(); | 224 | + PortNumber dstPort = context.inPacket().receivedFrom().port(); |
223 | - final PortNumber srcPort = portNumber(onoslldp.getPort()); | 225 | + DeviceId srcDeviceId = DeviceId.deviceId(onoslldp.getDeviceString()); |
224 | - final DeviceId srcDeviceId = DeviceId.deviceId(onoslldp.getDeviceString()); | 226 | + DeviceId dstDeviceId = context.inPacket().receivedFrom().deviceId(); |
225 | - final DeviceId dstDeviceId = context.inPacket().receivedFrom().deviceId(); | 227 | + ackProbe(dstPort.toLong()); |
226 | - this.ackProbe(dstPort.toLong()); | 228 | + |
227 | ConnectPoint src = new ConnectPoint(srcDeviceId, srcPort); | 229 | ConnectPoint src = new ConnectPoint(srcDeviceId, srcPort); |
228 | ConnectPoint dst = new ConnectPoint(dstDeviceId, dstPort); | 230 | ConnectPoint dst = new ConnectPoint(dstDeviceId, dstPort); |
229 | 231 | ||
230 | - LinkDescription ld; | 232 | + LinkDescription ld = eth.getEtherType() == Ethernet.TYPE_LLDP ? |
231 | - if (eth.getEtherType() == Ethernet.TYPE_BSN) { | 233 | + new DefaultLinkDescription(src, dst, Type.DIRECT) : |
232 | - ld = new DefaultLinkDescription(src, dst, Type.INDIRECT); | 234 | + new DefaultLinkDescription(src, dst, Type.INDIRECT); |
233 | - } else { | ||
234 | - ld = new DefaultLinkDescription(src, dst, Type.DIRECT); | ||
235 | - } | ||
236 | 235 | ||
237 | try { | 236 | try { |
238 | linkProvider.linkDetected(ld); | 237 | linkProvider.linkDetected(ld); |
... | @@ -253,38 +252,36 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -253,38 +252,36 @@ public class LinkDiscovery implements TimerTask { |
253 | * @param t timeout | 252 | * @param t timeout |
254 | */ | 253 | */ |
255 | @Override | 254 | @Override |
256 | - public void run(final Timeout t) { | 255 | + public void run(Timeout t) { |
257 | if (isStopped()) { | 256 | if (isStopped()) { |
258 | return; | 257 | return; |
259 | } | 258 | } |
260 | if (!mastershipService.isLocalMaster(device.id())) { | 259 | if (!mastershipService.isLocalMaster(device.id())) { |
261 | if (!isStopped()) { | 260 | if (!isStopped()) { |
262 | // reschedule timer | 261 | // reschedule timer |
263 | - timeout = Timer.getTimer().newTimeout(this, this.probeRate, MILLISECONDS); | 262 | + timeout = Timer.getTimer().newTimeout(this, probeRate, MILLISECONDS); |
264 | } | 263 | } |
265 | return; | 264 | return; |
266 | } | 265 | } |
267 | 266 | ||
268 | - this.log.trace("Sending probes from {}", device.id()); | 267 | + log.trace("Sending probes from {}", device.id()); |
269 | synchronized (this) { | 268 | synchronized (this) { |
270 | - final Iterator<Long> fastIterator = this.fastPorts.iterator(); | 269 | + Iterator<Long> fastIterator = fastPorts.iterator(); |
271 | while (fastIterator.hasNext()) { | 270 | while (fastIterator.hasNext()) { |
272 | long portNumber = fastIterator.next(); | 271 | long portNumber = fastIterator.next(); |
273 | int probeCount = portProbeCount.get(portNumber).getAndIncrement(); | 272 | int probeCount = portProbeCount.get(portNumber).getAndIncrement(); |
274 | 273 | ||
275 | if (probeCount < LinkDiscovery.MAX_PROBE_COUNT) { | 274 | if (probeCount < LinkDiscovery.MAX_PROBE_COUNT) { |
276 | - this.log.trace("Sending fast probe to port {}", portNumber); | 275 | + log.trace("Sending fast probe to port {}", portNumber); |
277 | sendProbes(portNumber); | 276 | sendProbes(portNumber); |
278 | 277 | ||
279 | } else { | 278 | } else { |
280 | - // Link down, demote to slowPorts | 279 | + // Link down, demote to slowPorts; update fast and slow ports |
281 | - // Update fast and slow ports | ||
282 | fastIterator.remove(); | 280 | fastIterator.remove(); |
283 | - this.slowPorts.add(portNumber); | 281 | + slowPorts.add(portNumber); |
284 | - this.portProbeCount.remove(portNumber); | 282 | + portProbeCount.remove(portNumber); |
285 | 283 | ||
286 | - ConnectPoint cp = new ConnectPoint(device.id(), | 284 | + ConnectPoint cp = new ConnectPoint(device.id(), portNumber(portNumber)); |
287 | - portNumber(portNumber)); | ||
288 | log.debug("Link down -> {}", cp); | 285 | log.debug("Link down -> {}", cp); |
289 | linkProvider.linksVanished(cp); | 286 | linkProvider.linksVanished(cp); |
290 | } | 287 | } |
... | @@ -292,14 +289,14 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -292,14 +289,14 @@ public class LinkDiscovery implements TimerTask { |
292 | 289 | ||
293 | // send a probe for the next slow port | 290 | // send a probe for the next slow port |
294 | for (long portNumber : slowPorts) { | 291 | for (long portNumber : slowPorts) { |
295 | - this.log.trace("Sending slow probe to port {}", portNumber); | 292 | + log.trace("Sending slow probe to port {}", portNumber); |
296 | sendProbes(portNumber); | 293 | sendProbes(portNumber); |
297 | } | 294 | } |
298 | } | 295 | } |
299 | 296 | ||
300 | if (!isStopped()) { | 297 | if (!isStopped()) { |
301 | // reschedule timer | 298 | // reschedule timer |
302 | - timeout = Timer.getTimer().newTimeout(this, this.probeRate, MILLISECONDS); | 299 | + timeout = Timer.getTimer().newTimeout(this, probeRate, MILLISECONDS); |
303 | } | 300 | } |
304 | } | 301 | } |
305 | 302 | ||
... | @@ -323,17 +320,15 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -323,17 +320,15 @@ public class LinkDiscovery implements TimerTask { |
323 | * @param port the port | 320 | * @param port the port |
324 | * @return Packet_out message with LLDP data | 321 | * @return Packet_out message with LLDP data |
325 | */ | 322 | */ |
326 | - private OutboundPacket createOutBoundLLDP(final Long port) { | 323 | + private OutboundPacket createOutBoundLLDP(Long port) { |
327 | if (port == null) { | 324 | if (port == null) { |
328 | return null; | 325 | return null; |
329 | } | 326 | } |
330 | - this.lldpPacket.setPortId(port.intValue()); | 327 | + lldpPacket.setPortId(port.intValue()); |
331 | - this.ethPacket.setSourceMACAddress("DE:AD:BE:EF:BA:11"); | 328 | + ethPacket.setSourceMACAddress(SRC_MAC); |
332 | - | 329 | + return new DefaultOutboundPacket(device.id(), |
333 | - final byte[] lldp = this.ethPacket.serialize(); | ||
334 | - return new DefaultOutboundPacket(this.device.id(), | ||
335 | builder().setOutput(portNumber(port)).build(), | 330 | builder().setOutput(portNumber(port)).build(), |
336 | - ByteBuffer.wrap(lldp)); | 331 | + ByteBuffer.wrap(ethPacket.serialize())); |
337 | } | 332 | } |
338 | 333 | ||
339 | /** | 334 | /** |
... | @@ -342,25 +337,23 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -342,25 +337,23 @@ public class LinkDiscovery implements TimerTask { |
342 | * @param port the port | 337 | * @param port the port |
343 | * @return Packet_out message with LLDP data | 338 | * @return Packet_out message with LLDP data |
344 | */ | 339 | */ |
345 | - private OutboundPacket createOutBoundBDDP(final Long port) { | 340 | + private OutboundPacket createOutBoundBDDP(Long port) { |
346 | if (port == null) { | 341 | if (port == null) { |
347 | return null; | 342 | return null; |
348 | } | 343 | } |
349 | - this.lldpPacket.setPortId(port.intValue()); | 344 | + lldpPacket.setPortId(port.intValue()); |
350 | - this.bddpEth.setSourceMACAddress("DE:AD:BE:EF:BA:11"); | 345 | + bddpEth.setSourceMACAddress(SRC_MAC); |
351 | - | 346 | + return new DefaultOutboundPacket(device.id(), |
352 | - final byte[] bddp = this.bddpEth.serialize(); | ||
353 | - return new DefaultOutboundPacket(this.device.id(), | ||
354 | builder().setOutput(portNumber(port)).build(), | 347 | builder().setOutput(portNumber(port)).build(), |
355 | - ByteBuffer.wrap(bddp)); | 348 | + ByteBuffer.wrap(bddpEth.serialize())); |
356 | } | 349 | } |
357 | 350 | ||
358 | private void sendProbes(Long portNumber) { | 351 | private void sendProbes(Long portNumber) { |
359 | log.trace("Sending probes out to {}@{}", portNumber, device.id()); | 352 | log.trace("Sending probes out to {}@{}", portNumber, device.id()); |
360 | - OutboundPacket pkt = this.createOutBoundLLDP(portNumber); | 353 | + OutboundPacket pkt = createOutBoundLLDP(portNumber); |
361 | pktService.emit(pkt); | 354 | pktService.emit(pkt); |
362 | if (useBDDP) { | 355 | if (useBDDP) { |
363 | - OutboundPacket bpkt = this.createOutBoundBDDP(portNumber); | 356 | + OutboundPacket bpkt = createOutBoundBDDP(portNumber); |
364 | pktService.emit(bpkt); | 357 | pktService.emit(bpkt); |
365 | } | 358 | } |
366 | } | 359 | } | ... | ... |
-
Please register or login to post a comment