diff --git a/CHANGELOG.md b/CHANGELOG.md index 19bf06d7..10b1b71b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Changed +* Network stack is randomly seeded on startup so that random ports are used. + ## [0.5.0] - 03-07-2023 ### Added diff --git a/Cargo.lock b/Cargo.lock index 11cd1276..6fd52a82 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -150,6 +150,7 @@ dependencies = [ "minireq", "mono-clock", "panic-persist", + "rand_core", "rtt-logger", "rtt-target", "serde", @@ -1310,9 +1311,9 @@ dependencies = [ [[package]] name = "smoltcp" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9786ac45091b96f946693e05bfa4d8ca93e2d3341237d97a380107a6b38dea" +checksum = "8d2e3a36ac8fea7b94e666dfa3871063d6e0a5c9d5d4fec9a1a6b7b6760f0229" dependencies = [ "bitflags 1.3.2", "byteorder", @@ -1323,9 +1324,9 @@ dependencies = [ [[package]] name = "smoltcp-nal" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "821854501c550f1d347b5ae469d8e273d21371ad2eb270a8ff6f37ca9a23f8bd" +checksum = "75077a28569d93c2eed77164fd36dd224a9efcf6ecf0e574f293ed638783b000" dependencies = [ "embedded-nal 0.7.0", "embedded-time", diff --git a/Cargo.toml b/Cargo.toml index 3aac8445..bea65ee9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,7 @@ exclude = [ cortex-m = "0.7.7" cortex-m-rt = "0.7" cortex-m-rtic = "1.1" +rand_core = "0.6" mono-clock = "0.1" systick-monotonic = "1.0.1" cortex-m-log = { version = "0.8.0", features = ["log-integration"] } @@ -53,7 +54,7 @@ minireq = "0.2" rtt-target = {version = "0.3", features=["cortex-m"]} enum-iterator = { version = "1.4", default-features = false } enc424j600 = { version = "0.3", features = ["cortex-m-cpu"] } -smoltcp-nal = { version = "0.3", features=["shared-stack"] } +smoltcp-nal = { version = "0.4", features=["shared-stack"] } [build-dependencies] built = { version = "0.6", features = ["git2"], default-features = false } diff --git a/src/hardware/net_interface.rs b/src/hardware/net_interface.rs index d05aa07b..7f2eeb76 100644 --- a/src/hardware/net_interface.rs +++ b/src/hardware/net_interface.rs @@ -50,9 +50,11 @@ impl TcpSocketStorage { /// # Args /// * `mac` - The smoltcp interface MAC. /// * `settings` - The device settings to use. +/// * `random_seed` - A random seed for the network stack. pub fn setup( device: &mut Mac, settings: &BoosterSettings, + random_seed: u64, ) -> ( smoltcp::iface::Interface, smoltcp::iface::SocketSet<'static>, @@ -61,12 +63,12 @@ pub fn setup( let ip_address = settings.ip_address(); - let mut config = smoltcp::iface::Config::default(); - config - .hardware_addr - .replace(smoltcp::wire::HardwareAddress::Ethernet(settings.mac())); + let mut config = + smoltcp::iface::Config::new(smoltcp::wire::HardwareAddress::Ethernet(settings.mac())); + config.random_seed = random_seed; - let mut interface = smoltcp::iface::Interface::new(config, device); + let mut interface = + smoltcp::iface::Interface::new(config, device, smoltcp::time::Instant::ZERO); interface .routes_mut() diff --git a/src/hardware/setup.rs b/src/hardware/setup.rs index 1cb09298..ed8ad3db 100644 --- a/src/hardware/setup.rs +++ b/src/hardware/setup.rs @@ -20,6 +20,7 @@ use core::convert::TryInto; use core::fmt::Write; use hal::prelude::*; use heapless::String; +use rand_core::RngCore; use usb_device::prelude::*; /// Macro for genering an RfChannelPins structure. @@ -377,8 +378,14 @@ pub fn setup( ApplicationMetadata::new(hardware_version, phy_string) }; - let (interface, sockets) = net_interface::setup(&mut mac, &settings); - let network_stack = smoltcp_nal::NetworkStack::new(interface, mac, sockets, clock); + let mut rng = device.RNG.constrain(&clocks); + + let (interface, sockets) = net_interface::setup(&mut mac, &settings, rng.next_u64()); + let mut network_stack = smoltcp_nal::NetworkStack::new(interface, mac, sockets, clock); + + let mut seed_bytes = [0; 8]; + rng.fill_bytes(&mut seed_bytes); + network_stack.seed_random_port(&seed_bytes); let mut fans = { let main_board_leds = {