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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 IBzuAVAE|t3n*aa+ 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);