Skip to content

Commit 488ef5b

Browse files
committed
Proper mDNS responder
1 parent b882aad commit 488ef5b

File tree

14 files changed

+1064
-840
lines changed

14 files changed

+1064
-840
lines changed

examples/onoff_light/src/main.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,25 @@ fn run() -> Result<(), Error> {
6969
core::mem::size_of::<Transport>(),
7070
);
7171

72+
let dev_det = BasicInfoConfig {
73+
vid: 0xFFF1,
74+
pid: 0x8000,
75+
hw_ver: 2,
76+
sw_ver: 1,
77+
sw_ver_str: "1",
78+
serial_no: "aabbccdd",
79+
device_name: "OnOff Light",
80+
};
81+
7282
let (ipv4_addr, ipv6_addr) = initialize_network()?;
7383

7484
let mdns = DefaultMdns::new(
7585
0,
7686
"matter-demo",
7787
ipv4_addr.octets(),
7888
Some(ipv6_addr.octets()),
89+
&dev_det,
90+
matter::MATTER_PORT,
7991
);
8092

8193
let mut mdns_runner = DefaultMdnsRunner::new(&mdns);
@@ -84,15 +96,7 @@ fn run() -> Result<(), Error> {
8496

8597
let matter = Matter::new_default(
8698
// vid/pid should match those in the DAC
87-
&BasicInfoConfig {
88-
vid: 0xFFF1,
89-
pid: 0x8000,
90-
hw_ver: 2,
91-
sw_ver: 1,
92-
sw_ver_str: "1",
93-
serial_no: "aabbccdd",
94-
device_name: "OnOff Light",
95-
},
99+
&dev_det,
96100
&dev_att,
97101
&mdns,
98102
matter::MATTER_PORT,

matter/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ embassy-futures = "0.1"
4646
embassy-time = { version = "0.1.1", features = ["generic-queue-8"] }
4747
embassy-sync = "0.2"
4848
critical-section = "1.1.1"
49-
domain = { version = "0.7.2", default_features = false }
49+
domain = { version = "0.7.2", default_features = false, features = ["heapless"] }
5050

5151
# STD-only dependencies
5252
rand = { version = "0.8.5", optional = true }

matter/src/core.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::{
2525
},
2626
error::*,
2727
fabric::FabricMgr,
28-
mdns::{Mdns, MdnsMgr},
28+
mdns::Mdns,
2929
pairing::{print_pairing_code_and_qr, DiscoveryCapabilities},
3030
secure_channel::{pake::PaseMgr, spake2p::VerifierData},
3131
utils::{epoch::Epoch, rand::Rand},
@@ -48,7 +48,7 @@ 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: MdnsMgr<'a>,
51+
pub mdns: &'a dyn Mdns,
5252
pub epoch: Epoch,
5353
pub rand: Rand,
5454
pub dev_det: &'a BasicInfoConfig<'a>,
@@ -91,7 +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: MdnsMgr::new(dev_det.vid, dev_det.pid, dev_det.device_name, port, mdns),
94+
mdns,
9595
epoch,
9696
rand,
9797
dev_det,
@@ -113,7 +113,7 @@ impl<'a> Matter<'a> {
113113
}
114114

115115
pub fn load_fabrics(&self, data: &[u8]) -> Result<(), Error> {
116-
self.fabric_mgr.borrow_mut().load(data, &self.mdns_mgr)
116+
self.fabric_mgr.borrow_mut().load(data, self.mdns)
117117
}
118118

119119
pub fn load_acls(&self, data: &[u8]) -> Result<(), Error> {
@@ -149,7 +149,7 @@ impl<'a> Matter<'a> {
149149
self.pase_mgr.borrow_mut().enable_pase_session(
150150
dev_comm.verifier,
151151
dev_comm.discriminator,
152-
&self.mdns_mgr,
152+
self.mdns,
153153
)?;
154154

155155
Ok(true)
@@ -183,12 +183,6 @@ impl<'a> Borrow<RefCell<FailSafe>> for Matter<'a> {
183183
}
184184
}
185185

186-
impl<'a> Borrow<MdnsMgr<'a>> for Matter<'a> {
187-
fn borrow(&self) -> &MdnsMgr<'a> {
188-
&self.mdns_mgr
189-
}
190-
}
191-
192186
impl<'a> Borrow<BasicInfoConfig<'a>> for Matter<'a> {
193187
fn borrow(&self) -> &BasicInfoConfig<'a> {
194188
self.dev_det
@@ -203,7 +197,7 @@ impl<'a> Borrow<dyn DevAttDataFetcher + 'a> for Matter<'a> {
203197

204198
impl<'a> Borrow<dyn Mdns + 'a> for Matter<'a> {
205199
fn borrow(&self) -> &(dyn Mdns + 'a) {
206-
self.mdns_mgr.mdns
200+
self.mdns
207201
}
208202
}
209203

