diff --git a/project/plugins.sbt b/project/plugins.sbt index 21b0ecc8..40c3e390 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,4 +1,4 @@ -addSbtPlugin("org.scala-android" % "sbt-android" % "1.6.14") +addSbtPlugin("org.scala-android" % "sbt-android" % "1.6.13") addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.1.10") diff --git a/src/main/res/xml/pref_all.xml b/src/main/res/xml/pref_all.xml index 982f0a16..befdccf0 100644 --- a/src/main/res/xml/pref_all.xml +++ b/src/main/res/xml/pref_all.xml @@ -112,6 +112,7 @@ diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksApplication.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksApplication.scala index 941f22ee..aa46429d 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksApplication.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksApplication.scala @@ -46,7 +46,7 @@ import android.app.Application import android.preference.PreferenceManager import android.support.v7.app.AppCompatDelegate import com.github.shadowsocks.database.{DBHelper, ProfileManager} -import com.github.shadowsocks.utils.{Key, Utils, TcpFastOpen} +import com.github.shadowsocks.utils.{Key, Utils} import com.google.android.gms.analytics.{GoogleAnalytics, HitBuilders, StandardExceptionParser} import com.google.android.gms.common.api.ResultCallback import com.google.android.gms.tagmanager.{ContainerHolder, TagManager} @@ -111,13 +111,6 @@ class ShadowsocksApplication extends Application { } } pending.setResultCallback(callback, 2, TimeUnit.SECONDS) - - // TFO - val tfo = settings.getBoolean(Key.tfo, false) - if (tfo && !TcpFastOpen.isEnabled) - { - TcpFastOpen.enabled(true) - } } def refreshContainerHolder { diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala index 2b8fefaf..b2d1b5c8 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala @@ -105,7 +105,7 @@ class ShadowsocksNatService extends BaseService { if (profile.auth) cmd += "-A" - if (TcpFastOpen.isEnabled) cmd += "--fast-open" + if (TcpFastOpen.sendEnabled) cmd += "--fast-open" if (profile.route != Route.ALL) { cmd += "--acl" diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala index 0d7d5d47..c113bd61 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala @@ -155,17 +155,14 @@ class ShadowsocksSettings extends PreferenceFragment with OnSharedPreferenceChan } switch.setChecked(BootReceiver.getEnabled(activity)) - if (getPreferenceManager.getSharedPreferences.getBoolean(Key.tfo, false) && !TcpFastOpen.isEnabled) { - TcpFastOpen.enabled(true) - } - val tfo = findPreference(Key.tfo).asInstanceOf[SwitchPreference] - tfo.setChecked(TcpFastOpen.isEnabled) + val tfo = findPreference("tcp_fastopen").asInstanceOf[SwitchPreference] + tfo.setChecked(TcpFastOpen.sendEnabled) tfo.setOnPreferenceChangeListener((_, v) => { val value = v.asInstanceOf[Boolean] val result = TcpFastOpen.enabled(value) if (result != null && result != "Success.") Snackbar.make(activity.findViewById(android.R.id.content), result, Snackbar.LENGTH_LONG).show() - value == TcpFastOpen.isEnabled + value == TcpFastOpen.sendEnabled }) if (!TcpFastOpen.supported) { tfo.setEnabled(false) diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index 26a6a9f4..65765bd9 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -266,7 +266,7 @@ class ShadowsocksVpnService extends VpnService with BaseService { cmd += (getApplicationInfo.dataDir + "/acl.list") } - if (TcpFastOpen.isEnabled) cmd += "--fast-open" + if (TcpFastOpen.sendEnabled) cmd += "--fast-open" if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" ")) diff --git a/src/main/scala/com/github/shadowsocks/utils/Constants.scala b/src/main/scala/com/github/shadowsocks/utils/Constants.scala index 3d53824d..f3211440 100644 --- a/src/main/scala/com/github/shadowsocks/utils/Constants.scala +++ b/src/main/scala/com/github/shadowsocks/utils/Constants.scala @@ -171,8 +171,6 @@ object Key { val kcp = "kcp" val kcpPort = "kcpPort" val kcpcli = "kcpcli" - - val tfo = "tcp_fastopen" } object State { diff --git a/src/main/scala/com/github/shadowsocks/utils/TcpFastOpen.scala b/src/main/scala/com/github/shadowsocks/utils/TcpFastOpen.scala index 926edee1..2a7b898f 100644 --- a/src/main/scala/com/github/shadowsocks/utils/TcpFastOpen.scala +++ b/src/main/scala/com/github/shadowsocks/utils/TcpFastOpen.scala @@ -23,18 +23,28 @@ object TcpFastOpen { case _ => false } - def isEnabled = { + def sendEnabled = { val file = new File("/proc/sys/net/ipv4/tcp_fastopen") file.canRead && (Utils.readAllLines(file).toInt & 1) > 0 } - def enabled(value: Boolean): String = { - val res = Shell.run("su", Array( + def enabled(value: Boolean) = + Shell.run("su", Array( "if echo " + (if (value) 3 else 0) + " > /proc/sys/net/ipv4/tcp_fastopen; then", - " echo Success.", + " success=-1", + " if mount -o rw,remount /dev/block/platform/msm_sdcc.1/by-name/system /system; then", + if (value) " echo '#!/system/bin/sh\n" + + "echo 3 > /proc/sys/net/ipv4/tcp_fastopen' > /etc/init.d/tcp_fastopen && chmod 755 /etc/init.d/tcp_fastopen" + else "rm -f /etc/init.d/tcp_fastopen", + " success=$?", + " mount -o ro,remount /dev/block/platform/msm_sdcc.1/by-name/system /system", + " fi", + " if [ $success -eq 0 ]; then", + " echo Success.", + " else", + " echo Warning: Unable to create boot script.", + " fi", "else", " echo Failed.", - "fi"), null, true) - if (res != null) res.asScala.mkString("\n") else null - } + "fi"), null, true).asScala.mkString("\n") }