network: begin work on ICMP

This commit is contained in:
Alex Zenla
2024-02-10 15:18:12 +00:00
parent a7f4e0a549
commit 4f0e505e2b
6 changed files with 234 additions and 15 deletions

View File

@ -17,8 +17,6 @@ use udp_stream::UdpStream;
use crate::nat::{NatHandler, NatKey};
use super::ProxyNatSelect;
const UDP_TIMEOUT_SECS: u64 = 60;
pub struct ProxyUdpHandler {
@ -34,6 +32,12 @@ impl NatHandler for ProxyUdpHandler {
}
}
enum ProxyUdpSelect {
External(usize),
Internal(Vec<u8>),
Close,
}
impl ProxyUdpHandler {
pub fn new(key: NatKey, rx_sender: Sender<Vec<u8>>) -> Self {
ProxyUdpHandler { key, rx_sender }
@ -79,16 +83,16 @@ impl ProxyUdpHandler {
let deadline = tokio::time::sleep(Duration::from_secs(UDP_TIMEOUT_SECS));
let selection = select! {
x = rx_receiver.recv() => if let Some(data) = x {
ProxyNatSelect::Internal(data)
ProxyUdpSelect::Internal(data)
} else {
ProxyNatSelect::Close
ProxyUdpSelect::Close
},
x = socket.read(&mut external_buffer) => ProxyNatSelect::External(x?),
_ = deadline => ProxyNatSelect::Close,
x = socket.read(&mut external_buffer) => ProxyUdpSelect::External(x?),
_ = deadline => ProxyUdpSelect::Close,
};
match selection {
ProxyNatSelect::External(size) => {
ProxyUdpSelect::External(size) => {
let data = &external_buffer[0..size];
let packet = PacketBuilder::ethernet2(key.local_mac.0, key.client_mac.0);
let packet = match (key.external_ip.addr, key.client_ip.addr) {
@ -109,7 +113,7 @@ impl ProxyUdpHandler {
debug!("failed to transmit udp packet: {}", error);
}
}
ProxyNatSelect::Internal(data) => {
ProxyUdpSelect::Internal(data) => {
let packet = SlicedPacket::from_ethernet(&data)?;
let Some(ref net) = packet.net else {
continue;
@ -122,7 +126,7 @@ impl ProxyUdpHandler {
let udp = UdpSlice::from_slice(ip.payload)?;
socket.write_all(udp.payload()).await?;
}
ProxyNatSelect::Close => {
ProxyUdpSelect::Close => {
drop(socket);
reclaim_sender.send(key).await?;
break;