STRUCT CFG80211_OPS(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

🌸 NAME 🌸

ok so welcome to struct cfg80211_ops(9) bestie!! πŸ’– this is page 9 of the Kernel API Manual, and no cap, it's kind of a big deal.

struct cfg80211_ops β€” it's the backend description for wireless configuration ✨ literally what it says on the tin. think of it as the little contract your wireless driver signs to tell the kernel "yeah i can do config stuff, here's how" 🫢

heads up bestie: this page is LONG, like long long, so it's coming at you in parts β€” buckle in, we're not even close to done πŸ’…

✨ SYNOPSIS ✨

okay bestie, buckle up πŸŽ€ this is the whole struct cfg80211_ops β€” it's the giant function-pointer menu that a wireless driver fills in to tell the kernel "yeah i can do that." it is long. like, unreasonably long. but she's iconic for it πŸ’…

here's the literal thing, verbatim, no edits, no cap:

       struct cfg80211_ops {
           int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow);
           int (*resume)(struct wiphy *wiphy);
           void (*set_wakeup)(struct wiphy *wiphy, bool enabled);
           struct wireless_dev * (*add_virtual_intf)(struct wiphy *wiphy, const
       char *name, unsigned char name_assign_type, enum nl80211_iftype type,
       struct vif_params *params);
           int (*del_virtual_intf)(struct wiphy *wiphy, struct wireless_dev
       *wdev);
           int (*change_virtual_intf)(struct wiphy *wiphy, struct net_device
       *dev, enum nl80211_iftype type, struct vif_params *params);
           int (*add_intf_link)(struct wiphy *wiphy, struct wireless_dev *wdev,
       unsigned int link_id);
           void (*del_intf_link)(struct wiphy *wiphy, struct wireless_dev
       *wdev, unsigned int link_id);
           int (*add_key)(struct wiphy *wiphy, struct wireless_dev *wdev, int
       link_id, u8 key_index, bool pairwise, const u8 *mac_addr, struct
       key_params *params);
           int (*get_key)(struct wiphy *wiphy, struct wireless_dev *wdev, int
       link_id, u8 key_index, bool pairwise, const u8 *mac_addr, void *cookie,
       void (*callback)(void *cookie, struct key_params*));
           int (*del_key)(struct wiphy *wiphy, struct wireless_dev *wdev, int
       link_id, u8 key_index, bool pairwise, const u8 *mac_addr);
           int (*set_default_key)(struct wiphy *wiphy, struct net_device
       *netdev, int link_id, u8 key_index, bool unicast, bool multicast);
           int (*set_default_mgmt_key)(struct wiphy *wiphy, struct wireless_dev
       *wdev, int link_id, u8 key_index);
           int (*set_default_beacon_key)(struct wiphy *wiphy, struct
       wireless_dev *wdev, int link_id, u8 key_index);
           int (*start_ap)(struct wiphy *wiphy, struct net_device *dev, struct
       cfg80211_ap_settings *settings);
           int (*change_beacon)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_ap_update *info);
           int (*stop_ap)(struct wiphy *wiphy, struct net_device *dev, unsigned
       int link_id);
           int (*add_station)(struct wiphy *wiphy, struct wireless_dev *wdev,
       const u8 *mac, struct station_parameters *params);
           int (*del_station)(struct wiphy *wiphy, struct wireless_dev *wdev,
       struct station_del_parameters *params);
           int (*change_station)(struct wiphy *wiphy, struct wireless_dev
       *wdev, const u8 *mac, struct station_parameters *params);
           int (*get_station)(struct wiphy *wiphy, struct wireless_dev *wdev,
       const u8 *mac, struct station_info *sinfo);
           int (*dump_station)(struct wiphy *wiphy, struct wireless_dev *wdev,
       int idx, u8 *mac, struct station_info *sinfo);
           int (*add_mpath)(struct wiphy *wiphy, struct net_device *dev, const
       u8 *dst, const u8 *next_hop);
           int (*del_mpath)(struct wiphy *wiphy, struct net_device *dev, const
       u8 *dst);
           int (*change_mpath)(struct wiphy *wiphy, struct net_device *dev,
       const u8 *dst, const u8 *next_hop);
           int (*get_mpath)(struct wiphy *wiphy, struct net_device *dev, u8
       *dst, u8 *next_hop, struct mpath_info *pinfo);
           int (*dump_mpath)(struct wiphy *wiphy, struct net_device *dev, int
       idx, u8 *dst, u8 *next_hop, struct mpath_info *pinfo);
           int (*get_mpp)(struct wiphy *wiphy, struct net_device *dev, u8 *dst,
       u8 *mpp, struct mpath_info *pinfo);
           int (*dump_mpp)(struct wiphy *wiphy, struct net_device *dev, int
       idx, u8 *dst, u8 *mpp, struct mpath_info *pinfo);
           int (*get_mesh_config)(struct wiphy *wiphy, struct net_device *dev,
       struct mesh_config *conf);
           int (*update_mesh_config)(struct wiphy *wiphy, struct net_device
       *dev, u32 mask, const struct mesh_config *nconf);
           int (*join_mesh)(struct wiphy *wiphy, struct net_device *dev, const
       struct mesh_config *conf, const struct mesh_setup *setup);
           int (*leave_mesh)(struct wiphy *wiphy, struct net_device *dev);
           int (*join_ocb)(struct wiphy *wiphy, struct net_device *dev, struct
       ocb_setup *setup);
           int (*leave_ocb)(struct wiphy *wiphy, struct net_device *dev);
           int (*change_bss)(struct wiphy *wiphy, struct net_device *dev,
       struct bss_parameters *params);
           void (*inform_bss)(struct wiphy *wiphy, struct cfg80211_bss *bss,
       const struct cfg80211_bss_ies *ies, void *data);
           int (*set_txq_params)(struct wiphy *wiphy, struct net_device *dev,
       struct ieee80211_txq_params *params);
           int (*libertas_set_mesh_channel)(struct wiphy *wiphy, struct
       net_device *dev, struct ieee80211_channel *chan);
           int (*set_monitor_channel)(struct wiphy *wiphy, struct net_device
       *dev, struct cfg80211_chan_def *chandef);
           int (*scan)(struct wiphy *wiphy, struct cfg80211_scan_request
       *request);
           void (*abort_scan)(struct wiphy *wiphy, struct wireless_dev *wdev);
           int (*auth)(struct wiphy *wiphy, struct net_device *dev, struct
       cfg80211_auth_request *req);
           int (*assoc)(struct wiphy *wiphy, struct net_device *dev, struct
       cfg80211_assoc_request *req);
           int (*deauth)(struct wiphy *wiphy, struct net_device *dev, struct
       cfg80211_deauth_request *req);
           int (*disassoc)(struct wiphy *wiphy, struct net_device *dev, struct
       cfg80211_disassoc_request *req);
           int (*connect)(struct wiphy *wiphy, struct net_device *dev, struct
       cfg80211_connect_params *sme);
           int (*update_connect_params)(struct wiphy *wiphy, struct net_device
       *dev, struct cfg80211_connect_params *sme, u32 changed);
           int (*disconnect)(struct wiphy *wiphy, struct net_device *dev, u16
       reason_code);
           int (*join_ibss)(struct wiphy *wiphy, struct net_device *dev, struct
       cfg80211_ibss_params *params);
           int (*leave_ibss)(struct wiphy *wiphy, struct net_device *dev);
           int (*set_mcast_rate)(struct wiphy *wiphy, struct net_device *dev,
       int rate[NUM_NL80211_BANDS]);
           int (*set_wiphy_params)(struct wiphy *wiphy, int radio_idx, u32
       changed);
           int (*set_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
       int radio_idx, enum nl80211_tx_power_setting type, int mbm);
           int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
       int radio_idx, unsigned int link_id, int *dbm);
           void (*rfkill_poll)(struct wiphy *wiphy);
         #ifdef CONFIG_NL80211_TESTMODE;
           int (*testmode_cmd)(struct wiphy *wiphy, struct wireless_dev *wdev,
       void *data, int len);
           int (*testmode_dump)(struct wiphy *wiphy, struct sk_buff *skb,
       struct netlink_callback *cb, void *data, int len);
         #endif;
           int (*set_bitrate_mask)(struct wiphy *wiphy, struct net_device *dev,
       unsigned int link_id, const u8 *peer, const struct cfg80211_bitrate_mask
       *mask);
           int (*dump_survey)(struct wiphy *wiphy, struct net_device *netdev,
       int idx, struct survey_info *info);
           int (*set_pmksa)(struct wiphy *wiphy, struct net_device *netdev,
       struct cfg80211_pmksa *pmksa);
           int (*del_pmksa)(struct wiphy *wiphy, struct net_device *netdev,
       struct cfg80211_pmksa *pmksa);
           int (*flush_pmksa)(struct wiphy *wiphy, struct net_device *netdev);
           int (*remain_on_channel)(struct wiphy *wiphy, struct wireless_dev
       *wdev, struct ieee80211_channel *chan, unsigned int duration, u64
       cookie, const u8 *rx_addr);
           int (*cancel_remain_on_channel)(struct wiphy *wiphy, struct
       wireless_dev *wdev, u64 cookie);
           int (*mgmt_tx)(struct wiphy *wiphy, struct wireless_dev *wdev,
       struct cfg80211_mgmt_tx_params *params, u64 cookie);
           int (*mgmt_tx_cancel_wait)(struct wiphy *wiphy, struct wireless_dev
       *wdev, u64 cookie);
           int (*set_power_mgmt)(struct wiphy *wiphy, struct net_device *dev,
       bool enabled, int timeout);
           int (*set_cqm_rssi_config)(struct wiphy *wiphy, struct net_device
       *dev, s32 rssi_thold, u32 rssi_hyst);
           int (*set_cqm_rssi_range_config)(struct wiphy *wiphy, struct
       net_device *dev, s32 rssi_low, s32 rssi_high);
           int (*set_cqm_txe_config)(struct wiphy *wiphy, struct net_device
       *dev, u32 rate, u32 pkts, u32 intvl);
           void (*update_mgmt_frame_registrations)(struct wiphy *wiphy, struct
       wireless_dev *wdev, struct mgmt_frame_regs *upd);
           int (*set_antenna)(struct wiphy *wiphy, int radio_idx, u32 tx_ant,
       u32 rx_ant);
           int (*get_antenna)(struct wiphy *wiphy, int radio_idx, u32 *tx_ant,
       u32 *rx_ant);
           int (*sched_scan_start)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_sched_scan_request *request);
           int (*sched_scan_stop)(struct wiphy *wiphy, struct net_device *dev,
       u64 reqid);
           int (*set_rekey_data)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_gtk_rekey_data *data);
           int (*tdls_mgmt)(struct wiphy *wiphy, struct net_device *dev, const
       u8 *peer, int link_id, u8 action_code, u8 dialog_token, u16 status_code,
       u32 peer_capability, bool initiator, const u8 *buf, size_t len);
           int (*tdls_oper)(struct wiphy *wiphy, struct net_device *dev, const
       u8 *peer, enum nl80211_tdls_operation oper);
           int (*probe_peer)(struct wiphy *wiphy, struct net_device *dev, const
       u8 *peer, u64 cookie);
           int (*set_noack_map)(struct wiphy *wiphy, struct net_device *dev,
       u16 noack_map);
           int (*get_channel)(struct wiphy *wiphy, struct wireless_dev *wdev,
       unsigned int link_id, struct cfg80211_chan_def *chandef);
           int (*start_p2p_device)(struct wiphy *wiphy, struct wireless_dev
       *wdev);
           void (*stop_p2p_device)(struct wiphy *wiphy, struct wireless_dev
       *wdev);
           int (*set_mac_acl)(struct wiphy *wiphy, struct net_device *dev,
       const struct cfg80211_acl_data *params);
           int (*start_radar_detection)(struct wiphy *wiphy, struct net_device
       *dev, struct cfg80211_chan_def *chandef, u32 cac_time_ms, int link_id);
           void (*end_cac)(struct wiphy *wiphy, struct net_device *dev,
       unsigned int link_id);
           int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_update_ft_ies_params *ftie);
           int (*crit_proto_start)(struct wiphy *wiphy, struct wireless_dev
       *wdev, enum nl80211_crit_proto_id protocol, u16 duration);
           void (*crit_proto_stop)(struct wiphy *wiphy, struct wireless_dev
       *wdev);
           int (*set_coalesce)(struct wiphy *wiphy, struct cfg80211_coalesce
       *coalesce);
           int (*channel_switch)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_csa_settings *params);
           int (*set_qos_map)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_qos_map *qos_map);
           int (*set_ap_chanwidth)(struct wiphy *wiphy, struct net_device *dev,
       unsigned int link_id, struct cfg80211_chan_def *chandef);
           int (*add_tx_ts)(struct wiphy *wiphy, struct net_device *dev, u8
       tsid, const u8 *peer, u8 user_prio, u16 admitted_time);
           int (*del_tx_ts)(struct wiphy *wiphy, struct net_device *dev, u8
       tsid, const u8 *peer);
           int (*tdls_channel_switch)(struct wiphy *wiphy, struct net_device
       *dev, const u8 *addr, u8 oper_class, struct cfg80211_chan_def *chandef);
           void (*tdls_cancel_channel_switch)(struct wiphy *wiphy, struct
       net_device *dev, const u8 *addr);
           int (*start_nan)(struct wiphy *wiphy, struct wireless_dev *wdev,

🫢 a lil survival guide for reading that

okay so real talk, that block is a lot, and it's not even done yet β€” she keeps going 😭 but here's how to not panic:

  • every single line is a function pointer. like, int (*suspend)(...) means "there's a slot called suspend that points to a function with these exact arguments." the driver decides whether to plug something in or leave it NULL.
  • almost everything returns int, which is the classic "did it work or nah" signal. a few are void β€” those are the "no takebacks, no error report, just vibes" ones, like set_wakeup, rfkill_poll, inform_bss, abort_scan, crit_proto_stop, end_cac, and the tdls_cancel_channel_switch / del_intf_link / stop_p2p_device crew.
  • basically every op gets a struct wiphy *wiphy as its first arg β€” that's the hardware/device identity card, and she's everywhere. many of them also take a struct net_device *dev or a struct wireless_dev *wdev depending on what flavour of interface they're talking about.
  • see link_id popping up all over? (add_intf_link, del_intf_link, add_key, get_key, del_key, set_default_key, set_default_mgmt_key, set_default_beacon_key, stop_ap, get_tx_power, set_bitrate_mask, get_channel, start_radar_detection, end_cac, set_ap_chanwidth, tdls_mgmt…) yeah, multi-link is thriving in here. not me counting them all πŸ’€
  • radio_idx shows up on the wiphy-parameter and antenna and tx-power ops β€” set_wiphy_params, set_tx_power, get_tx_power, set_antenna, get_antenna. keep an eye on her, she's the "which radio are we even talking about" question ✨
  • NUM_NL80211_BANDS in set_mcast_rate β€” that's literally a rate[NUM_NL80211_BANDS] array, one entry per band. yes she's fancy.
  • and NOT the #ifdef CONFIG_NL80211_TESTMODE; block β€” testmode_cmd and testmode_dump only exist when that config is on. conditional queen πŸ‘‘ (also yes, the semicolons after #ifdef / #endif are really there in the source text, so they're really there here too πŸ’…)
side note bestie: those weird line breaks mid-signature? that's just the manpage text wrapping doing its thing. the C is all one line per op, fr fr. don't go reformatting your driver over it πŸ™ˆ

and yeah, start_nan is where this chunk cuts off β€” she's mid-sentence, iconically. more ops incoming, so don't close the tab 🌸

       struct cfg80211_nan_conf *conf);
           void (*stop_nan)(struct wiphy *wiphy, struct wireless_dev *wdev);
           int (*add_nan_func)(struct wiphy *wiphy, struct wireless_dev *wdev,
       struct cfg80211_nan_func *nan_func);
           void (*del_nan_func)(struct wiphy *wiphy, struct wireless_dev *wdev,
       u64 cookie);
           int (*nan_change_conf)(struct wiphy *wiphy, struct wireless_dev
       *wdev, struct cfg80211_nan_conf *conf, u32 changes);
           int (*nan_set_local_sched)(struct wiphy *wiphy, struct wireless_dev
       *wdev, struct cfg80211_nan_local_sched *sched);
           int (*nan_set_peer_sched)(struct wiphy *wiphy, struct wireless_dev
       *wdev, struct cfg80211_nan_peer_sched *sched);
           int (*set_multicast_to_unicast)(struct wiphy *wiphy, struct
       net_device *dev, const bool enabled);
           int (*get_txq_stats)(struct wiphy *wiphy, struct wireless_dev *wdev,
       struct cfg80211_txq_stats *txqstats);
           int (*set_pmk)(struct wiphy *wiphy, struct net_device *dev, const
       struct cfg80211_pmk_conf *conf);
           int (*del_pmk)(struct wiphy *wiphy, struct net_device *dev, const u8
       *aa);
           int (*external_auth)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_external_auth_params *params);
           int (*tx_control_port)(struct wiphy *wiphy, struct net_device *dev,
       const u8 *buf, size_t len, const u8 *dest, const __be16 proto, const
       bool noencrypt, int link_id, u64 cookie);
           int (*get_ftm_responder_stats)(struct wiphy *wiphy, struct
       net_device *dev, struct cfg80211_ftm_responder_stats *ftm_stats);
           int (*start_pmsr)(struct wiphy *wiphy, struct wireless_dev *wdev,
       struct cfg80211_pmsr_request *request);
           void (*abort_pmsr)(struct wiphy *wiphy, struct wireless_dev *wdev,
       struct cfg80211_pmsr_request *request);
           int (*update_owe_info)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_update_owe_info *owe_info);
           int (*probe_mesh_link)(struct wiphy *wiphy, struct net_device *dev,
       const u8 *buf, size_t len);
           int (*set_tid_config)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_tid_config *tid_conf);
           int (*reset_tid_config)(struct wiphy *wiphy, struct net_device *dev,
       const u8 *peer, u8 tids);
           int (*set_sar_specs)(struct wiphy *wiphy, struct cfg80211_sar_specs
       *sar);
           int (*color_change)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_color_change_settings *params);
           int (*set_fils_aad)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_fils_aad *fils_aad);
           int (*set_radar_background)(struct wiphy *wiphy, struct
       cfg80211_chan_def *chandef);
           int (*add_link_station)(struct wiphy *wiphy, struct net_device *dev,
       struct link_station_parameters *params);
           int (*mod_link_station)(struct wiphy *wiphy, struct net_device *dev,
       struct link_station_parameters *params);
           int (*del_link_station)(struct wiphy *wiphy, struct net_device *dev,
       struct link_station_del_parameters *params);
           int (*set_hw_timestamp)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_set_hw_timestamp *hwts);
           int (*set_ttlm)(struct wiphy *wiphy, struct net_device *dev, struct
       cfg80211_ttlm_params *params);
           u32 (*get_radio_mask)(struct wiphy *wiphy, struct net_device *dev);
           int (*assoc_ml_reconf)(struct wiphy *wiphy, struct net_device *dev,
       struct cfg80211_ml_reconf_req *req);
           int (*set_epcs)(struct wiphy *wiphy, struct net_device *dev, bool
       val);
           int (*start_pd)(struct wiphy *wiphy, struct wireless_dev *wdev);
           void (*stop_pd)(struct wiphy *wiphy, struct wireless_dev *wdev);
        };

πŸŽ€ Members πŸŽ€

Okay bestie, this is the actual meat of the page β€” every single callback in the ops struct, explained. Buckle up, there are a LOT. πŸ’–

  • suspend β€” the wiphy device needs to be suspended. The variable wow will be NULL, or it'll hold the enabled Wake-on-Wireless triggers that are configured for the device.
  • resume β€” the wiphy device needs to be resumed. ✨
  • set_wakeup β€” called when WoWLAN is enabled/disabled. Use this callback to call device_set_wakeup_enable to enable/disable wakeup from the device.
  • add_virtual_intf β€” create a new virtual interface with the given name, and it must set the struct wireless_dev's iftype. ⚠️ Beware: you must create the new netdev in the wiphy's network namespace! Returns the struct wireless_dev, or an ERR_PTR. For P2P device wdevs, the driver must also set the address member in the wdev. This additionally holds the RTNL to be able to do netdev changes.
  • del_virtual_intf β€” remove the virtual interface. This additionally holds the RTNL to be able to do netdev changes.
  • change_virtual_intf β€” change type/configuration of virtual interface, and keep the struct wireless_dev's iftype updated. This additionally holds the RTNL to be able to do netdev changes.
  • add_intf_link β€” add a new MLO link to the given interface. Note that the wdev->link[] data structure has been updated, so the new link address is available. πŸ’…
  • del_intf_link β€” remove an MLO link from the given interface.
  • add_key β€” add a key with the given parameters. mac_addr will be NULL when adding a group key. link_id will be -1 for non-MLO connection. For MLO connection, link_id will be >= 0 for group key and -1 for pairwise key, and mac_addr will be the peer's MLD address for MLO pairwise key.
  • get_key β€” get information about the key with the given parameters. mac_addr will be NULL when requesting information for a group key. All pointers given to the callback function need not be valid after it returns. This function should return an error if it is not possible to retrieve the key, or -ENOENT if it doesn't exist. link_id will be -1 for non-MLO connection. For MLO connection, link_id will be >= 0 for group key and -1 for pairwise key, and mac_addr will be the peer's MLD address for MLO pairwise key.
  • del_key β€” remove a key given the mac_addr (NULL for a group key) and key_index, and return -ENOENT if the key doesn't exist. link_id will be -1 for non-MLO connection. For MLO connection, link_id will be >= 0 for group key and -1 for pairwise key, and mac_addr will be the peer's MLD address for MLO pairwise key.
  • set_default_key β€” set the default key on an interface. link_id will be >= 0 for MLO connection and -1 for non-MLO connection. πŸ”‘
  • set_default_mgmt_key β€” set the default management frame key on an interface. link_id will be >= 0 for MLO connection and -1 for non-MLO connection.
  • set_default_beacon_key β€” set the default Beacon frame key on an interface. link_id will be >= 0 for MLO connection and -1 for non-MLO connection.
  • start_ap β€” Start acting in AP mode defined by the parameters. πŸ‘‘
  • change_beacon β€” Change the beacon parameters for an access point mode interface. This should reject the call when AP mode wasn't started.
  • stop_ap β€” Stop being an AP, including stopping beaconing.
  • add_station β€” Add a new station. 🫢
  • del_station β€” Remove a station.
  • change_station β€” Modify a given station. Heads up, flags changes are not much validated in cfg80211 β€” in particular the auth/assoc/authorized flags might come to the driver in invalid combinations, so make sure to check them, also against the existing state! Drivers must call cfg80211_check_station_change to validate the information. πŸ’€ No cap, do the check.
  • get_station β€” get station information for the station identified by mac.
  • dump_station β€” dump station callback β€” resume dump at index idx.
  • add_mpath β€” add a fixed mesh path.
  • del_mpath β€” delete a given mesh path.
  • change_mpath β€” change a given mesh path.
  • get_mpath β€” get a mesh path for the given parameters.
  • dump_mpath β€” dump mesh path callback β€” resume dump at index idx.
  • get_mpp β€” get a mesh proxy path for the given parameters.
  • dump_mpp β€” dump mesh proxy path callback β€” resume dump at index idx.
  • get_mesh_config β€” Get the current mesh configuration.
  • update_mesh_config β€” Update mesh parameters on a running mesh. The mask is a bitfield which tells us which parameters to set, and which to leave alone. πŸ¦‹
  • join_mesh β€” join the mesh network with the specified parameters (invoked with the wireless_dev mutex held).
  • leave_mesh β€” leave the current mesh network (invoked with the wireless_dev mutex held).
  • join_ocb β€” join the OCB network with the specified parameters (invoked with the wireless_dev mutex held).
  • leave_ocb β€” leave the current OCB network (invoked with the wireless_dev mutex held).
  • change_bss β€” Modify parameters for a given BSS.
  • inform_bss β€” called by cfg80211 while being informed about new BSS data for every BSS found within the reported data or frame. This is called from within the cfg8011 inform_bss handlers while holding the bss_lock. The data parameter is passed through from drv_data inside struct cfg80211_inform_bss. The new IE data for the BSS is explicitly passed. 🌸
  • set_txq_params β€” Set TX queue parameters.
  • libertas_set_mesh_channel β€” Only for backward compatibility for libertas, as it doesn't implement join_mesh and needs to set the channel to join the mesh instead.
  • set_monitor_channel β€” Set the monitor mode channel for the device. If other interfaces are active, this callback should reject the configuration. If no interfaces are active or the device is down, the channel should be stored for when a monitor interface becomes active. πŸ‘€
  • scan β€” Request to do a scan. If returning zero, the scan request is given the driver, and will be valid until passed to cfg80211_scan_done. For scan results, call cfg80211_inform_bss; you can call this outside the scan/scan_done bracket too. πŸ”₯
  • abort_scan β€” Tell the driver to abort an ongoing scan. The driver shall indicate the status of the scan through cfg80211_scan_done.
  • auth β€” Request to authenticate with the specified peer (invoked with the wireless_dev mutex held).
  • assoc β€” Request to (re)associate with the specified peer (invoked with the wireless_dev mutex held).
  • deauth β€” Request to deauthenticate from the specified peer (invoked with the wireless_dev mutex held).

and yes there are still more members coming, we are literally not done yet πŸ˜­πŸ’…

  • disassoc β€” bestie, this one's the "we're done here" button: a request to disassociate from the specified peer. (invoked with the wireless_dev mutex held)
  • connect β€” connect to the ESS with the specified parameters. When you're connected, call cfg80211_connect_result/cfg80211_connect_bss with status code WLAN_STATUS_SUCCESS. If the connection fails for some reason, call cfg80211_connect_result/cfg80211_connect_bss with the status code from the AP, or cfg80211_connect_timeout if no frame with a status code was received.

The driver is allowed to roam to other BSSes within the ESS when the other BSS matches the connect parameters. When such roaming is initiated by the driver, the driver is expected to verify that the target matches the configured security parameters and to use a Reassociation Request frame instead of an Association Request frame.

The connect function can also be used to request the driver to perform a specific roam when connected to an ESS. In that case, the prev_bssid parameter is set to the BSSID of the currently associated BSS as an indication of requesting reassociation.

In both the driver-initiated and new connect call initiated roaming cases, the result of roaming is indicated with a call to cfg80211_roamed. (invoked with the wireless_dev mutex held)

  • update_connect_params β€” update the connect parameters while connected to a BSS. Those updated parameters can be used by driver/firmware for subsequent BSS selection (roaming) decisions and to form the Authentication/(Re)Association Request frames. Heads up: this call does not request an immediate disassociation or reassociation with the current BSS β€” it impacts only subsequent (re)associations. The bits in changed are defined in enum cfg80211_connect_params_changed. (invoked with the wireless_dev mutex held)
  • disconnect β€” disconnect from the BSS/ESS, or stop connection attempts if a connection is in progress. Once done, call cfg80211_disconnected in case the connection was already established (invoked with the wireless_dev mutex held), otherwise call cfg80211_connect_timeout.
  • join_ibss β€” join the specified IBSS (or create it if necessary). Once done, call cfg80211_ibss_joined β€” also call that function when changing BSSID due to a merge. (invoked with the wireless_dev mutex held)
  • leave_ibss β€” leave the IBSS. That's it. Bye. (invoked with the wireless_dev mutex held)
  • set_mcast_rate β€” set the specified multicast rate (only if the vif is in ADHOC or MESH mode, iykyk).
  • set_wiphy_params β€” notify that wiphy parameters have changed; the changed bitfield (see enum wiphy_params_flags) describes which values have changed. The actual parameter values are available in struct wiphy. If returning an error, no value should be changed. πŸ’€
  • set_tx_power β€” set the transmit power according to the parameters; the power passed is in mBm, so to get dBm use MBM_TO_DBM. The wdev may be NULL if power was set for the wiphy, and will always be NULL unless the driver supports per-vif TX power (as advertised by the nl80211 feature flag.)
  • get_tx_power β€” store the current TX power into the dbm variable; return 0 if successful.
  • rfkill_poll β€” polls the hw rfkill line; use the cfg80211 reporting functions to adjust rfkill hw state.
  • testmode_cmd β€” run a test mode command; wdev may be NULL.
  • testmode_dump β€” implement a test mode dump. The cb->args[2] and up may be used by the function, but 0 and 1 must not be touched. Additionally β€” and this is the spicy part β€” returning error codes other than -ENOBUFS and -ENOENT will terminate the dump and return to userspace with an error, so be careful. If any data was passed in from userspace then the data/len arguments will be present and point to the data contained in NL80211_ATTR_TESTDATA.
  • set_bitrate_mask β€” set the bitrate mask configuration.
  • dump_survey β€” get site survey information.
  • set_pmksa β€” cache a PMKID for a BSSID. This is mostly useful for fullmac devices running firmwares capable of generating the (re)association RSN IE. It allows for faster roaming between WPA2 BSSIDs. kind of a slay tbh ✨
  • del_pmksa β€” delete a cached PMKID.
  • flush_pmksa β€” flush all the cached PMKIDs.
  • remain_on_channel β€” request the driver to remain awake on the specified channel for the specified duration to complete an off-channel operation (e.g., public action frame exchange). When the driver is ready on the requested channel, it must indicate this with an event notification by calling cfg80211_ready_on_channel.
  • cancel_remain_on_channel β€” cancel an on-going remain-on-channel operation. This allows the operation to be terminated prior to timeout based on the duration value.
  • mgmt_tx β€” transmit a management frame.
  • mgmt_tx_cancel_wait β€” cancel the wait time from transmitting a management frame on another channel.
  • set_power_mgmt β€” configure WLAN power management. A timeout value of -1 allows the driver to adjust the dynamic ps timeout value.
  • set_cqm_rssi_config β€” configure the connection quality monitor RSSI threshold. After configuration, the driver should (soon) send an event indicating the current level is above/below the configured threshold; this may need some care when the configuration is changed (without first being disabled.)
  • set_cqm_rssi_range_config β€” configure two RSSI thresholds in the connection quality monitor. An event is to be sent only when the signal level is found to be outside the two values. The driver should set NL80211_EXT_FEATURE_CQM_RSSI_LIST if this method is implemented. If it is provided then there's no point providing set_cqm_rssi_config.
  • set_cqm_txe_config β€” configure connection quality monitor TX error thresholds.
  • update_mgmt_frame_registrations β€” notify the driver that management frame registrations were updated. The callback is allowed to sleep. 😴
  • set_antenna β€” set antenna configuration (tx_ant, rx_ant) on the device. Parameters are bitmaps of allowed antennas to use for TX/RX. Drivers may reject TX/RX mask combinations they cannot support by returning -EINVAL (also see nl80211.h NL80211_ATTR_WIPHY_ANTENNA_TX).
  • get_antenna β€” get the current antenna configuration from the device (tx_ant, rx_ant).
  • sched_scan_start β€” tell the driver to start a scheduled scan.
  • sched_scan_stop β€” tell the driver to stop an ongoing scheduled scan with the given request id. This call must stop the scheduled scan and be ready for starting a new one before it returns, i.e. sched_scan_start may be called immediately after that again and should not fail in that case. The driver should not call cfg80211_sched_scan_stopped for a requested stop (when this method returns 0).
  • set_rekey_data β€” give the data necessary for GTK rekeying to the driver.
  • tdls_mgmt β€” transmit a TDLS management frame.
  • tdls_oper β€” perform a high-level TDLS operation (e.g. TDLS link setup).
  • probe_peer β€” probe a connected peer (AP: STA MAC required; STA: no MAC), and it must use the cookie as provided, which is later passed to cfg80211_probe_status.
  • set_noack_map β€” set the NoAck Map for the TIDs.
  • get_channel β€” get the current operating channel for the virtual interface. For monitor interfaces, it should return NULL unless there's a single current monitoring channel.
  • start_p2p_device β€” start the given P2P device.
  • stop_p2p_device β€” stop the given P2P device.
  • set_mac_acl β€” sets the MAC address control list in AP and P2P GO mode. Parameters include the ACL policy, an array of MAC addresses of stations and the number of MAC addresses. If there is already a list in the driver, this new list replaces the existing one. The driver has to clear its ACL when the number of MAC address entries is passed as 0. Drivers which advertise the support for MAC based ACL have to implement this callback β€” no skipping, bestie.
  • start_radar_detection β€” start radar detection in the driver. 🚨
  • end_cac β€” end a running CAC, probably because a related CAC was finished on another phy.
  • update_ft_ies β€” provide updated Fast BSS Transition information to the driver. If the SME is in the driver/firmware, this information can be used in building Authentication and Reassociation Request frames.
  • crit_proto_start β€” indicates a critical protocol needs more link reliability for a given duration (milliseconds). The protocol is provided so the driver can take the most appropriate actions.
  • crit_proto_stop β€” indicates a critical protocol no longer needs increased link reliability. This operation can not fail. (iconic of it, honestly)
  • set_coalesce β€” set coalesce parameters.
  • channel_switch β€” initiate channel-switch procedure (with CSA). The driver is responsible for veryfing if the switch is possible. Since this is inherently tricky the driver may decide to disconnect an interface later with cfg80211_stop_iface. This doesn't mean the driver can accept everything β€” it should do it's best to verify requests and reject them as soon as possible.
  • set_qos_map β€” set QoS mapping information to the driver.
  • set_ap_chanwidth β€” set the AP (including P2P GO) mode channel width for the given interface. This is used e.g. for dynamic HT 20/40 MHz channel width changes during the lifetime of the BSS.
  • add_tx_ts β€” bestie, this one either validates the params (when admitted_time is 0) or actually adds a TX TS to the device with the parameters you handed over. The action frame exchange? Already handled by userspace, so all you gotta do is tweak the TX path so it takes the TS into account. If the admitted time is 0, just validate the parameters to make sure the session can be created at all β€” and yeah, it's totally valid to just always return success for that, but lowkey that may result in inefficient behaviour (picture it: handshake with the peer, then immediate teardown when the addition gets rejected later 😭). So validate properly if you can.
  • del_tx_ts β€” remove an existing TX TS. Simple. Iconic. No notes. ✨
  • tdls_channel_switch β€” start channel-switching with a TDLS peer. Heads up: the driver is responsible for continually initiating channel-switching operations and returning to the base channel for communication with the AP. That's on you, not us. 🫢
  • tdls_cancel_channel_switch β€” stop channel-switching with a TDLS peer. Non-negotiable detail: both peers must be on the base channel when the call completes. 🌸
  • start_nan β€” start the NAN interface.
  • stop_nan β€” stop the NAN interface. (yes queen, symmetry πŸ’…)
  • add_nan_func β€” add a NAN function. Returns negative value on failure. On success, nan_func ownership is transferred to the driver and it may access it outside of the scope of this function. The driver should free the nan_func when it's no longer needed by calling cfg80211_free_nan_func. On success the driver should assign an instance_id in the provided nan_func. Ownership transfer is real, bestie β€” don't ghost it.
  • del_nan_func β€” delete a NAN function.
  • nan_change_conf β€” changes NAN configuration. The changed parameters must be specified in changes (using enum cfg80211_nan_conf_changes); all other parameters must be ignored. No sneaky reading of the rest, okay? πŸ™ˆ
  • nan_set_local_sched β€” configure the local schedule for NAN. The schedule consists of an array of cfg80211_nan_channel and the schedule itself, in which each entry maps each time slot to the channel on which the radio should operate on. And listen: if the chandef of a NAN channel is not changed, the channel entry must also remain unchanged β€” and it is the driver's responsibility to verify this. Vibe check your entries.
  • nan_set_peer_sched β€” configure the peer schedule for NAN. The schedule consists of an array of cfg80211_nan_channel and the schedule itself, in which each entry maps each time slot to a channel on which the radio should operate on. On top of that it contains more peer's schedule information such as committed DW, etc. When updating an existing peer schedule, the full new schedule is provided β€” partial updates are not supported, and the new schedule completely replaces the previous one. Full replace or nothing, periodt.
  • set_multicast_to_unicast β€” configure multicast to unicast conversion for BSS.
  • get_txq_stats β€” get TXQ stats for interface or phy. If wdev is NULL, this function should return phy stats, and interface stats otherwise. Easy rule, don't overthink it πŸ’–
  • set_pmk β€” configure the PMK to be used for offloaded 802.1X 4-Way handshake. If not deleted through del_pmk the PMK remains valid until disconnect, upon which the driver should clear it. (invoked with the wireless_dev mutex held)
  • del_pmk β€” delete the previously configured PMK for the given authenticator. (invoked with the wireless_dev mutex held)
  • external_auth β€” indicates result of offloaded authentication processing from user space.
  • tx_control_port β€” TX a control port frame (EAPoL). The noencrypt parameter tells the driver that the frame should not be encrypted. A cookie value of 0 means the caller does not want TX status reporting. Zero cookie = no status, noted.
  • get_ftm_responder_stats β€” retrieve FTM responder statistics, if available. Statistics should be cumulative, and currently no way to reset is provided. So yeah β€” no reset button, sorry bestie 😭
  • start_pmsr β€” start peer measurement (e.g. FTM).
  • abort_pmsr β€” abort peer measurement.
  • update_owe_info β€” provide updated OWE info to driver. A driver implementing SME but offloading OWE processing to the user space will get the updated DH IE through this interface.
  • probe_mesh_link β€” probe direct Mesh peer's link quality by sending data frame and overrule HWMP path selection algorithm. Chaotic but make it functional.
  • set_tid_config β€” TID specific configuration, this can be peer or BSS specific. This callback may sleep. 😴
  • reset_tid_config β€” reset TID specific configuration for the peer, for the given TIDs. This callback may sleep. 😴
  • set_sar_specs β€” update the SAR (TX power) settings.
  • color_change β€” initiate a color change.
  • set_fils_aad β€” set FILS AAD data to the AP driver so that the driver can use those to decrypt (Re)Association Request and encrypt (Re)Association Response frame.
  • set_radar_background β€” configure dedicated offchannel chain available for radar/CAC detection on some hw. This chain can't be used to transmit or receive frames and it is bounded to a running wdev. Background radar/CAC detection allows to avoid the CAC downtime switching to a different channel during CAC detection on the selected radar channel. The caller is expected to set the chandef pointer to NULL in order to disable background CAC/radar detection. NULL chandef = off switch, remember it.
  • add_link_station β€” add a link to a station.
  • mod_link_station β€” modify a link of a station.
  • del_link_station β€” remove a link of a station. (add / mod / del β€” a whole glow-up trilogy ✨)
  • set_hw_timestamp β€” enable/disable HW timestamping of TM/FTM frames.
  • set_ttlm β€” set the TID to link mapping.
  • get_radio_mask β€” get bitmask of radios in use. (invoked with the wiphy mutex held)
  • assoc_ml_reconf β€” request a non-AP MLO connection to perform ML reconfiguration, i.e., add and/or remove links to/from the association using ML reconfiguration action frames. Successfully added links will be added to the set of valid links. Successfully removed links will be removed from the set of valid links. The driver must indicate removed links by calling cfg80211_links_removed and added links by calling cfg80211_mlo_reconf_add_done. When calling cfg80211_mlo_reconf_add_done the bss pointer must be given for each link for which MLO reconfiguration 'add' operation was requested. Bookkeeping is mandatory, bestie β€” no vibes-only reporting.
  • set_epcs β€” enable/disable EPCS for station mode.
  • start_pd β€” start the PD interface.
  • stop_pd β€” stop the PD interface.

πŸ’« DESCRIPTION πŸ’«

Okay so, big picture: this struct is registered by fullmac card drivers and/or wireless stacks in order to handle configuration requests on their interfaces. That's the whole raison d'Γͺtre, iykyk.

All callbacks except where otherwise noted should return 0 on success or a negative error code. No creative return values, please πŸŽ€

⚠️ All operations are invoked with the wiphy mutex held. The RTNL may be held in addition (due to wireless extensions) but this cannot be relied upon except in cases where documented below. Note that due to ordering, the RTNL also cannot be acquired in any handlers. So like β€” don't try to grab the RTNL in a handler. Fr fr. That's the rule.

🌈 SEE ALSO 🌈

okay bestie, this is the part where the manpage just dumps the whole friend group into the group chat 😭🫢. like, every single cross-reference. i kept all of them, exact names, character for character, because these are literally the other pages you should go read when you're done here. no cap. go say hi πŸ’…


πŸŽ€ the header file + the big intros

  • Kernel file ./include/net/cfg80211.h
  • Introduction(9)
  • Device registration(9)

then the whole channel / rate / capability crew rolls in:

yes bestie, _ieee80211_set_sband_iftype_data(9) really does start with an underscore, and yes you bet that's the internal one πŸ’€


πŸ› οΈ 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)

