#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/netdevice.h>
#include <linux/wireless.h>
#include <linux/nl80211.h>
#include <linux/etherdevice.h>
#include <linux/crc32.h>
#include <linux/bitfield.h>
#include <net/arp.h>
#include <net/cfg80211.h>
#include <net/cfg80211-wext.h>
#include <net/iw_handler.h>
#include <kunit/visibility.h>
#include "core.h"
#include "nl80211.h"
#include "wext-compat.h"
#include "rdev-ops.h"
static int bss_entries_limit = …;
module_param(bss_entries_limit, int, 0644);
MODULE_PARM_DESC(…) …;
#define IEEE80211_SCAN_RESULT_EXPIRE …
static void bss_free(struct cfg80211_internal_bss *bss)
{ … }
static inline void bss_ref_get(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *bss)
{ … }
static inline void bss_ref_put(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *bss)
{ … }
static bool __cfg80211_unlink_bss(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *bss)
{ … }
bool cfg80211_is_element_inherited(const struct element *elem,
const struct element *non_inherit_elem)
{ … }
EXPORT_SYMBOL(…);
static size_t cfg80211_copy_elem_with_frags(const struct element *elem,
const u8 *ie, size_t ie_len,
u8 **pos, u8 *buf, size_t buf_len)
{ … }
VISIBLE_IF_CFG80211_KUNIT size_t
cfg80211_gen_new_ie(const u8 *ie, size_t ielen,
const u8 *subie, size_t subie_len,
u8 *new_ie, size_t new_ie_len)
{ … }
EXPORT_SYMBOL_IF_CFG80211_KUNIT(…);
static bool is_bss(struct cfg80211_bss *a, const u8 *bssid,
const u8 *ssid, size_t ssid_len)
{ … }
static int
cfg80211_add_nontrans_list(struct cfg80211_bss *trans_bss,
struct cfg80211_bss *nontrans_bss)
{ … }
static void __cfg80211_bss_expire(struct cfg80211_registered_device *rdev,
unsigned long expire_time)
{ … }
static bool cfg80211_bss_expire_oldest(struct cfg80211_registered_device *rdev)
{ … }
static u8 cfg80211_parse_bss_param(u8 data,
struct cfg80211_colocated_ap *coloc_ap)
{ … }
static int cfg80211_calc_short_ssid(const struct cfg80211_bss_ies *ies,
const struct element **elem, u32 *s_ssid)
{ … }
VISIBLE_IF_CFG80211_KUNIT void
cfg80211_free_coloc_ap_list(struct list_head *coloc_ap_list)
{ … }
EXPORT_SYMBOL_IF_CFG80211_KUNIT(…);
static int cfg80211_parse_ap_info(struct cfg80211_colocated_ap *entry,
const u8 *pos, u8 length,
const struct element *ssid_elem,
u32 s_ssid_tmp)
{ … }
bool cfg80211_iter_rnr(const u8 *elems, size_t elems_len,
enum cfg80211_rnr_iter_ret
(*iter)(void *data, u8 type,
const struct ieee80211_neighbor_ap_info *info,
const u8 *tbtt_info, u8 tbtt_info_len),
void *iter_data)
{ … }
EXPORT_SYMBOL_GPL(…);
struct colocated_ap_data { … };
static enum cfg80211_rnr_iter_ret
cfg80211_parse_colocated_ap_iter(void *_data, u8 type,
const struct ieee80211_neighbor_ap_info *info,
const u8 *tbtt_info, u8 tbtt_info_len)
{ … }
VISIBLE_IF_CFG80211_KUNIT int
cfg80211_parse_colocated_ap(const struct cfg80211_bss_ies *ies,
struct list_head *list)
{ … }
EXPORT_SYMBOL_IF_CFG80211_KUNIT(…);
static void cfg80211_scan_req_add_chan(struct cfg80211_scan_request *request,
struct ieee80211_channel *chan,
bool add_to_6ghz)
{ … }
static bool cfg80211_find_ssid_match(struct cfg80211_colocated_ap *ap,
struct cfg80211_scan_request *request)
{ … }
static int cfg80211_scan_6ghz(struct cfg80211_registered_device *rdev)
{ … }
int cfg80211_scan(struct cfg80211_registered_device *rdev)
{ … }
void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev,
bool send_message)
{ … }
void __cfg80211_scan_done(struct wiphy *wiphy, struct wiphy_work *wk)
{ … }
void cfg80211_scan_done(struct cfg80211_scan_request *request,
struct cfg80211_scan_info *info)
{ … }
EXPORT_SYMBOL(…);
void cfg80211_add_sched_scan_req(struct cfg80211_registered_device *rdev,
struct cfg80211_sched_scan_request *req)
{ … }
static void cfg80211_del_sched_scan_req(struct cfg80211_registered_device *rdev,
struct cfg80211_sched_scan_request *req)
{ … }
static struct cfg80211_sched_scan_request *
cfg80211_find_sched_scan_req(struct cfg80211_registered_device *rdev, u64 reqid)
{ … }
int cfg80211_sched_scan_req_possible(struct cfg80211_registered_device *rdev,
bool want_multi)
{ … }
void cfg80211_sched_scan_results_wk(struct work_struct *work)
{ … }
void cfg80211_sched_scan_results(struct wiphy *wiphy, u64 reqid)
{ … }
EXPORT_SYMBOL(…);
void cfg80211_sched_scan_stopped_locked(struct wiphy *wiphy, u64 reqid)
{ … }
EXPORT_SYMBOL(…);
void cfg80211_sched_scan_stopped(struct wiphy *wiphy, u64 reqid)
{ … }
EXPORT_SYMBOL(…);
int cfg80211_stop_sched_scan_req(struct cfg80211_registered_device *rdev,
struct cfg80211_sched_scan_request *req,
bool driver_initiated)
{ … }
int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
u64 reqid, bool driver_initiated)
{ … }
void cfg80211_bss_age(struct cfg80211_registered_device *rdev,
unsigned long age_secs)
{ … }
void cfg80211_bss_expire(struct cfg80211_registered_device *rdev)
{ … }
void cfg80211_bss_flush(struct wiphy *wiphy)
{ … }
EXPORT_SYMBOL(…);
const struct element *
cfg80211_find_elem_match(u8 eid, const u8 *ies, unsigned int len,
const u8 *match, unsigned int match_len,
unsigned int match_offset)
{ … }
EXPORT_SYMBOL(…);
const struct element *cfg80211_find_vendor_elem(unsigned int oui, int oui_type,
const u8 *ies,
unsigned int len)
{ … }
EXPORT_SYMBOL(…);
enum bss_compare_mode { … };
static int cmp_bss(struct cfg80211_bss *a,
struct cfg80211_bss *b,
enum bss_compare_mode mode)
{ … }
static bool cfg80211_bss_type_match(u16 capability,
enum nl80211_band band,
enum ieee80211_bss_type bss_type)
{ … }
struct cfg80211_bss *__cfg80211_get_bss(struct wiphy *wiphy,
struct ieee80211_channel *channel,
const u8 *bssid,
const u8 *ssid, size_t ssid_len,
enum ieee80211_bss_type bss_type,
enum ieee80211_privacy privacy,
u32 use_for)
{ … }
EXPORT_SYMBOL(…);
static bool rb_insert_bss(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *bss)
{ … }
static struct cfg80211_internal_bss *
rb_find_bss(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *res,
enum bss_compare_mode mode)
{ … }
static void cfg80211_insert_bss(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *bss)
{ … }
static void cfg80211_rehash_bss(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *bss)
{ … }
static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *new)
{ … }
static void cfg80211_update_hidden_bsses(struct cfg80211_internal_bss *known,
const struct cfg80211_bss_ies *new_ies,
const struct cfg80211_bss_ies *old_ies)
{ … }
static void cfg80211_check_stuck_ecsa(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *known,
const struct cfg80211_bss_ies *old)
{ … }
static bool
cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *known,
struct cfg80211_internal_bss *new,
bool signal_valid)
{ … }
static struct cfg80211_internal_bss *
__cfg80211_bss_update(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *tmp,
bool signal_valid, unsigned long ts)
{ … }
struct cfg80211_internal_bss *
cfg80211_bss_update(struct cfg80211_registered_device *rdev,
struct cfg80211_internal_bss *tmp,
bool signal_valid, unsigned long ts)
{ … }
int cfg80211_get_ies_channel_number(const u8 *ie, size_t ielen,
enum nl80211_band band)
{ … }
EXPORT_SYMBOL(…);
static struct ieee80211_channel *
cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,
struct ieee80211_channel *channel)
{ … }
struct cfg80211_inform_single_bss_data { … };
enum ieee80211_ap_reg_power
cfg80211_get_6ghz_power_type(const u8 *elems, size_t elems_len)
{ … }
static bool cfg80211_6ghz_power_type_valid(const u8 *elems, size_t elems_len,
const u32 flags)
{ … }
static struct cfg80211_bss *
cfg80211_inform_single_bss_data(struct wiphy *wiphy,
struct cfg80211_inform_single_bss_data *data,
gfp_t gfp)
{ … }
static const struct element
*cfg80211_get_profile_continuation(const u8 *ie, size_t ielen,
const struct element *mbssid_elem,
const struct element *sub_elem)
{ … }
size_t cfg80211_merge_profile(const u8 *ie, size_t ielen,
const struct element *mbssid_elem,
const struct element *sub_elem,
u8 *merged_ie, size_t max_copy_len)
{ … }
EXPORT_SYMBOL(…);
static void
cfg80211_parse_mbssid_data(struct wiphy *wiphy,
struct cfg80211_inform_single_bss_data *tx_data,
struct cfg80211_bss *source_bss,
gfp_t gfp)
{ … }
ssize_t cfg80211_defragment_element(const struct element *elem, const u8 *ies,
size_t ieslen, u8 *data, size_t data_len,
u8 frag_id)
{ … }
EXPORT_SYMBOL(…);
struct cfg80211_mle { … };
static struct cfg80211_mle *
cfg80211_defrag_mle(const struct element *mle, const u8 *ie, size_t ielen,
gfp_t gfp)
{ … }
struct tbtt_info_iter_data { … };
static enum cfg80211_rnr_iter_ret
cfg802121_mld_ap_rnr_iter(void *_data, u8 type,
const struct ieee80211_neighbor_ap_info *info,
const u8 *tbtt_info, u8 tbtt_info_len)
{ … }
static u8
cfg80211_rnr_info_for_mld_ap(const u8 *ie, size_t ielen, u8 mld_id, u8 link_id,
const struct ieee80211_neighbor_ap_info **ap_info,
u8 *param_ch_count, bool *non_tx)
{ … }
static struct element *
cfg80211_gen_reporter_rnr(struct cfg80211_bss *source_bss, bool is_mbssid,
bool same_mld, u8 link_id, u8 bss_change_count,
gfp_t gfp)
{ … }
static void
cfg80211_parse_ml_elem_sta_data(struct wiphy *wiphy,
struct cfg80211_inform_single_bss_data *tx_data,
struct cfg80211_bss *source_bss,
const struct element *elem,
gfp_t gfp)
{ … }
static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy,
struct cfg80211_inform_single_bss_data *tx_data,
struct cfg80211_bss *source_bss,
gfp_t gfp)
{ … }
struct cfg80211_bss *
cfg80211_inform_bss_data(struct wiphy *wiphy,
struct cfg80211_inform_bss *data,
enum cfg80211_bss_frame_type ftype,
const u8 *bssid, u64 tsf, u16 capability,
u16 beacon_interval, const u8 *ie, size_t ielen,
gfp_t gfp)
{ … }
EXPORT_SYMBOL(…);
struct cfg80211_bss *
cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
struct cfg80211_inform_bss *data,
struct ieee80211_mgmt *mgmt, size_t len,
gfp_t gfp)
{ … }
EXPORT_SYMBOL(…);
void cfg80211_ref_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
{ … }
EXPORT_SYMBOL(…);
void cfg80211_put_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
{ … }
EXPORT_SYMBOL(…);
void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
{ … }
EXPORT_SYMBOL(…);
void cfg80211_bss_iter(struct wiphy *wiphy,
struct cfg80211_chan_def *chandef,
void (*iter)(struct wiphy *wiphy,
struct cfg80211_bss *bss,
void *data),
void *iter_data)
{ … }
EXPORT_SYMBOL(…);
void cfg80211_update_assoc_bss_entry(struct wireless_dev *wdev,
unsigned int link_id,
struct ieee80211_channel *chan)
{ … }
#ifdef CONFIG_CFG80211_WEXT
static struct cfg80211_registered_device *
cfg80211_get_dev_from_ifindex(struct net *net, int ifindex)
{ … }
int cfg80211_wext_siwscan(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{ … }
EXPORT_WEXT_HANDLER(…);
static char *ieee80211_scan_add_ies(struct iw_request_info *info,
const struct cfg80211_bss_ies *ies,
char *current_ev, char *end_buf)
{ … }
static char *
ieee80211_bss(struct wiphy *wiphy, struct iw_request_info *info,
struct cfg80211_internal_bss *bss, char *current_ev,
char *end_buf)
{ … }
static int ieee80211_scan_results(struct cfg80211_registered_device *rdev,
struct iw_request_info *info,
char *buf, size_t len)
{ … }
int cfg80211_wext_giwscan(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{ … }
EXPORT_WEXT_HANDLER(…);
#endif