wfb-rs
Rust WFB-style command-line tools built on the openipc-rs protocol stack and
the openipc-rtl88xx userland Realtek USB driver.
This package is separate from apps/openipc-cli on purpose. openipc-cli is
for OpenIPC receiver bring-up and capture decoding. wfb-rs is for tools that
look like the upstream WFB-ng binaries.
The package is a Rust rewrite of the useful WFB-ng binary roles, not a wrapper
around upstream WFB-ng. The RX/TX tools use the Rust userland Realtek driver:
wfb_rx reads USB aggregates directly from supported adapters and wfb_tx
builds WFB/FEC/radiotap/802.11 packets before injecting them through USB.
Because this path uses nusb instead of Linux pcap/PF_PACKET monitor
interfaces, the main radio tools are intended to run on Linux, macOS, and
Windows. OS USB permissions and driver binding still apply. wfb_tun is
Unix-only because it uses a TUN interface.
Binaries
Install from crates.io:
Or build all WFB tools from this workspace:
The package produces:
| Binary | Purpose |
|---|---|
wfb_keygen |
Generate WFB-compatible drone.key and gs.key files. |
wfb_rx |
Userland Realtek WFB RX: USB aggregate -> WFB payload -> UDP. |
wfb_tx |
Userland Realtek WFB TX: UDP payload -> WFB/FEC -> USB frame injection. |
wfb_tx_cmd |
UDP control client for a running wfb_tx. |
wfb_tun |
WFB-compatible UDP/TUN length-prefixed tunnel bridge. |
wfb_rtsp |
Minimal RTSP/RTP UDP proxy for local H.264/H.265 RTP streams. |
The wfb_rx and wfb_tx binaries do not use Linux pcap/PF_PACKET monitor
interfaces. They open a supported Realtek USB adapter through nusb and the
openipc-rtl88xx userland driver.
Keygen
This writes drone.key and gs.key in the same 64-byte layout used by WFB-ng.
Password-derived key generation is not implemented yet because WFB-ng uses
libsodium Argon2i and producing a different password-derived key would be
dangerous.
Receive
Receive raw WFB payloads from a Realtek adapter and forward them to UDP:
Transmit
Transmit UDP payloads over the Realtek adapter:
Control a running transmitter:
Tunnel
Bridge WFB tunnel payloads to a local TUN interface on Unix:
RTSP
Expose RTP packets arriving on UDP 5600 as a simple RTSP stream:
The Rust wfb_rtsp helper forwards RTP from UDP to the RTSP client's selected
RTP port. It does not depayload, jitter-buffer, or repacketize like the upstream
GStreamer helper.
Current Parity
These tools are intentionally not advertised as complete WFB-ng drop-ins yet. The main userland Realtek RX/TX path exists, but not every upstream WFB-ng CLI mode is ported.
Unsupported Options By Binary
| Binary | Unsupported upstream options | Parsed but not fully implemented |
|---|---|---|
wfb_keygen |
Positional [password] is not supported. |
None. Random key generation works. |
wfb_rx |
-f forwarder mode, -a <server_port> aggregator mode, -U <unix_socket> Unix socket output. |
-R <rcv_buf> and -s <snd_buf> are accepted but ignored. Kernel monitor interface arguments are ignored because this tool opens the Realtek USB adapter directly. |
wfb_tx |
-d distributor mode, -I <port> injector mode, -U <unix_socket> Unix socket input. |
-R <rcv_buf>, -s <snd_buf>, -P <fwmark>, and -Q are accepted but currently ignored. Kernel monitor interface arguments are only used as output-count labels for -D; USB mode opens Realtek adapters directly. |
wfb_tx_cmd |
None known from upstream wfb_tx_cmd: set_fec, set_radio, get_fec, and get_radio are implemented. |
None. |
wfb_tun |
No unsupported upstream flags on Unix: -t, -a, -c, -u, -l, and -T are implemented. The binary is not implemented for non-Unix targets. |
None known. |
wfb_rtsp |
No unsupported upstream flags syntactically: -m, -u, -l, -p, -P, and h264/h265 are parsed. |
-m <mtu> and -l <latency> are parsed but not applied. The helper is a minimal RTSP/RTP UDP proxy; it does not depayload, jitter-buffer, repacketize, or enforce MTU like the upstream GStreamer pipeline. |
Extra Rust-Only Options
wfb_rx and wfb_tx also accept Rust driver bring-up options that upstream
WFB-ng does not have because upstream uses kernel monitor interfaces:
--vid <id>
--pid <id>
--tx-ep <ep>
--skip-reset
--no-init
--accept-bad-fcs
--skip-txpwr
--force-iqk
--disable-iqk
--skip-txgapk
--fwdl-8814 kernel|rtw88
--fwdl-8814-chunk <n>
--tx-legacy-8812-desc
--rf-channel <n>
--rf-width <5|10|20|40|80>
--rf-offset <n>
wfb_rx additionally has --max-transfers and --rx-urbs.
wfb_tx additionally has --session-interval, --max-packets, and
--tx-power.
On Jaguar3, wfb_tx closes the ordinary receive filters, keeps bulk-IN queued
to drain firmware C2H reports, and runs coex plus thermal maintenance every two
seconds. This mirrors the sustained transmit behavior required by devourer
without introducing a hidden driver thread.
wfb_tx implements the upstream timing/retry/debug flags that matter for the
direct TX path:
-F <usec>sleeps before each parity FEC fragment.-T <msec>emits one FEC-only empty fragment after an idle timeout, closing partially filled FEC blocks the same way WFB-ng does.-J <count>and-E <usec>retry failed USB injection attempts before the packet is reported as failed.-mmirrors each generated packet to every matching opened Realtek adapter.-D <port>skips USB and sends WFB forwarder packets with a WFB-ng debug receive header to127.0.0.1:<port>,:<port+1>, and so on.