Commit c313913b authored by nanamicat's avatar nanamicat

thread

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