#frame #wifi #parser #802-11

libwifi

用于解析 IEEE 802.11 帧和处理 WiFi 接口的库

4 个版本 (2 个破坏性更新)

0.3.1 2022年6月23日
0.3.0 2021年5月9日
0.2.0 2021年4月23日
0.1.0 2021年4月16日

#1116 in 解析器实现

每月44次下载

MIT 许可证

66KB
1K SLoC

Libwifi

GitHub Actions Workflow docs license Crates.io codecov

首先,这个库旨在易于扩展。
docs/Frame.md 中有一个架构/贡献指南,并且非常欢迎拉取请求。

涵盖所有可能的 802.11 帧或所有现有的 WiFi 工具的不同实现,对单个人来说是一项不可能的任务,让我们共同努力吧!

什么是 Libwifi

libwifi 的第一个目标是提供一个 便捷 的方法来解析原始的 IEEE 802.11 帧!

重点是 便捷,因为这个库并不专注于提供超高性能的实现。重点是提供易于使用的 API。
这包括表示给定帧结构的具有一致性和直观的结构体的 struct。
但这并不意味着这个库 并不很快 ;)

第二个目标是提供一个统一的 API 来

  1. 查询您的 WiFi 接口的信息(iwlist 相当于)。
  2. 设置属性和配置您的 WiFi 接口(iwconfig 相当于)。

作为原型,计划调用和解析现有的二进制文件。然而,长期而言,希望对这些工具进行原生重新实现。
例如,wireless-tools 是一个功能强大的 C 库,具有大量文档和非常结构化的代码。这可以用于重新实现的指导方针。

该项目仍在积极开发中,许多功能仍缺失,但它应该是一个良好的 WiFi 库基础 :)

如何使用它

解析帧相对简单

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);
    }
};

有关如何捕获、处理和解析 WiFi 流量的完整示例可以在 examples 目录中找到。

性能

benches 文件夹中有几个基准测试。

  1. 通过调用 cargo install cargo-criterion 安装 cargo-criterion
  2. 使用 cargo criterion 运行基准测试。

目前,在 i7-8550U 上解析 Beacon 帧,这是较为复杂的帧之一,需要 ~1 µs
解析 Data 帧需要 ~84 ns

如果我们将其作为一个粗略的指导,你可以大致期望每秒处理一百万个帧。

免责声明:由于将添加更多缺失的功能/解析器,这可能会变得更慢。无论如何,我不认为这会低于每秒 100k 帧。

路线图和待办事项

解析器和帧

  • 实现所有帧子类型的基本解析器。
  • 为目前由 StationInfo 结构体通用处理的字段添加专用解析器。
  • 处理所有边缘情况(有很多,我需要帮助!)

接口处理

我很想为库添加适当的接口处理。这包括以下功能:

  • 切换模式
  • 切换信道
  • 发现可用信道

实施状态

  • 管理帧
    • AssociationRequest,
    • AssociationResponse,
    • ReassociationRequest,
    • ReassociationResponse,
    • ProbeRequest,
    • ProbeResponse,
    • TimingAdvertisement,
    • Beacon,
    • Atim,
    • Disassociation,
    • Authentication,
    • Deauthentication,
    • Action,
    • ActionNoAck,
  • 控制帧
    • Trigger,
    • Tack,
    • BeamformingReportPoll,
    • NdpAnnouncement,
    • ControlFrameExtension,
    • ControlWrapper,
    • BlockAckRequest,
    • BlockAck,
    • PsPoll,
    • Rts,
    • Cts,
    • Ack,
    • CfEnd,
    • CfEndCfAck,
  • 数据帧
    • Data,
    • DataCfAck,
    • DataCfPoll,
    • DataCfAckCfPoll,
    • NullData,
    • CfAck,
    • CfPoll,
    • CfAckCfPoll,
    • QosData,
    • QosDataCfAck,
    • QosDataCfPoll,
    • QosDataCfAckCfPoll,
    • QosNull,
    • QosCfPoll,
    • QosCfAckCfPoll,
  • 帧组件
    • 帧控制
    • 序列控制
    • 管理头部
    • 动态管理头部字段
      • SSID
      • 支持速率
      • 剩余字段的通用提取
      • 所有其他字段
    • 数据头部
    • QoS 数据头部
      • QoS 标志仍需正确解析

IEEE 802.11 规范还有很多内容,还有很多工作要做。
如果你发现缺少了你需要的东西,请考虑创建一个工单并贡献 :).

依赖项

~2.5MB
~57K SLoC