Made fast reconnect when network becomes up. Added sending local IPs to multicast module.

This commit is contained in:
Revertron 2022-11-09 14:05:59 +01:00
parent 41569a9ee2
commit 7e08cfa9a5
4 changed files with 82 additions and 0 deletions

View file

@ -3,6 +3,7 @@
package="eu.neilalexander.yggdrasil">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name=".GlobalApplication"

View file

@ -9,6 +9,7 @@ class GlobalApplication: Application() {
override fun onCreate() {
super.onCreate()
config = ConfigurationProxy(applicationContext)
val callback = NetworkStateCallback(this)
}
fun subscribe() {

View file

@ -0,0 +1,43 @@
package eu.neilalexander.yggdrasil
import android.content.Context
import android.content.Intent
import android.net.*
import android.util.Log
import java.net.NetworkInterface
import java.util.*
private const val TAG = "Network"
class NetworkStateCallback(val context: Context) : ConnectivityManager.NetworkCallback() {
init {
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
.build()
val manager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
manager.registerNetworkCallback(request, this)
}
override fun onAvailable(network: Network) {
super.onAvailable(network)
Log.d(TAG, "onAvailable")
Thread {
// The message often arrives before the connection is fully established
Thread.sleep(1000)
val intent = Intent(context, PacketTunnelProvider::class.java)
intent.action = PacketTunnelProvider.ACTION_CONNECT
context.startService(intent)
}.start()
}
override fun onLost(network: Network) {
super.onLost(network)
Log.d(TAG, "onLost")
}
}

View file

@ -9,6 +9,8 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager
import mobile.Yggdrasil
import java.io.FileInputStream
import java.io.FileOutputStream
import java.net.NetworkInterface
import java.util.*
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.concurrent.thread
@ -21,6 +23,7 @@ class PacketTunnelProvider: VpnService() {
const val ACTION_START = "eu.neilalexander.yggdrasil.PacketTunnelProvider.START"
const val ACTION_STOP = "eu.neilalexander.yggdrasil.PacketTunnelProvider.STOP"
const val ACTION_CONNECT = "eu.neilalexander.yggdrasil.PacketTunnelProvider.CONNECT"
}
private var yggdrasil = Yggdrasil()
@ -56,6 +59,10 @@ class PacketTunnelProvider: VpnService() {
Log.d(TAG, "Stopping...")
stop(); START_NOT_STICKY
}
ACTION_CONNECT -> {
Log.d(TAG, "Connecting...")
connect(); START_STICKY
}
else -> {
Log.d(TAG, "Starting...")
start(); START_STICKY
@ -181,6 +188,14 @@ class PacketTunnelProvider: VpnService() {
stopSelf()
}
private fun connect() {
if (!started.get()) {
return
}
yggdrasil.setMulticastInterfaces(getInterfaces().joinToString("\n"))
yggdrasil.connectAnyPeer()
}
private fun updater() {
updates@ while (started.get()) {
if ((application as GlobalApplication).needUiUpdates()) {
@ -260,4 +275,26 @@ class PacketTunnelProvider: VpnService() {
readerStream = null
}
}
private fun getInterfaces(): Array<String> {
val result = ArrayList<String>()
val interfaces: List<NetworkInterface> = try {
Collections.list(NetworkInterface.getNetworkInterfaces())
} catch (e: java.lang.Exception) {
return result.toTypedArray()
}
for (i in interfaces) {
if (!i.isUp) continue
if (i.supportsMulticast() && !i.isPointToPoint) {
for (addr in i.inetAddresses) {
val a = addr.toString().replace("/", "")
result.add("${i.name}|${a}")
}
}
}
return result.toTypedArray()
}
}