use macaddr::MacAddr8;
use silizium::zigbee::security::man::Key;
use crate::ember::join::Method;
use crate::ember::network::Parameters;
use crate::ember::security::initial::{Bitmask, State};
use crate::ncp::network_credentials::NetworkCredentials;
const DEFAULT_NWK_MANAGER_ID: u16 = 0x0000;
const DEFAULT_NWK_UPDATE_ID: u8 = 0x00;
const CHANNEL_BIT: u32 = 1;
const NETWORK_KEY_SEQUENCE_NUMBER: u8 = 0;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct InitializationParameters {
network_credentials: NetworkCredentials,
link_key: Key,
radio_channel: u8,
join_method: Method,
bitmask: Bitmask,
nwk_manager_id: u16,
nwk_update_id: u8,
}
impl InitializationParameters {
#[must_use]
pub const fn new(
network_credentials: NetworkCredentials,
link_key: Key,
radio_channel: u8,
join_method: Method,
bitmask: Bitmask,
) -> Self {
Self {
network_credentials,
link_key,
radio_channel,
join_method,
bitmask,
nwk_manager_id: DEFAULT_NWK_MANAGER_ID,
nwk_update_id: DEFAULT_NWK_UPDATE_ID,
}
}
#[must_use]
pub fn initial_security_state(&self) -> State {
State::new(
self.bitmask
| Bitmask::TRUST_CENTER_GLOBAL_LINK_KEY
| Bitmask::HAVE_PRECONFIGURED_KEY
| Bitmask::REQUIRE_ENCRYPTED_KEY
| Bitmask::HAVE_NETWORK_KEY,
self.link_key,
self.network_credentials.network_key,
NETWORK_KEY_SEQUENCE_NUMBER,
MacAddr8::default(),
)
}
#[must_use]
pub fn parameters(&self, radio_tx_power: i8) -> Parameters {
Parameters::new(
self.network_credentials.extended_pan_id,
self.network_credentials.pan_id,
radio_tx_power,
self.radio_channel,
self.join_method,
self.nwk_manager_id,
self.nwk_update_id,
CHANNEL_BIT << self.radio_channel,
)
}
}