From ddfb8e8be1b16d9cef94d08bfaf97c1d93ae6cc9 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 3 Mar 2025 14:36:39 +0100 Subject: [PATCH] fix: networking bug due to ya-relay-client race condition --- Cargo.lock | 68 +++++++----------------------------- Cargo.toml | 4 +-- core/vpn/Cargo.toml | 2 +- core/vpn/src/network.rs | 4 --- exe-unit/src/network/inet.rs | 7 ++-- 5 files changed, 19 insertions(+), 66 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e13972c68c..b4e307e5f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9872,8 +9872,8 @@ dependencies = [ [[package]] name = "ya-relay-client" -version = "0.6.1" -source = "git+https://github.com/golemfactory/ya-relay.git?rev=0588dd1af311ae19c621b04cc2a4cfd9c0483252#0588dd1af311ae19c621b04cc2a4cfd9c0483252" +version = "0.6.2" +source = "git+https://github.com/golemfactory/ya-relay.git?rev=f727dfc735f051c07346f9a925375381bb72fad9#f727dfc735f051c07346f9a925375381bb72fad9" dependencies = [ "anyhow", "async-trait", @@ -9888,6 +9888,7 @@ dependencies = [ "metrics 0.21.1", "num_cpus", "parking_lot 0.12.3", + "rand 0.8.5", "strum 0.25.0", "strum_macros 0.25.3", "thiserror", @@ -9897,13 +9898,13 @@ dependencies = [ "ya-packet-trace 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "ya-relay-core", "ya-relay-proto", - "ya-relay-stack 0.5.1", + "ya-relay-stack", ] [[package]] name = "ya-relay-core" version = "0.4.1" -source = "git+https://github.com/golemfactory/ya-relay.git?rev=0588dd1af311ae19c621b04cc2a4cfd9c0483252#0588dd1af311ae19c621b04cc2a4cfd9c0483252" +source = "git+https://github.com/golemfactory/ya-relay.git?rev=f727dfc735f051c07346f9a925375381bb72fad9#f727dfc735f051c07346f9a925375381bb72fad9" dependencies = [ "anyhow", "chrono", @@ -9927,13 +9928,13 @@ dependencies = [ "uuid 0.8.2", "ya-client-model", "ya-relay-proto", - "ya-relay-stack 0.5.1", + "ya-relay-stack", ] [[package]] name = "ya-relay-proto" version = "0.4.3" -source = "git+https://github.com/golemfactory/ya-relay.git?rev=0588dd1af311ae19c621b04cc2a4cfd9c0483252#0588dd1af311ae19c621b04cc2a4cfd9c0483252" +source = "git+https://github.com/golemfactory/ya-relay.git?rev=f727dfc735f051c07346f9a925375381bb72fad9#f727dfc735f051c07346f9a925375381bb72fad9" dependencies = [ "anyhow", "bytes 1.7.2", @@ -9947,33 +9948,13 @@ dependencies = [ "thiserror", "tokio", "tokio-util", - "ya-relay-util 0.1.0 (git+https://github.com/golemfactory/ya-relay.git?rev=0588dd1af311ae19c621b04cc2a4cfd9c0483252)", -] - -[[package]] -name = "ya-relay-stack" -version = "0.5.0" -source = "git+https://github.com/golemfactory/ya-relay.git?rev=c92a75b0cf062fcc9dbb3ea2a034d913e5fad8e5#c92a75b0cf062fcc9dbb3ea2a034d913e5fad8e5" -dependencies = [ - "derive_more", - "futures 0.3.30", - "lazy_static", - "log", - "managed", - "num-derive", - "num-traits", - "rand 0.8.5", - "thiserror", - "tokio", - "tokio-stream", - "ya-relay-util 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ya-smoltcp", + "ya-relay-util", ] [[package]] name = "ya-relay-stack" version = "0.5.1" -source = "git+https://github.com/golemfactory/ya-relay.git?rev=0588dd1af311ae19c621b04cc2a4cfd9c0483252#0588dd1af311ae19c621b04cc2a4cfd9c0483252" +source = "git+https://github.com/golemfactory/ya-relay.git?rev=f727dfc735f051c07346f9a925375381bb72fad9#f727dfc735f051c07346f9a925375381bb72fad9" dependencies = [ "derive_more", "futures 0.3.30", @@ -9987,23 +9968,13 @@ dependencies = [ "thiserror", "tokio", "tokio-stream", - "ya-relay-util 0.1.0 (git+https://github.com/golemfactory/ya-relay.git?rev=0588dd1af311ae19c621b04cc2a4cfd9c0483252)", + "ya-relay-util", ] [[package]] name = "ya-relay-util" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306a73f6ce2286987c9da25bc0c2ef81f4f0b2b58bb8d9aeedc34d27407603ff" -dependencies = [ - "bytes 1.7.2", - "derive_more", -] - -[[package]] -name = "ya-relay-util" -version = "0.1.0" -source = "git+https://github.com/golemfactory/ya-relay.git?rev=0588dd1af311ae19c621b04cc2a4cfd9c0483252#0588dd1af311ae19c621b04cc2a4cfd9c0483252" +source = "git+https://github.com/golemfactory/ya-relay.git?rev=f727dfc735f051c07346f9a925375381bb72fad9#f727dfc735f051c07346f9a925375381bb72fad9" dependencies = [ "bytes 1.7.2", "derive_more", @@ -10214,19 +10185,6 @@ dependencies = [ "ya-service-bus", ] -[[package]] -name = "ya-smoltcp" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3d0272d5c8132a645101c104d4eebde3cc12f28e5803229c94642bc6a08d63" -dependencies = [ - "bitflags 1.3.2", - "byteorder", - "libc", - "log", - "managed", -] - [[package]] name = "ya-std-utils" version = "0.1.0" @@ -10377,7 +10335,7 @@ dependencies = [ "thiserror", "trust-dns-resolver 0.22.0", "url", - "ya-relay-stack 0.5.0", + "ya-relay-stack", ] [[package]] @@ -10461,6 +10419,7 @@ dependencies = [ "serde", "serde_json", "sha3 0.8.2", + "smoltcp", "structopt", "thiserror", "tokio", @@ -10477,7 +10436,6 @@ dependencies = [ "ya-service-api-interfaces", "ya-service-api-web", "ya-service-bus", - "ya-smoltcp", "ya-utils-networking", ] diff --git a/Cargo.toml b/Cargo.toml index 3e1044e000..b287eaf830 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -275,8 +275,8 @@ url = "2.3.1" ya-agreement-utils = { version = "0.6", path = "utils/agreement-utils" } ya-exe-unit.path = "./exe-unit" -ya-relay-client = { git = "https://github.com/golemfactory/ya-relay.git", rev = "0588dd1af311ae19c621b04cc2a4cfd9c0483252" } -ya-relay-stack = { git = "https://github.com/golemfactory/ya-relay.git", rev = "c92a75b0cf062fcc9dbb3ea2a034d913e5fad8e5" } +ya-relay-client = { git = "https://github.com/golemfactory/ya-relay.git", rev = "f727dfc735f051c07346f9a925375381bb72fad9" } +ya-relay-stack = { git = "https://github.com/golemfactory/ya-relay.git", rev = "f727dfc735f051c07346f9a925375381bb72fad9" } ya-utils-futures = { path = "utils/futures" } ya-utils-networking = { path = "utils/networking", default-features = false } ya-file-logging.path = "utils/file-logging" diff --git a/core/vpn/Cargo.toml b/core/vpn/Cargo.toml index 7fdbe451a8..7f985aad48 100644 --- a/core/vpn/Cargo.toml +++ b/core/vpn/Cargo.toml @@ -31,7 +31,7 @@ mime.workspace = true rand = "0.7.3" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -smoltcp = { package = "ya-smoltcp", version = "0.1" } +smoltcp = "0.10.0" thiserror = "1.0" tokio = { version = "1", features = ["time"] } tokio-stream = "0.1.6" diff --git a/core/vpn/src/network.rs b/core/vpn/src/network.rs index a2a55e7248..f5c9f684dc 100644 --- a/core/vpn/src/network.rs +++ b/core/vpn/src/network.rs @@ -785,10 +785,6 @@ fn create_ethernet_addr(ip: IpCidr) -> Result { IpAddress::Ipv6(ip6) => Ok(EthernetAddress([ 0xA0, 0x13, ip6.0[12], ip6.0[13], ip6.0[14], ip6.0[15], ])), - _ => Err(Error::Other(format!( - "Could not create ethernet addr from ip: {:?}", - ip - ))), } } diff --git a/exe-unit/src/network/inet.rs b/exe-unit/src/network/inet.rs index 243a8478d7..cc77f9e147 100644 --- a/exe-unit/src/network/inet.rs +++ b/exe-unit/src/network/inet.rs @@ -24,8 +24,8 @@ use tokio_util::udp::UdpFramed; use net::connection::{Connection, ConnectionMeta}; use net::interface::tap_iface; +use net::smoltcp::wire::{IpAddress, IpCidr, IpEndpoint}; use net::socket::SocketDesc; -use net::ya_smoltcp::wire::{IpAddress, IpCidr, IpEndpoint}; use net::{EgressReceiver, IngressEvent, IngressReceiver}; use net::{Error as NetError, Protocol}; @@ -34,8 +34,8 @@ use ya_runtime_api::server::{CreateNetwork, NetworkInterface, RuntimeService}; use ya_std_utils::LogErr; use ya_utils_networking::vpn::common::ntoh; use ya_utils_networking::vpn::stack as net; -use ya_utils_networking::vpn::stack::ya_smoltcp::iface::SocketHandle; -use ya_utils_networking::vpn::stack::ya_smoltcp::wire::{ +use ya_utils_networking::vpn::stack::smoltcp::iface::SocketHandle; +use ya_utils_networking::vpn::stack::smoltcp::wire::{ EthernetAddress, HardwareAddress, Ipv4Address, Ipv6Address, }; use ya_utils_networking::vpn::stack::StackConfig; @@ -1114,7 +1114,6 @@ fn conv_ip_addr(addr: IpAddress) -> Result { match addr { IpAddress::Ipv4(ipv4) => Ok(IpAddr::V4(ipv4.into())), IpAddress::Ipv6(ipv6) => Ok(IpAddr::V6(ipv6.into())), - _ => Err(NetError::EndpointInvalid(IpEndpoint::from((addr, 0)).into()).into()), } }