1use alloc::string::ToString;
2
3pub fn remove_pcap_headers(data: &[u8]) -> Result<&[u8], alloc::string::String> {
10 remove_radiotap_hdr(data).and_then(remove_wlan_headers)
11}
12
13pub fn remove_wlan_headers(data: &[u8]) -> Result<&[u8], alloc::string::String> {
23 remove_80211_hdr(data).and_then(remove_llc_hdr)
24}
25
26#[allow(clippy::missing_errors_doc, reason = "no documentation present")]
27fn remove_radiotap_hdr(data: &[u8]) -> Result<&[u8], alloc::string::String> {
28 let radiotap_version: u8 = data[0];
37 if radiotap_version != 0 {
38 return Err(alloc::format!(
39 "Unknown header version {radiotap_version:#x}"
40 ));
41 }
42
43 let hdr_len: usize = u16::from_le_bytes([data[2], data[3]]).into();
44 let (_, remaining) = data.split_at(hdr_len);
45
46 Ok(remaining)
47}
48
49#[allow(clippy::missing_errors_doc, reason = "no documentation present")]
50fn remove_80211_hdr(data: &[u8]) -> Result<&[u8], alloc::string::String> {
51 let ieee80211_framecontrol: u8 = data[0];
68
69 let ieee80211_fc_version: u8 = ieee80211_framecontrol & 0x03; if ieee80211_fc_version != 0 {
71 return Err(
72 alloc::format!("Unknown 802.11 header version {ieee80211_fc_version}").to_string(),
73 );
74 }
75
76 let ieee80211_fc_type: u8 = (ieee80211_framecontrol & 0x0c) >> 2; if ieee80211_fc_type != 0b10 {
78 return Err(
80 alloc::format!("Unsupported 802.11 frame type {ieee80211_fc_type}").to_string(),
81 );
82 }
83
84 let ieee80211_fc_subtype: u8 = (ieee80211_framecontrol & 0xf0) >> 4; let qos_hdr_bytes = if ieee80211_fc_subtype == 0b1000 {
86 2
87 } else if ieee80211_fc_subtype == 0b0000 {
88 0
89 } else {
90 return Err(
92 alloc::format!("Unsupported 802.11 frame subtype {ieee80211_fc_subtype:#04x}")
93 .to_string(),
94 );
95 };
96
97 let hdr_len: usize = 24 + qos_hdr_bytes;
98 let (_, remaining) = data.split_at(hdr_len);
99
100 Ok(remaining)
101}
102
103#[allow(clippy::missing_errors_doc, reason = "no documentation present")]
104fn remove_llc_hdr(data: &[u8]) -> Result<&[u8], alloc::string::String> {
105 let llc_type: u16 = (u16::from(data[6]) << 8) | u16::from(data[7]);
115
116 if llc_type != 0x8947 {
117 return Err(alloc::format!("Unknown LLC payload type {llc_type:#x}").to_string());
118 }
119
120 let hdr_len: usize = 8; let (_, remaining) = data.split_at(hdr_len);
122
123 Ok(remaining)
124}