STRUCT IEEE80211_HW(9)
π NAME π
struct ieee80211_hw - hardware information and state
Kernel API Manual β struct ieee80211_hw(9) π«Ά
okay bestie, this is the big one: the struct that holds all the hardware info + state for an 802.11 PHY. it's giving βthe driverβs whole personality lives hereβ energy. π
β¨ SYNOPSIS β¨
struct ieee80211_hw {
struct ieee80211_conf conf;
struct wiphy *wiphy;
const char *rate_control_algorithm;
void *priv;
unsigned long flags[BITS_TO_LONGS(NUM_IEEE80211_HW_FLAGS)];
unsigned int extra_tx_headroom;
unsigned int extra_beacon_tailroom;
int vif_data_size;
int sta_data_size;
int chanctx_data_size;
int txq_data_size;
u16 queues;
u16 max_listen_interval;
s8 max_signal;
u8 max_rates;
u8 max_report_rates;
u8 max_rate_tries;
u16 max_rx_aggregation_subframes;
u16 max_tx_aggregation_subframes;
u8 max_tx_fragments;
u8 offchannel_tx_hw_queue;
u8 radiotap_mcs_details;
u16 radiotap_vht_details;
struct {
int units_pos;
s16 accuracy;
} radiotap_timestamp;
netdev_features_t netdev_features;
u8 uapsd_queues;
u8 uapsd_max_sp_len;
u8 max_nan_de_entries;
u8 tx_sk_pacing_shift;
u8 weight_multiplier;
u32 max_mtu;
const s8 *tx_power_levels;
u8 max_txpwr_levels_idx;
};
lowkey just a whole vibe of fields, but every one matters. letβs go member by member, no skipping. π
π«Ά Members π«Ά
confβ astruct ieee80211_conf, AKA device configuration. donβt use. like, seriously, donβt.wiphyβ points to thestruct wiphyallocated for this 802.11 PHY. you must fill in theperm_addranddevmembers of this structure usingSET_IEEE80211_DEVandSET_IEEE80211_PERM_ADDR. also, all supported bands (with channels, bitrates) are registered here. β¨rate_control_algorithmβ rate control algorithm for this hardware. if unset (NULL), the default algorithm will be used. must be set before callingieee80211_register_hw. no procrastinating on this one. π«‘privβ pointer to the private area that was allocated for driver use along with this structure.flagsβ hardware flags, seeenum ieee80211_hw_flags.extra_tx_headroomβ headroom to reserve in each transmit skb for use by the driver (e.g. for transmit headers).extra_beacon_tailroomβ tailroom to reserve in each beacon tx skb. can be used by drivers to add extra IEs.vif_data_sizeβ size (in bytes) of thedrv_privdata area withinstruct ieee80211_vif.sta_data_sizeβ size (in bytes) of thedrv_privdata area withinstruct ieee80211_sta.chanctx_data_sizeβ size (in bytes) of thedrv_privdata area withinstruct ieee80211_chanctx_conf.txq_data_sizeβ size (in bytes) of thedrv_privdata area withinstruct ieee80211_txq.queuesβ number of available hardware transmit queues for data packets. WMM/QoS requires at least four, and these queues need to have configurable access parameters.max_listen_intervalβ max listen interval in units of beacon interval that the HW supports.max_signalβ maximum value for signal (rssi) in RX information, used only whenIEEE80211_HW_SIGNAL_UNSPECorIEEE80211_HW_SIGNAL_DB.max_ratesβ maximum number of alternate rate retry stages the hw can handle.max_report_ratesβ maximum number of alternate rate retry stages the hw can report back.max_rate_triesβ maximum number of tries for each stage.max_rx_aggregation_subframesβ maximum buffer size (number of sub-frames) to be used for A-MPDU block ack receiver aggregation. this is only relevant if the device has restrictions on the number of subframes; if it relies on mac80211 to do reordering, it shouldnβt be set.max_tx_aggregation_subframesβ maximum number of subframes in an aggregate an HT/HE device will transmit. in HT AddBA weβll advertise a constant value of64as some older APs crash if the window size is smaller (an example is LinkSys WRT120N with FW v1.0.07 build 002 Jun 18 2012). for AddBA to HE capable peers this value will be used. π«max_tx_fragmentsβ maximum number of tx buffers per (A)-MSDU, sum of1 + skb_shinfo(skb)->nr_fragsfor each skb in thefrag_list.offchannel_tx_hw_queueβ HW queue ID to use for offchannel TX (ifIEEE80211_HW_QUEUE_CONTROLis set).radiotap_mcs_detailsβ lists which MCS information the HW reports. by default it is set to_MCS,_GIand_BWbut doesnβt include_FMT. useIEEE80211_RADIOTAP_MCS_HAVE_values, only adding_BWis supported today.radiotap_vht_detailsβ lists which VHT MCS information the HW reports. the default is_GI | _BANDWIDTH. use theIEEE80211_RADIOTAP_VHT_KNOWN_values.radiotap_timestampβ information for the radiotap timestamp field; if theunits_posmember is set to a non-negative value then the timestamp field will be added and populated from thestruct ieee80211_rx_statusdevice_timestamp.radiotap_timestamp.units_posβ must be set to a combination of aIEEE80211_RADIOTAP_TIMESTAMP_UNIT_*and aIEEE80211_RADIOTAP_TIMESTAMP_SPOS_*value.radiotap_timestamp.accuracyβ if non-negative, fills the accuracy in the radiotap field and the accuracy known flag will be set.netdev_featuresβ netdev features to be set in each netdev created from this HW. note that not all features are usable with mac80211, and other features will be rejected during HW registration.uapsd_queuesβ this bitmap is included in (re)association frame to indicate for each access category if it is uAPSD trigger-enabled and delivery-enabled. useIEEE80211_WMM_IE_STA_QOSINFO_AC_*to set this bitmap. each bit corresponds to a different AC. value'1'in a specific bit means that the corresponding AC is both trigger- and delivery-enabled.'0'means neither enabled.uapsd_max_sp_lenβ maximum number of total buffered frames the WMM AP may deliver to a WMM STA during any Service Period triggered by the WMM STA. useIEEE80211_WMM_IE_STA_QOSINFO_SP_*for correct values.max_nan_de_entriesβ maximum number of NAN DE functions supported by the device.tx_sk_pacing_shiftβ pacing shift to set on TCP sockets when frames from them are encountered. the default should typically not be changed, unless the driver has good reasons for needing more buffers.weight_multiplierβ driver specific airtime weight multiplier used while refilling deficit of each TXQ.max_mtuβ the max mtu could be set.tx_power_levelsβ a list of power levels supported by the wifi hardware. the power levels can be specified either as integer or fractions. the power level at idx 0 shall be the maximum positive power level.max_txpwr_levels_idxβ the maximum valid idx of thetx_power_levelslist.
π¦ Description π¦
bottom line, bestie: this structure contains the configuration and hardware information for an 802.11 PHY. itβs literally the whole setup-and-state situation, and every field above is part of the lore. π
β¨ SEE ALSO β¨
okay bestie, deep breath π this is the whole mac80211 extended universe, and likeβ¦ it's a lot. It's giving "the library has one card catalog and it's the size of a building." But it's also iconic, so here we go π«Ά
First things first β everything here lives in the kernel file ./include/net/mac80211.h:
./include/net/mac80211.h
Then the pages themselves, starting with the intro-level lore:
Introduction(9),Calling mac80211 from interrupts(9),Warning(9),Frame format(9),mac80211 workqueue(9),mac80211 software tx queueing(9),HW timestamping(9),enum ieee80211_max_queues(9),enum ieee80211_ac_numbers(9),struct ieee80211_tx_queue_params(9)
The channel-context girlies β¨:
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)
Event + BSS-adjacent structs, no cap:
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)
The tx section of the multiverse π₯:
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)
The rx girlies, keeping it symmetrical π
:
enum mac80211_rx_flags(9),enum mac80211_rx_encoding_flags(9),struct ieee80211_rx_status(9)
Configuration era πΈ:
enum ieee80211_conf_flags(9),enum ieee80211_conf_changed(9),enum ieee80211_smps_mode(9),struct ieee80211_conf(9),struct ieee80211_channel_switch(9)
VIFs and all their cousins (there are so many cousins):
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),struct ieee80211_vif(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 π:
enum ieee80211_key_flags(9),struct ieee80211_key_conf(9),struct ieee80211_key_seq(9),enum set_key_cmd(9)
Stations, links, txq, and a couple of macros that are lowkey the main characters:
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_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)
These next ones are the doc chapters, and honestly kind of a vibe check for the whole driver:
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)
The ops core β the stuff you literally cannot skip, bestie:
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)
LEDs, teardown, and the restart trio π
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)
Receiving + powersave π¦:
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)
TX status reporting, aka the "did it send tho" files:
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),struct ieee80211_mutable_offsets(9)
Beacon content, countdowns, and channel-switch finishing β¨:
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)
Frame builders, come get y'all juice π§:
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 and key-sequence stuff β yes, tkip really does show up five separate times π:
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)
Queue control + scan completion, the traffic-cop section π¦:
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 macros and friends (the for_each ones ate, fr fr):
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, station lookups, airtime, and key iteration π:
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)
Loss, disconnect, CQM, radar, channel-switch, and ROC β the dramatic chapters π:
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)
RX block-ack, the whole saga π:
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 getters, RSSI, timestamps, wowlan, radiotap, NOA, TDLS, TID:
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)
The TXQ scheduling club π:
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 BATCH, we made it, I'm literally so proud of you π₯Ή:
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)
ngl that's a LOT of cross-references, but every single one is a real page you can pull up β go click around, it's a whole rabbit hole and it's kind of addictive π
And that's the whole thing, bestie β page done, brain full, vibes immaculate π This one's from the ./include/net corner of the kernel docs, dated October 2026, and it's all about struct ieee80211_hw(9). Go take a nap, you earned it πβ¨
π¦ 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