From e9ea342bf7453ad683fad7934023558beecce54d Mon Sep 17 00:00:00 2001 From: Kedar Sovani Date: Sun, 8 Jan 2023 11:13:12 +0530 Subject: [PATCH] mdns: Discriminator is a property of the 'commissionable' state --- matter/src/core.rs | 8 ++++++-- matter/src/mdns.rs | 19 ++++++++----------- matter/src/secure_channel/core.rs | 10 ++++++++-- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/matter/src/core.rs b/matter/src/core.rs index 0706413..c5eb5b0 100644 --- a/matter/src/core.rs +++ b/matter/src/core.rs @@ -62,7 +62,7 @@ impl Matter { dev_comm: CommissioningData, ) -> Result, Error> { let mdns = Mdns::get()?; - mdns.set_values(dev_det.vid, dev_det.pid, dev_comm.discriminator); + mdns.set_values(dev_det.vid, dev_det.pid); let fabric_mgr = Arc::new(FabricMgr::new()?); let acl_mgr = Arc::new(AclMgr::new()?); @@ -78,7 +78,11 @@ impl Matter { matter.transport_mgr.register_protocol(interaction_model)?; let mut secure_channel = Box::new(SecureChannel::new(matter.fabric_mgr.clone())); if open_comm_window { - secure_channel.open_comm_window(&dev_comm.salt, dev_comm.passwd)?; + secure_channel.open_comm_window( + &dev_comm.salt, + dev_comm.passwd, + dev_comm.discriminator, + )?; } matter.transport_mgr.register_protocol(secure_channel)?; diff --git a/matter/src/mdns.rs b/matter/src/mdns.rs index f5aeb7c..287eece 100644 --- a/matter/src/mdns.rs +++ b/matter/src/mdns.rs @@ -30,8 +30,6 @@ pub struct MdnsInner { vid: u16, /// Product ID pid: u16, - /// Discriminator - discriminator: u16, } pub struct Mdns { @@ -45,8 +43,10 @@ static mut G_MDNS: Option> = None; static INIT: Once = Once::new(); pub enum ServiceMode { + /// The commissioned state Commissioned, - Commissionable, + /// The commissionable state with the discriminator that should be used + Commissionable(u16), } impl Mdns { @@ -71,11 +71,10 @@ impl Mdns { /// Set mDNS service specific values /// Values like vid, pid, discriminator etc // TODO: More things like device-type etc can be added here - pub fn set_values(&self, vid: u16, pid: u16, discriminator: u16) { + pub fn set_values(&self, vid: u16, pid: u16) { let mut inner = self.inner.lock().unwrap(); inner.vid = vid; inner.pid = pid; - inner.discriminator = discriminator; } /// Publish a mDNS service @@ -86,13 +85,11 @@ impl Mdns { ServiceMode::Commissioned => { sys_publish_service(name, "_matter._tcp", MATTER_PORT, &[]) } - ServiceMode::Commissionable => { - let inner = self.inner.lock().unwrap(); - let short = - (inner.discriminator & SHORT_DISCRIMINATOR_MASK) >> SHORT_DISCRIMINATOR_SHIFT; - let serv_type = format!("_matterc._udp,_S{},_L{}", short, inner.discriminator); + ServiceMode::Commissionable(discriminator) => { + let short = (discriminator & SHORT_DISCRIMINATOR_MASK) >> SHORT_DISCRIMINATOR_SHIFT; + let serv_type = format!("_matterc._udp,_S{},_L{}", short, discriminator); - let str_discriminator = format!("{}", inner.discriminator); + let str_discriminator = format!("{}", discriminator); let txt_kvs = [["D", &str_discriminator], ["CM", "1"]]; sys_publish_service(name, &serv_type, MATTER_PORT, &txt_kvs) } diff --git a/matter/src/secure_channel/core.rs b/matter/src/secure_channel/core.rs index 8a2774c..86ae55b 100644 --- a/matter/src/secure_channel/core.rs +++ b/matter/src/secure_channel/core.rs @@ -48,10 +48,16 @@ impl SecureChannel { } } - pub fn open_comm_window(&mut self, salt: &[u8; 16], passwd: u32) -> Result<(), Error> { + pub fn open_comm_window( + &mut self, + salt: &[u8; 16], + passwd: u32, + discriminator: u16, + ) -> Result<(), Error> { let name: u64 = rand::thread_rng().gen_range(0..0xFFFFFFFFFFFFFFFF); let name = format!("{:016X}", name); - let mdns = Mdns::get()?.publish_service(&name, mdns::ServiceMode::Commissionable)?; + let mdns = Mdns::get()? + .publish_service(&name, mdns::ServiceMode::Commissionable(discriminator))?; self.pake = Some((PAKE::new(salt, passwd), mdns)); Ok(()) }