Wi-Fi Signal Metrics for Field Diagnostics: Combine RSSI, Retries and Channel Occupancy
A congestion diagnosis needs evidence about access to the channel, not just received signal strength. Align signal observations, transmission outcomes and valid channel-survey intervals, then change one controlled condition. Similar RSSI with different service latency can be consistent with contention, but it does not identify the competing transmitter or rule out endpoint delays.
This guide pins Linux 6.12 cfg80211/nl80211 for a single-link Wi-Fi diagnostic integration. The actual driver’s survey scope, counter lifetime and field availability must be established. It does not specify roaming thresholds, estimate distance from RSSI or provide a universal “good signal” cutoff. All RF tests require an authorized network and the product’s approved operating configuration.
Build a metric-meaning ledger
| Observation | What it can support | What it cannot establish alone |
|---|---|---|
| Station signal sample or average | Received strength for the reported peer, direction and sampling method | Free airtime, remote receiver quality or application completion |
| Valid local transmit retries/failures | Additional transmission effort or failed delivery at that reporting boundary | Whether attenuation, collisions, receiver behavior or another cause dominates |
| Primary-channel busy time | Time the reporting radio sensed activity or energy making the primary channel busy | A count of neighboring APs or proof that all busy time belongs to other networks |
| Own transmit and receive time | Context for how this radio used its observation interval | A complete partition of every source of channel activity without driver-specific semantics |
| Validated application operations | The service consequence during the interval | The RF cause of that consequence |
Linux 6.12 explicitly marks survey fields as optional through a validity bitmap. Its survey record can identify a channel, or use a null channel for global statistics. The nl80211 definitions distinguish primary busy, extension busy, receive, transmit and scan time, with some counters explicitly described as on-channel or global. Missing values are unavailable evidence, not zero utilization. Linux 6.12 survey_info Linux 6.12 survey and station attributes
Validate the denominator before drawing a utilization chart
For a driver that supplies comparable cumulative per-channel counters, calculate primary busy fraction as the busy-time delta divided by the active-time delta for that channel. Use the radio’s documented active-time denominator, not automatically the elapsed wall-clock time between two commands. Scanning, sleep and time on other channels can make those intervals differ.
Accept a comparison only when both records belong to the same device/counter lifetime, channel definition and reporting scope; required fields are valid; and the active delta is positive. Reject counter decreases, impossible ordering or a busy delta greater than its compatible active delta. A reset is not a negative utilization result. If the driver reports independent interval samples rather than cumulative counters, use its documented interval contract instead of subtracting them.
Keep own transmit time visible. A hypothetical interval with 1,000 ms active, 700 ms busy and 600 ms own transmission has a 70% primary-busy fraction under the stated accounting. It does not establish that neighbors consumed 70% of the channel. Do not subtract own transmission to create an “external interference percentage” unless the actual driver’s inclusion and overlap rules support that operation.
Likewise, RX time is not interchangeable with busy time. Energy detection can report a busy medium without a successfully decoded frame. A survey from the AP’s location is also not a measurement at the station’s antenna. Keep observer location, channel width and collection window attached to each row.

Keep signal and retry observations aligned
The pinned nl80211 station interface distinguishes last signal, averaged signal and per-chain information. Preserve which field was used and whether it was available. Do not mix a scan-result signal collected earlier with a current station average and present the difference as a measured fade. A driver’s averaging interval may also differ from your survey interval.
Retain retry/failure counter units and the local sender perspective. The Linux interface does not make every packet counter a compatible denominator for every retry counter. For this diagnosis, compare valid raw deltas under the same workload before introducing a derived rate. If the radio exposes no useful retry evidence, mark that column unknown rather than reconstructing it from TCP retransmissions. Linux 6.12 station-information contracts
Run two discriminating comparisons
- Establish a stable reference. Keep AP, channel configuration, device orientation, traffic direction, payload cadence and endpoint work fixed. Record application delay/missing outcomes alongside valid survey and station observations. Avoid a new scan during the measurement unless scanning is the variable under test.
- Vary attenuation in a qualified setup. Use an approved conducted fixture or controlled physical arrangement while keeping ordinary competing traffic as stable as practical. Record the actual signal change and the retry/service response. Do not infer an exact RF attenuation from a UI signal bar.
- Restore the reference. Confirm that the baseline returns. If it does not, retain the changed environmental condition rather than treating the next run as comparable.
- Vary legitimate competing traffic. On your authorized test network, use bounded normal traffic from a separate test peer while preserving the target workload and geometry. Do not generate interference against other users. Observe whether compatible busy-time evidence and service delays change together.
- Check endpoint controls. Record CPU/queue pressure and use a bounded processing-only control where useful. Additional network traffic can load the AP or wired peer as well as occupy airtime.
- Repeat and retain exceptions. Include runs with no clear relationship. Report unknown fields and observation gaps rather than selecting only the trace that supports the initial hypothesis.
If weakening the controlled link increases failures while comparable channel occupancy stays similar, attenuation is a supported contributor. If normal competing traffic raises busy fraction and application waiting while signal remains comparable, contention is a supported contributor. Neither pattern is exclusive proof: hidden-node geometry, receiver sensitivity and scheduling may require authorized capture or vendor-specific evidence.
Report a conditional diagnosis, with analysis limits
For a hypothetical terminal, the field report says only “strong RSSI, slow commands.” The next useful result is a matched-window ledger showing whether the busy interval, retry effort or endpoint queue changed. “The channel was busy at the AP” should remain distinct from “another network caused this station’s failures.”
A Python 3.12.14 helper passed ten synthetic admission cases covering valid deltas, missing fields, changed lifetimes/channels, global records, resets, impossible busy time, zero denominators, collection-time ordering and unavailable own-TX data. It did not read a radio or validate a driver’s accounting.
Close the diagnosis with the exact observer, field meanings, compatible intervals, controlled change and application consequence. If those are missing, retain “cause unresolved” rather than turning one RSSI number into a repair instruction.