network: implement proper IPv6 networking

This commit is contained in:
Alex Zenla
2024-02-11 07:29:37 +00:00
parent 6773640a39
commit 2c7879ad45
6 changed files with 51 additions and 12 deletions

View File

@ -3,6 +3,8 @@ use async_trait::async_trait;
use etherparse::Ethernet2Slice;
use etherparse::Icmpv4Header;
use etherparse::Icmpv4Type;
use etherparse::Icmpv6Header;
use etherparse::Icmpv6Type;
use etherparse::IpNumber;
use etherparse::IpPayloadSlice;
use etherparse::Ipv4Slice;
@ -220,6 +222,11 @@ impl NatRouter {
.await?;
}
IpNumber::IPV6_ICMP => {
self.process_icmpv6(data, ether, source_addr, dest_addr, ipv6.payload())
.await?;
}
_ => {}
}
@ -295,6 +302,31 @@ impl NatRouter {
Ok(())
}
pub async fn process_icmpv6<'a>(
&mut self,
data: &'a [u8],
ether: &Ethernet2Slice<'a>,
source_addr: IpAddress,
dest_addr: IpAddress,
payload: &IpPayloadSlice<'a>,
) -> Result<()> {
let (header, _) = Icmpv6Header::from_slice(payload.payload)?;
let Icmpv6Type::EchoRequest(_) = header.icmp_type else {
return Ok(());
};
let source = IpEndpoint::new(source_addr, 0);
let dest = IpEndpoint::new(dest_addr, 0);
let key = NatKey {
protocol: NatKeyProtocol::Icmp,
client_mac: EthernetAddress(ether.source()),
local_mac: EthernetAddress(ether.destination()),
client_ip: source,
external_ip: dest,
};
self.process_nat(data, key).await?;
Ok(())
}
pub async fn process_nat(&mut self, data: &[u8], key: NatKey) -> Result<()> {
for cidr in &self.local_cidrs {
if cidr.contains_addr(&key.external_ip.addr) {