Charles M.C. Chan
Committed by Pavlin Radoslavov

ONOS-1153: Ignore Router Solicitation, Router Advertisement and DAD in HostLocationProvider

Change-Id: I533919fc0b04b87ca54ff0933ca87d38b664e2ef
...@@ -37,6 +37,8 @@ import org.onlab.packet.IpAddress; ...@@ -37,6 +37,8 @@ import org.onlab.packet.IpAddress;
37 import org.onlab.packet.VlanId; 37 import org.onlab.packet.VlanId;
38 import org.onlab.packet.ndp.NeighborAdvertisement; 38 import org.onlab.packet.ndp.NeighborAdvertisement;
39 import org.onlab.packet.ndp.NeighborSolicitation; 39 import org.onlab.packet.ndp.NeighborSolicitation;
40 +import org.onlab.packet.ndp.RouterAdvertisement;
41 +import org.onlab.packet.ndp.RouterSolicitation;
40 import org.onosproject.cfg.ComponentConfigService; 42 import org.onosproject.cfg.ComponentConfigService;
41 import org.onosproject.core.ApplicationId; 43 import org.onosproject.core.ApplicationId;
42 import org.onosproject.core.CoreService; 44 import org.onosproject.core.CoreService;
...@@ -270,27 +272,33 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid ...@@ -270,27 +272,33 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid
270 new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc); 272 new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc);
271 providerService.hostDetected(hid, hdescr); 273 providerService.hostDetected(hid, hdescr);
272 274
273 - // 275 + //
274 - // NeighborAdvertisement and NeighborSolicitation: possible 276 + // NeighborAdvertisement and NeighborSolicitation: possible
275 - // new hosts, update both location and IP. 277 + // new hosts, update both location and IP.
276 - // 278 + //
277 - // IPv6: update location only 279 + // IPv6: update location only
278 } else if (eth.getEtherType() == Ethernet.TYPE_IPV6) { 280 } else if (eth.getEtherType() == Ethernet.TYPE_IPV6) {
279 IpAddress ip = null; 281 IpAddress ip = null;
280 IPv6 ipv6 = (IPv6) eth.getPayload(); 282 IPv6 ipv6 = (IPv6) eth.getPayload();
281 283
282 IPacket iPkt = ipv6; 284 IPacket iPkt = ipv6;
283 while (iPkt != null) { 285 while (iPkt != null) {
286 + // Ignore Router Solicitation and Advertisement
287 + if (iPkt instanceof RouterAdvertisement ||
288 + iPkt instanceof RouterSolicitation) {
289 + return;
290 + }
284 if (iPkt instanceof NeighborAdvertisement || 291 if (iPkt instanceof NeighborAdvertisement ||
285 iPkt instanceof NeighborSolicitation) { 292 iPkt instanceof NeighborSolicitation) {
286 IpAddress sourceAddress = 293 IpAddress sourceAddress =
287 IpAddress.valueOf(IpAddress.Version.INET6, 294 IpAddress.valueOf(IpAddress.Version.INET6,
288 ipv6.getSourceAddress()); 295 ipv6.getSourceAddress());
289 // Ignore DAD packets, in which source address is zero 296 // Ignore DAD packets, in which source address is zero
290 - if (!sourceAddress.isZero()) { 297 + if (sourceAddress.isZero()) {
291 - ip = sourceAddress; 298 + return;
292 - break;
293 } 299 }
300 + ip = sourceAddress;
301 + break;
294 } 302 }
295 iPkt = iPkt.getPayload(); 303 iPkt = iPkt.getPayload();
296 } 304 }
......