Thomas Vachuska

Added isLinkLocal predicate to MacAddress and used it in ReactiveForwarding.

...@@ -137,6 +137,11 @@ public class ReactiveForwarding { ...@@ -137,6 +137,11 @@ public class ReactiveForwarding {
137 137
138 HostId id = HostId.hostId(ethPkt.getDestinationMAC()); 138 HostId id = HostId.hostId(ethPkt.getDestinationMAC());
139 139
140 + // Do not process link-local addresses in any way.
141 + if (id.mac().isLinkLocal()) {
142 + return;
143 + }
144 +
140 // Do we know who this is for? If not, flood and bail. 145 // Do we know who this is for? If not, flood and bail.
141 Host dst = hostService.getHost(id); 146 Host dst = hostService.getHost(id);
142 if (dst == null) { 147 if (dst == null) {
......
...@@ -18,20 +18,6 @@ ...@@ -18,20 +18,6 @@
18 */ 18 */
19 package org.onlab.onos.provider.lldp.impl; 19 package org.onlab.onos.provider.lldp.impl;
20 20
21 -
22 -import static com.google.common.base.Preconditions.checkNotNull;
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.TimeUnit;
33 -import java.util.concurrent.atomic.AtomicInteger;
34 -
35 import org.jboss.netty.util.Timeout; 21 import org.jboss.netty.util.Timeout;
36 import org.jboss.netty.util.TimerTask; 22 import org.jboss.netty.util.TimerTask;
37 import org.onlab.onos.mastership.MastershipService; 23 import org.onlab.onos.mastership.MastershipService;
...@@ -39,10 +25,8 @@ import org.onlab.onos.net.ConnectPoint; ...@@ -39,10 +25,8 @@ import org.onlab.onos.net.ConnectPoint;
39 import org.onlab.onos.net.Device; 25 import org.onlab.onos.net.Device;
40 import org.onlab.onos.net.DeviceId; 26 import org.onlab.onos.net.DeviceId;
41 import org.onlab.onos.net.Link.Type; 27 import org.onlab.onos.net.Link.Type;
42 -import org.onlab.onos.net.MastershipRole;
43 import org.onlab.onos.net.Port; 28 import org.onlab.onos.net.Port;
44 import org.onlab.onos.net.PortNumber; 29 import org.onlab.onos.net.PortNumber;
45 -import org.onlab.onos.net.flow.DefaultTrafficTreatment;
46 import org.onlab.onos.net.link.DefaultLinkDescription; 30 import org.onlab.onos.net.link.DefaultLinkDescription;
47 import org.onlab.onos.net.link.LinkDescription; 31 import org.onlab.onos.net.link.LinkDescription;
48 import org.onlab.onos.net.link.LinkProviderService; 32 import org.onlab.onos.net.link.LinkProviderService;
...@@ -55,7 +39,21 @@ import org.onlab.packet.ONOSLLDP; ...@@ -55,7 +39,21 @@ import org.onlab.packet.ONOSLLDP;
55 import org.onlab.util.Timer; 39 import org.onlab.util.Timer;
56 import org.slf4j.Logger; 40 import org.slf4j.Logger;
57 41
42 +import java.nio.ByteBuffer;
43 +import java.util.Collections;
44 +import java.util.HashMap;
45 +import java.util.HashSet;
46 +import java.util.Iterator;
47 +import java.util.Map;
48 +import java.util.Set;
49 +import java.util.concurrent.atomic.AtomicInteger;
58 50
51 +import static com.google.common.base.Preconditions.checkNotNull;
52 +import static java.util.concurrent.TimeUnit.MILLISECONDS;
53 +import static org.onlab.onos.net.MastershipRole.MASTER;
54 +import static org.onlab.onos.net.PortNumber.portNumber;
55 +import static org.onlab.onos.net.flow.DefaultTrafficTreatment.builder;
56 +import static org.slf4j.LoggerFactory.getLogger;
59 57
60 /** 58 /**
61 * Run discovery process from a physical switch. Ports are initially labeled as 59 * Run discovery process from a physical switch. Ports are initially labeled as
...@@ -63,7 +61,7 @@ import org.slf4j.Logger; ...@@ -63,7 +61,7 @@ import org.slf4j.Logger;
63 * fast. Every probeRate milliseconds, loop over all fast ports and send an 61 * fast. Every probeRate milliseconds, loop over all fast ports and send an
64 * LLDP, send an LLDP for a single slow port. Based on FlowVisor topology 62 * LLDP, send an LLDP for a single slow port. Based on FlowVisor topology
65 * discovery implementation. 63 * discovery implementation.
66 - * 64 + * <p/>
67 * TODO: add 'fast discovery' mode: drop LLDPs in destination switch but listen 65 * TODO: add 'fast discovery' mode: drop LLDPs in destination switch but listen
68 * for flow_removed messages 66 * for flow_removed messages
69 */ 67 */
...@@ -93,13 +91,14 @@ public class LinkDiscovery implements TimerTask { ...@@ -93,13 +91,14 @@ public class LinkDiscovery implements TimerTask {
93 * Instantiates discovery manager for the given physical switch. Creates a 91 * Instantiates discovery manager for the given physical switch. Creates a
94 * generic LLDP packet that will be customized for the port it is sent out on. 92 * generic LLDP packet that will be customized for the port it is sent out on.
95 * Starts the the timer for the discovery process. 93 * Starts the the timer for the discovery process.
94 + *
96 * @param device the physical switch 95 * @param device the physical switch
97 - * @param masterService 96 + * @param masterService mastership service
98 * @param useBDDP flag to also use BDDP for discovery 97 * @param useBDDP flag to also use BDDP for discovery
99 */ 98 */
100 public LinkDiscovery(Device device, PacketService pktService, 99 public LinkDiscovery(Device device, PacketService pktService,
101 - MastershipService masterService, LinkProviderService providerService, Boolean... useBDDP) { 100 + MastershipService masterService,
102 - 101 + LinkProviderService providerService, Boolean... useBDDP) {
103 this.device = device; 102 this.device = device;
104 this.probeRate = 3000; 103 this.probeRate = 3000;
105 this.linkProvider = providerService; 104 this.linkProvider = providerService;
...@@ -142,16 +141,12 @@ public class LinkDiscovery implements TimerTask { ...@@ -142,16 +141,12 @@ public class LinkDiscovery implements TimerTask {
142 * @param port the port 141 * @param port the port
143 */ 142 */
144 public void addPort(final Port port) { 143 public void addPort(final Port port) {
145 - this.log.debug("sending init probe to port {}@{}", 144 + this.log.debug("Sending init probe to port {}@{}",
146 port.number().toLong(), device.id()); 145 port.number().toLong(), device.id());
147 -
148 sendProbes(port.number().toLong()); 146 sendProbes(port.number().toLong());
149 -
150 synchronized (this) { 147 synchronized (this) {
151 this.slowPorts.add(port.number().toLong()); 148 this.slowPorts.add(port.number().toLong());
152 } 149 }
153 -
154 -
155 } 150 }
156 151
157 /** 152 /**
...@@ -172,8 +167,7 @@ public class LinkDiscovery implements TimerTask { ...@@ -172,8 +167,7 @@ public class LinkDiscovery implements TimerTask {
172 this.portProbeCount.remove(portnum); 167 this.portProbeCount.remove(portnum);
173 // no iterator to update 168 // no iterator to update
174 } else { 169 } else {
175 - this.log.warn( 170 + this.log.warn("Tried to dynamically remove non-existing port {}",
176 - "tried to dynamically remove non-existing port {}",
177 portnum); 171 portnum);
178 } 172 }
179 } 173 }
...@@ -187,7 +181,6 @@ public class LinkDiscovery implements TimerTask { ...@@ -187,7 +181,6 @@ public class LinkDiscovery implements TimerTask {
187 * @param portNumber the port 181 * @param portNumber the port
188 */ 182 */
189 public void ackProbe(final Long portNumber) { 183 public void ackProbe(final Long portNumber) {
190 -
191 synchronized (this) { 184 synchronized (this) {
192 if (this.slowPorts.contains(portNumber)) { 185 if (this.slowPorts.contains(portNumber)) {
193 this.log.debug("Setting slow port to fast: {}:{}", 186 this.log.debug("Setting slow port to fast: {}:{}",
...@@ -198,10 +191,7 @@ public class LinkDiscovery implements TimerTask { ...@@ -198,10 +191,7 @@ public class LinkDiscovery implements TimerTask {
198 } else if (this.fastPorts.contains(portNumber)) { 191 } else if (this.fastPorts.contains(portNumber)) {
199 this.portProbeCount.get(portNumber).set(0); 192 this.portProbeCount.get(portNumber).set(0);
200 } else { 193 } else {
201 - this.log.debug( 194 + this.log.debug("Got ackProbe for non-existing port: {}", portNumber);
202 - "Got ackProbe for non-existing port: {}",
203 - portNumber);
204 -
205 } 195 }
206 } 196 }
207 } 197 }
...@@ -217,7 +207,7 @@ public class LinkDiscovery implements TimerTask { ...@@ -217,7 +207,7 @@ public class LinkDiscovery implements TimerTask {
217 if (onoslldp != null) { 207 if (onoslldp != null) {
218 final PortNumber dstPort = 208 final PortNumber dstPort =
219 context.inPacket().receivedFrom().port(); 209 context.inPacket().receivedFrom().port();
220 - final PortNumber srcPort = PortNumber.portNumber(onoslldp.getPort()); 210 + final PortNumber srcPort = portNumber(onoslldp.getPort());
221 final DeviceId srcDeviceId = DeviceId.deviceId(onoslldp.getDeviceString()); 211 final DeviceId srcDeviceId = DeviceId.deviceId(onoslldp.getDeviceString());
222 final DeviceId dstDeviceId = context.inPacket().receivedFrom().deviceId(); 212 final DeviceId dstDeviceId = context.inPacket().receivedFrom().deviceId();
223 this.ackProbe(dstPort.toLong()); 213 this.ackProbe(dstPort.toLong());
...@@ -237,61 +227,48 @@ public class LinkDiscovery implements TimerTask { ...@@ -237,61 +227,48 @@ public class LinkDiscovery implements TimerTask {
237 } 227 }
238 228
239 229
240 -
241 /** 230 /**
242 * Execute this method every t milliseconds. Loops over all ports 231 * Execute this method every t milliseconds. Loops over all ports
243 * labeled as fast and sends out an LLDP. Send out an LLDP on a single slow 232 * labeled as fast and sends out an LLDP. Send out an LLDP on a single slow
244 * port. 233 * port.
245 * 234 *
246 * @param t timeout 235 * @param t timeout
247 - * @throws Exception
248 */ 236 */
249 @Override 237 @Override
250 public void run(final Timeout t) { 238 public void run(final Timeout t) {
251 - this.log.trace("sending probes from {}", device.id()); 239 + this.log.trace("Sending probes from {}", device.id());
252 synchronized (this) { 240 synchronized (this) {
253 final Iterator<Long> fastIterator = this.fastPorts.iterator(); 241 final Iterator<Long> fastIterator = this.fastPorts.iterator();
254 - Long portNumber;
255 - Integer probeCount;
256 while (fastIterator.hasNext()) { 242 while (fastIterator.hasNext()) {
257 - portNumber = fastIterator.next(); 243 + long portNumber = fastIterator.next();
258 - probeCount = this.portProbeCount.get(portNumber) 244 + int probeCount = portProbeCount.get(portNumber).getAndIncrement();
259 - .getAndIncrement();
260 245
261 if (probeCount < LinkDiscovery.MAX_PROBE_COUNT) { 246 if (probeCount < LinkDiscovery.MAX_PROBE_COUNT) {
262 - this.log.trace("sending fast probe to port {}", portNumber); 247 + this.log.trace("Sending fast probe to port {}", portNumber);
263 sendProbes(portNumber); 248 sendProbes(portNumber);
249 +
264 } else { 250 } else {
265 // Update fast and slow ports 251 // Update fast and slow ports
266 fastIterator.remove(); 252 fastIterator.remove();
267 this.slowPorts.add(portNumber); 253 this.slowPorts.add(portNumber);
268 this.portProbeCount.remove(portNumber); 254 this.portProbeCount.remove(portNumber);
269 255
270 - 256 + ConnectPoint cp = new ConnectPoint(device.id(),
271 - ConnectPoint cp = new ConnectPoint( 257 + portNumber(portNumber));
272 - device.id(),
273 - PortNumber.portNumber(portNumber));
274 log.debug("Link down -> {}", cp); 258 log.debug("Link down -> {}", cp);
275 linkProvider.linksVanished(cp); 259 linkProvider.linksVanished(cp);
276 } 260 }
277 } 261 }
278 262
279 // send a probe for the next slow port 263 // send a probe for the next slow port
280 - if (!this.slowPorts.isEmpty()) { 264 + for (long portNumber : slowPorts) {
281 - Iterator<Long> slowIterator = this.slowPorts.iterator(); 265 + this.log.trace("Sending slow probe to port {}", portNumber);
282 - while (slowIterator.hasNext()) {
283 - portNumber = slowIterator.next();
284 - this.log.trace("sending slow probe to port {}", portNumber);
285 -
286 sendProbes(portNumber); 266 sendProbes(portNumber);
287 -
288 - }
289 } 267 }
290 } 268 }
291 269
292 // reschedule timer 270 // reschedule timer
293 - timeout = Timer.getTimer().newTimeout(this, this.probeRate, 271 + timeout = Timer.getTimer().newTimeout(this, this.probeRate, MILLISECONDS);
294 - TimeUnit.MILLISECONDS);
295 } 272 }
296 273
297 public void stop() { 274 public void stop() {
...@@ -300,8 +277,7 @@ public class LinkDiscovery implements TimerTask { ...@@ -300,8 +277,7 @@ public class LinkDiscovery implements TimerTask {
300 } 277 }
301 278
302 public void start() { 279 public void start() {
303 - timeout = Timer.getTimer().newTimeout(this, 0, 280 + timeout = Timer.getTimer().newTimeout(this, 0, MILLISECONDS);
304 - TimeUnit.MILLISECONDS);
305 isStopped = false; 281 isStopped = false;
306 } 282 }
307 283
...@@ -319,12 +295,9 @@ public class LinkDiscovery implements TimerTask { ...@@ -319,12 +295,9 @@ public class LinkDiscovery implements TimerTask {
319 this.ethPacket.setSourceMACAddress("DE:AD:BE:EF:BA:11"); 295 this.ethPacket.setSourceMACAddress("DE:AD:BE:EF:BA:11");
320 296
321 final byte[] lldp = this.ethPacket.serialize(); 297 final byte[] lldp = this.ethPacket.serialize();
322 - OutboundPacket outboundPacket = new DefaultOutboundPacket( 298 + return new DefaultOutboundPacket(this.device.id(),
323 - this.device.id(), 299 + builder().setOutput(portNumber(port)).build(),
324 - DefaultTrafficTreatment.builder().setOutput(
325 - PortNumber.portNumber(port)).build(),
326 ByteBuffer.wrap(lldp)); 300 ByteBuffer.wrap(lldp));
327 - return outboundPacket;
328 } 301 }
329 302
330 /** 303 /**
...@@ -341,25 +314,15 @@ public class LinkDiscovery implements TimerTask { ...@@ -341,25 +314,15 @@ public class LinkDiscovery implements TimerTask {
341 this.bddpEth.setSourceMACAddress("DE:AD:BE:EF:BA:11"); 314 this.bddpEth.setSourceMACAddress("DE:AD:BE:EF:BA:11");
342 315
343 final byte[] bddp = this.bddpEth.serialize(); 316 final byte[] bddp = this.bddpEth.serialize();
344 - OutboundPacket outboundPacket = new DefaultOutboundPacket( 317 + return new DefaultOutboundPacket(this.device.id(),
345 - this.device.id(), 318 + builder().setOutput(portNumber(port)).build(),
346 - DefaultTrafficTreatment.builder()
347 - .setOutput(PortNumber.portNumber(port)).build(),
348 ByteBuffer.wrap(bddp)); 319 ByteBuffer.wrap(bddp));
349 - return outboundPacket;
350 } 320 }
351 321
352 private void sendProbes(Long portNumber) { 322 private void sendProbes(Long portNumber) {
353 - if (device == null) { 323 + boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER;
354 - log.warn("CRAZY SHIT"); 324 + if (isMaster && device.type() != Device.Type.ROADM) {
355 - } 325 + log.debug("Sending probes out to {}@{}", portNumber, device.id());
356 - if (mastershipService == null) {
357 - log.warn("INSANE");
358 - }
359 - if (device.type() != Device.Type.ROADM &&
360 - mastershipService.getLocalRole(this.device.id()) ==
361 - MastershipRole.MASTER) {
362 - log.debug("sending probes out to {}@{}", portNumber, device.id());
363 OutboundPacket pkt = this.createOutBoundLLDP(portNumber); 326 OutboundPacket pkt = this.createOutBoundLLDP(portNumber);
364 pktService.emit(pkt); 327 pktService.emit(pkt);
365 if (useBDDP) { 328 if (useBDDP) {
...@@ -370,10 +333,7 @@ public class LinkDiscovery implements TimerTask { ...@@ -370,10 +333,7 @@ public class LinkDiscovery implements TimerTask {
370 } 333 }
371 334
372 public boolean containsPort(Long portNumber) { 335 public boolean containsPort(Long portNumber) {
373 - if (slowPorts.contains(portNumber) || fastPorts.contains(portNumber)) { 336 + return slowPorts.contains(portNumber) || fastPorts.contains(portNumber);
374 - return true;
375 - }
376 - return false;
377 } 337 }
378 338
379 public boolean isStopped() { 339 public boolean isStopped() {
......
...@@ -22,7 +22,6 @@ import java.util.Arrays; ...@@ -22,7 +22,6 @@ import java.util.Arrays;
22 22
23 /** 23 /**
24 * The class representing MAC address. 24 * The class representing MAC address.
25 - *
26 */ 25 */
27 public class MacAddress { 26 public class MacAddress {
28 27
...@@ -32,6 +31,11 @@ public class MacAddress { ...@@ -32,6 +31,11 @@ public class MacAddress {
32 public static final byte[] ZERO_MAC_ADDRESS = ZERO.getAddress(); 31 public static final byte[] ZERO_MAC_ADDRESS = ZERO.getAddress();
33 public static final byte[] BROADCAST_MAC = BROADCAST.getAddress(); 32 public static final byte[] BROADCAST_MAC = BROADCAST.getAddress();
34 33
34 + private static final byte[] LL = new byte[]{
35 + 0x01, (byte) 0x80, (byte) 0xc2, 0x00, 0x00,
36 + 0x00, 0x0e, 0x03
37 + };
38 +
35 public static final int MAC_ADDRESS_LENGTH = 6; 39 public static final int MAC_ADDRESS_LENGTH = 6;
36 private byte[] address = new byte[MacAddress.MAC_ADDRESS_LENGTH]; 40 private byte[] address = new byte[MacAddress.MAC_ADDRESS_LENGTH];
37 41
...@@ -43,12 +47,10 @@ public class MacAddress { ...@@ -43,12 +47,10 @@ public class MacAddress {
43 * Returns a MAC address instance representing the value of the specified 47 * Returns a MAC address instance representing the value of the specified
44 * {@code String}. 48 * {@code String}.
45 * 49 *
46 - * @param address 50 + * @param address the String representation of the MAC Address to be parsed.
47 - * the String representation of the MAC Address to be parsed.
48 * @return a MAC Address instance representing the value of the specified 51 * @return a MAC Address instance representing the value of the specified
49 * {@code String}. 52 * {@code String}.
50 - * @throws IllegalArgumentException 53 + * @throws IllegalArgumentException if the string cannot be parsed as a MAC address.
51 - * if the string cannot be parsed as a MAC address.
52 */ 54 */
53 public static MacAddress valueOf(final String address) { 55 public static MacAddress valueOf(final String address) {
54 final String[] elements = address.split(":"); 56 final String[] elements = address.split(":");
...@@ -71,12 +73,10 @@ public class MacAddress { ...@@ -71,12 +73,10 @@ public class MacAddress {
71 * Returns a MAC address instance representing the specified {@code byte} 73 * Returns a MAC address instance representing the specified {@code byte}
72 * array. 74 * array.
73 * 75 *
74 - * @param address 76 + * @param address the byte array to be parsed.
75 - * the byte array to be parsed.
76 * @return a MAC address instance representing the specified {@code byte} 77 * @return a MAC address instance representing the specified {@code byte}
77 * array. 78 * array.
78 - * @throws IllegalArgumentException 79 + * @throws IllegalArgumentException if the byte array cannot be parsed as a MAC address.
79 - * if the byte array cannot be parsed as a MAC address.
80 */ 80 */
81 public static MacAddress valueOf(final byte[] address) { 81 public static MacAddress valueOf(final byte[] address) {
82 if (address.length != MacAddress.MAC_ADDRESS_LENGTH) { 82 if (address.length != MacAddress.MAC_ADDRESS_LENGTH) {
...@@ -92,19 +92,17 @@ public class MacAddress { ...@@ -92,19 +92,17 @@ public class MacAddress {
92 * value. The lower 48 bits of the long value are used to parse as a MAC 92 * value. The lower 48 bits of the long value are used to parse as a MAC
93 * address. 93 * address.
94 * 94 *
95 - * @param address 95 + * @param address the long value to be parsed. The lower 48 bits are used for a
96 - * the long value to be parsed. The lower 48 bits are used for a
97 * MAC address. 96 * MAC address.
98 * @return a MAC address instance representing the specified {@code long} 97 * @return a MAC address instance representing the specified {@code long}
99 * value. 98 * value.
100 - * @throws IllegalArgumentException 99 + * @throws IllegalArgumentException if the long value cannot be parsed as a MAC address.
101 - * if the long value cannot be parsed as a MAC address.
102 */ 100 */
103 public static MacAddress valueOf(final long address) { 101 public static MacAddress valueOf(final long address) {
104 - final byte[] addressInBytes = new byte[] { 102 + final byte[] addressInBytes = new byte[]{
105 (byte) (address >> 40 & 0xff), (byte) (address >> 32 & 0xff), 103 (byte) (address >> 40 & 0xff), (byte) (address >> 32 & 0xff),
106 (byte) (address >> 24 & 0xff), (byte) (address >> 16 & 0xff), 104 (byte) (address >> 24 & 0xff), (byte) (address >> 16 & 0xff),
107 - (byte) (address >> 8 & 0xff), (byte) (address >> 0 & 0xff) }; 105 + (byte) (address >> 8 & 0xff), (byte) (address >> 0 & 0xff)};
108 106
109 return new MacAddress(addressInBytes); 107 return new MacAddress(addressInBytes);
110 } 108 }
...@@ -169,6 +167,17 @@ public class MacAddress { ...@@ -169,6 +167,17 @@ public class MacAddress {
169 return (this.address[0] & 0x01) != 0; 167 return (this.address[0] & 0x01) != 0;
170 } 168 }
171 169
170 + /**
171 + * Returns true if this MAC address is link local.
172 + *
173 + * @return true if link local
174 + */
175 + public boolean isLinkLocal() {
176 + return LL[0] == address[0] && LL[1] == address[1] && LL[2] == address[2] &&
177 + LL[3] == address[3] && LL[4] == address[4] &&
178 + (LL[5] == address[5] || LL[6] == address[5] || LL[7] == address[5]);
179 + }
180 +
172 @Override 181 @Override
173 public boolean equals(final Object o) { 182 public boolean equals(final Object o) {
174 if (o == this) { 183 if (o == this) {
......