diff options
| author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2023-01-19 13:57:21 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-01-19 13:57:21 +0000 |
| commit | 539a8107e2f09338294727f47827dec42104505f (patch) | |
| tree | 8549000f6edc66d860de44b7400d62a27c674d4f | |
| parent | 65ab714fae6315a032e7440f44429ced36d2506e (diff) | |
| parent | 78c2c1709b8c111468fd7dd2ec1f3792d2fcea67 (diff) | |
Merge #1161
1161: WIP: Smoltcp socket config r=Dirbaio a=Czocher
This PR updates the smoltcp version to the newest master one as well as implements the feature specified in #1154 - to allow the dhcpv4 socket to be configured.
Currently it should be considered a WIP PR - requires testing.
`@Dirbaio` can you have a look and check if this is compatible with what we discussed on the matrix channel?
Co-authored-by: Paweł Jan Czochański <[email protected]>
Co-authored-by: Dario Nieuwenhuis <[email protected]>
| -rw-r--r-- | embassy-net/Cargo.toml | 2 | ||||
| -rw-r--r-- | embassy-net/src/device.rs | 13 | ||||
| -rw-r--r-- | embassy-net/src/lib.rs | 130 | ||||
| -rw-r--r-- | examples/nrf52840/src/bin/usb_ethernet.rs | 11 | ||||
| -rw-r--r-- | examples/rp/src/bin/usb_ethernet.rs | 11 | ||||
| -rw-r--r-- | examples/std/Cargo.toml | 2 | ||||
| -rw-r--r-- | examples/std/src/bin/net.rs | 15 | ||||
| -rw-r--r-- | examples/std/src/bin/net_udp.rs | 13 | ||||
| -rw-r--r-- | examples/stm32f7/src/bin/eth.rs | 11 | ||||
| -rw-r--r-- | examples/stm32h7/src/bin/eth.rs | 11 | ||||
| -rw-r--r-- | examples/stm32h7/src/bin/eth_client.rs | 11 | ||||
| -rw-r--r-- | examples/stm32l5/src/bin/usb_ethernet.rs | 11 |
12 files changed, 110 insertions, 131 deletions
diff --git a/embassy-net/Cargo.toml b/embassy-net/Cargo.toml index 9214fd17e..15cbb5954 100644 --- a/embassy-net/Cargo.toml +++ b/embassy-net/Cargo.toml | |||
| @@ -51,7 +51,7 @@ atomic-polyfill = { version = "1.0" } | |||
| 51 | [dependencies.smoltcp] | 51 | [dependencies.smoltcp] |
| 52 | version = "0.8.0" | 52 | version = "0.8.0" |
| 53 | git = "https://github.com/smoltcp-rs/smoltcp" | 53 | git = "https://github.com/smoltcp-rs/smoltcp" |
| 54 | rev = "b7a7c4b1c56e8d4c2524c1e3a056c745a13cc09f" | 54 | rev = "5740b765749b95c18aace5de8dc21cab75ba33d4" |
| 55 | default-features = false | 55 | default-features = false |
| 56 | features = [ | 56 | features = [ |
| 57 | "proto-ipv4", | 57 | "proto-ipv4", |
diff --git a/embassy-net/src/device.rs b/embassy-net/src/device.rs index 44f7dc7bd..d0c8a62db 100644 --- a/embassy-net/src/device.rs +++ b/embassy-net/src/device.rs | |||
| @@ -2,6 +2,7 @@ use core::task::Context; | |||
| 2 | 2 | ||
| 3 | use embassy_net_driver::{Capabilities, Checksum, Driver, Medium, RxToken, TxToken}; | 3 | use embassy_net_driver::{Capabilities, Checksum, Driver, Medium, RxToken, TxToken}; |
| 4 | use smoltcp::phy; | 4 | use smoltcp::phy; |
| 5 | use smoltcp::time::Instant; | ||
| 5 | 6 | ||
| 6 | pub(crate) struct DriverAdapter<'d, 'c, T> | 7 | pub(crate) struct DriverAdapter<'d, 'c, T> |
| 7 | where | 8 | where |
| @@ -19,14 +20,14 @@ where | |||
| 19 | type RxToken<'a> = RxTokenAdapter<T::RxToken<'a>> where Self: 'a; | 20 | type RxToken<'a> = RxTokenAdapter<T::RxToken<'a>> where Self: 'a; |
| 20 | type TxToken<'a> = TxTokenAdapter<T::TxToken<'a>> where Self: 'a; | 21 | type TxToken<'a> = TxTokenAdapter<T::TxToken<'a>> where Self: 'a; |
| 21 | 22 | ||
| 22 | fn receive(&mut self) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> { | 23 | fn receive(&mut self, _timestamp: Instant) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> { |
| 23 | self.inner | 24 | self.inner |
| 24 | .receive(self.cx.as_deref_mut().unwrap()) | 25 | .receive(self.cx.as_deref_mut().unwrap()) |
| 25 | .map(|(rx, tx)| (RxTokenAdapter(rx), TxTokenAdapter(tx))) | 26 | .map(|(rx, tx)| (RxTokenAdapter(rx), TxTokenAdapter(tx))) |
| 26 | } | 27 | } |
| 27 | 28 | ||
| 28 | /// Construct a transmit token. | 29 | /// Construct a transmit token. |
| 29 | fn transmit(&mut self) -> Option<Self::TxToken<'_>> { | 30 | fn transmit(&mut self, _timestamp: Instant) -> Option<Self::TxToken<'_>> { |
| 30 | self.inner.transmit(self.cx.as_deref_mut().unwrap()).map(TxTokenAdapter) | 31 | self.inner.transmit(self.cx.as_deref_mut().unwrap()).map(TxTokenAdapter) |
| 31 | } | 32 | } |
| 32 | 33 | ||
| @@ -76,9 +77,9 @@ impl<T> phy::RxToken for RxTokenAdapter<T> | |||
| 76 | where | 77 | where |
| 77 | T: RxToken, | 78 | T: RxToken, |
| 78 | { | 79 | { |
| 79 | fn consume<R, F>(self, _timestamp: smoltcp::time::Instant, f: F) -> smoltcp::Result<R> | 80 | fn consume<R, F>(self, f: F) -> R |
| 80 | where | 81 | where |
| 81 | F: FnOnce(&mut [u8]) -> smoltcp::Result<R>, | 82 | F: FnOnce(&mut [u8]) -> R, |
| 82 | { | 83 | { |
| 83 | self.0.consume(|buf| f(buf)) | 84 | self.0.consume(|buf| f(buf)) |
| 84 | } | 85 | } |
| @@ -92,9 +93,9 @@ impl<T> phy::TxToken for TxTokenAdapter<T> | |||
| 92 | where | 93 | where |
| 93 | T: TxToken, | 94 | T: TxToken, |
| 94 | { | 95 | { |
| 95 | fn consume<R, F>(self, _timestamp: smoltcp::time::Instant, len: usize, f: F) -> smoltcp::Result<R> | 96 | fn consume<R, F>(self, len: usize, f: F) -> R |
| 96 | where | 97 | where |
| 97 | F: FnOnce(&mut [u8]) -> smoltcp::Result<R>, | 98 | F: FnOnce(&mut [u8]) -> R, |
| 98 | { | 99 | { |
| 99 | self.0.consume(len, |buf| f(buf)) | 100 | self.0.consume(len, |buf| f(buf)) |
| 100 | } | 101 | } |
diff --git a/embassy-net/src/lib.rs b/embassy-net/src/lib.rs index e4a4218e3..8d0119f67 100644 --- a/embassy-net/src/lib.rs +++ b/embassy-net/src/lib.rs | |||
| @@ -25,11 +25,11 @@ use futures::pin_mut; | |||
| 25 | use heapless::Vec; | 25 | use heapless::Vec; |
| 26 | #[cfg(feature = "dhcpv4")] | 26 | #[cfg(feature = "dhcpv4")] |
| 27 | use smoltcp::iface::SocketHandle; | 27 | use smoltcp::iface::SocketHandle; |
| 28 | use smoltcp::iface::{Interface, InterfaceBuilder, SocketSet, SocketStorage}; | 28 | use smoltcp::iface::{Interface, SocketSet, SocketStorage}; |
| 29 | #[cfg(feature = "medium-ethernet")] | ||
| 30 | use smoltcp::iface::{Neighbor, NeighborCache, Route, Routes}; | ||
| 31 | #[cfg(feature = "dhcpv4")] | 29 | #[cfg(feature = "dhcpv4")] |
| 32 | use smoltcp::socket::dhcpv4; | 30 | use smoltcp::socket::dhcpv4; |
| 31 | use smoltcp::socket::dhcpv4::RetryConfig; | ||
| 32 | use smoltcp::time::Duration; | ||
| 33 | // smoltcp reexports | 33 | // smoltcp reexports |
| 34 | pub use smoltcp::time::{Duration as SmolDuration, Instant as SmolInstant}; | 34 | pub use smoltcp::time::{Duration as SmolDuration, Instant as SmolInstant}; |
| 35 | #[cfg(feature = "medium-ethernet")] | 35 | #[cfg(feature = "medium-ethernet")] |
| @@ -45,40 +45,53 @@ use crate::device::DriverAdapter; | |||
| 45 | const LOCAL_PORT_MIN: u16 = 1025; | 45 | const LOCAL_PORT_MIN: u16 = 1025; |
| 46 | const LOCAL_PORT_MAX: u16 = 65535; | 46 | const LOCAL_PORT_MAX: u16 = 65535; |
| 47 | 47 | ||
| 48 | pub struct StackResources<const ADDR: usize, const SOCK: usize, const NEIGHBOR: usize> { | 48 | pub struct StackResources<const SOCK: usize> { |
| 49 | addresses: [IpCidr; ADDR], | ||
| 50 | sockets: [SocketStorage<'static>; SOCK], | 49 | sockets: [SocketStorage<'static>; SOCK], |
| 51 | |||
| 52 | #[cfg(feature = "medium-ethernet")] | ||
| 53 | routes: [Option<(IpCidr, Route)>; 1], | ||
| 54 | #[cfg(feature = "medium-ethernet")] | ||
| 55 | neighbor_cache: [Option<(IpAddress, Neighbor)>; NEIGHBOR], | ||
| 56 | } | 50 | } |
| 57 | 51 | ||
| 58 | impl<const ADDR: usize, const SOCK: usize, const NEIGHBOR: usize> StackResources<ADDR, SOCK, NEIGHBOR> { | 52 | impl<const SOCK: usize> StackResources<SOCK> { |
| 59 | pub fn new() -> Self { | 53 | pub fn new() -> Self { |
| 60 | Self { | 54 | Self { |
| 61 | addresses: [IpCidr::new(Ipv4Address::UNSPECIFIED.into(), 32); ADDR], | ||
| 62 | sockets: [SocketStorage::EMPTY; SOCK], | 55 | sockets: [SocketStorage::EMPTY; SOCK], |
| 63 | #[cfg(feature = "medium-ethernet")] | ||
| 64 | routes: [None; 1], | ||
| 65 | #[cfg(feature = "medium-ethernet")] | ||
| 66 | neighbor_cache: [None; NEIGHBOR], | ||
| 67 | } | 56 | } |
| 68 | } | 57 | } |
| 69 | } | 58 | } |
| 70 | 59 | ||
| 71 | #[derive(Debug, Clone, PartialEq, Eq)] | 60 | #[derive(Debug, Clone, PartialEq, Eq)] |
| 72 | pub struct Config { | 61 | pub struct StaticConfig { |
| 73 | pub address: Ipv4Cidr, | 62 | pub address: Ipv4Cidr, |
| 74 | pub gateway: Option<Ipv4Address>, | 63 | pub gateway: Option<Ipv4Address>, |
| 75 | pub dns_servers: Vec<Ipv4Address, 3>, | 64 | pub dns_servers: Vec<Ipv4Address, 3>, |
| 76 | } | 65 | } |
| 77 | 66 | ||
| 78 | pub enum ConfigStrategy { | 67 | #[derive(Debug, Clone, PartialEq, Eq)] |
| 79 | Static(Config), | 68 | pub struct DhcpConfig { |
| 69 | pub max_lease_duration: Option<Duration>, | ||
| 70 | pub retry_config: RetryConfig, | ||
| 71 | /// Ignore NAKs. | ||
| 72 | pub ignore_naks: bool, | ||
| 73 | /// Server port config | ||
| 74 | pub server_port: u16, | ||
| 75 | /// Client port config | ||
| 76 | pub client_port: u16, | ||
| 77 | } | ||
| 78 | |||
| 79 | impl Default for DhcpConfig { | ||
| 80 | fn default() -> Self { | ||
| 81 | Self { | ||
| 82 | max_lease_duration: Default::default(), | ||
| 83 | retry_config: Default::default(), | ||
| 84 | ignore_naks: Default::default(), | ||
| 85 | server_port: smoltcp::wire::DHCP_SERVER_PORT, | ||
| 86 | client_port: smoltcp::wire::DHCP_CLIENT_PORT, | ||
| 87 | } | ||
| 88 | } | ||
| 89 | } | ||
| 90 | |||
| 91 | pub enum Config { | ||
| 92 | Static(StaticConfig), | ||
| 80 | #[cfg(feature = "dhcpv4")] | 93 | #[cfg(feature = "dhcpv4")] |
| 81 | Dhcp, | 94 | Dhcp(DhcpConfig), |
| 82 | } | 95 | } |
| 83 | 96 | ||
| 84 | pub struct Stack<D: Driver> { | 97 | pub struct Stack<D: Driver> { |
| @@ -89,43 +102,42 @@ pub struct Stack<D: Driver> { | |||
| 89 | struct Inner<D: Driver> { | 102 | struct Inner<D: Driver> { |
| 90 | device: D, | 103 | device: D, |
| 91 | link_up: bool, | 104 | link_up: bool, |
| 92 | config: Option<Config>, | 105 | config: Option<StaticConfig>, |
| 93 | #[cfg(feature = "dhcpv4")] | 106 | #[cfg(feature = "dhcpv4")] |
| 94 | dhcp_socket: Option<SocketHandle>, | 107 | dhcp_socket: Option<SocketHandle>, |
| 95 | } | 108 | } |
| 96 | 109 | ||
| 97 | pub(crate) struct SocketStack { | 110 | pub(crate) struct SocketStack { |
| 98 | pub(crate) sockets: SocketSet<'static>, | 111 | pub(crate) sockets: SocketSet<'static>, |
| 99 | pub(crate) iface: Interface<'static>, | 112 | pub(crate) iface: Interface, |
| 100 | pub(crate) waker: WakerRegistration, | 113 | pub(crate) waker: WakerRegistration, |
| 101 | next_local_port: u16, | 114 | next_local_port: u16, |
| 102 | } | 115 | } |
| 103 | 116 | ||
| 104 | impl<D: Driver + 'static> Stack<D> { | 117 | impl<D: Driver + 'static> Stack<D> { |
| 105 | pub fn new<const ADDR: usize, const SOCK: usize, const NEIGH: usize>( | 118 | pub fn new<const SOCK: usize>( |
| 106 | mut device: D, | 119 | mut device: D, |
| 107 | config: ConfigStrategy, | 120 | config: Config, |
| 108 | resources: &'static mut StackResources<ADDR, SOCK, NEIGH>, | 121 | resources: &'static mut StackResources<SOCK>, |
| 109 | random_seed: u64, | 122 | random_seed: u64, |
| 110 | ) -> Self { | 123 | ) -> Self { |
| 111 | #[cfg(feature = "medium-ethernet")] | 124 | #[cfg(feature = "medium-ethernet")] |
| 112 | let medium = device.capabilities().medium; | 125 | let medium = device.capabilities().medium; |
| 113 | 126 | ||
| 114 | let mut b = InterfaceBuilder::new(); | 127 | let mut iface_cfg = smoltcp::iface::Config::new(); |
| 115 | b = b.ip_addrs(&mut resources.addresses[..]); | 128 | iface_cfg.random_seed = random_seed; |
| 116 | b = b.random_seed(random_seed); | ||
| 117 | |||
| 118 | #[cfg(feature = "medium-ethernet")] | 129 | #[cfg(feature = "medium-ethernet")] |
| 119 | if medium == Medium::Ethernet { | 130 | if medium == Medium::Ethernet { |
| 120 | b = b.hardware_addr(HardwareAddress::Ethernet(EthernetAddress(device.ethernet_address()))); | 131 | iface_cfg.hardware_addr = Some(HardwareAddress::Ethernet(EthernetAddress(device.ethernet_address()))); |
| 121 | b = b.neighbor_cache(NeighborCache::new(&mut resources.neighbor_cache[..])); | ||
| 122 | b = b.routes(Routes::new(&mut resources.routes[..])); | ||
| 123 | } | 132 | } |
| 124 | 133 | ||
| 125 | let iface = b.finalize(&mut DriverAdapter { | 134 | let iface = Interface::new( |
| 126 | inner: &mut device, | 135 | iface_cfg, |
| 127 | cx: None, | 136 | &mut DriverAdapter { |
| 128 | }); | 137 | inner: &mut device, |
| 138 | cx: None, | ||
| 139 | }, | ||
| 140 | ); | ||
| 129 | 141 | ||
| 130 | let sockets = SocketSet::new(&mut resources.sockets[..]); | 142 | let sockets = SocketSet::new(&mut resources.sockets[..]); |
| 131 | 143 | ||
| @@ -146,10 +158,12 @@ impl<D: Driver + 'static> Stack<D> { | |||
| 146 | }; | 158 | }; |
| 147 | 159 | ||
| 148 | match config { | 160 | match config { |
| 149 | ConfigStrategy::Static(config) => inner.apply_config(&mut socket, config), | 161 | Config::Static(config) => inner.apply_config(&mut socket, config), |
| 150 | #[cfg(feature = "dhcpv4")] | 162 | #[cfg(feature = "dhcpv4")] |
| 151 | ConfigStrategy::Dhcp => { | 163 | Config::Dhcp(config) => { |
| 152 | let handle = socket.sockets.add(smoltcp::socket::dhcpv4::Socket::new()); | 164 | let mut dhcp_socket = smoltcp::socket::dhcpv4::Socket::new(); |
| 165 | inner.apply_dhcp_config(&mut dhcp_socket, config); | ||
| 166 | let handle = socket.sockets.add(dhcp_socket); | ||
| 153 | inner.dhcp_socket = Some(handle); | 167 | inner.dhcp_socket = Some(handle); |
| 154 | } | 168 | } |
| 155 | } | 169 | } |
| @@ -180,7 +194,7 @@ impl<D: Driver + 'static> Stack<D> { | |||
| 180 | self.with(|_s, i| i.config.is_some()) | 194 | self.with(|_s, i| i.config.is_some()) |
| 181 | } | 195 | } |
| 182 | 196 | ||
| 183 | pub fn config(&self) -> Option<Config> { | 197 | pub fn config(&self) -> Option<StaticConfig> { |
| 184 | self.with(|_s, i| i.config.clone()) | 198 | self.with(|_s, i| i.config.clone()) |
| 185 | } | 199 | } |
| 186 | 200 | ||
| @@ -195,7 +209,7 @@ impl<D: Driver + 'static> Stack<D> { | |||
| 195 | } | 209 | } |
| 196 | 210 | ||
| 197 | impl SocketStack { | 211 | impl SocketStack { |
| 198 | #[allow(clippy::absurd_extreme_comparisons)] | 212 | #[allow(clippy::absurd_extreme_comparisons, dead_code)] |
| 199 | pub fn get_local_port(&mut self) -> u16 { | 213 | pub fn get_local_port(&mut self) -> u16 { |
| 200 | let res = self.next_local_port; | 214 | let res = self.next_local_port; |
| 201 | self.next_local_port = if res >= LOCAL_PORT_MAX { LOCAL_PORT_MIN } else { res + 1 }; | 215 | self.next_local_port = if res >= LOCAL_PORT_MAX { LOCAL_PORT_MIN } else { res + 1 }; |
| @@ -204,14 +218,20 @@ impl SocketStack { | |||
| 204 | } | 218 | } |
| 205 | 219 | ||
| 206 | impl<D: Driver + 'static> Inner<D> { | 220 | impl<D: Driver + 'static> Inner<D> { |
| 207 | fn apply_config(&mut self, s: &mut SocketStack, config: Config) { | 221 | fn apply_config(&mut self, s: &mut SocketStack, config: StaticConfig) { |
| 208 | #[cfg(feature = "medium-ethernet")] | 222 | #[cfg(feature = "medium-ethernet")] |
| 209 | let medium = self.device.capabilities().medium; | 223 | let medium = self.device.capabilities().medium; |
| 210 | 224 | ||
| 211 | debug!("Acquired IP configuration:"); | 225 | debug!("Acquired IP configuration:"); |
| 212 | 226 | ||
| 213 | debug!(" IP address: {}", config.address); | 227 | debug!(" IP address: {}", config.address); |
| 214 | self.set_ipv4_addr(s, config.address); | 228 | s.iface.update_ip_addrs(|addrs| { |
| 229 | if addrs.is_empty() { | ||
| 230 | addrs.push(IpCidr::Ipv4(config.address)).unwrap(); | ||
| 231 | } else { | ||
| 232 | addrs[0] = IpCidr::Ipv4(config.address); | ||
| 233 | } | ||
| 234 | }); | ||
| 215 | 235 | ||
| 216 | #[cfg(feature = "medium-ethernet")] | 236 | #[cfg(feature = "medium-ethernet")] |
| 217 | if medium == Medium::Ethernet { | 237 | if medium == Medium::Ethernet { |
| @@ -230,13 +250,20 @@ impl<D: Driver + 'static> Inner<D> { | |||
| 230 | self.config = Some(config) | 250 | self.config = Some(config) |
| 231 | } | 251 | } |
| 232 | 252 | ||
| 253 | fn apply_dhcp_config(&self, socket: &mut smoltcp::socket::dhcpv4::Socket, config: DhcpConfig) { | ||
| 254 | socket.set_ignore_naks(config.ignore_naks); | ||
| 255 | socket.set_max_lease_duration(config.max_lease_duration); | ||
| 256 | socket.set_ports(config.server_port, config.client_port); | ||
| 257 | socket.set_retry_config(config.retry_config); | ||
| 258 | } | ||
| 259 | |||
| 233 | #[allow(unused)] // used only with dhcp | 260 | #[allow(unused)] // used only with dhcp |
| 234 | fn unapply_config(&mut self, s: &mut SocketStack) { | 261 | fn unapply_config(&mut self, s: &mut SocketStack) { |
| 235 | #[cfg(feature = "medium-ethernet")] | 262 | #[cfg(feature = "medium-ethernet")] |
| 236 | let medium = self.device.capabilities().medium; | 263 | let medium = self.device.capabilities().medium; |
| 237 | 264 | ||
| 238 | debug!("Lost IP configuration"); | 265 | debug!("Lost IP configuration"); |
| 239 | self.set_ipv4_addr(s, Ipv4Cidr::new(Ipv4Address::UNSPECIFIED, 0)); | 266 | s.iface.update_ip_addrs(|ip_addrs| ip_addrs.clear()); |
| 240 | #[cfg(feature = "medium-ethernet")] | 267 | #[cfg(feature = "medium-ethernet")] |
| 241 | if medium == Medium::Ethernet { | 268 | if medium == Medium::Ethernet { |
| 242 | s.iface.routes_mut().remove_default_ipv4_route(); | 269 | s.iface.routes_mut().remove_default_ipv4_route(); |
| @@ -244,13 +271,6 @@ impl<D: Driver + 'static> Inner<D> { | |||
| 244 | self.config = None | 271 | self.config = None |
| 245 | } | 272 | } |
| 246 | 273 | ||
| 247 | fn set_ipv4_addr(&mut self, s: &mut SocketStack, cidr: Ipv4Cidr) { | ||
| 248 | s.iface.update_ip_addrs(|addrs| { | ||
| 249 | let dest = addrs.iter_mut().next().unwrap(); | ||
| 250 | *dest = IpCidr::Ipv4(cidr); | ||
| 251 | }); | ||
| 252 | } | ||
| 253 | |||
| 254 | fn poll(&mut self, cx: &mut Context<'_>, s: &mut SocketStack) { | 274 | fn poll(&mut self, cx: &mut Context<'_>, s: &mut SocketStack) { |
| 255 | s.waker.register(cx.waker()); | 275 | s.waker.register(cx.waker()); |
| 256 | 276 | ||
| @@ -266,11 +286,7 @@ impl<D: Driver + 'static> Inner<D> { | |||
| 266 | cx: Some(cx), | 286 | cx: Some(cx), |
| 267 | inner: &mut self.device, | 287 | inner: &mut self.device, |
| 268 | }; | 288 | }; |
| 269 | if s.iface.poll(timestamp, &mut smoldev, &mut s.sockets).is_err() { | 289 | s.iface.poll(timestamp, &mut smoldev, &mut s.sockets); |
| 270 | // If poll() returns error, it may not be done yet, so poll again later. | ||
| 271 | cx.waker().wake_by_ref(); | ||
| 272 | return; | ||
| 273 | } | ||
| 274 | 290 | ||
| 275 | // Update link up | 291 | // Update link up |
| 276 | let old_link_up = self.link_up; | 292 | let old_link_up = self.link_up; |
| @@ -290,7 +306,7 @@ impl<D: Driver + 'static> Inner<D> { | |||
| 290 | None => {} | 306 | None => {} |
| 291 | Some(dhcpv4::Event::Deconfigured) => self.unapply_config(s), | 307 | Some(dhcpv4::Event::Deconfigured) => self.unapply_config(s), |
| 292 | Some(dhcpv4::Event::Configured(config)) => { | 308 | Some(dhcpv4::Event::Configured(config)) => { |
| 293 | let config = Config { | 309 | let config = StaticConfig { |
| 294 | address: config.address, | 310 | address: config.address, |
| 295 | gateway: config.router, | 311 | gateway: config.router, |
| 296 | dns_servers: config.dns_servers, | 312 | dns_servers: config.dns_servers, |
diff --git a/examples/nrf52840/src/bin/usb_ethernet.rs b/examples/nrf52840/src/bin/usb_ethernet.rs index e5f704524..a8d53e460 100644 --- a/examples/nrf52840/src/bin/usb_ethernet.rs +++ b/examples/nrf52840/src/bin/usb_ethernet.rs | |||
| @@ -101,8 +101,8 @@ async fn main(spawner: Spawner) { | |||
| 101 | let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(singleton!(NetState::new()), our_mac_addr); | 101 | let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(singleton!(NetState::new()), our_mac_addr); |
| 102 | unwrap!(spawner.spawn(usb_ncm_task(runner))); | 102 | unwrap!(spawner.spawn(usb_ncm_task(runner))); |
| 103 | 103 | ||
| 104 | let config = embassy_net::ConfigStrategy::Dhcp; | 104 | let config = embassy_net::Config::Dhcp(Default::default()); |
| 105 | //let config = embassy_net::ConfigStrategy::Static(embassy_net::Config { | 105 | //let config = embassy_net::Config::Static(embassy_net::StaticConfig { |
| 106 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), | 106 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), |
| 107 | // dns_servers: Vec::new(), | 107 | // dns_servers: Vec::new(), |
| 108 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), | 108 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), |
| @@ -115,12 +115,7 @@ async fn main(spawner: Spawner) { | |||
| 115 | let seed = u64::from_le_bytes(seed); | 115 | let seed = u64::from_le_bytes(seed); |
| 116 | 116 | ||
| 117 | // Init network stack | 117 | // Init network stack |
| 118 | let stack = &*singleton!(Stack::new( | 118 | let stack = &*singleton!(Stack::new(device, config, singleton!(StackResources::<2>::new()), seed)); |
| 119 | device, | ||
| 120 | config, | ||
| 121 | singleton!(StackResources::<1, 2, 8>::new()), | ||
| 122 | seed | ||
| 123 | )); | ||
| 124 | 119 | ||
| 125 | unwrap!(spawner.spawn(net_task(stack))); | 120 | unwrap!(spawner.spawn(net_task(stack))); |
| 126 | 121 | ||
diff --git a/examples/rp/src/bin/usb_ethernet.rs b/examples/rp/src/bin/usb_ethernet.rs index d0aec874a..104b25d39 100644 --- a/examples/rp/src/bin/usb_ethernet.rs +++ b/examples/rp/src/bin/usb_ethernet.rs | |||
| @@ -92,8 +92,8 @@ async fn main(spawner: Spawner) { | |||
| 92 | let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(singleton!(NetState::new()), our_mac_addr); | 92 | let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(singleton!(NetState::new()), our_mac_addr); |
| 93 | unwrap!(spawner.spawn(usb_ncm_task(runner))); | 93 | unwrap!(spawner.spawn(usb_ncm_task(runner))); |
| 94 | 94 | ||
| 95 | let config = embassy_net::ConfigStrategy::Dhcp; | 95 | let config = embassy_net::Config::Dhcp(Default::default()); |
| 96 | //let config = embassy_net::ConfigStrategy::Static(embassy_net::Config { | 96 | //let config = embassy_net::Config::Static(embassy_net::StaticConfig { |
| 97 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), | 97 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), |
| 98 | // dns_servers: Vec::new(), | 98 | // dns_servers: Vec::new(), |
| 99 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), | 99 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), |
| @@ -103,12 +103,7 @@ async fn main(spawner: Spawner) { | |||
| 103 | let seed = 1234; // guaranteed random, chosen by a fair dice roll | 103 | let seed = 1234; // guaranteed random, chosen by a fair dice roll |
| 104 | 104 | ||
| 105 | // Init network stack | 105 | // Init network stack |
| 106 | let stack = &*singleton!(Stack::new( | 106 | let stack = &*singleton!(Stack::new(device, config, singleton!(StackResources::<2>::new()), seed)); |
| 107 | device, | ||
| 108 | config, | ||
| 109 | singleton!(StackResources::<1, 2, 8>::new()), | ||
| 110 | seed | ||
| 111 | )); | ||
| 112 | 107 | ||
| 113 | unwrap!(spawner.spawn(net_task(stack))); | 108 | unwrap!(spawner.spawn(net_task(stack))); |
| 114 | 109 | ||
diff --git a/examples/std/Cargo.toml b/examples/std/Cargo.toml index 45b2a4a4f..af1481e08 100644 --- a/examples/std/Cargo.toml +++ b/examples/std/Cargo.toml | |||
| @@ -17,7 +17,7 @@ async-io = "1.6.0" | |||
| 17 | env_logger = "0.9.0" | 17 | env_logger = "0.9.0" |
| 18 | futures = { version = "0.3.17" } | 18 | futures = { version = "0.3.17" } |
| 19 | log = "0.4.14" | 19 | log = "0.4.14" |
| 20 | nix = "0.22.1" | 20 | nix = "0.26.2" |
| 21 | libc = "0.2.101" | 21 | libc = "0.2.101" |
| 22 | clap = { version = "3.0.0-beta.5", features = ["derive"] } | 22 | clap = { version = "3.0.0-beta.5", features = ["derive"] } |
| 23 | rand_core = { version = "0.6.3", features = ["std"] } | 23 | rand_core = { version = "0.6.3", features = ["std"] } |
diff --git a/examples/std/src/bin/net.rs b/examples/std/src/bin/net.rs index 9b1450b72..451850d99 100644 --- a/examples/std/src/bin/net.rs +++ b/examples/std/src/bin/net.rs | |||
| @@ -1,9 +1,11 @@ | |||
| 1 | #![feature(type_alias_impl_trait)] | 1 | #![feature(type_alias_impl_trait)] |
| 2 | 2 | ||
| 3 | use std::default::Default; | ||
| 4 | |||
| 3 | use clap::Parser; | 5 | use clap::Parser; |
| 4 | use embassy_executor::{Executor, Spawner}; | 6 | use embassy_executor::{Executor, Spawner}; |
| 5 | use embassy_net::tcp::TcpSocket; | 7 | use embassy_net::tcp::TcpSocket; |
| 6 | use embassy_net::{ConfigStrategy, Ipv4Address, Ipv4Cidr, Stack, StackResources}; | 8 | use embassy_net::{Config, Ipv4Address, Ipv4Cidr, Stack, StackResources}; |
| 7 | use embedded_io::asynch::Write; | 9 | use embedded_io::asynch::Write; |
| 8 | use heapless::Vec; | 10 | use heapless::Vec; |
| 9 | use log::*; | 11 | use log::*; |
| @@ -48,13 +50,13 @@ async fn main_task(spawner: Spawner) { | |||
| 48 | 50 | ||
| 49 | // Choose between dhcp or static ip | 51 | // Choose between dhcp or static ip |
| 50 | let config = if opts.static_ip { | 52 | let config = if opts.static_ip { |
| 51 | ConfigStrategy::Static(embassy_net::Config { | 53 | Config::Static(embassy_net::StaticConfig { |
| 52 | address: Ipv4Cidr::new(Ipv4Address::new(192, 168, 69, 2), 24), | 54 | address: Ipv4Cidr::new(Ipv4Address::new(192, 168, 69, 2), 24), |
| 53 | dns_servers: Vec::new(), | 55 | dns_servers: Vec::new(), |
| 54 | gateway: Some(Ipv4Address::new(192, 168, 69, 1)), | 56 | gateway: Some(Ipv4Address::new(192, 168, 69, 1)), |
| 55 | }) | 57 | }) |
| 56 | } else { | 58 | } else { |
| 57 | ConfigStrategy::Dhcp | 59 | Config::Dhcp(Default::default()) |
| 58 | }; | 60 | }; |
| 59 | 61 | ||
| 60 | // Generate random seed | 62 | // Generate random seed |
| @@ -63,12 +65,7 @@ async fn main_task(spawner: Spawner) { | |||
| 63 | let seed = u64::from_le_bytes(seed); | 65 | let seed = u64::from_le_bytes(seed); |
| 64 | 66 | ||
| 65 | // Init network stack | 67 | // Init network stack |
| 66 | let stack = &*singleton!(Stack::new( | 68 | let stack = &*singleton!(Stack::new(device, config, singleton!(StackResources::<2>::new()), seed)); |
| 67 | device, | ||
| 68 | config, | ||
| 69 | singleton!(StackResources::<1, 2, 8>::new()), | ||
| 70 | seed | ||
| 71 | )); | ||
| 72 | 69 | ||
| 73 | // Launch network task | 70 | // Launch network task |
| 74 | spawner.spawn(net_task(stack)).unwrap(); | 71 | spawner.spawn(net_task(stack)).unwrap(); |
diff --git a/examples/std/src/bin/net_udp.rs b/examples/std/src/bin/net_udp.rs index 392a97f0d..f1923f180 100644 --- a/examples/std/src/bin/net_udp.rs +++ b/examples/std/src/bin/net_udp.rs | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | use clap::Parser; | 3 | use clap::Parser; |
| 4 | use embassy_executor::{Executor, Spawner}; | 4 | use embassy_executor::{Executor, Spawner}; |
| 5 | use embassy_net::udp::UdpSocket; | 5 | use embassy_net::udp::UdpSocket; |
| 6 | use embassy_net::{ConfigStrategy, Ipv4Address, Ipv4Cidr, PacketMetadata, Stack, StackResources}; | 6 | use embassy_net::{Config, Ipv4Address, Ipv4Cidr, PacketMetadata, Stack, StackResources}; |
| 7 | use heapless::Vec; | 7 | use heapless::Vec; |
| 8 | use log::*; | 8 | use log::*; |
| 9 | use rand_core::{OsRng, RngCore}; | 9 | use rand_core::{OsRng, RngCore}; |
| @@ -47,13 +47,13 @@ async fn main_task(spawner: Spawner) { | |||
| 47 | 47 | ||
| 48 | // Choose between dhcp or static ip | 48 | // Choose between dhcp or static ip |
| 49 | let config = if opts.static_ip { | 49 | let config = if opts.static_ip { |
| 50 | ConfigStrategy::Static(embassy_net::Config { | 50 | Config::Static(embassy_net::StaticConfig { |
| 51 | address: Ipv4Cidr::new(Ipv4Address::new(192, 168, 69, 2), 24), | 51 | address: Ipv4Cidr::new(Ipv4Address::new(192, 168, 69, 2), 24), |
| 52 | dns_servers: Vec::new(), | 52 | dns_servers: Vec::new(), |
| 53 | gateway: Some(Ipv4Address::new(192, 168, 69, 1)), | 53 | gateway: Some(Ipv4Address::new(192, 168, 69, 1)), |
| 54 | }) | 54 | }) |
| 55 | } else { | 55 | } else { |
| 56 | ConfigStrategy::Dhcp | 56 | Config::Dhcp(Default::default()) |
| 57 | }; | 57 | }; |
| 58 | 58 | ||
| 59 | // Generate random seed | 59 | // Generate random seed |
| @@ -62,12 +62,7 @@ async fn main_task(spawner: Spawner) { | |||
| 62 | let seed = u64::from_le_bytes(seed); | 62 | let seed = u64::from_le_bytes(seed); |
| 63 | 63 | ||
| 64 | // Init network stack | 64 | // Init network stack |
| 65 | let stack = &*singleton!(Stack::new( | 65 | let stack = &*singleton!(Stack::new(device, config, singleton!(StackResources::<2>::new()), seed)); |
| 66 | device, | ||
| 67 | config, | ||
| 68 | singleton!(StackResources::<1, 2, 8>::new()), | ||
| 69 | seed | ||
| 70 | )); | ||
| 71 | 66 | ||
| 72 | // Launch network task | 67 | // Launch network task |
| 73 | spawner.spawn(net_task(stack)).unwrap(); | 68 | spawner.spawn(net_task(stack)).unwrap(); |
diff --git a/examples/stm32f7/src/bin/eth.rs b/examples/stm32f7/src/bin/eth.rs index 224cc202b..571a6c1b9 100644 --- a/examples/stm32f7/src/bin/eth.rs +++ b/examples/stm32f7/src/bin/eth.rs | |||
| @@ -69,20 +69,15 @@ async fn main(spawner: Spawner) -> ! { | |||
| 69 | 0, | 69 | 0, |
| 70 | ); | 70 | ); |
| 71 | 71 | ||
| 72 | let config = embassy_net::ConfigStrategy::Dhcp; | 72 | let config = embassy_net::Config::Dhcp(Default::default()); |
| 73 | //let config = embassy_net::ConfigStrategy::Static(embassy_net::Config { | 73 | //let config = embassy_net::Config::Static(embassy_net::StaticConfig { |
| 74 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), | 74 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), |
| 75 | // dns_servers: Vec::new(), | 75 | // dns_servers: Vec::new(), |
| 76 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), | 76 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), |
| 77 | //}); | 77 | //}); |
| 78 | 78 | ||
| 79 | // Init network stack | 79 | // Init network stack |
| 80 | let stack = &*singleton!(Stack::new( | 80 | let stack = &*singleton!(Stack::new(device, config, singleton!(StackResources::<2>::new()), seed)); |
| 81 | device, | ||
| 82 | config, | ||
| 83 | singleton!(StackResources::<1, 2, 8>::new()), | ||
| 84 | seed | ||
| 85 | )); | ||
| 86 | 81 | ||
| 87 | // Launch network task | 82 | // Launch network task |
| 88 | unwrap!(spawner.spawn(net_task(&stack))); | 83 | unwrap!(spawner.spawn(net_task(&stack))); |
diff --git a/examples/stm32h7/src/bin/eth.rs b/examples/stm32h7/src/bin/eth.rs index 551325ca4..cb245c325 100644 --- a/examples/stm32h7/src/bin/eth.rs +++ b/examples/stm32h7/src/bin/eth.rs | |||
| @@ -70,20 +70,15 @@ async fn main(spawner: Spawner) -> ! { | |||
| 70 | 0, | 70 | 0, |
| 71 | ); | 71 | ); |
| 72 | 72 | ||
| 73 | let config = embassy_net::ConfigStrategy::Dhcp; | 73 | let config = embassy_net::Config::Dhcp(Default::default()); |
| 74 | //let config = embassy_net::ConfigStrategy::Static(embassy_net::Config { | 74 | //let config = embassy_net::Config::Static(embassy_net::StaticConfig { |
| 75 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), | 75 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), |
| 76 | // dns_servers: Vec::new(), | 76 | // dns_servers: Vec::new(), |
| 77 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), | 77 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), |
| 78 | //}); | 78 | //}); |
| 79 | 79 | ||
| 80 | // Init network stack | 80 | // Init network stack |
| 81 | let stack = &*singleton!(Stack::new( | 81 | let stack = &*singleton!(Stack::new(device, config, singleton!(StackResources::<2>::new()), seed)); |
| 82 | device, | ||
| 83 | config, | ||
| 84 | singleton!(StackResources::<1, 2, 8>::new()), | ||
| 85 | seed | ||
| 86 | )); | ||
| 87 | 82 | ||
| 88 | // Launch network task | 83 | // Launch network task |
| 89 | unwrap!(spawner.spawn(net_task(&stack))); | 84 | unwrap!(spawner.spawn(net_task(&stack))); |
diff --git a/examples/stm32h7/src/bin/eth_client.rs b/examples/stm32h7/src/bin/eth_client.rs index 61a08ae10..cce85a083 100644 --- a/examples/stm32h7/src/bin/eth_client.rs +++ b/examples/stm32h7/src/bin/eth_client.rs | |||
| @@ -71,20 +71,15 @@ async fn main(spawner: Spawner) -> ! { | |||
| 71 | 0, | 71 | 0, |
| 72 | ); | 72 | ); |
| 73 | 73 | ||
| 74 | let config = embassy_net::ConfigStrategy::Dhcp; | 74 | let config = embassy_net::Config::Dhcp(Default::default()); |
| 75 | //let config = embassy_net::ConfigStrategy::Static(embassy_net::Config { | 75 | //let config = embassy_net::Config::StaticConfig(embassy_net::Config { |
| 76 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), | 76 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), |
| 77 | // dns_servers: Vec::new(), | 77 | // dns_servers: Vec::new(), |
| 78 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), | 78 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), |
| 79 | //}); | 79 | //}); |
| 80 | 80 | ||
| 81 | // Init network stack | 81 | // Init network stack |
| 82 | let stack = &*singleton!(Stack::new( | 82 | let stack = &*singleton!(Stack::new(device, config, singleton!(StackResources::<2>::new()), seed)); |
| 83 | device, | ||
| 84 | config, | ||
| 85 | singleton!(StackResources::<1, 2, 8>::new()), | ||
| 86 | seed | ||
| 87 | )); | ||
| 88 | 83 | ||
| 89 | // Launch network task | 84 | // Launch network task |
| 90 | unwrap!(spawner.spawn(net_task(&stack))); | 85 | unwrap!(spawner.spawn(net_task(&stack))); |
diff --git a/examples/stm32l5/src/bin/usb_ethernet.rs b/examples/stm32l5/src/bin/usb_ethernet.rs index b49329ea4..e5a46b064 100644 --- a/examples/stm32l5/src/bin/usb_ethernet.rs +++ b/examples/stm32l5/src/bin/usb_ethernet.rs | |||
| @@ -98,8 +98,8 @@ async fn main(spawner: Spawner) { | |||
| 98 | let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(singleton!(NetState::new()), our_mac_addr); | 98 | let (runner, device) = class.into_embassy_net_device::<MTU, 4, 4>(singleton!(NetState::new()), our_mac_addr); |
| 99 | unwrap!(spawner.spawn(usb_ncm_task(runner))); | 99 | unwrap!(spawner.spawn(usb_ncm_task(runner))); |
| 100 | 100 | ||
| 101 | let config = embassy_net::ConfigStrategy::Dhcp; | 101 | let config = embassy_net::Config::Dhcp(Default::default()); |
| 102 | //let config = embassy_net::ConfigStrategy::Static(embassy_net::Config { | 102 | //let config = embassy_net::Config::Static(embassy_net::StaticConfig { |
| 103 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), | 103 | // address: Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), |
| 104 | // dns_servers: Vec::new(), | 104 | // dns_servers: Vec::new(), |
| 105 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), | 105 | // gateway: Some(Ipv4Address::new(10, 42, 0, 1)), |
| @@ -110,12 +110,7 @@ async fn main(spawner: Spawner) { | |||
| 110 | let seed = rng.next_u64(); | 110 | let seed = rng.next_u64(); |
| 111 | 111 | ||
| 112 | // Init network stack | 112 | // Init network stack |
| 113 | let stack = &*singleton!(Stack::new( | 113 | let stack = &*singleton!(Stack::new(device, config, singleton!(StackResources::<2>::new()), seed)); |
| 114 | device, | ||
| 115 | config, | ||
| 116 | singleton!(StackResources::<1, 2, 8>::new()), | ||
| 117 | seed | ||
| 118 | )); | ||
| 119 | 114 | ||
| 120 | unwrap!(spawner.spawn(net_task(stack))); | 115 | unwrap!(spawner.spawn(net_task(stack))); |
| 121 | 116 | ||
