Fix DHCP handling bug in HostLocationProvider
Change-Id: I69beb697736aec4540d2dfd0ba168141ab466ccf
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 e197a0d..461319a 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
@@ -475,9 +475,22 @@
// IPv4: update location only
} else if (eth.getEtherType() == Ethernet.TYPE_IPV4) {
- // DHCP ACK: additionally update IP of DHCP client
- Optional<DHCP> dhcp = findDhcp(eth);
- if (useDhcp || !dhcp.isPresent()) {
+ DHCP dhcp = findDhcp(eth).orElse(null);
+ if (dhcp != null) {
+ if (useDhcp) {
+ // learn host (server or client) MAC address
+ createOrUpdateHost(hid, srcMac, vlan, hloc, null);
+
+ // DHCP ACK: additionally update IP of DHCP client
+ if (dhcp.getPacketType().equals(DHCP.MsgType.DHCPACK)) {
+ MacAddress hostMac = MacAddress.valueOf(dhcp.getClientHardwareAddress());
+ VlanId hostVlan = VlanId.vlanId(eth.getVlanID());
+ HostId hostId = HostId.hostId(hostMac, hostVlan);
+ updateHostIp(hostId, IpAddress.valueOf(dhcp.getYourIPAddress()));
+ }
+ }
+ } else {
+ // learn host MAC address
createOrUpdateHost(hid, srcMac, vlan, hloc, null);
}
//