Skip to content

Commit de3d3de

Browse files
committed
Make Matter covariant over its lifetime
1 parent 1b879f1 commit de3d3de

File tree

22 files changed

+512
-283
lines changed

22 files changed

+512
-283
lines changed

examples/onoff_light/src/main.rs

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use matter::data_model::root_endpoint;
3030
use matter::data_model::system_model::descriptor;
3131
use matter::error::Error;
3232
use matter::interaction_model::core::InteractionModel;
33-
use matter::mdns::builtin::Mdns;
33+
use matter::mdns::builtin::{Mdns, MdnsRxBuf, MdnsTxBuf};
3434
use matter::persist;
3535
use matter::secure_channel::spake2p::VerifierData;
3636
use matter::transport::network::{Address, IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
@@ -46,7 +46,7 @@ mod dev_att;
4646
fn main() -> Result<(), Error> {
4747
let thread = std::thread::Builder::new()
4848
.stack_size(120 * 1024)
49-
.spawn(move || run())
49+
.spawn(run)
5050
.unwrap();
5151

5252
thread.join().unwrap()
@@ -63,10 +63,10 @@ fn run() -> Result<(), Error> {
6363
initialize_logger();
6464

6565
info!(
66-
"Matter memory: mDNS={}, Transport={} (of which Matter={})",
66+
"Matter memory: mDNS={}, Matter={}, Transport={}",
6767
core::mem::size_of::<Mdns>(),
68-
core::mem::size_of::<Transport>(),
6968
core::mem::size_of::<Matter>(),
69+
core::mem::size_of::<Transport>(),
7070
);
7171

7272
let (ipv4_addr, ipv6_addr) = initialize_network()?;
@@ -78,15 +78,15 @@ fn run() -> Result<(), Error> {
7878
Some(ipv6_addr.octets()),
7979
);
8080

81-
let (mut mdns, mut mdns_runner) = mdns.split();
81+
let (mdns, mut mdns_runner) = mdns.split();
8282
//let (mut mdns, mdns_runner) = (matter::mdns::astro::AstroMdns::new()?, core::future::pending::pending());
8383
//let (mut mdns, mdns_runner) = (matter::mdns::DummyMdns {}, core::future::pending::pending());
8484

8585
let dev_att = dev_att::HardCodedDevAtt::new();
8686

8787
let matter = Matter::new_default(
8888
// vid/pid should match those in the DAC
89-
BasicInfoConfig {
89+
&BasicInfoConfig {
9090
vid: 0xFFF1,
9191
pid: 0x8000,
9292
hw_ver: 2,
@@ -96,7 +96,7 @@ fn run() -> Result<(), Error> {
9696
device_name: "OnOff Light",
9797
},
9898
&dev_att,
99-
&mut mdns,
99+
&mdns,
100100
matter::MATTER_PORT,
101101
);
102102

@@ -106,12 +106,13 @@ fn run() -> Result<(), Error> {
106106
let psm = persist::FilePsm::new(psm_path)?;
107107

108108
let mut buf = [0; 4096];
109+
let buf = &mut buf;
109110

110-
if let Some(data) = psm.load("acls", &mut buf)? {
111+
if let Some(data) = psm.load("acls", buf)? {
111112
matter.load_acls(data)?;
112113
}
113114

114-
if let Some(data) = psm.load("fabrics", &mut buf)? {
115+
if let Some(data) = psm.load("fabrics", buf)? {
115116
matter.load_fabrics(data)?;
116117
}
117118

@@ -123,12 +124,33 @@ fn run() -> Result<(), Error> {
123124
verifier: VerifierData::new_with_pw(123456, *matter.borrow()),
124125
discriminator: 250,
125126
},
126-
&mut buf,
127+
buf,
127128
)?;
128129

129-
let matter = &matter;
130+
let node = Node {
131+
id: 0,
132+
endpoints: &[
133+
root_endpoint::endpoint(0),
134+
Endpoint {
135+
id: 1,
136+
device_type: DEV_TYPE_ON_OFF_LIGHT,
137+
clusters: &[descriptor::CLUSTER, cluster_on_off::CLUSTER],
138+
},
139+
],
140+
};
141+
142+
let mut handler = handler(&matter);
143+
144+
let mut im = InteractionModel(DataModel::new(matter.borrow(), &node, &mut handler));
145+
146+
let mut rx_buf = [0; MAX_RX_BUF_SIZE];
147+
let mut tx_buf = [0; MAX_TX_BUF_SIZE];
148+
149+
let im = &mut im;
130150
let mdns_runner = &mut mdns_runner;
131151
let transport = &mut transport;
152+
let rx_buf = &mut rx_buf;
153+
let tx_buf = &mut tx_buf;
132154

133155
let mut io_fut = pin!(async move {
134156
let udp = UdpListener::new(SocketAddr::new(
@@ -138,52 +160,29 @@ fn run() -> Result<(), Error> {
138160
.await?;
139161

140162
loop {
141-
let mut rx_buf = [0; MAX_RX_BUF_SIZE];
142-
let mut tx_buf = [0; MAX_TX_BUF_SIZE];
163+
let (len, addr) = udp.recv(rx_buf).await?;
143164

144-
let (len, addr) = udp.recv(&mut rx_buf).await?;
145-
146-
let mut completion =
147-
transport.recv(Address::Udp(addr), &mut rx_buf[..len], &mut tx_buf);
165+
let mut completion = transport.recv(Address::Udp(addr), &mut rx_buf[..len], tx_buf);
148166

149167
while let Some(action) = completion.next_action()? {
150168
match action {
151169
RecvAction::Send(addr, buf) => {
152170
udp.send(addr.unwrap_udp(), buf).await?;
153171
}
154172
RecvAction::Interact(mut ctx) => {
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-
};
166-
167-
let mut handler = handler(matter);
168-
169-
let mut im =
170-
InteractionModel(DataModel::new(matter.borrow(), &node, &mut handler));
171-
172-
if im.handle(&mut ctx)? {
173-
if ctx.send()? {
174-
udp.send(ctx.tx.peer.unwrap_udp(), ctx.tx.as_slice())
175-
.await?;
176-
}
173+
if im.handle(&mut ctx)? && ctx.send()? {
174+
udp.send(ctx.tx.peer.unwrap_udp(), ctx.tx.as_slice())
175+
.await?;
177176
}
178177
}
179178
}
180179
}
181180

182-
if let Some(data) = transport.matter().store_fabrics(&mut buf)? {
181+
if let Some(data) = transport.matter().store_fabrics(buf)? {
183182
psm.store("fabrics", data)?;
184183
}
185184

186-
if let Some(data) = transport.matter().store_acls(&mut buf)? {
185+
if let Some(data) = transport.matter().store_acls(buf)? {
187186
psm.store("acls", data)?;
188187
}
189188
}
@@ -192,7 +191,12 @@ fn run() -> Result<(), Error> {
192191
Ok::<_, matter::error::Error>(())
193192
});
194193

195-
let mut mdns_fut = pin!(async move { mdns_runner.run().await });
194+
let mut tx_buf = MdnsTxBuf::uninit();
195+
let mut rx_buf = MdnsRxBuf::uninit();
196+
let tx_buf = &mut tx_buf;
197+
let rx_buf = &mut rx_buf;
198+
199+
let mut mdns_fut = pin!(async move { mdns_runner.run_udp(tx_buf, rx_buf).await });
196200

197201
let mut fut = pin!(async move { select(&mut io_fut, &mut mdns_fut,).await.unwrap() });
198202

matter/src/core.rs

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ pub struct Matter<'a> {
4848
pub acl_mgr: RefCell<AclMgr>,
4949
pub pase_mgr: RefCell<PaseMgr>,
5050
pub failsafe: RefCell<FailSafe>,
51-
pub mdns_mgr: RefCell<MdnsMgr<'a>>,
51+
pub mdns_mgr: MdnsMgr<'a>,
5252
pub epoch: Epoch,
5353
pub rand: Rand,
54-
pub dev_det: BasicInfoConfig<'a>,
54+
pub dev_det: &'a BasicInfoConfig<'a>,
5555
pub dev_att: &'a dyn DevAttDataFetcher,
5656
pub port: u16,
5757
}
@@ -60,9 +60,9 @@ impl<'a> Matter<'a> {
6060
#[cfg(feature = "std")]
6161
#[inline(always)]
6262
pub fn new_default(
63-
dev_det: BasicInfoConfig<'a>,
63+
dev_det: &'a BasicInfoConfig<'a>,
6464
dev_att: &'a dyn DevAttDataFetcher,
65-
mdns: &'a mut dyn Mdns,
65+
mdns: &'a dyn Mdns,
6666
port: u16,
6767
) -> Self {
6868
use crate::utils::epoch::sys_epoch;
@@ -79,9 +79,9 @@ impl<'a> Matter<'a> {
7979
/// this object to return the device attestation details when queried upon.
8080
#[inline(always)]
8181
pub fn new(
82-
dev_det: BasicInfoConfig<'a>,
82+
dev_det: &'a BasicInfoConfig<'a>,
8383
dev_att: &'a dyn DevAttDataFetcher,
84-
mdns: &'a mut dyn Mdns,
84+
mdns: &'a dyn Mdns,
8585
epoch: Epoch,
8686
rand: Rand,
8787
port: u16,
@@ -91,13 +91,7 @@ impl<'a> Matter<'a> {
9191
acl_mgr: RefCell::new(AclMgr::new()),
9292
pase_mgr: RefCell::new(PaseMgr::new(epoch, rand)),
9393
failsafe: RefCell::new(FailSafe::new()),
94-
mdns_mgr: RefCell::new(MdnsMgr::new(
95-
dev_det.vid,
96-
dev_det.pid,
97-
dev_det.device_name,
98-
port,
99-
mdns,
100-
)),
94+
mdns_mgr: MdnsMgr::new(dev_det.vid, dev_det.pid, dev_det.device_name, port, mdns),
10195
epoch,
10296
rand,
10397
dev_det,
@@ -107,7 +101,7 @@ impl<'a> Matter<'a> {
107101
}
108102

109103
pub fn dev_det(&self) -> &BasicInfoConfig<'_> {
110-
&self.dev_det
104+
self.dev_det
111105
}
112106

113107
pub fn dev_att(&self) -> &dyn DevAttDataFetcher {
@@ -119,9 +113,7 @@ impl<'a> Matter<'a> {
119113
}
120114

121115
pub fn load_fabrics(&self, data: &[u8]) -> Result<(), Error> {
122-
self.fabric_mgr
123-
.borrow_mut()
124-
.load(data, &mut self.mdns_mgr.borrow_mut())
116+
self.fabric_mgr.borrow_mut().load(data, &self.mdns_mgr)
125117
}
126118

127119
pub fn load_acls(&self, data: &[u8]) -> Result<(), Error> {
@@ -148,7 +140,7 @@ impl<'a> Matter<'a> {
148140
if !self.pase_mgr.borrow().is_pase_session_enabled() && self.fabric_mgr.borrow().is_empty()
149141
{
150142
print_pairing_code_and_qr(
151-
&self.dev_det,
143+
self.dev_det,
152144
&dev_comm,
153145
DiscoveryCapabilities::default(),
154146
buf,
@@ -157,7 +149,7 @@ impl<'a> Matter<'a> {
157149
self.pase_mgr.borrow_mut().enable_pase_session(
158150
dev_comm.verifier,
159151
dev_comm.discriminator,
160-
&mut self.mdns_mgr.borrow_mut(),
152+
&self.mdns_mgr,
161153
)?;
162154

163155
Ok(true)
@@ -191,12 +183,30 @@ impl<'a> Borrow<RefCell<FailSafe>> for Matter<'a> {
191183
}
192184
}
193185

194-
impl<'a> Borrow<RefCell<MdnsMgr<'a>>> for Matter<'a> {
195-
fn borrow(&self) -> &RefCell<MdnsMgr<'a>> {
186+
impl<'a> Borrow<MdnsMgr<'a>> for Matter<'a> {
187+
fn borrow(&self) -> &MdnsMgr<'a> {
196188
&self.mdns_mgr
197189
}
198190
}
199191

192+
impl<'a> Borrow<BasicInfoConfig<'a>> for Matter<'a> {
193+
fn borrow(&self) -> &BasicInfoConfig<'a> {
194+
self.dev_det
195+
}
196+
}
197+
198+
impl<'a> Borrow<dyn DevAttDataFetcher + 'a> for Matter<'a> {
199+
fn borrow(&self) -> &(dyn DevAttDataFetcher + 'a) {
200+
self.dev_att
201+
}
202+
}
203+
204+
impl<'a> Borrow<dyn Mdns + 'a> for Matter<'a> {
205+
fn borrow(&self) -> &(dyn Mdns + 'a) {
206+
self.mdns_mgr.mdns
207+
}
208+
}
209+
200210
impl<'a> Borrow<Epoch> for Matter<'a> {
201211
fn borrow(&self) -> &Epoch {
202212
&self.epoch

matter/src/data_model/root_endpoint.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use crate::{
77
mdns::MdnsMgr,
88
secure_channel::pake::PaseMgr,
99
utils::{epoch::Epoch, rand::Rand},
10-
Matter,
1110
};
1211

1312
use super::{
@@ -55,11 +54,23 @@ pub fn endpoint(id: EndptId) -> Endpoint<'static> {
5554
}
5655
}
5756

58-
pub fn handler<'a>(endpoint_id: u16, matter: &'a Matter<'a>) -> RootEndpointHandler<'a> {
57+
pub fn handler<'a, T>(endpoint_id: u16, matter: &'a T) -> RootEndpointHandler<'a>
58+
where
59+
T: Borrow<BasicInfoConfig<'a>>
60+
+ Borrow<dyn DevAttDataFetcher + 'a>
61+
+ Borrow<RefCell<PaseMgr>>
62+
+ Borrow<RefCell<FabricMgr>>
63+
+ Borrow<RefCell<AclMgr>>
64+
+ Borrow<RefCell<FailSafe>>
65+
+ Borrow<MdnsMgr<'a>>
66+
+ Borrow<Epoch>
67+
+ Borrow<Rand>
68+
+ 'a,
69+
{
5970
wrap(
6071
endpoint_id,
61-
matter.dev_det(),
62-
matter.dev_att(),
72+
matter.borrow(),
73+
matter.borrow(),
6374
matter.borrow(),
6475
matter.borrow(),
6576
matter.borrow(),
@@ -79,7 +90,7 @@ pub fn wrap<'a>(
7990
fabric: &'a RefCell<FabricMgr>,
8091
acl: &'a RefCell<AclMgr>,
8192
failsafe: &'a RefCell<FailSafe>,
82-
mdns_mgr: &'a RefCell<MdnsMgr<'a>>,
93+
mdns_mgr: &'a MdnsMgr<'a>,
8394
epoch: Epoch,
8495
rand: Rand,
8596
) -> RootEndpointHandler<'a> {

matter/src/data_model/sdm/admin_commissioning.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,11 @@ pub struct OpenCommWindowReq<'a> {
102102
pub struct AdminCommCluster<'a> {
103103
data_ver: Dataver,
104104
pase_mgr: &'a RefCell<PaseMgr>,
105-
mdns_mgr: &'a RefCell<MdnsMgr<'a>>,
105+
mdns_mgr: &'a MdnsMgr<'a>,
106106
}
107107

108108
impl<'a> AdminCommCluster<'a> {
109-
pub fn new(
110-
pase_mgr: &'a RefCell<PaseMgr>,
111-
mdns_mgr: &'a RefCell<MdnsMgr<'a>>,
112-
rand: Rand,
113-
) -> Self {
109+
pub fn new(pase_mgr: &'a RefCell<PaseMgr>, mdns_mgr: &'a MdnsMgr<'a>, rand: Rand) -> Self {
114110
Self {
115111
data_ver: Dataver::new(rand),
116112
pase_mgr,
@@ -159,7 +155,7 @@ impl<'a> AdminCommCluster<'a> {
159155
self.pase_mgr.borrow_mut().enable_pase_session(
160156
verifier,
161157
req.discriminator,
162-
&mut self.mdns_mgr.borrow_mut(),
158+
self.mdns_mgr,
163159
)?;
164160

165161
Ok(())

0 commit comments

Comments
 (0)