STRUCT IEEE80211_VIF(9)
okay so welcome to the Kernel API Manual page for struct ieee80211_vif(9) β the per-interface data struct, and yes bestie, this is the main character of driver-facing vif data π
β¨
π NAME π
struct ieee80211_vif β per-interface data. That's the vibe: one struct holding the data for a virtual interface. No cap.
β¨ SYNOPSIS β¨
Here's the exact shape, bestie β don't let the brackets scare you:
struct ieee80211_vif {
enum nl80211_iftype type;
struct ieee80211_vif_cfg cfg;
struct ieee80211_bss_conf bss_conf;
struct ieee80211_bss_conf *link_conf[IEEE80211_MLD_MAX_NUM_LINKS];
u16 valid_links, active_links, dormant_links, suspended_links;
struct ieee80211_neg_ttlm neg_ttlm;
u8 addr[ETH_ALEN];
bool addr_valid;
bool p2p;
u8 cab_queue;
u8 hw_queue[IEEE80211_NUM_ACS];
struct ieee80211_txq *txq;
struct ieee80211_txq *txq_mgmt;
netdev_features_t netdev_features;
u32 driver_flags;
u32 offload_flags;
#ifdef CONFIG_MAC80211_DEBUGFS;
struct dentry *debugfs_dir;
#endif;
bool probe_req_reg;
bool rx_mcast_action_reg;
u8 drv_priv[];
};
π Members π
okay, field-by-field, because every single one matters (yes, even the quiet ones):
typeβ type of this virtual interface, bestie. It's anenum nl80211_iftypesituation.cfgβ the vif configuration. Seestruct ieee80211_vif_cfgfor the details πbss_confβ BSS configuration for this interface: either our own BSS or the BSS we're associated to.link_confβ in case of MLD, this is the per-link BSS configuration, indexed by link ID. Yep, it's literallystruct ieee80211_bss_conf *link_conf[IEEE80211_MLD_MAX_NUM_LINKS].valid_linksβ bitmap of valid links, or0for non-MLO. Simple as that.active_linksβ the bitmap of active links, or0for non-MLO. β οΈ the driver shouldn't change this directly β use the API calls meant for that purpose, fr fr.dormant_linksβ a subset of the valid links that are disabled/suspended due to advertised or negotiated TTLM respectively.0for non-MLO. The TTLM lore is real.suspended_linksβ subset ofdormant_linksrepresenting links that are suspended due to negotiated TTLM, and could be activated in the future by tearing down the TTLM negotiation.0for non-MLO.neg_ttlmβ negotiated TID to link mapping info. Seestruct ieee80211_neg_ttlm. TID, not tidying up β okay, moving on πaddrβ address of this interface.addr_validβ indicates if the address is actively used. Set tofalsefor passive monitor interfaces, andtruein all other cases. No cap.p2pβ indicates whether this AP or STA interface is a p2p interface, i.e. a GO or p2p-sta respectively. P2P representation matters β¨cab_queueβ content-after-beacon (DTIM beacon really) queue, AP mode only. It's giving beacon afterparty.hw_queueβ hardware queue for each AC.txqβ the multicast data TX queue.txq_mgmtβ the mgmt frame TX queue; currently only exists for NAN devices.netdev_featuresβ tx netdev features supported by the hardware for this vif. mac80211 initializes this tohw->netdev_features, and the driver can mask out specific tx features. mac80211 will handle software fixup for masked offloads (GSO,CSUM). Very much a team effort π«Άdriver_flagsβ flags/capabilities the driver has for this interface. These need to be set (or cleared) when the interface is added or, if supported by the driver, when the interface type is changed at runtime. mac80211 will never touch this field β it's driver main character energy.offload_flagsβ 802.3 -> 802.11 enapsulation offload flags. Seeenum ieee80211_offload_flags.debugfs_dirβ debugfs dentry, can be used by drivers to create their own per-interface debug files. Note that it will beNULLfor the virtual monitor interface (if that is requested).probe_req_regβ probe requests should be reported to mac80211 for this interface.rx_mcast_action_regβ multicast Action frames should be reported to mac80211 for this interface.drv_privβ data area for driver use, will always be aligned tosizeof(void .β yes bestie, that's exactly how it's written on the page, so we're keeping it verbatim π
π Description π
Data in this structure is continually present for driver use during the life of a virtual interface. That's the whole point: it's the per-interface data that hangs around for the driver while the vif exists. Iconic, lowkey essential, periodt.
β¨ SEE ALSO β¨
okay bestie, breathe. this section is the entire mac80211 cinematic universe in one list π it's giving "the professor said the exam covers everything" energy. but every single entry is here, no skips, no cap.
first up, the actual header this whole page lives in:
./include/net/mac80211.hβ Kernel file
then the big-picture reads (start here if you're new, fr):
Introduction(9)Calling mac80211 from interrupts(9)Warning(9)Frame format(9)mac80211 workqueue(9)mac80211 software tx queueing(9)HW timestamping(9)
okay now the types zone π queues, channel contexts, and the whole event family:
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)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/rx status era π¦ this chunk is lowkey the main character of driver writing:
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)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)enum ieee80211_vif_flags(9)enum ieee80211_offload_flags(9)struct ieee80211_eml_params(9)struct ieee80211_nan_sched_cfg(9)struct ieee80211_vif_cfg(9)struct ieee80211_neg_ttlm(9)enum ieee80211_neg_ttlm_res(9)ieee80211_vif_usable_links(9)ieee80211_vif_is_mld(9)ieee80211_vif_link_active(9)wdev_to_ieee80211_vif(9)ieee80211_vif_to_wdev(9)
keys and stations, the iconic duo π:
enum ieee80211_key_flags(9)struct ieee80211_key_conf(9)struct ieee80211_key_seq(9)enum set_key_cmd(9)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)enum ieee80211_hw_flags(9)struct ieee80211_hw(9)struct ieee80211_scan_request(9)struct ieee80211_tdls_ch_sw_params(9)wiphy_to_ieee80211_hw(9)SET_IEEE80211_DEV(9)SET_IEEE80211_PERM_ADDR(9)ieee80211_free_txskb(9)ieee80211_purge_tx_queue(9)
feature-doc o'clock π these are the "how does this whole thing actually work" pages:
Hardware crypto acceleration(9)Powersave support(9)Beacon filter support(9)Spatial multiplexing power save(9)Frame filtering(9)AP support for powersaving clients(9)HW queue control(9)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)ieee80211_alloc_hw_nm(9)ieee80211_alloc_hw(9)ieee80211_register_hw(9)struct ieee80211_tpt_blink(9)enum ieee80211_tpt_led_trigger_flags(9)ieee80211_get_tx_led_name(9)ieee80211_get_rx_led_name(9)ieee80211_get_assoc_led_name(9)ieee80211_get_radio_led_name(9)ieee80211_create_tpt_led_trigger(9)ieee80211_unregister_hw(9)ieee80211_free_hw(9)ieee80211_restart_hw(9)
rx path + powersave, the "what happens when frames actually show up" zone πΈ:
ieee80211_rx_list(9)ieee80211_rx_napi(9)ieee80211_rx(9)ieee80211_rx_irqsafe(9)ieee80211_rx_ni(9)ieee80211_sta_ps_transition(9)ieee80211_sta_ps_transition_ni(9)ieee80211_sta_pspoll(9)ieee80211_sta_uapsd_trigger(9)ieee80211_sta_set_buffered(9)ieee80211_get_tx_rates(9)ieee80211_tx_rate_update(9)ieee80211_tx_status_skb(9)ieee80211_tx_status_ext(9)ieee80211_tx_status_noskb(9)ieee80211_tx_status_ni(9)ieee80211_tx_status_irqsafe(9)ieee80211_report_low_ack(9)
beacon besties π‘ honestly iconic that this many pages exist just for beacons:
struct ieee80211_mutable_offsets(9)ieee80211_beacon_get_template(9)ieee80211_beacon_get_template_ema_index(9)struct ieee80211_ema_beacons(9)ieee80211_beacon_get_template_ema_list(9)ieee80211_beacon_free_ema_list(9)ieee80211_beacon_get_tim(9)ieee80211_beacon_get(9)ieee80211_beacon_update_cntdwn(9)ieee80211_beacon_set_cntdwn(9)ieee80211_csa_finish(9)ieee80211_beacon_cntdwn_is_complete(9)ieee80211_color_change_finish(9)ieee80211_proberesp_get(9)ieee80211_pspoll_get(9)ieee80211_nullfunc_get(9)ieee80211_probereq_get(9)ieee80211_rts_get(9)ieee80211_rts_duration(9)ieee80211_ctstoself_get(9)ieee80211_ctstoself_duration(9)ieee80211_generic_frame_duration(9)ieee80211_get_buffered_bc(9)
TKIP + rekey + queue control, the vintage-but-still-here corner π:
ieee80211_get_tkip_p1k_iv(9)ieee80211_get_tkip_p1k(9)ieee80211_get_tkip_rx_p1k(9)ieee80211_get_tkip_p2k(9)ieee80211_tkip_add_iv(9)ieee80211_get_key_rx_seq(9)ieee80211_set_key_rx_seq(9)ieee80211_gtk_rekey_add(9)ieee80211_gtk_rekey_notify(9)ieee80211_key_mic_failure(9)ieee80211_key_replay(9)ieee80211_wake_queue(9)ieee80211_stop_queue(9)ieee80211_queue_stopped(9)ieee80211_stop_queues(9)ieee80211_wake_queues(9)ieee80211_scan_completed(9)ieee80211_sched_scan_results(9)ieee80211_sched_scan_stopped(9)
iteration nation π macros and their function friends, together forever:
enum ieee80211_interface_iteration_flags(9)ieee80211_iterate_interfaces(9)ieee80211_iterate_active_interfaces(9)ieee80211_iterate_active_interfaces_atomic(9)for_each_interface(9)for_each_active_interface(9)ieee80211_iterate_active_interfaces_mtx(9)ieee80211_iterate_stations_atomic(9)for_each_station(9)ieee80211_iterate_stations_mtx(9)ieee80211_queue_work(9)ieee80211_queue_delayed_work(9)
block-ack szn π₯ plus sta lookups and airtime bookkeeping:
ieee80211_refresh_tx_agg_session_timer(9)ieee80211_start_tx_ba_session(9)ieee80211_start_tx_ba_cb_irqsafe(9)ieee80211_stop_tx_ba_session(9)ieee80211_stop_tx_ba_cb_irqsafe(9)ieee80211_find_sta(9)ieee80211_find_sta_by_ifaddr(9)ieee80211_find_sta_by_link_addrs(9)ieee80211_sta_block_awake(9)ieee80211_sta_eosp(9)ieee80211_send_eosp_nullfunc(9)ieee80211_sta_recalc_aggregates(9)ieee80211_sta_register_airtime(9)ieee80211_txq_airtime_check(9)ieee80211_txq_aql_pending(9)ieee80211_iter_keys(9)ieee80211_iter_keys_rcu(9)ieee80211_iter_chan_contexts_atomic(9)ieee80211_iter_chan_contexts_mtx(9)ieee80211_ap_probereq_get(9)
the "everything is on fire" collection π loss, disconnect, radar, channel switch:
ieee80211_beacon_loss(9)ieee80211_connection_loss(9)ieee80211_disconnect(9)ieee80211_resume_disconnect(9)ieee80211_hw_restart_disconnect(9)ieee80211_cqm_rssi_notify(9)ieee80211_cqm_beacon_loss_notify(9)ieee80211_radar_detected(9)ieee80211_chswitch_done(9)ieee80211_channel_switch_disconnect(9)ieee80211_request_smps(9)ieee80211_ready_on_channel(9)ieee80211_remain_on_channel_expired(9)ieee80211_stop_rx_ba_session(9)ieee80211_mark_rx_ba_filtered_frames(9)ieee80211_send_bar(9)ieee80211_manage_rx_ba_offl(9)ieee80211_start_rx_ba_session_offl(9)ieee80211_stop_rx_ba_session_offl(9)ieee80211_rx_ba_timer_expired(9)
rate control + capability lookups + a whole cluster of helpers π§:
struct ieee80211_tx_rate_control(9)enum rate_control_capabilities(9)rate_control_set_rates(9)ieee80211_get_he_iftype_cap_vif(9)ieee80211_get_he_6ghz_capa_vif(9)ieee80211_get_eht_iftype_cap_vif(9)ieee80211_get_uhr_iftype_cap_vif(9)ieee80211_update_mu_groups(9)ieee80211_ave_rssi(9)ieee80211_calculate_rx_timestamp(9)ieee80211_report_wowlan_wakeup(9)ieee80211_tx_prepare_skb(9)ieee80211_parse_tx_radiotap(9)struct ieee80211_noa_data(9)ieee80211_parse_p2p_noa(9)ieee80211_update_p2p_noa(9)ieee80211_tdls_oper_request(9)ieee80211_reserve_tid(9)ieee80211_unreserve_tid(9)
txq scheduling, the group project nobody wants but everybody needs π:
ieee80211_tx_dequeue(9)ieee80211_tx_dequeue_ni(9)ieee80211_handle_wake_tx_queue(9)ieee80211_next_txq(9)ieee80211_txq_schedule_start(9)ieee80211_schedule_txq(9)ieee80211_return_txq(9)ieee80211_txq_may_transmit(9)ieee80211_txq_get_depth(9)
and the final boss batch: NAN, airtime, FILS, colours, links, bandwidth, and one very important encryption helper β
ieee80211_nan_func_terminated(9)ieee80211_nan_func_match(9)ieee80211_nan_sched_update_done(9)ieee80211_nan_cluster_joined(9)ieee80211_nan_try_evacuate(9)ieee80211_calc_rx_airtime(9)ieee80211_calc_tx_airtime(9)ieee80211_get_fils_discovery_tmpl(9)ieee80211_get_unsol_bcast_probe_resp_tmpl(9)ieee80211_obss_color_collision_notify(9)ieee80211_is_tx_data(9)ieee80211_set_active_links(9)ieee80211_set_active_links_async(9)ieee80211_send_teardown_neg_ttlm(9)ieee80211_chan_width_to_rx_bw(9)ieee80211_prepare_rx_omi_bw(9)ieee80211_finalize_rx_omi_bw(9)ieee80211_vif_nan_started(9)ieee80211_encrypt_tx_skb(9)
and that's the whole list, bestie β you officially survived the mac80211 extended universe π go drink some water fr fr π«Ά
this page lives in ./include/net, dated October 2026, and it's the struct ieee80211_vif(9) glow-up. mwah πβ¨
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms