diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9840d0f..6d4dfb6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,11 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" package="io.github.chronosx88.yggdrasil"> - - - - () private var currentDNS = setOf() private val wirelessPeers = mutableListOf() private val intentFilter = IntentFilter() - private val peerListListener = WirelessPeerList() - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(findViewById(R.id.toolbar)) - /*p2p part*/ - // Indicates a change in the Wi-Fi P2P status. - intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); - // Indicates a change in the list of available peers. - intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); - // Indicates the state of Wi-Fi P2P connectivity has changed. - intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); - // Indicates this device's details have changed. - intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); - - isStarted = isYggServiceRunning(this) val switchOn = findViewById(R.id.switchOn) switchOn.isChecked = isStarted @@ -107,35 +87,6 @@ class MainActivity : AppCompatActivity() { wifiDirect.setOnCheckedChangeListener { _, isChecked -> - if (ActivityCompat.checkSelfPermission( - this, - Manifest.permission.ACCESS_FINE_LOCATION - ) != PackageManager.PERMISSION_GRANTED - ) { - // TODO: Consider calling - // ActivityCompat#requestPermissions - // here to request the missing permissions, and then overriding - // public void onRequestPermissionsResult(int requestCode, String[] permissions, - // int[] grantResults) - // to handle the case where the user grants the permission. See the documentation - // for ActivityCompat#requestPermissions for more details. - return@setOnCheckedChangeListener - } - mManager!!.discoverPeers(mChannel, object : WifiP2pManager.ActionListener { - override fun onSuccess() { - // Code for when the discovery initiation is successful goes here. - // No services have actually been discovered yet, so this method - // can often be left blank. Code for peer discovery goes in the - // onReceive method, detailed below. - //showToast("discover peers success") - } - - override fun onFailure(reasonCode: Int) { - // Code for when the discovery initiation fails goes here. - // Alert the user that something went wrong. - showToast("discover peers failed, code="+reasonCode) - } - }) } @@ -331,90 +282,4 @@ class MainActivity : AppCompatActivity() { return false } - inner class WiFiDirectBroadcastReceiver(mManager: WifiP2pManager, - mChannel: WifiP2pManager.Channel): BroadcastReceiver() { - override fun onReceive(context: Context?, intent: Intent?) { - val action = intent!!.action - if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION == action) { - // Determine if Wifi P2P mode is enabled or not, alert - // the Activity. - val state = intent!!.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1) - if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) { - this@MainActivity.setIsWifiP2pEnabled(true) - } else { - this@MainActivity.setIsWifiP2pEnabled(false) - } - } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION == action) { - // The peer list has changed! We should probably do something about - // that. - // Request available peers from the wifi p2p manager. This is an - // asynchronous call and the calling activity is notified with a - // callback on PeerListListener.onPeersAvailable() - if (mManager != null) { - if (ActivityCompat.checkSelfPermission( - this@MainActivity, - Manifest.permission.ACCESS_FINE_LOCATION - ) != PackageManager.PERMISSION_GRANTED - ) { - // TODO: Consider calling - // ActivityCompat#requestPermissions - // here to request the missing permissions, and then overriding - // public void onRequestPermissionsResult(int requestCode, String[] permissions, - // int[] grantResults) - // to handle the case where the user grants the permission. See the documentation - // for ActivityCompat#requestPermissions for more details. - return - } - mManager!!.requestPeers(mChannel, peerListListener); - } - Log.d(TAG, "P2P peers changed"); - } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION == action) { - - // Connection state changed! We should probably do something about - // that. - } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION == action) { - this@MainActivity.updateThisDevice( - intent!!.getParcelableExtra( - WifiP2pManager.EXTRA_WIFI_P2P_DEVICE - ) as WifiP2pDevice - ) - } - } - } - - private fun updateThisDevice(wifiP2pDevice: WifiP2pDevice) { - //showToast("update device:"+wifiP2pDevice.deviceName+" address:"+wifiP2pDevice.deviceAddress) - } - - private fun setIsWifiP2pEnabled(b: Boolean) { - //showToast("WifiP2pEnabled="+b) - } - - /** register the BroadcastReceiver with the intent values to be matched */ - override fun onResume() { - super.onResume() - mManager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager - mChannel = mManager!!.initialize(this, mainLooper, null); - receiver = WiFiDirectBroadcastReceiver(mManager!!, mChannel!!) - registerReceiver(receiver, intentFilter) - } - - override fun onPause() { - super.onPause() - unregisterReceiver(receiver) - } - - inner class WirelessPeerList:WifiP2pManager.PeerListListener{ - - override fun onPeersAvailable(peers: WifiP2pDeviceList?) { - // Out with the old, in with the new. - this@MainActivity.wirelessPeers.clear() - this@MainActivity.wirelessPeers.addAll(peers!!.deviceList); - // If an AdapterView is backed by this data, notify it // of the change. For instance, if you have a ListView of available // peers, trigger an update. - //((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged(); if (peers.size() == 0) { Log.d(WiFiDirectActivity.TAG, "No devices found"); return; } } - //just show message - //showToast("available peers:"+this@MainActivity.wirelessPeers.size) - } - - } } diff --git a/app/src/main/java/io/github/chronosx88/yggdrasil/YggdrasilTunService.kt b/app/src/main/java/io/github/chronosx88/yggdrasil/YggdrasilTunService.kt index 523107e..d1d8f24 100644 --- a/app/src/main/java/io/github/chronosx88/yggdrasil/YggdrasilTunService.kt +++ b/app/src/main/java/io/github/chronosx88/yggdrasil/YggdrasilTunService.kt @@ -22,6 +22,7 @@ import mobile.Yggdrasil import java.io.* import java.net.Inet6Address import java.nio.ByteBuffer +import kotlin.concurrent.thread class YggdrasilTunService : VpnService() { @@ -29,8 +30,8 @@ class YggdrasilTunService : VpnService() { private lateinit var ygg: Yggdrasil private var isClosed = false - /** Maximum packet size is constrained by the MTU, which is given as a signed short. */ - private val MAX_PACKET_SIZE = Short.MAX_VALUE.toInt() + /** Maximum packet size is constrained by the MTU, which is given as a signed short - 256 */ + private val MAX_PACKET_SIZE = Short.MAX_VALUE-256 companion object { private const val TAG = "Yggdrasil-service" @@ -159,17 +160,15 @@ class YggdrasilTunService : VpnService() { } private fun readPacketsFromTun(yggConduitEndpoint: ConduitEndpoint, buffer: ByteArray) { - // Read the outgoing packet from the input stream. - try{ - val length = tunInputStream!!.read(buffer) - if (length > 0) { - val byteBuffer = ByteBuffer.allocate(length) - byteBuffer.put(buffer, 0, length) - yggConduitEndpoint.send(byteBuffer.array()) + try { + // Read the outgoing packet from the input stream. + val length = tunInputStream?.read(buffer) ?: 1 + if (length > 0){ + yggConduitEndpoint.send(buffer.sliceArray(IntRange(0, length - 1))) } else { - Thread.sleep(10) + Thread.sleep(100) } - }catch(e: IOException){ + } catch (e: IOException) { e.printStackTrace() } } @@ -178,8 +177,8 @@ class YggdrasilTunService : VpnService() { val buffer = yggConduitEndpoint.recv() if(buffer!=null) { try { - tunOutputStream!!.write(buffer) - }catch(e: IOException){ + tunOutputStream?.write(buffer) + } catch (e: IOException) { e.printStackTrace() } } @@ -187,11 +186,12 @@ class YggdrasilTunService : VpnService() { private fun stopVpn(pi: PendingIntent?) { isClosed = true; - scope!!.coroutineContext.cancelChildren() + tunInputStream!!.close() tunOutputStream!!.close() tunInterface!!.close() tunInterface = null + scope!!.coroutineContext.cancelChildren() Log.d(TAG,"Stop is running from service") ygg.stop() val intent: Intent = Intent()