STRUCT IEEE80211_LINK_STA(9)
π struct ieee80211_link_sta β Kernel API Manual π
okay bestie, buckle up, because this is struct ieee80211_link_sta from the kernel API manual and it is lowkey the main character of link-specific STA info π
so like, literally all the link-specific info for a STA link lives right here β whether you're a non-MLD STA (just the one, single entry, she's solo) or a MLD STA (multiple entries, she's got friends). it's all stored in this one struct. slay. β¨
πΈ SYNOPSIS πΈ
struct ieee80211_link_sta {
struct ieee80211_sta *sta;
u8 addr[ETH_ALEN];
u8 link_id;
enum ieee80211_smps_mode smps_mode;
u32 supp_rates[NUM_NL80211_BANDS];
struct ieee80211_sta_ht_cap ht_cap;
struct ieee80211_sta_vht_cap vht_cap;
struct ieee80211_sta_he_cap he_cap;
struct ieee80211_he_6ghz_capa he_6ghz_capa;
struct ieee80211_sta_eht_cap eht_cap;
struct ieee80211_sta_uhr_cap uhr_cap;
struct ieee80211_sta_s1g_cap s1g_cap;
struct ieee80211_sta_aggregates agg;
u8 rx_nss;
enum ieee80211_sta_rx_bandwidth bandwidth;
struct ieee80211_sta_txpwr txpwr;
};
look at her. gorgeous. flawless. no notes. π
π¦ Members π¦
staβ the reference to the owning STA. like, who does this link even belong to? this guy. πaddrβ the MAC address of the Link STA. for a non-MLO STA this is the same as theaddrinieee80211_sta(identical, twins, no cap). for a MLO Link STA thisaddrcan be the same or different from theaddrinieee80211_sta(the one representing the MLD STA addr). choose your fighter, both are valid π«link_idβ the link ID for this link STA. and bestie, it's0for deflink. zero. the default one. πsmps_modeβ the current SMPS mode:off,staticordynamic. pick your vibe check for power saving β‘supp_ratesβ Bitmap of supported rates. yes, bitmap. she's a bitmask and she's thriving π§ht_capβ the HT capabilities of this STA β but here's the tea β they're restricted to our own capabilities. so it's their caps, filtered through ours. no extras allowed, periodt.vht_capβ the VHT capabilities of this STA β same deal, restricted to our own capabilities. we're matching energy over here π«Άhe_capβ the HE capabilities of this STA. no restrictions mentioned, she's free πhe_6ghz_capaβ on 6 GHz, this holds the HE 6 GHz band capabilities. the 6 GHz girlies get their own little field and honestly? iconic πeht_capβ the EHT capabilities of this STA. the newest gen, absolutely ate π₯uhr_capβ the UHR capabilities of this STA. yes queen, keep stacking those capabilities πs1g_capβ the S1G capabilities of this STA. she's here, she's sub-1-GHz, she's serving πΈaggβ per-link data for multi-link aggregation. this is the group-chat logistics of the multi-link world β the data, per link, for agg. πrx_nssβ in HT/VHT, this is the maximum number of spatial streams the station can receive at the moment. and ngl, it gets changed by operating mode notifications and capabilities.
β οΈ important caveat bestie: this value is only valid after the station moves to associated state. and it's Invalid for NAN since NAN operates on multiple configurations of rx_nss. so like, don't come for her before association, fr fr.
bandwidthβ the current bandwidth the station can receive with. this is the minimum between the peer's capabilities and our own operating channel width β the smaller of the two, the humble one, the peacemaker ποΈ
β οΈ also Invalid for NAN, because that's operating on multiple channels. NAN stays doing the most, honestly.
txpwrβ the station tx power configuration. the power settings. the "how loud am I allowed to yell" field π£
and that's the members, but we're not done yet β part 2 is coming so don't go anywhere π
π SEE ALSO π
okay bestie, real talk: this section is a receipt π β it's the entire mac80211 friend group and you're about to be introduced to every single one of them. The mothership file that contains literally all of it is:
Kernel file ./include/net/mac80211.h
Start with the intros and ground rules: Introduction(9), Calling mac80211 from interrupts(9) (yes, that one matters π), Warning(9), Frame format(9), mac80211 workqueue(9), mac80211 software tx queueing(9), and HW timestamping(9). πΈ
Queue and channel-context girlies, assemble: 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). β¨
Events!! the whole drama pipeline: 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 config besties plus the NAN crew: 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 side of the family, no cap: 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 girlies + the conf and channel-switch crew: 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 flags, offloads, and MLD realness: 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 and station stuff (the cousin of this very page lives here π): 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_sta(9), enum sta_notify_cmd(9), struct ieee80211_tx_control(9), struct ieee80211_txq(9). π
hw + device plumbing, the backstage crew: 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). π§
Then the ~concept~ pages (no struct, just vibes, but they ate): 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). π
Ops and filter flags, the whole control room: 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 plus the LED cuties: 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 entry points and powersave transitions: 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 besties: 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 template crew, EMA girlies fully included: 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). π
Frame-getters and duration math, lowkey iconic: 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 + key-sequence nerds, we love a specialist: 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 wake/stop plus scan completion: 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 everything β interfaces, stations, work queueing: 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). π§
BA sessions, sta lookup, and airtime accounting: 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). π
Key/chanctx iteration and every loss/disconnect notification: 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), 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). π
ROC + RX BA squad: 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 getters: 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). β¨
NOA, TDLS, and the txq scheduling squad: 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), 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). πΈ
NAN, airtime math, and the final boss refs: 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). π«Ά
that's the whole roster, every single name, no skips no cuts π this page comes from ./include/net, October 2026, and it's filed under struct ieee80211_link_sta(9) β go read some kernel docs bestie, you've got this π
π¦ 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