Skip to content

Commit

Permalink
Switch to the upstream rs-matter clusters
Browse files Browse the repository at this point in the history
  • Loading branch information
ivmarkov committed May 25, 2024
1 parent fef010f commit 45e9c91
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 406 deletions.
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ debug = true
opt-level = "z"

[features]
default = ["std"]
default = ["std", "async-io-mini"]
std = ["rs-matter/std", "esp-idf-svc/std"]
examples = ["std", "async-io", "esp-idf-svc/binstart", "esp-idf-svc/critical-section"] # Enable only when building the examples
examples = ["std", "async-io-mini", "esp-idf-svc/binstart", "esp-idf-svc/critical-section"] # Enable only when building the examples

[dependencies]
log = { version = "0.4", default-features = false }
Expand Down
144 changes: 3 additions & 141 deletions src/stack.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
use core::borrow::Borrow;
use core::cell::RefCell;
use core::fmt::Write as _;
use core::net::{Ipv6Addr, SocketAddr, SocketAddrV6};
use core::pin::pin;
Expand All @@ -16,38 +14,19 @@ use esp_idf_svc::nvs::{EspNvs, EspNvsPartition, NvsPartitionId};

use log::info;

use rs_matter::acl::AclMgr;
use rs_matter::data_model::cluster_basic_information::{self, BasicInfoCluster, BasicInfoConfig};
use rs_matter::data_model::cluster_basic_information::BasicInfoConfig;
use rs_matter::data_model::core::IMBuffer;
use rs_matter::data_model::objects::{AsyncHandler, AsyncMetadata, EmptyHandler, HandlerCompat};
use rs_matter::data_model::sdm::admin_commissioning::AdminCommCluster;
use rs_matter::data_model::objects::{AsyncHandler, AsyncMetadata};
use rs_matter::data_model::sdm::dev_att::DevAttDataFetcher;
use rs_matter::data_model::sdm::failsafe::FailSafe;
use rs_matter::data_model::sdm::general_commissioning::GenCommCluster;
use rs_matter::data_model::sdm::general_diagnostics::GenDiagCluster;
use rs_matter::data_model::sdm::group_key_management::GrpKeyMgmtCluster;
use rs_matter::data_model::sdm::noc::NocCluster;
use rs_matter::data_model::sdm::{
admin_commissioning, general_commissioning, general_diagnostics, group_key_management, noc,
nw_commissioning,
};
use rs_matter::data_model::subscriptions::Subscriptions;
use rs_matter::data_model::system_model::access_control::AccessControlCluster;
use rs_matter::data_model::system_model::descriptor::DescriptorCluster;
use rs_matter::data_model::system_model::{access_control, descriptor};
use rs_matter::error::ErrorCode;
use rs_matter::fabric::FabricMgr;
use rs_matter::mdns::Mdns;
use rs_matter::pairing::DiscoveryCapabilities;
use rs_matter::respond::DefaultResponder;
use rs_matter::secure_channel::pake::PaseMgr;
use rs_matter::transport::network::{NetworkReceive, NetworkSend};
use rs_matter::utils::buf::{BufferAccess, PooledBuffers};
use rs_matter::utils::epoch::Epoch;
use rs_matter::utils::rand::Rand;
use rs_matter::utils::select::Coalesce;
use rs_matter::utils::signal::Signal;
use rs_matter::{handler_chain_type, CommissioningData, Matter, MATTER_PORT};
use rs_matter::{CommissioningData, Matter, MATTER_PORT};

use crate::error::Error;
use crate::multicast::{join_multicast_v4, join_multicast_v6};
Expand Down Expand Up @@ -409,123 +388,6 @@ where
}
}