the chandef girlies, all iconic, all obsessed with bandwidth

surveys, crypto, beacons, AP stuff ✨

  • 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)

sar + mesh + ocb + txq (the ones nobody remembers until they need them) πŸ¦‹

  • 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)

πŸ” 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)

auth, assoc, deauth, disassoc, ibss β€” the whole connection storyline πŸ’€

  • 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)

pmksa / wowlan / coalesce / qos β€” lowkey my fave section name, "wowlan" is iconic

  • 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)

🧚 Neighbor Awareness Networking (NAN)

  • 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)

pmk, external auth, FTM, PMSR, OWE 🫢

  • 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)

the wiphy zone πŸ‘‘ (this is the main character energy section, ngl)

  • 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)

the wiphy lifecycle + locking + workqueue besties ✨


πŸ¦‹ Utility functions

radiotap + header length crew πŸŽ€


🌸 Data path helpers

the element-hunting squad (find it, find it ext, find it vendor) πŸ”


βš–οΈ Regulatory enforcement infrastructure

Internal regulatory db functions


πŸ™ˆ the BSS lifecycle / MLME / notification pile

no divider here bestie, the manpage just keeps going and honestly, same πŸ’€

MLME events 🫢


πŸ“‘ RFkill integration

πŸ’… Vendor commands

