From a76280c53b130328c66b933eb2abada610344d3b Mon Sep 17 00:00:00 2001 From: lbl8603 <49143209+lbl8603@users.noreply.github.com> Date: Wed, 29 May 2024 22:47:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vnt/src/cipher/xor/xor.rs | 16 +++----- vnt/src/handle/tun_tap/tun_handler.rs | 57 ++++++--------------------- 2 files changed, 19 insertions(+), 54 deletions(-) diff --git a/vnt/src/cipher/xor/xor.rs b/vnt/src/cipher/xor/xor.rs index 0d804b1..7a76241 100644 --- a/vnt/src/cipher/xor/xor.rs +++ b/vnt/src/cipher/xor/xor.rs @@ -54,11 +54,9 @@ impl XORCipher { return Err(anyhow!("not encrypt")); } let key = &self.key; - net_packet - .payload_mut() - .iter_mut() - .enumerate() - .for_each(|(i, byte)| *byte = *byte ^ key[i & 31]); + for (i, byte) in net_packet.payload_mut().iter_mut().enumerate() { + *byte ^= key[i & 31]; + } net_packet.set_encrypt_flag(false); Ok(()) } @@ -68,11 +66,9 @@ impl XORCipher { ) -> anyhow::Result<()> { net_packet.set_encrypt_flag(true); let key = &self.key; - net_packet - .payload_mut() - .iter_mut() - .enumerate() - .for_each(|(i, byte)| *byte = *byte ^ key[i & 31]); + for (i, byte) in net_packet.payload_mut().iter_mut().enumerate() { + *byte ^= key[i & 31]; + } Ok(()) } } diff --git a/vnt/src/handle/tun_tap/tun_handler.rs b/vnt/src/handle/tun_tap/tun_handler.rs index 4d94d86..9729f67 100644 --- a/vnt/src/handle/tun_tap/tun_handler.rs +++ b/vnt/src/handle/tun_tap/tun_handler.rs @@ -45,47 +45,6 @@ fn icmp(device_writer: &Device, mut ipv4_packet: IpV4Packet<&mut [u8]>) -> anyho Ok(()) } -/// 接收tun数据,并且转发到udp上 -pub(crate) fn handle( - context: &ChannelContext, - data: &mut [u8], - len: usize, - extend: &mut [u8], - device_writer: &Device, - current_device: CurrentDeviceInfo, - ip_route: &ExternalRoute, - #[cfg(feature = "ip_proxy")] proxy_map: &Option, - client_cipher: &Cipher, - server_cipher: &Cipher, - device_list: &Mutex<(u16, Vec)>, - compressor: &Compressor, -) -> anyhow::Result<()> { - //忽略掉结构不对的情况(ipv6数据、win tap会读到空数据),不然日志打印太多了 - let ipv4_packet = match IpV4Packet::new(&mut data[12..len]) { - Ok(packet) => packet, - Err(_) => return Ok(()), - }; - let src_ip = ipv4_packet.source_ip(); - let dest_ip = ipv4_packet.destination_ip(); - if src_ip == dest_ip { - return icmp(&device_writer, ipv4_packet); - } - return base_handle( - context, - data, - len, - extend, - current_device, - ip_route, - #[cfg(feature = "ip_proxy")] - proxy_map, - client_cipher, - server_cipher, - device_list, - compressor, - ); -} - pub fn start( stop_manager: StopManager, context: ChannelContext, @@ -265,15 +224,16 @@ fn broadcast( Ok(()) } +/// 接收tun数据,并且转发到udp上 /// 实现一个原地发送,必须保证是如下结构 /// |12字节开头|ip报文|至少1024字节结尾| /// -#[inline] -fn base_handle( +pub(crate) fn handle( context: &ChannelContext, buf: &mut [u8], data_len: usize, //数据总长度=12+ip包长度 extend: &mut [u8], + device_writer: &Device, current_device: CurrentDeviceInfo, ip_route: &ExternalRoute, #[cfg(feature = "ip_proxy")] proxy_map: &Option, @@ -282,7 +242,16 @@ fn base_handle( device_list: &Mutex<(u16, Vec)>, compressor: &Compressor, ) -> anyhow::Result<()> { - let ipv4_packet = IpV4Packet::new(&buf[12..data_len])?; + //忽略掉结构不对的情况(ipv6数据、win tap会读到空数据),不然日志打印太多了 + let ipv4_packet = match IpV4Packet::new(&mut buf[12..data_len]) { + Ok(packet) => packet, + Err(_) => return Ok(()), + }; + let src_ip = ipv4_packet.source_ip(); + let dest_ip = ipv4_packet.destination_ip(); + if src_ip == dest_ip { + return icmp(&device_writer, ipv4_packet); + } let protocol = ipv4_packet.protocol(); let src_ip = ipv4_packet.source_ip(); let mut dest_ip = ipv4_packet.destination_ip();