fix vpn close when getting new subnet route (#179)

This commit is contained in:
Sijie.Sun
2024-07-18 08:48:45 +08:00
committed by GitHub
parent 5987528f59
commit 8858492fb4
2 changed files with 59 additions and 31 deletions

View File

@@ -39,6 +39,7 @@ async function doStopVpn() {
await waitVpnStatus(false, 3) await waitVpnStatus(false, 3)
curVpnStatus.ipv4Addr = undefined curVpnStatus.ipv4Addr = undefined
curVpnStatus.routes = []
} }
async function doStartVpn(ipv4Addr: string, cidr: number, routes: string[]) { async function doStartVpn(ipv4Addr: string, cidr: number, routes: string[]) {
@@ -73,8 +74,6 @@ async function onVpnServiceStart(payload: any) {
async function onVpnServiceStop(payload: any) { async function onVpnServiceStop(payload: any) {
console.log('vpn service stop', JSON.stringify(payload)) console.log('vpn service stop', JSON.stringify(payload))
curVpnStatus.running = false curVpnStatus.running = false
networkStore.clearNetworkInstances()
await retainNetworkInstance(networkStore.networkInstanceIds)
} }
async function registerVpnServiceListener() { async function registerVpnServiceListener() {
@@ -111,8 +110,7 @@ function getRoutesForVpn(routes: Route[]): string[] {
return Array.from(new Set(ret)).sort() return Array.from(new Set(ret)).sort()
} }
async function watchNetworkInstance() { async function onNetworkInstanceChange() {
networkStore.$subscribe(async () => {
let insts = networkStore.networkInstanceIds let insts = networkStore.networkInstanceIds
if (!insts) { if (!insts) {
await doStopVpn() await doStopVpn()
@@ -138,10 +136,38 @@ async function watchNetworkInstance() {
if (ipChanged || routesChanged) { if (ipChanged || routesChanged) {
console.log('virtual ip changed', JSON.stringify(curVpnStatus), virtual_ip) console.log('virtual ip changed', JSON.stringify(curVpnStatus), virtual_ip)
try {
await doStopVpn() await doStopVpn()
} catch (e) {
console.error(e)
}
try {
await doStartVpn(virtual_ip, 24, routes) await doStartVpn(virtual_ip, 24, routes)
} catch (e) {
console.error("start vpn failed, clear all network insts.", e)
networkStore.clearNetworkInstances()
await retainNetworkInstance(networkStore.networkInstanceIds)
}
return return
} }
}
async function watchNetworkInstance() {
var subscribe_running = false
networkStore.$subscribe(async () => {
if (subscribe_running) {
return
}
console.log('network instance change')
subscribe_running = true
try {
await onNetworkInstanceChange()
} catch (_) {
}
console.log('network instance change done')
subscribe_running = false
}) })
} }

View File

@@ -57,22 +57,24 @@ class TauriVpnService : VpnService() {
override fun onDestroy() { override fun onDestroy() {
println("vpn on destroy") println("vpn on destroy")
self = null
super.onDestroy() super.onDestroy()
disconnect() disconnect()
self = null
} }
override fun onRevoke() { override fun onRevoke() {
println("vpn on revoke") println("vpn on revoke")
self = null
super.onRevoke() super.onRevoke()
disconnect() disconnect()
self = null
} }
private fun disconnect() { private fun disconnect() {
if (self == this && this::vpnInterface.isInitialized) {
triggerCallback("vpn_service_stop", JSObject()) triggerCallback("vpn_service_stop", JSObject())
vpnInterface.close() vpnInterface.close()
} }
}
private fun createVpnInterface(args: Bundle?): ParcelFileDescriptor { private fun createVpnInterface(args: Bundle?): ParcelFileDescriptor {
var builder = Builder() var builder = Builder()