mirror of
https://github.com/yggdrasil-network/yggdrasil-android.git
synced 2025-04-29 22:55:08 +03:00
Made fast reconnect when network becomes up. Added sending local IPs to multicast module.
This commit is contained in:
parent
41569a9ee2
commit
7e08cfa9a5
4 changed files with 82 additions and 0 deletions
|
@ -3,6 +3,7 @@
|
||||||
package="eu.neilalexander.yggdrasil">
|
package="eu.neilalexander.yggdrasil">
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
|
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".GlobalApplication"
|
android:name=".GlobalApplication"
|
||||||
|
|
|
@ -9,6 +9,7 @@ class GlobalApplication: Application() {
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
config = ConfigurationProxy(applicationContext)
|
config = ConfigurationProxy(applicationContext)
|
||||||
|
val callback = NetworkStateCallback(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun subscribe() {
|
fun subscribe() {
|
||||||
|
|
|
@ -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")
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,6 +9,8 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||||
import mobile.Yggdrasil
|
import mobile.Yggdrasil
|
||||||
import java.io.FileInputStream
|
import java.io.FileInputStream
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
|
import java.net.NetworkInterface
|
||||||
|
import java.util.*
|
||||||
import java.util.concurrent.atomic.AtomicBoolean
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
import kotlin.concurrent.thread
|
import kotlin.concurrent.thread
|
||||||
|
|
||||||
|
@ -21,6 +23,7 @@ class PacketTunnelProvider: VpnService() {
|
||||||
|
|
||||||
const val ACTION_START = "eu.neilalexander.yggdrasil.PacketTunnelProvider.START"
|
const val ACTION_START = "eu.neilalexander.yggdrasil.PacketTunnelProvider.START"
|
||||||
const val ACTION_STOP = "eu.neilalexander.yggdrasil.PacketTunnelProvider.STOP"
|
const val ACTION_STOP = "eu.neilalexander.yggdrasil.PacketTunnelProvider.STOP"
|
||||||
|
const val ACTION_CONNECT = "eu.neilalexander.yggdrasil.PacketTunnelProvider.CONNECT"
|
||||||
}
|
}
|
||||||
|
|
||||||
private var yggdrasil = Yggdrasil()
|
private var yggdrasil = Yggdrasil()
|
||||||
|
@ -56,6 +59,10 @@ class PacketTunnelProvider: VpnService() {
|
||||||
Log.d(TAG, "Stopping...")
|
Log.d(TAG, "Stopping...")
|
||||||
stop(); START_NOT_STICKY
|
stop(); START_NOT_STICKY
|
||||||
}
|
}
|
||||||
|
ACTION_CONNECT -> {
|
||||||
|
Log.d(TAG, "Connecting...")
|
||||||
|
connect(); START_STICKY
|
||||||
|
}
|
||||||
else -> {
|
else -> {
|
||||||
Log.d(TAG, "Starting...")
|
Log.d(TAG, "Starting...")
|
||||||
start(); START_STICKY
|
start(); START_STICKY
|
||||||
|
@ -181,6 +188,14 @@ class PacketTunnelProvider: VpnService() {
|
||||||
stopSelf()
|
stopSelf()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun connect() {
|
||||||
|
if (!started.get()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
yggdrasil.setMulticastInterfaces(getInterfaces().joinToString("\n"))
|
||||||
|
yggdrasil.connectAnyPeer()
|
||||||
|
}
|
||||||
|
|
||||||
private fun updater() {
|
private fun updater() {
|
||||||
updates@ while (started.get()) {
|
updates@ while (started.get()) {
|
||||||
if ((application as GlobalApplication).needUiUpdates()) {
|
if ((application as GlobalApplication).needUiUpdates()) {
|
||||||
|
@ -260,4 +275,26 @@ class PacketTunnelProvider: VpnService() {
|
||||||
readerStream = null
|
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()
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue