Added IPv6 support to HostLocationProvider
This fixes ONOS-637
Change-Id: Ic3a411b7e1a1fcf18e7bc7a1b70d1e57c23a52ce
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 738129d..76fd015 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
@@ -30,6 +30,7 @@
import org.onlab.packet.ARP;
import org.onlab.packet.Ethernet;
import org.onlab.packet.IPacket;
+import org.onlab.packet.ICMP6;
import org.onlab.packet.IPv6;
import org.onlab.packet.IpAddress;
import org.onlab.packet.VlanId;
@@ -80,7 +81,7 @@
protected HostProviderRegistry providerRegistry;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected PacketService pktService;
+ protected PacketService packetService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected TopologyService topologyService;
@@ -117,22 +118,38 @@
modified(context);
providerService = providerRegistry.register(this);
- pktService.addProcessor(processor, 1);
+ packetService.addProcessor(processor, 1);
deviceService.addListener(deviceListener);
TrafficSelector.Builder selectorBuilder =
DefaultTrafficSelector.builder();
selectorBuilder.matchEthType(Ethernet.TYPE_ARP);
- pktService.requestPackets(selectorBuilder.build(),
+ packetService.requestPackets(selectorBuilder.build(),
PacketPriority.CONTROL, appId);
- log.info("Started");
+ // IPv6 Neighbor Solicitation packet.
+ selectorBuilder = DefaultTrafficSelector.builder();
+ selectorBuilder.matchEthType(Ethernet.TYPE_IPV6);
+ selectorBuilder.matchIPProtocol(IPv6.PROTOCOL_ICMP6);
+ selectorBuilder.matchIcmpv6Type(ICMP6.NEIGHBOR_SOLICITATION);
+ packetService.requestPackets(selectorBuilder.build(),
+ PacketPriority.CONTROL, appId);
+
+ // IPv6 Neighbor Advertisement packet.
+ selectorBuilder = DefaultTrafficSelector.builder();
+ selectorBuilder.matchEthType(Ethernet.TYPE_IPV6);
+ selectorBuilder.matchIPProtocol(IPv6.PROTOCOL_ICMP6);
+ selectorBuilder.matchIcmpv6Type(ICMP6.NEIGHBOR_ADVERTISEMENT);
+ packetService.requestPackets(selectorBuilder.build(),
+ PacketPriority.CONTROL, appId);
+
+ log.info("Started with Application ID {}", appId.id());
}
@Deactivate
public void deactivate() {
providerRegistry.unregister(this);
- pktService.removeProcessor(processor);
+ packetService.removeProcessor(processor);
deviceService.removeListener(deviceListener);
providerService = null;
log.info("Stopped");
@@ -149,7 +166,8 @@
} catch (ClassCastException e) {
hostRemovalEnabled = true;
}
- log.info("Host removal is {}", hostRemovalEnabled ? "enabled" : "disabled");
+ log.info("Host removal is {}",
+ hostRemovalEnabled ? "enabled" : "disabled");
}
@Override
@@ -179,36 +197,44 @@
return;
}
- HostLocation hloc = new HostLocation(heardOn, System.currentTimeMillis());
+ HostLocation hloc =
+ new HostLocation(heardOn, System.currentTimeMillis());
HostId hid = HostId.hostId(eth.getSourceMAC(), vlan);
// ARP: possible new hosts, update both location and IP
if (eth.getEtherType() == Ethernet.TYPE_ARP) {
ARP arp = (ARP) eth.getPayload();
- IpAddress ip = IpAddress.valueOf(IpAddress.Version.INET, arp.getSenderProtocolAddress());
+ IpAddress ip = IpAddress.valueOf(IpAddress.Version.INET,
+ arp.getSenderProtocolAddress());
HostDescription hdescr =
- new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ip);
+ new DefaultHostDescription(eth.getSourceMAC(), vlan,
+ hloc, ip);
providerService.hostDetected(hid, hdescr);
// IPv4: update location only
} else if (eth.getEtherType() == Ethernet.TYPE_IPV4) {
HostDescription hdescr =
- new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc);
+ new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc);
providerService.hostDetected(hid, hdescr);
- // NeighborAdvertisement and NeighborSolicitation: possible new hosts, update both location and IP
- // IPv6: update location only
+ //
+ // NeighborAdvertisement and NeighborSolicitation: possible
+ // new hosts, update both location and IP.
+ //
+ // IPv6: update location only
} else if (eth.getEtherType() == Ethernet.TYPE_IPV6) {
IpAddress ip = null;
IPv6 ipv6 = (IPv6) eth.getPayload();
IPacket iPkt = ipv6;
while (iPkt != null) {
- if (iPkt instanceof NeighborAdvertisement || iPkt instanceof NeighborSolicitation) {
+ if (iPkt instanceof NeighborAdvertisement ||
+ iPkt instanceof NeighborSolicitation) {
IpAddress sourceAddress =
- IpAddress.valueOf(IpAddress.Version.INET6, ipv6.getSourceAddress());
- // Ignore DAD packets, in which source address is all zeros.
+ IpAddress.valueOf(IpAddress.Version.INET6,
+ ipv6.getSourceAddress());
+ // Ignore DAD packets, in which source address is zero
if (!sourceAddress.isZero()) {
ip = sourceAddress;
break;
@@ -217,8 +243,10 @@
iPkt = iPkt.getPayload();
}
HostDescription hdescr = (ip == null) ?
- new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc) :
- new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ip);
+ new DefaultHostDescription(eth.getSourceMAC(), vlan,
+ hloc) :
+ new DefaultHostDescription(eth.getSourceMAC(), vlan,
+ hloc, ip);
providerService.hostDetected(hid, hdescr);
}
}
diff --git a/providers/host/src/test/java/org/onosproject/provider/host/impl/HostLocationProviderTest.java b/providers/host/src/test/java/org/onosproject/provider/host/impl/HostLocationProviderTest.java
index c048b8a..264465e 100644
--- a/providers/host/src/test/java/org/onosproject/provider/host/impl/HostLocationProviderTest.java
+++ b/providers/host/src/test/java/org/onosproject/provider/host/impl/HostLocationProviderTest.java
@@ -148,7 +148,7 @@
provider.providerRegistry = hostRegistry;
provider.topologyService = topoService;
- provider.pktService = packetService;
+ provider.packetService = packetService;
provider.deviceService = deviceService;
provider.hostService = hostService;