From 0d35ea5207e1a331e5d1b3af4b1b3d18d185fd05 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 22 Jun 2014 17:08:22 -0700 Subject: [PATCH] Enable max Ethernet MTU sized packets when the remote PC is on the subnet --- libs/limelight-common.jar | Bin 207441 -> 207842 bytes src/com/limelight/Game.java | 114 +++++++++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 2 deletions(-) diff --git a/libs/limelight-common.jar b/libs/limelight-common.jar index 1e8b23c88472f5b688c3b457dcfbc9adf8b26b12..e62ea43cea931b882ff2d6dc39ee0b1c813201c4 100644 GIT binary patch delta 17234 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 diff --git a/src/com/limelight/Game.java b/src/com/limelight/Game.java index 56e143eb..534ea2c2 100644 --- a/src/com/limelight/Game.java +++ b/src/com/limelight/Game.java @@ -1,5 +1,12 @@ package com.limelight; +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 com.limelight.binding.PlatformBinding; import com.limelight.binding.input.ControllerHandler; import com.limelight.binding.input.KeyboardTranslator; @@ -19,6 +26,7 @@ import android.content.SharedPreferences; import android.graphics.Point; import android.media.AudioManager; import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.Handler; @@ -161,10 +169,29 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM wifiLock = wifiMgr.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "Limelight"); wifiLock.setReferenceCounted(false); wifiLock.acquire(); + + String host = Game.this.getIntent().getStringExtra("host"); + InetAddress addr; + boolean enableLargePackets; + try { + // If this does a DNS lookup, it could cause a NetworkOnMainThread exception + // Chances are if it has to do this, we're not on the same network anyways + addr = InetAddress.getByName(host); + + // Check if we can enable large packets if we get this far + enableLargePackets = shouldEnableLargePackets(addr); + } catch (Exception e) { + // We don't want to deal with any exceptions here. The user will be notified + // when the connection fails + enableLargePackets = false; + } + + LimeLog.info("Using large packets? "+enableLargePackets); // Start the connection - conn = new NvConnection(Game.this.getIntent().getStringExtra("host"), Game.this, - new StreamConfiguration(width, height, refreshRate, bitrate * 1000), PlatformBinding.getCryptoProvider(this)); + conn = new NvConnection(host, Game.this, + new StreamConfiguration(width, height, refreshRate, bitrate * 1000, + enableLargePackets ? 1460 : 1024), PlatformBinding.getCryptoProvider(this)); keybTranslator = new KeyboardTranslator(conn); controllerHandler = new ControllerHandler(conn); @@ -172,6 +199,89 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM sh.addCallback(this); } + private boolean shouldEnableLargePackets(InetAddress targetAddress) { + ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo(); + String matchingPrefix; + + if (activeNetworkInfo == null) { + return false; + } + + switch (activeNetworkInfo.getType()) + { + 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 false; + } + + // 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 isOnSameSubnet(targetAddress, addr.getAddress(), addr.getNetworkPrefixLength()); + } + } + } + } catch (SocketException e) { + e.printStackTrace(); + } + + // We didn't find the interface or something else went wrong + return false; + } + + 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 void checkDataConnection() { ConnectivityManager mgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);