diff --git a/embassy-stm32-wpan/src/sub/mac/commands.rs b/embassy-stm32-wpan/src/sub/mac/commands.rs index 3c234a3c..4965a46e 100644 --- a/embassy-stm32-wpan/src/sub/mac/commands.rs +++ b/embassy-stm32-wpan/src/sub/mac/commands.rs @@ -11,6 +11,7 @@ pub trait MacCommand { } /// MLME ASSOCIATE Request used to request an association +#[repr(C)] pub struct AssociateRequest { /// the logical channel on which to attempt association pub channel_number: u8, @@ -40,6 +41,7 @@ impl MacCommand for AssociateRequest { } /// MLME DISASSOCIATE Request sed to request a disassociation +#[repr(C)] pub struct DisassociateRequest { /// device addressing mode used pub device_addr_mode: AddressMode, @@ -67,6 +69,7 @@ impl MacCommand for DisassociateRequest { } /// MLME GET Request used to request a PIB value +#[repr(C)] pub struct GetRequest { /// the name of the PIB attribute to read pub pib_attribute: PibId, @@ -78,6 +81,7 @@ impl MacCommand for GetRequest { } /// MLME GTS Request used to request and maintain GTSs +#[repr(C)] pub struct GtsRequest { /// the characteristics of the GTS pub characteristics: GtsCharacteristics, @@ -96,6 +100,7 @@ impl MacCommand for GtsRequest { const SIZE: usize = 12; } +#[repr(C)] pub struct ResetRequest { /// MAC PIB attributes are set to their default values or not during reset pub set_default_pib: bool, @@ -108,6 +113,7 @@ impl MacCommand for ResetRequest { /// MLME RX ENABLE Request used to request that the receiver is either enabled /// for a finite period of time or disabled +#[repr(C)] pub struct RxEnableRequest { /// the request operation can be deferred or not pub defer_permit: bool, @@ -138,6 +144,7 @@ impl MacCommand for RxEnableRequest { } /// MLME SCAN Request used to initiate a channel scan over a given list of channels +#[repr(C)] pub struct ScanRequest { /// the type of scan to be performed pub scan_type: u8, @@ -179,6 +186,7 @@ impl MacCommand for SetRequest { /// MLME START Request used by the FFDs to intiate a new PAN or to begin using a new superframe /// configuration #[derive(Default)] +#[repr(C)] pub struct StartRequest { /// PAN indentifier to used by the device pub pan_id: [u8; 2], @@ -221,6 +229,7 @@ impl MacCommand for StartRequest { /// MLME SYNC Request used to synchronize with the coordinator by acquiring and, if /// specified, tracking its beacons +#[repr(C)] pub struct SyncRequest { /// the channel number on which to attempt coordinator synchronization pub channel_number: u8, @@ -239,6 +248,7 @@ impl MacCommand for SyncRequest { } /// MLME POLL Request propmts the device to request data from the coordinator +#[repr(C)] pub struct PollRequest { /// addressing mode of the coordinator pub coord_addr_mode: AddressMode, @@ -263,6 +273,7 @@ impl MacCommand for PollRequest { /// MLME DPS Request allows the next higher layer to request that the PHY utilize a /// given pair of preamble codes for a single use pending expiration of the DPSIndexDuration +#[repr(C)] pub struct DpsRequest { /// the index value for the transmitter tx_dps_index: u8, @@ -280,6 +291,7 @@ impl MacCommand for DpsRequest { /// MLME SOUNDING request primitive which is used by the next higher layer to request that /// the PHY respond with channel sounding information +#[repr(C)] pub struct SoundingRequest; impl MacCommand for SoundingRequest { @@ -289,6 +301,7 @@ impl MacCommand for SoundingRequest { /// MLME CALIBRATE request primitive which used to obtain the results of a ranging /// calibration request from an RDEV +#[repr(C)] pub struct CalibrateRequest; impl MacCommand for CalibrateRequest { @@ -297,6 +310,7 @@ impl MacCommand for CalibrateRequest { } /// MCPS DATA Request used for MAC data related requests from the application +#[repr(C)] pub struct DataRequest { /// the handle assocated with the MSDU to be transmitted pub msdu_ptr: *const u8, @@ -344,6 +358,7 @@ impl MacCommand for DataRequest { } /// for MCPS PURGE Request used to purge an MSDU from the transaction queue +#[repr(C)] pub struct PurgeRequest { /// the handle associated with the MSDU to be purged from the transaction /// queue @@ -356,6 +371,7 @@ impl MacCommand for PurgeRequest { } /// MLME ASSOCIATE Response used to initiate a response to an MLME-ASSOCIATE.indication +#[repr(C)] pub struct AssociateResponse { /// extended address of the device requesting association pub device_address: [u8; 8], @@ -380,6 +396,7 @@ impl MacCommand for AssociateResponse { } /// MLME ORPHAN Response used to respond to the MLME ORPHAN Indication +#[repr(C)] pub struct OrphanResponse { /// extended address of the orphaned device pub orphan_address: [u8; 8], diff --git a/embassy-stm32-wpan/src/sub/mac/consts.rs b/embassy-stm32-wpan/src/sub/mac/consts.rs new file mode 100644 index 00000000..dfbbadc6 --- /dev/null +++ b/embassy-stm32-wpan/src/sub/mac/consts.rs @@ -0,0 +1,3 @@ +pub const MAX_ED_SCAN_RESULTS_SUPPORTED: usize = 16; +pub const MAX_PAN_DESC_SUPPORTED: usize = 6; +pub const MAX_SOUNDING_LIST_SUPPORTED: usize = 6; diff --git a/embassy-stm32-wpan/src/sub/mac/mod.rs b/embassy-stm32-wpan/src/sub/mac/mod.rs index 8e117d97..6a3a057f 100644 --- a/embassy-stm32-wpan/src/sub/mac/mod.rs +++ b/embassy-stm32-wpan/src/sub/mac/mod.rs @@ -16,8 +16,9 @@ use crate::evt::{EvtBox, EvtPacket}; use crate::tables::{MAC_802_15_4_CMD_BUFFER, MAC_802_15_4_NOTIF_RSP_EVT_BUFFER}; use crate::{channels, evt}; -mod opcodes; pub mod commands; +mod consts; +mod opcodes; pub mod responses; pub mod typedefs; diff --git a/embassy-stm32-wpan/src/sub/mac/responses.rs b/embassy-stm32-wpan/src/sub/mac/responses.rs index e69de29b..7b240f37 100644 --- a/embassy-stm32-wpan/src/sub/mac/responses.rs +++ b/embassy-stm32-wpan/src/sub/mac/responses.rs @@ -0,0 +1,168 @@ +use super::consts::{MAX_ED_SCAN_RESULTS_SUPPORTED, MAX_PAN_DESC_SUPPORTED, MAX_SOUNDING_LIST_SUPPORTED}; +use super::typedefs::{AddressMode, MacAddress, PanDescriptor}; + +pub trait MacResponse { + const SIZE: usize; + + fn parse(buf: &[u8]) -> Self; +} + +/// MLME ASSOCIATE Confirm used to inform of the initiating device whether +/// its request to associate was successful or unsuccessful +pub struct AssociateConfirm { + /// short address allocated by the coordinator on successful association + pub assoc_short_address: [u8; 2], + /// status of the association request + pub status: u8, + /// security level to be used + pub security_level: u8, + /// the originator of the key to be used + pub key_source: [u8; 8], + /// the mode used to identify the key to be used + pub key_id_mode: u8, + /// the index of the key to be used + pub key_index: u8, +} + +/// MLME DISASSOCIATE Confirm used to send disassociation Confirmation to the application. +pub struct DisassociateConfirm { + /// status of the disassociation attempt + pub status: u8, + /// device addressing mode used + pub device_addr_mode: AddressMode, + /// the identifier of the PAN of the device + pub device_pan_id: [u8; 2], + /// device address + pub device_address: MacAddress, +} + +/// MLME GET Confirm which requests information about a given PIB attribute +pub struct GetConfirm { + /// The pointer to the value of the PIB attribute attempted to read + pub pib_attribute_value_ptr: *const u8, + /// Status of the GET attempt + pub status: u8, + /// The name of the PIB attribute attempted to read + pub pib_attribute: u8, + /// The lenght of the PIB attribute Value return + pub pib_attribute_value_len: u8, +} + +/// MLME GTS Confirm which eports the results of a request to allocate a new GTS +/// or to deallocate an existing GTS +pub struct GtsConfirm { + /// The characteristics of the GTS + pub gts_characteristics: u8, + /// The status of the GTS reques + pub status: u8, +} + +/// MLME RESET Confirm which is used to report the results of the reset operation +pub struct ResetConfirm { + /// The result of the reset operation + status: u8, +} + +/// MLME RX ENABLE Confirm which is used to report the results of the attempt +/// to enable or disable the receiver +pub struct RxEnableConfirm { + /// Result of the request to enable or disable the receiver + status: u8, +} + +/// MLME SCAN Confirm which is used to report the result of the channel scan request +pub struct ScanConfirm { + /// Status of the scan request + pub status: u8, + /// The type of scan performed + pub scan_type: u8, + /// Channel page on which the scan was performed + pub channel_page: u8, + /// Channels given in the request which were not scanned + pub unscanned_channels: [u8; 4], + /// Number of elements returned in the appropriate result lists + pub result_list_size: u8, + /// List of energy measurements + pub energy_detect_list: [u8; MAX_ED_SCAN_RESULTS_SUPPORTED], + /// List of PAN descriptors + pub pan_descriptor_list: [PanDescriptor; MAX_PAN_DESC_SUPPORTED], + /// Categorization of energy detected in channel + pub detected_category: u8, + /// For UWB PHYs, the list of energy measurements taken + pub uwb_energy_detect_list: [u8; MAX_ED_SCAN_RESULTS_SUPPORTED], +} + +/// MLME SET Confirm which reports the result of an attempt to write a value to a PIB attribute +pub struct SetConfirm { + /// The result of the set operation + pub status: u8, + /// The name of the PIB attribute that was written + pub pin_attribute: u8, +} + +/// MLME START Confirm which is used to report the results of the attempt to +/// start using a new superframe configuration +pub struct StartConfirm { + /// Result of the attempt to start using an updated superframe configuration + pub status: u8, +} + +/// MLME POLL Confirm which is used to report the result of a request to poll the coordinator for data +pub struct PollConfirm { + /// The status of the data request + pub status: u8, +} + +/// MLME SOUNDING Confirm which reports the result of a request to the PHY to provide +/// channel sounding information +pub struct SoundingConfirm { + /// Results of the sounding measurement + sounding_list: [u8; MAX_SOUNDING_LIST_SUPPORTED], +} + +/// MLME CALIBRATE Confirm which reports the result of a request to the PHY +/// to provide internal propagation path information +pub struct CalibrateConfirm { + /// The status of the attempt to return sounding data + pub status: u8, + /// A count of the propagation time from the ranging counter + /// to the transmit antenna + pub cal_tx_rmaker_offset: u32, + /// A count of the propagation time from the receive antenna + /// to the ranging counter + pub cal_rx_rmaker_offset: u32, +} + +/// MCPS DATA Confirm which will be used for reporting the results of +/// MAC data related requests from the application +pub struct DataConfirm { + /// The handle associated with the MSDU being confirmed + pub msdu_handle: u8, + /// The time, in symbols, at which the data were transmitted + pub a_time_stamp: [u8; 4], + /// ranging status + pub ranging_received: u8, + /// The status of the last MSDU transmission + pub status: u8, + /// time units corresponding to an RMARKER at the antenna at + /// the beginning of a ranging exchange + pub ranging_counter_start: u32, + /// time units corresponding to an RMARKER at the antenna + /// at the end of a ranging exchange + pub ranging_counter_stop: u32, + /// time units in a message exchange over which the tracking offset was measured + pub ranging_tracking_interval: u32, + /// time units slipped or advanced by the radio tracking system + pub ranging_offset: u32, + /// The FoM characterizing the ranging measurement + pub ranging_fom: u8, +} + +/// MCPS PURGE Confirm which will be used by the MAC to notify the application of +/// the status of its request to purge an MSDU from the transaction queue +pub struct PurgeConfirm { + /// Handle associated with the MSDU requested to be purged from the transaction queue + pub msdu_handle: u8, + /// The status of the request + pub status: u8, +} diff --git a/embassy-stm32-wpan/src/sub/mac/typedefs.rs b/embassy-stm32-wpan/src/sub/mac/typedefs.rs index d43d6e0c..7f0dd75c 100644 --- a/embassy-stm32-wpan/src/sub/mac/typedefs.rs +++ b/embassy-stm32-wpan/src/sub/mac/typedefs.rs @@ -95,3 +95,30 @@ pub union MacAddress { pub struct GtsCharacteristics { pub fields: u8, } + +/// MAC PAN Descriptor which contains the network details of the device from +/// which the beacon is received +pub struct PanDescriptor { + /// PAN identifier of the coordinator + pub a_coord_pan_id: [u8; 2], + /// Coordinator addressing mode + pub coord_addr_mode: AddressMode, + /// The current logical channel occupied by the network + pub logical_channel: u8, + /// Coordinator address + pub coord_addr: MacAddress, + /// The current channel page occupied by the network + pub channel_page: u8, + /// PAN coordinator is accepting GTS requests or not + pub gts_permit: bool, + /// Superframe specification as specified in the received beacon frame + pub a_superframe_spec: [u8; 2], + /// The time at which the beacon frame was received, in symbols + pub a_time_stamp: [u8; 4], + /// The LQI at which the network beacon was received + pub link_quality: u8, + /// Security level purportedly used by the received beacon frame + pub security_level: u8, + /// Byte Stuffing to keep 32 bit alignment + pub a_stuffing: [u8; 2], +}