use crate::Addresses;
use crate::frame::components::{FrameControl, MacAddress, SequenceControl};
#[derive(Clone, Debug)]
pub enum BlockAckMode {
BasicBlockAck,
CompressedBlockAck,
MultiTidBlockAck,
}
#[derive(Clone, Debug)]
pub enum BlockAckInfo {
Basic((u8, SequenceControl, [u8; 128])),
Compressed(Vec<(u8, SequenceControl, u64)>),
}
#[derive(Clone, Debug)]
pub struct BlockAckRequest {
pub frame_control: FrameControl,
pub duration: [u8; 2],
pub source: MacAddress,
pub destination: MacAddress,
pub policy: bool,
pub mode: BlockAckMode,
pub requested_tids: Vec<(u8, SequenceControl)>,
}
impl Addresses for BlockAckRequest {
fn src(&self) -> Option<&MacAddress> {
Some(&self.source)
}
fn dest(&self) -> &MacAddress {
&self.destination
}
fn bssid(&self) -> Option<&MacAddress> {
None
}
}
#[derive(Clone, Debug)]
pub struct BlockAck {
pub frame_control: FrameControl,
pub duration: [u8; 2],
pub source: MacAddress,
pub destination: MacAddress,
pub policy: bool,
pub mode: BlockAckMode,
pub acks: BlockAckInfo,
}
impl Addresses for BlockAck {
fn src(&self) -> Option<&MacAddress> {
Some(&self.source)
}
fn dest(&self) -> &MacAddress {
&self.destination
}
fn bssid(&self) -> Option<&MacAddress> {
None
}
}