Learn target ip from IPv6 neighbor advertisement message
Change-Id: I3d27f4cd937548e9880bb242033358e57559656c
diff --git a/providers/host/src/main/java/org/onosproject/provider/host/impl/HostLocationProvider.java b/providers/host/src/main/java/org/onosproject/provider/host/impl/HostLocationProvider.java
index 227415e..16a8f24 100644
--- a/providers/host/src/main/java/org/onosproject/provider/host/impl/HostLocationProvider.java
+++ b/providers/host/src/main/java/org/onosproject/provider/host/impl/HostLocationProvider.java
@@ -585,20 +585,27 @@
if (pkt != null && pkt instanceof ICMP6) {
// Neighbor Discovery Protocol
pkt = pkt.getPayload();
- // RouterSolicitation, RouterAdvertisement
- if (pkt != null && (pkt instanceof RouterAdvertisement ||
- pkt instanceof RouterSolicitation)) {
- return;
- }
- if (pkt != null && (pkt instanceof NeighborSolicitation ||
- pkt instanceof NeighborAdvertisement)) {
- // Duplicate Address Detection
- if (ip.isZero()) {
+ if (pkt != null) {
+ // RouterSolicitation, RouterAdvertisement
+ if (pkt instanceof RouterAdvertisement || pkt instanceof RouterSolicitation) {
return;
}
- // NeighborSolicitation, NeighborAdvertisement
- createOrUpdateHost(hid, srcMac, vlan, hloc, ip);
- return;
+ if (pkt instanceof NeighborSolicitation || pkt instanceof NeighborAdvertisement) {
+ // Duplicate Address Detection
+ if (ip.isZero()) {
+ return;
+ }
+ // NeighborSolicitation, NeighborAdvertisement
+ createOrUpdateHost(hid, srcMac, vlan, hloc, ip);
+
+ // Also learn from the target address of NeighborAdvertisement
+ if (pkt instanceof NeighborAdvertisement) {
+ NeighborAdvertisement na = (NeighborAdvertisement) pkt;
+ Ip6Address targetAddr = Ip6Address.valueOf(na.getTargetAddress());
+ createOrUpdateHost(hid, srcMac, vlan, hloc, targetAddr);
+ }
+ return;
+ }
}
}