调整代码结构
This commit is contained in:
@@ -54,11 +54,9 @@ impl XORCipher {
|
|||||||
return Err(anyhow!("not encrypt"));
|
return Err(anyhow!("not encrypt"));
|
||||||
}
|
}
|
||||||
let key = &self.key;
|
let key = &self.key;
|
||||||
net_packet
|
for (i, byte) in net_packet.payload_mut().iter_mut().enumerate() {
|
||||||
.payload_mut()
|
*byte ^= key[i & 31];
|
||||||
.iter_mut()
|
}
|
||||||
.enumerate()
|
|
||||||
.for_each(|(i, byte)| *byte = *byte ^ key[i & 31]);
|
|
||||||
net_packet.set_encrypt_flag(false);
|
net_packet.set_encrypt_flag(false);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -68,11 +66,9 @@ impl XORCipher {
|
|||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
net_packet.set_encrypt_flag(true);
|
net_packet.set_encrypt_flag(true);
|
||||||
let key = &self.key;
|
let key = &self.key;
|
||||||
net_packet
|
for (i, byte) in net_packet.payload_mut().iter_mut().enumerate() {
|
||||||
.payload_mut()
|
*byte ^= key[i & 31];
|
||||||
.iter_mut()
|
}
|
||||||
.enumerate()
|
|
||||||
.for_each(|(i, byte)| *byte = *byte ^ key[i & 31]);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,47 +45,6 @@ fn icmp(device_writer: &Device, mut ipv4_packet: IpV4Packet<&mut [u8]>) -> anyho
|
|||||||
Ok(())
|
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<IpProxyMap>,
|
|
||||||
client_cipher: &Cipher,
|
|
||||||
server_cipher: &Cipher,
|
|
||||||
device_list: &Mutex<(u16, Vec<PeerDeviceInfo>)>,
|
|
||||||
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(
|
pub fn start(
|
||||||
stop_manager: StopManager,
|
stop_manager: StopManager,
|
||||||
context: ChannelContext,
|
context: ChannelContext,
|
||||||
@@ -265,15 +224,16 @@ fn broadcast(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 接收tun数据,并且转发到udp上
|
||||||
/// 实现一个原地发送,必须保证是如下结构
|
/// 实现一个原地发送,必须保证是如下结构
|
||||||
/// |12字节开头|ip报文|至少1024字节结尾|
|
/// |12字节开头|ip报文|至少1024字节结尾|
|
||||||
///
|
///
|
||||||
#[inline]
|
pub(crate) fn handle(
|
||||||
fn base_handle(
|
|
||||||
context: &ChannelContext,
|
context: &ChannelContext,
|
||||||
buf: &mut [u8],
|
buf: &mut [u8],
|
||||||
data_len: usize, //数据总长度=12+ip包长度
|
data_len: usize, //数据总长度=12+ip包长度
|
||||||
extend: &mut [u8],
|
extend: &mut [u8],
|
||||||
|
device_writer: &Device,
|
||||||
current_device: CurrentDeviceInfo,
|
current_device: CurrentDeviceInfo,
|
||||||
ip_route: &ExternalRoute,
|
ip_route: &ExternalRoute,
|
||||||
#[cfg(feature = "ip_proxy")] proxy_map: &Option<IpProxyMap>,
|
#[cfg(feature = "ip_proxy")] proxy_map: &Option<IpProxyMap>,
|
||||||
@@ -282,7 +242,16 @@ fn base_handle(
|
|||||||
device_list: &Mutex<(u16, Vec<PeerDeviceInfo>)>,
|
device_list: &Mutex<(u16, Vec<PeerDeviceInfo>)>,
|
||||||
compressor: &Compressor,
|
compressor: &Compressor,
|
||||||
) -> anyhow::Result<()> {
|
) -> 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 protocol = ipv4_packet.protocol();
|
||||||
let src_ip = ipv4_packet.source_ip();
|
let src_ip = ipv4_packet.source_ip();
|
||||||
let mut dest_ip = ipv4_packet.destination_ip();
|
let mut dest_ip = ipv4_packet.destination_ip();
|
||||||
|
|||||||
Reference in New Issue
Block a user