[CORD-2320] DHCPv4 thows an exception when no indirect DHCPv4 server is configured
Change-Id: I516a75f1108ca1245267a45b805153e5eba003d8
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 069a85a..65c2d6c 100644
--- a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
+++ b/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
@@ -442,16 +442,21 @@
}
private Interface getServerInterface(List<DhcpServerInfo> serverInfos) {
- DhcpServerInfo serverInfo = serverInfos.get(0);
- ConnectPoint dhcpServerConnectPoint = serverInfo.getDhcpServerConnectPoint().orElse(null);
- VlanId dhcpConnectVlan = serverInfo.getDhcpConnectVlan().orElse(null);
- if (dhcpServerConnectPoint == null || dhcpConnectVlan == null) {
- return null;
- }
- return interfaceService.getInterfacesByPort(dhcpServerConnectPoint)
- .stream()
- .filter(iface -> interfaceContainsVlan(iface, dhcpConnectVlan))
+ return serverInfos.stream()
.findFirst()
+ .map(serverInfo -> {
+ ConnectPoint dhcpServerConnectPoint =
+ serverInfo.getDhcpServerConnectPoint().orElse(null);
+ VlanId dhcpConnectVlan = serverInfo.getDhcpConnectVlan().orElse(null);
+ if (dhcpServerConnectPoint == null || dhcpConnectVlan == null) {
+ return null;
+ }
+ return interfaceService.getInterfacesByPort(dhcpServerConnectPoint)
+ .stream()
+ .filter(iface -> interfaceContainsVlan(iface, dhcpConnectVlan))
+ .findFirst()
+ .orElse(null);
+ })
.orElse(null);
}
@@ -683,7 +688,16 @@
return null;
}
boolean isDirectlyConnected = directlyConnected(dhcpPacket);
- Interface serverInterface = isDirectlyConnected ? getDefaultServerInterface() : getIndirectServerInterface();
+ Interface serverInterface;
+ if (isDirectlyConnected) {
+ serverInterface = getDefaultServerInterface();
+ } else {
+ serverInterface = getIndirectServerInterface();
+ if (serverInterface == null) {
+ // Indirect server interface not found, use default server interface
+ serverInterface = getDefaultServerInterface();
+ }
+ }
if (serverInterface == null) {
log.warn("Can't get {} server interface, ignore", isDirectlyConnected ? "direct" : "indirect");
return null;
@@ -835,7 +849,16 @@
return null;
}
boolean isDirectlyConnected = directlyConnected(dhcpPacket);
- Interface serverInterface = isDirectlyConnected ? getDefaultServerInterface() : getIndirectServerInterface();
+ Interface serverInterface;
+ if (isDirectlyConnected) {
+ serverInterface = getDefaultServerInterface();
+ } else {
+ serverInterface = getIndirectServerInterface();
+ if (serverInterface == null) {
+ // Indirect server interface not found, use default server interface
+ serverInterface = getDefaultServerInterface();
+ }
+ }
if (serverInterface == null) {
log.warn("Can't get {} server interface, ignore", isDirectlyConnected ? "direct" : "indirect");
return null;
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 e7e56d0..7c5c762 100644
--- a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
+++ b/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
@@ -772,76 +772,85 @@
* @param clientPacket client ethernet packet
* @param clientInterfaces set of client side interfaces
*/
- private InternalPacket processDhcp6PacketFromClient(PacketContext context,
- Ethernet clientPacket, Set<Interface> clientInterfaces) {
- ConnectPoint receivedFrom = context.inPacket().receivedFrom();
- DeviceId receivedFromDevice = receivedFrom.deviceId();
- DhcpServerInfo serverInfo;
- Ip6Address dhcpServerIp = null;
- ConnectPoint dhcpServerConnectPoint = null;
- MacAddress dhcpConnectMac = null;
- VlanId dhcpConnectVlan = null;
- Ip6Address dhcpGatewayIp = null;
- Ip6Address indirectDhcpServerIp = null;
- ConnectPoint indirectDhcpServerConnectPoint = null;
- MacAddress indirectDhcpConnectMac = null;
- VlanId indirectDhcpConnectVlan = null;
- Ip6Address indirectDhcpGatewayIp = null;
- Ip6Address indirectRelayAgentIpFromCfg = null;
- if (!defaultServerInfoList.isEmpty()) {
- serverInfo = defaultServerInfoList.get(0);
- dhcpConnectMac = serverInfo.getDhcpConnectMac().orElse(null);
- dhcpGatewayIp = serverInfo.getDhcpGatewayIp6().orElse(null);
- dhcpServerIp = serverInfo.getDhcpServerIp6().orElse(null);
- dhcpServerConnectPoint = serverInfo.getDhcpServerConnectPoint().orElse(null);
- dhcpConnectVlan = serverInfo.getDhcpConnectVlan().orElse(null);
- }
- if (!indirectServerInfoList.isEmpty()) {
- serverInfo = indirectServerInfoList.get(0);
- indirectDhcpConnectMac = serverInfo.getDhcpConnectMac().orElse(null);
- indirectDhcpGatewayIp = serverInfo.getDhcpGatewayIp6().orElse(null);
- indirectDhcpServerIp = serverInfo.getDhcpServerIp6().orElse(null);
- indirectDhcpServerConnectPoint = serverInfo.getDhcpServerConnectPoint().orElse(null);
- indirectDhcpConnectVlan = serverInfo.getDhcpConnectVlan().orElse(null);
- indirectRelayAgentIpFromCfg = serverInfo.getRelayAgentIp6(receivedFromDevice).orElse(null);
- }
- Ip6Address relayAgentIp = getRelayAgentIPv6Address(clientInterfaces);
- MacAddress relayAgentMac = clientInterfaces.iterator().next().mac();
- if (relayAgentIp == null || relayAgentMac == null) {
- log.warn("Missing DHCP relay agent interface Ipv6 addr config for "
- + "packet from client on port: {}. Aborting packet processing",
- clientInterfaces.iterator().next().connectPoint());
- return null;
- }
- // get dhcp6 header.
- IPv6 clientIpv6 = (IPv6) clientPacket.getPayload();
- UDP clientUdp = (UDP) clientIpv6.getPayload();
- DHCP6 clientDhcp6 = (DHCP6) clientUdp.getPayload();
- boolean directConnFlag = directlyConnected(clientDhcp6);
- Interface serverInterface = directConnFlag ? getServerInterface() : getIndirectServerInterface();
- if (serverInterface == null) {
- log.warn("Can't get {} server interface, ignore", directConnFlag ? "direct" : "indirect");
- return null;
- }
- Ip6Address ipFacingServer = getFirstIpFromInterface(serverInterface);
- MacAddress macFacingServer = serverInterface.mac();
- if (ipFacingServer == null || macFacingServer == null) {
- log.warn("No IP v6 address for server Interface {}", serverInterface);
- return null;
- }
- Ethernet etherReply = clientPacket.duplicate();
- etherReply.setSourceMACAddress(macFacingServer);
- if ((directConnFlag && dhcpConnectMac == null) ||
- !directConnFlag && indirectDhcpConnectMac == null && dhcpConnectMac == null) {
- log.warn("Packet received from {} connected client.", directConnFlag ? "directly" : "indirectly");
- log.warn("DHCP6 {} not yet resolved .. Aborting DHCP packet processing from client on port: {}",
- (dhcpGatewayIp == null) ? "server IP " + dhcpServerIp
- : "gateway IP " + dhcpGatewayIp,
- clientInterfaces.iterator().next().connectPoint());
- return null;
- }
- if (dhcpServerConnectPoint == null) {
- log.warn("DHCP6 server connection point direct {} directConn {} indirectConn {} is not set up yet",
+ private InternalPacket processDhcp6PacketFromClient(PacketContext context,
+ Ethernet clientPacket, Set<Interface> clientInterfaces) {
+ ConnectPoint receivedFrom = context.inPacket().receivedFrom();
+ DeviceId receivedFromDevice = receivedFrom.deviceId();
+ DhcpServerInfo serverInfo;
+ Ip6Address dhcpServerIp = null;
+ ConnectPoint dhcpServerConnectPoint = null;
+ MacAddress dhcpConnectMac = null;
+ VlanId dhcpConnectVlan = null;
+ Ip6Address dhcpGatewayIp = null;
+ Ip6Address indirectDhcpServerIp = null;
+ ConnectPoint indirectDhcpServerConnectPoint = null;
+ MacAddress indirectDhcpConnectMac = null;
+ VlanId indirectDhcpConnectVlan = null;
+ Ip6Address indirectDhcpGatewayIp = null;
+ Ip6Address indirectRelayAgentIpFromCfg = null;
+ if (!defaultServerInfoList.isEmpty()) {
+ serverInfo = defaultServerInfoList.get(0);
+ dhcpConnectMac = serverInfo.getDhcpConnectMac().orElse(null);
+ dhcpGatewayIp = serverInfo.getDhcpGatewayIp6().orElse(null);
+ dhcpServerIp = serverInfo.getDhcpServerIp6().orElse(null);
+ dhcpServerConnectPoint = serverInfo.getDhcpServerConnectPoint().orElse(null);
+ dhcpConnectVlan = serverInfo.getDhcpConnectVlan().orElse(null);
+ }
+ if (!indirectServerInfoList.isEmpty()) {
+ serverInfo = indirectServerInfoList.get(0);
+ indirectDhcpConnectMac = serverInfo.getDhcpConnectMac().orElse(null);
+ indirectDhcpGatewayIp = serverInfo.getDhcpGatewayIp6().orElse(null);
+ indirectDhcpServerIp = serverInfo.getDhcpServerIp6().orElse(null);
+ indirectDhcpServerConnectPoint = serverInfo.getDhcpServerConnectPoint().orElse(null);
+ indirectDhcpConnectVlan = serverInfo.getDhcpConnectVlan().orElse(null);
+ indirectRelayAgentIpFromCfg = serverInfo.getRelayAgentIp6(receivedFromDevice).orElse(null);
+ }
+ Ip6Address relayAgentIp = getRelayAgentIPv6Address(clientInterfaces);
+ MacAddress relayAgentMac = clientInterfaces.iterator().next().mac();
+ if (relayAgentIp == null || relayAgentMac == null) {
+ log.warn("Missing DHCP relay agent interface Ipv6 addr config for "
+ + "packet from client on port: {}. Aborting packet processing",
+ clientInterfaces.iterator().next().connectPoint());
+ return null;
+ }
+ // get dhcp6 header.
+ IPv6 clientIpv6 = (IPv6) clientPacket.getPayload();
+ UDP clientUdp = (UDP) clientIpv6.getPayload();
+ DHCP6 clientDhcp6 = (DHCP6) clientUdp.getPayload();
+ boolean directConnFlag = directlyConnected(clientDhcp6);
+ Interface serverInterface;
+ if (directConnFlag) {
+ serverInterface = getServerInterface();
+ } else {
+ serverInterface = getIndirectServerInterface();
+ if (serverInterface == null) {
+ // Indirect server interface not found, use default server interface
+ serverInterface = getServerInterface();
+ }
+ }
+ if (serverInterface == null) {
+ log.warn("Can't get {} server interface, ignore", directConnFlag ? "direct" : "indirect");
+ return null;
+ }
+ Ip6Address ipFacingServer = getFirstIpFromInterface(serverInterface);
+ MacAddress macFacingServer = serverInterface.mac();
+ if (ipFacingServer == null || macFacingServer == null) {
+ log.warn("No IP v6 address for server Interface {}", serverInterface);
+ return null;
+ }
+ Ethernet etherReply = (Ethernet) clientPacket.duplicate();
+ etherReply.setSourceMACAddress(macFacingServer);
+ if ((directConnFlag && dhcpConnectMac == null) ||
+ !directConnFlag && indirectDhcpConnectMac == null && dhcpConnectMac == null) {
+ log.warn("Packet received from {} connected client.", directConnFlag ? "directly" : "indirectly");
+ log.warn("DHCP6 {} not yet resolved .. Aborting DHCP packet processing from client on port: {}",
+ (dhcpGatewayIp == null) ? "server IP " + dhcpServerIp
+ : "gateway IP " + dhcpGatewayIp,
+ clientInterfaces.iterator().next().connectPoint());
+ return null;
+ }
+ if (dhcpServerConnectPoint == null) {
+ log.warn("DHCP6 server connection point direct {} directConn {} indirectConn {} is not set up yet",
directConnFlag, dhcpServerConnectPoint, indirectDhcpServerConnectPoint);
return null;
}