Skip to content

Commit 0d73ba7

Browse files
committed
UDP stack based on embassy-net
1 parent 0eecce5 commit 0d73ba7

File tree

9 files changed

+209
-167
lines changed

9 files changed

+209
-167
lines changed

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ exclude = ["examples/*"]
55

66
# For compatibility with ESP IDF
77
[patch.crates-io]
8-
smol = { git = "https://github.com/esp-rs-compat/smol" }
98
polling = { git = "https://github.com/esp-rs-compat/polling" }
109
socket2 = { git = "https://github.com/esp-rs-compat/socket2" }
1110

examples/onoff_light/src/main.rs

Lines changed: 36 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
use core::borrow::Borrow;
1919
use core::pin::pin;
2020

21-
use embassy_futures::select::select3;
2221
use log::info;
2322
use matter::core::{CommissioningData, Matter};
2423
use matter::data_model::cluster_basic_information::BasicInfoConfig;
@@ -28,13 +27,11 @@ use matter::data_model::objects::*;
2827
use matter::data_model::root_endpoint;
2928
use matter::data_model::system_model::descriptor;
3029
use matter::error::Error;
31-
use matter::mdns::{DefaultMdns, DefaultMdnsRunner};
30+
use matter::mdns::MdnsService;
3231
use matter::persist::FilePsm;
3332
use matter::secure_channel::spake2p::VerifierData;
3433
use matter::transport::network::{Ipv4Addr, Ipv6Addr, NetworkStack};
35-
use matter::transport::runner::{RxBuf, TransportRunner, TxBuf};
36-
use matter::transport::udp::UdpBuffers;
37-
use matter::utils::select::EitherUnwrap;
34+
use matter::transport::runner::{AllUdpBuffers, TransportRunner};
3835

3936
mod dev_att;
4037