/// A type representing the type of the root (Endpoint 0) handler
/// which is generic over the operational transport clusters (i.e. Ethernet, Wifi or Thread)
pub type RootEndpointHandler<'a, NWCOMM, NWDIAG> = handler_chain_type!(
NWCOMM,
NWDIAG,
HandlerCompat<descriptor::DescriptorCluster<'a>>,
HandlerCompat<cluster_basic_information::BasicInfoCluster<'a>>,
HandlerCompat<general_commissioning::GenCommCluster<'a>>,
HandlerCompat<admin_commissioning::AdminCommCluster<'a>>,
HandlerCompat<noc::NocCluster<'a>>,
HandlerCompat<access_control::AccessControlCluster<'a>>,
HandlerCompat<general_diagnostics::GenDiagCluster>,
HandlerCompat<group_key_management::GrpKeyMgmtCluster>
);

/// A utility function to instantiate the root (Endpoint 0) handler.
/// Besides a reference to the main `Matter` object, this function
/// needs user-supplied implementations of the network commissioning
/// and network diagnostics clusters.
pub fn handler<'a, NWCOMM, NWDIAG, T>(
matter: &'a T,
nwcomm: NWCOMM,
nwdiag_id: u32,
nwdiag: NWDIAG,
) -> RootEndpointHandler<'a, NWCOMM, NWDIAG>
where
T: Borrow<BasicInfoConfig<'a>>
+ Borrow<dyn DevAttDataFetcher + 'a>
+ Borrow<RefCell<PaseMgr>>
+ Borrow<RefCell<FabricMgr>>
+ Borrow<RefCell<AclMgr>>
+ Borrow<RefCell<FailSafe>>
+ Borrow<dyn Mdns + 'a>
+ Borrow<Epoch>
+ Borrow<Rand>
+ 'a,
{
wrap(
0,
matter.borrow(),
matter.borrow(),
matter.borrow(),
matter.borrow(),
matter.borrow(),
matter.borrow(),
matter.borrow(),
*matter.borrow(),
*matter.borrow(),
nwcomm,
nwdiag_id,
nwdiag,
)
}

#[allow(clippy::too_many_arguments)]
fn wrap<'a, NWCOMM, NWDIAG>(
endpoint_id: u16,
basic_info: &'a BasicInfoConfig<'a>,
dev_att: &'a dyn DevAttDataFetcher,
pase: &'a RefCell<PaseMgr>,
fabric: &'a RefCell<FabricMgr>,
acl: &'a RefCell<AclMgr>,
failsafe: &'a RefCell<FailSafe>,
mdns: &'a dyn Mdns,
epoch: Epoch,
rand: Rand,
nwcomm: NWCOMM,
nwdiag_id: u32,
nwdiag: NWDIAG,
) -> RootEndpointHandler<'a, NWCOMM, NWDIAG> {
EmptyHandler
.chain(
endpoint_id,
group_key_management::ID,
HandlerCompat(GrpKeyMgmtCluster::new(rand)),
)
.chain(
endpoint_id,
general_diagnostics::ID,
HandlerCompat(GenDiagCluster::new(rand)),
)
.chain(
endpoint_id,
access_control::ID,
HandlerCompat(AccessControlCluster::new(acl, rand)),
)
.chain(
endpoint_id,
noc::ID,
HandlerCompat(NocCluster::new(
dev_att, fabric, acl, failsafe, mdns, epoch, rand,
)),
)
.chain(
endpoint_id,
admin_commissioning::ID,
HandlerCompat(AdminCommCluster::new(pase, mdns, rand)),
)
.chain(
endpoint_id,
general_commissioning::ID,
HandlerCompat(GenCommCluster::new(failsafe, false, rand)),
)
.chain(
endpoint_id,
cluster_basic_information::ID,
HandlerCompat(BasicInfoCluster::new(basic_info, rand)),
)
.chain(
endpoint_id,
descriptor::ID,
HandlerCompat(DescriptorCluster::new(rand)),
)
.chain(endpoint_id, nwdiag_id, nwdiag)
.chain(endpoint_id, nw_commissioning::ID, nwcomm)
}

