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, 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, 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 => "", RadioTapHeaderFlag::RadiotapNamespaceNext => "Radiotap Namespace next",
RadioTapHeaderFlag::VendorNamespaceNext => "Vendor Namespace next",
}
}
}