@@ -59,10 +56,11 @@ fn run() -> Result<(), Error> {
5956
initialize_logger();
6057

6158
info!(
62-
"Matter memory: mDNS={}, Matter={}, TransportRunner={}",
63-
core::mem::size_of::<DefaultMdns>(),
59+
"Matter memory: mDNS={}, Matter={}, TransportRunner={}, UdpBuffers={}",
60+
core::mem::size_of::<MdnsService>(),
6461
core::mem::size_of::<Matter>(),
6562
core::mem::size_of::<TransportRunner>(),
63+
core::mem::size_of::<AllUdpBuffers>(),
6664
);
6765

6866
let dev_det = BasicInfoConfig {
@@ -83,20 +81,6 @@ fn run() -> Result<(), Error> {
8381

8482
let (ipv4_addr, ipv6_addr, interface) = initialize_network()?;
8583

86-
let mdns = DefaultMdns::new(
87-
0,
88-
"matter-demo",
89-
ipv4_addr.octets(),
90-
Some(ipv6_addr.octets()),
91-
interface,
92-
&dev_det,
93-
matter::MATTER_PORT,
94-
);
95-
96-
let mut mdns_runner = DefaultMdnsRunner::new(&mdns);
97-
98-
info!("mDNS initialized: {:p}, {:p}", &mdns, &mdns_runner);
99-
10084
let dev_att = dev_att::HardCodedDevAtt::new();
10185

10286
#[cfg(feature = "std")]
@@ -113,6 +97,18 @@ fn run() -> Result<(), Error> {
11397
#[cfg(not(feature = "std"))]
11498
let rand = matter::utils::rand::dummy_rand;
11599

100+
let mdns = MdnsService::new(
101+
0,
102+
"matter-demo",
103+
ipv4_addr.octets(),
104+
Some(ipv6_addr.octets()),
105+
interface,
106+
&dev_det,
107+
matter::MATTER_PORT,
108+
);
109+
110+
info!("mDNS initialized: {:p}", &mdns);
111+
116112
let matter = Matter::new(
117113
// vid/pid should match those in the DAC
118114
&dev_det,
@@ -125,20 +121,6 @@ fn run() -> Result<(), Error> {
125121

126122
info!("Matter initialized: {:p}", &matter);
127123

128-
let mut runner = TransportRunner::new(&matter);
129-
130-
info!("Transport Runner initialized: {:p}", &runner);
131-
132-
let mut tx_buf = TxBuf::uninit();
133-
let mut rx_buf = RxBuf::uninit();
134-
135-
// NOTE (no_std): If using the `embassy-net` UDP implementation, replace this dummy stack with the `embassy-net` one
136-
// When using a custom UDP stack, remove this
137-
let stack = NetworkStack::new();
138-
139-
let mut mdns_udp_buffers = UdpBuffers::new();
140-
let mut trans_udp_buffers = UdpBuffers::new();
141-
142124
#[cfg(all(feature = "std", not(target_os = "espidf")))]
143125
{
144126
let mut buf = [0; 4096];
@@ -152,62 +134,33 @@ fn run() -> Result<(), Error> {
152134
}
153135
}
154136

155-
let node = Node {
156-
id: 0,
157-
endpoints: &[
158-
root_endpoint::endpoint(0),
159-
Endpoint {
160-
id: 1,
161-
device_type: DEV_TYPE_ON_OFF_LIGHT,
162-
clusters: &[descriptor::CLUSTER, cluster_on_off::CLUSTER],
163-
},
164-
],
165-
};
137+
let mut runner = TransportRunner::new(&matter);
138+
139+
info!("Transport runner initialized: {:p}", &runner);
166140

167141
let handler = HandlerCompat(handler(&matter));
168142

169-
let matter = &matter;
170-
let node = &node;
171-
let handler = &handler;
172-
let runner = &mut runner;
173-
let tx_buf = &mut tx_buf;
174-
let rx_buf = &mut rx_buf;
175-
let stack = &stack;
176-
let mdns_udp_buffers = &mut mdns_udp_buffers;
177-
let trans_udp_buffers = &mut trans_udp_buffers;
143+
// NOTE (no_std): If using the `embassy-net` UDP implementation, replace this dummy stack with the `embassy-net` one
144+
// When using a custom UDP stack, remove this
145+
let stack = NetworkStack::new();
178146

179-
info!(
180-
"About to run wth node {:p}, handler {:p}, transport runner {:p}, mdns_runner {:p}",
181-
node, handler, runner, &mdns_runner
182-
);
147+
let mut buffers = AllUdpBuffers::new();
183148

184-
let mut fut = pin!(async move {
185-
// NOTE: If using a custom UDP stack, replace `run_udp` with `run`
186-
// and connect the pipes of the `run` method with the custom UDP stack
187-
let mut transport = pin!(runner.run_udp(
188-
stack,
189-
trans_udp_buffers,
190-
tx_buf,
191-
rx_buf,
192-
CommissioningData {
193-
// TODO: Hard-coded for now
194-
verifier: VerifierData::new_with_pw(123456, *matter.borrow()),
195-
discriminator: 250,
196-
},
197-
&handler,
198-
));
199-
200-
// NOTE: If using a custom UDP stack, replace `run_udp` with `run`
201-
// and connect the pipes of the `run` method with the custom UDP stack
202-
let mut mdns = pin!(mdns_runner.run_udp(stack, mdns_udp_buffers));
203-
204-
let mut save = pin!(save(matter, &psm));
205-
select3(&mut transport, &mut mdns, &mut save).await.unwrap()
206-
});
149+
let mut fut = pin!(runner.run_udp_all(
150+
&stack,
151+
&mdns,
152+
&mut buffers,
153+
CommissioningData {
154+
// TODO: Hard-coded for now
155+
verifier: VerifierData::new_with_pw(123456, *matter.borrow()),
156+
discriminator: 250,
157+
},
158+
&handler,
159+
));
207160

208161
// NOTE: For no_std, replace with your own no_std way of polling the future
209162
#[cfg(feature = "std")]
210-
smol::block_on(&mut fut)?;
163+
async_io::block_on(&mut fut)?;
211164

212165
// NOTE (no_std): For no_std, replace with your own more efficient no_std executor,
213166
// because the executor used below is a simple busy-loop poller

matter/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ path = "src/lib.rs"
1717
[features]
1818
default = ["os", "crypto_rustcrypto"]
1919
os = ["std", "backtrace", "env_logger", "nix", "critical-section/std", "embassy-sync/std", "embassy-time/std"]
20-
std = ["alloc", "rand", "qrcode", "async-io", "smol", "esp-idf-sys/std"]
20+
std = ["alloc", "rand", "qrcode", "async-io", "esp-idf-sys/std"]
2121
backtrace = []
2222
alloc = []
2323
nightly = []
@@ -47,14 +47,15 @@ embassy-time = { version = "0.1.1", features = ["generic-queue-8"] }
4747
embassy-sync = "0.2"
4848
critical-section = "1.1.1"
4949
domain = { version = "0.7.2", default_features = false, features = ["heapless"] }
50+
51+
# embassy-net dependencies
5052
embassy-net = { version = "0.1", features = ["udp", "igmp", "proto-ipv6", "medium-ethernet", "medium-ip"], optional = true }
5153
embassy-net-driver = { version = "0.1", optional = true }
5254
smoltcp = { version = "0.10", default-features = false, optional = true }
5355

5456
# STD-only dependencies
5557
rand = { version = "0.8.5", optional = true }
5658
qrcode = { version = "0.12", default-features = false, optional = true } # Print QR code
57-
smol = { version = "1.2", optional = true } # =1.2 for compatibility with ESP IDF
5859
async-io = { version = "=1.12", optional = true } # =1.2 for compatibility with ESP IDF
5960

6061
# crypto

matter/src/mdns.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,18 @@ where
5656
}
5757

5858
#[cfg(all(feature = "std", target_os = "macos"))]
59-
pub type DefaultMdns<'a> = astro::Mdns<'a>;
60-
59+
pub use astro::MdnsRunner;
60+
#[cfg(all(feature = "std", target_os = "macos"))]
61+
pub use astro::MdnsService;
6162
#[cfg(all(feature = "std", target_os = "macos"))]
62-
pub type DefaultMdnsRunner<'a> = astro::MdnsRunner<'a>;
63+
pub use astro::MdnsUdpBuffers;
6364

6465
#[cfg(not(all(feature = "std", target_os = "macos")))]
65-
pub type DefaultMdns<'a> = builtin::Mdns<'a>;
66-
66+
pub use builtin::MdnsRunner;
67+
#[cfg(not(all(feature = "std", target_os = "macos")))]
68+
pub use builtin::MdnsService;
6769
#[cfg(not(all(feature = "std", target_os = "macos")))]
68-
pub type DefaultMdnsRunner<'a> = builtin::MdnsRunner<'a>;
70+
pub use builtin::MdnsUdpBuffers;
6971

7072
pub struct DummyMdns;
7173

matter/src/mdns/astro.rs

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ use log::info;
1111

1212
use super::ServiceMode;
1313

14-
pub struct Mdns<'a> {
14+
pub struct MdnsService<'a> {
1515
dev_det: &'a BasicInfoConfig<'a>,
1616
matter_port: u16,
1717
services: RefCell<HashMap<String, RegisteredDnsService>>,
1818
}
1919

20-
impl<'a> Mdns<'a> {
20+
impl<'a> MdnsService<'a> {
21+
/// This constructor takes extra parameters for API-compatibility with builtin::MdnsRunner
2122
pub fn new(
2223
_id: u16,
2324
_hostname: &str,
@@ -80,28 +81,41 @@ impl<'a> Mdns<'a> {
8081
}
8182
}
8283

83-
pub struct MdnsRunner<'a>(&'a Mdns<'a>);
84+
/// Only for API-compatibility with builtin::MdnsRunner
85+
pub struct MdnsUdpBuffers(());
8486

85-
impl<'a> MdnsRunner<'a> {
86-
pub const fn new(mdns: &'a Mdns<'a>) -> Self {
87-
Self(mdns)
87+
/// Only for API-compatibility with builtin::MdnsRunner
88+
impl MdnsUdpBuffers {
89+
#[inline(always)]
90+
pub const fn new() -> Self {
91+
Self(())
8892
}
93+
}
8994

90-
pub async fn run_udp(&mut self) -> Result<(), Error> {
91-
core::future::pending::<Result<(), Error>>().await
95+
impl<'a> super::Mdns for MdnsService<'a> {
96+
fn add(&self, service: &str, mode: ServiceMode) -> Result<(), Error> {
97+
MdnsService::add(self, service, mode)
9298
}
9399

94-
pub async fn run(&self, _tx_pipe: &Pipe<'_>, _rx_pipe: &Pipe<'_>) -> Result<(), Error> {
95-
core::future::pending::<Result<(), Error>>().await
100+
fn remove(&self, service: &str) -> Result<(), Error> {
101+
MdnsService::remove(self, service)
96102
}
97103
}
98104

99-
impl<'a> super::Mdns for Mdns<'a> {
100-
fn add(&self, service: &str, mode: ServiceMode) -> Result<(), Error> {
101-
Mdns::add(self, service, mode)
105+
/// Only for API-compatibility with builtin::MdnsRunner
106+
pub struct MdnsRunner<'a>(&'a MdnsService<'a>);
107+
108+
/// Only for API-compatibility with builtin::MdnsRunner
109+
impl<'a> MdnsRunner<'a> {
110+
pub const fn new(mdns: &'a MdnsService<'a>) -> Self {
111+
Self(mdns)
102112
}
103113

104-
fn remove(&self, service: &str) -> Result<(), Error> {
105-
Mdns::remove(self, service)
114+
pub async fn run_udp(&mut self, buffers: &mut MdnsUdpBuffers) -> Result<(), Error> {
115+
core::future::pending::<Result<(), Error>>().await
116+
}
117+
118+
pub async fn run(&self, _tx_pipe: &Pipe<'_>, _rx_pipe: &Pipe<'_>) -> Result<(), Error> {
119+
core::future::pending::<Result<(), Error>>().await
106120
}
107121
}

0 commit comments

Comments
 (0)