omdrop-owl
https://github.com/user-attachments/assets/b195ce4c-e078-49be-bc13-44a72b6dc189
这是 omdrop 的无线电部分,适用于没有苹果 Broadcom Wi-Fi 的机器。AWDL 通过 OWL 在用户态的监听接口上运行,而 omdrop 自带的接收器和发送器无需修改即可在其上运行。首个目标设备:MediaTek MT7925(mt7925e),即 Framework 13 所用的网卡,在这些设备上 AirDrop 可双向使用,同时 Wi-Fi 保持连接。
它是 omdrop-awdl(Broadcom 无线电包)的姊妹项目,以相同方式接入 omdrop:位于 /usr/lib/omdrop 的辅助程序,由 omdrop CLI 和面板调用。接口契约在 omdrop 的 docs/radio-backend.md 中描述。
工作原理
Wi-Fi 站点接口保持关联,AWDL 共享其信道:
- AWDL 运行在接入点自身的信道上,该信道必须是 6、44 或 149(AWDL 的信道)。iPhone 的 AWDL 时隙有相当大比例花在这些信道上,因此无线电无需离开接入点。
- 监听接口使用站点的 MAC 地址,OWL 以
-S intersect参数在其上运行,只在该信道上宣告手机的时隙。 - MT7925 始终以站点的 MAC 地址发送注入的帧,而站点接口会对手机发往该 MAC 的单播帧进行 ACK,因此不需要"active"模式的监听接口。
- OWL 会创建
awdl0。omdrop 的接收器绑定到它,omdrop-awdl 的awdl-airdrop-adv.py --plain每隔几秒在其上宣告_airdrop._tcp(使用--plain是因为 OWL 自己添加 AWDL 封装)。
我们从 omdrop-awdl 原样复用那些只与 awdl0 或 BlueZ 交互的工具:send-to-peer、airdrop-send.py、ble-airdrop-adv.py、awdl-airdrop-adv.py、awdl-mdns-respond.py 以及它们导入的模块。这些工具由 tools/stage.sh 在固定 commit 处拉取,不会提交到本仓库。
当前状态
omdrop-discoverable 实现了完整的契约。在 MT7925 上已验证:start 约 2 秒返回,此时 awdl0 可用、宣告已发出、手机出现在 peers 列表中;再次 start 返回 5 并调整窗口;stop 约 2 秒完成拆除;窗口会自行过期。
支持的硬件
omdrop-owl 在每个 Wi-Fi 驱动上的行为由 userspace/owl-profiles 决定,每个驱动一行:
| 驱动 | 网卡 | 状态 |
|---|---|---|
mt7925e | MediaTek MT7925(Framework 13) | ✅ 已测试:双向可用,Wi-Fi 保持连接 |
iwlwifi | Intel AX200、AX211 | ❌ 不可用:连接状态下丢弃注入帧,且其固件在监听模式下无法 ACK(#1、#4) |
其他任何网卡都会回退到表格中的 * 行,且只有在用户主动选择加入(echo 1 | sudo tee /etc/omdrop/allow-untested)后才会运行。
添加你的网卡
能在保持 Wi-Fi 连接的同时从监听接口注入帧的网卡最有希望。大多数 mac80211 驱动都可以,但它们在这方面的具体表现各不相同,这正是配置文件所记录的内容。
- 查找你的驱动:
basename $(readlink /sys/class/net/<wifi>/device/driver)。把接入点放在信道 6、44 或 149 上。 - 选择加入(
/etc/omdrop/allow-untested),并把表格中的*行复制到/etc/omdrop/owl-profiles,替换为你驱动的名称。该文件会先于内置表格被读取,因此无需重新构建即可修改设置。 - 运行
sudo tools/test-card.sh。它会引导你在两个方向各传一张照片,在拆除后监视 Wi-Fi 五分钟,并生成报告。 - 要判断你的网卡是否需要
reconnect yes,在执行echo 0 | sudo tee /etc/omdrop/reconnect-after后再次运行。如果拆除后 Wi-Fi 断开,则需要(重新加载驱动即可恢复)。之后删除该文件。 - 如果某个环节失败,尝试另一个
mon_mac设置。 - 提交 pull request,把你的那一行加到
userspace/owl-profiles,并粘贴报告中的summary.txt。其他文件包含你路由器的 MAC 地址。
无法在连接状态下注入帧的网卡需要一种"独占"模式,即在窗口期间让出 Wi-Fi。该模式尚不存在;欢迎提交 issue 说明你的发现。
安装
在 Arch 上:
makepkg -si
在 Debian 或 Ubuntu 上:
sudo apt install build-essential cmake git pkg-config dpkg-dev \
libev-dev libpcap-dev libnl-3-dev libnl-genl-3-dev
tools/build-deb.sh
sudo apt install ./omdrop-owl_*.deb
无论哪种方式,都会在 pins 中固定的 commit 上构建 OWL(应用 patches/),并以 root 权限安装到 /usr/lib/omdrop,一同安装的还有 omdrop-discoverable、omdrop-awdl 的可移植工具、辅助程序的 polkit 策略,以及一条让 NetworkManager 不管理 awdl0 和 mon0 的规则。它与 brcmfmac-awdl-dkms 冲突:同一时间只能有一个无线电后端。
然后安装 omdrop 本体(需为支持 radio-backend 的版本),并从状态栏开启。/usr/lib/omdrop/omdrop-discoverable probe 会说明是否有东西挡路。
开发方面:just build 会在 build/lib 中组装相同的文件,just test 会针对这些文件运行网卡测试。
已知问题
- 站点保持关联时删除监听接口会导致 MT7925 卡死。 一个仅在没有其他程序运行时添加又删除的裸监听接口,会在几秒到几分钟后让站点显示"已连接"但收不到任何数据,直到重新加载
mt7925e。这说明是 mt76/固件的 bug。omdrop 的契约禁止无线电辅助程序重新加载驱动,因此stop会在删除接口后立即强制重连。迄今所有测试中,这一做法都让站点保持正常。 - 发送比接收慢(约 490 kB/s 对 1.3 MB/s)。注入的帧以固定节奏发出,约每 2.5 ms 一帧,无论 OWL 请求什么 PHY 速率(
owl -R,来自patches/owl-01-tx-rate.patch),也无论手机提供多少时隙。 - **接入点必须位于信道 6、44 或 149 上。**否则
start会以退出码 3 退出并给出提示。在窗口期间让网卡离开接入点可以解除此限制,但尚未实现。 - iPhone 会随机化其 AWDL 地址,因此这里不会记住任何对端。