cfg80211_chandef_compatible(9)
π NAME
cfg80211_chandef_compatible β okay so this is the function that does a vibe check on two channel definitions and tells you if they're compatible π
Oh and quick thing β this whole page lives in the Kernel API Manual, section 9, and the function is officially cfg80211_chandef_compatible(9), just so you know where you are bestie π
β¨ SYNOPSIS
const struct cfg80211_chan_def * cfg80211_chandef_compatible (const struct cfg80211_chan_def *chandef1 , const struct cfg80211_chan_def *chandef2 );
yes the return type is a pointer-to-const and yes it returns one of its own arguments, it's giving "choose your fighter" energy π₯
πΈ ARGUMENTS
chandef1β the first channel definition, aka contestant number one π¦ it's aconst struct cfg80211_chan_def *, so like, we're looking, not touching.chandef2β the second channel definition, contestant number two β¨ same deal,const struct cfg80211_chan_def *, read-only main character energy π
π¦ RETURN
So here's the tea, and it's honestly so simple it ate:
- It returns
NULLif the given channel definitions are incompatible β that's the "they are NOT compatible, do not pass go" case π - Otherwise it returns either
chandef1orchandef2β one of the two you just handed it. Not a copy, not a new struct, literally just one of your own pointers back π«Ά
fr fr: the only two outcomes are "NULL, they don't get along" or "here's one of the two you gave me". No third option, no surprises. periodt π
β¨ SEE ALSO β¨
okay so this is the part where the manpage hands you the entire guest list and it's long β like, "who invited all these people" long π but fr every single one is here, no cap, no skipping. hydrate, stretch, let's go π«Ά
First up, the mothership: the kernel file ./include/net/cfg80211.h, plus the starter-pack reads Introduction(9) and Device registration(9). Then the channel-and-band clique, which is basically the main character energy of this whole page: 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), and struct ieee80211_sband_iftype_data(9).
Then the edmg/s1g girlies: enum ieee80211_edmg_bw_config(9), struct ieee80211_edmg(9), struct ieee80211_sta_s1g_cap(9), struct ieee80211_supported_band(9). And the band-filter helper squad, all lowercase and vibey: _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). Wrap that little cluster up with wiphy_read_of_freq_limits(9) and you've survived page one of the list. slay π
Next section of the guest list: Actions and configuration(9) β the big-picture chapter β then the parameter structs 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), and struct cfg80211_set_hw_timestamp(9).
Then it's a whole chandef neighbourhood, and honestly it's giving family reunion: cfg80211_get_chandef_type(9), cfg80211_chandef_create(9), cfg80211_chandef_identical(9), cfg80211_chandef_is_edmg(9), cfg80211_chandef_is_s1g(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), and cfg80211_any_usable_channels(9). yes that's the whole family, i counted π
Survey and security-ish stuff next: enum survey_info_flags(9), struct survey_info(9), struct cfg80211_crypto_settings(9). Then the beacon/AP crew, which is a lot of structs: 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).
Station-era content, aka the lads: 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). And the rate/reporting icons: 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).
Wrapping this chunk with the SAR + monitoring + mesh + OCB + txq set, because the manpage really said "one more paragraph won't hurt": 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). periodt β¨
Now Scanning and BSS list handling(9) β the chapter, followed by its whole entourage: 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).
Connection-era content incoming: 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).
And the power-save / offload besties: 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). Finish the batch with the QoS trio β struct cfg80211_dscp_exception(9), struct cfg80211_dscp_range(9), struct cfg80211_qos_map(9) β and breathe. π¦
NAN time, and the manpage is obsessed: Neighbor Awareness Networking (NAN)(9) plus 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).
Then some crossover icons: 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), and struct mgmt_frame_regs(9).
Okay this next cluster is the wiphy wing of the building, and it's big. Start with 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).
Radio config crew: 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). And the accessor/lifecycle lineup, hold on tight: 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).
Work-queue besties, all queued up (pun intended, i'm hilarious): 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). Close it out with enum ieee80211_ap_reg_power(9), struct wireless_dev(9), wdev_priv(9), and wdev_chandef(9). π₯
Utility functions(9) β the "little helpers" chapter β and its whole squad: 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).
Rates and radiotap and header-length math, oh my: 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).
Data path helpers(9) next, and this one's a whole vibe: ieee80211_data_to_8023_exthdr(9), ieee80211_data_to_8023(9), ieee80211_is_valid_amsdu(9), ieee80211_amsdu_to_8023s(9), ieee80211_get_8023_tunnel_proto(9), ieee80211_strip_8023_mesh_hdr(9), cfg80211_classify8021d(9).
Then the element-finder girlies, iykyk: 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), and cfg80211_send_layer2_update(9). π
Regulatory enforcement, aka the vibes police: 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).
Then the internals: Internal regulatory db functions(9) and reg_query_regdb_wmm(9). tiny section, big responsibility β¨
And here comes the notification/event firehose, so strap in: 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).
MLME mgmt crew: 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).
RFkill integration(9) and its trio: wiphy_rfkill_set_hw_state_reason(9), wiphy_rfkill_start_polling(9), wiphy_rfkill_stop_polling(9). Vendor commands(9) with 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). And Test mode(9) with cfg80211_testmode_alloc_reply_skb(9), cfg80211_testmode_reply(9), cfg80211_testmode_alloc_event_skb(9), cfg80211_testmode_event(9).
Connect/roam/port-authorization set: 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).
Station info housekeeping: 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).
RX/TX mgmt and control-port icons: 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).
CQM and radar and CAC and rekey and PMKSA notifications, aka the "something happened!!" squad: 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).
And the last little batch before we hand off: 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), and struct cfg80211_beaconing_check_config(9). π
and bestieβ¦ we're literally not even done β
cfg80211_reg_check_beaconing(9)β on the list πcfg80211_reg_can_beacon(9)β also herecfg80211_reg_can_beacon_relax(9)β and her chiller cousincfg80211_ch_switch_notify(9)β the channel-switch girlies are pulling up πcfg80211_ch_switch_started_notify(9)β started-notify said "me too"ieee80211_operating_class_to_band(9)β conversion core, we stanieee80211_operating_class_to_chandef(9)β the other direction of that same vibeieee80211_chandef_to_operating_class(9)β and back again, iconicieee80211_chandef_to_khz(9)β numbers but in kHz, lowkey usefulcfg80211_tdls_oper_request(9)β present β¨cfg80211_calculate_bitrate(9)β math bestie, show-offcfg80211_unregister_wdev(9)β cleanup crew, we love hercfg80211_register_netdevice(9)β and the one who registers it in the first placecfg80211_unregister_netdevice(9)β the undoing of that, periodtstruct cfg80211_ft_event_params(9)β a whole struct, yes she's on the guest listcfg80211_ft_event(9)β plus her eventcfg80211_get_p2p_attr(9)β P2P attrs, okurrieee80211_ie_split_ric(9)β splitting IEs, tedious but necessaryieee80211_ie_split(9)β the non-RIC version, no capieee80211_fragment_element(9)β chopping elements into pieces π§cfg80211_report_wowlan_wakeup(9)β wakeup report, she's upcfg80211_crit_proto_stopped(9)β crit proto said byeieee80211_get_num_supported_channels(9)β counting channels, someone has tocfg80211_check_combinations(9)β the combinations police π«Άcfg80211_iter_combinations(9)β same energy, but loopingcfg80211_get_radio_idx_by_chan(9)β find the radio by channel, sleuth modecfg80211_stop_link(9)β stopping links, dramaticcfg80211_stop_iface(9)β stopping ifaces, also dramaticcfg80211_shutdown_all_interfaces(9)β the ultimate shutdown, main character energy πwiphy_ext_feature_set(9)β setting ext featureswiphy_ext_feature_isset(9)β asking if they're set, vibe checkcfg80211_free_nan_func(9)β free the NAN function, be responsiblestruct cfg80211_nan_match_params(9)β another struct, she's invited toocfg80211_nan_match(9)β NAN match, matchingcfg80211_nan_func_terminated(9)β terminated, ripcfg80211_nan_sched_update_done(9)β schedule update: done βcfg80211_external_auth_request(9)β auth requests coming from outside, wildcfg80211_pmsr_report(9)β PMSR report, reportingcfg80211_pmsr_complete(9)β and complete, we finishedcfg80211_iftype_allowed(9)β is that iftype allowed? ask hercfg80211_assoc_comeback(9)β the comeback, literallycfg80211_update_owe_info_event(9)β OWE info event, slaycfg80211_bss_flush(9)β flush the BSS, bye πcfg80211_bss_color_notify(9)β colors! bss coloring era πcfg80211_obss_color_collision_notify(9)β collision, oopscfg80211_color_change_started_notify(9)β startedcfg80211_color_change_aborted_notify(9)β aborted, sad but realcfg80211_color_change_notify(9)β the plain notify, also validcfg80211_6ghz_power_type(9)β 6 GHz power type, fancycfg80211_links_removed(9)β links removed, gone girlstruct cfg80211_mlo_reconf_done_data(9)β MLO reconf data, struct editioncfg80211_mlo_reconf_add_done(9)β reconf add done, atecfg80211_schedule_channels_check(9)β schedule that channels checkcfg80211_epcs_changed(9)β EPCS changed, notedcfg80211_next_nan_dw_notif(9)β next NAN DW notification, queuedcfg80211_nan_cluster_joined(9)β joined the cluster, so social π¦cfg80211_nan_ulw_update(9)β ULW update, freshcfg80211_nan_channel_evac(9)β channel evacuation, run πwiphy_locked_debugfs_read(9)β debugfs read, locked and loadedwiphy_locked_debugfs_write(9)β the write one too, obviouslycfg80211_s1g_get_start_freq_khz(9)β S1G start freq, in kHzcfg80211_s1g_get_end_freq_khz(9)β S1G end freq, also kHzcfg80211_s1g_get_primary_sibling(9)β primary sibling, family reunioncfg80211_incumbent_signal_notify(9)β and the last one, incumbent signal notify, closing out the list π
okay that's literally the whole SEE ALSO family, bestie β every single one accounted for, nobody left on read π go click around, they're all doing their own little thing.
so this whole page lives in ./include/net (that's where she's from, π
) and it's dated October 2026 β mark your calendar, she's a fall girlie. take care of her and she'll take care of your chandefs fr fr πβ¨
π¦ 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