slapy 0.0.4

A much faster scapy
Documentation
use std::convert::TryFrom;

#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[repr(u8)]
pub enum RadioTapHeaderFlag {
    TSFTMactime = 0,
    Flags = 1,
    Rate = 2,
    Channel = 3,
    FHSS = 4,
    AntennaSignal = 5,
    AntennaNoise = 6,
    LockQuality = 7,
    TXAttenuation = 8,
    DbTXAttenuation = 9,
    DbmTXPower = 10,
    Antenna = 11,
    DbAntennaSignal = 12,
    DbAntennaNoise = 13,
    RxFlags = 14,
    TxFlags = 15,
    Undefined16 = 16,
    Undefined17 = 17,
    Undefined18 = 18,
    MCS = 19,
    AMpduStatus = 20,
    VHT = 21,
    Timestamp = 22,
    HE = 23,
    HEMu = 24,
    HEMuOtherUser = 25,
    ZeroLengthPSDU = 26,
    LSIG = 27,
    Ignore28 = 28,
    RadiotapNamespaceNext = 29,
    VendorNamespaceNext = 30,
}

impl TryFrom<usize> for RadioTapHeaderFlag {
    type Error = ();

    fn try_from(value: usize) -> Result<Self, Self::Error> {
        match value {
            0 => Ok(RadioTapHeaderFlag::TSFTMactime),
            1 => Ok(RadioTapHeaderFlag::Flags),
            2 => Ok(RadioTapHeaderFlag::Rate),
            3 => Ok(RadioTapHeaderFlag::Channel),
            4 => Ok(RadioTapHeaderFlag::FHSS),
            5 => Ok(RadioTapHeaderFlag::AntennaSignal),
            6 => Ok(RadioTapHeaderFlag::AntennaNoise),
            7 => Ok(RadioTapHeaderFlag::LockQuality),
            8 => Ok(RadioTapHeaderFlag::TXAttenuation),
            9 => Ok(RadioTapHeaderFlag::DbTXAttenuation),
            10 => Ok(RadioTapHeaderFlag::DbmTXPower),
            11 => Ok(RadioTapHeaderFlag::Antenna),
            12 => Ok(RadioTapHeaderFlag::DbAntennaSignal),
            13 => Ok(RadioTapHeaderFlag::DbAntennaNoise),
            14 => Ok(RadioTapHeaderFlag::RxFlags),
            15 => Ok(RadioTapHeaderFlag::TxFlags),
            16 => Ok(RadioTapHeaderFlag::Undefined16),
            17 => Ok(RadioTapHeaderFlag::Undefined17),
            18 => Ok(RadioTapHeaderFlag::Undefined18),
            19 => Ok(RadioTapHeaderFlag::MCS),
            20 => Ok(RadioTapHeaderFlag::AMpduStatus),
            21 => Ok(RadioTapHeaderFlag::VHT),
            22 => Ok(RadioTapHeaderFlag::Timestamp),
            23 => Ok(RadioTapHeaderFlag::HE),
            24 => Ok(RadioTapHeaderFlag::HEMu),
            25 => Ok(RadioTapHeaderFlag::HEMuOtherUser),
            26 => Ok(RadioTapHeaderFlag::ZeroLengthPSDU),
            27 => Ok(RadioTapHeaderFlag::LSIG),
            28 => Ok(RadioTapHeaderFlag::Ignore28),
            29 => Ok(RadioTapHeaderFlag::RadiotapNamespaceNext),
            30 => Ok(RadioTapHeaderFlag::VendorNamespaceNext),
            _ => Err(()),
        }
    }
}

impl RadioTapHeaderFlag {
    pub fn num_bytes(&self) -> usize {
        match self {
            RadioTapHeaderFlag::TSFTMactime => 8,
            RadioTapHeaderFlag::Flags => 1,
            RadioTapHeaderFlag::Rate => 1,
            RadioTapHeaderFlag::Channel => 4,
            RadioTapHeaderFlag::FHSS => 2, // alignment confirmation needed
            RadioTapHeaderFlag::AntennaSignal => 1,
            RadioTapHeaderFlag::AntennaNoise => 1,
            RadioTapHeaderFlag::LockQuality => 2,
            RadioTapHeaderFlag::TXAttenuation => 2,
            RadioTapHeaderFlag::DbTXAttenuation => 2,
            RadioTapHeaderFlag::DbmTXPower => 1,
            RadioTapHeaderFlag::Antenna => 1,
            RadioTapHeaderFlag::DbAntennaSignal => 1,
            RadioTapHeaderFlag::DbAntennaNoise => 1,
            RadioTapHeaderFlag::RxFlags => 2,
            RadioTapHeaderFlag::TxFlags => 2,
            RadioTapHeaderFlag::Undefined16 => 0,
            RadioTapHeaderFlag::Undefined17 => 0,
            RadioTapHeaderFlag::Undefined18 => 0,
            RadioTapHeaderFlag::MCS => 3,
            RadioTapHeaderFlag::AMpduStatus => 8,
            RadioTapHeaderFlag::VHT => 12,
            RadioTapHeaderFlag::Timestamp => 12,
            RadioTapHeaderFlag::HE => 12,
            RadioTapHeaderFlag::HEMu => 12,
            RadioTapHeaderFlag::HEMuOtherUser => 6,
            RadioTapHeaderFlag::ZeroLengthPSDU => 1,
            RadioTapHeaderFlag::LSIG => 4,
            RadioTapHeaderFlag::Ignore28 => 0,
            RadioTapHeaderFlag::RadiotapNamespaceNext => 0,
            RadioTapHeaderFlag::VendorNamespaceNext => 0,
        }
    }

