ieee80211_amsdu_to_8023s(9)
π« ieee80211_amsdu_to_8023s(9) β the Kernel API Manual, bestie edition π«
okay so picture this: you're deep in the kernel, section 9 of the manual, and you've got yourself an A-MSDU frame that needs decoding. this is literally the page for that. welcome, i'm so glad you're here π«Ά
β¨ NAME β¨
ieee80211_amsdu_to_8023s β decode an IEEE 802.11n A-MSDU frame π
πΈ SYNOPSIS πΈ
void ieee80211_amsdu_to_8023s (struct sk_buff *skb , struct sk_buff_head
*list , const u8 *addr , enum nl80211_iftype iftype , const unsigned int
extra_headroom , const u8 *check_da , const u8 *check_sa , u8
mesh_control );
like, yes, that's a whole lot of parameters. we'll get through them together, one at a time, no cap π
π¦ ARGUMENTS π¦
skbβ the input A-MSDU frame, and bestie listen: it comes in with no headers at all. fully header-less. naked frame energy π«£listβ the output list of 802.3 frames. heads up tho: you (the caller) have to allocate and initialize it. it is not gonna do that for you, it's not that kind of function πaddrβ the device MAC address β¨iftypeβ the device interface type, as anenum nl80211_iftypeπextra_headroomβ the hardware extra headroom for SKBs in the list. anconst unsigned int, iconic, mysterious, necessary πcheck_daβ the DA to check in the inner ethernet header, orNULL. your choice, main character πcheck_saβ the SA to check in the inner ethernet header, orNULL. same vibe, different destination/source situation, iykyk πΈmesh_controlβ seemesh_hdrinieee80211_is_valid_amsdu. that's the whole description. go look at that one for the lore π§
π₯ DESCRIPTION π₯
so what does this actually do? it decodes an IEEE 802.11 A-MSDU and converts it into a list of 802.3 frames. one in, a whole little list out β it's giving assembly line, it's giving transformation arc π
β οΈ real talk: the list will be empty if the decode fails. no partial results, no leftovers, just vibes and an empty list. π
π and the important one: theskbmust be fully header-less before being passed in here β and it is freed in this function. so do not, i repeat, do not go touching thatskbafterwards. it's gone. periodt.
more parts coming, don't go anywhere bestie π
π SEE ALSO π
okay bestie, buckle up, because this is the part where the manpage introduces you to its entire friend group π and it is a LOT of friends. like, "my birthday party is at a stadium" levels of friends. every single one of these is a (9) page, every single one is real, and we're listing them all because we do not gatekeep here π
first up, the literal source file that started all of this, plus the foundational lore:
Kernel file ./include/net/cfg80211.h Introduction(9)Device registration(9)enum ieee80211_channel_flags(9)struct ieee80211_channel(9)enum ieee80211_rate_flags(9)enum ieee80211_bss_type(9)enum ieee80211_privacy(9)struct ieee80211_rate(9)struct ieee80211_he_obss_pd(9)struct cfg80211_he_bss_color(9)struct ieee80211_sta_ht_cap(9)struct ieee80211_sta_vht_cap(9)struct ieee80211_sta_he_cap(9)struct ieee80211_eht_mcs_nss_supp(9)struct ieee80211_sta_eht_cap(9)struct ieee80211_sta_uhr_cap(9)struct ieee80211_sband_iftype_data(9)enum ieee80211_edmg_bw_config(9)struct ieee80211_edmg(9)struct ieee80211_sta_s1g_cap(9)struct ieee80211_supported_band(9)_ieee80211_set_sband_iftype_data(9)ieee80211_set_sband_iftype_data(9)for_each_sband_iftype_data(9)ieee80211_get_sband_iftype_data(9)ieee80211_get_he_iftype_cap(9)ieee80211_get_he_6ghz_capa(9)ieee80211_get_eht_iftype_cap(9)ieee80211_get_uhr_iftype_cap(9)wiphy_read_of_freq_limits(9)
look at all those caps. HT, VHT, HE, EHT, UHR β it's giving alphabet soup but make it β¨wirelessβ¨. EHT and UHR are the newer kids and honestly they ate π₯
π Actions and configuration π
Actions and configuration(9)struct vif_params(9)struct key_params(9)struct cfg80211_chan_def(9)struct cfg80211_tid_cfg(9)struct cfg80211_tid_config(9)struct cfg80211_fils_aad(9)struct cfg80211_set_hw_timestamp(9)cfg80211_get_chandef_type(9)cfg80211_chandef_create(9)cfg80211_chandef_identical(9)cfg80211_chandef_is_edmg(9)cfg80211_chandef_is_s1g(9)cfg80211_chandef_compatible(9)nl80211_chan_width_to_mhz(9)cfg80211_chandef_get_width(9)cfg80211_chandef_valid(9)cfg80211_chandef_usable(9)cfg80211_chandef_dfs_required(9)cfg80211_chandef_dfs_usable(9)cfg80211_chandef_dfs_cac_time(9)cfg80211_chandef_primary(9)cfg80211_chandef_npca_valid(9)cfg80211_chandef_add_npca(9)cfg80211_chandef_add_dbe(9)nl80211_send_chandef(9)ieee80211_chandef_max_power(9)cfg80211_chandef_s1g_pri_width(9)cfg80211_any_usable_channels(9)
the chandef squad is lowkey the main character here β channel definition girlies stay winning π and dfs is everywhere because radar avoidance is not a vibe you skip, bestie, that one's legally required π
enum survey_info_flags(9)struct survey_info(9)struct cfg80211_crypto_settings(9)struct cfg80211_mbssid_config(9)struct cfg80211_mbssid_elems(9)struct cfg80211_rnr_elems(9)struct cfg80211_beacon_data(9)struct cfg80211_acl_data(9)struct cfg80211_fils_discovery(9)struct cfg80211_unsol_bcast_probe_resp(9)struct cfg80211_s1g_short_beacon(9)struct cfg80211_ap_settings(9)struct cfg80211_ap_update(9)struct cfg80211_csa_settings(9)struct cfg80211_color_change_settings(9)struct iface_combination_params(9)enum station_parameters_apply_mask(9)struct sta_txpwr(9)struct link_station_parameters(9)struct link_station_del_parameters(9)struct cfg80211_ttlm_params(9)struct station_parameters(9)struct station_del_parameters(9)enum cfg80211_station_type(9)cfg80211_check_station_change(9)enum rate_info_flags(9)enum rate_info_bw(9)struct rate_info(9)enum bss_param_flags(9)struct sta_bss_parameters(9)struct cfg80211_txq_stats(9)struct cfg80211_tid_stats(9)struct link_station_info(9)struct station_info(9)struct cfg80211_sar_sub_specs(9)struct cfg80211_sar_specs(9)struct cfg80211_sar_freq_ranges(9)struct cfg80211_sar_capa(9)cfg80211_get_station(9)enum monitor_flags(9)enum mpath_info_flags(9)struct mpath_info(9)enum wiphy_bss_param_flags(9)struct bss_parameters(9)struct mesh_config(9)struct mesh_setup(9)struct ocb_setup(9)struct ieee80211_txq_params(9)
mesh? ocb? sar? we contain multitudes fr fr π¦
πΈ Scanning and BSS list handling πΈ
Scanning and BSS list handling(9)struct cfg80211_ssid(9)struct cfg80211_scan_info(9)struct cfg80211_scan_6ghz_params(9)struct cfg80211_scan_request(9)struct cfg80211_match_set(9)struct cfg80211_sched_scan_plan(9)struct cfg80211_bss_select_adjust(9)struct cfg80211_sched_scan_request(9)enum cfg80211_signal_type(9)struct cfg80211_inform_bss(9)struct cfg80211_bss_ies(9)struct cfg80211_bss(9)ieee80211_bss_get_elem(9)ieee80211_bss_get_ie(9)struct cfg80211_auth_request(9)struct cfg80211_assoc_link(9)struct cfg80211_ml_reconf_req(9)enum cfg80211_assoc_req_flags(9)struct cfg80211_assoc_request(9)struct cfg80211_deauth_request(9)struct cfg80211_disassoc_request(9)struct cfg80211_ibss_params(9)struct cfg80211_bss_selection(9)struct cfg80211_connect_params(9)enum cfg80211_connect_params_changed(9)enum wiphy_params_flags(9)struct cfg80211_pmksa(9)struct cfg80211_pkt_pattern(9)struct cfg80211_wowlan_tcp(9)struct cfg80211_wowlan(9)struct cfg80211_coalesce_rules(9)struct cfg80211_coalesce(9)struct cfg80211_wowlan_nd_match(9)struct cfg80211_wowlan_nd_info(9)struct cfg80211_wowlan_wakeup(9)struct cfg80211_gtk_rekey_data(9)struct cfg80211_update_ft_ies_params(9)struct cfg80211_mgmt_tx_params(9)struct cfg80211_dscp_exception(9)struct cfg80211_dscp_range(9)struct cfg80211_qos_map(9)
wowlan bestie!! wake-on-wireless-lan!! the laptop stays asleep but still listens, that's iconic behavior honestly π΄β¨
Neighbor Awareness Networking (NAN)(9)struct cfg80211_nan_band_config(9)struct cfg80211_nan_conf(9)struct cfg80211_nan_channel(9)struct cfg80211_nan_local_sched(9)struct cfg80211_nan_peer_map(9)struct cfg80211_nan_peer_sched(9)enum cfg80211_nan_conf_changes(9)struct cfg80211_nan_func_filter(9)struct cfg80211_nan_func(9)struct cfg80211_pmk_conf(9)struct cfg80211_external_auth_params(9)struct cfg80211_ftm_responder_stats(9)struct cfg80211_pmsr_ftm_result(9)struct cfg80211_pmsr_result(9)struct cfg80211_pmsr_ftm_request_peer(9)struct cfg80211_pmsr_request_peer(9)struct cfg80211_pmsr_request(9)struct cfg80211_update_owe_info(9)struct mgmt_frame_regs(9)struct cfg80211_ops(9)enum wiphy_flags(9)struct ieee80211_iface_limit(9)struct ieee80211_iface_combination(9)enum wiphy_wowlan_support_flags(9)struct wiphy_wowlan_support(9)struct wiphy_coalesce_support(9)enum wiphy_vendor_command_flags(9)enum wiphy_opmode_flag(9)struct sta_opmode_info(9)struct wiphy_vendor_command(9)struct wiphy_iftype_ext_capab(9)cfg80211_get_iftype_ext_capa(9)struct cfg80211_pmsr_capabilities(9)struct wiphy_iftype_akm_suites(9)struct wiphy_radio_cfg(9)struct wiphy_radio_freq_range(9)struct wiphy_radio(9)enum wiphy_nan_flags(9)struct wiphy_nan_capa(9)struct wiphy(9)wiphy_priv(9)priv_to_wiphy(9)set_wiphy_dev(9)wiphy_dev(9)wiphy_name(9)wiphy_new_nm(9)wiphy_new(9)wiphy_register(9)rcu_dereference_wiphy(9)wiphy_dereference(9)get_wiphy_regdom(9)wiphy_unregister(9)wiphy_free(9)wiphy_lock(9)wiphy_unlock(9)wiphy_work_queue(9)wiphy_work_cancel(9)wiphy_work_flush(9)wiphy_delayed_work_queue(9)wiphy_delayed_work_cancel(9)wiphy_delayed_work_flush(9)wiphy_delayed_work_pending(9)wiphy_hrtimer_work_queue(9)wiphy_hrtimer_work_cancel(9)wiphy_hrtimer_work_flush(9)wiphy_hrtimer_work_pending(9)enum ieee80211_ap_reg_power(9)struct wireless_dev(9)wdev_priv(9)wdev_chandef(9)
the wiphy_work / wiphy_delayed_work / wiphy_hrtimer_work trio is giving "three siblings, same energy, different timers" π queue, cancel, flush, pending β the whole choreography, periodt.
π§ Utility functions π§
Utility functions(9)ieee80211_channel_equal(9)ieee80211_channel_to_khz(9)ieee80211_channel_to_freq_khz(9)ieee80211_channel_to_frequency(9)ieee80211_freq_khz_to_channel(9)ieee80211_frequency_to_channel(9)ieee80211_get_channel_khz(9)ieee80211_get_channel(9)cfg80211_channel_is_psc(9)ieee80211_radio_freq_range_valid(9)cfg80211_radio_chandef_valid(9)cfg80211_wdev_channel_allowed(9)ieee80211_get_response_rate(9)ieee80211_mandatory_rates(9)struct ieee80211_radiotap_iterator(9)ieee80211_get_hdrlen_from_skb(9)ieee80211_hdrlen(9)ieee80211_get_mesh_hdrlen(9)
channel number β frequency β kHz, back and forth forever, like a situationship that never ends π
π«Ά Data path helpers π«Ά
Data path helpers(9)ieee80211_data_to_8023_exthdr(9)ieee80211_data_to_8023(9)ieee80211_is_valid_amsdu(9)ieee80211_get_8023_tunnel_proto(9)ieee80211_strip_8023_mesh_hdr(9)cfg80211_classify8021d(9)cfg80211_find_elem_match(9)cfg80211_find_ie_match(9)cfg80211_find_elem(9)cfg80211_find_ie(9)cfg80211_find_ext_elem(9)cfg80211_find_ext_ie(9)cfg80211_find_vendor_elem(9)cfg80211_find_vendor_ie(9)enum cfg80211_rnr_iter_ret(9)cfg80211_iter_rnr(9)cfg80211_defragment_element(9)cfg80211_send_layer2_update(9)
hiiiii these are our direct coworkers π«Ά the find_ie family is basically "where's the information element" β the unsung heroes of every single frame you've ever received, no cap. and yes, ieee80211_is_valid_amsdu(9) is literally our page's bestie, go say hi π
π₯ Regulatory enforcement infrastructure π₯
Regulatory enforcement infrastructure(9)regulatory_hint(9)regulatory_set_wiphy_regd(9)regulatory_set_wiphy_regd_sync(9)wiphy_apply_custom_regulatory(9)freq_reg_info(9)reg_initiator_name(9)regulatory_pre_cac_allowed(9)
rules are rules bestie, and the regulatory db has OPINIONS about which frequencies you're allowed to touch π the _sync one is the one that waits β the "I'm not leaving until you answer" variant π
π Internal regulatory db functions π
Internal regulatory db functions(9)reg_query_regdb_wmm(9)
just the one internal function, sitting there, minding its business, holding the WMM rules for the regulatory database. small but mighty β
cfg80211_scan_done(9)cfg80211_sched_scan_results(9)cfg80211_sched_scan_stopped(9)cfg80211_sched_scan_stopped_locked(9)cfg80211_inform_bss_frame_data(9)cfg80211_gen_new_bssid(9)cfg80211_is_element_inherited(9)cfg80211_merge_profile(9)enum cfg80211_bss_frame_type(9)cfg80211_get_ies_channel_number(9)cfg80211_ssid_eq(9)cfg80211_inform_bss_data(9)__cfg80211_get_bss(9)cfg80211_get_bss(9)cfg80211_ref_bss(9)cfg80211_put_bss(9)cfg80211_unlink_bss(9)cfg80211_bss_iter(9)cfg80211_rx_mlme_mgmt(9)cfg80211_auth_timeout(9)struct cfg80211_rx_assoc_resp_data(9)cfg80211_rx_assoc_resp(9)struct cfg80211_assoc_failure(9)cfg80211_assoc_failure(9)cfg80211_tx_mlme_mgmt(9)cfg80211_rx_unprot_mlme_mgmt(9)cfg80211_michael_mic_failure(9)cfg80211_ibss_joined(9)cfg80211_notify_new_peer_candidate(9)
ref_bss and put_bss are the classic refcount couple β you take one, you give one back, or the kernel leaks and we don't do leaks in this house π€ also cfg80211_michael_mic_failure(9) is genuinely the coolest-sounding function name in this entire list, i said what i said π
π RFkill integration π
RFkill integration(9)wiphy_rfkill_set_hw_state_reason(9)wiphy_rfkill_start_polling(9)wiphy_rfkill_stop_polling(9)
the airplane-mode squad βοΈ hw state + reason, and yes there's a reason parameter because "why is my wifi off" deserves an actual answer, bestie π
π Vendor commands π
Vendor commands(9)cfg80211_vendor_cmd_alloc_reply_skb(9)cfg80211_vendor_cmd_reply(9)cfg80211_vendor_cmd_get_sender(9)cfg80211_vendor_event_alloc(9)cfg80211_vendor_event_alloc_ucast(9)cfg80211_vendor_event(9)
alloc a reply, fill it, send it, don't forget to free it β the eternal cycle π and _ucast is the unicast version, for when you want to whisper to one listener instead of yelling to the whole group chat π’
π Test mode π
Test mode(9)cfg80211_testmode_alloc_reply_skb(9)cfg80211_testmode_reply(9)cfg80211_testmode_alloc_event_skb(9)cfg80211_testmode_event(9)
same pattern, different subsystem β alloc / reply, alloc / event. consistency is so attractive honestly β¨
struct cfg80211_fils_resp_params(9)struct cfg80211_connect_resp_params(9)cfg80211_connect_done(9)cfg80211_connect_bss(9)cfg80211_connect_result(9)cfg80211_connect_timeout(9)struct cfg80211_roam_info(9)cfg80211_roamed(9)cfg80211_port_authorized(9)cfg80211_disconnected(9)cfg80211_ready_on_channel(9)cfg80211_remain_on_channel_expired(9)cfg80211_tx_mgmt_expired(9)cfg80211_sinfo_alloc_tid_stats(9)cfg80211_link_sinfo_alloc_tid_stats(9)cfg80211_sinfo_release_content(9)cfg80211_new_sta(9)cfg80211_del_sta_sinfo(9)cfg80211_del_sta(9)cfg80211_conn_failed(9)struct cfg80211_rx_info(9)cfg80211_rx_mgmt_ext(9)cfg80211_rx_mgmt_khz(9)cfg80211_rx_mgmt(9)struct cfg80211_tx_status(9)cfg80211_mgmt_tx_status_ext(9)cfg80211_mgmt_tx_status(9)cfg80211_control_port_tx_status(9)cfg80211_rx_control_port(9)cfg80211_cqm_rssi_notify(9)cfg80211_cqm_pktloss_notify(9)cfg80211_cqm_txe_notify(9)cfg80211_cqm_beacon_loss_notify(9)__cfg80211_radar_event(9)cfg80211_sta_opmode_change_notify(9)cfg80211_cac_event(9)cfg80211_background_cac_abort(9)cfg80211_gtk_rekey_notify(9)cfg80211_pmksa_candidate_notify(9)cfg80211_rx_spurious_frame(9)cfg80211_rx_unexpected_4addr_frame(9)cfg80211_probe_status(9)cfg80211_report_obss_beacon_khz(9)cfg80211_report_obss_beacon(9)struct cfg80211_beaconing_check_config(9)
the cqm notify squad β RSSI, packet loss, TXE, beacon loss β is literally the "are you okay? are you okay? are you okay annie" of wireless π connection quality monitoring stays booked and busy.
and that's the list bestie!! every single one, no skips, no cap π if you made it to the bottom, you're officially a cfg80211 scholar, go drink some water ππ
...and the guest list keeps going, bestie, because this section is long and every single one of these pulled up to the function. No plus-ones were cut. π
cfg80211_reg_check_beaconing(9),cfg80211_reg_can_beacon(9),cfg80211_reg_can_beacon_relax(9)β the regulatory beaconing trio, checking and chilling and relaxing.cfg80211_ch_switch_notify(9),cfg80211_ch_switch_started_notify(9)β channel switch announcements, started and done.ieee80211_operating_class_to_band(9),ieee80211_operating_class_to_chandef(9),ieee80211_chandef_to_operating_class(9),ieee80211_chandef_to_khz(9)β the conversion girlies, going both ways and also into kHz. multitalented β¨cfg80211_tdls_oper_request(9),cfg80211_calculate_bitrate(9)β TDLS operation requests plus the bitrate math.cfg80211_unregister_wdev(9),cfg80211_register_netdevice(9),cfg80211_unregister_netdevice(9)β registering and unregistering, the whole lifecycle arc π¦struct cfg80211_ft_event_params(9),cfg80211_ft_event(9)β the fast-transition struct and its event.cfg80211_get_p2p_attr(9)β grabbing a P2P attribute, solo but iconic.ieee80211_ie_split_ric(9),ieee80211_ie_split(9),ieee80211_fragment_element(9)β splitting IEs, RIC-flavored splitting, and fragmenting elements.cfg80211_report_wowlan_wakeup(9),cfg80211_crit_proto_stopped(9)β WoWLAN wakeup reporting and the critical-protocol-stopped notice.ieee80211_get_num_supported_channels(9),cfg80211_check_combinations(9),cfg80211_iter_combinations(9),cfg80211_get_radio_idx_by_chan(9)β channel counting, combination checking, combination iterating, and looking up a radio index by channel.cfg80211_stop_link(9),cfg80211_stop_iface(9),cfg80211_shutdown_all_interfaces(9)β the stop girlies, escalating from one link to one interface to literally everything πwiphy_ext_feature_set(9),wiphy_ext_feature_isset(9)β setting an extended feature bit and then asking if it's set. communication πcfg80211_free_nan_func(9),struct cfg80211_nan_match_params(9),cfg80211_nan_match(9),cfg80211_nan_func_terminated(9),cfg80211_nan_sched_update_done(9)β the entire NAN friend group, free/match/terminated/sched-update-done, plus their params struct.cfg80211_external_auth_request(9),cfg80211_pmsr_report(9),cfg80211_pmsr_complete(9)β external auth requests and the PMSR report/complete pair.cfg80211_iftype_allowed(9),cfg80211_assoc_comeback(9),cfg80211_update_owe_info_event(9)β iftype permission checks, the assoc comeback, and the OWE info event update.cfg80211_bss_flush(9),cfg80211_bss_color_notify(9),cfg80211_obss_color_collision_notify(9)β flushing BSSes and the color-collision notifications (BSS color and OBSS color, both invited).cfg80211_color_change_started_notify(9),cfg80211_color_change_aborted_notify(9),cfg80211_color_change_notify(9)β the color change trio: started, aborted, and the plain one. rainbow of outcomes πcfg80211_6ghz_power_type(9),cfg80211_links_removed(9),struct cfg80211_mlo_reconf_done_data(9),cfg80211_mlo_reconf_add_done(9)β 6 GHz power type, removed links, and MLO reconf: the struct plus the add-done notifier.cfg80211_schedule_channels_check(9),cfg80211_epcs_changed(9)β scheduling a channels check, and the EPCS changed notification.cfg80211_next_nan_dw_notif(9),cfg80211_nan_cluster_joined(9),cfg80211_nan_ulw_update(9),cfg80211_nan_channel_evac(9)β more NAN besties: next DW notif, cluster joined, ULW update, channel evac.wiphy_locked_debugfs_read(9),wiphy_locked_debugfs_write(9)β debugfs read and write, under lock, behaving. πcfg80211_s1g_get_start_freq_khz(9),cfg80211_s1g_get_end_freq_khz(9),cfg80211_s1g_get_primary_sibling(9)β S1G frequency helpers: start, end, and the primary sibling.cfg80211_incumbent_signal_notify(9)β and the last one, the incumbent signal notification, closing out the list with main-character energy. π
okay that's genuinely everyone, i checked twice π
so yeah β ieee80211_amsdu_to_8023s(9) lives under ./include/net, this is the October 2026 edition, and that's the whole page! go convert some A-MSDU frames into 802.3 and slay, bestie π«Άβ¨
π¦ 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