matter/src/data_model/root_endpoint.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::{
44
acl::AclMgr,
55
fabric::FabricMgr,
66
handler_chain_type,
7-
mdns::MdnsMgr,
7+
mdns::Mdns,
88
secure_channel::pake::PaseMgr,
99
utils::{epoch::Epoch, rand::Rand},
1010
};
@@ -62,7 +62,7 @@ where
6262
+ Borrow<RefCell<FabricMgr>>
6363
+ Borrow<RefCell<AclMgr>>
6464
+ Borrow<RefCell<FailSafe>>
65-
+ Borrow<MdnsMgr<'a>>
65+
+ Borrow<dyn Mdns + 'a>
6666
+ Borrow<Epoch>
6767
+ Borrow<Rand>
6868
+ 'a,
@@ -90,7 +90,7 @@ pub fn wrap<'a>(
9090
fabric: &'a RefCell<FabricMgr>,
9191
acl: &'a RefCell<AclMgr>,
9292
failsafe: &'a RefCell<FailSafe>,
93-
mdns_mgr: &'a MdnsMgr<'a>,
93+
mdns: &'a dyn Mdns,
9494
epoch: Epoch,
9595
rand: Rand,
9696
) -> RootEndpointHandler<'a> {
@@ -103,12 +103,12 @@ pub fn wrap<'a>(
103103
.chain(
104104
endpoint_id,
105105
noc::ID,
106-
NocCluster::new(dev_att, fabric, acl, failsafe, mdns_mgr, epoch, rand),
106+
NocCluster::new(dev_att, fabric, acl, failsafe, mdns, epoch, rand),
107107
)
108108
.chain(
109109
endpoint_id,
110110
admin_commissioning::ID,
111-
AdminCommCluster::new(pase, mdns_mgr, rand),
111+
AdminCommCluster::new(pase, mdns, rand),
112112
)
113113
.chain(endpoint_id, nw_commissioning::ID, NwCommCluster::new(rand))
114114
.chain(

matter/src/data_model/sdm/admin_commissioning.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use core::convert::TryInto;
2020

2121
use crate::data_model::objects::*;
2222
use crate::interaction_model::core::Transaction;
23-
use crate::mdns::MdnsMgr;
23+
use crate::mdns::Mdns;
2424
use crate::secure_channel::pake::PaseMgr;
2525
use crate::secure_channel::spake2p::VerifierData;
2626
use crate::tlv::{FromTLV, Nullable, OctetStr, TLVElement};
@@ -102,15 +102,15 @@ pub struct OpenCommWindowReq<'a> {
102102
pub struct AdminCommCluster<'a> {
103103
data_ver: Dataver,
104104
pase_mgr: &'a RefCell<PaseMgr>,
105-
mdns_mgr: &'a MdnsMgr<'a>,
105+
mdns: &'a dyn Mdns,
106106
}
107107

