dot15d4_frame/repr/
addressing.rsuse super::FrameControlRepr;
use crate::{Address, AddressingFields, AddressingMode, Error, FrameType, Result};
#[derive(Debug, Default)]
#[cfg_attr(feature = "fuzz", derive(arbitrary::Arbitrary))]
pub struct AddressingFieldsRepr {
pub dst_pan_id: Option<u16>,
pub dst_address: Option<Address>,
pub src_pan_id: Option<u16>,
pub src_address: Option<Address>,
}
impl AddressingFieldsRepr {
pub fn parse(addressing: AddressingFields<&'_ [u8], &'_ [u8]>) -> Self {
Self {
dst_pan_id: addressing.dst_pan_id(),
dst_address: addressing.dst_address(),
src_pan_id: addressing.src_pan_id(),
src_address: addressing.src_address(),
}
}
pub fn validate(&self, fc: &FrameControlRepr) -> Result<()> {
if fc.frame_type == FrameType::Data
&& matches!(
(
self.dst_pan_id,
self.dst_address,
self.src_pan_id,
self.src_address
),
(None, None, None, None)
)
{
return Err(Error);
}
Ok(())
}
pub fn buffer_len(&self, fc: &FrameControlRepr) -> usize {
(match self.dst_pan_id {
Some(_) => 2,
None => 0,
}) + match fc.dst_addressing_mode {
AddressingMode::Absent => 0,
AddressingMode::Short => 2,
AddressingMode::Extended => 8,
_ => unreachable!(),
} + match self.src_pan_id {
Some(_) => 2,
None => 0,
} + match fc.src_addressing_mode {
AddressingMode::Absent => 0,
AddressingMode::Short => 2,
AddressingMode::Extended => 8,
_ => unreachable!(),
}
}
pub fn emit(&self, _buffer: &AddressingFields<&'_ mut [u8], &'_ [u8]>) {
todo!();
}
}