use nom::{Parser, bytes::complete::take, combinator::opt};
use super::{clone_slice, parse_mac, parse_sequence_control};
use crate::{
error::Error,
frame::components::{DataHeader, FrameControl, ManagementHeader},
};
pub fn parse_management_header(
frame_control: FrameControl,
input: &[u8],
) -> Result<(&[u8], ManagementHeader), Error> {
let (remaining, (duration, address_1, address_2, address_3, sequence_control)) = (
take(2usize),
parse_mac,
parse_mac,
parse_mac,
parse_sequence_control,
)
.parse(input)?;
let duration = clone_slice::<2>(duration);
Ok((
remaining,
ManagementHeader {
frame_control,
duration,
address_1,
address_2,
address_3,
sequence_control,
},
))
}
pub fn parse_data_header(
frame_control: FrameControl,
input: &[u8],
) -> Result<(&[u8], DataHeader), Error> {
let (mut remaining, (duration, address_1, address_2, address_3, sequence_control)) = (
take(2usize),
parse_mac,
parse_mac,
parse_mac,
parse_sequence_control,
)
.parse(input)?;
let duration = clone_slice::<2>(duration);
let mut address_4 = None;
if frame_control.to_ds() && frame_control.from_ds() {
(remaining, address_4) = opt(parse_mac).parse(remaining)?;
};
let mut qos = None;
if frame_control.frame_subtype.is_qos() {
let (_remaining, qos_bytes) = take(2usize)(remaining)?;
qos = Some(clone_slice::<2>(qos_bytes));
remaining = _remaining;
}
Ok((
remaining,
DataHeader {
frame_control,
duration,
address_1,
address_2,
address_3,
sequence_control,
address_4,
qos,
},
))
}