Skip to content

Instantly share code, notes, and snippets.

@ssrlive
Created September 11, 2023 10:31
Show Gist options
  • Save ssrlive/1c5f84ff0ddb5f03ef3cb7cb05c47d9b to your computer and use it in GitHub Desktop.
Save ssrlive/1c5f84ff0ddb5f03ef3cb7cb05c47d9b to your computer and use it in GitHub Desktop.
use smoltcp::wire::{IpProtocol, Ipv4Packet, Ipv6Packet};
fn extract_udp_packet(packet: &[u8]) -> Result<UdpPacket, Box<dyn std::error::Error>> {
if let Ok(ipv4_packet) = Ipv4Packet::new_checked(packet) {
let src_addr = ipv4_packet.src_addr();
let dst_addr = ipv4_packet.dst_addr();
let protocol = ipv4_packet.next_header();
let payload = ipv4_packet.payload();
if protocol == IpProtocol::Udp {
let udp_packet = smoltcp::wire::UdpPacket::new_checked(payload)?;
let src_port = udp_packet.src_port();
let dst_port = udp_packet.dst_port();
let src_addr = SocketAddr::new(Ipv4Addr::from(src_addr).into(), src_port);
let dst_addr = SocketAddr::new(Ipv4Addr::from(dst_addr).into(), dst_port);
let data = udp_packet.payload();
let udp_packet = UdpPacket::new(src_addr, dst_addr, data);
return Ok(udp_packet);
}
} else {
let ipv6_packet = Ipv6Packet::new_checked(packet)?;
let src_addr = ipv6_packet.src_addr();
let dst_addr = ipv6_packet.dst_addr();
let protocol = ipv6_packet.next_header();
let payload = ipv6_packet.payload();
if protocol == IpProtocol::Udp {
let udp_packet = smoltcp::wire::UdpPacket::new_checked(payload)?;
let src_port = udp_packet.src_port();
let dst_port = udp_packet.dst_port();
let src_addr = SocketAddr::new(Ipv6Addr::from(src_addr).into(), src_port);
let dst_addr = SocketAddr::new(Ipv6Addr::from(dst_addr).into(), dst_port);
let data = udp_packet.payload();
let udp_packet = UdpPacket::new(src_addr, dst_addr, data);
return Ok(udp_packet);
}
}
Err("Packet is not a UDP packet".into())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment