Get the matching vlan entry from DHCP record if more then one entry is present
Change-Id: I73a00c1887e4e6601ab87c31b954c936c5d923be
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java b/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
index 4f0387d..d55c468 100644
--- a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
+++ b/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
@@ -1135,7 +1135,8 @@
DhcpServerInfo foundServerInfo = findServerInfoFromServer(directConnFlag, inPort);
if (foundServerInfo == null) {
- log.warn("Cannot find server info");
+ log.warn("Cannot find server info for {} server, inPort {}",
+ directConnFlag ? "direct" : "indirect", inPort);
return null;
} else {
if (Dhcp4HandlerUtil.isServerIpEmpty(foundServerInfo)) {
@@ -1518,7 +1519,14 @@
// sent by ONOS or circuit Id can't be parsed
// TODO: remove relay store from this method
MacAddress dstMac = valueOf(dhcpPayload.getClientHardwareAddress());
- Optional<DhcpRecord> dhcpRecord = dhcpRelayStore.getDhcpRecord(HostId.hostId(dstMac, originalPacketVlanId));
+ VlanId filteredVlanId = getVlanIdFromDhcpRecord(dstMac, originalPacketVlanId);
+ // Get the vlan from the dhcp record
+ if (filteredVlanId == null) {
+ log.debug("not find the matching DHCP record for mac: {} and vlan: {}", dstMac, originalPacketVlanId);
+ return Optional.empty();
+ }
+
+ Optional<DhcpRecord> dhcpRecord = dhcpRelayStore.getDhcpRecord(HostId.hostId(dstMac, filteredVlanId));
ConnectPoint clientConnectPoint = dhcpRecord
.map(DhcpRecord::locations)
.orElse(Collections.emptySet())
@@ -1535,13 +1543,52 @@
if (clientConnectPoint != null) {
return interfaceService.getInterfacesByPort(clientConnectPoint)
.stream()
- .filter(iface -> interfaceContainsVlan(iface, originalPacketVlanId))
+ .filter(iface -> interfaceContainsVlan(iface, filteredVlanId))
.findFirst();
}
return Optional.empty();
}
/**
+ * Get the required vlanId in case the DCHP record has more than one vlanId for a given MAC.
+ *
+ * @param mac MAC address of the DHCP client
+ * @param vlan Expected vlan of the DHCP client
+ */
+ private VlanId getVlanIdFromDhcpRecord(MacAddress mac, VlanId vlan) {
+ // Get all the DHCP records matching with the mac address
+ // If only one entry is present then pick the vlan of that entry
+ // If more then one entry is present then look for an entry with matching vlan
+ // else return null
+ Collection<DhcpRecord> records = dhcpRelayStore.getDhcpRecords();
+ List<DhcpRecord> filteredRecords = new ArrayList<>();
+ for (DhcpRecord e: records) {
+ if (e.macAddress().equals(mac)) {
+ filteredRecords.add(e);
+ }
+ }
+ log.debug("getVlanIdFromDhcpRecord mac: {} vlan: {}", mac, vlan);
+ log.debug("filteredRecords are: {}", filteredRecords);
+ if (filteredRecords.size() == 1) {
+ log.debug("Only one DHCP record entry. Returning back the vlan of that DHCP record: {}", filteredRecords);
+ return filteredRecords.get(0).vlanId();
+ }
+ // Check in the DHCP filtered record for matching vlan
+ for (DhcpRecord e: filteredRecords) {
+ if (e.vlanId().equals(vlan)) {
+ log.debug("Found a matching vlan entry in the DHCP record:{}", e);
+ return vlan;
+ }
+ }
+ // Found nothing return null
+ log.debug("Returning null as no matching or more than one matching entry found");
+ return null;
+
+ }
+
+
+
+ /**
* Send the response DHCP to the requester host.
*
* @param thePacket the packet
@@ -1925,9 +1972,6 @@
log.debug("ServerInfo found for Rcv port {} Server Connect Point {} for {}",
inPort, serverInfo.getDhcpServerConnectPoint(), directConnFlag ? "direct" : "indirect");
break;
- } else {
- log.warn("Rcv port {} not the same as Server Connect Point {} for {}",
- inPort, serverInfo.getDhcpServerConnectPoint(), directConnFlag ? "direct" : "indirect");
}
}
return foundServerInfo;
diff --git a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java b/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
index c2983c9..31dcaaa 100644
--- a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
+++ b/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
@@ -1212,7 +1212,8 @@
DhcpServerInfo foundServerInfo = findServerInfoFromServer(directConnFlag, inPort);
if (foundServerInfo == null) {
- log.warn("Cannot find server info");
+ log.warn("Cannot find server info for {} server, inPort {}",
+ directConnFlag ? "direct" : "indirect", inPort);
dhcpRelayCountersStore.incrementCounter(gCount, DhcpRelayCounters.NO_SERVER_INFO);
return null;
} else {
@@ -1847,9 +1848,6 @@
log.debug("ServerInfo found for Rcv port {} Server Connect Point {} for {}",
inPort, serverInfo.getDhcpServerConnectPoint(), directConnFlag ? "direct" : "indirect");
break;
- } else {
- log.warn("Rcv port {} not the same as Server Connect Point {} for {}",
- inPort, serverInfo.getDhcpServerConnectPoint(), directConnFlag ? "direct" : "indirect");
}
}
return foundServerInfo;