GL-MT6000 CSI lab log: what we ran and what failed in October
By Wu Jun · Updated 2026-10-31 · Wi-Fi CSI, lab log, GL-MT6000, MT7986, OpenWrt · 10 min read
This is a record of what Router CSI Lab actually did in October 2026: creating a rollback-capable image, obtaining the first CSI, accepting a ten-minute capture, debugging performance failures and turning the result into a public, verifiable dataset. It is an engineering log rather than a success story. All numbers come from project measurements; the capture, scripts and DOI are public [1] [2] [3].
Goal and hardware
The goal was concrete: obtain stable, long-running Wi-Fi CSI on a consumer router and check whether it can support real sensing experiments.
- Device: GL.iNet GL-MT6000 (MT7986A + MT7976)
- System: OpenWrt SNAPSHOT (Linux 6.18) with the mt76 CSI patch
- Radio: 5 GHz, HE80, channel 44, 256 subcarriers, 2 Tx × 4 Rx (8 chains)

The retail GL-MT6000 used in this log. This photo proves the hardware source; the CSI conclusions still depend on the raw capture, parser and commands cited below.
Build the rollback path first
A successful flash is not the same as a maintainable experiment. The build produced three evidence chains:
- source from the community CSI OpenWrt branch and the current mt76 upstream [4] [5];
- a preflight unpack that checks the final image for CSI symbols in
mt7915e, the daemon, init script and LuCI; - a separately downloaded GL.iNet stock image with a locally recomputed hash, not just a remembered download URL [6].
No vendor configuration was carried across the flash. Keeping LAN, WAN, wireless and firewall state from a different system would make both networking and rollback harder to reason about. The checks and rollback path are documented in the GL-MT6000 firmware preflight.
Timeline
| Date | What happened |
|---|---|
| 2026-10-10 | First continuous 10-minute capture: 57,293 records over 600 s, mean 95.5 records/s, no gap longer than 5 s |
| 2026-10-11 | Capture/analysis scripts organised; site and first reproduction guides published |
| 2026-10-13 | Transmitter MAC anonymised (57,293 occurrences → 0), repackaged with a manifest and SHA-256 |
| 2026-10-17 | Dataset published on Zenodo with DOI 10.5281/zenodo.23434789 |
| 2026-10-29 | Site structure and content remediation (author info, dataset page, tools page, lab log) |
| 2026-10-31 | Added the privacy-reviewed 15-second hardware clip, bilingual captions and a transcript to this provenance section |
Seeing CSI once is not capture acceptance
The first end-to-end test ran for only 60 seconds. Its purpose was to prove the device, firmware, driver and capture host were connected, not to train a sensing model. It produced 2,777 CSI chain records, all with 256 subcarriers and complete I/Q. That established that the CSI path worked on real MT7986 hardware.
Only then did the experiment move to a 600-second run:
| Metric | Measured | Why it matters |
|---|---|---|
| Outer chain records | 57,293 | Total rows in the capture, not independent time samples |
| Capture duration | 599.924 s | Computed from real timestamps, not the requested duration |
| Mean chain-record rate | 95.5 rows/s | Multiple chains may belong to one measurement |
| Complete measurements | 7,609 | Closed on chain_info bit 15 |
| Group composition | 6,714 eight-chain, 895 four-chain, 1 one-chain | Real captures are not always clean eight-chain groups |
| Independent measurement rate | about 12.68 groups/s | The time-sampling order relevant to sensing |
| Filtered analysis set | 7,583 groups / about 12.64 groups/s | 25 zero-heavy groups removed |
| Subcarrier completeness | 57,289 records with 256, 4 with 64 | Format exceptions need explicit accounting |
| Maximum timestamp gap | 2.373 s | Long gaps affect spectral, respiration and Doppler claims |
| Gaps longer than 5 s | 0 | Acceptance line for this ten-minute run |
| Mean RSSI / SNR | -31.3 dB / 53.29 dB | Describes this link only; not portable to other rooms |
This is why the project later added a capture-quality audit and a timestamp-gap spectral sensitivity analysis. A plausible-looking heatmap does not prove that grouping and the time axis are correct.
Fault injection: does the daemon recover?
Long-run testing is not complete when the process simply avoids crashing. On 2026-10-11 the CSI daemon was deliberately terminated:
procdstarted a new process in about five seconds;- the client remained associated and the daemon resumed tracking the interface;
- debugfs returned to
CSI enable: 1, and the REST frame counter began increasing; frames_totalrestarted at zero, which is expected for an in-process counter and does not mean recorded data was lost.
The watchdog also checks the process, CSI interface and debugfs enable state. Zero frames with no associated client must not be treated as failure: CSI is produced only when a client and useful traffic are present.
Media provenance and privacy review
The unboxing photos and videos are treated as provenance evidence, not as measurements. They can show that a retail unit exists and help a reader identify the ports, but they cannot demonstrate subcarrier count, sampling rate, packet loss or sensing accuracy.
The source material included precise location metadata, a private workspace, hands, ordinary household objects and one close-up of the device label. The label image contains a QR code, MAC address, serial number and default Wi-Fi information, so it was excluded completely. A thin blur or crop around only one field would still leave a device identity risk.
| Source | Decision | Published derivative |
|---|---|---|
| Vertical unboxing video, 8 min 50 s | Never publish the original; use only two short, silent, cropped sections | 15 s H.264 clip, 480 × 480, no audio, no GPS/EXIF |
| Rear-port close-up | Crop and rotate away from the label and clutter | gl-mt6000-rear-ports.jpg in the reproduction guide |
| Device-label close-up | High risk: QR, MAC, serial and default Wi-Fi data | Not published |
| Horizontal detail video, 3 min 45 s | Low information density and a private workspace | Not published |
| Hand-held wiring photo | Clutter and duplicated port evidence | Not used |
0:00–0:03 The outer shipping box is opened to reveal the GL.iNet Flint 2 retail box. 0:03–0:07 The front and GL-MT6000 model label are shown. 0:07–0:12 The router is removed and four adjustable antennas are unfolded. 0:12–0:15 The supplied cable is inspected.
The safe derivative images are re-encoded so camera and location metadata do not carry into the site. The clip appears only in this provenance section, not in the reproduction guide, and it does not autoplay. It cannot prove a CSI result and would be unrelated media weight in the technical procedure. The player starts with the poster and media metadata; the clip body is loaded after a reader presses play. Bilingual captions and a complete transcript are available. The original files remain outside the Git repository.
This review is part of the evidence chain, not decoration. A reader can compare the published photo with the hardware table, then verify the capture with the public checksums and parser. The failed experiments below are kept for the same reason: a credible lab record includes what did not work.
The "100 Mbps WAN" was the wrong link
The first suspicion after flashing was that the WAN link had fallen from gigabit to 100 Mbps. The measurements showed:
- the optical modem-to-MT6000 WAN link had remained at 1000 Mbps full duplex, with zero RX/TX errors;
- a router-local multi-thread download reached about 391 Mbps while the CPU was still roughly 87% idle;
- the actual 100 Mbps link was a LAN port to the build machine whose NIC advertised only
100baseT/Full; - the wireless slowdown was a separate problem and could not be explained by the wired negotiation result.
The lesson is to separate at least six layers: WAN negotiation, router forwarding, LAN link, wireless PHY, client power state and airtime. The full commands and byte accounting are in Wi-Fi slow after CSI.
Two real traps
Trap 1: firmware ATF blocks rate recovery
Symptom: after an idle period, one client's downlink was pinned at MCS0 and stayed slow even under continuous download, while other clients looked fine.
Isolation: router-local downloads and LAN downloads ruled out the ISP and wired path; AP-sent versus client-received
bytes ruled out a retransmission storm. The same client and channel were then compared across the mt76 vow_atf
switch:
vow_atf |
Six downloads after idle (Mbps) | Observation |
|---|---|---|
1 (firmware default) |
9.5 / 7.3 / 9.5 / 7.4 / 9.6 / 7.2 | Still no recovery after 36 s at full demand |
0 |
7.8 / 8.8 / 20 / 146 / 387 / 393 | Climbed back over about 15–20 s |
0 + reassociation |
369 / 374 / 376 / 390 / 409 / 397 | Six of six reached about 400 Mbps |
Conclusion: this is a firmware rate-recovery problem, not weak signal or a broken client. The fix needs a boot script plus a watchdog, because debugfs is reset when the driver reloads.
Trap 2: a 40 MHz client inside an 80 MHz BSS
Symptom: one client that only negotiated 40 MHz periodically collapsed inside an 80 MHz BSS; other 80 MHz clients were unaffected.
Isolation: switching the radio to HE40 produced six consecutive downloads of 384 / 375 / 328 / 416 / 411 / 419 Mbps, and the collapses disappeared. Returning to HE80 reproduced 7–10 Mbps again.
Conclusion: the observed trigger is a 40 MHz legacy client inside an 80 MHz BSS, not a single damaged SSID. Run the radio at the client's native width or isolate legacy clients on a separate radio. Because the internal firmware rate state was not instrumented, the result is not assigned to a specific register.
Hypotheses ruled out
| Hypothesis | Control experiment | Result |
|---|---|---|
| CSI capture itself causes the slowdown | 2.4 GHz with CSI disabled reproduced it | Not the sole cause |
| AQL causes it | Disabling aql_enable still collapsed |
Ruled out |
| U-APSD causes it | Brief improvement, then VHT80 reproduced it | Not a root fix |
| HE mode is incompatible with the old NIC | VHT80 still collapsed | Mode name alone ruled out |
| Uplink is equally affected | Mac uplink about 188 Mbps; AP receive rate normal | Problem was mainly downlink |
| Every client is affected | A stable 80 MHz phone client | Specific to the 40 MHz client |
How the capture became a dataset
- Anonymise the transmitter MAC in the payload only; timestamps, RSSI and I/Q values stay unchanged;
- Split the stream into 8 MiB parts and compute SHA-256 for every part and for the whole file;
- Ship
REASSEMBLE.mdso a downloader can merge and verify the parts; - Publish the figures and metadata on Zenodo under CC BY 4.0.
Whole-file SHA-256: 527466ceb8b5f835e55ff348f02808736b947db39e7baac1f34e375de146a440.
The parsing walkthrough is in the dataset tutorial.
What this dataset can and cannot support
Supported:
- GL-MT6000 + MT7986 + mt76 CSI can capture 256-subcarrier I/Q on real hardware;
- within this ten-minute window, band, channel and link, the system maintained measurable record rate and timing continuity;
- four-chain groups, known anomaly groups and long gaps must be represented in parsing and quality gates;
vow_atfand the 40/80 MHz client combination had reproducible performance effects in this environment.
Not supported by this dataset alone:
- accuracy for fall, respiration, heart-rate, pose or identity recognition;
- portability across rooms, subjects, firmware versions or hardware revisions;
- treating 95.5 chain records/s as a 95.5 Hz time series;
- treating any throughput number here as a guaranteed rate for every MT6000 or client.
The public capture is MAC-de-identified but still retains outer absolute timestamps, activity rhythms and within-session linkage. It is pseudonymised data, not information that has become impossible to relate to its collection context.
Minimum reproduction order
# 1. Confirm that the analysis host can see UDP before starting a long run
tcpdump -ni any udp port 8888
# 2. Capture ten seconds and inspect the non-empty file plus summary
router-csi-toolkit/scripts/csi_capture_session.sh 10
# 3. Only then run for ten minutes
router-csi-toolkit/scripts/csi_capture_session.sh 600
Save the command, firmware, interface, channel, width, chain-record rate, independent group rate, chain composition and maximum gap together. A good-looking heatmap is not reproducible evidence by itself.
Lessons
- Fix the environment before comparing algorithms: band, width, channel and firmware all change the CSI distribution;
- Check timestamps and frame rate before tuning models: jitter creates fake spectral peaks, and many "algorithm problems" are actually capture problems;
- Fault-inject the long run: define daemon recovery, zero-frame behaviour with no clients and counter resets in advance;
- Separate performance layers: WAN, LAN, PHY, client power state and CSI capture cannot be diagnosed from one speed test;
- Keep the failure record: the ATF and 40 MHz traps say more about whether an experiment is real than any successful screenshot;
- Make data verifiable: without SHA-256 and reassembly instructions, nobody can confirm they received a complete copy.
Next
- Add more scenarios: different distances, postures and rooms;
- Turn the lab log into a regular column, updated with each capture batch;
- Keep expanding the reproduction guides and tooling docs so no page contains conclusions without the process.
References and data sources
Every external claim carries a source and an evidence grade (grading scheme). Grade E marks first-party, reproducible measurements from this project.
- Grade E · first-party measurement
This project's 10-minute raw capture (57,293 records / 600.0 s, SHA-256 00373f83…95e2)
Router CSI Lab · 2026
okwujun.pw/en/datasets/ · verified: Reassembled chunks verified byte-identical (2026-10-11) · The local raw master has SHA-256 00373f83…95e2; the public de-identified derivative has SHA-256 527466ce…a440. They must not be confused. - Grade E · first-party measurement
Router CSI Toolkit — capture/analysis/watchdog scripts (MIT, public repository)
Router CSI Lab · 2026
github.com/jjjwu/router-csi-toolkit · verified: GitHub API verified the public repository, capture-quality preflight, successful CI and the v0.1.3 release on 2026-11-02; the archive SHA-256 is 59f144c0…adea7 · The public repository includes a dependency-free capture preflight; the browser checker uses the same container definition and evidence boundaries. - Grade E · first-party measurement
Router CSI Lab — GL-MT6000 (MT7986) Wi-Fi CSI dataset, 10 s sample + 10 min capture
Router CSI Lab · 2026
doi:10.5281/zenodo.23434789 · verified: CC BY 4.0; SHA-256 published; Zenodo DOI 10.5281/zenodo.23434789 · The dataset has a Zenodo DOI (10.5281/zenodo.23434789) and can be cited directly. - Grade D · preprint/wiki
ossiemarks/openwrt — feature/csi-mt7915 CSI stack
ossiemarks
github.com/ossiemarks/openwrt/commit/aed26e5f95963cd725d9ff097c713af8c24afd35 · verified: Public commit page fetched 2026-10-29; community project, not peer-reviewed. · Community OpenWrt CSI branch used for this build. Its existence does not prove MT7986 capture; that claim needs the first-party capture measured here. - Grade C · official docs
openwrt/mt76 — mac80211 driver for MediaTek Wi-Fi chipsets
OpenWrt project / MediaTek
github.com/openwrt/mt76 · verified: GitHub API 2026-10-11 (stars 890, last push 2026-10-08) · Upstream of the open-source mt76 driver used here; the CSI patch is applied on top of this codebase. - Grade C · official docs
GL.iNet download center — GL-MT6000 firmware
GL.iNet
dl.gl-inet.com/router/mt6000/stable · verified: Official download page fetched 2026-10-29; used only to establish the vendor rollback source, not to claim a checksum without a downloaded file. · Official GL-MT6000 firmware entry point. Always recompute the hash on the downloaded file.