@@ -959,12 +959,7 @@ async fn get_mtu(
959
959
let config = config_builder. build ( ) ;
960
960
961
961
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
966
962
967
- // let mut buf = vec![0; max_mtu as usize];
968
963
let step_size = 20 ;
969
964
let min_mtu = 576 ; // TODO: Account for IPv6?
970
965
let linspace = mtu_spacing ( min_mtu, max_mtu, step_size) ;
@@ -973,17 +968,34 @@ async fn get_mtu(
973
968
const ICMP_HEADER_SIZE : usize = 8 ;
974
969
975
970
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);
982
994
let surge_ping:: IcmpPacket :: V4 ( packet) = packet else {
983
995
panic ! ( ) ;
984
996
} ;
985
997
let size = packet. get_size ( ) + IPV4_HEADER_SIZE ;
986
- assert_eq ! ( size, * mtu) ;
998
+ debug_assert_eq ! ( size, mtu) ;
987
999
if size > largest_verified_mtu {
988
1000
largest_verified_mtu = size;
989
1001
}
0 commit comments