πŸ§ͺ Test mode


🌈 and the rest of the list (she's still going)

connect / roam / disconnect πŸ’”

channel / mgmt-tx timing ⏳

station info + tid stats ✨

rx / tx mgmt + control port πŸ“¨

CQM + radar + CAC + gtk rekey + pmksa candidates 🚨

and the very last stragglers πŸ“

okay that's genuinely all of them, bestie β€” nothing cut, nothing merged, no flags invented πŸ’– more coming right up…

...and the deep-lore chapter continues, because this page's SEE ALSO is not a snack, it's a whole buffet. πŸ“ Grab a drink, bestie, we're doing the rest of the list:

Okay the operating-class / chandef conversion squad is genuinely satisfying β€” four whole pages that just translate between formats all day, icons of consistency πŸ’…

The feature set/isset duo, the check/iter combination duo, the stop-link/stop-iface/shutdown trio β€” manpage authors love a matched set, and honestly? Slay. ✨

Not the whole color-change notify family showing up in full ✨started✨ / ✨aborted✨ / ✨notify✨ formation β€” it's giving "we finish what we start", and we respect it 🫢

And that's the list, bestie β€” every last reference, from the beacon checks all the way down to the very last cfg80211_incumbent_signal_notify(9). Ngl, hitting the end of a 64-entry SEE ALSO is a moment. πŸ˜­πŸ‘‘


Okay so here's the cute little sign-off you asked for: this page lives in ./include/net, it's dated October 2026, and its title/version tag is struct cfg80211_ops(9) β€” so if you're citing it, cite it properly, and if you're out here reading kernel WiFi internals for fun, you're literally main character energy. πŸ¦‹ Go touch some grass (the driver kind, obviously). Periodt. πŸ’–

πŸ“¦ where this page comes from