STRUCT IEEE80211_TX_INFO(9)
Okay bestie, this is struct ieee80211_tx_info(9) from the Kernel API Manual β skb transmit information β and yes, we're doing part 1 of this absolute unit of a struct. Buckle up. π
β¨
πΈ NAME πΈ
struct ieee80211_tx_info β skb transmit information.
β¨ SYNOPSIS β¨
struct ieee80211_tx_info {
u32 flags;
u32 band:3, status_data_idr:1, status_data:13, hw_queue:4,
tx_time_mc:1, tx_time_est:10;
union {
struct {
union {
struct {
struct ieee80211_tx_rate rates[ IEEE80211_TX_MAX_RATES];
s8 rts_cts_rate_idx;
u8 use_rts:1;
u8 use_cts_prot:1;
u8 short_preamble:1;
u8 skip_table:1;
u8 antennas:2;
};
unsigned long jiffies;
};
struct ieee80211_vif *vif;
struct ieee80211_key_conf *hw_key;
u32 flags;
codel_time_t enqueue_time;
} control;
struct {
u64 cookie;
} ack;
struct {
struct ieee80211_tx_rate rates[IEEE80211_TX_MAX_RATES];
s32 ack_signal;
u8 ampdu_ack_len;
u8 ampdu_len;
u8 antenna;
u8 pad;
u16 tx_time;
u8 flags;
u8 link_valid:1, link_id:4;
void *status_driver_data[16 / sizeof(void *)];
} status;
struct {
struct ieee80211_tx_rate driver_rates[ IEEE80211_TX_MAX_RATES];
u8 pad[4];
void *rate_driver_data[ IEEE80211_TX_INFO_RATE_DRIVER_DATA_SIZE
/ sizeof(void *)];
};
void *driver_data[ IEEE80211_TX_INFO_DRIVER_DATA_SIZE /
sizeof(void *)];
};
};
π§ Members π§
Okay so the member list is giving very detailed group project notes, and we are keeping every single one. π«Ά
flagsβ transmit info flags, defined above.bandβ the band to transmit on (use e.g. for checking for races), not valid if the interface is an MLD since we won't know which link the frame will be transmitted on.status_data_idrβ indicates status data is IDR allocated ID for ack frame.status_dataβ internal data for TX status handling, assigned privately, see alsoenum ieee80211_status_datafor the internal documentation.hw_queueβ HW queue to put the frame on,skb_get_queue_mappinggives the AC.tx_time_mcβ TX time estimate is for a multicast frame, used internally.tx_time_estβ TX time estimate in units of 4us, used internally.{unnamed_union}β anonymous.controlβ union part for control data.{unnamed_union}β anonymous.{unnamed_struct}β anonymous.control.ratesβ TX rates array to try.control.rts_cts_rate_idxβ rate for RTS or CTS.control.use_rtsβ use RTS.control.use_cts_protβ use RTS/CTS.control.short_preambleβ use short preamble (CCK only).control.skip_tableβ skip externally configured rate table.control.jiffiesβ timestamp for expiry on powersave clients.control.vifβ virtual interface (may beNULL).control.hw_keyβ key to encrypt with (may beNULL).control.flagsβ control flags, seeenum mac80211_tx_control_flags.control.enqueue_timeβ enqueue time (for iTXQs).ackβ union part for pure ACK data.ack.cookieβ cookie for the ACK.statusβ union part for status data.status.ratesβ attempted rates.status.ack_signalβ ACK signal.status.ampdu_ack_lenβ AMPDU ack length.status.ampdu_lenβ AMPDU length.status.antennaβ (legacy, kept only for iwlegacy).status.tx_timeβ airtime consumed for transmission; note this is only used for WMM AC, not for airtime fairness.status.flagsβ status flags, seeenum mac80211_tx_status_flags.status.link_validβ if the link which is identified bystatus.link_idis valid. This flag is set by the driver in the TX status callback when the connection is MLO and the driver knows which link was used for TX.status.link_idβ id of the link used to transmit the packet. This is used along withstatus.link_valid.status.status_driver_dataβ driver use area.{unnamed_struct}β anonymous.driver_ratesβ alias tocontrol.ratesto reserve space.padβ padding.rate_driver_dataβ driver use area if driver needscontrol.rates.driver_dataβ array of driver_data pointers.
Tiny side note, bestie: the struct code up in the synopsis also has u8 antennas:2; inside the control block β the original member list doesn't give it its own bullet, so I'm not inventing a description for it. Keeping it exactly as the page serves it. π
π Description π
This structure is placed in skb->cb for three uses: (1) mac80211 TX control β mac80211 tells the driver what to do; (2) driver internal use (if applicable); and (3) TX status information β driver tells mac80211 what happened. That's the trio, and that's exactly the vibe this struct is carrying. π
π¦ SEE ALSO π¦
okay bestie, this is the part where the page points at literally everyone else it knows. it's a whole group chat of cross-references and i'm not skipping a single one, so buckle up π
πΈ the big-picture lore drops
- kernel file
./include/net/mac80211.hβ the mothership, that's where this all lives Introduction(9)Calling mac80211 from interrupts(9)Warning(9)β yes it gets its own page, read it πFrame format(9)mac80211 workqueue(9)mac80211 software tx queueing(9)HW timestamping(9)
π queues and channel-context cuties
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)
β¨ BSS + events (the 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)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, flags, status β the actual neighbours
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_status(9)struct ieee80211_scan_ies(9)ieee80211_tx_info_clear_status(9)β the function, lowkey the main character of cleanup
π«Ά rx side
enum mac80211_rx_flags(9)enum mac80211_rx_encoding_flags(9)struct ieee80211_rx_status(9)
π conf corner
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 girlies (and their link situations)
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)
π key stuff
enum ieee80211_key_flags(9)struct ieee80211_key_conf(9)struct ieee80211_key_seq(9)enum set_key_cmd(9)
β sta stuff + little friends
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 + device setup
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)
π the feature explainer pages (yes they're pages too)
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-adjacent enums + structs
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)
πΈ hw lifecycle + LEDs
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 + tx status reporting
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 + CSA + colour change
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 + durations
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 + rekey
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
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 vibes + queueing work
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 lookups
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)
π iter keys + chanctx iteration
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 + notify
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 BA administration
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 + capabilities + radiotap
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 + TID reservations
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 whole saga)
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 girlies
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)
β airtime, templates + the final boss refs
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 bestie that's the entire friend list π every single one of these is a real page you can go read, so likeβ¦ go off, iykyk π«Ά
and that's a wrap on struct ieee80211_tx_info(9) fr fr π this lil masterpiece lives in the kernel file ./include/net, it's the October 2026 edition, and it goes by struct ieee80211_tx_info(9) β screenshot, save, memorise, periodt π
β¨
π¦ 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