Skip to content

Commit 1b879f1

Browse files
committed
Simplify main user-facing API
1 parent 8e9d888 commit 1b879f1

File tree

9 files changed

+137
-96
lines changed

9 files changed

+137
-96
lines changed

examples/onoff_light/src/main.rs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ use matter::data_model::core::DataModel;
2727
use matter::data_model::device_types::DEV_TYPE_ON_OFF_LIGHT;
2828
use matter::data_model::objects::*;
2929
use matter::data_model::root_endpoint;
30-
use matter::data_model::sdm::dev_att::DevAttDataFetcher;
3130
use matter::data_model::system_model::descriptor;
3231
use matter::error::Error;
3332
use matter::interaction_model::core::InteractionModel;
@@ -36,7 +35,7 @@ use matter::persist;
3635
use matter::secure_channel::spake2p::VerifierData;
3736
use matter::transport::network::{Address, IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
3837
use matter::transport::{
39-
mgr::RecvAction, mgr::TransportMgr, packet::MAX_RX_BUF_SIZE, packet::MAX_TX_BUF_SIZE,
38+
core::RecvAction, core::Transport, packet::MAX_RX_BUF_SIZE, packet::MAX_TX_BUF_SIZE,
4039
udp::UdpListener,
4140
};
4241
use matter::utils::select::EitherUnwrap;
@@ -66,7 +65,7 @@ fn run() -> Result<(), Error> {
6665
info!(
6766
"Matter memory: mDNS={}, Transport={} (of which Matter={})",
6867
core::mem::size_of::<Mdns>(),
69-
core::mem::size_of::<TransportMgr>(),
68+
core::mem::size_of::<Transport>(),
7069
core::mem::size_of::<Matter>(),
7170
);
7271

@@ -83,9 +82,11 @@ fn run() -> Result<(), Error> {
8382
//let (mut mdns, mdns_runner) = (matter::mdns::astro::AstroMdns::new()?, core::future::pending::pending());
8483
//let (mut mdns, mdns_runner) = (matter::mdns::DummyMdns {}, core::future::pending::pending());
8584

85+
let dev_att = dev_att::HardCodedDevAtt::new();
86+
8687
let matter = Matter::new_default(
8788
// vid/pid should match those in the DAC
88-
&BasicInfoConfig {
89+
BasicInfoConfig {
8990
vid: 0xFFF1,
9091
pid: 0x8000,
9192
hw_ver: 2,
@@ -94,12 +95,11 @@ fn run() -> Result<(), Error> {
9495
serial_no: "aabbccdd",
9596
device_name: "OnOff Light",
9697
},
98+
&dev_att,
9799
&mut mdns,
98100
matter::MATTER_PORT,
99101
);
100102

101-
let dev_att = dev_att::HardCodedDevAtt::new();
102-
103103
let psm_path = std::env::temp_dir().join("matter-iot");
104104
info!("Persisting from/to {}", psm_path.display());
105105

@@ -115,7 +115,9 @@ fn run() -> Result<(), Error> {
115115
matter.load_fabrics(data)?;
116116
}
117117

118-
matter.start(
118+
let mut transport = Transport::new(&matter);
119+
120+
transport.start(
119121
CommissioningData {
120122
// TODO: Hard-coded for now
121123
verifier: VerifierData::new_with_pw(123456, *matter.borrow()),
@@ -125,10 +127,7 @@ fn run() -> Result<(), Error> {
125127
)?;
126128

127129
let matter = &matter;
128-
let dev_att = &dev_att;
129130
let mdns_runner = &mut mdns_runner;
130-
131-
let mut transport = TransportMgr::new(matter);
132131
let transport = &mut transport;
133132

134133
let mut io_fut = pin!(async move {
@@ -165,7 +164,7 @@ fn run() -> Result<(), Error> {
165164
],
166165
};
167166

168-
let mut handler = handler(matter, dev_att);
167+
let mut handler = handler(matter);
169168

170169
let mut im =
171170
InteractionModel(DataModel::new(matter.borrow(), &node, &mut handler));
@@ -180,11 +179,11 @@ fn run() -> Result<(), Error> {
180179
}
181180
}
182181

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

187-
if let Some(data) = matter.store_acls(&mut buf)? {
186+
if let Some(data) = transport.matter().store_acls(&mut buf)? {
188187
psm.store("acls", data)?;
189188
}
190189
}
@@ -202,8 +201,8 @@ fn run() -> Result<(), Error> {
202201
Ok::<_, matter::error::Error>(())
203202
}
204203

205-
fn handler<'a>(matter: &'a Matter<'a>, dev_att: &'a dyn DevAttDataFetcher) -> impl Handler + 'a {
206-
root_endpoint::handler(0, dev_att, matter)
204+
fn handler<'a>(matter: &'a Matter<'a>) -> impl Handler + 'a {
205+
root_endpoint::handler(0, matter)
207206
.chain(
208207
1,
209208
descriptor::ID,

matter/src/core.rs

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ use core::{borrow::Borrow, cell::RefCell};
1919

2020
use crate::{
2121
acl::AclMgr,
22-
data_model::{cluster_basic_information::BasicInfoConfig, sdm::failsafe::FailSafe},
22+
data_model::{
23+
cluster_basic_information::BasicInfoConfig,
24+
sdm::{dev_att::DevAttDataFetcher, failsafe::FailSafe},
25+
},
2326
error::*,
2427
fabric::FabricMgr,
2528
mdns::{Mdns, MdnsMgr},
@@ -48,17 +51,24 @@ pub struct Matter<'a> {
4851
pub mdns_mgr: RefCell<MdnsMgr<'a>>,
4952
pub epoch: Epoch,
5053
pub rand: Rand,
51-
pub dev_det: &'a BasicInfoConfig<'a>,
54+
pub dev_det: BasicInfoConfig<'a>,
55+
pub dev_att: &'a dyn DevAttDataFetcher,
56+
pub port: u16,
5257
}
5358

5459
impl<'a> Matter<'a> {
5560
#[cfg(feature = "std")]
5661
#[inline(always)]
57-
pub fn new_default(dev_det: &'a BasicInfoConfig, mdns: &'a mut dyn Mdns, port: u16) -> Self {
62+
pub fn new_default(
63+
dev_det: BasicInfoConfig<'a>,
64+
dev_att: &'a dyn DevAttDataFetcher,
65+
mdns: &'a mut dyn Mdns,
66+
port: u16,
67+
) -> Self {
5868
use crate::utils::epoch::sys_epoch;
5969
use crate::utils::rand::sys_rand;
6070

61-
Self::new(dev_det, mdns, sys_epoch, sys_rand, port)
71+
Self::new(dev_det, dev_att, mdns, sys_epoch, sys_rand, port)
6272
}
6373

6474
/// Creates a new Matter object
@@ -69,7 +79,8 @@ impl<'a> Matter<'a> {
6979
/// this object to return the device attestation details when queried upon.
7080
#[inline(always)]
7181
pub fn new(
72-
dev_det: &'a BasicInfoConfig,
82+
dev_det: BasicInfoConfig<'a>,
83+
dev_att: &'a dyn DevAttDataFetcher,
7384
mdns: &'a mut dyn Mdns,
7485
epoch: Epoch,
7586
rand: Rand,
@@ -90,11 +101,21 @@ impl<'a> Matter<'a> {
90101
epoch,
91102
rand,
92103
dev_det,
104+
dev_att,
105+
port,
93106
}
94107
}
95108

96-
pub fn dev_det(&self) -> &BasicInfoConfig {
97-
self.dev_det
109+
pub fn dev_det(&self) -> &BasicInfoConfig<'_> {
110+
&self.dev_det
111+
}
112+
113+
pub fn dev_att(&self) -> &dyn DevAttDataFetcher {
114+
self.dev_att
115+
}
116+
117+
pub fn port(&self) -> u16 {
118+
self.port
98119
}
99120

100121
pub fn load_fabrics(&self, data: &[u8]) -> Result<(), Error> {
@@ -119,11 +140,15 @@ impl<'a> Matter<'a> {
119140
self.acl_mgr.borrow().is_changed() || self.fabric_mgr.borrow().is_changed()
120141
}
121142

122-
pub fn start(&self, dev_comm: CommissioningData, buf: &mut [u8]) -> Result<(), Error> {
123-
let open_comm_window = self.fabric_mgr.borrow().is_empty();
124-
if open_comm_window {
143+
pub fn start_comissioning(
144+
&self,
145+
dev_comm: CommissioningData,
146+
buf: &mut [u8],
147+
) -> Result<bool, Error> {
148+
if !self.pase_mgr.borrow().is_pase_session_enabled() && self.fabric_mgr.borrow().is_empty()
149+
{
125150
print_pairing_code_and_qr(
126-
self.dev_det,
151+
&self.dev_det,
127152
&dev_comm,
128153
DiscoveryCapabilities::default(),
129154
buf,
@@ -134,9 +159,11 @@ impl<'a> Matter<'a> {
134159
dev_comm.discriminator,
135160
&mut self.mdns_mgr.borrow_mut(),
136161
)?;
137-
}
138162

139-
Ok(())
163+
Ok(true)
164+
} else {
165+
Ok(false)
166+
}
140167
}
141168
}
142169

matter/src/data_model/root_endpoint.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,11 @@ pub fn endpoint(id: EndptId) -> Endpoint<'static> {
5555
}
5656
}
5757

58-
pub fn handler<'a>(
59-
endpoint_id: u16,
60-
dev_att: &'a dyn DevAttDataFetcher,
61-
matter: &'a Matter<'a>,
62-
) -> RootEndpointHandler<'a> {
58+
pub fn handler<'a>(endpoint_id: u16, matter: &'a Matter<'a>) -> RootEndpointHandler<'a> {
6359
wrap(
6460
endpoint_id,
6561
matter.dev_det(),
66-
dev_att,
62+
matter.dev_att(),
6763
matter.borrow(),
6864
matter.borrow(),
6965
matter.borrow(),

matter/src/secure_channel/core.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* limitations under the License.
1616
*/
1717

18-
use core::cell::RefCell;
18+
use core::{borrow::Borrow, cell::RefCell};
1919

2020
use crate::{
2121
error::*,
@@ -24,7 +24,7 @@ use crate::{
2424
secure_channel::common::*,
2525
tlv,
2626
transport::{proto_ctx::ProtoCtx, session::CloneData},
27-
utils::rand::Rand,
27+
utils::{epoch::Epoch, rand::Rand},
2828
};
2929
use log::{error, info};
3030
use num;
@@ -42,14 +42,32 @@ pub struct SecureChannel<'a> {
4242

4343
impl<'a> SecureChannel<'a> {
4444
#[inline(always)]
45-
pub fn new(
45+
pub fn new<
46+
T: Borrow<RefCell<FabricMgr>>
47+
+ Borrow<RefCell<PaseMgr>>
48+
+ Borrow<RefCell<MdnsMgr<'a>>>
49+
+ Borrow<Epoch>
50+
+ Borrow<Rand>,
51+
>(
52+
matter: &'a T,
53+
) -> Self {
54+
Self::wrap(
55+
matter.borrow(),
56+
matter.borrow(),
57+
matter.borrow(),
58+
*matter.borrow(),
59+
)
60+
}
61+
62+
#[inline(always)]
63+
pub fn wrap(
4664
pase: &'a RefCell<PaseMgr>,
47-
fabric_mgr: &'a RefCell<FabricMgr>,
65+
fabric: &'a RefCell<FabricMgr>,
4866
mdns: &'a RefCell<MdnsMgr<'a>>,
4967
rand: Rand,
5068
) -> Self {
51-
SecureChannel {
52-
case: Case::new(fabric_mgr, rand),
69+
Self {
70+
case: Case::new(fabric, rand),
5371
pase,
5472
mdns,
5573
}

matter/src/secure_channel/pake.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ impl PaseMgr {
5959
}
6060
}
6161

62+
pub fn is_pase_session_enabled(&self) -> bool {
63+
matches!(&self.state, PaseMgrState::Enabled(_, _, _))
64+
}
65+
6266
pub fn enable_pase_session(
6367
&mut self,
6468
verifier: VerifierData,

0 commit comments

Comments
 (0)