Commit 7cfc9e91 authored by nanamicat's avatar nanamicat

transmute

parent 64f983ee
...@@ -98,24 +98,14 @@ fn main() -> Result<(), Box<dyn Error>> { ...@@ -98,24 +98,14 @@ fn main() -> Result<(), Box<dyn Error>> {
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..]) { let n = router.tun_reader.read(&mut buffer[meta_size..]).unwrap();
Ok(n) if n > 0 => { if let Some(ref addr) = *router.endpoint.read().unwrap() {
// If we have a known remote address, encrypt and send router.encrypt(&mut buffer[meta_size..meta_size + n]);
if let Some(ref addr) = *router.endpoint.read().unwrap() { #[cfg(target_os = "linux")]
router.encrypt(&mut buffer[meta_size..meta_size + n]); router.socket.set_mark(router.config.mark)?;
#[cfg(target_os = "linux")] if let Err(e) = router.socket.send_to(&buffer[..meta_size + n], addr) {
router.socket.set_mark(router.config.mark)?; eprintln!("Error sending packet: {}", e);
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),
_ => {}
} }
} }
}); });
...@@ -125,37 +115,23 @@ fn main() -> Result<(), Box<dyn Error>> { ...@@ -125,37 +115,23 @@ fn main() -> Result<(), Box<dyn Error>> {
s.spawn(move |_| { s.spawn(move |_| {
let mut recv_buf = [MaybeUninit::uninit(); 1500]; let mut recv_buf = [MaybeUninit::uninit(); 1500];
loop { loop {
match socket.recv_from(&mut recv_buf) { let (len, addr) = socket.recv_from(&mut recv_buf).unwrap();
Ok((len, addr)) => { let data: &mut [u8] = unsafe { transmute(&mut recv_buf[..len]) };
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>());
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) = router_writers.get_mut(&meta.src_id) { if let Some(packet) = Ipv4Packet::new(data) {
if meta.dst_id == config.local_id && meta.reversed == 0 { let header_len = packet.get_header_length() as usize * 4;
*router.endpoint.write().unwrap() = Some(addr); let (_ip_header, rest) = data.split_at_mut_checked(header_len).unwrap();
router.decrypt(payload); let (meta_bytes, payload) = rest.split_at_mut_checked(size_of::<Meta>()).unwrap();
router.tun_writer.write_all(payload).unwrap(); let meta: &Meta = unsafe { transmute(meta_bytes.as_ptr()) };
} if let Some(router) = router_writers.get_mut(&meta.src_id) {
} else { if meta.dst_id == config.local_id && meta.reversed == 0 {
// eprintln!("Dropping unexpected packet"); *router.endpoint.write().unwrap() = Some(addr);
} router.decrypt(payload);
router.tun_writer.write_all(payload).unwrap();
} }
} }
Err(e) => eprintln!("Error receiving: {}", e),
} }
// 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