diff --git a/Cargo.lock b/Cargo.lock index e651d43..669f0e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "ahash" @@ -45,15 +45,6 @@ dependencies = [ "syn 2.0.90", ] -[[package]] -name = "atomic-polyfill" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" -dependencies = [ - "critical-section", -] - [[package]] name = "atty" version = "0.2.14" @@ -85,7 +76,7 @@ dependencies = [ "log", "object", "once_cell", - "thiserror", + "thiserror 1.0.58", ] [[package]] @@ -99,7 +90,7 @@ dependencies = [ "hashbrown 0.15.2", "log", "object", - "thiserror", + "thiserror 1.0.58", ] [[package]] @@ -227,12 +218,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "critical-section" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" - [[package]] name = "crypto-common" version = "0.1.6" @@ -245,9 +230,18 @@ dependencies = [ [[package]] name = "defmt" -version = "0.3.6" +version = "0.3.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3939552907426de152b3c2c6f51ed53f98f448babd26f28694c95f5906194595" +checksum = "f0963443817029b2024136fc4dd07a5107eb8f977eaf18fcd1fdeb11306b64ad" +dependencies = [ + "defmt 1.0.1", +] + +[[package]] +name = "defmt" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "548d977b6da32fa1d1fda2876453da1e7df63ad0304c8b3dae4dbe7b96f39b78" dependencies = [ "bitflags 1.3.2", "defmt-macros", @@ -255,12 +249,12 @@ dependencies = [ [[package]] name = "defmt-macros" -version = "0.3.7" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18bdc7a7b92ac413e19e95240e75d3a73a8d8e78aa24a594c22cbb4d44b4bbda" +checksum = "3d4fc12a85bcf441cfe44344c4b72d58493178ce635338a3f3b78943aceb258e" dependencies = [ "defmt-parser", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", "syn 2.0.90", @@ -268,11 +262,11 @@ dependencies = [ [[package]] name = "defmt-parser" -version = "0.3.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4a5fefe330e8d7f31b16a318f9ce81000d8e35e69b93eae154d16d2278f70f" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" dependencies = [ - "thiserror", + "thiserror 2.0.12", ] [[package]] @@ -297,7 +291,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e6b21a1211455e82b1245d6e1b024f30606afbb734c114515d40d0e0b34ce81" dependencies = [ - "thiserror", + "thiserror 1.0.58", "zerocopy", ] @@ -309,7 +303,7 @@ checksum = "bed110893a7f9f4ceb072e166354a09f6cb4cc416eec5b5e5e8ee367442d434b" dependencies = [ "pest", "pest_derive", - "thiserror", + "thiserror 1.0.58", ] [[package]] @@ -464,9 +458,9 @@ dependencies = [ [[package]] name = "hash32" -version = "0.2.1" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" dependencies = [ "byteorder", ] @@ -493,14 +487,11 @@ dependencies = [ [[package]] name = "heapless" -version = "0.7.17" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" dependencies = [ - "atomic-polyfill", "hash32", - "rustc_version", - "spin", "stable_deref_trait", ] @@ -585,16 +576,6 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" -[[package]] -name = "lock_api" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" -dependencies = [ - "autocfg", - "scopeguard", -] - [[package]] name = "log" version = "0.4.21" @@ -712,7 +693,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.58", "ucd-trie", ] @@ -769,27 +750,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", + "syn 2.0.90", ] [[package]] @@ -900,33 +879,12 @@ dependencies = [ "ordered-multimap", ] -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - [[package]] name = "ryu" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "semver" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" - [[package]] name = "serde" version = "1.0.197" @@ -1002,28 +960,20 @@ dependencies = [ [[package]] name = "smoltcp" -version = "0.10.0" -source = "git+https://github.com/erthalion/smoltcp.git?branch=feature/any-ip-for-arp#2fda9698ca70e5730a774224d6610014b3474f57" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad095989c1533c1c266d9b1e8d70a1329dd3723c3edac6d03bbd67e7bf6f4bb" dependencies = [ "bitflags 1.3.2", "byteorder", "cfg-if", - "defmt", + "defmt 0.3.100", "heapless", "libc", "log", "managed", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1089,7 +1039,16 @@ version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.58", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -1103,6 +1062,17 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "thread-id" version = "4.2.1" @@ -1188,7 +1158,7 @@ dependencies = [ "serde", "serde_json", "syn 1.0.109", - "thiserror", + "thiserror 1.0.58", "thread-id", "version_check", ] diff --git a/Cargo.toml b/Cargo.toml index dfcee1b..d9962c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,6 @@ config = "0.13.3" syscalls = "0.6.13" serde = { version = "1.0.171", features = ["derive"] } libc = "0.2.169" -smoltcp = {git = "https://github.com/erthalion/smoltcp.git", branch="feature/any-ip-for-arp"} +smoltcp = "0.12.0" aya = "0.13.1" aya-obj = "0.2.1" diff --git a/src/worker/network.rs b/src/worker/network.rs index 190a411..8781ced 100644 --- a/src/worker/network.rs +++ b/src/worker/network.rs @@ -144,7 +144,7 @@ impl NetworkWorker { .filter_map(|(_h, s)| tcp::Socket::downcast_mut(s)) .enumerate() { - let index = i as u64; + let index = i as u32; let (local_addr, local_port) = get_local_addr_port(addr, conns_per_addr, index); info!("connecting from {}:{}", local_addr, local_port); @@ -187,9 +187,9 @@ impl NetworkWorker { let tcp_tx_buffer = tcp::SocketBuffer::new(vec![0; 1024]); let mut socket = tcp::Socket::new(tcp_rx_buffer, tcp_tx_buffer); - let index = total_conns as u64; + let index = total_conns; let (local_addr, local_port) = - get_local_addr_port(addr, conns_per_addr, index); + get_local_addr_port(addr, conns_per_addr, total_conns); let lifetime: f64 = thread_rng().sample(Exp::new(departure_rate).unwrap()); @@ -369,35 +369,38 @@ impl NetworkWorker { } /// Map socket index to a local port and address. The address octets are -/// incremented every conns_per_addr sockets, whithin this interval the local port -/// is incremented. +/// incremented every conns_per_addr sockets, whithin this interval the local +/// port is incremented. The first port to be taken is 49152, an out of blue +/// large enough number. +/// +/// E.g. if the base address is 10.0.0.1, we put 100 connections on the same +/// address and this is 10th connection. In this case we should get +/// 10.0.0.2:49162 as a result, as if we were inserting 10 new addresses +/// starting from 10.0.0.2 (remember, 10.0.0.1 is the base address and is +/// already claimed) incrementing first 100 times the port, then the address. +/// +/// addr - starting point in the IP address space. The new address is going to +/// be based on it plus the connection number. +/// +/// conns_per_addr - how many connections are going to share the same IP +/// address, and differ only in port value. +/// +/// index - current global number of the connection. fn get_local_addr_port( addr: Ipv4Address, conns_per_addr: u16, - index: u64, + index: u32, ) -> (IpAddress, u16) { - let local_port = 49152 + (index % conns_per_addr as u64) as u16; + let local_port = 49152 + (index % conns_per_addr as u32) as u16; debug!("addr {}, index {}", addr, index); - let mut addr_index = index / conns_per_addr as u64; - let mut octets = addr.0; + // conns_per_addr effectively groups connections together, one address per + // group with only port being different. addr_index represent current index + // inside the space of such groups. + let addr_index = index / conns_per_addr as u32; + let local_addr = Ipv4Address::from_bits(addr.to_bits() + addr_index + 1); - info!("addr_index= {}", addr_index); - let mut carry = 0; - for i in (0..4).rev() { - let octet = addr_index % 256 + (octets[i] as u32 + carry) as u64; - if octet > 255 { - carry = 1; - } else { - carry = 0; - } - octets[i] = octet as u8; - addr_index /= 256; - } - - let local_addr = IpAddress::v4(octets[0], octets[1], octets[2], octets[3]); - - (local_addr, local_port) + (IpAddress::Ipv4(local_addr), local_port) } impl Worker for NetworkWorker { @@ -415,9 +418,9 @@ impl Worker for NetworkWorker { }; if server { - let _ = self.start_server(address.into(), target_port); + let _ = self.start_server(address, target_port); } else { - let _ = self.start_client(address.into(), target_port); + let _ = self.start_client(address, target_port); } Ok(()) @@ -438,41 +441,55 @@ mod tests { fn test_get_local_addr_port() { let test_cases = vec![ // (addr, conns_per_addr, index, expected_ip, expected_port) + // + // 10 conns per group, 15 -> second group, increment = 2 ( Ipv4Address::new(192, 168, 1, 100), 10, 15, - IpAddress::v4(192, 168, 1, 101), + IpAddress::v4(192, 168, 1, 102), 49157, ), + // 9 conns per group, 15 -> second group, increment = 2 ( Ipv4Address::new(192, 168, 1, 255), 9, 15, - IpAddress::v4(192, 168, 2, 0), + IpAddress::v4(192, 168, 2, 1), 49158, ), + // 12 conns per group, 15 -> second group, increment = 2 ( Ipv4Address::new(192, 255, 255, 255), 12, 15, - IpAddress::v4(193, 0, 0, 0), + IpAddress::v4(193, 0, 0, 1), 49155, ), + // 1 conn per group, 512 -> 512 group, increment = 512 ( Ipv4Address::new(192, 168, 1, 100), 1, 512, - IpAddress::v4(192, 168, 3, 100), + IpAddress::v4(192, 168, 3, 101), 49152, ), + // 1 conn per group, 65636 -> 65636 group, increment = 65636 ( Ipv4Address::new(192, 168, 1, 100), 1, 65636, - IpAddress::v4(192, 169, 1, 200), + IpAddress::v4(192, 169, 1, 201), 49152, ), + // 100 conn per group, 1 -> group, increment = 1 + ( + Ipv4Address::new(10, 0, 0, 1), + 100, + 1, + IpAddress::v4(10, 0, 0, 2), + 49153, + ), ]; for (addr, conns_per_addr, index, expected_ip, expected_port) in