From f6cfa1b84c8de9d6a1839c87e9c1848037997e9e Mon Sep 17 00:00:00 2001 From: lbl8603 <49143209+lbl8603@users.noreply.github.com> Date: Thu, 9 May 2024 22:51:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=AE=89=E5=8D=93=E7=AB=AFtu?= =?UTF-8?q?n=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vnt/src/handle/recv_data/server.rs | 3 +-- vnt/src/tun_tap_device/tun_create_helper.rs | 19 ++++++++----------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/vnt/src/handle/recv_data/server.rs b/vnt/src/handle/recv_data/server.rs index 72eb14c..71ce3d0 100644 --- a/vnt/src/handle/recv_data/server.rs +++ b/vnt/src/handle/recv_data/server.rs @@ -320,8 +320,7 @@ impl ServerPacketHandler { "device_fd == 0".into(), )); } else { - let device = Arc::new(tun::Device::new(device_fd as _)?); - if let Err(e) = self.device.start(device) { + if let Err(e) = self.device.start(device_fd as _) { self.callback.error(ErrorInfo::new_msg( ErrorType::Unknown, format!("{:?}", e), diff --git a/vnt/src/tun_tap_device/tun_create_helper.rs b/vnt/src/tun_tap_device/tun_create_helper.rs index 576f9b1..1b71cea 100644 --- a/vnt/src/tun_tap_device/tun_create_helper.rs +++ b/vnt/src/tun_tap_device/tun_create_helper.rs @@ -26,7 +26,7 @@ impl DeviceAdapter { #[cfg(target_os = "android")] pub fn new(tun_device_helper: TunDeviceHelper) -> Self { Self { - tun: Arc::new(Mutex::new(None)), + tun: Arc::new(AtomicCell::new(-1 as _)), tun_device_helper, } } @@ -43,22 +43,19 @@ impl std::ops::Deref for DeviceAdapter { #[cfg(target_os = "android")] #[derive(Clone)] pub struct DeviceAdapter { - tun: Arc>>>, + tun: Arc>, tun_device_helper: TunDeviceHelper, } #[cfg(target_os = "android")] impl DeviceAdapter { pub fn write(&self, buf: &[u8]) -> io::Result { - if let Some(device) = self.tun.lock().as_ref() { - use tun::device::IFace; - device.write(buf) - } else { - Err(io::Error::new(io::ErrorKind::Other, "not tun device")) - } + let fd = self.tun.load(); + tun::Fd(fd).write(buf) } - pub fn start(&self, device: Arc) -> io::Result<()> { - self.tun_device_helper.start(device.clone())?; - self.tun.lock().replace(device); + pub fn start(&self, fd: std::os::fd::RawFd) -> io::Result<()> { + //安卓端fd是由外部释放的,所以这里这么搞免得加锁 + self.tun_device_helper.start(Arc::new(Device::new(fd)?))?; + self.tun.store(fd); Ok(()) } }