Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion crates/ziggurat-driver/src/zigbee_stack.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::ziggurat_ieee_802154::{Ieee802154Address, Ieee802154Frame};
use crate::ziggurat_ieee_802154::{Ieee802154Address, Ieee802154Frame, ParseError};

use crate::frame_token::{self, FrameToken, TrafficClass};
use crate::runtime::{Elapsed, RtInstant, Runtime, Spawn};
Expand Down Expand Up @@ -1331,6 +1331,10 @@ impl<P: RadioPhy, R: Runtime> ZigbeeStack<P, R> {
tracing::trace!("Received 802.15.4 frame: {frame:?}");
return (packet, frame);
}
Err(e @ ParseError::Unsupported(_)) => {
tracing::debug!("Ignoring unsupported IEEE 802.15.4 frame: {e:?}");
continue;
}
Err(e) => {
tracing::warn!("Error parsing IEEE 802.15.4 frame: {e:?}");
continue;
Expand Down
4 changes: 2 additions & 2 deletions crates/ziggurat-driver/src/zigbee_stack/joining.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use crate::ziggurat_ieee_802154::commands::{
use crate::ziggurat_ieee_802154::{
Ieee802154Address, Ieee802154AddressingMode, Ieee802154AssociationStatus,
Ieee802154CommandFrame, Ieee802154CommandPayload, Ieee802154Frame, Ieee802154FrameControl,
Ieee802154FrameHeader, Ieee802154FrameType,
Ieee802154FrameHeader, Ieee802154FrameType, Ieee802154FrameVersion,
};
use ziggurat_ieee_802154::FrameBytes;
use ziggurat_ieee_802154::types::{Eui64, Key, Nwk};
Expand Down Expand Up @@ -384,7 +384,7 @@ impl<P: RadioPhy, R: Runtime> ZigbeeStack<P, R> {
sequence_number_suppression: false,
information_elements_present: false,
dest_addr_mode: Ieee802154AddressingMode::Long,
frame_version: 0,
frame_version: Ieee802154FrameVersion::Ieee2003,
src_addr_mode: Ieee802154AddressingMode::Long,
},
sequence_number: Some(sequence_number),
Expand Down
5 changes: 3 additions & 2 deletions crates/ziggurat-driver/src/zigbee_stack/mac.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use crate::runtime::Runtime;
use crate::ziggurat_ieee_802154::{
Ieee802154Address, Ieee802154AddressingMode, Ieee802154CommandFrame, Ieee802154DataFrame,
Ieee802154Frame, Ieee802154FrameControl, Ieee802154FrameHeader, Ieee802154FrameType,
Ieee802154FrameVersion,
};
use abstract_bits::AbstractBits;
use alloc::vec::Vec;
Expand Down Expand Up @@ -99,7 +100,7 @@ impl<P: RadioPhy, R: Runtime> ZigbeeStack<P, R> {
sequence_number_suppression: false,
information_elements_present: false,
dest_addr_mode: Ieee802154AddressingMode::None,
frame_version: 0,
frame_version: Ieee802154FrameVersion::Ieee2003,
src_addr_mode: Ieee802154AddressingMode::Short,
},
sequence_number: Some(ieee802154_sequence_number),
Expand Down Expand Up @@ -201,7 +202,7 @@ impl<P: RadioPhy, R: Runtime> ZigbeeStack<P, R> {
sequence_number_suppression: false,
information_elements_present: false,
dest_addr_mode: Ieee802154AddressingMode::Short,
frame_version: 0,
frame_version: Ieee802154FrameVersion::Ieee2003,
src_addr_mode: Ieee802154AddressingMode::None,
},
sequence_number: Some(sequence_number),
Expand Down
6 changes: 3 additions & 3 deletions crates/ziggurat-driver/src/zigbee_stack/nwk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use crate::runtime::{Elapsed, Runtime};
use crate::signal;
use crate::ziggurat_ieee_802154::{
Ieee802154Address, Ieee802154AddressingMode, Ieee802154DataFrame, Ieee802154Frame,
Ieee802154FrameControl, Ieee802154FrameHeader, Ieee802154FrameType,
Ieee802154FrameControl, Ieee802154FrameHeader, Ieee802154FrameType, Ieee802154FrameVersion,
};
use alloc::boxed::Box;
use alloc::collections::BinaryHeap;
Expand Down Expand Up @@ -846,7 +846,7 @@ impl<P: RadioPhy, R: Runtime> ZigbeeStack<P, R> {
sequence_number_suppression: false,
information_elements_present: false,
dest_addr_mode: Ieee802154AddressingMode::Short,
frame_version: 0,
frame_version: Ieee802154FrameVersion::Ieee2003,
src_addr_mode: Ieee802154AddressingMode::Short,
},
sequence_number: Some(ieee802154_sequence_number),
Expand Down Expand Up @@ -1763,7 +1763,7 @@ impl<P: RadioPhy, R: Runtime> ZigbeeStack<P, R> {
sequence_number_suppression: false,
information_elements_present: false,
dest_addr_mode: Ieee802154AddressingMode::Short,
frame_version: 0,
frame_version: Ieee802154FrameVersion::Ieee2003,
src_addr_mode: Ieee802154AddressingMode::Short,
},
sequence_number: Some(ieee802154_sequence_number),
Expand Down
48 changes: 39 additions & 9 deletions crates/ziggurat-ieee-802154/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,20 @@ pub enum Ieee802154FrameType {
Ack = 0b010,
}

/// Frame Version field (IEEE Std 802.15.4-2020, Table 7-4).
#[abstract_bits(bits = 2)]
#[derive(Debug, Eq, PartialEq, Clone, Copy)]
#[repr(u8)]
pub enum Ieee802154FrameVersion {
/// IEEE Std 802.15.4-2003
Ieee2003 = 0b00,
/// IEEE Std 802.15.4-2006
Ieee2006 = 0b01,
/// IEEE Std 802.15.4-2015 and later; enables IEs, enhanced beacons/acks
Ieee2015 = 0b10,
Reserved = 0b11,
}

#[derive(Debug, Eq, PartialEq, Copy, Clone, TryFromPrimitive)]
#[abstract_bits(bits = 8)]
#[repr(u8)]
Expand Down Expand Up @@ -82,7 +96,7 @@ pub struct Ieee802154FrameControl {
pub sequence_number_suppression: bool,
pub information_elements_present: bool,
pub dest_addr_mode: Ieee802154AddressingMode,
pub frame_version: u2,
pub frame_version: Ieee802154FrameVersion,
pub src_addr_mode: Ieee802154AddressingMode,
}

Expand Down Expand Up @@ -430,6 +444,13 @@ impl Ieee802154Frame<FrameBytes> {
// Branch based on frame type
match header.frame_control.frame_type {
Ieee802154FrameType::Beacon => {
if !matches!(
header.frame_control.frame_version,
Ieee802154FrameVersion::Ieee2003 | Ieee802154FrameVersion::Ieee2006
) {
return Err(ParseError::Unsupported("Enhanced Beacon frame"));
}

if remaining.len() < 4 {
return Err(ParseError::UnexpectedEnd {
ty: "Ieee802154BeaconFrame",
Expand Down Expand Up @@ -611,7 +632,10 @@ mod test {
frame_control.dest_addr_mode,
Ieee802154AddressingMode::Short
);
assert_eq!(frame_control.frame_version, 0);
assert_eq!(
frame_control.frame_version,
Ieee802154FrameVersion::Ieee2003
);
assert_eq!(frame_control.src_addr_mode, Ieee802154AddressingMode::Short);

assert_eq!(remaining, [0xFF]);
Expand Down Expand Up @@ -645,7 +669,10 @@ mod test {
data_frame.header.frame_control.dest_addr_mode,
Ieee802154AddressingMode::Short
);
assert_eq!(data_frame.header.frame_control.frame_version, 0);
assert_eq!(
data_frame.header.frame_control.frame_version,
Ieee802154FrameVersion::Ieee2003
);
assert_eq!(
data_frame.header.frame_control.src_addr_mode,
Ieee802154AddressingMode::Short
Expand Down Expand Up @@ -696,7 +723,10 @@ mod test {
let frame = Ieee802154Frame::from_bytes(&bytes).unwrap();

if let Ieee802154Frame::Ack(ack_frame) = frame {
assert_eq!(ack_frame.header.frame_control.frame_version, 0);
assert_eq!(
ack_frame.header.frame_control.frame_version,
Ieee802154FrameVersion::Ieee2003
);
assert_eq!(
ack_frame.header.frame_control.src_addr_mode,
Ieee802154AddressingMode::None
Expand Down Expand Up @@ -736,7 +766,7 @@ mod test {
sequence_number_suppression: false,
information_elements_present: false,
dest_addr_mode: Ieee802154AddressingMode::Short,
frame_version: 0,
frame_version: Ieee802154FrameVersion::Ieee2003,
src_addr_mode: Ieee802154AddressingMode::Short,
},
sequence_number: Some(52),
Expand Down Expand Up @@ -771,7 +801,7 @@ mod test {
sequence_number_suppression: false,
information_elements_present: false,
dest_addr_mode: Ieee802154AddressingMode::Short,
frame_version: 0,
frame_version: Ieee802154FrameVersion::Ieee2003,
src_addr_mode: Ieee802154AddressingMode::Short,
},
sequence_number: Some(3),
Expand Down Expand Up @@ -810,7 +840,7 @@ mod test {
sequence_number_suppression: false,
information_elements_present: false,
dest_addr_mode: Ieee802154AddressingMode::Short,
frame_version: 0,
frame_version: Ieee802154FrameVersion::Ieee2003,
src_addr_mode: Ieee802154AddressingMode::Short,
},
sequence_number: Some(3),
Expand Down Expand Up @@ -847,7 +877,7 @@ mod test {
sequence_number_suppression: false,
information_elements_present: false,
dest_addr_mode: Ieee802154AddressingMode::Short,
frame_version: 0,
frame_version: Ieee802154FrameVersion::Ieee2003,
src_addr_mode: Ieee802154AddressingMode::None,
},
sequence_number: Some(109),
Expand Down Expand Up @@ -883,7 +913,7 @@ mod test {
sequence_number_suppression: false,
information_elements_present: false,
dest_addr_mode: Ieee802154AddressingMode::Short,
frame_version: 0,
frame_version: Ieee802154FrameVersion::Ieee2003,
src_addr_mode: Ieee802154AddressingMode::Long,
},
sequence_number: Some(19),
Expand Down