mirror of
https://mirror.suhoan.cn/https://github.com/EasyTier/EasyTier.git
synced 2025-12-14 13:47:24 +08:00
Android Support (#166)
1. Add vpnservice tauri plugin for android. 2. add workflow for android. 3. Easytier Core support android, allow set tun fd.
This commit is contained in:
@@ -19,6 +19,7 @@ use crate::{
|
||||
};
|
||||
use chrono::{DateTime, Local};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use tokio::task::JoinSet;
|
||||
|
||||
#[derive(Default, Clone, Debug, Serialize, Deserialize)]
|
||||
pub struct MyNodeInfo {
|
||||
@@ -35,6 +36,7 @@ struct EasyTierData {
|
||||
node_info: Arc<RwLock<MyNodeInfo>>,
|
||||
routes: Arc<RwLock<Vec<Route>>>,
|
||||
peers: Arc<RwLock<Vec<PeerInfo>>>,
|
||||
tun_fd: Arc<RwLock<Option<i32>>>,
|
||||
}
|
||||
|
||||
pub struct EasyTierLauncher {
|
||||
@@ -69,6 +71,40 @@ impl EasyTierLauncher {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "android")]
|
||||
async fn run_routine_for_android(
|
||||
instance: &Instance,
|
||||
data: &EasyTierData,
|
||||
tasks: &mut JoinSet<()>,
|
||||
) {
|
||||
let global_ctx = instance.get_global_ctx();
|
||||
let peer_mgr = instance.get_peer_manager();
|
||||
let nic_ctx = instance.get_nic_ctx();
|
||||
let peer_packet_receiver = instance.get_peer_packet_receiver();
|
||||
let arc_tun_fd = data.tun_fd.clone();
|
||||
|
||||
tasks.spawn(async move {
|
||||
let mut old_tun_fd = arc_tun_fd.read().unwrap().clone();
|
||||
loop {
|
||||
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
|
||||
let tun_fd = arc_tun_fd.read().unwrap().clone();
|
||||
if tun_fd != old_tun_fd && tun_fd.is_some() {
|
||||
let res = Instance::setup_nic_ctx_for_android(
|
||||
nic_ctx.clone(),
|
||||
global_ctx.clone(),
|
||||
peer_mgr.clone(),
|
||||
peer_packet_receiver.clone(),
|
||||
tun_fd.unwrap(),
|
||||
)
|
||||
.await;
|
||||
if res.is_ok() {
|
||||
old_tun_fd = tun_fd;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async fn easytier_routine(
|
||||
cfg: TomlConfigLoader,
|
||||
stop_signal: Arc<tokio::sync::Notify>,
|
||||
@@ -77,10 +113,12 @@ impl EasyTierLauncher {
|
||||
let mut instance = Instance::new(cfg);
|
||||
let peer_mgr = instance.get_peer_manager();
|
||||
|
||||
let mut tasks = JoinSet::new();
|
||||
|
||||
// Subscribe to global context events
|
||||
let global_ctx = instance.get_global_ctx();
|
||||
let data_c = data.clone();
|
||||
tokio::spawn(async move {
|
||||
tasks.spawn(async move {
|
||||
let mut receiver = global_ctx.subscribe();
|
||||
while let Ok(event) = receiver.recv().await {
|
||||
Self::handle_easytier_event(event, data_c.clone()).await;
|
||||
@@ -92,7 +130,7 @@ impl EasyTierLauncher {
|
||||
let global_ctx_c = instance.get_global_ctx();
|
||||
let peer_mgr_c = peer_mgr.clone();
|
||||
let vpn_portal = instance.get_vpn_portal_inst();
|
||||
tokio::spawn(async move {
|
||||
tasks.spawn(async move {
|
||||
loop {
|
||||
let node_info = MyNodeInfo {
|
||||
virtual_ipv4: global_ctx_c
|
||||
@@ -123,8 +161,15 @@ impl EasyTierLauncher {
|
||||
}
|
||||
});
|
||||
|
||||
#[cfg(target_os = "android")]
|
||||
Self::run_routine_for_android(&instance, &data, &mut tasks).await;
|
||||
|
||||
instance.run().await?;
|
||||
stop_signal.notified().await;
|
||||
|
||||
tasks.abort_all();
|
||||
drop(tasks);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -266,6 +311,12 @@ impl NetworkInstance {
|
||||
})
|
||||
}
|
||||
|
||||
pub fn set_tun_fd(&mut self, tun_fd: i32) {
|
||||
if let Some(launcher) = self.launcher.as_ref() {
|
||||
launcher.data.tun_fd.write().unwrap().replace(tun_fd);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn start(&mut self) -> Result<(), anyhow::Error> {
|
||||
if self.is_easytier_running() {
|
||||
return Ok(());
|
||||
|
||||
Reference in New Issue
Block a user