Skip to content

Commit 8671c59

Browse files
committed
Spawn pingers asynchronously
1 parent a4ef2b5 commit 8671c59

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

talpid-wireguard/src/lib.rs

+24-12
Original file line numberDiff line numberDiff line change
@@ -959,12 +959,7 @@ async fn get_mtu(
959959
let config = config_builder.build();
960960

961961
let client = Client::new(&config).unwrap();
962-
let mut pinger = client
963-
.pinger(IpAddr::V4(gateway), PingIdentifier(111))
964-
.await;
965-
pinger.timeout(Duration::from_secs(5)); // TODO: choose a good timeout
966962

967-
// let mut buf = vec![0; max_mtu as usize];
968963
let step_size = 20;
969964
let min_mtu = 576; // TODO: Account for IPv6?
970965
let linspace = mtu_spacing(min_mtu, max_mtu, step_size);
@@ -973,17 +968,34 @@ async fn get_mtu(
973968
const ICMP_HEADER_SIZE: usize = 8;
974969

975970
let mut largest_verified_mtu = min_mtu;
976-
for (i, mtu) in linspace.iter().enumerate() {
977-
log::warn!("Sending {mtu}");
978-
let buf = vec![0; *mtu - IPV4_HEADER_SIZE - ICMP_HEADER_SIZE]; // TODO: avoid allocating
979-
match pinger.ping(PingSequence(i as u16), &buf).await {
980-
Ok((packet, rtt)) => {
981-
println!("{:?} {:0.2?}", packet, rtt);
971+
use tokio::task::JoinSet;
972+
973+
let mut set = JoinSet::new();
974+
for (i, &mtu) in linspace.iter().enumerate() {
975+
let mut pinger = client
976+
.clone()
977+
.pinger(IpAddr::V4(gateway), PingIdentifier(111)) // TODO: randomize?
978+
.await;
979+
pinger.timeout(Duration::from_secs(5)); // TODO: choose a good timeout
980+
let fut = async move {
981+
log::warn!("Sending ICMP ping of total size {mtu}"); // TODO: Make a debug level print
982+
let payload = vec![0; mtu - IPV4_HEADER_SIZE - ICMP_HEADER_SIZE]; // ? Can we avoid allocating here?
983+
984+
(mtu, pinger.ping(PingSequence(i as u16), &payload).await)
985+
};
986+
set.spawn(fut);
987+
}
988+
989+
while let Some(res) = set.join_next().await {
990+
let (mtu, ping) = res.expect("Join error");
991+
match ping {
992+
Ok((packet, _rtt)) => {
993+
// println!("{:?} {:0.2?}", packet, rtt);
982994
let surge_ping::IcmpPacket::V4(packet) = packet else {
983995
panic!();
984996
};
985997
let size = packet.get_size() + IPV4_HEADER_SIZE;
986-
assert_eq!(size, *mtu);
998+
debug_assert_eq!(size, mtu);
987999
if size > largest_verified_mtu {
9881000
largest_verified_mtu = size;
9891001
}

0 commit comments

Comments
 (0)