From ace1339811d51f2061b752a3ab066f7a58c850f3 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 7 Oct 2014 23:01:39 -0700 Subject: [PATCH] Check local IP first always to properly handle cases where we're behind a router that won't get UDP traffic back to us if we use the remote address --- .../computers/ComputerManagerService.java | 116 +----------------- 1 file changed, 1 insertion(+), 115 deletions(-) diff --git a/src/com/limelight/computers/ComputerManagerService.java b/src/com/limelight/computers/ComputerManagerService.java index 456d32df..de264b49 100644 --- a/src/com/limelight/computers/ComputerManagerService.java +++ b/src/com/limelight/computers/ComputerManagerService.java @@ -1,11 +1,6 @@ package com.limelight.computers; -import java.net.Inet4Address; import java.net.InetAddress; -import java.net.InterfaceAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.util.Enumeration; import java.util.List; import java.util.Timer; import java.util.TimerTask; @@ -24,11 +19,8 @@ import com.limelight.nvstream.mdns.MdnsDiscoveryListener; import android.app.Service; import android.content.ComponentName; -import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; import android.os.Binder; import android.os.IBinder; @@ -234,93 +226,6 @@ public class ComputerManagerService extends Service { }; } - private int getActiveNetworkType() { - ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo(); - if (activeNetworkInfo == null) { - return -1; - } - - return activeNetworkInfo.getType(); - } - - private InterfaceAddress getActiveInterfaceAddress() { - String matchingPrefix; - - switch (getActiveNetworkType()) - { - case ConnectivityManager.TYPE_ETHERNET: - matchingPrefix = "eth"; - break; - case ConnectivityManager.TYPE_WIFI: - matchingPrefix = "wlan"; - break; - - default: - // Must be on Ethernet or Wifi to consider that we can send large packets - return null; - } - - // Try to find the interface that corresponds to the active network - try { - Enumeration ifaceList = NetworkInterface.getNetworkInterfaces(); - while (ifaceList.hasMoreElements()) { - NetworkInterface iface = ifaceList.nextElement(); - - // Look for an interface that matches the prefix we expect - if (iface.isUp() && iface.getName().startsWith(matchingPrefix)) { - // Find the IPv4 address for the interface - for (InterfaceAddress addr : iface.getInterfaceAddresses()) { - if (!(addr.getAddress() instanceof Inet4Address)) { - // Skip non-IPv4 addresses - continue; - } - - // Found the right address on the right interface - return addr; - } - } - } - } catch (SocketException e) { - e.printStackTrace(); - } - - // We didn't find the interface or something else went wrong - return null; - } - - private boolean isOnSameSubnet(InetAddress targetAddress, InetAddress localAddress, short networkPrefixLength) { - byte[] targetBytes = targetAddress.getAddress(); - byte[] localBytes = localAddress.getAddress(); - - for (int byteIndex = 0; networkPrefixLength > 0; byteIndex++) { - byte target = targetBytes[byteIndex]; - byte local = localBytes[byteIndex]; - - if (networkPrefixLength >= 8) { - // Do a full byte comparison - if (target != local) { - return false; - } - - networkPrefixLength -= 8; - } - else { - target &= (byte)(0xFF << (8 - networkPrefixLength)); - local &= (byte)(0xFF << (8 - networkPrefixLength)); - - // Do a masked comparison - if (target != local) { - return false; - } - - networkPrefixLength = 0; - } - } - - return true; - } - private ComputerDetails tryPollIp(InetAddress ipAddr) { try { NvHTTP http = new NvHTTP(ipAddr, idManager.getUniqueId(), @@ -373,26 +278,7 @@ public class ComputerManagerService extends Service { } private boolean doPollMachine(ComputerDetails details) { - // Get the network type - int networkType = getActiveNetworkType(); - switch (networkType) { - // We'll check local first on these if we find - // we're on the same subnet - case ConnectivityManager.TYPE_ETHERNET: - case ConnectivityManager.TYPE_WIFI: - InterfaceAddress ifaceAddr = getActiveInterfaceAddress(); - if (ifaceAddr != null) { - if (isOnSameSubnet(details.localIp, ifaceAddr.getAddress(), ifaceAddr.getNetworkPrefixLength())) { - // It's on the same subnet, so poll local first - LimeLog.info("Machine looks local; trying local IP first"); - return pollComputer(details, true); - } - } - // Fall through to remote first - default: - LimeLog.info("Machine looks remote; trying remote IP first"); - return pollComputer(details, false); - } + return pollComputer(details, true); } private Runnable getPollingRunnable(final ComputerDetails details) {