Commit ae9dc59b authored by nanahira's avatar nanahira

claude version 6

parent d1fd29ce
Pipeline #37399 passed with stages
in 42 seconds
...@@ -8,7 +8,6 @@ use std::intrinsics::transmute; ...@@ -8,7 +8,6 @@ use std::intrinsics::transmute;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::mem::MaybeUninit; use std::mem::MaybeUninit;
use std::sync::Arc; use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};
#[repr(C)] #[repr(C)]
pub struct Meta { pub struct Meta {
...@@ -76,12 +75,9 @@ fn main() -> Result<(), Box<dyn Error>> { ...@@ -76,12 +75,9 @@ fn main() -> Result<(), Box<dyn Error>> {
thread::scope(|s| { thread::scope(|s| {
for router in router_readers.values_mut() { for router in router_readers.values_mut() {
// 每个线程一个 mark_set 标志 s.spawn(|_| {
let mark_set = Arc::new(AtomicBool::new(false)); // 使用 2048 字节缓冲区,足够处理大多数包且避免过大的内存占用
let mark_set_clone = mark_set.clone(); let mut buffer = vec![0u8; 2048];
s.spawn(move |_| {
let mut buffer = [0u8; 1500 - 20]; // 保持原始大小
let meta_size = size_of::<Meta>(); let meta_size = size_of::<Meta>();
// 预初始化 Meta 头部 // 预初始化 Meta 头部
...@@ -96,20 +92,16 @@ fn main() -> Result<(), Box<dyn Error>> { ...@@ -96,20 +92,16 @@ fn main() -> Result<(), Box<dyn Error>> {
buffer[..meta_size].copy_from_slice(meta_bytes); buffer[..meta_size].copy_from_slice(meta_bytes);
loop { loop {
let n = router.tun_reader.read(&mut buffer[meta_size..]).unwrap(); match router.tun_reader.read(&mut buffer[meta_size..]) {
Ok(n) => {
if let Some(ref addr) = *router.endpoint.read().unwrap() { if let Some(ref addr) = *router.endpoint.read().unwrap() {
router.encrypt(&mut buffer[meta_size..meta_size + n]); router.encrypt(&mut buffer[meta_size..meta_size + n]);
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
{
// 只在第一次设置 mark,避免重复的系统调用
if !mark_set_clone.load(Ordering::Relaxed) {
let _ = router.socket.set_mark(router.config.mark); let _ = router.socket.set_mark(router.config.mark);
mark_set_clone.store(true, Ordering::Relaxed); let _ = router.socket.send_to(&buffer[..meta_size + n], addr);
} }
} }
Err(_) => continue,
let _ = router.socket.send_to(&buffer[..meta_size + n], addr);
} }
} }
}); });
...@@ -117,52 +109,34 @@ fn main() -> Result<(), Box<dyn Error>> { ...@@ -117,52 +109,34 @@ fn main() -> Result<(), Box<dyn Error>> {
for (socket, mut router_writers) in router_writers3 { for (socket, mut router_writers) in router_writers3 {
s.spawn(move |_| { s.spawn(move |_| {
let mut recv_buf = [MaybeUninit::uninit(); 1500]; // 使用 2048 字节接收缓冲区
let mut recv_buf = vec![MaybeUninit::uninit(); 2048];
// 预先计算常用值
let meta_size = size_of::<Meta>();
let local_id = config.local_id;
loop { loop {
let _ = (|| { let _ = (|| -> Result<(), Box<dyn Error>> {
let (len, addr) = socket.recv_from(&mut recv_buf).unwrap(); let (len, addr) = socket.recv_from(&mut recv_buf)?;
let data: &mut [u8] = unsafe { transmute(&mut recv_buf[..len]) }; let data: &mut [u8] = unsafe { transmute(&mut recv_buf[..len]) };
let packet = Ipv4Packet::new(data).ok_or("malformed packet")?; let packet = Ipv4Packet::new(data).ok_or("malformed packet")?;
let header_len = packet.get_header_length() as usize * 4; let header_len = packet.get_header_length() as usize * 4;
let (_ip_header, rest) = data
// 使用不安全的指针操作减少边界检查 .split_at_mut_checked(header_len)
if len < header_len + meta_size { .ok_or("malformed packet")?;
return Err("packet too small".into()); let (meta_bytes, payload) = rest
} .split_at_mut_checked(size_of::<Meta>())
.ok_or("malformed packet")?;
let meta: &Meta = unsafe { let meta: &Meta = unsafe { transmute(meta_bytes.as_ptr()) };
&*(data.as_ptr().add(header_len) as *const Meta)
}; if meta.dst_id == config.local_id && meta.reversed == 0 {
// 快速检查
if meta.dst_id != local_id || meta.reversed != 0 {
return Ok(());
}
let router = router_writers let router = router_writers
.get_mut(&meta.src_id) .get_mut(&meta.src_id)
.ok_or("missing router")?; .ok_or("missing router")?;
*router.endpoint.write().unwrap() = Some(addr); *router.endpoint.write().unwrap() = Some(addr);
let payload_offset = header_len + meta_size;
let payload = unsafe {
std::slice::from_raw_parts_mut(
data.as_mut_ptr().add(payload_offset),
len - payload_offset
)
};
router.decrypt(payload, &local_secret); router.decrypt(payload, &local_secret);
router.tun_writer.write_all(payload)?; router.tun_writer.write_all(payload)?;
}
Ok::<(), Box<dyn Error>>(()) Ok(())
})(); })();
} }
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment