aboutsummaryrefslogtreecommitdiff
path: root/examples/std/src/bin/net_ppp.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/std/src/bin/net_ppp.rs')
-rw-r--r--examples/std/src/bin/net_ppp.rs85
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;
16use clap::Parser; 16use clap::Parser;
17use embassy_executor::{Executor, Spawner}; 17use embassy_executor::{Executor, Spawner};
18use embassy_net::tcp::TcpSocket; 18use embassy_net::tcp::TcpSocket;
19use embassy_net::{Config, ConfigV4, Ipv4Address, Ipv4Cidr, Stack, StackResources}; 19use embassy_net::{Config, ConfigV4, Ipv4Cidr, Stack, StackResources};
20use embassy_net_ppp::Runner; 20use embassy_net_ppp::Runner;
21use embedded_io_async::Write; 21use embedded_io_async::Write;
22use futures::io::BufReader; 22use futures::io::BufReader;
23use heapless::Vec; 23use heapless::Vec;
24use log::*; 24use log::*;
25use nix::sys::termios; 25use nix::sys::termios;
26use rand_core::{OsRng, RngCore}; 26use rand_core::{OsRng, TryRngCore};
27use static_cell::StaticCell; 27use static_cell::StaticCell;
28 28
29use crate::serial_port::SerialPort; 29use crate::serial_port::SerialPort;
@@ -37,19 +37,15 @@ struct Opts {
37} 37}
38 38
39#[embassy_executor::task] 39#[embassy_executor::task]
40async fn net_task(stack: &'static Stack<embassy_net_ppp::Device<'static>>) -> ! { 40async 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]
45async fn ppp_task( 45async 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
172mod 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}