use super::{FrameControl, MacAddress, SequenceControl};
use crate::traits::Addresses;
#[derive(Clone, Debug)]
pub struct ManagementHeader {
pub frame_control: FrameControl,
pub duration: [u8; 2],
pub address_1: MacAddress,
pub address_2: MacAddress,
pub address_3: MacAddress,
pub sequence_control: SequenceControl,
}
impl ManagementHeader {
pub fn encode(&self) -> Vec<u8> {
let mut bytes = Vec::new();
bytes.extend_from_slice(&self.frame_control.encode());
bytes.extend_from_slice(&self.duration);
bytes.extend_from_slice(&self.address_1.encode());
bytes.extend_from_slice(&self.address_2.encode());
bytes.extend_from_slice(&self.address_3.encode());
bytes.extend_from_slice(&self.sequence_control.encode());
bytes
}
}
impl Addresses for ManagementHeader {
fn src(&self) -> Option<&MacAddress> {
let frame_control = &self.frame_control;
if frame_control.to_ds() {
Some(&self.address_3)
} else if frame_control.from_ds() {
Some(&self.address_1)
} else {
Some(&self.address_2)
}
}
fn dest(&self) -> &MacAddress {
let frame_control = &self.frame_control;
if frame_control.to_ds() && frame_control.from_ds() {
&self.address_3
} else if frame_control.to_ds() {
&self.address_2
} else if frame_control.from_ds() {
&self.address_3
} else {
&self.address_1
}
}
fn bssid(&self) -> Option<&MacAddress> {
let frame_control = &self.frame_control;
if frame_control.to_ds() {
Some(&self.address_1)
} else if frame_control.from_ds() {
Some(&self.address_2)
} else {
Some(&self.address_3)
}
}
}
#[derive(Clone, Debug)]
pub struct DataHeader {
pub frame_control: FrameControl,
pub duration: [u8; 2],
pub address_1: MacAddress,
pub address_2: MacAddress,
pub address_3: MacAddress,
pub sequence_control: SequenceControl,
pub address_4: Option<MacAddress>,
pub qos: Option<[u8; 2]>,
}
impl DataHeader {
pub fn encode(&self) -> Vec<u8> {
let mut bytes = Vec::new();
bytes.extend_from_slice(&self.frame_control.encode());
bytes.extend_from_slice(&self.duration);
bytes.extend_from_slice(&self.address_1.encode());
bytes.extend_from_slice(&self.address_2.encode());
bytes.extend_from_slice(&self.address_3.encode());
bytes.extend_from_slice(&self.sequence_control.encode());
if let Some(addr) = &self.address_4 {
bytes.extend_from_slice(&addr.encode());
}
if let Some(qos) = &self.qos {
bytes.extend_from_slice(qos);
}
bytes
}
pub fn ra(&self) -> MacAddress {
self.address_1 }
pub fn ta(&self) -> MacAddress {
self.address_2 }
pub fn da(&self) -> MacAddress {
if self.frame_control.to_ds() && self.frame_control.from_ds() {
self.address_3
} else if self.frame_control.to_ds() {
self.address_3
} else if self.frame_control.from_ds() {
self.address_1
} else {
self.address_1 }
}
pub fn sa(&self) -> Option<MacAddress> {
if self.frame_control.to_ds() && self.frame_control.from_ds() {
self.address_4
} else if self.frame_control.to_ds() {
Some(self.address_2)
} else if self.frame_control.from_ds() {
Some(self.address_3)
} else {
Some(self.address_2) }
}
}
impl Addresses for DataHeader {
fn src(&self) -> Option<&MacAddress> {
if self.frame_control.to_ds() && self.frame_control.from_ds() {
self.address_4.as_ref()
} else if self.frame_control.to_ds() {
Some(&self.address_3)
} else if self.frame_control.from_ds() {
Some(&self.address_1)
} else {
Some(&self.address_2)
}
}
fn dest(&self) -> &MacAddress {
if self.frame_control.to_ds() && self.frame_control.from_ds() {
&self.address_3
} else if self.frame_control.to_ds() {
&self.address_2
} else if self.frame_control.from_ds() {
&self.address_3
} else {
&self.address_1
}
}
fn bssid(&self) -> Option<&MacAddress> {
if self.frame_control.to_ds() && self.frame_control.from_ds() {
None
} else if self.frame_control.to_ds() {
Some(&self.address_1)
} else if self.frame_control.from_ds() {
Some(&self.address_2)
} else {
self.address_4.as_ref()
}
}
}