BEACON FILTER SUPPORT(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

🌸 Beacon filter support(9) 🌸

Kernel API Manual β€’ section 9

Okay so bestie, some hardware has beacon filter support, and its whole mission is cutting down host CPU wakeups β€” which lowkey reduces system power consumption too. The vibe is: firmware creates a checksum of the beacon but omits all the constantly changing elements (TSF, TIM, etc.). Whenever that checksum changes, the beacon gets forwarded to the host; otherwise it just gets dropped. So the host only receives beacons where some relevant information (for example ERP protection or WMM settings) actually changed. ✨

Beacon filter support is advertised with the IEEE80211_VIF_BEACON_FILTER interface capability. The driver needs to enable beacon filter support whenever power save is enabled, that is when IEEE80211_CONF_PS is set. When power save is enabled, the stack will not check for beacon loss, and the driver needs to notify about loss of beacons with ieee80211_beacon_loss. 🚨

The time (or number of beacons missed) until the firmware notifies the driver of a beacon loss event (which in turn causes the driver to call ieee80211_beacon_loss) should be configurable and will be controlled by mac80211 and the roaming algorithm in the future.

Since there may be constantly changing information elements that nothing in the software stack cares about, we will, in the future, have mac80211 tell the driver which information elements are interesting in the sense that we want to see changes in them. This will include:

  • a list of information element IDs
  • a list of OUIs for the vendor information element

Ideally, the hardware would filter out any beacons without changes in the requested elements, but if it cannot support that it may, at the expense of some efficiency, filter out only a subset. For example, if the device doesn't support checking for OUIs it should pass up all changes in all vendor information elements. 🫢

Note that change, for the sake of simplification, also includes information elements appearing or disappearing from the beacon.

Some hardware supports an "ignore list" instead. Just make sure nothing that was requested is on the ignore list, and include commonly changing information element IDs in the ignore list, for example 11 (BSS load) and the various vendor-assigned IEs with unknown contents (128, 129, 133-136, 149, 150, 155, 156, 173, 176, 178, 179, 219); for forward compatibility it could also include some currently unused IDs. πŸ’…

In addition to these capabilities, hardware should support notifying the host of changes in the beacon RSSI. This is relevant to implement roaming when no traffic is flowing (when traffic is flowing we see the RSSI of the received data packets). This can consist of notifying the host when the RSSI changes significantly or when it drops below or rises above configurable thresholds. In the future these thresholds will also be configured by mac80211 (which gets them from userspace) to implement them as the roaming algorithm requires. 🌈

If the hardware cannot implement this, the driver should ask it to periodically pass beacon frames to the host so that software can do the signal strength threshold checking. πŸŽ€

🌸 SEE ALSO 🌸

okay bestie, this is the part where we give credit and also point you at, like, everything πŸ’… β€” no cap this is a LONG list, so buckle up. These are all the other kernel-doc pages in the mac80211 cinematic universe, and yes, every single one of them is listed below. iykyk 🫢

the star of the show first:

  • ./include/net/mac80211.h

✨ the starter pack ✨

πŸŽ€ queues, channels & events πŸŽ€

  • enum ieee80211_max_queues(9)
  • enum ieee80211_ac_numbers(9)
  • struct ieee80211_tx_queue_params(9)
  • enum ieee80211_chanctx_change(9)
  • struct ieee80211_chan_req(9)
  • struct ieee80211_chanctx_conf(9)
  • enum ieee80211_chanctx_switch_mode(9)
  • struct ieee80211_vif_chanctx_switch(9)
  • enum ieee80211_bss_change(9)
  • enum ieee80211_event_type(9)
  • enum ieee80211_rssi_event_data(9)
  • struct ieee80211_rssi_event(9)
  • enum ieee80211_mlme_event_data(9)
  • enum ieee80211_mlme_event_status(9)
  • struct ieee80211_mlme_event(9)
  • struct ieee80211_ba_event(9)
  • struct ieee80211_event(9)

πŸ¦‹ bss, mu, ftm & nan structs πŸ¦‹

  • struct ieee80211_mu_group_data(9)
  • struct ieee80211_ftm_responder_params(9)
  • struct ieee80211_fils_discovery(9)
  • struct ieee80211_parsed_tpe(9)
  • struct ieee80211_bss_npca_params(9)
  • struct ieee80211_bss_conf(9)
  • struct ieee80211_nan_channel(9)
  • struct ieee80211_nan_peer_map(9)
  • struct ieee80211_nan_peer_sched(9)

πŸ’– tx info & status lore πŸ’–

  • enum mac80211_tx_info_flags(9)
  • enum mac80211_tx_control_flags(9)
  • enum mac80211_tx_status_flags(9)
  • enum mac80211_rate_control_flags(9)
  • struct ieee80211_tx_rate(9)
  • struct ieee80211_tx_info(9)
  • struct ieee80211_tx_status(9)
  • struct ieee80211_scan_ies(9)
  • ieee80211_tx_info_clear_status(9)

🌈 rx status & conf 🌈

  • enum mac80211_rx_flags(9)
  • enum mac80211_rx_encoding_flags(9)
  • struct ieee80211_rx_status(9)
  • enum ieee80211_conf_flags(9)
  • enum ieee80211_conf_changed(9)
  • enum ieee80211_smps_mode(9)
  • struct ieee80211_conf(9)
  • struct ieee80211_channel_switch(9)

πŸ’œ vif things (there are so many) πŸ’œ

πŸ”‘ keys, bestie πŸ”‘ (secure the bag)

  • enum ieee80211_key_flags(9)
  • struct ieee80211_key_conf(9)
  • struct ieee80211_key_seq(9)
  • enum set_key_cmd(9)

πŸ“ stations & tx queues πŸ“

  • enum ieee80211_sta_state(9)
  • enum ieee80211_sta_rx_bandwidth(9)
  • struct ieee80211_sta_rates(9)
  • struct ieee80211_sta_txpwr(9)
  • struct ieee80211_sta_aggregates(9)
  • struct ieee80211_link_sta(9)
  • struct ieee80211_sta(9)
  • enum sta_notify_cmd(9)
  • struct ieee80211_tx_control(9)
  • struct ieee80211_txq(9)

πŸ‘‘ hw, scans & macros πŸ‘‘

🌸 the concept pages (aka the theory) 🌸

  • Hardware crypto acceleration(9)
  • Powersave support(9)
  • Spatial multiplexing power save(9)
  • Frame filtering(9)
  • AP support for powersaving clients(9)
  • HW queue control(9)

🧚 ops & driver plumbing 🧚

  • enum ieee80211_filter_flags(9)
  • enum ieee80211_ampdu_mlme_action(9)
  • struct ieee80211_ampdu_params(9)
  • enum ieee80211_frame_release_type(9)
  • enum ieee80211_rate_control_changed(9)
  • enum ieee80211_roc_type(9)
  • enum ieee80211_reconfig_type(9)
  • struct ieee80211_prep_tx_info(9)
  • struct ieee80211_ops(9)

πŸŽ€ alloc / register / unregister πŸŽ€

πŸ’€ rx path πŸ’€

πŸ¦‹ powersave + tx status πŸ¦‹

πŸ‘‘ beacons & CSA (the main character section) πŸ‘‘

✨ frame building ✨

πŸ”₯ TKIP + key handling πŸ”₯

πŸŽ€ queue control πŸŽ€

🧚 iteration nation 🧚

πŸ’œ work queues + aggregation πŸ’œ

πŸ“ sta helpers + airtime πŸ“

🌈 iter keys & chanctxs 🌈

😭 loss, disconnect & notify 😭

🫢 smps + remain-on-channel 🫢

πŸ’€ rx ba sessions πŸ’€

πŸ‘‘ rate control πŸ‘‘

✨ capability getters ✨

πŸŽ€ rssi, timestamps & wowlan πŸŽ€

πŸ¦‹ tx prep, radiotap, noa & tid πŸ¦‹

πŸ”₯ txq scheduling πŸ”₯

🧚 NAN (neighbor awareness, not the bread) 🧚

πŸ“ airtime, FILS & colors πŸ“


and that's the whole list, bestie β€” no skips, no crumbs, we ate every single one 🍽️✨

ok and for the credits bit: this gem lives in the kernel source file ./include/net, it's dated October 2026, and it's the page for Beacon filter support(9). periodt πŸ’…πŸŽ€πŸ¦‹
πŸ“¦ where this page comes from