STRUCT IEEE80211_TX_INFO(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

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 also enum ieee80211_status_data for the internal documentation.
  • hw_queue β€” HW queue to put the frame on, skb_get_queue_mapping gives 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 be NULL).
  • control.hw_key β€” key to encrypt with (may be NULL).
  • control.flags β€” control flags, see enum 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, see enum mac80211_tx_status_flags.
  • status.link_valid β€” if the link which is identified by status.link_id is 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 with status.link_valid.
  • status.status_driver_data β€” driver use area.
  • {unnamed_struct} β€” anonymous.
  • driver_rates β€” alias to control.rates to reserve space.
  • pad β€” padding.
  • rate_driver_data β€” driver use area if driver needs control.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)

πŸ”‘ 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

πŸ“ 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

πŸŽ€ rx entry points + tx status reporting

✨ beacon + CSA + colour change

πŸ¦‹ frame getters + durations

πŸ”₯ TKIP + key sequence + rekey

πŸ’… queue control + scan

🧚 iteration vibes + queueing work

🫢 BA sessions + sta lookups

🌈 iter keys + chanctx iteration

😭 loss, disconnect + notify

πŸ’€ rx BA administration

πŸŽ€ rate control + capabilities + radiotap

πŸ“ NOA + TDLS + TID reservations

πŸ’œ txq scheduling (the whole saga)

🧚 NAN girlies

⭐ airtime, templates + the final boss refs


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