/// A utility function to initialize the `async-io` Reactor which is
/// used for IP-based networks (UDP and TCP).
///
Expand Down
35 changes: 7 additions & 28 deletions src/stack/eth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,18 @@ use esp_idf_svc::nvs::{EspNvsPartition, NvsPartitionId};

use log::info;

use rs_matter::data_model::cluster_basic_information;
use rs_matter::data_model::objects::{
AsyncHandler, AsyncMetadata, Cluster, Endpoint, HandlerCompat,
};
use rs_matter::data_model::objects::{AsyncHandler, AsyncMetadata, Endpoint, HandlerCompat};
use rs_matter::data_model::root_endpoint;
use rs_matter::data_model::root_endpoint::{handler, OperNwType, RootEndpointHandler};
use rs_matter::data_model::sdm::ethernet_nw_diagnostics::EthNwDiagCluster;
use rs_matter::data_model::sdm::nw_commissioning::EthNwCommCluster;
use rs_matter::data_model::sdm::{
admin_commissioning, ethernet_nw_diagnostics, general_commissioning, general_diagnostics,
group_key_management, noc, nw_commissioning,
};
use rs_matter::data_model::system_model::{access_control, descriptor};
use rs_matter::data_model::sdm::{ethernet_nw_diagnostics, nw_commissioning};
use rs_matter::pairing::DiscoveryCapabilities;
use rs_matter::CommissioningData;

use crate::error::Error;
use crate::netif::NetifAccess;
use crate::{handler, MatterStack, Network, RootEndpointHandler};
use crate::{MatterStack, Network};

/// An implementation of the `Network` trait for Ethernet.
///
Expand All @@ -46,17 +41,14 @@ impl<'a> MatterStack<'a, Eth> {
/// Return a metadata for the root (Endpoint 0) of the Matter Node
/// configured for Ethernet network.
pub const fn root_metadata() -> Endpoint<'static> {
Endpoint {
id: 0,
device_type: rs_matter::data_model::device_types::DEV_TYPE_ROOT_NODE,
clusters: &CLUSTERS,
}
root_endpoint::endpoint(0, OperNwType::Ethernet)
}

