From 6f70c19859e352c2b1dc70a969e038d87a022a18 Mon Sep 17 00:00:00 2001 From: FujiApple Date: Mon, 16 May 2022 16:03:27 +0800 Subject: [PATCH] fix(net): UDP checksum was not being set --- src/tracing/net.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/tracing/net.rs b/src/tracing/net.rs index 328b0846..8a83e969 100644 --- a/src/tracing/net.rs +++ b/src/tracing/net.rs @@ -15,7 +15,7 @@ use pnet::packet::icmp::{echo_request, IcmpPacket, IcmpTypes}; use pnet::packet::ip::IpNextHeaderProtocols; use pnet::packet::ipv4::Ipv4Packet; use pnet::packet::tcp::TcpPacket; -use pnet::packet::udp::{MutableUdpPacket, UdpPacket}; +use pnet::packet::udp::{ipv4_checksum, MutableUdpPacket, UdpPacket}; use pnet::packet::Packet; use pnet::transport::{ icmp_packet_iter, transport_channel, TransportChannelType, TransportProtocol, @@ -257,6 +257,12 @@ impl TracerChannel { .iter_mut() .for_each(|x| *x = self.payload_pattern.0); udp.set_payload(&payload_buf[..payload_size]); + match (self.src_addr, self.dest_addr) { + (IpAddr::V4(src_addr), IpAddr::V4(dest_addr)) => { + udp.set_checksum(ipv4_checksum(&udp.to_immutable(), &src_addr, &dest_addr)); + } + _ => unreachable!(), + } self.udp_tx.set_ttl(probe.ttl.0)?; self.udp_tx.send_to(udp.to_immutable(), self.dest_addr)?; Ok(())