STRUCT CFG80211_SCAN_REQUEST(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… struct cfg80211_scan_request(9) β€” the Kernel API Manual page, bestie edition

okay so this is a Kernel API Manual page, and it's literally the whole vibe of "what even IS a scan request". Buckle up πŸŽ€


✨ NAME ✨

struct cfg80211_scan_request β€” it's the scan request description. that's it, that's the whole name. iconic behaviour honestly 🫢


🌈 SYNOPSIS 🌈

bestie, here's the struct in all its glory β€” every field, exactly as written, no cap:

struct cfg80211_scan_request {
    struct cfg80211_ssid *ssids;
    int n_ssids;
    u32 n_channels;
    const u8 *ie;
    size_t ie_len;
    u16 duration;
    bool duration_mandatory;
    u32 flags;
    u32 rates[NUM_NL80211_BANDS];
    struct wireless_dev *wdev;
    u8 mac_addr[ETH_ALEN];
    u8 mac_addr_mask[ETH_ALEN];
    u8 bssid[ETH_ALEN];
    struct wiphy *wiphy;
    unsigned long scan_start;
    bool no_cck;
    bool scan_6ghz;
    bool first_part;
    u32 n_6ghz_params;
    struct cfg80211_scan_6ghz_params *scan_6ghz_params;
    s8 tsf_report_link_id;
    struct ieee80211_channel *channels[];
};

look at all those little guys. a whole squad of fields. we love a structured queen πŸ’…


πŸ¦‹ Members πŸ¦‹

this is the part where each field gets its moment in the spotlight. main character energy for every single one 🌸

  • ssids β€” the SSIDs you're scanning for. active scan only, bestie β€” don't come here for passive vibes πŸ™ˆ
  • n_ssids β€” how many SSIDs there are. the count. the headcount. the number.
  • n_channels β€” the total number of channels to scan. total, like the full total.
  • ie β€” optional information element(s) to add into the Probe Request, or NULL if you're not about that life.
  • ie_len β€” the length of ie, measured in octets. yes, octets. πŸ“
  • duration β€” how long to listen on each channel, in TUs. but here's the tea ⬇️ if duration_mandatory is not set, this is the maximum dwell time, and the actual dwell time may be shorter. so it's a ceiling, not a promise.
  • duration_mandatory β€” if set, the scan duration must be exactly what the duration field says. no negotiations, no wiggle room, periodt.
  • flags β€” control flags, and they come from enum nl80211_scan_flags. iykyk.
  • rates β€” a bitmap of rates to advertise, per band. one for each band in NUM_NL80211_BANDS.
  • wdev β€” the wireless device to scan for. this is the "who" of the whole operation.
  • mac_addr β€” the MAC address used with randomisation.
  • mac_addr_mask β€” the MAC address mask used with randomisation ✨ here's how it works: bits that are 0 in the mask should be randomised, and bits that are 1 should be taken from the mac_addr. mask says no, mac_addr says yes.
  • bssid β€” the BSSID to scan for. most commonly the wildcard BSSID, because we're not picky queens πŸ’…
  • wiphy β€” the wiphy this was for.
  • scan_start β€” the time (in jiffies) when the scan started. timestamp bestie ⏰
  • no_cck β€” used to send probe requests at a non-CCK rate in the 2GHz band.
  • scan_6ghz β€” only relevant for a split scan request. true if this is a 6 GHz scan request. 🧚
  • first_part β€” true if this is the first part of a split scan request, or a scan that was not split. may also be true for a scan_6ghz scan if no other channels were requested. slay, it's flexible like that.
  • n_6ghz_params β€” the number of 6 GHz params.
  • scan_6ghz_params β€” the 6 GHz params themselves. πŸ’œ
  • tsf_report_link_id β€” for MLO, this indicates the link ID of the BSS that should be used for TSF reporting. can be set to -1 to indicate no preference. very "i have no strong feelings either way" of it.
  • channels β€” the channels to scan on. the actual list, the real ones 🌟

ok that's part 1, and there's more coming so don't go anywhere β€” the rest of this page is literally loading πŸ’–

✨ SEE ALSO ✨

okay bestie, this is the cross-reference section and it is long β€” like, β€œscrolling the group chat after a nap” long. Every single link is here, no cap, so you can hop around the kernel API like a main character. πŸ’…

okay bestie, the cross-reference pile literally does not stop πŸ’€ β€” here's the rest of the SEE ALSO lineup, every single one scoped at (9) because kernel API, periodt:

the regulatory girlies ✨

channel switch crew πŸ¦‹

the conversion besties (operating class ↔ band ↔ chandef ↔ kHz) πŸŽ€

misc icons doing their thing πŸ’…

register/unregister trio, no cap 🌸

fast transition vibes 🧚

P2P + IE splitting section, she ate πŸ”₯

wakeup + crit proto πŸ’œ

channels and combinations, the math girlies πŸ“

stopping things (respectfully) πŸ’€

ext feature set/isset, a matched pair 🫢

NAN nation, there's a whole squad 😭

auth + measurement reports 🌈

iftype, assoc comeback, OWE info ⭐

BSS + colour change saga πŸ‘‘

6 GHz + MLO reconf, main character energy πŸ’–

scheduling + EPCS 🌸

debugfs locking, be normal about it πŸ™ˆ

S1G trio, lowkey iconic πŸ¦‹

and the final boss πŸ’œ


and that's the whole list, bestie β€” no skips, no summaries, we read all of them πŸ’…

fr fr if you got here from part 1 and part 2, go touch some grass, then come back and man your way through these. iykyk 🌱

that's a wrap on struct cfg80...scan_request(9) πŸŽ€ β€” sourced straight from ./include/net, dated October 2026, and yes the page name really is abbreviated like that in the footer, she's mysterious like that ✨ mwah, go read the kernel bestie πŸ’–

πŸ“¦ where this page comes from