diff options
Diffstat (limited to 'examples/std/src/bin/net_ppp.rs')
| -rw-r--r-- | examples/std/src/bin/net_ppp.rs | 85 |
1 files changed, 15 insertions, 70 deletions
diff --git a/examples/std/src/bin/net_ppp.rs b/examples/std/src/bin/net_ppp.rs index 9ec0ea91f..82272c798 100644 --- a/examples/std/src/bin/net_ppp.rs +++ b/examples/std/src/bin/net_ppp.rs | |||
| @@ -16,14 +16,14 @@ use async_io::Async; | |||
| 16 | use clap::Parser; | 16 | use clap::Parser; |
| 17 | use embassy_executor::{Executor, Spawner}; | 17 | use embassy_executor::{Executor, Spawner}; |
| 18 | use embassy_net::tcp::TcpSocket; | 18 | use embassy_net::tcp::TcpSocket; |
| 19 | use embassy_net::{Config, ConfigV4, Ipv4Address, Ipv4Cidr, Stack, StackResources}; | 19 | use embassy_net::{Config, ConfigV4, Ipv4Cidr, Stack, StackResources}; |
| 20 | use embassy_net_ppp::Runner; | 20 | use embassy_net_ppp::Runner; |
| 21 | use embedded_io_async::Write; | 21 | use embedded_io_async::Write; |
| 22 | use futures::io::BufReader; | 22 | use futures::io::BufReader; |
| 23 | use heapless::Vec; | 23 | use heapless::Vec; |
| 24 | use log::*; | 24 | use log::*; |
| 25 | use nix::sys::termios; | 25 | use nix::sys::termios; |
| 26 | use rand_core::{OsRng, RngCore}; | 26 | use rand_core::{OsRng, TryRngCore}; |
| 27 | use static_cell::StaticCell; | 27 | use static_cell::StaticCell; |
| 28 | 28 | ||
| 29 | use crate::serial_port::SerialPort; | 29 | use crate::serial_port::SerialPort; |
| @@ -37,19 +37,15 @@ struct Opts { | |||
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | #[embassy_executor::task] | 39 | #[embassy_executor::task] |
| 40 | async fn net_task(stack: &'static Stack<embassy_net_ppp::Device<'static>>) -> ! { | 40 | async fn net_task(mut runner: embassy_net::Runner<'static, embassy_net_ppp::Device<'static>>) -> ! { |
| 41 | stack.run().await | 41 | runner.run().await |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | #[embassy_executor::task] | 44 | #[embassy_executor::task] |
| 45 | async fn ppp_task( | 45 | async fn ppp_task(stack: Stack<'static>, mut runner: Runner<'static>, port: SerialPort) -> ! { |
| 46 | stack: &'static Stack<embassy_net_ppp::Device<'static>>, | ||
| 47 | mut runner: Runner<'static>, | ||
| 48 | port: SerialPort, | ||
| 49 | ) -> ! { | ||
| 50 | let port = Async::new(port).unwrap(); | 46 | let port = Async::new(port).unwrap(); |
| 51 | let port = BufReader::new(port); | 47 | let port = BufReader::new(port); |
| 52 | let port = adapter::FromFutures::new(port); | 48 | let port = embedded_io_adapters::futures_03::FromFutures::new(port); |
| 53 | 49 | ||
| 54 | let config = embassy_net_ppp::Config { | 50 | let config = embassy_net_ppp::Config { |
| 55 | username: b"myuser", | 51 | username: b"myuser", |
| @@ -64,10 +60,10 @@ async fn ppp_task( | |||
| 64 | }; | 60 | }; |
| 65 | let mut dns_servers = Vec::new(); | 61 | let mut dns_servers = Vec::new(); |
| 66 | for s in ipv4.dns_servers.iter().flatten() { | 62 | for s in ipv4.dns_servers.iter().flatten() { |
| 67 | let _ = dns_servers.push(Ipv4Address::from_bytes(&s.0)); | 63 | let _ = dns_servers.push(*s); |
| 68 | } | 64 | } |
| 69 | let config = ConfigV4::Static(embassy_net::StaticConfigV4 { | 65 | let config = ConfigV4::Static(embassy_net::StaticConfigV4 { |
| 70 | address: Ipv4Cidr::new(Ipv4Address::from_bytes(&addr.0), 0), | 66 | address: Ipv4Cidr::new(addr, 0), |
| 71 | gateway: None, | 67 | gateway: None, |
| 72 | dns_servers, | 68 | dns_servers, |
| 73 | }); | 69 | }); |
| @@ -93,22 +89,21 @@ async fn main_task(spawner: Spawner) { | |||
| 93 | 89 | ||
| 94 | // Generate random seed | 90 | // Generate random seed |
| 95 | let mut seed = [0; 8]; | 91 | let mut seed = [0; 8]; |
| 96 | OsRng.fill_bytes(&mut seed); | 92 | OsRng.try_fill_bytes(&mut seed).unwrap(); |
| 97 | let seed = u64::from_le_bytes(seed); | 93 | let seed = u64::from_le_bytes(seed); |
| 98 | 94 | ||
| 99 | // Init network stack | 95 | // Init network stack |
| 100 | static STACK: StaticCell<Stack<embassy_net_ppp::Device<'static>>> = StaticCell::new(); | ||
| 101 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); | 96 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); |
| 102 | let stack = &*STACK.init(Stack::new( | 97 | let (stack, net_runner) = embassy_net::new( |
| 103 | device, | 98 | device, |
| 104 | Config::default(), // don't configure IP yet | 99 | Config::default(), // don't configure IP yet |
| 105 | RESOURCES.init(StackResources::<3>::new()), | 100 | RESOURCES.init(StackResources::new()), |
| 106 | seed, | 101 | seed, |
| 107 | )); | 102 | ); |
| 108 | 103 | ||
| 109 | // Launch network task | 104 | // Launch network task |
| 110 | spawner.spawn(net_task(stack)).unwrap(); | 105 | spawner.spawn(net_task(net_runner).unwrap()); |
| 111 | spawner.spawn(ppp_task(stack, runner, port)).unwrap(); | 106 | spawner.spawn(ppp_task(stack, runner, port).unwrap()); |
| 112 | 107 | ||
| 113 | // Then we can use it! | 108 | // Then we can use it! |
| 114 | let mut rx_buffer = [0; 4096]; | 109 | let mut rx_buffer = [0; 4096]; |
| @@ -165,56 +160,6 @@ fn main() { | |||
| 165 | 160 | ||
| 166 | let executor = EXECUTOR.init(Executor::new()); | 161 | let executor = EXECUTOR.init(Executor::new()); |
| 167 | executor.run(|spawner| { | 162 | executor.run(|spawner| { |
| 168 | spawner.spawn(main_task(spawner)).unwrap(); | 163 | spawner.spawn(main_task(spawner).unwrap()); |
| 169 | }); | 164 | }); |
| 170 | } | 165 | } |
| 171 | |||
| 172 | mod adapter { | ||
| 173 | use core::future::poll_fn; | ||
| 174 | use core::pin::Pin; | ||
| 175 | |||
| 176 | use futures::AsyncBufReadExt; | ||
| 177 | |||
| 178 | /// Adapter from `futures::io` traits. | ||
| 179 | #[derive(Clone)] | ||
| 180 | pub struct FromFutures<T: ?Sized> { | ||
| 181 | inner: T, | ||
| 182 | } | ||
| 183 | |||
| 184 | impl<T> FromFutures<T> { | ||
| 185 | /// Create a new adapter. | ||
| 186 | pub fn new(inner: T) -> Self { | ||
| 187 | Self { inner } | ||
| 188 | } | ||
| 189 | } | ||
| 190 | |||
| 191 | impl<T: ?Sized> embedded_io_async::ErrorType for FromFutures<T> { | ||
| 192 | type Error = std::io::Error; | ||
| 193 | } | ||
| 194 | |||
| 195 | impl<T: futures::io::AsyncRead + Unpin + ?Sized> embedded_io_async::Read for FromFutures<T> { | ||
| 196 | async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> { | ||
| 197 | poll_fn(|cx| Pin::new(&mut self.inner).poll_read(cx, buf)).await | ||
| 198 | } | ||
| 199 | } | ||
| 200 | |||
| 201 | impl<T: futures::io::AsyncBufRead + Unpin + ?Sized> embedded_io_async::BufRead for FromFutures<T> { | ||
| 202 | async fn fill_buf(&mut self) -> Result<&[u8], Self::Error> { | ||
| 203 | self.inner.fill_buf().await | ||
| 204 | } | ||
| 205 | |||
| 206 | fn consume(&mut self, amt: usize) { | ||
| 207 | Pin::new(&mut self.inner).consume(amt) | ||
| 208 | } | ||
| 209 | } | ||
| 210 | |||
| 211 | impl<T: futures::io::AsyncWrite + Unpin + ?Sized> embedded_io_async::Write for FromFutures<T> { | ||
| 212 | async fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> { | ||
| 213 | poll_fn(|cx| Pin::new(&mut self.inner).poll_write(cx, buf)).await | ||
| 214 | } | ||
| 215 | |||
| 216 | async fn flush(&mut self) -> Result<(), Self::Error> { | ||
| 217 | poll_fn(|cx| Pin::new(&mut self.inner).poll_flush(cx)).await | ||
| 218 | } | ||
| 219 | } | ||
| 220 | } | ||