/// Return a handler for the root (Endpoint 0) of the Matter Node
/// configured for Ethernet network.
pub fn root_handler(&self) -> EthRootEndpointHandler<'_> {
handler(
0,
self.matter(),
HandlerCompat(EthNwCommCluster::new(*self.matter().borrow())),
ethernet_nw_diagnostics::ID,
Expand Down Expand Up @@ -106,16 +98,3 @@ pub type EthRootEndpointHandler<'a> = RootEndpointHandler<
HandlerCompat<nw_commissioning::EthNwCommCluster>,
HandlerCompat<ethernet_nw_diagnostics::EthNwDiagCluster>,
>;

const CLUSTERS: [Cluster<'static>; 10] = [
descriptor::CLUSTER,
cluster_basic_information::CLUSTER,
general_commissioning::CLUSTER,
nw_commissioning::ETH_CLUSTER,
admin_commissioning::CLUSTER,
noc::CLUSTER,
access_control::CLUSTER,
general_diagnostics::CLUSTER,
ethernet_nw_diagnostics::CLUSTER,
group_key_management::CLUSTER,
];
54 changes: 23 additions & 31 deletions src/stack/wifible.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,14 @@ use esp_idf_svc::wifi::{AsyncWifi, EspWifi};

use log::info;

use rs_matter::data_model::cluster_basic_information;
use rs_matter::data_model::objects::{
AsyncHandler, AsyncMetadata, Cluster, Endpoint, HandlerCompat,
};
use rs_matter::data_model::objects::{AsyncHandler, AsyncMetadata, Endpoint, HandlerCompat};
use rs_matter::data_model::root_endpoint;
use rs_matter::data_model::root_endpoint::{handler, OperNwType, RootEndpointHandler};
use rs_matter::data_model::sdm::failsafe::FailSafe;
use rs_matter::data_model::sdm::{
admin_commissioning, general_commissioning, general_diagnostics, group_key_management, noc,
nw_commissioning,
use rs_matter::data_model::sdm::wifi_nw_diagnostics;
use rs_matter::data_model::sdm::wifi_nw_diagnostics::{
WiFiSecurity, WiFiVersion, WifiNwDiagCluster, WifiNwDiagData,
};
use rs_matter::data_model::system_model::{access_control, descriptor};
use rs_matter::pairing::DiscoveryCapabilities;
use rs_matter::transport::network::btp::{Btp, BtpContext};
use rs_matter::utils::select::Coalesce;
Expand All @@ -47,8 +45,8 @@ use rs_matter::CommissioningData;
use crate::ble::{BtpGattContext, BtpGattPeripheral};
use crate::error::Error;
use crate::wifi::mgmt::WifiManager;
use crate::wifi::{comm, diag, WifiContext};
use crate::{handler, MatterStack, Network, RootEndpointHandler};
use crate::wifi::{comm, WifiContext};
use crate::{MatterStack, Network};

const MAX_WIFI_NETWORKS: usize = 2;
const GATTS_APP_ID: u16 = 0;
Expand Down Expand Up @@ -87,21 +85,28 @@ impl<'a> MatterStack<'a, WifiBle> {
/// Return a metadata for the root (Endpoint 0) of the Matter Node
/// configured for BLE+Wifi network.
pub const fn root_metadata() -> Endpoint<'static> {
Endpoint {
id: 0,
device_type: rs_matter::data_model::device_types::DEV_TYPE_ROOT_NODE,
clusters: &CLUSTERS,
}
root_endpoint::endpoint(0, OperNwType::Wifi)
}

/// Return a handler for the root (Endpoint 0) of the Matter Node
/// configured for BLE+Wifi network.
pub fn root_handler(&self) -> WifiBleRootEndpointHandler<'_> {
handler(
0,
self.matter(),
comm::WifiNwCommCluster::new(*self.matter().borrow(), &self.network.wifi_context),
diag::ID,
HandlerCompat(diag::WifiNwDiagCluster::new(*self.matter().borrow())),
wifi_nw_diagnostics::ID,
HandlerCompat(WifiNwDiagCluster::new(
*self.matter().borrow(),
// TODO: Update with actual information
WifiNwDiagData {
bssid: [0; 6],
security_type: WiFiSecurity::Unspecified,
wifi_version: WiFiVersion::B,
channel_number: 20,
rssi: 0,
},
)),
)
}

Expand Down Expand Up @@ -262,18 +267,5 @@ impl<'a> MatterStack<'a, WifiBle> {
pub type WifiBleRootEndpointHandler<'a> = RootEndpointHandler<
'a,
comm::WifiNwCommCluster<'a, MAX_WIFI_NETWORKS, NoopRawMutex>,
HandlerCompat<diag::WifiNwDiagCluster>,
HandlerCompat<WifiNwDiagCluster>,
>;

const CLUSTERS: [Cluster<'static>; 10] = [
descriptor::CLUSTER,
cluster_basic_information::CLUSTER,
general_commissioning::CLUSTER,
nw_commissioning::WIFI_CLUSTER,
admin_commissioning::CLUSTER,
noc::CLUSTER,
access_control::CLUSTER,
general_diagnostics::CLUSTER,
diag::CLUSTER,
group_key_management::CLUSTER,
];
1 change: 0 additions & 1 deletion src/wifi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ use rs_matter::utils::notification::Notification;
use rs_matter::utils::writebuf::WriteBuf;

pub mod comm;
pub mod diag;
pub mod mgmt;

#[derive(Debug, Clone, ToTLV, FromTLV)]
Expand Down
Loading

0 comments on commit 45e9c91

Please sign in to comment.