#include <linux/delay.h>
#include <linux/fips.h>
#include <linux/if_ether.h>
#include <linux/skbuff.h>
#include <linux/if_arp.h>
#include <linux/etherdevice.h>
#include <linux/moduleparam.h>
#include <linux/rtnetlink.h>
#include <linux/crc32.h>
#include <linux/slab.h>
#include <linux/export.h>
#include <net/mac80211.h>
#include <asm/unaligned.h>
#include "ieee80211_i.h"
#include "driver-ops.h"
#include "rate.h"
#include "led.h"
#include "fils_aead.h"
#define IEEE80211_AUTH_TIMEOUT …
#define IEEE80211_AUTH_TIMEOUT_LONG …
#define IEEE80211_AUTH_TIMEOUT_SHORT …
#define IEEE80211_AUTH_TIMEOUT_SAE …
#define IEEE80211_AUTH_MAX_TRIES …
#define IEEE80211_AUTH_WAIT_ASSOC …
#define IEEE80211_AUTH_WAIT_SAE_RETRY …
#define IEEE80211_ASSOC_TIMEOUT …
#define IEEE80211_ASSOC_TIMEOUT_LONG …
#define IEEE80211_ASSOC_TIMEOUT_SHORT …
#define IEEE80211_ASSOC_MAX_TRIES …
#define IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS …
#define IEEE80211_ADV_TTLM_ST_UNDERFLOW …
#define IEEE80211_NEG_TTLM_REQ_TIMEOUT …
static int max_nullfunc_tries = …;
module_param(max_nullfunc_tries, int, 0644);
MODULE_PARM_DESC(…) …;
static int max_probe_tries = …;
module_param(max_probe_tries, int, 0644);
MODULE_PARM_DESC(…) …;
static int beacon_loss_count = …;
module_param(beacon_loss_count, int, 0644);
MODULE_PARM_DESC(…) …;
#define IEEE80211_CONNECTION_IDLE_TIME …
static int probe_wait_ms = …;
module_param(probe_wait_ms, int, 0644);
MODULE_PARM_DESC(…) …;
#define IEEE80211_SIGNAL_AVE_MIN_COUNT …
static void run_again(struct ieee80211_sub_if_data *sdata,
unsigned long timeout)
{ … }
void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata)
{ … }
void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata)
{ … }
static int ecw2cw(int ecw)
{ … }
static enum ieee80211_conn_mode
ieee80211_determine_ap_chan(struct ieee80211_sub_if_data *sdata,
struct ieee80211_channel *channel,
u32 vht_cap_info,
const struct ieee802_11_elems *elems,
bool ignore_ht_channel_mismatch,
const struct ieee80211_conn_settings *conn,
struct cfg80211_chan_def *chandef)
{ … }
static bool
ieee80211_verify_peer_he_mcs_support(struct ieee80211_sub_if_data *sdata,
const struct ieee80211_he_cap_elem *he_cap,
const struct ieee80211_he_operation *he_op)
{ … }
static bool
ieee80211_verify_sta_he_mcs_support(struct ieee80211_sub_if_data *sdata,
struct ieee80211_supported_band *sband,
const struct ieee80211_he_operation *he_op)
{ … }
static u8
ieee80211_get_eht_cap_mcs_nss(const struct ieee80211_sta_he_cap *sta_he_cap,
const struct ieee80211_sta_eht_cap *sta_eht_cap,
unsigned int idx, int bw)
{ … }
static bool
ieee80211_verify_sta_eht_mcs_support(struct ieee80211_sub_if_data *sdata,
struct ieee80211_supported_band *sband,
const struct ieee80211_eht_operation *eht_op)
{ … }
static bool ieee80211_chandef_usable(struct ieee80211_sub_if_data *sdata,
const struct cfg80211_chan_def *chandef,
u32 prohibited_flags)
{ … }
static int ieee80211_chandef_num_subchans(const struct cfg80211_chan_def *c)
{ … }
static int ieee80211_chandef_num_widths(const struct cfg80211_chan_def *c)
{ … }
VISIBLE_IF_MAC80211_KUNIT int
ieee80211_calc_chandef_subchan_offset(const struct cfg80211_chan_def *ap,
u8 n_partial_subchans)
{ … }
EXPORT_SYMBOL_IF_MAC80211_KUNIT(…);
VISIBLE_IF_MAC80211_KUNIT void
ieee80211_rearrange_tpe_psd(struct ieee80211_parsed_tpe_psd *psd,
const struct cfg80211_chan_def *ap,
const struct cfg80211_chan_def *used)
{ … }
EXPORT_SYMBOL_IF_MAC80211_KUNIT(…);
static void ieee80211_rearrange_tpe(struct ieee80211_parsed_tpe *tpe,
const struct cfg80211_chan_def *ap,
const struct cfg80211_chan_def *used)
{ … }
static void ieee80211_set_chanreq_ap(struct ieee80211_sub_if_data *sdata,
struct ieee80211_chan_req *chanreq,
struct ieee80211_conn_settings *conn,
struct cfg80211_chan_def *ap_chandef)
{ … }
static struct ieee802_11_elems *
ieee80211_determine_chan_mode(struct ieee80211_sub_if_data *sdata,
struct ieee80211_conn_settings *conn,
struct cfg80211_bss *cbss, int link_id,
struct ieee80211_chan_req *chanreq,
struct cfg80211_chan_def *ap_chandef)
{ … }
static int ieee80211_config_bw(struct ieee80211_link_data *link,
struct ieee802_11_elems *elems,
bool update, u64 *changed)
{ … }
static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata,
struct sk_buff *skb, u8 ap_ht_param,
struct ieee80211_supported_band *sband,
struct ieee80211_channel *channel,
enum ieee80211_smps_mode smps,
const struct ieee80211_conn_settings *conn)
{ … }
static bool ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata,
struct sk_buff *skb,
struct ieee80211_supported_band *sband,
struct ieee80211_vht_cap *ap_vht_cap,
const struct ieee80211_conn_settings *conn)
{ … }
static void ieee80211_assoc_add_rates(struct sk_buff *skb,
enum nl80211_chan_width width,
struct ieee80211_supported_band *sband,
struct ieee80211_mgd_assoc_data *assoc_data)
{ … }
static size_t ieee80211_add_before_ht_elems(struct sk_buff *skb,
const u8 *elems,
size_t elems_len,
size_t offset)
{ … }
static size_t ieee80211_add_before_vht_elems(struct sk_buff *skb,
const u8 *elems,
size_t elems_len,
size_t offset)
{ … }
static size_t ieee80211_add_before_he_elems(struct sk_buff *skb,
const u8 *elems,
size_t elems_len,
size_t offset)
{ … }
#define PRESENT_ELEMS_MAX …
#define PRESENT_ELEM_EXT_OFFS …
static void ieee80211_assoc_add_ml_elem(struct ieee80211_sub_if_data *sdata,
struct sk_buff *skb, u16 capab,
const struct element *ext_capa,
const u16 *present_elems);
static size_t ieee80211_assoc_link_elems(struct ieee80211_sub_if_data *sdata,
struct sk_buff *skb, u16 *capab,
const struct element *ext_capa,
const u8 *extra_elems,
size_t extra_elems_len,
unsigned int link_id,
struct ieee80211_link_data *link,
u16 *present_elems)
{ … }
static void ieee80211_add_non_inheritance_elem(struct sk_buff *skb,
const u16 *outer,
const u16 *inner)
{ … }
static void ieee80211_assoc_add_ml_elem(struct ieee80211_sub_if_data *sdata,
struct sk_buff *skb, u16 capab,
const struct element *ext_capa,
const u16 *outer_present_elems)
{ … }
static int ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
{ … }
void ieee80211_send_pspoll(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata)
{ … }
void ieee80211_send_nullfunc(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
bool powersave)
{ … }
void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata)
{ … }
static void ieee80211_csa_switch_work(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
static void ieee80211_chswitch_post_beacon(struct ieee80211_link_data *link)
{ … }
void ieee80211_chswitch_done(struct ieee80211_vif *vif, bool success,
unsigned int link_id)
{ … }
EXPORT_SYMBOL(…);
static void
ieee80211_sta_abort_chanswitch(struct ieee80211_link_data *link)
{ … }
struct sta_csa_rnr_iter_data { … };
static enum cfg80211_rnr_iter_ret
ieee80211_sta_csa_rnr_iter(void *_data, u8 type,
const struct ieee80211_neighbor_ap_info *info,
const u8 *tbtt_info, u8 tbtt_info_len)
{ … }
static void
ieee80211_sta_other_link_csa_disappeared(struct ieee80211_link_data *link,
struct ieee802_11_elems *elems)
{ … }
enum ieee80211_csa_source { … };
static void
ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
u64 timestamp, u32 device_timestamp,
struct ieee802_11_elems *full_elems,
struct ieee802_11_elems *csa_elems,
enum ieee80211_csa_source source)
{ … }
static bool
ieee80211_find_80211h_pwr_constr(struct ieee80211_sub_if_data *sdata,
struct ieee80211_channel *channel,
const u8 *country_ie, u8 country_ie_len,
const u8 *pwr_constr_elem,
int *chan_pwr, int *pwr_reduction)
{ … }
static void ieee80211_find_cisco_dtpc(struct ieee80211_sub_if_data *sdata,
struct ieee80211_channel *channel,
const u8 *cisco_dtpc_ie,
int *pwr_level)
{ … }
static u64 ieee80211_handle_pwr_constr(struct ieee80211_link_data *link,
struct ieee80211_channel *channel,
struct ieee80211_mgmt *mgmt,
const u8 *country_ie, u8 country_ie_len,
const u8 *pwr_constr_ie,
const u8 *cisco_dtpc_ie)
{ … }
static void ieee80211_enable_ps(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata)
{ … }
static void ieee80211_change_ps(struct ieee80211_local *local)
{ … }
static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata)
{ … }
void ieee80211_recalc_ps(struct ieee80211_local *local)
{ … }
void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata)
{ … }
void ieee80211_dynamic_ps_disable_work(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
void ieee80211_dynamic_ps_enable_work(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
void ieee80211_dynamic_ps_timer(struct timer_list *t)
{ … }
void ieee80211_dfs_cac_timer_work(struct wiphy *wiphy, struct wiphy_work *work)
{ … }
static bool
__ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata)
{ … }
void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata)
{ … }
static void ieee80211_sta_handle_tspec_ac_params_wk(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
void ieee80211_mgd_set_link_qos_params(struct ieee80211_link_data *link)
{ … }
static bool
ieee80211_sta_wmm_params(struct ieee80211_local *local,
struct ieee80211_link_data *link,
const u8 *wmm_param, size_t wmm_param_len,
const struct ieee80211_mu_edca_param_set *mu_edca)
{ … }
static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata)
{ … }
static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata)
{ … }
static u64 ieee80211_handle_bss_capability(struct ieee80211_link_data *link,
u16 capab, bool erp_valid, u8 erp)
{ … }
static u64 ieee80211_link_set_associated(struct ieee80211_link_data *link,
struct cfg80211_bss *cbss)
{ … }
static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgd_assoc_data *assoc_data,
u64 changed[IEEE80211_MLD_MAX_NUM_LINKS])
{ … }
static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
u16 stype, u16 reason, bool tx,
u8 *frame_buf)
{ … }
static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
{ … }
static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata,
struct ieee80211_hdr *hdr,
u16 tx_time)
{ … }
void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata,
struct ieee80211_hdr *hdr, bool ack, u16 tx_time)
{ … }
static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata,
const u8 *src, const u8 *dst,
const u8 *ssid, size_t ssid_len,
struct ieee80211_channel *channel)
{ … }
static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
{ … }
static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata,
bool beacon)
{ … }
struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,
struct ieee80211_vif *vif)
{ … }
EXPORT_SYMBOL(…);
static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata,
const u8 *buf, size_t len, bool tx,
u16 reason, bool reconnect)
{ … }
static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata)
{ … }
static void ieee80211_beacon_connection_loss_work(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
static void ieee80211_csa_connection_drop_work(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
void ieee80211_beacon_loss(struct ieee80211_vif *vif)
{ … }
EXPORT_SYMBOL(…);
void ieee80211_connection_loss(struct ieee80211_vif *vif)
{ … }
EXPORT_SYMBOL(…);
void ieee80211_disconnect(struct ieee80211_vif *vif, bool reconnect)
{ … }
EXPORT_SYMBOL(…);
static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata,
bool assoc)
{ … }
enum assoc_status { … };
static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata,
enum assoc_status status)
{ … }
static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgmt *mgmt, size_t len)
{ … }
static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata)
{ … }
static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgmt *mgmt, size_t len)
{ … }
#define case_WLAN(type) …
const char *ieee80211_get_reason_code_string(u16 reason_code)
{ … }
static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgmt *mgmt, size_t len)
{ … }
static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgmt *mgmt, size_t len)
{ … }
static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
u8 *supp_rates, unsigned int supp_rates_len,
u32 *rates, u32 *basic_rates,
bool *have_higher_than_11mbit,
int *min_rate, int *min_rate_index)
{ … }
static bool ieee80211_twt_req_supported(struct ieee80211_sub_if_data *sdata,
struct ieee80211_supported_band *sband,
const struct link_sta_info *link_sta,
const struct ieee802_11_elems *elems)
{ … }
static u64 ieee80211_recalc_twt_req(struct ieee80211_sub_if_data *sdata,
struct ieee80211_supported_band *sband,
struct ieee80211_link_data *link,
struct link_sta_info *link_sta,
struct ieee802_11_elems *elems)
{ … }
static bool ieee80211_twt_bcast_support(struct ieee80211_sub_if_data *sdata,
struct ieee80211_bss_conf *bss_conf,
struct ieee80211_supported_band *sband,
struct link_sta_info *link_sta)
{ … }
static bool ieee80211_assoc_config_link(struct ieee80211_link_data *link,
struct link_sta_info *link_sta,
struct cfg80211_bss *cbss,
struct ieee80211_mgmt *mgmt,
const u8 *elem_start,
unsigned int elem_len,
u64 *changed)
{ … }
static int ieee80211_mgd_setup_link_sta(struct ieee80211_link_data *link,
struct sta_info *sta,
struct link_sta_info *link_sta,
struct cfg80211_bss *cbss)
{ … }
static u8 ieee80211_max_rx_chains(struct ieee80211_link_data *link,
struct cfg80211_bss *cbss)
{ … }
static void
ieee80211_determine_our_sta_mode(struct ieee80211_sub_if_data *sdata,
struct ieee80211_supported_band *sband,
struct cfg80211_assoc_request *req,
bool wmm_used, int link_id,
struct ieee80211_conn_settings *conn)
{ … }
static void
ieee80211_determine_our_sta_mode_auth(struct ieee80211_sub_if_data *sdata,
struct ieee80211_supported_band *sband,
struct cfg80211_auth_request *req,
bool wmm_used,
struct ieee80211_conn_settings *conn)
{ … }
static void
ieee80211_determine_our_sta_mode_assoc(struct ieee80211_sub_if_data *sdata,
struct ieee80211_supported_band *sband,
struct cfg80211_assoc_request *req,
bool wmm_used, int link_id,
struct ieee80211_conn_settings *conn)
{ … }
static enum ieee80211_ap_reg_power
ieee80211_ap_power_type(u8 control)
{ … }
static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
struct ieee80211_link_data *link,
int link_id,
struct cfg80211_bss *cbss, bool mlo,
struct ieee80211_conn_settings *conn)
{ … }
static bool ieee80211_get_dtim(const struct cfg80211_bss_ies *ies,
u8 *dtim_count, u8 *dtim_period)
{ … }
static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgmt *mgmt,
struct ieee802_11_elems *elems,
const u8 *elem_start, unsigned int elem_len)
{ … }
static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgmt *mgmt,
size_t len)
{ … }
static void ieee80211_rx_bss_info(struct ieee80211_link_data *link,
struct ieee80211_mgmt *mgmt, size_t len,
struct ieee80211_rx_status *rx_status)
{ … }
static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_link_data *link,
struct sk_buff *skb)
{ … }
static const u64 care_about_ies = …;
static void ieee80211_handle_beacon_sig(struct ieee80211_link_data *link,
struct ieee80211_if_managed *ifmgd,
struct ieee80211_bss_conf *bss_conf,
struct ieee80211_local *local,
struct ieee80211_rx_status *rx_status)
{ … }
static bool ieee80211_rx_our_beacon(const u8 *tx_bssid,
struct cfg80211_bss *bss)
{ … }
static void ieee80211_ml_reconf_work(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
static void ieee80211_ml_reconfiguration(struct ieee80211_sub_if_data *sdata,
struct ieee802_11_elems *elems)
{ … }
static int ieee80211_ttlm_set_links(struct ieee80211_sub_if_data *sdata,
u16 active_links, u16 dormant_links,
u16 suspended_links)
{ … }
static void ieee80211_tid_to_link_map_work(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
static u16 ieee80211_get_ttlm(u8 bm_size, u8 *data)
{ … }
static int
ieee80211_parse_adv_t2l(struct ieee80211_sub_if_data *sdata,
const struct ieee80211_ttlm_elem *ttlm,
struct ieee80211_adv_ttlm_info *ttlm_info)
{ … }
static void ieee80211_process_adv_ttlm(struct ieee80211_sub_if_data *sdata,
struct ieee802_11_elems *elems,
u64 beacon_ts)
{ … }
static void
ieee80211_mgd_check_cross_link_csa(struct ieee80211_sub_if_data *sdata,
int reporting_link_id,
struct ieee802_11_elems *elems)
{ … }
static bool ieee80211_mgd_ssid_mismatch(struct ieee80211_sub_if_data *sdata,
const struct ieee802_11_elems *elems)
{ … }
static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
struct ieee80211_hdr *hdr, size_t len,
struct ieee80211_rx_status *rx_status)
{ … }
static void ieee80211_apply_neg_ttlm(struct ieee80211_sub_if_data *sdata,
struct ieee80211_neg_ttlm neg_ttlm)
{ … }
static void ieee80211_neg_ttlm_timeout_work(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
static void
ieee80211_neg_ttlm_add_suggested_map(struct sk_buff *skb,
struct ieee80211_neg_ttlm *neg_ttlm)
{ … }
static void
ieee80211_send_neg_ttlm_req(struct ieee80211_sub_if_data *sdata,
struct ieee80211_neg_ttlm *neg_ttlm,
u8 dialog_token)
{ … }
int ieee80211_req_neg_ttlm(struct ieee80211_sub_if_data *sdata,
struct cfg80211_ttlm_params *params)
{ … }
static void
ieee80211_send_neg_ttlm_res(struct ieee80211_sub_if_data *sdata,
enum ieee80211_neg_ttlm_res ttlm_res,
u8 dialog_token,
struct ieee80211_neg_ttlm *neg_ttlm)
{ … }
static int
ieee80211_parse_neg_ttlm(struct ieee80211_sub_if_data *sdata,
const struct ieee80211_ttlm_elem *ttlm,
struct ieee80211_neg_ttlm *neg_ttlm,
u8 *direction)
{ … }
void ieee80211_process_neg_ttlm_req(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgmt *mgmt, size_t len)
{ … }
void ieee80211_process_neg_ttlm_res(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgmt *mgmt, size_t len)
{ … }
static void ieee80211_teardown_ttlm_work(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
void ieee80211_send_teardown_neg_ttlm(struct ieee80211_vif *vif)
{ … }
EXPORT_SYMBOL(…);
void ieee80211_sta_rx_queued_ext(struct ieee80211_sub_if_data *sdata,
struct sk_buff *skb)
{ … }
void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
struct sk_buff *skb)
{ … }
static void ieee80211_sta_timer(struct timer_list *t)
{ … }
void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
u8 reason, bool tx)
{ … }
static int ieee80211_auth(struct ieee80211_sub_if_data *sdata)
{ … }
static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata)
{ … }
void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata,
__le16 fc, bool acked)
{ … }
void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
{ … }
static void ieee80211_sta_bcn_mon_timer(struct timer_list *t)
{ … }
static void ieee80211_sta_conn_mon_timer(struct timer_list *t)
{ … }
static void ieee80211_sta_monitor_work(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
{ … }
#ifdef CONFIG_PM
void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata)
{ … }
#endif
void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata)
{ … }
static void ieee80211_request_smps_mgd_work(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata)
{ … }
static void ieee80211_recalc_smps_work(struct wiphy *wiphy,
struct wiphy_work *work)
{ … }
void ieee80211_mgd_setup_link(struct ieee80211_link_data *link)
{ … }
void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local)
{ … }
static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
struct cfg80211_bss *cbss, s8 link_id,
const u8 *ap_mld_addr, bool assoc,
struct ieee80211_conn_settings *conn,
bool override)
{ … }
static bool ieee80211_mgd_csa_present(struct ieee80211_sub_if_data *sdata,
const struct cfg80211_bss_ies *ies,
u8 cur_channel, bool ignore_ecsa)
{ … }
static bool ieee80211_mgd_csa_in_process(struct ieee80211_sub_if_data *sdata,
struct cfg80211_bss *bss)
{ … }
int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
struct cfg80211_auth_request *req)
{ … }
static void
ieee80211_setup_assoc_link(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgd_assoc_data *assoc_data,
struct cfg80211_assoc_request *req,
struct ieee80211_conn_settings *conn,
unsigned int link_id)
{ … }
static int
ieee80211_mgd_get_ap_ht_vht_capa(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgd_assoc_data *assoc_data,
int link_id)
{ … }
int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
struct cfg80211_assoc_request *req)
{ … }
int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
struct cfg80211_deauth_request *req)
{ … }
int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
struct cfg80211_disassoc_request *req)
{ … }
void ieee80211_mgd_stop_link(struct ieee80211_link_data *link)
{ … }
void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata)
{ … }
void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
enum nl80211_cqm_rssi_threshold_event rssi_event,
s32 rssi_level,
gfp_t gfp)
{ … }
EXPORT_SYMBOL(…);
void ieee80211_cqm_beacon_loss_notify(struct ieee80211_vif *vif, gfp_t gfp)
{ … }
EXPORT_SYMBOL(…);
static void _ieee80211_enable_rssi_reports(struct ieee80211_sub_if_data *sdata,
int rssi_min_thold,
int rssi_max_thold)
{ … }
void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif,
int rssi_min_thold,
int rssi_max_thold)
{ … }
EXPORT_SYMBOL(…);
void ieee80211_disable_rssi_reports(struct ieee80211_vif *vif)
{ … }
EXPORT_SYMBOL(…);