dot15d4_frame/repr/
frame_control.rs

1use super::super::Result;
2use super::super::{AddressingMode, FrameControl, FrameType, FrameVersion};
3
4/// A high-level representation of the IEEE 802.15.4 Frame Control field.
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6#[cfg_attr(feature = "fuzz", derive(arbitrary::Arbitrary))]
7pub struct FrameControlRepr {
8    /// Frame type.
9    pub frame_type: FrameType,
10    /// Security enabled.
11    pub security_enabled: bool,
12    /// Frame pending.
13    pub frame_pending: bool,
14    /// Acknowledgement request.
15    pub ack_request: bool,
16    /// PAN ID compression.
17    pub pan_id_compression: bool,
18    /// Sequence number suppression.
19    pub sequence_number_suppression: bool,
20    /// Information elements present.
21    pub information_elements_present: bool,
22    /// Destination addressing mode.
23    pub dst_addressing_mode: AddressingMode,
24    /// Source addressing mode.
25    pub src_addressing_mode: AddressingMode,
26    /// Frame version.
27    pub frame_version: FrameVersion,
28}
29
30impl FrameControlRepr {
31    /// Parse an IEEE 802.15.4 Frame Control field.
32    pub fn parse(fc: FrameControl<&[u8]>) -> Result<Self> {
33        Ok(Self {
34            frame_type: fc.frame_type(),
35            security_enabled: fc.security_enabled(),
36            frame_pending: fc.frame_pending(),
37            ack_request: fc.ack_request(),
38            pan_id_compression: fc.pan_id_compression(),
39            sequence_number_suppression: fc.sequence_number_suppression(),
40            information_elements_present: fc.information_elements_present(),
41            dst_addressing_mode: fc.dst_addressing_mode(),
42            src_addressing_mode: fc.src_addressing_mode(),
43            frame_version: fc.frame_version(),
44        })
45    }
46
47    /// Return the length of the frame control field when emitted into a buffer.
48    pub const fn buffer_len(&self) -> usize {
49        2
50    }
51
52    /// Emit the frame control field into a buffer.
53    pub fn emit(&self, fc: &mut FrameControl<&mut [u8]>) {
54        fc.set_frame_type(self.frame_type);
55        fc.set_security_enabled(self.security_enabled);
56        fc.set_frame_pending(self.frame_pending);
57        fc.set_ack_request(self.ack_request);
58        fc.set_pan_id_compression(self.pan_id_compression);
59        fc.set_sequence_number_suppression(self.sequence_number_suppression);
60        fc.set_information_elements_present(self.information_elements_present);
61        fc.set_dst_addressing_mode(self.dst_addressing_mode);
62        fc.set_src_addressing_mode(self.src_addressing_mode);
63        fc.set_frame_version(self.frame_version);
64    }
65}