From 062f497013a4e3982728bec89fcf80b8ec45d6aa Mon Sep 17 00:00:00 2001 From: Max Lv Date: Wed, 8 May 2013 09:42:17 +0800 Subject: [PATCH] update udpgw --- .../github/shadowsocks/ShadowVpnService.scala | 17 +++++++++-- .../scala/com/github/shadowsocks/Utils.scala | 29 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/main/scala/com/github/shadowsocks/ShadowVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowVpnService.scala index f7df9e26..f6dac81e 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowVpnService.scala @@ -86,7 +86,9 @@ class ShadowVpnService extends VpnService { val MSG_HOST_CHANGE: Int = 4 val MSG_STOP_SELF: Int = 5 val VPN_MTU = 1500 + var conn: ParcelFileDescriptor = null + var udpgw: String = null def getPid(name: String): Int = { try { @@ -184,6 +186,8 @@ class ShadowVpnService extends VpnService { new Thread(new Runnable { def run() { handler.sendEmptyMessage(MSG_CONNECT_START) + + // Resolve server address var resolved: Boolean = false if (!InetAddressUtils.isIPv4Address(appHost) && !InetAddressUtils.isIPv6Address(appHost)) { if (Utils.isIPv6Support) { @@ -207,6 +211,15 @@ class ShadowVpnService extends VpnService { } else { resolved = true } + + // Resolve UDP gateway + if (resolved) { + resolve("u.maxcdn.info", Type.A) match { + case Some(host) => udpgw = host + case None => resolved = false + } + } + if (resolved && handleConnection) { notifyAlert(getString(R.string.forward_success), getString(R.string.service_running)) handler.sendEmptyMessageDelayed(MSG_CONNECT_SUCCESS, 500) @@ -294,9 +307,9 @@ class ShadowVpnService extends VpnService { val fd = conn.getFd - val cmd = (BASE + "tun2socks --netif-ipaddr 172.16.0.2 --udpgw-remote-server-addr 158.255.208.201:7300 " + + val cmd = (BASE + "tun2socks --netif-ipaddr 172.16.0.2 --udpgw-remote-server-addr %s:7300 " + "--netif-netmask 255.255.255.0 --socks-server-addr 127.0.0.1:%d --tunfd %d --tunmtu %d --pid " + BASE + "tun2socks.pid") - .format(localPort, fd, VPN_MTU) + .format(udpgw, localPort, fd, VPN_MTU) Log.d(TAG, cmd) System.exec(cmd) diff --git a/src/main/scala/com/github/shadowsocks/Utils.scala b/src/main/scala/com/github/shadowsocks/Utils.scala index 69d0d951..458c5ff4 100644 --- a/src/main/scala/com/github/shadowsocks/Utils.scala +++ b/src/main/scala/com/github/shadowsocks/Utils.scala @@ -49,6 +49,35 @@ import org.apache.http.conn.util.InetAddressUtils import scala.collection.mutable.ArrayBuffer object Utils { + + /** + * Get local IPv4 address + */ + def getIPv4Address: Option[String] = { + try { + val interfaces = NetworkInterface.getNetworkInterfaces + while (interfaces.hasMoreElements) { + val intf = interfaces.nextElement() + val addrs = intf.getInetAddresses + while (addrs.hasMoreElements) { + val addr = addrs.nextElement() + if (!addr.isLoopbackAddress && !addr.isLinkLocalAddress) { + val sAddr = addr.getHostAddress.toUpperCase + if (InetAddressUtils.isIPv4Address(sAddr)) { + return Some(sAddr) + } + } + } + } + } + catch { + case ex: Exception => { + Log.e(TAG, "Failed to get interfaces' addresses.", ex) + } + } + None + } + /** * If there exists a valid IPv6 interface */