108108
impl<'a> AdminCommCluster<'a> {
109-
pub fn new(pase_mgr: &'a RefCell<PaseMgr>, mdns_mgr: &'a MdnsMgr<'a>, rand: Rand) -> Self {
109+
pub fn new(pase_mgr: &'a RefCell<PaseMgr>, mdns: &'a dyn Mdns, rand: Rand) -> Self {
110110
Self {
111111
data_ver: Dataver::new(rand),
112112
pase_mgr,
113-
mdns_mgr,
113+
mdns,
114114
}
115115
}
116116

@@ -152,11 +152,9 @@ impl<'a> AdminCommCluster<'a> {
152152
cmd_enter!("Open Commissioning Window");
153153
let req = OpenCommWindowReq::from_tlv(data)?;
154154
let verifier = VerifierData::new(req.verifier.0, req.iterations, req.salt.0);
155-
self.pase_mgr.borrow_mut().enable_pase_session(
156-
verifier,
157-
req.discriminator,
158-
self.mdns_mgr,
159-
)?;
155+
self.pase_mgr
156+
.borrow_mut()
157+
.enable_pase_session(verifier, req.discriminator, self.mdns)?;
160158

161159
Ok(())
162160
}

matter/src/data_model/sdm/noc.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::data_model::objects::*;
2525
use crate::data_model::sdm::dev_att;
2626
use crate::fabric::{Fabric, FabricMgr, MAX_SUPPORTED_FABRICS};
2727
use crate::interaction_model::core::Transaction;
28-
use crate::mdns::MdnsMgr;
28+
use crate::mdns::Mdns;
2929
use crate::tlv::{FromTLV, OctetStr, TLVElement, TLVWriter, TagType, ToTLV, UtfStr};
3030
use crate::transport::session::SessionMode;
3131
use crate::utils::epoch::Epoch;
@@ -222,7 +222,7 @@ pub struct NocCluster<'a> {
222222
fabric_mgr: &'a RefCell<FabricMgr>,
223223
acl_mgr: &'a RefCell<AclMgr>,
224224
failsafe: &'a RefCell<FailSafe>,
225-
mdns_mgr: &'a MdnsMgr<'a>,
225+
mdns: &'a dyn Mdns,
226226
}
227227

228228
impl<'a> NocCluster<'a> {
@@ -231,7 +231,7 @@ impl<'a> NocCluster<'a> {
231231
fabric_mgr: &'a RefCell<FabricMgr>,
232232
acl_mgr: &'a RefCell<AclMgr>,
233233
failsafe: &'a RefCell<FailSafe>,
234-
mdns_mgr: &'a MdnsMgr<'a>,
234+
mdns: &'a dyn Mdns,
235235
epoch: Epoch,
236236
rand: Rand,
237237
) -> Self {
@@ -243,7 +243,7 @@ impl<'a> NocCluster<'a> {
243243
fabric_mgr,
244244
acl_mgr,
245245
failsafe,
246-
mdns_mgr,
246+
mdns,
247247
}
248248
}
249249

@@ -383,7 +383,7 @@ impl<'a> NocCluster<'a> {
383383
let fab_idx = self
384384
.fabric_mgr
385385
.borrow_mut()
386-
.add(fabric, self.mdns_mgr)
386+
.add(fabric, self.mdns)
387387
.map_err(|_| NocStatus::TableFull)?;
388388

389389
self.add_acl(fab_idx, r.case_admin_subject)?;
@@ -455,7 +455,7 @@ impl<'a> NocCluster<'a> {
455455
if self
456456
.fabric_mgr
457457
.borrow_mut()
458-
.remove(req.fab_idx, self.mdns_mgr)
458+
.remove(req.fab_idx, self.mdns)
459459
.is_ok()
460460
{
461461
let _ = self.acl_mgr.borrow_mut().delete_for_fabric(req.fab_idx);

matter/src/fabric.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use crate::{
2626
crypto::{self, hkdf_sha256, HmacSha256, KeyPair},
2727
error::{Error, ErrorCode},
2828
group_keys::KeySet,
29-
mdns::{MdnsMgr, ServiceMode},
29+
mdns::{Mdns, ServiceMode},
3030
tlv::{self, FromTLV, OctetStr, TLVList, TLVWriter, TagType, ToTLV, UtfStr},
3131
utils::writebuf::WriteBuf,
3232
};
@@ -200,17 +200,17 @@ impl FabricMgr {
200200
}
201201
}
202202

203-
pub fn load(&mut self, data: &[u8], mdns_mgr: &MdnsMgr) -> Result<(), Error> {
203+
pub fn load(&mut self, data: &[u8], mdns: &dyn Mdns) -> Result<(), Error> {
204204
for fabric in self.fabrics.iter().flatten() {
205-
mdns_mgr.unpublish_service(&fabric.mdns_service_name, ServiceMode::Commissioned)?;
205+
mdns.remove(&fabric.mdns_service_name)?;
206206
}
207207

208208
let root = TLVList::new(data).iter().next().ok_or(ErrorCode::Invalid)?;
209209

210210
tlv::from_tlv(&mut self.fabrics, &root)?;
211211

212212
for fabric in self.fabrics.iter().flatten() {
213-
mdns_mgr.publish_service(&fabric.mdns_service_name, ServiceMode::Commissioned)?;
213+
mdns.add(&fabric.mdns_service_name, ServiceMode::Commissioned)?;
214214
}
215215

216216
self.changed = false;
@@ -241,11 +241,11 @@ impl FabricMgr {
241241
self.changed
242242
}
243243

244-
pub fn add(&mut self, f: Fabric, mdns_mgr: &MdnsMgr) -> Result<u8, Error> {
244+
pub fn add(&mut self, f: Fabric, mdns: &dyn Mdns) -> Result<u8, Error> {
245245
let slot = self.fabrics.iter().position(|x| x.is_none());
246246

247247
if slot.is_some() || self.fabrics.len() < MAX_SUPPORTED_FABRICS {
248-
mdns_mgr.publish_service(&f.mdns_service_name, ServiceMode::Commissioned)?;
248+
mdns.add(&f.mdns_service_name, ServiceMode::Commissioned)?;
249249
self.changed = true;
250250

251251
if let Some(index) = slot {
@@ -265,10 +265,10 @@ impl FabricMgr {
265265
}
266266
}
267267

268-
pub fn remove(&mut self, fab_idx: u8, mdns_mgr: &MdnsMgr) -> Result<(), Error> {
268+
pub fn remove(&mut self, fab_idx: u8, mdns: &dyn Mdns) -> Result<(), Error> {
269269
if fab_idx > 0 && fab_idx as usize <= self.fabrics.len() {
270270
if let Some(f) = self.fabrics[(fab_idx - 1) as usize].take() {
271-
mdns_mgr.unpublish_service(&f.mdns_service_name, ServiceMode::Commissioned)?;
271+
mdns.remove(&f.mdns_service_name)?;
272272
self.changed = true;
273273
Ok(())
274274
} else {

0 commit comments

Comments
 (0)