    pub fn required_padding(&self) -> usize {
        match self {
            RadioTapHeaderFlag::TSFTMactime => 8,
            RadioTapHeaderFlag::Flags => 1,
            RadioTapHeaderFlag::Rate => 1,
            RadioTapHeaderFlag::Channel => 2,
            RadioTapHeaderFlag::FHSS => 1, // alignment confirmation needed
            RadioTapHeaderFlag::AntennaSignal => 1,
            RadioTapHeaderFlag::AntennaNoise => 1,
            RadioTapHeaderFlag::LockQuality => 2,
            RadioTapHeaderFlag::TXAttenuation => 2,
            RadioTapHeaderFlag::DbTXAttenuation => 2,
            RadioTapHeaderFlag::DbmTXPower => 1,
            RadioTapHeaderFlag::Antenna => 1,
            RadioTapHeaderFlag::DbAntennaSignal => 1,
            RadioTapHeaderFlag::DbAntennaNoise => 1,
            RadioTapHeaderFlag::RxFlags => 2,
            RadioTapHeaderFlag::TxFlags => 2,
            RadioTapHeaderFlag::Undefined16 => 0,
            RadioTapHeaderFlag::Undefined17 => 0,
            RadioTapHeaderFlag::Undefined18 => 0,
            RadioTapHeaderFlag::MCS => 1,
            RadioTapHeaderFlag::AMpduStatus => 4,
            RadioTapHeaderFlag::VHT => 2,
            RadioTapHeaderFlag::Timestamp => 8,
            RadioTapHeaderFlag::HE => 2,
            RadioTapHeaderFlag::HEMu => 2,
            RadioTapHeaderFlag::HEMuOtherUser => 2,
            RadioTapHeaderFlag::ZeroLengthPSDU => 1,
            RadioTapHeaderFlag::LSIG => 2,
            RadioTapHeaderFlag::Ignore28 => 0,
            RadioTapHeaderFlag::RadiotapNamespaceNext => 0,
            RadioTapHeaderFlag::VendorNamespaceNext => 0,
        }
    }

    pub fn name(&self) -> &'static str {
        match self {
            RadioTapHeaderFlag::TSFTMactime => "TSFT Mactime",
            RadioTapHeaderFlag::Flags => "Flags",
            RadioTapHeaderFlag::Rate => "Rate",
            RadioTapHeaderFlag::Channel => "Channel",
            RadioTapHeaderFlag::FHSS => "FHSS",
            RadioTapHeaderFlag::AntennaSignal => "Antenna signal",
            RadioTapHeaderFlag::AntennaNoise => "Antenna noise",
            RadioTapHeaderFlag::LockQuality => "Lock quality",
            RadioTapHeaderFlag::TXAttenuation => "TX attenuation",
            RadioTapHeaderFlag::DbTXAttenuation => "db TX attenuation",
            RadioTapHeaderFlag::DbmTXPower => "dBm TX power",
            RadioTapHeaderFlag::Antenna => "Antenna",
            RadioTapHeaderFlag::DbAntennaSignal => "dB antenna signal",
            RadioTapHeaderFlag::DbAntennaNoise => "dB antenna noise",
            RadioTapHeaderFlag::RxFlags => "RX flags",
            RadioTapHeaderFlag::TxFlags => "TX flags",
            RadioTapHeaderFlag::Undefined16 => "undefined",
            RadioTapHeaderFlag::Undefined17 => "undefined",
            RadioTapHeaderFlag::Undefined18 => "undefined",
            RadioTapHeaderFlag::MCS => "MCS",
            RadioTapHeaderFlag::AMpduStatus => "A-MPDU status",
            RadioTapHeaderFlag::VHT => "VHT",
            RadioTapHeaderFlag::Timestamp => "timestamp",
            RadioTapHeaderFlag::HE => "HE",
            RadioTapHeaderFlag::HEMu => "HE-MU",
            RadioTapHeaderFlag::HEMuOtherUser => "HE-MU-other-user",
            RadioTapHeaderFlag::ZeroLengthPSDU => "0-length-PSDU",
            RadioTapHeaderFlag::LSIG => "L-SIG",
            RadioTapHeaderFlag::Ignore28 => "", // ignore
            RadioTapHeaderFlag::RadiotapNamespaceNext => "Radiotap Namespace next",
            RadioTapHeaderFlag::VendorNamespaceNext => "Vendor Namespace next",
        }
    }
}