Commit c313913b authored by nanamicat's avatar nanamicat

thread

parent 359aa7c6
...@@ -58,86 +58,85 @@ fn main() -> Result<(), Box<dyn Error>> { ...@@ -58,86 +58,85 @@ fn main() -> Result<(), Box<dyn Error>> {
thread::scope(|s| { thread::scope(|s| {
for router in routers.values_mut() { for router in routers.values_mut() {
s.spawn({ s.spawn(|_| {
|_| { let mut buffer = [0u8; 1500 - 20]; // minus typical IP header space
let mut buffer = [0u8; 1500 - 20]; // minus typical IP header space let meta_size = size_of::<Meta>();
let meta_size = size_of::<Meta>();
// Pre-initialize with our Meta header (local -> remote) // Pre-initialize with our Meta header (local -> remote)
let meta = Meta { let meta = Meta {
src_id: config.local_id, src_id: config.local_id,
dst_id: router.config.remote_id, dst_id: router.config.remote_id,
reversed: 0, reversed: 0,
}; };
// Turn the Meta struct into bytes // Turn the Meta struct into bytes
let meta_bytes = unsafe { let meta_bytes = unsafe {
std::slice::from_raw_parts(&meta as *const Meta as *const u8, meta_size) std::slice::from_raw_parts(&meta as *const Meta as *const u8, meta_size)
}; };
buffer[..meta_size].copy_from_slice(meta_bytes); buffer[..meta_size].copy_from_slice(meta_bytes);
loop { loop {
match router.tun_reader.read(&mut buffer[meta_size..]) { match router.tun_reader.read(&mut buffer[meta_size..]) {
Ok(n) if n > 0 => { Ok(n) if n > 0 => {
// If we have a known remote address, encrypt and send // If we have a known remote address, encrypt and send
if let Some(ref addr) = router.endpoint { if let Some(ref addr) = router.endpoint {
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")]
router.socket.set_mark(router.config.mark)?; router.socket.set_mark(router.config.mark)?;
if let Err(e) = if let Err(e) =
router.socket.send_to(&buffer[..meta_size + n], addr) router.socket.send_to(&buffer[..meta_size + n], addr)
{ {
eprintln!("Error sending packet: {}", e); eprintln!("Error sending packet: {}", e);
}
} else {
eprintln!("No remote address set; packet dropped.");
} }
} else {
eprintln!("No remote address set; packet dropped.");
} }
Err(e) => eprintln!("Error reading from TUN: {}", e),
_ => {}
} }
Err(e) => eprintln!("Error reading from TUN: {}", e),
_ => {}
} }
} }
}); });
} }
for socket in sockets.values() { for socket in sockets.values() {
let mut recv_buf = [MaybeUninit::uninit(); 1500]; s.spawn(|_| {
loop { let mut recv_buf = [MaybeUninit::uninit(); 1500];
match socket.recv_from(&mut recv_buf) { loop {
Ok((len, addr)) => { match socket.recv_from(&mut recv_buf) {
let data: &mut [u8] = unsafe { transmute(&mut recv_buf[..len]) }; Ok((len, addr)) => {
let data: &mut [u8] = unsafe { transmute(&mut recv_buf[..len]) };
if let Some(packet) = Ipv4Packet::new(data) { if let Some(packet) = Ipv4Packet::new(data) {
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(header_len); let (_ip_header, rest) = data.split_at_mut(header_len);
if rest.len() < size_of::<Meta>() { if rest.len() < size_of::<Meta>() {
continue; continue;
} }
let (meta_bytes, payload) = rest.split_at_mut(size_of::<Meta>()); let (meta_bytes, payload) = rest.split_at_mut(size_of::<Meta>());
let meta = Meta { let meta = Meta {
src_id: meta_bytes[0], src_id: meta_bytes[0],
dst_id: meta_bytes[1], dst_id: meta_bytes[1],
reversed: u16::from_le_bytes([meta_bytes[2], meta_bytes[3]]), reversed: u16::from_le_bytes([meta_bytes[2], meta_bytes[3]]),
}; };
if let Some(router) = routers.get_mut(&meta.src_id) { if let Some(router) = routers.get_mut(&meta.src_id) {
if meta.dst_id == config.local_id && meta.reversed == 0 { if meta.dst_id == config.local_id && meta.reversed == 0 {
router.endpoint = Some(addr); router.endpoint = Some(addr);
router.decrypt(payload); router.decrypt(payload);
router.tun_writer.write_all(payload).unwrap(); router.tun_writer.write_all(payload).unwrap();
}
} else {
// eprintln!("Dropping unexpected packet");
} }
} else {
// eprintln!("Dropping unexpected packet");
} }
} }
Err(e) => eprintln!("Error receiving: {}", e),
} }
Err(e) => eprintln!("Error receiving: {}", e),
} }
} });
} }
}) })
.unwrap(); .unwrap();
Ok(()) 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