slapy 0.0.4

A much faster scapy
Documentation
use super::{dot11_frame::SequenceControllField, Dot11Frame, MAC};

#[derive(Debug, Clone)]
pub struct Dot11ControlFrame {
    pub dot11frame: Dot11Frame,
    pub frame_sub_type: u8,
    pub addr1: MAC,
    pub addr2: Option<MAC>,
    pub seq_control: Option<SequenceControllField>,
    pub ht_control: Option<[u8; 4]>,
}

impl Dot11ControlFrame {
    pub fn parse_from_dot11_frame(dot11frame: Dot11Frame) -> Result<Self, String> {
        let frame_sub_type = dot11frame.frame_sub_type;
        let addr1 = dot11frame.addr1;
        Ok(Self {
            dot11frame: dot11frame.clone(),
            frame_sub_type,
            addr1,
            addr2: dot11frame.addr2,
            seq_control: dot11frame.seq_control.clone(),
            ht_control: dot11frame.ht_control.clone(),
        })
    }

    pub fn parse(packet: &[u8]) -> Result<Self, String> {
        match Dot11Frame::parse(packet) {
            Ok(dot11frame) => Self::parse_from_dot11_frame(dot11frame),
            Err(e) => Err(format!("Unable to parse Dot11Frame: {e}")),
        }
    }

    pub fn as_bytes(&self) -> Vec<u8> {
        let mut ctrl_frame = Vec::new();
        ctrl_frame.extend_from_slice(&self.dot11frame.frame_control);
        ctrl_frame.extend_from_slice(&self.dot11frame.duration.to_le_bytes());
        ctrl_frame.extend_from_slice(self.addr1.as_bytes());
        if let Some(a2) = self.addr2 {
            ctrl_frame.extend_from_slice(a2.as_bytes());
        }
        if let Some(sc) = self.seq_control {
            ctrl_frame.extend_from_slice(&sc.as_bytes());
        }
        if let Some(ht) = self.ht_control {
            ctrl_frame.extend_from_slice(&ht);
        }
        self.dot11frame.as_bytes(ctrl_frame)
    }
}