From 9997f164b92e2636ffe82e1777cc084b6e63ff88 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 15 Jul 2019 01:24:22 -0700 Subject: [PATCH] Add support for IPv6-only hosts --- .../nvstream/http/ComputerDetails.java | 3 +- .../limelight/nvstream/mdns/MdnsComputer.java | 22 +++++------ .../nvstream/mdns/MdnsDiscoveryAgent.java | 37 +++++++++++-------- .../jni/moonlight-core/moonlight-common-c | 2 +- 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/moonlight-common/src/main/java/com/limelight/nvstream/http/ComputerDetails.java b/moonlight-common/src/main/java/com/limelight/nvstream/http/ComputerDetails.java index 2840821b..fa1fd7b4 100644 --- a/moonlight-common/src/main/java/com/limelight/nvstream/http/ComputerDetails.java +++ b/moonlight-common/src/main/java/com/limelight/nvstream/http/ComputerDetails.java @@ -42,7 +42,8 @@ public class ComputerDetails { if (details.activeAddress != null) { this.activeAddress = details.activeAddress; } - if (details.localAddress != null) { + // We can get IPv4 loopback addresses with GS IPv6 Forwarder + if (details.localAddress != null && !details.localAddress.startsWith("127.")) { this.localAddress = details.localAddress; } if (details.remoteAddress != null) { diff --git a/moonlight-common/src/main/java/com/limelight/nvstream/mdns/MdnsComputer.java b/moonlight-common/src/main/java/com/limelight/nvstream/mdns/MdnsComputer.java index 921c02b2..d52445d4 100644 --- a/moonlight-common/src/main/java/com/limelight/nvstream/mdns/MdnsComputer.java +++ b/moonlight-common/src/main/java/com/limelight/nvstream/mdns/MdnsComputer.java @@ -1,16 +1,16 @@ package com.limelight.nvstream.mdns; -import java.net.Inet4Address; import java.net.Inet6Address; +import java.net.InetAddress; public class MdnsComputer { - private Inet4Address v4Addr; + private InetAddress localAddr; private Inet6Address v6Addr; private String name; - public MdnsComputer(String name, Inet4Address v4Addr, Inet6Address v6Addr) { + public MdnsComputer(String name, InetAddress localAddress, Inet6Address v6Addr) { this.name = name; - this.v4Addr = v4Addr; + this.localAddr = localAddress; this.v6Addr = v6Addr; } @@ -18,11 +18,11 @@ public class MdnsComputer { return name; } - public Inet4Address getAddressV4() { - return v4Addr; + public InetAddress getLocalAddress() { + return localAddr; } - public Inet6Address getAddressV6() { + public Inet6Address getIpv6Address() { return v6Addr; } @@ -40,9 +40,9 @@ public class MdnsComputer { return false; } - if ((other.v4Addr != null && v4Addr == null) || - (other.v4Addr == null && v4Addr != null) || - (other.v4Addr != null && !other.v4Addr.equals(v4Addr))) { + if ((other.localAddr != null && localAddr == null) || + (other.localAddr == null && localAddr != null) || + (other.localAddr != null && !other.localAddr.equals(localAddr))) { return false; } @@ -60,6 +60,6 @@ public class MdnsComputer { @Override public String toString() { - return "["+name+" - "+v4Addr+" - "+v6Addr+"]"; + return "["+name+" - "+localAddr+" - "+v6Addr+"]"; } } diff --git a/moonlight-common/src/main/java/com/limelight/nvstream/mdns/MdnsDiscoveryAgent.java b/moonlight-common/src/main/java/com/limelight/nvstream/mdns/MdnsDiscoveryAgent.java index a9cc5992..1b2736fc 100644 --- a/moonlight-common/src/main/java/com/limelight/nvstream/mdns/MdnsDiscoveryAgent.java +++ b/moonlight-common/src/main/java/com/limelight/nvstream/mdns/MdnsDiscoveryAgent.java @@ -160,6 +160,20 @@ public class MdnsDiscoveryAgent implements ServiceListener { } } + private Inet6Address getLocalAddress(Inet6Address[] addresses) { + for (Inet6Address addr : addresses) { + if (addr.isLinkLocalAddress() || addr.isSiteLocalAddress()) { + return addr; + } + // fc00::/7 - ULAs + else if ((addr.getAddress()[0] & 0xfe) == 0xfc) { + return addr; + } + } + + return null; + } + private Inet6Address getLinkLocalAddress(Inet6Address[] addresses) { for (Inet6Address addr : addresses) { if (addr.isLinkLocalAddress()) { @@ -247,7 +261,7 @@ public class MdnsDiscoveryAgent implements ServiceListener { for (Inet4Address v4Addr : v4Addrs) { synchronized (computers) { MdnsComputer computer = new MdnsComputer(info.getName(), v4Addr, v6GlobalAddr); - if (computers.put(computer.getAddressV4(), computer) == null) { + if (computers.put(computer.getLocalAddress(), computer) == null) { // This was a new entry listener.notifyComputerAdded(computer); } @@ -256,25 +270,16 @@ public class MdnsDiscoveryAgent implements ServiceListener { // If there were no IPv4 addresses, use IPv6 for registration if (v4Addrs.length == 0) { - // Prefer a global address - if (v6GlobalAddr != null) { - MdnsComputer computer = new MdnsComputer(info.getName(), null, v6GlobalAddr); - if (computers.put(computer.getAddressV6(), computer) == null) { + Inet6Address v6LocalAddr = getLocalAddress(v6Addrs); + + if (v6LocalAddr != null || v6GlobalAddr != null) { + MdnsComputer computer = new MdnsComputer(info.getName(), v6LocalAddr, v6GlobalAddr); + if (computers.put(v6LocalAddr != null ? + computer.getLocalAddress() : computer.getIpv6Address(), computer) == null) { // This was a new entry listener.notifyComputerAdded(computer); } } - else { - // Use link-local if we have no other option - Inet6Address v6LinkLocalAddr = getLinkLocalAddress(v6Addrs); - if (v6LinkLocalAddr != null) { - MdnsComputer computer = new MdnsComputer(info.getName(), null, v6LinkLocalAddr); - if (computers.put(computer.getAddressV6(), computer) == null) { - // This was a new entry - listener.notifyComputerAdded(computer); - } - } - } } } diff --git a/moonlight-common/src/main/jni/moonlight-core/moonlight-common-c b/moonlight-common/src/main/jni/moonlight-core/moonlight-common-c index 62459344..25dfbcfd 160000 --- a/moonlight-common/src/main/jni/moonlight-core/moonlight-common-c +++ b/moonlight-common/src/main/jni/moonlight-core/moonlight-common-c @@ -1 +1 @@ -Subproject commit 6245934462d9639680d7f6a007df25627b9b3719 +Subproject commit 25dfbcfd41180573140b5f7d0b087e9330f2ba36