STRUCT IEEE80211_LINK_STA(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

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 the addr in ieee80211_sta (identical, twins, no cap). for a MLO Link STA this addr can be the same or different from the addr in ieee80211_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's 0 for deflink. zero. the default one. πŸŽ€
  • smps_mode β€” the current SMPS mode: off, static or dynamic. 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