aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2023-01-19 13:57:21 +0000
committerGitHub <[email protected]>2023-01-19 13:57:21 +0000
commit539a8107e2f09338294727f47827dec42104505f (patch)
tree8549000f6edc66d860de44b7400d62a27c674d4f
parent65ab714fae6315a032e7440f44429ced36d2506e (diff)
parent78c2c1709b8c111468fd7dd2ec1f3792d2fcea67 (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.toml2
-rw-r--r--embassy-net/src/device.rs13
-rw-r--r--embassy-net/src/lib.rs130
-rw-r--r--examples/nrf52840/src/bin/usb_ethernet.rs11
-rw-r--r--examples/rp/src/bin/usb_ethernet.rs11
-rw-r--r--examples/std/Cargo.toml2
-rw-r--r--examples/std/src/bin/net.rs15
-rw-r--r--examples/std/src/bin/net_udp.rs13
-rw-r--r--examples/stm32f7/src/bin/eth.rs11
-rw-r--r--examples/stm32h7/src/bin/eth.rs11
-rw-r--r--examples/stm32h7/src/bin/eth_client.rs11
-rw-r--r--examples/stm32l5/src/bin/usb_ethernet.rs11
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]
52version = "0.8.0" 52version = "0.8.0"
53git = "https://github.com/smoltcp-rs/smoltcp" 53git = "https://github.com/smoltcp-rs/smoltcp"
54rev = "b7a7c4b1c56e8d4c2524c1e3a056c745a13cc09f" 54rev = "5740b765749b95c18aace5de8dc21cab75ba33d4"
55default-features = false 55default-features = false
56features = [ 56features = [
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
3use embassy_net_driver::{Capabilities, Checksum, Driver, Medium, RxToken, TxToken}; 3use embassy_net_driver::{Capabilities, Checksum, Driver, Medium, RxToken, TxToken};
4use smoltcp::phy; 4use smoltcp::phy;
5use smoltcp::time::Instant;
5 6
6pub(crate) struct DriverAdapter<'d, 'c, T> 7pub(crate) struct DriverAdapter<'d, 'c, T>
7where 8where
@@ -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>
76where 77where
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>
92where 93where
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;
25use heapless::Vec; 25use heapless::Vec;
26#[cfg(feature = "dhcpv4")] 26#[cfg(feature = "dhcpv4")]
27use smoltcp::iface::SocketHandle; 27use smoltcp::iface::SocketHandle;
28use smoltcp::iface::{Interface, InterfaceBuilder, SocketSet, SocketStorage}; 28use smoltcp::iface::{Interface, SocketSet, SocketStorage};
29#[cfg(feature = "medium-ethernet")]
30use smoltcp::iface::{Neighbor, NeighborCache, Route, Routes};
31#[cfg(feature = "dhcpv4")] 29#[cfg(feature = "dhcpv4")]
32use smoltcp::socket::dhcpv4; 30use smoltcp::socket::dhcpv4;
31use smoltcp::socket::dhcpv4::RetryConfig;
32use smoltcp::time::Duration;
33// smoltcp reexports 33// smoltcp reexports
34pub use smoltcp::time::{Duration as SmolDuration, Instant as SmolInstant}; 34pub 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;
45const LOCAL_PORT_MIN: u16 = 1025; 45const LOCAL_PORT_MIN: u16 = 1025;
46const LOCAL_PORT_MAX: u16 = 65535; 46const LOCAL_PORT_MAX: u16 = 65535;
47 47
48pub struct StackResources<const ADDR: usize, const SOCK: usize, const NEIGHBOR: usize> { 48pub 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
58impl<const ADDR: usize, const SOCK: usize, const NEIGHBOR: usize> StackResources<ADDR, SOCK, NEIGHBOR> { 52impl<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)]
72pub struct Config { 61pub 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
78pub enum ConfigStrategy { 67#[derive(Debug, Clone, PartialEq, Eq)]
79 Static(Config), 68pub 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
79impl 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
91pub enum Config {
92 Static(StaticConfig),
80 #[cfg(feature = "dhcpv4")] 93 #[cfg(feature = "dhcpv4")]
81 Dhcp, 94 Dhcp(DhcpConfig),
82} 95}
83 96
84pub struct Stack<D: Driver> { 97pub struct Stack<D: Driver> {
@@ -89,43 +102,42 @@ pub struct Stack<D: Driver> {
89struct Inner<D: Driver> { 102struct 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
97pub(crate) struct SocketStack { 110pub(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
104impl<D: Driver + 'static> Stack<D> { 117impl<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
197impl SocketStack { 211impl 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
206impl<D: Driver + 'static> Inner<D> { 220impl<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"
17env_logger = "0.9.0" 17env_logger = "0.9.0"
18futures = { version = "0.3.17" } 18futures = { version = "0.3.17" }
19log = "0.4.14" 19log = "0.4.14"
20nix = "0.22.1" 20nix = "0.26.2"
21libc = "0.2.101" 21libc = "0.2.101"
22clap = { version = "3.0.0-beta.5", features = ["derive"] } 22clap = { version = "3.0.0-beta.5", features = ["derive"] }
23rand_core = { version = "0.6.3", features = ["std"] } 23rand_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
3use std::default::Default;
4
3use clap::Parser; 5use clap::Parser;
4use embassy_executor::{Executor, Spawner}; 6use embassy_executor::{Executor, Spawner};
5use embassy_net::tcp::TcpSocket; 7use embassy_net::tcp::TcpSocket;
6use embassy_net::{ConfigStrategy, Ipv4Address, Ipv4Cidr, Stack, StackResources}; 8use embassy_net::{Config, Ipv4Address, Ipv4Cidr, Stack, StackResources};
7use embedded_io::asynch::Write; 9use embedded_io::asynch::Write;
8use heapless::Vec; 10use heapless::Vec;
9use log::*; 11use 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 @@
3use clap::Parser; 3use clap::Parser;
4use embassy_executor::{Executor, Spawner}; 4use embassy_executor::{Executor, Spawner};
5use embassy_net::udp::UdpSocket; 5use embassy_net::udp::UdpSocket;
6use embassy_net::{ConfigStrategy, Ipv4Address, Ipv4Cidr, PacketMetadata, Stack, StackResources}; 6use embassy_net::{Config, Ipv4Address, Ipv4Cidr, PacketMetadata, Stack, StackResources};
7use heapless::Vec; 7use heapless::Vec;
8use log::*; 8use log::*;
9use rand_core::{OsRng, RngCore}; 9use 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