diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b4a12903..e0ee0b8b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,7 +16,7 @@ env: RUST_BACKTRACE: 1 RUSTFLAGS: -Dwarnings RUSTDOCFLAGS: -Dwarnings - MSRV: "1.85" + MSRV: "1.89" SCCACHE_CACHE_SIZE: "10G" IROH_FORCE_STAGING_RELAYS: "1" diff --git a/Cargo.lock b/Cargo.lock index ca18ab86..717084f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -590,9 +590,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -753,9 +753,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iroh-metrics" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5828152c482cf9d95f3039848ac2be5e6e47c41dbf3695a453e6c02739c50d2c" +checksum = "c946095f060e6e59b9ff30cc26c75cdb758e7fb0cde8312c89e2144654989fcb" dependencies = [ "iroh-metrics-derive", "itoa", @@ -768,9 +768,9 @@ dependencies = [ [[package]] name = "iroh-metrics-derive" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e12bd0763fd16062f5cc5e8db15dd52d26e75a8af4c7fb57ccee3589b344b8" +checksum = "cab063c2bfd6c3d5a33a913d4fdb5252f140db29ec67c704f20f3da7e8f92dbf" dependencies = [ "heck", "proc-macro2", @@ -780,9 +780,9 @@ dependencies = [ [[package]] name = "iroh-quinn-udp" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91fe9ec3db6615d7ab1b303717f3b98fc40b96955a4ea25b113b1b879f7481f" +checksum = "f981dadd5a072a9e0efcd24bdcc388e570073f7e51b33505ceb1ef4668c80c86" dependencies = [ "cfg_aliases", "libc", @@ -821,9 +821,9 @@ checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "litemap" @@ -1025,12 +1025,12 @@ dependencies = [ [[package]] name = "netlink-sys" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16c903aa70590cb93691bf97a767c8d1d6122d2cc9070433deb3bbf36ce8bd23" +checksum = "cd6c30ed10fa69cc491d491b85cc971f6bdeb8e7367b7cde2ee6cc878d583fae" dependencies = [ "bytes", - "futures", + "futures-util", "libc", "log", "tokio", @@ -1118,9 +1118,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-traits" @@ -1360,9 +1360,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -1378,9 +1378,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -1573,9 +1573,9 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ "libc", "windows-sys 0.60.2", @@ -2452,18 +2452,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.33" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +checksum = "fdea86ddd5568519879b8187e1cf04e24fce28f7fe046ceecbce472ff19a2572" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.33" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +checksum = "0c15e1b46eff7c6c91195752e0eeed8ef040e391cdece7c25376957d5f15df22" dependencies = [ "proc-macro2", "quote", diff --git a/netwatch/Cargo.toml b/netwatch/Cargo.toml index f895f0b4..bfcab446 100644 --- a/netwatch/Cargo.toml +++ b/netwatch/Cargo.toml @@ -10,7 +10,7 @@ keywords = ["networking", "interfaces"] edition = "2024" # Sadly this also needs to be updated in .github/workflows/ci.yml -rust-version = "1.85" +rust-version = "1.89" [lints] workspace = true @@ -34,7 +34,7 @@ tracing = "0.1" # non-browser dependencies [target.'cfg(not(all(target_family = "wasm", target_os = "unknown")))'.dependencies] -quinn-udp = { package = "iroh-quinn-udp", version = "0.7" } +quinn-udp = { package = "iroh-quinn-udp", version = "0.8" } libc = "0.2.139" netdev = "0.40.0" socket2 = { version = "0.6", features = ["all"] } diff --git a/netwatch/src/interfaces.rs b/netwatch/src/interfaces.rs index f1552153..8d6448df 100644 --- a/netwatch/src/interfaces.rs +++ b/netwatch/src/interfaces.rs @@ -196,10 +196,10 @@ impl fmt::Display for State { ifaces.sort_by_key(|iface| iface.iface.index); for iface in ifaces { write!(f, "{iface}")?; - if let Some(ref default_if) = self.default_route_interface { - if iface.name() == default_if { - write!(f, " (default)")?; - } + if let Some(ref default_if) = self.default_route_interface + && iface.name() == default_if + { + write!(f, " (default)")?; } if f.alternate() { writeln!(f)?; diff --git a/netwatch/src/netmon/bsd.rs b/netwatch/src/netmon/bsd.rs index af016f3d..0c6e5aaf 100644 --- a/netwatch/src/netmon/bsd.rs +++ b/netwatch/src/netmon/bsd.rs @@ -92,23 +92,21 @@ pub(super) fn is_interesting_message(msg: &WireMessage) -> bool { WireMessage::InterfaceMulticastAddr(_) => true, WireMessage::Interface(_) => false, WireMessage::InterfaceAddr(msg) => { - if let Some(addr) = msg.addrs.get(RTAX_IFP as usize) { - if let Some(name) = addr.name() { - if !is_interesting_interface(name) { - return false; - } - } + if let Some(addr) = msg.addrs.get(RTAX_IFP as usize) + && let Some(name) = addr.name() + && !is_interesting_interface(name) + { + return false; } true } WireMessage::Route(msg) => { // Ignore local unicast - if let Some(addr) = msg.addrs.get(RTAX_DST as usize) { - if let Some(ip) = addr.ip() { - if is_link_local(ip) { - return false; - } - } + if let Some(addr) = msg.addrs.get(RTAX_DST as usize) + && let Some(ip) = addr.ip() + && is_link_local(ip) + { + return false; } true diff --git a/netwatch/src/udp.rs b/netwatch/src/udp.rs index e0bcc965..bbc1a8f7 100644 --- a/netwatch/src/udp.rs +++ b/netwatch/src/udp.rs @@ -841,16 +841,16 @@ impl SocketState { impl Drop for UdpSocket { fn drop(&mut self) { - if let Some((socket, _)) = self.socket.write().unwrap().close() { - if let Ok(handle) = tokio::runtime::Handle::try_current() { - // No wakeup after dropping write lock here, since we're getting dropped. - // this will be empty if `close` was called before - let std_sock = socket.into_std(); - handle.spawn_blocking(move || { - // Calls libc::close, which can block - drop(std_sock); - }); - } + if let Some((socket, _)) = self.socket.write().unwrap().close() + && let Ok(handle) = tokio::runtime::Handle::try_current() + { + // No wakeup after dropping write lock here, since we're getting dropped. + // this will be empty if `close` was called before + let std_sock = socket.into_std(); + handle.spawn_blocking(move || { + // Calls libc::close, which can block + drop(std_sock); + }); } } } diff --git a/portmapper/Cargo.toml b/portmapper/Cargo.toml index a606b0a8..0c26db61 100644 --- a/portmapper/Cargo.toml +++ b/portmapper/Cargo.toml @@ -10,7 +10,7 @@ repository = "https://github.com/n0-computer/net-tools" keywords = ["portmapping", "pmp", "pcp", "upnp"] # Sadly this also needs to be updated in .github/workflows/ci.yml -rust-version = "1.85" +rust-version = "1.89" [lints] workspace = true diff --git a/portmapper/src/current_mapping.rs b/portmapper/src/current_mapping.rs index 84b82bd5..6cc4f854 100644 --- a/portmapper/src/current_mapping.rs +++ b/portmapper/src/current_mapping.rs @@ -135,28 +135,27 @@ impl CurrentMapping { deadline, expire_after, }) = &mut self.mapping + && deadline.as_mut().poll(cx).is_ready() { - if deadline.as_mut().poll(cx).is_ready() { - let (external_ip, external_port) = mapping.external(); - // check if the deadline means the mapping is expired or due for renewal - return if *expire_after { - trace!("mapping expired {mapping:?}"); - self.update(None); - Poll::Ready(Event::Expired { - external_ip, - external_port, - }) - } else { - // mapping is due for renewal - *deadline = Box::pin(time::sleep(mapping.half_lifetime())); - *expire_after = true; - trace!("due for renewal {mapping:?}"); - Poll::Ready(Event::Renew { - external_ip, - external_port, - }) - }; - } + let (external_ip, external_port) = mapping.external(); + // check if the deadline means the mapping is expired or due for renewal + return if *expire_after { + trace!("mapping expired {mapping:?}"); + self.update(None); + Poll::Ready(Event::Expired { + external_ip, + external_port, + }) + } else { + // mapping is due for renewal + *deadline = Box::pin(time::sleep(mapping.half_lifetime())); + *expire_after = true; + trace!("due for renewal {mapping:?}"); + Poll::Ready(Event::Renew { + external_ip, + external_port, + }) + }; } Poll::Pending } diff --git a/portmapper/src/lib.rs b/portmapper/src/lib.rs index 07b5ddef..7486830d 100644 --- a/portmapper/src/lib.rs +++ b/portmapper/src/lib.rs @@ -488,10 +488,10 @@ impl Service { /// Clears the current mapping and releases it. async fn invalidate_mapping(&mut self) { - if let Some(old_mapping) = self.current_mapping.update(None) { - if let Err(e) = old_mapping.release().await { - debug!("failed to release mapping {e}"); - } + if let Some(old_mapping) = self.current_mapping.update(None) + && let Err(e) = old_mapping.release().await + { + debug!("failed to release mapping {e}"); } } diff --git a/portmapper/src/upnp.rs b/portmapper/src/upnp.rs index 22cda586..ae69c98b 100644 --- a/portmapper/src/upnp.rs +++ b/portmapper/src/upnp.rs @@ -97,8 +97,8 @@ impl Mapping { // if we are trying to get a specific external port, try this first. If this fails, default // to try to get any port - if let Some(external_port) = preferred_port { - if gateway + if let Some(external_port) = preferred_port + && gateway .add_port( protocol, external_port.into(), @@ -108,14 +108,13 @@ impl Mapping { ) .await .is_ok() - { - return Ok(Mapping { - protocol, - gateway, - external_ip, - external_port, - }); - } + { + return Ok(Mapping { + protocol, + gateway, + external_ip, + external_port, + }); } let external_port = gateway