Crates.io | libwifi |
lib.rs | libwifi |
version | 0.3.1 |
source | src |
created_at | 2021-04-16 18:52:38.767266 |
updated_at | 2022-06-23 10:57:46.54753 |
description | A library for parsing IEEE 802.11 frames and handling wifi interfaces. |
homepage | https://github.com/nukesor/libwifi |
repository | https://github.com/nukesor/libwifi |
max_upload_size | |
id | 385424 |
size | 88,101 |
First of all, this library is designed to be easily extendable.
There's an architectural/contribution guide in docs/Frame.md
and pull requests are highly welcome.
Covering the whole spectrum of possible 802.11 frames or all different implementations of wifi tools out there is an impossible task for a single person, let's try to tackle this together!
The first goal of libwifi
is to provide a convenient way of parsing raw IEEE 802.11 frames!
The emphasis is on convenient, since this library doesn't focus on providing a ultra high-performance implementation. The focus is rather on providing an easy-to-use API.
This includes consistent and intuitive structs representing the structure of a given frame.
However, this doesn't mean that this library isn't quite fast anyway ;).
The second goal is to provide an unified API to:
As a prototype it's planned to call and parse existing binaries.
However, a native re-implementation of those tools is desired in a long-term manner.
For instance, the wireless-tools are a great C-library with a lot of documentation and very will structured code.
This could be used as a guide-line for re-implementation.
The project is still under heavy development, and a lot of features are missing, but it should be a good foundation for a proper wifi library :).
Parsing a frame is fairly straight forward:
use libwifi::parse_frame;
let bytes = [
180, 0, // FrameControl
158, 0, // Duration
116, 66, 127, 77, 29, 45, // First Address
20, 125, 218, 170, 84, 81, // Second Address
];
match libwifi::parse_frame(&bytes) {
Ok(frame) => {
println!("Got frame: {:?}", frame);
}
Err(err) => {
println!("Error during parsing :\n{}", err);
}
};
A full example on how to capture, process and parse wifi traffic can be found in the examples
directory.
There are a few benches in the benches
folder.
cargo-criterion
by calling cargo install cargo-criterion
.cargo criterion
.Right now, parsing a Beacon
frame, which is one of the more complex frames, takes ~1 µs
on a i7-8550U.
Parsing a Data
frame takes ~84 ns
.
If we take this as a rough guideline, you can roughly expect a million frames per second.
Disclaimer: This will most likely become slower, as more missing features/parsers will be added to the library. Anyhow, I don't expect this to drop below 100k frames/s.
Parser and Frames
StationInfo
struct.Interface handling
I would love to add proper interface handling to the library. This includes features to:
Switch modes
Switch channels
Discover available channels
The QoS flags must still be properly parsed
There's a lot more to the IEE 802.11 spec and a lot of stuff needs to be done.
If you find that something you need is missing, consider creating a ticket and contributing :).