aboutsummaryrefslogtreecommitdiff
path: root/embassy-net-examples/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-net-examples/src/main.rs')
-rw-r--r--embassy-net-examples/src/main.rs102
1 files changed, 102 insertions, 0 deletions
diff --git a/embassy-net-examples/src/main.rs b/embassy-net-examples/src/main.rs
new file mode 100644
index 000000000..d1c2658dd
--- /dev/null
+++ b/embassy-net-examples/src/main.rs
@@ -0,0 +1,102 @@
1#![feature(type_alias_impl_trait)]
2#![feature(min_type_alias_impl_trait)]
3#![feature(impl_trait_in_bindings)]
4#![allow(incomplete_features)]
5
6use clap::{AppSettings, Clap};
7use embassy::executor::Spawner;
8use embassy::io::AsyncWriteExt;
9use embassy::util::Forever;
10use embassy_net::*;
11use embassy_std::Executor;
12use heapless::Vec;
13use log::*;
14
15mod tuntap;
16
17use crate::tuntap::TunTapDevice;
18
19static DEVICE: Forever<TunTapDevice> = Forever::new();
20static CONFIG: Forever<DhcpConfigurator> = Forever::new();
21
22#[derive(Clap)]
23#[clap(version = "1.0")]
24#[clap(setting = AppSettings::ColoredHelp)]
25struct Opts {
26 /// TAP device name
27 #[clap(long, default_value = "tap0")]
28 tap: String,
29}
30
31#[embassy::task]
32async fn net_task() {
33 embassy_net::run().await
34}
35
36#[embassy::task]
37async fn main_task(spawner: Spawner) {
38 let opts: Opts = Opts::parse();
39
40 // Init network device
41 let device = TunTapDevice::new(&opts.tap).unwrap();
42
43 // Static IP configuration
44 let config = StaticConfigurator::new(Config {
45 address: Ipv4Cidr::new(Ipv4Address::new(192, 168, 69, 2), 24),
46 dns_servers: Vec::new(),
47 gateway: Some(Ipv4Address::new(192, 168, 69, 1)),
48 });
49
50 // DHCP configruation
51 let config = DhcpConfigurator::new();
52
53 // Init network stack
54 embassy_net::init(DEVICE.put(device), CONFIG.put(config));
55
56 // Launch network task
57 spawner.spawn(net_task()).unwrap();
58
59 // Then we can use it!
60 let mut rx_buffer = [0; 4096];
61 let mut tx_buffer = [0; 4096];
62 let mut socket = TcpSocket::new(&mut rx_buffer, &mut tx_buffer);
63
64 socket.set_timeout(Some(embassy_net::SmolDuration::from_secs(10)));
65
66 let remote_endpoint = (Ipv4Address::new(192, 168, 69, 74), 8000);
67 info!("connecting to {:?}...", remote_endpoint);
68 let r = socket.connect(remote_endpoint).await;
69 if let Err(e) = r {
70 warn!("connect error: {:?}", e);
71 return;
72 }
73 info!("connected!");
74 loop {
75 let r = socket.write_all(b"Hello!\n").await;
76 if let Err(e) = r {
77 warn!("write error: {:?}", e);
78 return;
79 }
80 }
81}
82
83#[no_mangle]
84fn _embassy_rand(buf: &mut [u8]) {
85 use rand_core::{OsRng, RngCore};
86 OsRng.fill_bytes(buf);
87}
88
89static EXECUTOR: Forever<Executor> = Forever::new();
90
91fn main() {
92 env_logger::builder()
93 .filter_level(log::LevelFilter::Debug)
94 .filter_module("async_io", log::LevelFilter::Info)
95 .format_timestamp_nanos()
96 .init();
97
98 let executor = EXECUTOR.put(Executor::new());
99 executor.run(|spawner| {
100 spawner.spawn(main_task(spawner)).unwrap();
101 });
102}