mirror of
				https://github.com/yggdrasil-network/yggdrasil-android.git
				synced 2025-11-04 03:05: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">
 | 
			
		||||
    <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"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,7 @@ class GlobalApplication: Application() {
 | 
			
		|||
    override fun onCreate() {
 | 
			
		||||
        super.onCreate()
 | 
			
		||||
        config = ConfigurationProxy(applicationContext)
 | 
			
		||||
        val callback = NetworkStateCallback(this)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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 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()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue