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.

GL-MT6000 front view (first-party photo)

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:

  1. source from the community CSI OpenWrt branch and the current mt76 upstream [4] [5];
  2. a preflight unpack that checks the final image for CSI symbols in mt7915e, the daemon, init script and LuCI;
  3. 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:

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
A silent 15-second clip showing the retail packaging, router, four antennas and cable. It proves hardware provenance, not CSI capture or algorithm performance.
Video transcript

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 first suspicion after flashing was that the WAN link had fallen from gigabit to 100 Mbps. The measurements showed:

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

  1. Anonymise the transmitter MAC in the payload only; timestamps, RSSI and I/Q values stay unchanged;
  2. Split the stream into 8 MiB parts and compute SHA-256 for every part and for the whole file;
  3. Ship REASSEMBLE.md so a downloader can merge and verify the parts;
  4. 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:

Not supported by this dataset alone:

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

Next

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.