[CORD-2065] Source address of relayed DHCPv6 packet is not always correct?
Change-Id: I6cffcee82e1d902cd022de32c8844c4df1f80707
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 d070308..fd33ab8 100644
--- a/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
+++ b/apps/dhcprelay/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
@@ -741,9 +741,37 @@
etherReply.setVlanID(this.dhcpConnectVlan.toShort());
IPv6 ipv6Packet = (IPv6) etherReply.getPayload();
- byte[] peerAddress = clientIpv6.getSourceAddress();
- ipv6Packet.setSourceAddress(ipFacingServer.toOctets());
+ Ip6Address peerAddress = null;
+ if (directConnFlag) {
+ peerAddress = Ip6Address.valueOf(ipv6Packet.getSourceAddress());
+ } else {
+ MacAddress gwOrClientMac = MacAddress.valueOf(clientPacket.getSourceMACAddress());
+ VlanId vlanId = VlanId.vlanId(clientPacket.getVlanID());
+ HostId gwOrClientHostId = HostId.hostId(gwOrClientMac, vlanId);
+ Host gwOrClientHost = hostService.getHost(gwOrClientHostId);
+
+ if (gwOrClientHost == null) {
+ log.warn("Can't find client gateway/server host {}", gwOrClientHostId);
+ return null;
+ }
+ // pick out the first gloabl ip address
+ peerAddress = gwOrClientHost.ipAddresses()
+ .stream()
+ .filter(IpAddress::isIp6)
+ .filter(ip6 -> !ip6.isLinkLocal())
+ .map(IpAddress::getIp6Address)
+ .findFirst()
+ .orElse(null);
+
+ if (peerAddress == null) {
+ log.warn("Can't find client gateway/server for mac {} ip {}", gwOrClientMac,
+ HexString.toHexString(ipv6Packet.getSourceAddress()));
+ log.warn("Can't find IP address of client gateway/ClienHost address {} for peerAddress", gwOrClientHost);
+ return null;
+ }
+ }
+ ipv6Packet.setSourceAddress(ipFacingServer.toOctets());
ipv6Packet.setDestinationAddress(this.dhcpServerIp.toOctets());
UDP udpPacket = (UDP) ipv6Packet.getPayload();
@@ -806,7 +834,7 @@
// peer address: address of the client or relay agent from which
// the message to be relayed was received.
- dhcp6Relay.setPeerAddress(peerAddress);
+ dhcp6Relay.setPeerAddress(peerAddress.toOctets());
List<Dhcp6Option> options = new ArrayList<Dhcp6Option>();
// directly connected case, hop count is zero