Linux Audio

Check our new training course

Loading...
v6.13.7
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * cfg80211 scan result handling
   4 *
   5 * Copyright 2008 Johannes Berg <johannes@sipsolutions.net>
   6 * Copyright 2013-2014  Intel Mobile Communications GmbH
   7 * Copyright 2016	Intel Deutschland GmbH
   8 * Copyright (C) 2018-2024 Intel Corporation
   9 */
  10#include <linux/kernel.h>
  11#include <linux/slab.h>
  12#include <linux/module.h>
  13#include <linux/netdevice.h>
  14#include <linux/wireless.h>
  15#include <linux/nl80211.h>
  16#include <linux/etherdevice.h>
  17#include <linux/crc32.h>
  18#include <linux/bitfield.h>
  19#include <net/arp.h>
  20#include <net/cfg80211.h>
  21#include <net/cfg80211-wext.h>
  22#include <net/iw_handler.h>
  23#include <kunit/visibility.h>
  24#include "core.h"
  25#include "nl80211.h"
  26#include "wext-compat.h"
  27#include "rdev-ops.h"
  28
  29/**
  30 * DOC: BSS tree/list structure
  31 *
  32 * At the top level, the BSS list is kept in both a list in each
  33 * registered device (@bss_list) as well as an RB-tree for faster
  34 * lookup. In the RB-tree, entries can be looked up using their
  35 * channel, MESHID, MESHCONF (for MBSSes) or channel, BSSID, SSID
  36 * for other BSSes.
  37 *
  38 * Due to the possibility of hidden SSIDs, there's a second level
  39 * structure, the "hidden_list" and "hidden_beacon_bss" pointer.
  40 * The hidden_list connects all BSSes belonging to a single AP
  41 * that has a hidden SSID, and connects beacon and probe response
  42 * entries. For a probe response entry for a hidden SSID, the
  43 * hidden_beacon_bss pointer points to the BSS struct holding the
  44 * beacon's information.
  45 *
  46 * Reference counting is done for all these references except for
  47 * the hidden_list, so that a beacon BSS struct that is otherwise
  48 * not referenced has one reference for being on the bss_list and
  49 * one for each probe response entry that points to it using the
  50 * hidden_beacon_bss pointer. When a BSS struct that has such a
  51 * pointer is get/put, the refcount update is also propagated to
  52 * the referenced struct, this ensure that it cannot get removed
  53 * while somebody is using the probe response version.
  54 *
  55 * Note that the hidden_beacon_bss pointer never changes, due to
  56 * the reference counting. Therefore, no locking is needed for
  57 * it.
  58 *
  59 * Also note that the hidden_beacon_bss pointer is only relevant
  60 * if the driver uses something other than the IEs, e.g. private
  61 * data stored in the BSS struct, since the beacon IEs are
  62 * also linked into the probe response struct.
  63 */
  64
  65/*
  66 * Limit the number of BSS entries stored in mac80211. Each one is
  67 * a bit over 4k at most, so this limits to roughly 4-5M of memory.
  68 * If somebody wants to really attack this though, they'd likely
  69 * use small beacons, and only one type of frame, limiting each of
  70 * the entries to a much smaller size (in order to generate more
  71 * entries in total, so overhead is bigger.)
  72 */
  73static int bss_entries_limit = 1000;
  74module_param(bss_entries_limit, int, 0644);
  75MODULE_PARM_DESC(bss_entries_limit,
  76                 "limit to number of scan BSS entries (per wiphy, default 1000)");
  77
  78#define IEEE80211_SCAN_RESULT_EXPIRE	(30 * HZ)
  79
  80static void bss_free(struct cfg80211_internal_bss *bss)
  81{
  82	struct cfg80211_bss_ies *ies;
  83
  84	if (WARN_ON(atomic_read(&bss->hold)))
  85		return;
  86
  87	ies = (void *)rcu_access_pointer(bss->pub.beacon_ies);
  88	if (ies && !bss->pub.hidden_beacon_bss)
  89		kfree_rcu(ies, rcu_head);
  90	ies = (void *)rcu_access_pointer(bss->pub.proberesp_ies);
  91	if (ies)
  92		kfree_rcu(ies, rcu_head);
  93
  94	/*
  95	 * This happens when the module is removed, it doesn't
  96	 * really matter any more save for completeness
  97	 */
  98	if (!list_empty(&bss->hidden_list))
  99		list_del(&bss->hidden_list);
 100
 101	kfree(bss);
 102}
 103
 104static inline void bss_ref_get(struct cfg80211_registered_device *rdev,
 105			       struct cfg80211_internal_bss *bss)
 106{
 107	lockdep_assert_held(&rdev->bss_lock);
 108
 109	bss->refcount++;
 110
 111	if (bss->pub.hidden_beacon_bss)
 112		bss_from_pub(bss->pub.hidden_beacon_bss)->refcount++;
 113
 114	if (bss->pub.transmitted_bss)
 115		bss_from_pub(bss->pub.transmitted_bss)->refcount++;
 116}
 117
 118static inline void bss_ref_put(struct cfg80211_registered_device *rdev,
 119			       struct cfg80211_internal_bss *bss)
 120{
 121	lockdep_assert_held(&rdev->bss_lock);
 122
 123	if (bss->pub.hidden_beacon_bss) {
 124		struct cfg80211_internal_bss *hbss;
 125
 126		hbss = bss_from_pub(bss->pub.hidden_beacon_bss);
 
 127		hbss->refcount--;
 128		if (hbss->refcount == 0)
 129			bss_free(hbss);
 130	}
 131
 132	if (bss->pub.transmitted_bss) {
 133		struct cfg80211_internal_bss *tbss;
 134
 135		tbss = bss_from_pub(bss->pub.transmitted_bss);
 136		tbss->refcount--;
 137		if (tbss->refcount == 0)
 138			bss_free(tbss);
 139	}
 140
 141	bss->refcount--;
 142	if (bss->refcount == 0)
 143		bss_free(bss);
 144}
 145
 146static bool __cfg80211_unlink_bss(struct cfg80211_registered_device *rdev,
 147				  struct cfg80211_internal_bss *bss)
 148{
 149	lockdep_assert_held(&rdev->bss_lock);
 150
 151	if (!list_empty(&bss->hidden_list)) {
 152		/*
 153		 * don't remove the beacon entry if it has
 154		 * probe responses associated with it
 155		 */
 156		if (!bss->pub.hidden_beacon_bss)
 157			return false;
 158		/*
 159		 * if it's a probe response entry break its
 160		 * link to the other entries in the group
 161		 */
 162		list_del_init(&bss->hidden_list);
 163	}
 164
 165	list_del_init(&bss->list);
 166	list_del_init(&bss->pub.nontrans_list);
 167	rb_erase(&bss->rbn, &rdev->bss_tree);
 168	rdev->bss_entries--;
 169	WARN_ONCE((rdev->bss_entries == 0) ^ list_empty(&rdev->bss_list),
 170		  "rdev bss entries[%d]/list[empty:%d] corruption\n",
 171		  rdev->bss_entries, list_empty(&rdev->bss_list));
 172	bss_ref_put(rdev, bss);
 173	return true;
 174}
 175
 176bool cfg80211_is_element_inherited(const struct element *elem,
 177				   const struct element *non_inherit_elem)
 178{
 179	u8 id_len, ext_id_len, i, loop_len, id;
 180	const u8 *list;
 181
 182	if (elem->id == WLAN_EID_MULTIPLE_BSSID)
 183		return false;
 184
 185	if (elem->id == WLAN_EID_EXTENSION && elem->datalen > 1 &&
 186	    elem->data[0] == WLAN_EID_EXT_EHT_MULTI_LINK)
 187		return false;
 188
 189	if (!non_inherit_elem || non_inherit_elem->datalen < 2)
 190		return true;
 191
 192	/*
 193	 * non inheritance element format is:
 194	 * ext ID (56) | IDs list len | list | extension IDs list len | list
 195	 * Both lists are optional. Both lengths are mandatory.
 196	 * This means valid length is:
 197	 * elem_len = 1 (extension ID) + 2 (list len fields) + list lengths
 198	 */
 199	id_len = non_inherit_elem->data[1];
 200	if (non_inherit_elem->datalen < 3 + id_len)
 201		return true;
 202
 203	ext_id_len = non_inherit_elem->data[2 + id_len];
 204	if (non_inherit_elem->datalen < 3 + id_len + ext_id_len)
 205		return true;
 206
 207	if (elem->id == WLAN_EID_EXTENSION) {
 208		if (!ext_id_len)
 209			return true;
 210		loop_len = ext_id_len;
 211		list = &non_inherit_elem->data[3 + id_len];
 212		id = elem->data[0];
 213	} else {
 214		if (!id_len)
 215			return true;
 216		loop_len = id_len;
 217		list = &non_inherit_elem->data[2];
 218		id = elem->id;
 219	}
 220
 221	for (i = 0; i < loop_len; i++) {
 222		if (list[i] == id)
 223			return false;
 224	}
 225
 226	return true;
 227}
 228EXPORT_SYMBOL(cfg80211_is_element_inherited);
 229
 230static size_t cfg80211_copy_elem_with_frags(const struct element *elem,
 231					    const u8 *ie, size_t ie_len,
 232					    u8 **pos, u8 *buf, size_t buf_len)
 233{
 234	if (WARN_ON((u8 *)elem < ie || elem->data > ie + ie_len ||
 235		    elem->data + elem->datalen > ie + ie_len))
 236		return 0;
 237
 238	if (elem->datalen + 2 > buf + buf_len - *pos)
 239		return 0;
 240
 241	memcpy(*pos, elem, elem->datalen + 2);
 242	*pos += elem->datalen + 2;
 243
 244	/* Finish if it is not fragmented  */
 245	if (elem->datalen != 255)
 246		return *pos - buf;
 247
 248	ie_len = ie + ie_len - elem->data - elem->datalen;
 249	ie = (const u8 *)elem->data + elem->datalen;
 250
 251	for_each_element(elem, ie, ie_len) {
 252		if (elem->id != WLAN_EID_FRAGMENT)
 253			break;
 254
 255		if (elem->datalen + 2 > buf + buf_len - *pos)
 256			return 0;
 257
 258		memcpy(*pos, elem, elem->datalen + 2);
 259		*pos += elem->datalen + 2;
 260
 261		if (elem->datalen != 255)
 262			break;
 263	}
 264
 265	return *pos - buf;
 266}
 267
 268VISIBLE_IF_CFG80211_KUNIT size_t
 269cfg80211_gen_new_ie(const u8 *ie, size_t ielen,
 270		    const u8 *subie, size_t subie_len,
 271		    u8 *new_ie, size_t new_ie_len)
 272{
 273	const struct element *non_inherit_elem, *parent, *sub;
 274	u8 *pos = new_ie;
 275	u8 id, ext_id;
 276	unsigned int match_len;
 277
 278	non_inherit_elem = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
 279						  subie, subie_len);
 280
 281	/* We copy the elements one by one from the parent to the generated
 282	 * elements.
 283	 * If they are not inherited (included in subie or in the non
 284	 * inheritance element), then we copy all occurrences the first time
 285	 * we see this element type.
 286	 */
 287	for_each_element(parent, ie, ielen) {
 288		if (parent->id == WLAN_EID_FRAGMENT)
 289			continue;
 290
 291		if (parent->id == WLAN_EID_EXTENSION) {
 292			if (parent->datalen < 1)
 293				continue;
 294
 295			id = WLAN_EID_EXTENSION;
 296			ext_id = parent->data[0];
 297			match_len = 1;
 298		} else {
 299			id = parent->id;
 300			match_len = 0;
 301		}
 302
 303		/* Find first occurrence in subie */
 304		sub = cfg80211_find_elem_match(id, subie, subie_len,
 305					       &ext_id, match_len, 0);
 306
 307		/* Copy from parent if not in subie and inherited */
 308		if (!sub &&
 309		    cfg80211_is_element_inherited(parent, non_inherit_elem)) {
 310			if (!cfg80211_copy_elem_with_frags(parent,
 311							   ie, ielen,
 312							   &pos, new_ie,
 313							   new_ie_len))
 314				return 0;
 315
 316			continue;
 317		}
 318
 319		/* Already copied if an earlier element had the same type */
 320		if (cfg80211_find_elem_match(id, ie, (u8 *)parent - ie,
 321					     &ext_id, match_len, 0))
 322			continue;
 323
 324		/* Not inheriting, copy all similar elements from subie */
 325		while (sub) {
 326			if (!cfg80211_copy_elem_with_frags(sub,
 327							   subie, subie_len,
 328							   &pos, new_ie,
 329							   new_ie_len))
 330				return 0;
 331
 332			sub = cfg80211_find_elem_match(id,
 333						       sub->data + sub->datalen,
 334						       subie_len + subie -
 335						       (sub->data +
 336							sub->datalen),
 337						       &ext_id, match_len, 0);
 338		}
 339	}
 340
 341	/* The above misses elements that are included in subie but not in the
 342	 * parent, so do a pass over subie and append those.
 343	 * Skip the non-tx BSSID caps and non-inheritance element.
 344	 */
 345	for_each_element(sub, subie, subie_len) {
 346		if (sub->id == WLAN_EID_NON_TX_BSSID_CAP)
 347			continue;
 348
 349		if (sub->id == WLAN_EID_FRAGMENT)
 350			continue;
 351
 352		if (sub->id == WLAN_EID_EXTENSION) {
 353			if (sub->datalen < 1)
 354				continue;
 355
 356			id = WLAN_EID_EXTENSION;
 357			ext_id = sub->data[0];
 358			match_len = 1;
 359
 360			if (ext_id == WLAN_EID_EXT_NON_INHERITANCE)
 361				continue;
 362		} else {
 363			id = sub->id;
 364			match_len = 0;
 365		}
 366
 367		/* Processed if one was included in the parent */
 368		if (cfg80211_find_elem_match(id, ie, ielen,
 369					     &ext_id, match_len, 0))
 370			continue;
 371
 372		if (!cfg80211_copy_elem_with_frags(sub, subie, subie_len,
 373						   &pos, new_ie, new_ie_len))
 374			return 0;
 375	}
 376
 377	return pos - new_ie;
 378}
 379EXPORT_SYMBOL_IF_CFG80211_KUNIT(cfg80211_gen_new_ie);
 380
 381static bool is_bss(struct cfg80211_bss *a, const u8 *bssid,
 382		   const u8 *ssid, size_t ssid_len)
 383{
 384	const struct cfg80211_bss_ies *ies;
 385	const struct element *ssid_elem;
 386
 387	if (bssid && !ether_addr_equal(a->bssid, bssid))
 388		return false;
 389
 390	if (!ssid)
 391		return true;
 392
 393	ies = rcu_access_pointer(a->ies);
 394	if (!ies)
 395		return false;
 396	ssid_elem = cfg80211_find_elem(WLAN_EID_SSID, ies->data, ies->len);
 397	if (!ssid_elem)
 398		return false;
 399	if (ssid_elem->datalen != ssid_len)
 400		return false;
 401	return memcmp(ssid_elem->data, ssid, ssid_len) == 0;
 402}
 403
 404static int
 405cfg80211_add_nontrans_list(struct cfg80211_bss *trans_bss,
 406			   struct cfg80211_bss *nontrans_bss)
 407{
 408	const struct element *ssid_elem;
 409	struct cfg80211_bss *bss = NULL;
 410
 411	rcu_read_lock();
 412	ssid_elem = ieee80211_bss_get_elem(nontrans_bss, WLAN_EID_SSID);
 413	if (!ssid_elem) {
 414		rcu_read_unlock();
 415		return -EINVAL;
 416	}
 417
 418	/* check if nontrans_bss is in the list */
 419	list_for_each_entry(bss, &trans_bss->nontrans_list, nontrans_list) {
 420		if (is_bss(bss, nontrans_bss->bssid, ssid_elem->data,
 421			   ssid_elem->datalen)) {
 422			rcu_read_unlock();
 423			return 0;
 424		}
 425	}
 426
 427	rcu_read_unlock();
 428
 429	/*
 430	 * This is a bit weird - it's not on the list, but already on another
 431	 * one! The only way that could happen is if there's some BSSID/SSID
 432	 * shared by multiple APs in their multi-BSSID profiles, potentially
 433	 * with hidden SSID mixed in ... ignore it.
 434	 */
 435	if (!list_empty(&nontrans_bss->nontrans_list))
 436		return -EINVAL;
 437
 438	/* add to the list */
 439	list_add_tail(&nontrans_bss->nontrans_list, &trans_bss->nontrans_list);
 440	return 0;
 441}
 442
 443static void __cfg80211_bss_expire(struct cfg80211_registered_device *rdev,
 444				  unsigned long expire_time)
 445{
 446	struct cfg80211_internal_bss *bss, *tmp;
 447	bool expired = false;
 448
 449	lockdep_assert_held(&rdev->bss_lock);
 450
 451	list_for_each_entry_safe(bss, tmp, &rdev->bss_list, list) {
 452		if (atomic_read(&bss->hold))
 453			continue;
 454		if (!time_after(expire_time, bss->ts))
 455			continue;
 456
 457		if (__cfg80211_unlink_bss(rdev, bss))
 458			expired = true;
 459	}
 460
 461	if (expired)
 462		rdev->bss_generation++;
 463}
 464
 465static bool cfg80211_bss_expire_oldest(struct cfg80211_registered_device *rdev)
 466{
 467	struct cfg80211_internal_bss *bss, *oldest = NULL;
 468	bool ret;
 469
 470	lockdep_assert_held(&rdev->bss_lock);
 471
 472	list_for_each_entry(bss, &rdev->bss_list, list) {
 473		if (atomic_read(&bss->hold))
 474			continue;
 475
 476		if (!list_empty(&bss->hidden_list) &&
 477		    !bss->pub.hidden_beacon_bss)
 478			continue;
 479
 480		if (oldest && time_before(oldest->ts, bss->ts))
 481			continue;
 482		oldest = bss;
 483	}
 484
 485	if (WARN_ON(!oldest))
 486		return false;
 487
 488	/*
 489	 * The callers make sure to increase rdev->bss_generation if anything
 490	 * gets removed (and a new entry added), so there's no need to also do
 491	 * it here.
 492	 */
 493
 494	ret = __cfg80211_unlink_bss(rdev, oldest);
 495	WARN_ON(!ret);
 496	return ret;
 497}
 498
 499static u8 cfg80211_parse_bss_param(u8 data,
 500				   struct cfg80211_colocated_ap *coloc_ap)
 501{
 502	coloc_ap->oct_recommended =
 503		u8_get_bits(data, IEEE80211_RNR_TBTT_PARAMS_OCT_RECOMMENDED);
 504	coloc_ap->same_ssid =
 505		u8_get_bits(data, IEEE80211_RNR_TBTT_PARAMS_SAME_SSID);
 506	coloc_ap->multi_bss =
 507		u8_get_bits(data, IEEE80211_RNR_TBTT_PARAMS_MULTI_BSSID);
 508	coloc_ap->transmitted_bssid =
 509		u8_get_bits(data, IEEE80211_RNR_TBTT_PARAMS_TRANSMITTED_BSSID);
 510	coloc_ap->unsolicited_probe =
 511		u8_get_bits(data, IEEE80211_RNR_TBTT_PARAMS_PROBE_ACTIVE);
 512	coloc_ap->colocated_ess =
 513		u8_get_bits(data, IEEE80211_RNR_TBTT_PARAMS_COLOC_ESS);
 514
 515	return u8_get_bits(data, IEEE80211_RNR_TBTT_PARAMS_COLOC_AP);
 516}
 517
 518static int cfg80211_calc_short_ssid(const struct cfg80211_bss_ies *ies,
 519				    const struct element **elem, u32 *s_ssid)
 520{
 521
 522	*elem = cfg80211_find_elem(WLAN_EID_SSID, ies->data, ies->len);
 523	if (!*elem || (*elem)->datalen > IEEE80211_MAX_SSID_LEN)
 524		return -EINVAL;
 525
 526	*s_ssid = ~crc32_le(~0, (*elem)->data, (*elem)->datalen);
 527	return 0;
 528}
 529
 530VISIBLE_IF_CFG80211_KUNIT void
 531cfg80211_free_coloc_ap_list(struct list_head *coloc_ap_list)
 532{
 533	struct cfg80211_colocated_ap *ap, *tmp_ap;
 534
 535	list_for_each_entry_safe(ap, tmp_ap, coloc_ap_list, list) {
 536		list_del(&ap->list);
 537		kfree(ap);
 538	}
 539}
 540EXPORT_SYMBOL_IF_CFG80211_KUNIT(cfg80211_free_coloc_ap_list);
 541
 542static int cfg80211_parse_ap_info(struct cfg80211_colocated_ap *entry,
 543				  const u8 *pos, u8 length,
 544				  const struct element *ssid_elem,
 545				  u32 s_ssid_tmp)
 546{
 547	u8 bss_params;
 548
 549	entry->psd_20 = IEEE80211_RNR_TBTT_PARAMS_PSD_RESERVED;
 550
 551	/* The length is already verified by the caller to contain bss_params */
 552	if (length > sizeof(struct ieee80211_tbtt_info_7_8_9)) {
 553		struct ieee80211_tbtt_info_ge_11 *tbtt_info = (void *)pos;
 554
 555		memcpy(entry->bssid, tbtt_info->bssid, ETH_ALEN);
 556		entry->short_ssid = le32_to_cpu(tbtt_info->short_ssid);
 557		entry->short_ssid_valid = true;
 558
 559		bss_params = tbtt_info->bss_params;
 560
 561		/* Ignore disabled links */
 562		if (length >= offsetofend(typeof(*tbtt_info), mld_params)) {
 563			if (le16_get_bits(tbtt_info->mld_params.params,
 564					  IEEE80211_RNR_MLD_PARAMS_DISABLED_LINK))
 565				return -EINVAL;
 566		}
 567
 568		if (length >= offsetofend(struct ieee80211_tbtt_info_ge_11,
 569					  psd_20))
 570			entry->psd_20 = tbtt_info->psd_20;
 571	} else {
 572		struct ieee80211_tbtt_info_7_8_9 *tbtt_info = (void *)pos;
 573
 574		memcpy(entry->bssid, tbtt_info->bssid, ETH_ALEN);
 575
 576		bss_params = tbtt_info->bss_params;
 577
 578		if (length == offsetofend(struct ieee80211_tbtt_info_7_8_9,
 579					  psd_20))
 580			entry->psd_20 = tbtt_info->psd_20;
 581	}
 582
 583	/* ignore entries with invalid BSSID */
 584	if (!is_valid_ether_addr(entry->bssid))
 585		return -EINVAL;
 586
 587	/* skip non colocated APs */
 588	if (!cfg80211_parse_bss_param(bss_params, entry))
 589		return -EINVAL;
 590
 591	/* no information about the short ssid. Consider the entry valid
 592	 * for now. It would later be dropped in case there are explicit
 593	 * SSIDs that need to be matched
 594	 */
 595	if (!entry->same_ssid && !entry->short_ssid_valid)
 596		return 0;
 597
 598	if (entry->same_ssid) {
 599		entry->short_ssid = s_ssid_tmp;
 600		entry->short_ssid_valid = true;
 601
 602		/*
 603		 * This is safe because we validate datalen in
 604		 * cfg80211_parse_colocated_ap(), before calling this
 605		 * function.
 606		 */
 607		memcpy(&entry->ssid, &ssid_elem->data, ssid_elem->datalen);
 608		entry->ssid_len = ssid_elem->datalen;
 609	}
 610
 611	return 0;
 612}
 613
 614bool cfg80211_iter_rnr(const u8 *elems, size_t elems_len,
 615		       enum cfg80211_rnr_iter_ret
 616		       (*iter)(void *data, u8 type,
 617			       const struct ieee80211_neighbor_ap_info *info,
 618			       const u8 *tbtt_info, u8 tbtt_info_len),
 619		       void *iter_data)
 620{
 621	const struct element *rnr;
 622	const u8 *pos, *end;
 623
 624	for_each_element_id(rnr, WLAN_EID_REDUCED_NEIGHBOR_REPORT,
 625			    elems, elems_len) {
 626		const struct ieee80211_neighbor_ap_info *info;
 627
 628		pos = rnr->data;
 629		end = rnr->data + rnr->datalen;
 630
 631		/* RNR IE may contain more than one NEIGHBOR_AP_INFO */
 632		while (sizeof(*info) <= end - pos) {
 633			u8 length, i, count;
 634			u8 type;
 635
 636			info = (void *)pos;
 637			count = u8_get_bits(info->tbtt_info_hdr,
 638					    IEEE80211_AP_INFO_TBTT_HDR_COUNT) +
 639				1;
 640			length = info->tbtt_info_len;
 641
 642			pos += sizeof(*info);
 643
 644			if (count * length > end - pos)
 645				return false;
 646
 647			type = u8_get_bits(info->tbtt_info_hdr,
 648					   IEEE80211_AP_INFO_TBTT_HDR_TYPE);
 649
 650			for (i = 0; i < count; i++) {
 651				switch (iter(iter_data, type, info,
 652					     pos, length)) {
 653				case RNR_ITER_CONTINUE:
 654					break;
 655				case RNR_ITER_BREAK:
 656					return true;
 657				case RNR_ITER_ERROR:
 658					return false;
 659				}
 660
 661				pos += length;
 662			}
 663		}
 664
 665		if (pos != end)
 666			return false;
 667	}
 668
 669	return true;
 670}
 671EXPORT_SYMBOL_GPL(cfg80211_iter_rnr);
 672
 673struct colocated_ap_data {
 674	const struct element *ssid_elem;
 675	struct list_head ap_list;
 676	u32 s_ssid_tmp;
 677	int n_coloc;
 678};
 679
 680static enum cfg80211_rnr_iter_ret
 681cfg80211_parse_colocated_ap_iter(void *_data, u8 type,
 682				 const struct ieee80211_neighbor_ap_info *info,
 683				 const u8 *tbtt_info, u8 tbtt_info_len)
 684{
 685	struct colocated_ap_data *data = _data;
 686	struct cfg80211_colocated_ap *entry;
 687	enum nl80211_band band;
 688
 689	if (type != IEEE80211_TBTT_INFO_TYPE_TBTT)
 690		return RNR_ITER_CONTINUE;
 691
 692	if (!ieee80211_operating_class_to_band(info->op_class, &band))
 693		return RNR_ITER_CONTINUE;
 694
 695	/* TBTT info must include bss param + BSSID + (short SSID or
 696	 * same_ssid bit to be set). Ignore other options, and move to
 697	 * the next AP info
 698	 */
 699	if (band != NL80211_BAND_6GHZ ||
 700	    !(tbtt_info_len == offsetofend(struct ieee80211_tbtt_info_7_8_9,
 701					   bss_params) ||
 702	      tbtt_info_len == sizeof(struct ieee80211_tbtt_info_7_8_9) ||
 703	      tbtt_info_len >= offsetofend(struct ieee80211_tbtt_info_ge_11,
 704					   bss_params)))
 705		return RNR_ITER_CONTINUE;
 706
 707	entry = kzalloc(sizeof(*entry) + IEEE80211_MAX_SSID_LEN, GFP_ATOMIC);
 708	if (!entry)
 709		return RNR_ITER_ERROR;
 710
 711	entry->center_freq =
 712		ieee80211_channel_to_frequency(info->channel, band);
 713
 714	if (!cfg80211_parse_ap_info(entry, tbtt_info, tbtt_info_len,
 715				    data->ssid_elem, data->s_ssid_tmp)) {
 716		data->n_coloc++;
 717		list_add_tail(&entry->list, &data->ap_list);
 718	} else {
 719		kfree(entry);
 720	}
 721
 722	return RNR_ITER_CONTINUE;
 723}
 724
 725VISIBLE_IF_CFG80211_KUNIT int
 726cfg80211_parse_colocated_ap(const struct cfg80211_bss_ies *ies,
 727			    struct list_head *list)
 728{
 729	struct colocated_ap_data data = {};
 730	int ret;
 731
 732	INIT_LIST_HEAD(&data.ap_list);
 733
 734	ret = cfg80211_calc_short_ssid(ies, &data.ssid_elem, &data.s_ssid_tmp);
 735	if (ret)
 736		return 0;
 737
 738	if (!cfg80211_iter_rnr(ies->data, ies->len,
 739			       cfg80211_parse_colocated_ap_iter, &data)) {
 740		cfg80211_free_coloc_ap_list(&data.ap_list);
 741		return 0;
 742	}
 743
 744	list_splice_tail(&data.ap_list, list);
 745	return data.n_coloc;
 746}
 747EXPORT_SYMBOL_IF_CFG80211_KUNIT(cfg80211_parse_colocated_ap);
 748
 749static  void cfg80211_scan_req_add_chan(struct cfg80211_scan_request *request,
 750					struct ieee80211_channel *chan,
 751					bool add_to_6ghz)
 752{
 753	int i;
 754	u32 n_channels = request->n_channels;
 755	struct cfg80211_scan_6ghz_params *params =
 756		&request->scan_6ghz_params[request->n_6ghz_params];
 757
 758	for (i = 0; i < n_channels; i++) {
 759		if (request->channels[i] == chan) {
 760			if (add_to_6ghz)
 761				params->channel_idx = i;
 762			return;
 763		}
 764	}
 765
 766	request->n_channels++;
 767	request->channels[n_channels] = chan;
 768	if (add_to_6ghz)
 769		request->scan_6ghz_params[request->n_6ghz_params].channel_idx =
 770			n_channels;
 771}
 772
 773static bool cfg80211_find_ssid_match(struct cfg80211_colocated_ap *ap,
 774				     struct cfg80211_scan_request *request)
 775{
 776	int i;
 777	u32 s_ssid;
 778
 779	for (i = 0; i < request->n_ssids; i++) {
 780		/* wildcard ssid in the scan request */
 781		if (!request->ssids[i].ssid_len) {
 782			if (ap->multi_bss && !ap->transmitted_bssid)
 783				continue;
 784
 785			return true;
 786		}
 787
 788		if (ap->ssid_len &&
 789		    ap->ssid_len == request->ssids[i].ssid_len) {
 790			if (!memcmp(request->ssids[i].ssid, ap->ssid,
 791				    ap->ssid_len))
 792				return true;
 793		} else if (ap->short_ssid_valid) {
 794			s_ssid = ~crc32_le(~0, request->ssids[i].ssid,
 795					   request->ssids[i].ssid_len);
 796
 797			if (ap->short_ssid == s_ssid)
 798				return true;
 799		}
 800	}
 801
 802	return false;
 803}
 804
 805static int cfg80211_scan_6ghz(struct cfg80211_registered_device *rdev)
 806{
 807	u8 i;
 808	struct cfg80211_colocated_ap *ap;
 809	int n_channels, count = 0, err;
 810	struct cfg80211_scan_request *request, *rdev_req = rdev->scan_req;
 811	LIST_HEAD(coloc_ap_list);
 812	bool need_scan_psc = true;
 813	const struct ieee80211_sband_iftype_data *iftd;
 814	size_t size, offs_ssids, offs_6ghz_params, offs_ies;
 815
 816	rdev_req->scan_6ghz = true;
 817
 818	if (!rdev->wiphy.bands[NL80211_BAND_6GHZ])
 819		return -EOPNOTSUPP;
 820
 821	iftd = ieee80211_get_sband_iftype_data(rdev->wiphy.bands[NL80211_BAND_6GHZ],
 822					       rdev_req->wdev->iftype);
 823	if (!iftd || !iftd->he_cap.has_he)
 824		return -EOPNOTSUPP;
 825
 826	n_channels = rdev->wiphy.bands[NL80211_BAND_6GHZ]->n_channels;
 827
 828	if (rdev_req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ) {
 829		struct cfg80211_internal_bss *intbss;
 830
 831		spin_lock_bh(&rdev->bss_lock);
 832		list_for_each_entry(intbss, &rdev->bss_list, list) {
 833			struct cfg80211_bss *res = &intbss->pub;
 834			const struct cfg80211_bss_ies *ies;
 835			const struct element *ssid_elem;
 836			struct cfg80211_colocated_ap *entry;
 837			u32 s_ssid_tmp;
 838			int ret;
 839
 840			ies = rcu_access_pointer(res->ies);
 841			count += cfg80211_parse_colocated_ap(ies,
 842							     &coloc_ap_list);
 843
 844			/* In case the scan request specified a specific BSSID
 845			 * and the BSS is found and operating on 6GHz band then
 846			 * add this AP to the collocated APs list.
 847			 * This is relevant for ML probe requests when the lower
 848			 * band APs have not been discovered.
 849			 */
 850			if (is_broadcast_ether_addr(rdev_req->bssid) ||
 851			    !ether_addr_equal(rdev_req->bssid, res->bssid) ||
 852			    res->channel->band != NL80211_BAND_6GHZ)
 853				continue;
 854
 855			ret = cfg80211_calc_short_ssid(ies, &ssid_elem,
 856						       &s_ssid_tmp);
 857			if (ret)
 858				continue;
 859
 860			entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
 861			if (!entry)
 862				continue;
 863
 864			memcpy(entry->bssid, res->bssid, ETH_ALEN);
 865			entry->short_ssid = s_ssid_tmp;
 866			memcpy(entry->ssid, ssid_elem->data,
 867			       ssid_elem->datalen);
 868			entry->ssid_len = ssid_elem->datalen;
 869			entry->short_ssid_valid = true;
 870			entry->center_freq = res->channel->center_freq;
 871
 872			list_add_tail(&entry->list, &coloc_ap_list);
 873			count++;
 874		}
 875		spin_unlock_bh(&rdev->bss_lock);
 876	}
 877
 878	size = struct_size(request, channels, n_channels);
 879	offs_ssids = size;
 880	size += sizeof(*request->ssids) * rdev_req->n_ssids;
 881	offs_6ghz_params = size;
 882	size += sizeof(*request->scan_6ghz_params) * count;
 883	offs_ies = size;
 884	size += rdev_req->ie_len;
 885
 886	request = kzalloc(size, GFP_KERNEL);
 887	if (!request) {
 888		cfg80211_free_coloc_ap_list(&coloc_ap_list);
 889		return -ENOMEM;
 890	}
 891
 892	*request = *rdev_req;
 893	request->n_channels = 0;
 894	request->n_6ghz_params = 0;
 895	if (rdev_req->n_ssids) {
 896		/*
 897		 * Add the ssids from the parent scan request to the new
 898		 * scan request, so the driver would be able to use them
 899		 * in its probe requests to discover hidden APs on PSC
 900		 * channels.
 901		 */
 902		request->ssids = (void *)request + offs_ssids;
 903		memcpy(request->ssids, rdev_req->ssids,
 904		       sizeof(*request->ssids) * request->n_ssids);
 905	}
 906	request->scan_6ghz_params = (void *)request + offs_6ghz_params;
 907
 908	if (rdev_req->ie_len) {
 909		void *ie = (void *)request + offs_ies;
 910
 911		memcpy(ie, rdev_req->ie, rdev_req->ie_len);
 912		request->ie = ie;
 913	}
 914
 915	/*
 916	 * PSC channels should not be scanned in case of direct scan with 1 SSID
 917	 * and at least one of the reported co-located APs with same SSID
 918	 * indicating that all APs in the same ESS are co-located
 919	 */
 920	if (count && request->n_ssids == 1 && request->ssids[0].ssid_len) {
 921		list_for_each_entry(ap, &coloc_ap_list, list) {
 922			if (ap->colocated_ess &&
 923			    cfg80211_find_ssid_match(ap, request)) {
 924				need_scan_psc = false;
 925				break;
 926			}
 927		}
 928	}
 929
 930	/*
 931	 * add to the scan request the channels that need to be scanned
 932	 * regardless of the collocated APs (PSC channels or all channels
 933	 * in case that NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set)
 934	 */
 935	for (i = 0; i < rdev_req->n_channels; i++) {
 936		if (rdev_req->channels[i]->band == NL80211_BAND_6GHZ &&
 937		    ((need_scan_psc &&
 938		      cfg80211_channel_is_psc(rdev_req->channels[i])) ||
 939		     !(rdev_req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ))) {
 940			cfg80211_scan_req_add_chan(request,
 941						   rdev_req->channels[i],
 942						   false);
 943		}
 944	}
 945
 946	if (!(rdev_req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ))
 947		goto skip;
 948
 949	list_for_each_entry(ap, &coloc_ap_list, list) {
 950		bool found = false;
 951		struct cfg80211_scan_6ghz_params *scan_6ghz_params =
 952			&request->scan_6ghz_params[request->n_6ghz_params];
 953		struct ieee80211_channel *chan =
 954			ieee80211_get_channel(&rdev->wiphy, ap->center_freq);
 955
 956		if (!chan || chan->flags & IEEE80211_CHAN_DISABLED ||
 957		    !cfg80211_wdev_channel_allowed(rdev_req->wdev, chan))
 958			continue;
 959
 960		for (i = 0; i < rdev_req->n_channels; i++) {
 961			if (rdev_req->channels[i] == chan)
 962				found = true;
 963		}
 964
 965		if (!found)
 966			continue;
 967
 968		if (request->n_ssids > 0 &&
 969		    !cfg80211_find_ssid_match(ap, request))
 970			continue;
 971
 972		if (!is_broadcast_ether_addr(request->bssid) &&
 973		    !ether_addr_equal(request->bssid, ap->bssid))
 974			continue;
 975
 976		if (!request->n_ssids && ap->multi_bss && !ap->transmitted_bssid)
 977			continue;
 978
 979		cfg80211_scan_req_add_chan(request, chan, true);
 980		memcpy(scan_6ghz_params->bssid, ap->bssid, ETH_ALEN);
 981		scan_6ghz_params->short_ssid = ap->short_ssid;
 982		scan_6ghz_params->short_ssid_valid = ap->short_ssid_valid;
 983		scan_6ghz_params->unsolicited_probe = ap->unsolicited_probe;
 984		scan_6ghz_params->psd_20 = ap->psd_20;
 985
 986		/*
 987		 * If a PSC channel is added to the scan and 'need_scan_psc' is
 988		 * set to false, then all the APs that the scan logic is
 989		 * interested with on the channel are collocated and thus there
 990		 * is no need to perform the initial PSC channel listen.
 991		 */
 992		if (cfg80211_channel_is_psc(chan) && !need_scan_psc)
 993			scan_6ghz_params->psc_no_listen = true;
 994
 995		request->n_6ghz_params++;
 996	}
 997
 998skip:
 999	cfg80211_free_coloc_ap_list(&coloc_ap_list);
1000
1001	if (request->n_channels) {
1002		struct cfg80211_scan_request *old = rdev->int_scan_req;
1003
1004		rdev->int_scan_req = request;
1005
1006		/*
1007		 * If this scan follows a previous scan, save the scan start
1008		 * info from the first part of the scan
1009		 */
1010		if (old)
1011			rdev->int_scan_req->info = old->info;
1012
1013		err = rdev_scan(rdev, request);
1014		if (err) {
1015			rdev->int_scan_req = old;
1016			kfree(request);
1017		} else {
1018			kfree(old);
1019		}
1020
1021		return err;
1022	}
1023
1024	kfree(request);
1025	return -EINVAL;
1026}
1027
1028int cfg80211_scan(struct cfg80211_registered_device *rdev)
1029{
1030	struct cfg80211_scan_request *request;
1031	struct cfg80211_scan_request *rdev_req = rdev->scan_req;
1032	u32 n_channels = 0, idx, i;
1033
1034	if (!(rdev->wiphy.flags & WIPHY_FLAG_SPLIT_SCAN_6GHZ))
1035		return rdev_scan(rdev, rdev_req);
1036
1037	for (i = 0; i < rdev_req->n_channels; i++) {
1038		if (rdev_req->channels[i]->band != NL80211_BAND_6GHZ)
1039			n_channels++;
1040	}
1041
1042	if (!n_channels)
1043		return cfg80211_scan_6ghz(rdev);
1044
1045	request = kzalloc(struct_size(request, channels, n_channels),
1046			  GFP_KERNEL);
1047	if (!request)
1048		return -ENOMEM;
1049
1050	*request = *rdev_req;
1051	request->n_channels = n_channels;
1052
1053	for (i = idx = 0; i < rdev_req->n_channels; i++) {
1054		if (rdev_req->channels[i]->band != NL80211_BAND_6GHZ)
1055			request->channels[idx++] = rdev_req->channels[i];
1056	}
1057
1058	rdev_req->scan_6ghz = false;
1059	rdev->int_scan_req = request;
1060	return rdev_scan(rdev, request);
1061}
1062
1063void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev,
1064			   bool send_message)
1065{
1066	struct cfg80211_scan_request *request, *rdev_req;
1067	struct wireless_dev *wdev;
1068	struct sk_buff *msg;
1069#ifdef CONFIG_CFG80211_WEXT
1070	union iwreq_data wrqu;
1071#endif
1072
1073	lockdep_assert_held(&rdev->wiphy.mtx);
1074
1075	if (rdev->scan_msg) {
1076		nl80211_send_scan_msg(rdev, rdev->scan_msg);
1077		rdev->scan_msg = NULL;
1078		return;
1079	}
1080
1081	rdev_req = rdev->scan_req;
1082	if (!rdev_req)
1083		return;
1084
1085	wdev = rdev_req->wdev;
1086	request = rdev->int_scan_req ? rdev->int_scan_req : rdev_req;
1087
1088	if (wdev_running(wdev) &&
1089	    (rdev->wiphy.flags & WIPHY_FLAG_SPLIT_SCAN_6GHZ) &&
1090	    !rdev_req->scan_6ghz && !request->info.aborted &&
1091	    !cfg80211_scan_6ghz(rdev))
1092		return;
1093
1094	/*
1095	 * This must be before sending the other events!
1096	 * Otherwise, wpa_supplicant gets completely confused with
1097	 * wext events.
1098	 */
1099	if (wdev->netdev)
1100		cfg80211_sme_scan_done(wdev->netdev);
1101
1102	if (!request->info.aborted &&
1103	    request->flags & NL80211_SCAN_FLAG_FLUSH) {
1104		/* flush entries from previous scans */
1105		spin_lock_bh(&rdev->bss_lock);
1106		__cfg80211_bss_expire(rdev, request->scan_start);
1107		spin_unlock_bh(&rdev->bss_lock);
1108	}
1109
1110	msg = nl80211_build_scan_msg(rdev, wdev, request->info.aborted);
1111
1112#ifdef CONFIG_CFG80211_WEXT
1113	if (wdev->netdev && !request->info.aborted) {
1114		memset(&wrqu, 0, sizeof(wrqu));
1115
1116		wireless_send_event(wdev->netdev, SIOCGIWSCAN, &wrqu, NULL);
1117	}
1118#endif
1119
1120	dev_put(wdev->netdev);
1121
1122	kfree(rdev->int_scan_req);
1123	rdev->int_scan_req = NULL;
1124
1125	kfree(rdev->scan_req);
1126	rdev->scan_req = NULL;
 
1127
1128	if (!send_message)
1129		rdev->scan_msg = msg;
1130	else
1131		nl80211_send_scan_msg(rdev, msg);
1132}
1133
1134void __cfg80211_scan_done(struct wiphy *wiphy, struct wiphy_work *wk)
1135{
1136	___cfg80211_scan_done(wiphy_to_rdev(wiphy), true);
 
 
 
 
 
 
 
1137}
1138
1139void cfg80211_scan_done(struct cfg80211_scan_request *request,
1140			struct cfg80211_scan_info *info)
1141{
1142	struct cfg80211_scan_info old_info = request->info;
1143
1144	trace_cfg80211_scan_done(request, info);
1145	WARN_ON(request != wiphy_to_rdev(request->wiphy)->scan_req &&
1146		request != wiphy_to_rdev(request->wiphy)->int_scan_req);
1147
1148	request->info = *info;
1149
1150	/*
1151	 * In case the scan is split, the scan_start_tsf and tsf_bssid should
1152	 * be of the first part. In such a case old_info.scan_start_tsf should
1153	 * be non zero.
1154	 */
1155	if (request->scan_6ghz && old_info.scan_start_tsf) {
1156		request->info.scan_start_tsf = old_info.scan_start_tsf;
1157		memcpy(request->info.tsf_bssid, old_info.tsf_bssid,
1158		       sizeof(request->info.tsf_bssid));
1159	}
1160
1161	request->notified = true;
1162	wiphy_work_queue(request->wiphy,
1163			 &wiphy_to_rdev(request->wiphy)->scan_done_wk);
1164}
1165EXPORT_SYMBOL(cfg80211_scan_done);
1166
1167void cfg80211_add_sched_scan_req(struct cfg80211_registered_device *rdev,
1168				 struct cfg80211_sched_scan_request *req)
1169{
1170	lockdep_assert_held(&rdev->wiphy.mtx);
1171
1172	list_add_rcu(&req->list, &rdev->sched_scan_req_list);
1173}
1174
1175static void cfg80211_del_sched_scan_req(struct cfg80211_registered_device *rdev,
1176					struct cfg80211_sched_scan_request *req)
1177{
1178	lockdep_assert_held(&rdev->wiphy.mtx);
1179
1180	list_del_rcu(&req->list);
1181	kfree_rcu(req, rcu_head);
1182}
1183
1184static struct cfg80211_sched_scan_request *
1185cfg80211_find_sched_scan_req(struct cfg80211_registered_device *rdev, u64 reqid)
1186{
1187	struct cfg80211_sched_scan_request *pos;
1188
1189	list_for_each_entry_rcu(pos, &rdev->sched_scan_req_list, list,
1190				lockdep_is_held(&rdev->wiphy.mtx)) {
 
1191		if (pos->reqid == reqid)
1192			return pos;
1193	}
1194	return NULL;
1195}
1196
1197/*
1198 * Determines if a scheduled scan request can be handled. When a legacy
1199 * scheduled scan is running no other scheduled scan is allowed regardless
1200 * whether the request is for legacy or multi-support scan. When a multi-support
1201 * scheduled scan is running a request for legacy scan is not allowed. In this
1202 * case a request for multi-support scan can be handled if resources are
1203 * available, ie. struct wiphy::max_sched_scan_reqs limit is not yet reached.
1204 */
1205int cfg80211_sched_scan_req_possible(struct cfg80211_registered_device *rdev,
1206				     bool want_multi)
1207{
1208	struct cfg80211_sched_scan_request *pos;
1209	int i = 0;
1210
1211	list_for_each_entry(pos, &rdev->sched_scan_req_list, list) {
1212		/* request id zero means legacy in progress */
1213		if (!i && !pos->reqid)
1214			return -EINPROGRESS;
1215		i++;
1216	}
1217
1218	if (i) {
1219		/* no legacy allowed when multi request(s) are active */
1220		if (!want_multi)
1221			return -EINPROGRESS;
1222
1223		/* resource limit reached */
1224		if (i == rdev->wiphy.max_sched_scan_reqs)
1225			return -ENOSPC;
1226	}
1227	return 0;
1228}
1229
1230void cfg80211_sched_scan_results_wk(struct work_struct *work)
1231{
1232	struct cfg80211_registered_device *rdev;
1233	struct cfg80211_sched_scan_request *req, *tmp;
1234
1235	rdev = container_of(work, struct cfg80211_registered_device,
1236			   sched_scan_res_wk);
1237
1238	wiphy_lock(&rdev->wiphy);
1239	list_for_each_entry_safe(req, tmp, &rdev->sched_scan_req_list, list) {
1240		if (req->report_results) {
1241			req->report_results = false;
1242			if (req->flags & NL80211_SCAN_FLAG_FLUSH) {
1243				/* flush entries from previous scans */
1244				spin_lock_bh(&rdev->bss_lock);
1245				__cfg80211_bss_expire(rdev, req->scan_start);
1246				spin_unlock_bh(&rdev->bss_lock);
1247				req->scan_start = jiffies;
1248			}
1249			nl80211_send_sched_scan(req,
1250						NL80211_CMD_SCHED_SCAN_RESULTS);
1251		}
1252	}
1253	wiphy_unlock(&rdev->wiphy);
1254}
1255
1256void cfg80211_sched_scan_results(struct wiphy *wiphy, u64 reqid)
1257{
1258	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1259	struct cfg80211_sched_scan_request *request;
1260
1261	trace_cfg80211_sched_scan_results(wiphy, reqid);
1262	/* ignore if we're not scanning */
1263
1264	rcu_read_lock();
1265	request = cfg80211_find_sched_scan_req(rdev, reqid);
1266	if (request) {
1267		request->report_results = true;
1268		queue_work(cfg80211_wq, &rdev->sched_scan_res_wk);
1269	}
1270	rcu_read_unlock();
1271}
1272EXPORT_SYMBOL(cfg80211_sched_scan_results);
1273
1274void cfg80211_sched_scan_stopped_locked(struct wiphy *wiphy, u64 reqid)
1275{
1276	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1277
1278	lockdep_assert_held(&wiphy->mtx);
1279
1280	trace_cfg80211_sched_scan_stopped(wiphy, reqid);
1281
1282	__cfg80211_stop_sched_scan(rdev, reqid, true);
1283}
1284EXPORT_SYMBOL(cfg80211_sched_scan_stopped_locked);
1285
1286void cfg80211_sched_scan_stopped(struct wiphy *wiphy, u64 reqid)
1287{
1288	wiphy_lock(wiphy);
1289	cfg80211_sched_scan_stopped_locked(wiphy, reqid);
1290	wiphy_unlock(wiphy);
1291}
1292EXPORT_SYMBOL(cfg80211_sched_scan_stopped);
1293
1294int cfg80211_stop_sched_scan_req(struct cfg80211_registered_device *rdev,
1295				 struct cfg80211_sched_scan_request *req,
1296				 bool driver_initiated)
1297{
1298	lockdep_assert_held(&rdev->wiphy.mtx);
1299
1300	if (!driver_initiated) {
1301		int err = rdev_sched_scan_stop(rdev, req->dev, req->reqid);
1302		if (err)
1303			return err;
1304	}
1305
1306	nl80211_send_sched_scan(req, NL80211_CMD_SCHED_SCAN_STOPPED);
1307
1308	cfg80211_del_sched_scan_req(rdev, req);
1309
1310	return 0;
1311}
1312
1313int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
1314			       u64 reqid, bool driver_initiated)
1315{
1316	struct cfg80211_sched_scan_request *sched_scan_req;
1317
1318	lockdep_assert_held(&rdev->wiphy.mtx);
1319
1320	sched_scan_req = cfg80211_find_sched_scan_req(rdev, reqid);
1321	if (!sched_scan_req)
1322		return -ENOENT;
1323
1324	return cfg80211_stop_sched_scan_req(rdev, sched_scan_req,
1325					    driver_initiated);
1326}
1327
1328void cfg80211_bss_age(struct cfg80211_registered_device *rdev,
1329                      unsigned long age_secs)
1330{
1331	struct cfg80211_internal_bss *bss;
1332	unsigned long age_jiffies = msecs_to_jiffies(age_secs * MSEC_PER_SEC);
1333
1334	spin_lock_bh(&rdev->bss_lock);
1335	list_for_each_entry(bss, &rdev->bss_list, list)
1336		bss->ts -= age_jiffies;
1337	spin_unlock_bh(&rdev->bss_lock);
1338}
1339
1340void cfg80211_bss_expire(struct cfg80211_registered_device *rdev)
1341{
1342	__cfg80211_bss_expire(rdev, jiffies - IEEE80211_SCAN_RESULT_EXPIRE);
1343}
1344
1345void cfg80211_bss_flush(struct wiphy *wiphy)
 
 
1346{
1347	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 
 
 
 
 
1348
1349	spin_lock_bh(&rdev->bss_lock);
1350	__cfg80211_bss_expire(rdev, jiffies);
1351	spin_unlock_bh(&rdev->bss_lock);
1352}
1353EXPORT_SYMBOL(cfg80211_bss_flush);
1354
1355const struct element *
1356cfg80211_find_elem_match(u8 eid, const u8 *ies, unsigned int len,
1357			 const u8 *match, unsigned int match_len,
1358			 unsigned int match_offset)
1359{
1360	const struct element *elem;
1361
1362	for_each_element_id(elem, eid, ies, len) {
1363		if (elem->datalen >= match_offset + match_len &&
1364		    !memcmp(elem->data + match_offset, match, match_len))
1365			return elem;
1366	}
1367
1368	return NULL;
1369}
1370EXPORT_SYMBOL(cfg80211_find_elem_match);
1371
1372const struct element *cfg80211_find_vendor_elem(unsigned int oui, int oui_type,
1373						const u8 *ies,
1374						unsigned int len)
1375{
1376	const struct element *elem;
1377	u8 match[] = { oui >> 16, oui >> 8, oui, oui_type };
1378	int match_len = (oui_type < 0) ? 3 : sizeof(match);
1379
1380	if (WARN_ON(oui_type > 0xff))
1381		return NULL;
1382
1383	elem = cfg80211_find_elem_match(WLAN_EID_VENDOR_SPECIFIC, ies, len,
1384					match, match_len, 0);
1385
1386	if (!elem || elem->datalen < 4)
1387		return NULL;
1388
1389	return elem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1390}
1391EXPORT_SYMBOL(cfg80211_find_vendor_elem);
1392
1393/**
1394 * enum bss_compare_mode - BSS compare mode
1395 * @BSS_CMP_REGULAR: regular compare mode (for insertion and normal find)
1396 * @BSS_CMP_HIDE_ZLEN: find hidden SSID with zero-length mode
1397 * @BSS_CMP_HIDE_NUL: find hidden SSID with NUL-ed out mode
1398 */
1399enum bss_compare_mode {
1400	BSS_CMP_REGULAR,
1401	BSS_CMP_HIDE_ZLEN,
1402	BSS_CMP_HIDE_NUL,
1403};
1404
1405static int cmp_bss(struct cfg80211_bss *a,
1406		   struct cfg80211_bss *b,
1407		   enum bss_compare_mode mode)
1408{
1409	const struct cfg80211_bss_ies *a_ies, *b_ies;
1410	const u8 *ie1 = NULL;
1411	const u8 *ie2 = NULL;
1412	int i, r;
1413
1414	if (a->channel != b->channel)
1415		return (b->channel->center_freq * 1000 + b->channel->freq_offset) -
1416		       (a->channel->center_freq * 1000 + a->channel->freq_offset);
1417
1418	a_ies = rcu_access_pointer(a->ies);
1419	if (!a_ies)
1420		return -1;
1421	b_ies = rcu_access_pointer(b->ies);
1422	if (!b_ies)
1423		return 1;
1424
1425	if (WLAN_CAPABILITY_IS_STA_BSS(a->capability))
1426		ie1 = cfg80211_find_ie(WLAN_EID_MESH_ID,
1427				       a_ies->data, a_ies->len);
1428	if (WLAN_CAPABILITY_IS_STA_BSS(b->capability))
1429		ie2 = cfg80211_find_ie(WLAN_EID_MESH_ID,
1430				       b_ies->data, b_ies->len);
1431	if (ie1 && ie2) {
1432		int mesh_id_cmp;
1433
1434		if (ie1[1] == ie2[1])
1435			mesh_id_cmp = memcmp(ie1 + 2, ie2 + 2, ie1[1]);
1436		else
1437			mesh_id_cmp = ie2[1] - ie1[1];
1438
1439		ie1 = cfg80211_find_ie(WLAN_EID_MESH_CONFIG,
1440				       a_ies->data, a_ies->len);
1441		ie2 = cfg80211_find_ie(WLAN_EID_MESH_CONFIG,
1442				       b_ies->data, b_ies->len);
1443		if (ie1 && ie2) {
1444			if (mesh_id_cmp)
1445				return mesh_id_cmp;
1446			if (ie1[1] != ie2[1])
1447				return ie2[1] - ie1[1];
1448			return memcmp(ie1 + 2, ie2 + 2, ie1[1]);
1449		}
1450	}
1451
1452	r = memcmp(a->bssid, b->bssid, sizeof(a->bssid));
1453	if (r)
1454		return r;
1455
1456	ie1 = cfg80211_find_ie(WLAN_EID_SSID, a_ies->data, a_ies->len);
1457	ie2 = cfg80211_find_ie(WLAN_EID_SSID, b_ies->data, b_ies->len);
1458
1459	if (!ie1 && !ie2)
1460		return 0;
1461
1462	/*
1463	 * Note that with "hide_ssid", the function returns a match if
1464	 * the already-present BSS ("b") is a hidden SSID beacon for
1465	 * the new BSS ("a").
1466	 */
1467
1468	/* sort missing IE before (left of) present IE */
1469	if (!ie1)
1470		return -1;
1471	if (!ie2)
1472		return 1;
1473
1474	switch (mode) {
1475	case BSS_CMP_HIDE_ZLEN:
1476		/*
1477		 * In ZLEN mode we assume the BSS entry we're
1478		 * looking for has a zero-length SSID. So if
1479		 * the one we're looking at right now has that,
1480		 * return 0. Otherwise, return the difference
1481		 * in length, but since we're looking for the
1482		 * 0-length it's really equivalent to returning
1483		 * the length of the one we're looking at.
1484		 *
1485		 * No content comparison is needed as we assume
1486		 * the content length is zero.
1487		 */
1488		return ie2[1];
1489	case BSS_CMP_REGULAR:
1490	default:
1491		/* sort by length first, then by contents */
1492		if (ie1[1] != ie2[1])
1493			return ie2[1] - ie1[1];
1494		return memcmp(ie1 + 2, ie2 + 2, ie1[1]);
1495	case BSS_CMP_HIDE_NUL:
1496		if (ie1[1] != ie2[1])
1497			return ie2[1] - ie1[1];
1498		/* this is equivalent to memcmp(zeroes, ie2 + 2, len) */
1499		for (i = 0; i < ie2[1]; i++)
1500			if (ie2[i + 2])
1501				return -1;
1502		return 0;
1503	}
1504}
1505
1506static bool cfg80211_bss_type_match(u16 capability,
1507				    enum nl80211_band band,
1508				    enum ieee80211_bss_type bss_type)
1509{
1510	bool ret = true;
1511	u16 mask, val;
1512
1513	if (bss_type == IEEE80211_BSS_TYPE_ANY)
1514		return ret;
1515
1516	if (band == NL80211_BAND_60GHZ) {
1517		mask = WLAN_CAPABILITY_DMG_TYPE_MASK;
1518		switch (bss_type) {
1519		case IEEE80211_BSS_TYPE_ESS:
1520			val = WLAN_CAPABILITY_DMG_TYPE_AP;
1521			break;
1522		case IEEE80211_BSS_TYPE_PBSS:
1523			val = WLAN_CAPABILITY_DMG_TYPE_PBSS;
1524			break;
1525		case IEEE80211_BSS_TYPE_IBSS:
1526			val = WLAN_CAPABILITY_DMG_TYPE_IBSS;
1527			break;
1528		default:
1529			return false;
1530		}
1531	} else {
1532		mask = WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS;
1533		switch (bss_type) {
1534		case IEEE80211_BSS_TYPE_ESS:
1535			val = WLAN_CAPABILITY_ESS;
1536			break;
1537		case IEEE80211_BSS_TYPE_IBSS:
1538			val = WLAN_CAPABILITY_IBSS;
1539			break;
1540		case IEEE80211_BSS_TYPE_MBSS:
1541			val = 0;
1542			break;
1543		default:
1544			return false;
1545		}
1546	}
1547
1548	ret = ((capability & mask) == val);
1549	return ret;
1550}
1551
1552/* Returned bss is reference counted and must be cleaned up appropriately. */
1553struct cfg80211_bss *__cfg80211_get_bss(struct wiphy *wiphy,
1554					struct ieee80211_channel *channel,
1555					const u8 *bssid,
1556					const u8 *ssid, size_t ssid_len,
1557					enum ieee80211_bss_type bss_type,
1558					enum ieee80211_privacy privacy,
1559					u32 use_for)
1560{
1561	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1562	struct cfg80211_internal_bss *bss, *res = NULL;
1563	unsigned long now = jiffies;
1564	int bss_privacy;
1565
1566	trace_cfg80211_get_bss(wiphy, channel, bssid, ssid, ssid_len, bss_type,
1567			       privacy);
1568
1569	spin_lock_bh(&rdev->bss_lock);
1570
1571	list_for_each_entry(bss, &rdev->bss_list, list) {
1572		if (!cfg80211_bss_type_match(bss->pub.capability,
1573					     bss->pub.channel->band, bss_type))
1574			continue;
1575
1576		bss_privacy = (bss->pub.capability & WLAN_CAPABILITY_PRIVACY);
1577		if ((privacy == IEEE80211_PRIVACY_ON && !bss_privacy) ||
1578		    (privacy == IEEE80211_PRIVACY_OFF && bss_privacy))
1579			continue;
1580		if (channel && bss->pub.channel != channel)
1581			continue;
1582		if (!is_valid_ether_addr(bss->pub.bssid))
1583			continue;
1584		if ((bss->pub.use_for & use_for) != use_for)
1585			continue;
1586		/* Don't get expired BSS structs */
1587		if (time_after(now, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE) &&
1588		    !atomic_read(&bss->hold))
1589			continue;
1590		if (is_bss(&bss->pub, bssid, ssid, ssid_len)) {
1591			res = bss;
1592			bss_ref_get(rdev, res);
1593			break;
1594		}
1595	}
1596
1597	spin_unlock_bh(&rdev->bss_lock);
1598	if (!res)
1599		return NULL;
1600	trace_cfg80211_return_bss(&res->pub);
1601	return &res->pub;
1602}
1603EXPORT_SYMBOL(__cfg80211_get_bss);
1604
1605static bool rb_insert_bss(struct cfg80211_registered_device *rdev,
1606			  struct cfg80211_internal_bss *bss)
1607{
1608	struct rb_node **p = &rdev->bss_tree.rb_node;
1609	struct rb_node *parent = NULL;
1610	struct cfg80211_internal_bss *tbss;
1611	int cmp;
1612
1613	while (*p) {
1614		parent = *p;
1615		tbss = rb_entry(parent, struct cfg80211_internal_bss, rbn);
1616
1617		cmp = cmp_bss(&bss->pub, &tbss->pub, BSS_CMP_REGULAR);
1618
1619		if (WARN_ON(!cmp)) {
1620			/* will sort of leak this BSS */
1621			return false;
1622		}
1623
1624		if (cmp < 0)
1625			p = &(*p)->rb_left;
1626		else
1627			p = &(*p)->rb_right;
1628	}
1629
1630	rb_link_node(&bss->rbn, parent, p);
1631	rb_insert_color(&bss->rbn, &rdev->bss_tree);
1632	return true;
1633}
1634
1635static struct cfg80211_internal_bss *
1636rb_find_bss(struct cfg80211_registered_device *rdev,
1637	    struct cfg80211_internal_bss *res,
1638	    enum bss_compare_mode mode)
1639{
1640	struct rb_node *n = rdev->bss_tree.rb_node;
1641	struct cfg80211_internal_bss *bss;
1642	int r;
1643
1644	while (n) {
1645		bss = rb_entry(n, struct cfg80211_internal_bss, rbn);
1646		r = cmp_bss(&res->pub, &bss->pub, mode);
1647
1648		if (r == 0)
1649			return bss;
1650		else if (r < 0)
1651			n = n->rb_left;
1652		else
1653			n = n->rb_right;
1654	}
1655
1656	return NULL;
1657}
1658
1659static void cfg80211_insert_bss(struct cfg80211_registered_device *rdev,
1660				struct cfg80211_internal_bss *bss)
1661{
1662	lockdep_assert_held(&rdev->bss_lock);
1663
1664	if (!rb_insert_bss(rdev, bss))
1665		return;
1666	list_add_tail(&bss->list, &rdev->bss_list);
1667	rdev->bss_entries++;
1668}
1669
1670static void cfg80211_rehash_bss(struct cfg80211_registered_device *rdev,
1671                                struct cfg80211_internal_bss *bss)
1672{
1673	lockdep_assert_held(&rdev->bss_lock);
1674
1675	rb_erase(&bss->rbn, &rdev->bss_tree);
1676	if (!rb_insert_bss(rdev, bss)) {
1677		list_del(&bss->list);
1678		if (!list_empty(&bss->hidden_list))
1679			list_del_init(&bss->hidden_list);
1680		if (!list_empty(&bss->pub.nontrans_list))
1681			list_del_init(&bss->pub.nontrans_list);
1682		rdev->bss_entries--;
1683	}
1684	rdev->bss_generation++;
1685}
1686
1687static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev,
1688				   struct cfg80211_internal_bss *new)
1689{
1690	const struct cfg80211_bss_ies *ies;
1691	struct cfg80211_internal_bss *bss;
1692	const u8 *ie;
1693	int i, ssidlen;
1694	u8 fold = 0;
1695	u32 n_entries = 0;
1696
1697	ies = rcu_access_pointer(new->pub.beacon_ies);
1698	if (WARN_ON(!ies))
1699		return false;
1700
1701	ie = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len);
1702	if (!ie) {
1703		/* nothing to do */
1704		return true;
1705	}
1706
1707	ssidlen = ie[1];
1708	for (i = 0; i < ssidlen; i++)
1709		fold |= ie[2 + i];
1710
1711	if (fold) {
1712		/* not a hidden SSID */
1713		return true;
1714	}
1715
1716	/* This is the bad part ... */
1717
1718	list_for_each_entry(bss, &rdev->bss_list, list) {
1719		/*
1720		 * we're iterating all the entries anyway, so take the
1721		 * opportunity to validate the list length accounting
1722		 */
1723		n_entries++;
1724
1725		if (!ether_addr_equal(bss->pub.bssid, new->pub.bssid))
1726			continue;
1727		if (bss->pub.channel != new->pub.channel)
1728			continue;
 
 
1729		if (rcu_access_pointer(bss->pub.beacon_ies))
1730			continue;
1731		ies = rcu_access_pointer(bss->pub.ies);
1732		if (!ies)
1733			continue;
1734		ie = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len);
1735		if (!ie)
1736			continue;
1737		if (ssidlen && ie[1] != ssidlen)
1738			continue;
1739		if (WARN_ON_ONCE(bss->pub.hidden_beacon_bss))
1740			continue;
1741		if (WARN_ON_ONCE(!list_empty(&bss->hidden_list)))
1742			list_del(&bss->hidden_list);
1743		/* combine them */
1744		list_add(&bss->hidden_list, &new->hidden_list);
1745		bss->pub.hidden_beacon_bss = &new->pub;
1746		new->refcount += bss->refcount;
1747		rcu_assign_pointer(bss->pub.beacon_ies,
1748				   new->pub.beacon_ies);
1749	}
1750
1751	WARN_ONCE(n_entries != rdev->bss_entries,
1752		  "rdev bss entries[%d]/list[len:%d] corruption\n",
1753		  rdev->bss_entries, n_entries);
1754
1755	return true;
1756}
1757
1758static void cfg80211_update_hidden_bsses(struct cfg80211_internal_bss *known,
1759					 const struct cfg80211_bss_ies *new_ies,
1760					 const struct cfg80211_bss_ies *old_ies)
1761{
1762	struct cfg80211_internal_bss *bss;
1763
1764	/* Assign beacon IEs to all sub entries */
1765	list_for_each_entry(bss, &known->hidden_list, hidden_list) {
1766		const struct cfg80211_bss_ies *ies;
1767
1768		ies = rcu_access_pointer(bss->pub.beacon_ies);
1769		WARN_ON(ies != old_ies);
1770
1771		rcu_assign_pointer(bss->pub.beacon_ies, new_ies);
1772	}
1773}
1774
1775static void cfg80211_check_stuck_ecsa(struct cfg80211_registered_device *rdev,
1776				      struct cfg80211_internal_bss *known,
1777				      const struct cfg80211_bss_ies *old)
1778{
1779	const struct ieee80211_ext_chansw_ie *ecsa;
1780	const struct element *elem_new, *elem_old;
1781	const struct cfg80211_bss_ies *new, *bcn;
1782
1783	if (known->pub.proberesp_ecsa_stuck)
1784		return;
1785
1786	new = rcu_dereference_protected(known->pub.proberesp_ies,
1787					lockdep_is_held(&rdev->bss_lock));
1788	if (WARN_ON(!new))
1789		return;
1790
1791	if (new->tsf - old->tsf < USEC_PER_SEC)
1792		return;
1793
1794	elem_old = cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN,
1795				      old->data, old->len);
1796	if (!elem_old)
1797		return;
1798
1799	elem_new = cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN,
1800				      new->data, new->len);
1801	if (!elem_new)
1802		return;
1803
1804	bcn = rcu_dereference_protected(known->pub.beacon_ies,
1805					lockdep_is_held(&rdev->bss_lock));
1806	if (bcn &&
1807	    cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN,
1808			       bcn->data, bcn->len))
1809		return;
1810
1811	if (elem_new->datalen != elem_old->datalen)
1812		return;
1813	if (elem_new->datalen < sizeof(struct ieee80211_ext_chansw_ie))
1814		return;
1815	if (memcmp(elem_new->data, elem_old->data, elem_new->datalen))
1816		return;
1817
1818	ecsa = (void *)elem_new->data;
1819
1820	if (!ecsa->mode)
1821		return;
1822
1823	if (ecsa->new_ch_num !=
1824	    ieee80211_frequency_to_channel(known->pub.channel->center_freq))
1825		return;
1826
1827	known->pub.proberesp_ecsa_stuck = 1;
1828}
1829
1830static bool
1831cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,
1832			  struct cfg80211_internal_bss *known,
1833			  struct cfg80211_internal_bss *new,
1834			  bool signal_valid)
1835{
1836	lockdep_assert_held(&rdev->bss_lock);
1837
1838	/* Update IEs */
1839	if (rcu_access_pointer(new->pub.proberesp_ies)) {
1840		const struct cfg80211_bss_ies *old;
1841
1842		old = rcu_access_pointer(known->pub.proberesp_ies);
1843
1844		rcu_assign_pointer(known->pub.proberesp_ies,
1845				   new->pub.proberesp_ies);
1846		/* Override possible earlier Beacon frame IEs */
1847		rcu_assign_pointer(known->pub.ies,
1848				   new->pub.proberesp_ies);
1849		if (old) {
1850			cfg80211_check_stuck_ecsa(rdev, known, old);
1851			kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
1852		}
1853	}
1854
1855	if (rcu_access_pointer(new->pub.beacon_ies)) {
1856		const struct cfg80211_bss_ies *old;
1857
1858		if (known->pub.hidden_beacon_bss &&
1859		    !list_empty(&known->hidden_list)) {
1860			const struct cfg80211_bss_ies *f;
1861
1862			/* The known BSS struct is one of the probe
1863			 * response members of a group, but we're
1864			 * receiving a beacon (beacon_ies in the new
1865			 * bss is used). This can only mean that the
1866			 * AP changed its beacon from not having an
1867			 * SSID to showing it, which is confusing so
1868			 * drop this information.
1869			 */
1870
1871			f = rcu_access_pointer(new->pub.beacon_ies);
1872			kfree_rcu((struct cfg80211_bss_ies *)f, rcu_head);
1873			return false;
1874		}
1875
1876		old = rcu_access_pointer(known->pub.beacon_ies);
 
 
 
1877
1878		rcu_assign_pointer(known->pub.beacon_ies, new->pub.beacon_ies);
1879
1880		/* Override IEs if they were from a beacon before */
1881		if (old == rcu_access_pointer(known->pub.ies))
1882			rcu_assign_pointer(known->pub.ies, new->pub.beacon_ies);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1883
1884		cfg80211_update_hidden_bsses(known,
1885					     rcu_access_pointer(new->pub.beacon_ies),
1886					     old);
 
 
1887
1888		if (old)
1889			kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
1890	}
1891
1892	known->pub.beacon_interval = new->pub.beacon_interval;
 
1893
1894	/* don't update the signal if beacon was heard on
1895	 * adjacent channel.
1896	 */
1897	if (signal_valid)
1898		known->pub.signal = new->pub.signal;
1899	known->pub.capability = new->pub.capability;
1900	known->ts = new->ts;
1901	known->ts_boottime = new->ts_boottime;
1902	known->parent_tsf = new->parent_tsf;
1903	known->pub.chains = new->pub.chains;
1904	memcpy(known->pub.chain_signal, new->pub.chain_signal,
1905	       IEEE80211_MAX_CHAINS);
1906	ether_addr_copy(known->parent_bssid, new->parent_bssid);
1907	known->pub.max_bssid_indicator = new->pub.max_bssid_indicator;
1908	known->pub.bssid_index = new->pub.bssid_index;
1909	known->pub.use_for &= new->pub.use_for;
1910	known->pub.cannot_use_reasons = new->pub.cannot_use_reasons;
1911	known->bss_source = new->bss_source;
1912
1913	return true;
1914}
1915
1916/* Returned bss is reference counted and must be cleaned up appropriately. */
1917static struct cfg80211_internal_bss *
1918__cfg80211_bss_update(struct cfg80211_registered_device *rdev,
1919		      struct cfg80211_internal_bss *tmp,
1920		      bool signal_valid, unsigned long ts)
1921{
1922	struct cfg80211_internal_bss *found = NULL;
1923	struct cfg80211_bss_ies *ies;
1924
1925	if (WARN_ON(!tmp->pub.channel))
1926		goto free_ies;
1927
1928	tmp->ts = ts;
1929
1930	if (WARN_ON(!rcu_access_pointer(tmp->pub.ies)))
1931		goto free_ies;
1932
1933	found = rb_find_bss(rdev, tmp, BSS_CMP_REGULAR);
 
 
 
1934
1935	if (found) {
1936		if (!cfg80211_update_known_bss(rdev, found, tmp, signal_valid))
1937			return NULL;
 
 
 
 
 
 
 
 
 
 
 
 
1938	} else {
1939		struct cfg80211_internal_bss *new;
1940		struct cfg80211_internal_bss *hidden;
 
1941
1942		/*
1943		 * create a copy -- the "res" variable that is passed in
1944		 * is allocated on the stack since it's not needed in the
1945		 * more common case of an update
1946		 */
1947		new = kzalloc(sizeof(*new) + rdev->wiphy.bss_priv_size,
1948			      GFP_ATOMIC);
1949		if (!new)
1950			goto free_ies;
 
 
 
 
 
 
 
1951		memcpy(new, tmp, sizeof(*new));
1952		new->refcount = 1;
1953		INIT_LIST_HEAD(&new->hidden_list);
1954		INIT_LIST_HEAD(&new->pub.nontrans_list);
1955		/* we'll set this later if it was non-NULL */
1956		new->pub.transmitted_bss = NULL;
1957
1958		if (rcu_access_pointer(tmp->pub.proberesp_ies)) {
1959			hidden = rb_find_bss(rdev, tmp, BSS_CMP_HIDE_ZLEN);
1960			if (!hidden)
1961				hidden = rb_find_bss(rdev, tmp,
1962						     BSS_CMP_HIDE_NUL);
1963			if (hidden) {
1964				new->pub.hidden_beacon_bss = &hidden->pub;
1965				list_add(&new->hidden_list,
1966					 &hidden->hidden_list);
1967				hidden->refcount++;
1968
1969				ies = (void *)rcu_access_pointer(new->pub.beacon_ies);
1970				rcu_assign_pointer(new->pub.beacon_ies,
1971						   hidden->pub.beacon_ies);
1972				if (ies)
1973					kfree_rcu(ies, rcu_head);
1974			}
1975		} else {
1976			/*
1977			 * Ok so we found a beacon, and don't have an entry. If
1978			 * it's a beacon with hidden SSID, we might be in for an
1979			 * expensive search for any probe responses that should
1980			 * be grouped with this beacon for updates ...
1981			 */
1982			if (!cfg80211_combine_bsses(rdev, new)) {
1983				bss_ref_put(rdev, new);
1984				return NULL;
1985			}
1986		}
1987
1988		if (rdev->bss_entries >= bss_entries_limit &&
1989		    !cfg80211_bss_expire_oldest(rdev)) {
1990			bss_ref_put(rdev, new);
1991			return NULL;
1992		}
1993
1994		/* This must be before the call to bss_ref_get */
1995		if (tmp->pub.transmitted_bss) {
1996			new->pub.transmitted_bss = tmp->pub.transmitted_bss;
1997			bss_ref_get(rdev, bss_from_pub(tmp->pub.transmitted_bss));
1998		}
1999
2000		cfg80211_insert_bss(rdev, new);
 
 
2001		found = new;
2002	}
2003
2004	rdev->bss_generation++;
2005	bss_ref_get(rdev, found);
 
2006
2007	return found;
2008
2009free_ies:
2010	ies = (void *)rcu_access_pointer(tmp->pub.beacon_ies);
2011	if (ies)
2012		kfree_rcu(ies, rcu_head);
2013	ies = (void *)rcu_access_pointer(tmp->pub.proberesp_ies);
2014	if (ies)
2015		kfree_rcu(ies, rcu_head);
2016
2017	return NULL;
2018}
2019
2020struct cfg80211_internal_bss *
2021cfg80211_bss_update(struct cfg80211_registered_device *rdev,
2022		    struct cfg80211_internal_bss *tmp,
2023		    bool signal_valid, unsigned long ts)
2024{
2025	struct cfg80211_internal_bss *res;
2026
2027	spin_lock_bh(&rdev->bss_lock);
2028	res = __cfg80211_bss_update(rdev, tmp, signal_valid, ts);
2029	spin_unlock_bh(&rdev->bss_lock);
2030
2031	return res;
2032}
2033
2034int cfg80211_get_ies_channel_number(const u8 *ie, size_t ielen,
2035				    enum nl80211_band band)
2036{
2037	const struct element *tmp;
2038
2039	if (band == NL80211_BAND_6GHZ) {
2040		struct ieee80211_he_operation *he_oper;
2041
2042		tmp = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ie,
2043					     ielen);
2044		if (tmp && tmp->datalen >= sizeof(*he_oper) &&
2045		    tmp->datalen >= ieee80211_he_oper_size(&tmp->data[1])) {
2046			const struct ieee80211_he_6ghz_oper *he_6ghz_oper;
2047
2048			he_oper = (void *)&tmp->data[1];
2049
2050			he_6ghz_oper = ieee80211_he_6ghz_oper(he_oper);
2051			if (!he_6ghz_oper)
2052				return -1;
2053
2054			return he_6ghz_oper->primary;
2055		}
2056	} else if (band == NL80211_BAND_S1GHZ) {
2057		tmp = cfg80211_find_elem(WLAN_EID_S1G_OPERATION, ie, ielen);
2058		if (tmp && tmp->datalen >= sizeof(struct ieee80211_s1g_oper_ie)) {
2059			struct ieee80211_s1g_oper_ie *s1gop = (void *)tmp->data;
2060
2061			return s1gop->oper_ch;
2062		}
2063	} else {
2064		tmp = cfg80211_find_elem(WLAN_EID_DS_PARAMS, ie, ielen);
2065		if (tmp && tmp->datalen == 1)
2066			return tmp->data[0];
2067
2068		tmp = cfg80211_find_elem(WLAN_EID_HT_OPERATION, ie, ielen);
2069		if (tmp &&
2070		    tmp->datalen >= sizeof(struct ieee80211_ht_operation)) {
2071			struct ieee80211_ht_operation *htop = (void *)tmp->data;
2072
2073			return htop->primary_chan;
2074		}
2075	}
2076
2077	return -1;
2078}
2079EXPORT_SYMBOL(cfg80211_get_ies_channel_number);
2080
2081/*
2082 * Update RX channel information based on the available frame payload
2083 * information. This is mainly for the 2.4 GHz band where frames can be received
2084 * from neighboring channels and the Beacon frames use the DSSS Parameter Set
2085 * element to indicate the current (transmitting) channel, but this might also
2086 * be needed on other bands if RX frequency does not match with the actual
2087 * operating channel of a BSS, or if the AP reports a different primary channel.
2088 */
2089static struct ieee80211_channel *
2090cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,
2091			 struct ieee80211_channel *channel)
2092{
 
2093	u32 freq;
2094	int channel_number;
2095	struct ieee80211_channel *alt_channel;
2096
2097	channel_number = cfg80211_get_ies_channel_number(ie, ielen,
2098							 channel->band);
2099
2100	if (channel_number < 0) {
2101		/* No channel information in frame payload */
2102		return channel;
2103	}
2104
2105	freq = ieee80211_channel_to_freq_khz(channel_number, channel->band);
2106
2107	/*
2108	 * Frame info (beacon/prob res) is the same as received channel,
2109	 * no need for further processing.
2110	 */
2111	if (freq == ieee80211_channel_to_khz(channel))
2112		return channel;
2113
2114	alt_channel = ieee80211_get_channel_khz(wiphy, freq);
2115	if (!alt_channel) {
2116		if (channel->band == NL80211_BAND_2GHZ ||
2117		    channel->band == NL80211_BAND_6GHZ) {
2118			/*
2119			 * Better not allow unexpected channels when that could
2120			 * be going beyond the 1-11 range (e.g., discovering
2121			 * BSS on channel 12 when radio is configured for
2122			 * channel 11) or beyond the 6 GHz channel range.
2123			 */
2124			return NULL;
2125		}
 
2126
2127		/* No match for the payload channel number - ignore it */
2128		return channel;
2129	}
2130
2131	/*
2132	 * Use the channel determined through the payload channel number
2133	 * instead of the RX channel reported by the driver.
2134	 */
2135	if (alt_channel->flags & IEEE80211_CHAN_DISABLED)
2136		return NULL;
2137	return alt_channel;
2138}
2139
2140struct cfg80211_inform_single_bss_data {
2141	struct cfg80211_inform_bss *drv_data;
2142	enum cfg80211_bss_frame_type ftype;
2143	struct ieee80211_channel *channel;
2144	u8 bssid[ETH_ALEN];
2145	u64 tsf;
2146	u16 capability;
2147	u16 beacon_interval;
2148	const u8 *ie;
2149	size_t ielen;
2150
2151	enum bss_source_type bss_source;
2152	/* Set if reporting bss_source != BSS_SOURCE_DIRECT */
2153	struct cfg80211_bss *source_bss;
2154	u8 max_bssid_indicator;
2155	u8 bssid_index;
2156
2157	u8 use_for;
2158	u64 cannot_use_reasons;
2159};
2160
2161enum ieee80211_ap_reg_power
2162cfg80211_get_6ghz_power_type(const u8 *elems, size_t elems_len)
2163{
2164	const struct ieee80211_he_6ghz_oper *he_6ghz_oper;
2165	struct ieee80211_he_operation *he_oper;
2166	const struct element *tmp;
2167
2168	tmp = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION,
2169				     elems, elems_len);
2170	if (!tmp || tmp->datalen < sizeof(*he_oper) + 1 ||
2171	    tmp->datalen < ieee80211_he_oper_size(tmp->data + 1))
2172		return IEEE80211_REG_UNSET_AP;
2173
2174	he_oper = (void *)&tmp->data[1];
2175	he_6ghz_oper = ieee80211_he_6ghz_oper(he_oper);
2176
2177	if (!he_6ghz_oper)
2178		return IEEE80211_REG_UNSET_AP;
2179
2180	switch (u8_get_bits(he_6ghz_oper->control,
2181			    IEEE80211_HE_6GHZ_OPER_CTRL_REG_INFO)) {
2182	case IEEE80211_6GHZ_CTRL_REG_LPI_AP:
2183	case IEEE80211_6GHZ_CTRL_REG_INDOOR_LPI_AP:
2184		return IEEE80211_REG_LPI_AP;
2185	case IEEE80211_6GHZ_CTRL_REG_SP_AP:
2186	case IEEE80211_6GHZ_CTRL_REG_INDOOR_SP_AP:
2187		return IEEE80211_REG_SP_AP;
2188	case IEEE80211_6GHZ_CTRL_REG_VLP_AP:
2189		return IEEE80211_REG_VLP_AP;
2190	default:
2191		return IEEE80211_REG_UNSET_AP;
2192	}
2193}
2194
2195static bool cfg80211_6ghz_power_type_valid(const u8 *elems, size_t elems_len,
2196					   const u32 flags)
2197{
2198	switch (cfg80211_get_6ghz_power_type(elems, elems_len)) {
2199	case IEEE80211_REG_LPI_AP:
2200		return true;
2201	case IEEE80211_REG_SP_AP:
2202		return !(flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT);
2203	case IEEE80211_REG_VLP_AP:
2204		return !(flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT);
2205	default:
2206		return false;
2207	}
2208}
2209
2210/* Returned bss is reference counted and must be cleaned up appropriately. */
2211static struct cfg80211_bss *
2212cfg80211_inform_single_bss_data(struct wiphy *wiphy,
2213				struct cfg80211_inform_single_bss_data *data,
2214				gfp_t gfp)
 
 
 
2215{
2216	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
2217	struct cfg80211_inform_bss *drv_data = data->drv_data;
2218	struct cfg80211_bss_ies *ies;
2219	struct ieee80211_channel *channel;
2220	struct cfg80211_internal_bss tmp = {}, *res;
2221	int bss_type;
2222	bool signal_valid;
2223	unsigned long ts;
2224
2225	if (WARN_ON(!wiphy))
2226		return NULL;
2227
2228	if (WARN_ON(wiphy->signal_type == CFG80211_SIGNAL_TYPE_UNSPEC &&
2229		    (drv_data->signal < 0 || drv_data->signal > 100)))
2230		return NULL;
2231
2232	if (WARN_ON(data->bss_source != BSS_SOURCE_DIRECT && !data->source_bss))
2233		return NULL;
2234
2235	channel = data->channel;
2236	if (!channel)
2237		channel = cfg80211_get_bss_channel(wiphy, data->ie, data->ielen,
2238						   drv_data->chan);
2239	if (!channel)
2240		return NULL;
2241
2242	if (channel->band == NL80211_BAND_6GHZ &&
2243	    !cfg80211_6ghz_power_type_valid(data->ie, data->ielen,
2244					    channel->flags)) {
2245		data->use_for = 0;
2246		data->cannot_use_reasons =
2247			NL80211_BSS_CANNOT_USE_6GHZ_PWR_MISMATCH;
2248	}
2249
2250	memcpy(tmp.pub.bssid, data->bssid, ETH_ALEN);
2251	tmp.pub.channel = channel;
2252	if (data->bss_source != BSS_SOURCE_STA_PROFILE)
2253		tmp.pub.signal = drv_data->signal;
2254	else
2255		tmp.pub.signal = 0;
2256	tmp.pub.beacon_interval = data->beacon_interval;
2257	tmp.pub.capability = data->capability;
2258	tmp.ts_boottime = drv_data->boottime_ns;
2259	tmp.parent_tsf = drv_data->parent_tsf;
2260	ether_addr_copy(tmp.parent_bssid, drv_data->parent_bssid);
2261	tmp.pub.chains = drv_data->chains;
2262	memcpy(tmp.pub.chain_signal, drv_data->chain_signal,
2263	       IEEE80211_MAX_CHAINS);
2264	tmp.pub.use_for = data->use_for;
2265	tmp.pub.cannot_use_reasons = data->cannot_use_reasons;
2266	tmp.bss_source = data->bss_source;
2267
2268	switch (data->bss_source) {
2269	case BSS_SOURCE_MBSSID:
2270		tmp.pub.transmitted_bss = data->source_bss;
2271		fallthrough;
2272	case BSS_SOURCE_STA_PROFILE:
2273		ts = bss_from_pub(data->source_bss)->ts;
2274		tmp.pub.bssid_index = data->bssid_index;
2275		tmp.pub.max_bssid_indicator = data->max_bssid_indicator;
2276		break;
2277	case BSS_SOURCE_DIRECT:
2278		ts = jiffies;
2279
2280		if (channel->band == NL80211_BAND_60GHZ) {
2281			bss_type = data->capability &
2282				   WLAN_CAPABILITY_DMG_TYPE_MASK;
2283			if (bss_type == WLAN_CAPABILITY_DMG_TYPE_AP ||
2284			    bss_type == WLAN_CAPABILITY_DMG_TYPE_PBSS)
2285				regulatory_hint_found_beacon(wiphy, channel,
2286							     gfp);
2287		} else {
2288			if (data->capability & WLAN_CAPABILITY_ESS)
2289				regulatory_hint_found_beacon(wiphy, channel,
2290							     gfp);
2291		}
2292		break;
2293	}
2294
2295	/*
2296	 * If we do not know here whether the IEs are from a Beacon or Probe
2297	 * Response frame, we need to pick one of the options and only use it
2298	 * with the driver that does not provide the full Beacon/Probe Response
2299	 * frame. Use Beacon frame pointer to avoid indicating that this should
2300	 * override the IEs pointer should we have received an earlier
2301	 * indication of Probe Response data.
2302	 */
2303	ies = kzalloc(sizeof(*ies) + data->ielen, gfp);
2304	if (!ies)
2305		return NULL;
2306	ies->len = data->ielen;
2307	ies->tsf = data->tsf;
2308	ies->from_beacon = false;
2309	memcpy(ies->data, data->ie, data->ielen);
2310
2311	switch (data->ftype) {
2312	case CFG80211_BSS_FTYPE_BEACON:
2313	case CFG80211_BSS_FTYPE_S1G_BEACON:
2314		ies->from_beacon = true;
2315		fallthrough;
2316	case CFG80211_BSS_FTYPE_UNKNOWN:
2317		rcu_assign_pointer(tmp.pub.beacon_ies, ies);
2318		break;
2319	case CFG80211_BSS_FTYPE_PRESP:
2320		rcu_assign_pointer(tmp.pub.proberesp_ies, ies);
2321		break;
2322	}
2323	rcu_assign_pointer(tmp.pub.ies, ies);
2324
2325	signal_valid = drv_data->chan == channel;
2326	spin_lock_bh(&rdev->bss_lock);
2327	res = __cfg80211_bss_update(rdev, &tmp, signal_valid, ts);
2328	if (!res)
2329		goto drop;
2330
2331	rdev_inform_bss(rdev, &res->pub, ies, drv_data->drv_data);
2332
2333	if (data->bss_source == BSS_SOURCE_MBSSID) {
2334		/* this is a nontransmitting bss, we need to add it to
2335		 * transmitting bss' list if it is not there
2336		 */
2337		if (cfg80211_add_nontrans_list(data->source_bss, &res->pub)) {
2338			if (__cfg80211_unlink_bss(rdev, res)) {
2339				rdev->bss_generation++;
2340				res = NULL;
2341			}
2342		}
2343
2344		if (!res)
2345			goto drop;
2346	}
2347	spin_unlock_bh(&rdev->bss_lock);
2348
2349	trace_cfg80211_return_bss(&res->pub);
2350	/* __cfg80211_bss_update gives us a referenced result */
2351	return &res->pub;
2352
2353drop:
2354	spin_unlock_bh(&rdev->bss_lock);
2355	return NULL;
2356}
2357
2358static const struct element
2359*cfg80211_get_profile_continuation(const u8 *ie, size_t ielen,
2360				   const struct element *mbssid_elem,
2361				   const struct element *sub_elem)
2362{
2363	const u8 *mbssid_end = mbssid_elem->data + mbssid_elem->datalen;
2364	const struct element *next_mbssid;
2365	const struct element *next_sub;
2366
2367	next_mbssid = cfg80211_find_elem(WLAN_EID_MULTIPLE_BSSID,
2368					 mbssid_end,
2369					 ielen - (mbssid_end - ie));
2370
2371	/*
2372	 * If it is not the last subelement in current MBSSID IE or there isn't
2373	 * a next MBSSID IE - profile is complete.
2374	*/
2375	if ((sub_elem->data + sub_elem->datalen < mbssid_end - 1) ||
2376	    !next_mbssid)
2377		return NULL;
2378
2379	/* For any length error, just return NULL */
2380
2381	if (next_mbssid->datalen < 4)
2382		return NULL;
2383
2384	next_sub = (void *)&next_mbssid->data[1];
2385
2386	if (next_mbssid->data + next_mbssid->datalen <
2387	    next_sub->data + next_sub->datalen)
2388		return NULL;
2389
2390	if (next_sub->id != 0 || next_sub->datalen < 2)
2391		return NULL;
2392
2393	/*
2394	 * Check if the first element in the next sub element is a start
2395	 * of a new profile
2396	 */
2397	return next_sub->data[0] == WLAN_EID_NON_TX_BSSID_CAP ?
2398	       NULL : next_mbssid;
2399}
2400
2401size_t cfg80211_merge_profile(const u8 *ie, size_t ielen,
2402			      const struct element *mbssid_elem,
2403			      const struct element *sub_elem,
2404			      u8 *merged_ie, size_t max_copy_len)
2405{
2406	size_t copied_len = sub_elem->datalen;
2407	const struct element *next_mbssid;
2408
2409	if (sub_elem->datalen > max_copy_len)
2410		return 0;
2411
2412	memcpy(merged_ie, sub_elem->data, sub_elem->datalen);
2413
2414	while ((next_mbssid = cfg80211_get_profile_continuation(ie, ielen,
2415								mbssid_elem,
2416								sub_elem))) {
2417		const struct element *next_sub = (void *)&next_mbssid->data[1];
2418
2419		if (copied_len + next_sub->datalen > max_copy_len)
2420			break;
2421		memcpy(merged_ie + copied_len, next_sub->data,
2422		       next_sub->datalen);
2423		copied_len += next_sub->datalen;
2424	}
2425
2426	return copied_len;
2427}
2428EXPORT_SYMBOL(cfg80211_merge_profile);
2429
2430static void
2431cfg80211_parse_mbssid_data(struct wiphy *wiphy,
2432			   struct cfg80211_inform_single_bss_data *tx_data,
2433			   struct cfg80211_bss *source_bss,
2434			   gfp_t gfp)
2435{
2436	struct cfg80211_inform_single_bss_data data = {
2437		.drv_data = tx_data->drv_data,
2438		.ftype = tx_data->ftype,
2439		.tsf = tx_data->tsf,
2440		.beacon_interval = tx_data->beacon_interval,
2441		.source_bss = source_bss,
2442		.bss_source = BSS_SOURCE_MBSSID,
2443		.use_for = tx_data->use_for,
2444		.cannot_use_reasons = tx_data->cannot_use_reasons,
2445	};
2446	const u8 *mbssid_index_ie;
2447	const struct element *elem, *sub;
2448	u8 *new_ie, *profile;
2449	u64 seen_indices = 0;
2450	struct cfg80211_bss *bss;
2451
2452	if (!source_bss)
2453		return;
2454	if (!cfg80211_find_elem(WLAN_EID_MULTIPLE_BSSID,
2455				tx_data->ie, tx_data->ielen))
2456		return;
2457	if (!wiphy->support_mbssid)
2458		return;
2459	if (wiphy->support_only_he_mbssid &&
2460	    !cfg80211_find_ext_elem(WLAN_EID_EXT_HE_CAPABILITY,
2461				    tx_data->ie, tx_data->ielen))
2462		return;
2463
2464	new_ie = kmalloc(IEEE80211_MAX_DATA_LEN, gfp);
2465	if (!new_ie)
2466		return;
2467
2468	profile = kmalloc(tx_data->ielen, gfp);
2469	if (!profile)
2470		goto out;
2471
2472	for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID,
2473			    tx_data->ie, tx_data->ielen) {
2474		if (elem->datalen < 4)
2475			continue;
2476		if (elem->data[0] < 1 || (int)elem->data[0] > 8)
2477			continue;
2478		for_each_element(sub, elem->data + 1, elem->datalen - 1) {
2479			u8 profile_len;
2480
2481			if (sub->id != 0 || sub->datalen < 4) {
2482				/* not a valid BSS profile */
2483				continue;
2484			}
2485
2486			if (sub->data[0] != WLAN_EID_NON_TX_BSSID_CAP ||
2487			    sub->data[1] != 2) {
2488				/* The first element within the Nontransmitted
2489				 * BSSID Profile is not the Nontransmitted
2490				 * BSSID Capability element.
2491				 */
2492				continue;
2493			}
2494
2495			memset(profile, 0, tx_data->ielen);
2496			profile_len = cfg80211_merge_profile(tx_data->ie,
2497							     tx_data->ielen,
2498							     elem,
2499							     sub,
2500							     profile,
2501							     tx_data->ielen);
2502
2503			/* found a Nontransmitted BSSID Profile */
2504			mbssid_index_ie = cfg80211_find_ie
2505				(WLAN_EID_MULTI_BSSID_IDX,
2506				 profile, profile_len);
2507			if (!mbssid_index_ie || mbssid_index_ie[1] < 1 ||
2508			    mbssid_index_ie[2] == 0 ||
2509			    mbssid_index_ie[2] > 46 ||
2510			    mbssid_index_ie[2] >= (1 << elem->data[0])) {
2511				/* No valid Multiple BSSID-Index element */
2512				continue;
2513			}
2514
2515			if (seen_indices & BIT_ULL(mbssid_index_ie[2]))
2516				/* We don't support legacy split of a profile */
2517				net_dbg_ratelimited("Partial info for BSSID index %d\n",
2518						    mbssid_index_ie[2]);
2519
2520			seen_indices |= BIT_ULL(mbssid_index_ie[2]);
2521
2522			data.bssid_index = mbssid_index_ie[2];
2523			data.max_bssid_indicator = elem->data[0];
2524
2525			cfg80211_gen_new_bssid(tx_data->bssid,
2526					       data.max_bssid_indicator,
2527					       data.bssid_index,
2528					       data.bssid);
2529
2530			memset(new_ie, 0, IEEE80211_MAX_DATA_LEN);
2531			data.ie = new_ie;
2532			data.ielen = cfg80211_gen_new_ie(tx_data->ie,
2533							 tx_data->ielen,
2534							 profile,
2535							 profile_len,
2536							 new_ie,
2537							 IEEE80211_MAX_DATA_LEN);
2538			if (!data.ielen)
2539				continue;
2540
2541			data.capability = get_unaligned_le16(profile + 2);
2542			bss = cfg80211_inform_single_bss_data(wiphy, &data, gfp);
2543			if (!bss)
2544				break;
2545			cfg80211_put_bss(wiphy, bss);
2546		}
2547	}
2548
2549out:
2550	kfree(new_ie);
2551	kfree(profile);
2552}
2553
2554ssize_t cfg80211_defragment_element(const struct element *elem, const u8 *ies,
2555				    size_t ieslen, u8 *data, size_t data_len,
2556				    u8 frag_id)
2557{
2558	const struct element *next;
2559	ssize_t copied;
2560	u8 elem_datalen;
2561
2562	if (!elem)
2563		return -EINVAL;
2564
2565	/* elem might be invalid after the memmove */
2566	next = (void *)(elem->data + elem->datalen);
2567	elem_datalen = elem->datalen;
2568
2569	if (elem->id == WLAN_EID_EXTENSION) {
2570		copied = elem->datalen - 1;
2571
2572		if (data) {
2573			if (copied > data_len)
2574				return -ENOSPC;
2575
2576			memmove(data, elem->data + 1, copied);
2577		}
2578	} else {
2579		copied = elem->datalen;
2580
2581		if (data) {
2582			if (copied > data_len)
2583				return -ENOSPC;
2584
2585			memmove(data, elem->data, copied);
2586		}
2587	}
2588
2589	/* Fragmented elements must have 255 bytes */
2590	if (elem_datalen < 255)
2591		return copied;
2592
2593	for (elem = next;
2594	     elem->data < ies + ieslen &&
2595		elem->data + elem->datalen <= ies + ieslen;
2596	     elem = next) {
2597		/* elem might be invalid after the memmove */
2598		next = (void *)(elem->data + elem->datalen);
2599
2600		if (elem->id != frag_id)
2601			break;
2602
2603		elem_datalen = elem->datalen;
2604
2605		if (data) {
2606			if (copied + elem_datalen > data_len)
2607				return -ENOSPC;
2608
2609			memmove(data + copied, elem->data, elem_datalen);
2610		}
2611
2612		copied += elem_datalen;
2613
2614		/* Only the last fragment may be short */
2615		if (elem_datalen != 255)
2616			break;
2617	}
2618
2619	return copied;
2620}
2621EXPORT_SYMBOL(cfg80211_defragment_element);
2622
2623struct cfg80211_mle {
2624	struct ieee80211_multi_link_elem *mle;
2625	struct ieee80211_mle_per_sta_profile
2626		*sta_prof[IEEE80211_MLD_MAX_NUM_LINKS];
2627	ssize_t sta_prof_len[IEEE80211_MLD_MAX_NUM_LINKS];
2628
2629	u8 data[];
2630};
2631
2632static struct cfg80211_mle *
2633cfg80211_defrag_mle(const struct element *mle, const u8 *ie, size_t ielen,
2634		    gfp_t gfp)
2635{
2636	const struct element *elem;
2637	struct cfg80211_mle *res;
2638	size_t buf_len;
2639	ssize_t mle_len;
2640	u8 common_size, idx;
2641
2642	if (!mle || !ieee80211_mle_size_ok(mle->data + 1, mle->datalen - 1))
2643		return NULL;
2644
2645	/* Required length for first defragmentation */
2646	buf_len = mle->datalen - 1;
2647	for_each_element(elem, mle->data + mle->datalen,
2648			 ielen - sizeof(*mle) + mle->datalen) {
2649		if (elem->id != WLAN_EID_FRAGMENT)
2650			break;
2651
2652		buf_len += elem->datalen;
2653	}
2654
2655	res = kzalloc(struct_size(res, data, buf_len), gfp);
2656	if (!res)
2657		return NULL;
2658
2659	mle_len = cfg80211_defragment_element(mle, ie, ielen,
2660					      res->data, buf_len,
2661					      WLAN_EID_FRAGMENT);
2662	if (mle_len < 0)
2663		goto error;
2664
2665	res->mle = (void *)res->data;
2666
2667	/* Find the sub-element area in the buffer */
2668	common_size = ieee80211_mle_common_size((u8 *)res->mle);
2669	ie = res->data + common_size;
2670	ielen = mle_len - common_size;
2671
2672	idx = 0;
2673	for_each_element_id(elem, IEEE80211_MLE_SUBELEM_PER_STA_PROFILE,
2674			    ie, ielen) {
2675		res->sta_prof[idx] = (void *)elem->data;
2676		res->sta_prof_len[idx] = elem->datalen;
2677
2678		idx++;
2679		if (idx >= IEEE80211_MLD_MAX_NUM_LINKS)
2680			break;
2681	}
2682	if (!for_each_element_completed(elem, ie, ielen))
2683		goto error;
2684
2685	/* Defragment sta_info in-place */
2686	for (idx = 0; idx < IEEE80211_MLD_MAX_NUM_LINKS && res->sta_prof[idx];
2687	     idx++) {
2688		if (res->sta_prof_len[idx] < 255)
2689			continue;
2690
2691		elem = (void *)res->sta_prof[idx] - 2;
2692
2693		if (idx + 1 < ARRAY_SIZE(res->sta_prof) &&
2694		    res->sta_prof[idx + 1])
2695			buf_len = (u8 *)res->sta_prof[idx + 1] -
2696				  (u8 *)res->sta_prof[idx];
2697		else
2698			buf_len = ielen + ie - (u8 *)elem;
2699
2700		res->sta_prof_len[idx] =
2701			cfg80211_defragment_element(elem,
2702						    (u8 *)elem, buf_len,
2703						    (u8 *)res->sta_prof[idx],
2704						    buf_len,
2705						    IEEE80211_MLE_SUBELEM_FRAGMENT);
2706		if (res->sta_prof_len[idx] < 0)
2707			goto error;
2708	}
2709
2710	return res;
2711
2712error:
2713	kfree(res);
2714	return NULL;
2715}
2716
2717struct tbtt_info_iter_data {
2718	const struct ieee80211_neighbor_ap_info *ap_info;
2719	u8 param_ch_count;
2720	u32 use_for;
2721	u8 mld_id, link_id;
2722	bool non_tx;
2723};
2724
2725static enum cfg80211_rnr_iter_ret
2726cfg802121_mld_ap_rnr_iter(void *_data, u8 type,
2727			  const struct ieee80211_neighbor_ap_info *info,
2728			  const u8 *tbtt_info, u8 tbtt_info_len)
2729{
2730	const struct ieee80211_rnr_mld_params *mld_params;
2731	struct tbtt_info_iter_data *data = _data;
2732	u8 link_id;
2733	bool non_tx = false;
2734
2735	if (type == IEEE80211_TBTT_INFO_TYPE_TBTT &&
2736	    tbtt_info_len >= offsetofend(struct ieee80211_tbtt_info_ge_11,
2737					 mld_params)) {
2738		const struct ieee80211_tbtt_info_ge_11 *tbtt_info_ge_11 =
2739			(void *)tbtt_info;
2740
2741		non_tx = (tbtt_info_ge_11->bss_params &
2742			  (IEEE80211_RNR_TBTT_PARAMS_MULTI_BSSID |
2743			   IEEE80211_RNR_TBTT_PARAMS_TRANSMITTED_BSSID)) ==
2744			 IEEE80211_RNR_TBTT_PARAMS_MULTI_BSSID;
2745		mld_params = &tbtt_info_ge_11->mld_params;
2746	} else if (type == IEEE80211_TBTT_INFO_TYPE_MLD &&
2747		 tbtt_info_len >= sizeof(struct ieee80211_rnr_mld_params))
2748		mld_params = (void *)tbtt_info;
2749	else
2750		return RNR_ITER_CONTINUE;
2751
2752	link_id = le16_get_bits(mld_params->params,
2753				IEEE80211_RNR_MLD_PARAMS_LINK_ID);
2754
2755	if (data->mld_id != mld_params->mld_id)
2756		return RNR_ITER_CONTINUE;
2757
2758	if (data->link_id != link_id)
2759		return RNR_ITER_CONTINUE;
2760
2761	data->ap_info = info;
2762	data->param_ch_count =
2763		le16_get_bits(mld_params->params,
2764			      IEEE80211_RNR_MLD_PARAMS_BSS_CHANGE_COUNT);
2765	data->non_tx = non_tx;
2766
2767	if (type == IEEE80211_TBTT_INFO_TYPE_TBTT)
2768		data->use_for = NL80211_BSS_USE_FOR_ALL;
2769	else
2770		data->use_for = NL80211_BSS_USE_FOR_MLD_LINK;
2771	return RNR_ITER_BREAK;
2772}
2773
2774static u8
2775cfg80211_rnr_info_for_mld_ap(const u8 *ie, size_t ielen, u8 mld_id, u8 link_id,
2776			     const struct ieee80211_neighbor_ap_info **ap_info,
2777			     u8 *param_ch_count, bool *non_tx)
2778{
2779	struct tbtt_info_iter_data data = {
2780		.mld_id = mld_id,
2781		.link_id = link_id,
2782	};
2783
2784	cfg80211_iter_rnr(ie, ielen, cfg802121_mld_ap_rnr_iter, &data);
2785
2786	*ap_info = data.ap_info;
2787	*param_ch_count = data.param_ch_count;
2788	*non_tx = data.non_tx;
2789
2790	return data.use_for;
2791}
2792
2793static struct element *
2794cfg80211_gen_reporter_rnr(struct cfg80211_bss *source_bss, bool is_mbssid,
2795			  bool same_mld, u8 link_id, u8 bss_change_count,
2796			  gfp_t gfp)
2797{
2798	const struct cfg80211_bss_ies *ies;
2799	struct ieee80211_neighbor_ap_info ap_info;
2800	struct ieee80211_tbtt_info_ge_11 tbtt_info;
2801	u32 short_ssid;
2802	const struct element *elem;
2803	struct element *res;
2804
2805	/*
2806	 * We only generate the RNR to permit ML lookups. For that we do not
2807	 * need an entry for the corresponding transmitting BSS, lets just skip
2808	 * it even though it would be easy to add.
2809	 */
2810	if (!same_mld)
2811		return NULL;
2812
2813	/* We could use tx_data->ies if we change cfg80211_calc_short_ssid */
2814	rcu_read_lock();
2815	ies = rcu_dereference(source_bss->ies);
2816
2817	ap_info.tbtt_info_len = offsetofend(typeof(tbtt_info), mld_params);
2818	ap_info.tbtt_info_hdr =
2819			u8_encode_bits(IEEE80211_TBTT_INFO_TYPE_TBTT,
2820				       IEEE80211_AP_INFO_TBTT_HDR_TYPE) |
2821			u8_encode_bits(0, IEEE80211_AP_INFO_TBTT_HDR_COUNT);
2822
2823	ap_info.channel = ieee80211_frequency_to_channel(source_bss->channel->center_freq);
2824
2825	/* operating class */
2826	elem = cfg80211_find_elem(WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
2827				  ies->data, ies->len);
2828	if (elem && elem->datalen >= 1) {
2829		ap_info.op_class = elem->data[0];
2830	} else {
2831		struct cfg80211_chan_def chandef;
2832
2833		/* The AP is not providing us with anything to work with. So
2834		 * make up a somewhat reasonable operating class, but don't
2835		 * bother with it too much as no one will ever use the
2836		 * information.
2837		 */
2838		cfg80211_chandef_create(&chandef, source_bss->channel,
2839					NL80211_CHAN_NO_HT);
2840
2841		if (!ieee80211_chandef_to_operating_class(&chandef,
2842							  &ap_info.op_class))
2843			goto out_unlock;
2844	}
2845
2846	/* Just set TBTT offset and PSD 20 to invalid/unknown */
2847	tbtt_info.tbtt_offset = 255;
2848	tbtt_info.psd_20 = IEEE80211_RNR_TBTT_PARAMS_PSD_RESERVED;
2849
2850	memcpy(tbtt_info.bssid, source_bss->bssid, ETH_ALEN);
2851	if (cfg80211_calc_short_ssid(ies, &elem, &short_ssid))
2852		goto out_unlock;
2853
2854	rcu_read_unlock();
2855
2856	tbtt_info.short_ssid = cpu_to_le32(short_ssid);
2857
2858	tbtt_info.bss_params = IEEE80211_RNR_TBTT_PARAMS_SAME_SSID;
2859
2860	if (is_mbssid) {
2861		tbtt_info.bss_params |= IEEE80211_RNR_TBTT_PARAMS_MULTI_BSSID;
2862		tbtt_info.bss_params |= IEEE80211_RNR_TBTT_PARAMS_TRANSMITTED_BSSID;
2863	}
2864
2865	tbtt_info.mld_params.mld_id = 0;
2866	tbtt_info.mld_params.params =
2867		le16_encode_bits(link_id, IEEE80211_RNR_MLD_PARAMS_LINK_ID) |
2868		le16_encode_bits(bss_change_count,
2869				 IEEE80211_RNR_MLD_PARAMS_BSS_CHANGE_COUNT);
2870
2871	res = kzalloc(struct_size(res, data,
2872				  sizeof(ap_info) + ap_info.tbtt_info_len),
2873		      gfp);
2874	if (!res)
2875		return NULL;
2876
2877	/* Copy the data */
2878	res->id = WLAN_EID_REDUCED_NEIGHBOR_REPORT;
2879	res->datalen = sizeof(ap_info) + ap_info.tbtt_info_len;
2880	memcpy(res->data, &ap_info, sizeof(ap_info));
2881	memcpy(res->data + sizeof(ap_info), &tbtt_info, ap_info.tbtt_info_len);
2882
2883	return res;
2884
2885out_unlock:
2886	rcu_read_unlock();
2887	return NULL;
2888}
2889
2890static void
2891cfg80211_parse_ml_elem_sta_data(struct wiphy *wiphy,
2892				struct cfg80211_inform_single_bss_data *tx_data,
2893				struct cfg80211_bss *source_bss,
2894				const struct element *elem,
2895				gfp_t gfp)
2896{
2897	struct cfg80211_inform_single_bss_data data = {
2898		.drv_data = tx_data->drv_data,
2899		.ftype = tx_data->ftype,
2900		.source_bss = source_bss,
2901		.bss_source = BSS_SOURCE_STA_PROFILE,
2902	};
2903	struct element *reporter_rnr = NULL;
2904	struct ieee80211_multi_link_elem *ml_elem;
2905	struct cfg80211_mle *mle;
2906	const struct element *ssid_elem;
2907	const u8 *ssid = NULL;
2908	size_t ssid_len = 0;
2909	u16 control;
2910	u8 ml_common_len;
2911	u8 *new_ie = NULL;
2912	struct cfg80211_bss *bss;
2913	u8 mld_id, reporter_link_id, bss_change_count;
2914	u16 seen_links = 0;
2915	u8 i;
2916
2917	if (!ieee80211_mle_type_ok(elem->data + 1,
2918				   IEEE80211_ML_CONTROL_TYPE_BASIC,
2919				   elem->datalen - 1))
2920		return;
2921
2922	ml_elem = (void *)(elem->data + 1);
2923	control = le16_to_cpu(ml_elem->control);
2924	ml_common_len = ml_elem->variable[0];
2925
2926	/* Must be present when transmitted by an AP (in a probe response) */
2927	if (!(control & IEEE80211_MLC_BASIC_PRES_BSS_PARAM_CH_CNT) ||
2928	    !(control & IEEE80211_MLC_BASIC_PRES_LINK_ID) ||
2929	    !(control & IEEE80211_MLC_BASIC_PRES_MLD_CAPA_OP))
2930		return;
2931
2932	reporter_link_id = ieee80211_mle_get_link_id(elem->data + 1);
2933	bss_change_count = ieee80211_mle_get_bss_param_ch_cnt(elem->data + 1);
2934
2935	/*
2936	 * The MLD ID of the reporting AP is always zero. It is set if the AP
2937	 * is part of an MBSSID set and will be non-zero for ML Elements
2938	 * relating to a nontransmitted BSS (matching the Multi-BSSID Index,
2939	 * Draft P802.11be_D3.2, 35.3.4.2)
2940	 */
2941	mld_id = ieee80211_mle_get_mld_id(elem->data + 1);
2942
2943	/* Fully defrag the ML element for sta information/profile iteration */
2944	mle = cfg80211_defrag_mle(elem, tx_data->ie, tx_data->ielen, gfp);
2945	if (!mle)
2946		return;
2947
2948	/* No point in doing anything if there is no per-STA profile */
2949	if (!mle->sta_prof[0])
2950		goto out;
2951
2952	new_ie = kmalloc(IEEE80211_MAX_DATA_LEN, gfp);
2953	if (!new_ie)
2954		goto out;
2955
2956	reporter_rnr = cfg80211_gen_reporter_rnr(source_bss,
2957						 u16_get_bits(control,
2958							      IEEE80211_MLC_BASIC_PRES_MLD_ID),
2959						 mld_id == 0, reporter_link_id,
2960						 bss_change_count,
2961						 gfp);
2962
2963	ssid_elem = cfg80211_find_elem(WLAN_EID_SSID, tx_data->ie,
2964				       tx_data->ielen);
2965	if (ssid_elem) {
2966		ssid = ssid_elem->data;
2967		ssid_len = ssid_elem->datalen;
2968	}
2969
2970	for (i = 0; i < ARRAY_SIZE(mle->sta_prof) && mle->sta_prof[i]; i++) {
2971		const struct ieee80211_neighbor_ap_info *ap_info;
2972		enum nl80211_band band;
2973		u32 freq;
2974		const u8 *profile;
2975		ssize_t profile_len;
2976		u8 param_ch_count;
2977		u8 link_id, use_for;
2978		bool non_tx;
2979
2980		if (!ieee80211_mle_basic_sta_prof_size_ok((u8 *)mle->sta_prof[i],
2981							  mle->sta_prof_len[i]))
2982			continue;
2983
2984		control = le16_to_cpu(mle->sta_prof[i]->control);
2985
2986		if (!(control & IEEE80211_MLE_STA_CONTROL_COMPLETE_PROFILE))
2987			continue;
2988
2989		link_id = u16_get_bits(control,
2990				       IEEE80211_MLE_STA_CONTROL_LINK_ID);
2991		if (seen_links & BIT(link_id))
2992			break;
2993		seen_links |= BIT(link_id);
2994
2995		if (!(control & IEEE80211_MLE_STA_CONTROL_BEACON_INT_PRESENT) ||
2996		    !(control & IEEE80211_MLE_STA_CONTROL_TSF_OFFS_PRESENT) ||
2997		    !(control & IEEE80211_MLE_STA_CONTROL_STA_MAC_ADDR_PRESENT))
2998			continue;
2999
3000		memcpy(data.bssid, mle->sta_prof[i]->variable, ETH_ALEN);
3001		data.beacon_interval =
3002			get_unaligned_le16(mle->sta_prof[i]->variable + 6);
3003		data.tsf = tx_data->tsf +
3004			   get_unaligned_le64(mle->sta_prof[i]->variable + 8);
3005
3006		/* sta_info_len counts itself */
3007		profile = mle->sta_prof[i]->variable +
3008			  mle->sta_prof[i]->sta_info_len - 1;
3009		profile_len = (u8 *)mle->sta_prof[i] + mle->sta_prof_len[i] -
3010			      profile;
3011
3012		if (profile_len < 2)
3013			continue;
3014
3015		data.capability = get_unaligned_le16(profile);
3016		profile += 2;
3017		profile_len -= 2;
3018
3019		/* Find in RNR to look up channel information */
3020		use_for = cfg80211_rnr_info_for_mld_ap(tx_data->ie,
3021						       tx_data->ielen,
3022						       mld_id, link_id,
3023						       &ap_info,
3024						       &param_ch_count,
3025						       &non_tx);
3026		if (!use_for)
3027			continue;
3028
3029		/*
3030		 * As of 802.11be_D5.0, the specification does not give us any
3031		 * way of discovering both the MaxBSSID and the Multiple-BSSID
3032		 * Index. It does seem like the Multiple-BSSID Index element
3033		 * may be provided, but section 9.4.2.45 explicitly forbids
3034		 * including a Multiple-BSSID Element (in this case without any
3035		 * subelements).
3036		 * Without both pieces of information we cannot calculate the
3037		 * reference BSSID, so simply ignore the BSS.
3038		 */
3039		if (non_tx)
3040			continue;
3041
3042		/* We could sanity check the BSSID is included */
3043
3044		if (!ieee80211_operating_class_to_band(ap_info->op_class,
3045						       &band))
3046			continue;
3047
3048		freq = ieee80211_channel_to_freq_khz(ap_info->channel, band);
3049		data.channel = ieee80211_get_channel_khz(wiphy, freq);
3050
3051		/* Skip if RNR element specifies an unsupported channel */
3052		if (!data.channel)
3053			continue;
3054
3055		/* Skip if BSS entry generated from MBSSID or DIRECT source
3056		 * frame data available already.
3057		 */
3058		bss = cfg80211_get_bss(wiphy, data.channel, data.bssid, ssid,
3059				       ssid_len, IEEE80211_BSS_TYPE_ANY,
3060				       IEEE80211_PRIVACY_ANY);
3061		if (bss) {
3062			struct cfg80211_internal_bss *ibss = bss_from_pub(bss);
3063
3064			if (data.capability == bss->capability &&
3065			    ibss->bss_source != BSS_SOURCE_STA_PROFILE) {
3066				cfg80211_put_bss(wiphy, bss);
3067				continue;
3068			}
3069			cfg80211_put_bss(wiphy, bss);
3070		}
3071
3072		if (use_for == NL80211_BSS_USE_FOR_MLD_LINK &&
3073		    !(wiphy->flags & WIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY)) {
3074			use_for = 0;
3075			data.cannot_use_reasons =
3076				NL80211_BSS_CANNOT_USE_NSTR_NONPRIMARY;
3077		}
3078		data.use_for = use_for;
3079
3080		/* Generate new elements */
3081		memset(new_ie, 0, IEEE80211_MAX_DATA_LEN);
3082		data.ie = new_ie;
3083		data.ielen = cfg80211_gen_new_ie(tx_data->ie, tx_data->ielen,
3084						 profile, profile_len,
3085						 new_ie,
3086						 IEEE80211_MAX_DATA_LEN);
3087		if (!data.ielen)
3088			continue;
3089
3090		/* The generated elements do not contain:
3091		 *  - Basic ML element
3092		 *  - A TBTT entry in the RNR for the transmitting AP
3093		 *
3094		 * This information is needed both internally and in userspace
3095		 * as such, we should append it here.
3096		 */
3097		if (data.ielen + 3 + sizeof(*ml_elem) + ml_common_len >
3098		    IEEE80211_MAX_DATA_LEN)
3099			continue;
3100
3101		/* Copy the Basic Multi-Link element including the common
3102		 * information, and then fix up the link ID and BSS param
3103		 * change count.
3104		 * Note that the ML element length has been verified and we
3105		 * also checked that it contains the link ID.
3106		 */
3107		new_ie[data.ielen++] = WLAN_EID_EXTENSION;
3108		new_ie[data.ielen++] = 1 + sizeof(*ml_elem) + ml_common_len;
3109		new_ie[data.ielen++] = WLAN_EID_EXT_EHT_MULTI_LINK;
3110		memcpy(new_ie + data.ielen, ml_elem,
3111		       sizeof(*ml_elem) + ml_common_len);
3112
3113		new_ie[data.ielen + sizeof(*ml_elem) + 1 + ETH_ALEN] = link_id;
3114		new_ie[data.ielen + sizeof(*ml_elem) + 1 + ETH_ALEN + 1] =
3115			param_ch_count;
3116
3117		data.ielen += sizeof(*ml_elem) + ml_common_len;
3118
3119		if (reporter_rnr && (use_for & NL80211_BSS_USE_FOR_NORMAL)) {
3120			if (data.ielen + sizeof(struct element) +
3121			    reporter_rnr->datalen > IEEE80211_MAX_DATA_LEN)
3122				continue;
3123
3124			memcpy(new_ie + data.ielen, reporter_rnr,
3125			       sizeof(struct element) + reporter_rnr->datalen);
3126			data.ielen += sizeof(struct element) +
3127				      reporter_rnr->datalen;
3128		}
3129
3130		bss = cfg80211_inform_single_bss_data(wiphy, &data, gfp);
3131		if (!bss)
3132			break;
3133		cfg80211_put_bss(wiphy, bss);
3134	}
3135
3136out:
3137	kfree(reporter_rnr);
3138	kfree(new_ie);
3139	kfree(mle);
3140}
3141
3142static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy,
3143				       struct cfg80211_inform_single_bss_data *tx_data,
3144				       struct cfg80211_bss *source_bss,
3145				       gfp_t gfp)
3146{
3147	const struct element *elem;
3148
3149	if (!source_bss)
3150		return;
3151
3152	if (tx_data->ftype != CFG80211_BSS_FTYPE_PRESP)
3153		return;
3154
3155	for_each_element_extid(elem, WLAN_EID_EXT_EHT_MULTI_LINK,
3156			       tx_data->ie, tx_data->ielen)
3157		cfg80211_parse_ml_elem_sta_data(wiphy, tx_data, source_bss,
3158						elem, gfp);
3159}
3160
3161struct cfg80211_bss *
3162cfg80211_inform_bss_data(struct wiphy *wiphy,
3163			 struct cfg80211_inform_bss *data,
3164			 enum cfg80211_bss_frame_type ftype,
3165			 const u8 *bssid, u64 tsf, u16 capability,
3166			 u16 beacon_interval, const u8 *ie, size_t ielen,
3167			 gfp_t gfp)
3168{
3169	struct cfg80211_inform_single_bss_data inform_data = {
3170		.drv_data = data,
3171		.ftype = ftype,
3172		.tsf = tsf,
3173		.capability = capability,
3174		.beacon_interval = beacon_interval,
3175		.ie = ie,
3176		.ielen = ielen,
3177		.use_for = data->restrict_use ?
3178				data->use_for :
3179				NL80211_BSS_USE_FOR_ALL,
3180		.cannot_use_reasons = data->cannot_use_reasons,
3181	};
3182	struct cfg80211_bss *res;
3183
3184	memcpy(inform_data.bssid, bssid, ETH_ALEN);
3185
3186	res = cfg80211_inform_single_bss_data(wiphy, &inform_data, gfp);
3187	if (!res)
3188		return NULL;
3189
3190	/* don't do any further MBSSID/ML handling for S1G */
3191	if (ftype == CFG80211_BSS_FTYPE_S1G_BEACON)
3192		return res;
3193
3194	cfg80211_parse_mbssid_data(wiphy, &inform_data, res, gfp);
3195
3196	cfg80211_parse_ml_sta_data(wiphy, &inform_data, res, gfp);
3197
3198	return res;
3199}
3200EXPORT_SYMBOL(cfg80211_inform_bss_data);
3201
 
3202struct cfg80211_bss *
3203cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
3204			       struct cfg80211_inform_bss *data,
3205			       struct ieee80211_mgmt *mgmt, size_t len,
3206			       gfp_t gfp)
 
3207{
3208	size_t min_hdr_len;
3209	struct ieee80211_ext *ext = NULL;
3210	enum cfg80211_bss_frame_type ftype;
3211	u16 beacon_interval;
3212	const u8 *bssid;
3213	u16 capability;
3214	const u8 *ie;
3215	size_t ielen;
3216	u64 tsf;
 
 
 
3217
3218	if (WARN_ON(!mgmt))
3219		return NULL;
3220
3221	if (WARN_ON(!wiphy))
3222		return NULL;
3223
3224	BUILD_BUG_ON(offsetof(struct ieee80211_mgmt, u.probe_resp.variable) !=
3225		     offsetof(struct ieee80211_mgmt, u.beacon.variable));
 
3226
3227	trace_cfg80211_inform_bss_frame(wiphy, data, mgmt, len);
 
3228
3229	if (ieee80211_is_s1g_beacon(mgmt->frame_control)) {
3230		ext = (void *) mgmt;
3231		if (ieee80211_is_s1g_short_beacon(mgmt->frame_control))
3232			min_hdr_len = offsetof(struct ieee80211_ext,
3233					       u.s1g_short_beacon.variable);
3234		else
3235			min_hdr_len = offsetof(struct ieee80211_ext,
3236					       u.s1g_beacon.variable);
3237	} else {
3238		/* same for beacons */
3239		min_hdr_len = offsetof(struct ieee80211_mgmt,
3240				       u.probe_resp.variable);
3241	}
3242
3243	if (WARN_ON(len < min_hdr_len))
 
3244		return NULL;
 
 
 
 
3245
3246	ielen = len - min_hdr_len;
3247	ie = mgmt->u.probe_resp.variable;
3248	if (ext) {
3249		const struct ieee80211_s1g_bcn_compat_ie *compat;
3250		const struct element *elem;
3251
3252		if (ieee80211_is_s1g_short_beacon(mgmt->frame_control))
3253			ie = ext->u.s1g_short_beacon.variable;
3254		else
3255			ie = ext->u.s1g_beacon.variable;
 
 
 
 
 
 
 
 
 
 
 
 
 
3256
3257		elem = cfg80211_find_elem(WLAN_EID_S1G_BCN_COMPAT, ie, ielen);
3258		if (!elem)
3259			return NULL;
3260		if (elem->datalen < sizeof(*compat))
3261			return NULL;
3262		compat = (void *)elem->data;
3263		bssid = ext->u.s1g_beacon.sa;
3264		capability = le16_to_cpu(compat->compat_info);
3265		beacon_interval = le16_to_cpu(compat->beacon_int);
3266	} else {
3267		bssid = mgmt->bssid;
3268		beacon_interval = le16_to_cpu(mgmt->u.probe_resp.beacon_int);
3269		capability = le16_to_cpu(mgmt->u.probe_resp.capab_info);
3270	}
3271
3272	tsf = le64_to_cpu(mgmt->u.probe_resp.timestamp);
3273
3274	if (ieee80211_is_probe_resp(mgmt->frame_control))
3275		ftype = CFG80211_BSS_FTYPE_PRESP;
3276	else if (ext)
3277		ftype = CFG80211_BSS_FTYPE_S1G_BEACON;
3278	else
3279		ftype = CFG80211_BSS_FTYPE_BEACON;
3280
3281	return cfg80211_inform_bss_data(wiphy, data, ftype,
3282					bssid, tsf, capability,
3283					beacon_interval, ie, ielen,
3284					gfp);
3285}
3286EXPORT_SYMBOL(cfg80211_inform_bss_frame_data);
3287
3288void cfg80211_ref_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
3289{
3290	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 
3291
3292	if (!pub)
3293		return;
3294
 
 
3295	spin_lock_bh(&rdev->bss_lock);
3296	bss_ref_get(rdev, bss_from_pub(pub));
3297	spin_unlock_bh(&rdev->bss_lock);
3298}
3299EXPORT_SYMBOL(cfg80211_ref_bss);
3300
3301void cfg80211_put_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
3302{
3303	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 
3304
3305	if (!pub)
3306		return;
3307
 
 
3308	spin_lock_bh(&rdev->bss_lock);
3309	bss_ref_put(rdev, bss_from_pub(pub));
3310	spin_unlock_bh(&rdev->bss_lock);
3311}
3312EXPORT_SYMBOL(cfg80211_put_bss);
3313
3314void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
3315{
3316	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
3317	struct cfg80211_internal_bss *bss, *tmp1;
3318	struct cfg80211_bss *nontrans_bss, *tmp;
3319
3320	if (WARN_ON(!pub))
3321		return;
3322
3323	bss = bss_from_pub(pub);
3324
3325	spin_lock_bh(&rdev->bss_lock);
3326	if (list_empty(&bss->list))
3327		goto out;
3328
3329	list_for_each_entry_safe(nontrans_bss, tmp,
3330				 &pub->nontrans_list,
3331				 nontrans_list) {
3332		tmp1 = bss_from_pub(nontrans_bss);
3333		if (__cfg80211_unlink_bss(rdev, tmp1))
3334			rdev->bss_generation++;
3335	}
3336
3337	if (__cfg80211_unlink_bss(rdev, bss))
3338		rdev->bss_generation++;
3339out:
3340	spin_unlock_bh(&rdev->bss_lock);
3341}
3342EXPORT_SYMBOL(cfg80211_unlink_bss);
3343
3344void cfg80211_bss_iter(struct wiphy *wiphy,
3345		       struct cfg80211_chan_def *chandef,
3346		       void (*iter)(struct wiphy *wiphy,
3347				    struct cfg80211_bss *bss,
3348				    void *data),
3349		       void *iter_data)
3350{
3351	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
3352	struct cfg80211_internal_bss *bss;
3353
3354	spin_lock_bh(&rdev->bss_lock);
3355
3356	list_for_each_entry(bss, &rdev->bss_list, list) {
3357		if (!chandef || cfg80211_is_sub_chan(chandef, bss->pub.channel,
3358						     false))
3359			iter(wiphy, &bss->pub, iter_data);
3360	}
3361
3362	spin_unlock_bh(&rdev->bss_lock);
3363}
3364EXPORT_SYMBOL(cfg80211_bss_iter);
3365
3366void cfg80211_update_assoc_bss_entry(struct wireless_dev *wdev,
3367				     unsigned int link_id,
3368				     struct ieee80211_channel *chan)
3369{
3370	struct wiphy *wiphy = wdev->wiphy;
3371	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
3372	struct cfg80211_internal_bss *cbss = wdev->links[link_id].client.current_bss;
3373	struct cfg80211_internal_bss *new = NULL;
3374	struct cfg80211_internal_bss *bss;
3375	struct cfg80211_bss *nontrans_bss;
3376	struct cfg80211_bss *tmp;
3377
3378	spin_lock_bh(&rdev->bss_lock);
3379
3380	/*
3381	 * Some APs use CSA also for bandwidth changes, i.e., without actually
3382	 * changing the control channel, so no need to update in such a case.
3383	 */
3384	if (cbss->pub.channel == chan)
3385		goto done;
3386
3387	/* use transmitting bss */
3388	if (cbss->pub.transmitted_bss)
3389		cbss = bss_from_pub(cbss->pub.transmitted_bss);
3390
3391	cbss->pub.channel = chan;
3392
3393	list_for_each_entry(bss, &rdev->bss_list, list) {
3394		if (!cfg80211_bss_type_match(bss->pub.capability,
3395					     bss->pub.channel->band,
3396					     wdev->conn_bss_type))
3397			continue;
3398
3399		if (bss == cbss)
3400			continue;
3401
3402		if (!cmp_bss(&bss->pub, &cbss->pub, BSS_CMP_REGULAR)) {
3403			new = bss;
3404			break;
3405		}
3406	}
3407
3408	if (new) {
3409		/* to save time, update IEs for transmitting bss only */
3410		cfg80211_update_known_bss(rdev, cbss, new, false);
3411		new->pub.proberesp_ies = NULL;
3412		new->pub.beacon_ies = NULL;
3413
3414		list_for_each_entry_safe(nontrans_bss, tmp,
3415					 &new->pub.nontrans_list,
3416					 nontrans_list) {
3417			bss = bss_from_pub(nontrans_bss);
3418			if (__cfg80211_unlink_bss(rdev, bss))
3419				rdev->bss_generation++;
3420		}
3421
3422		WARN_ON(atomic_read(&new->hold));
3423		if (!WARN_ON(!__cfg80211_unlink_bss(rdev, new)))
3424			rdev->bss_generation++;
3425	}
3426	cfg80211_rehash_bss(rdev, cbss);
3427
3428	list_for_each_entry_safe(nontrans_bss, tmp,
3429				 &cbss->pub.nontrans_list,
3430				 nontrans_list) {
3431		bss = bss_from_pub(nontrans_bss);
3432		bss->pub.channel = chan;
3433		cfg80211_rehash_bss(rdev, bss);
3434	}
3435
3436done:
3437	spin_unlock_bh(&rdev->bss_lock);
3438}
3439
3440#ifdef CONFIG_CFG80211_WEXT
3441static struct cfg80211_registered_device *
3442cfg80211_get_dev_from_ifindex(struct net *net, int ifindex)
3443{
3444	struct cfg80211_registered_device *rdev;
3445	struct net_device *dev;
3446
3447	ASSERT_RTNL();
3448
3449	dev = dev_get_by_index(net, ifindex);
3450	if (!dev)
3451		return ERR_PTR(-ENODEV);
3452	if (dev->ieee80211_ptr)
3453		rdev = wiphy_to_rdev(dev->ieee80211_ptr->wiphy);
3454	else
3455		rdev = ERR_PTR(-ENODEV);
3456	dev_put(dev);
3457	return rdev;
3458}
3459
3460int cfg80211_wext_siwscan(struct net_device *dev,
3461			  struct iw_request_info *info,
3462			  union iwreq_data *wrqu, char *extra)
3463{
3464	struct cfg80211_registered_device *rdev;
3465	struct wiphy *wiphy;
3466	struct iw_scan_req *wreq = NULL;
3467	struct cfg80211_scan_request *creq;
3468	int i, err, n_channels = 0;
3469	enum nl80211_band band;
3470
3471	if (!netif_running(dev))
3472		return -ENETDOWN;
3473
3474	if (wrqu->data.length == sizeof(struct iw_scan_req))
3475		wreq = (struct iw_scan_req *)extra;
3476
3477	rdev = cfg80211_get_dev_from_ifindex(dev_net(dev), dev->ifindex);
3478
3479	if (IS_ERR(rdev))
3480		return PTR_ERR(rdev);
3481
3482	if (rdev->scan_req || rdev->scan_msg)
3483		return -EBUSY;
 
 
3484
3485	wiphy = &rdev->wiphy;
3486
3487	/* Determine number of channels, needed to allocate creq */
3488	if (wreq && wreq->num_channels) {
3489		/* Passed from userspace so should be checked */
3490		if (unlikely(wreq->num_channels > IW_MAX_FREQUENCIES))
3491			return -EINVAL;
3492		n_channels = wreq->num_channels;
3493	} else {
3494		n_channels = ieee80211_get_num_supported_channels(wiphy);
3495	}
3496
3497	creq = kzalloc(struct_size(creq, channels, n_channels) +
3498		       sizeof(struct cfg80211_ssid),
3499		       GFP_ATOMIC);
3500	if (!creq)
3501		return -ENOMEM;
 
 
3502
3503	creq->wiphy = wiphy;
3504	creq->wdev = dev->ieee80211_ptr;
3505	/* SSIDs come after channels */
3506	creq->ssids = (void *)creq + struct_size(creq, channels, n_channels);
3507	creq->n_channels = n_channels;
3508	creq->n_ssids = 1;
3509	creq->scan_start = jiffies;
3510
3511	/* translate "Scan on frequencies" request */
3512	i = 0;
3513	for (band = 0; band < NUM_NL80211_BANDS; band++) {
3514		int j;
3515
3516		if (!wiphy->bands[band])
3517			continue;
3518
3519		for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
3520			struct ieee80211_channel *chan;
3521
3522			/* ignore disabled channels */
3523			chan = &wiphy->bands[band]->channels[j];
3524			if (chan->flags & IEEE80211_CHAN_DISABLED ||
3525			    !cfg80211_wdev_channel_allowed(creq->wdev, chan))
3526				continue;
3527
3528			/* If we have a wireless request structure and the
3529			 * wireless request specifies frequencies, then search
3530			 * for the matching hardware channel.
3531			 */
3532			if (wreq && wreq->num_channels) {
3533				int k;
3534				int wiphy_freq = wiphy->bands[band]->channels[j].center_freq;
3535				for (k = 0; k < wreq->num_channels; k++) {
3536					struct iw_freq *freq =
3537						&wreq->channel_list[k];
3538					int wext_freq =
3539						cfg80211_wext_freq(freq);
3540
3541					if (wext_freq == wiphy_freq)
3542						goto wext_freq_found;
3543				}
3544				goto wext_freq_not_found;
3545			}
3546
3547		wext_freq_found:
3548			creq->channels[i] = &wiphy->bands[band]->channels[j];
3549			i++;
3550		wext_freq_not_found: ;
3551		}
3552	}
3553	/* No channels found? */
3554	if (!i) {
3555		err = -EINVAL;
3556		goto out;
3557	}
3558
3559	/* Set real number of channels specified in creq->channels[] */
3560	creq->n_channels = i;
3561
3562	/* translate "Scan for SSID" request */
3563	if (wreq) {
3564		if (wrqu->data.flags & IW_SCAN_THIS_ESSID) {
3565			if (wreq->essid_len > IEEE80211_MAX_SSID_LEN) {
3566				err = -EINVAL;
3567				goto out;
3568			}
3569			memcpy(creq->ssids[0].ssid, wreq->essid, wreq->essid_len);
3570			creq->ssids[0].ssid_len = wreq->essid_len;
3571		}
3572		if (wreq->scan_type == IW_SCAN_TYPE_PASSIVE) {
3573			creq->ssids = NULL;
3574			creq->n_ssids = 0;
3575		}
3576	}
3577
3578	for (i = 0; i < NUM_NL80211_BANDS; i++)
3579		if (wiphy->bands[i])
3580			creq->rates[i] = (1 << wiphy->bands[i]->n_bitrates) - 1;
3581
3582	eth_broadcast_addr(creq->bssid);
3583
3584	wiphy_lock(&rdev->wiphy);
3585
3586	rdev->scan_req = creq;
3587	err = rdev_scan(rdev, creq);
3588	if (err) {
3589		rdev->scan_req = NULL;
3590		/* creq will be freed below */
3591	} else {
3592		nl80211_send_scan_start(rdev, dev->ieee80211_ptr);
3593		/* creq now owned by driver */
3594		creq = NULL;
3595		dev_hold(dev);
3596	}
3597	wiphy_unlock(&rdev->wiphy);
3598 out:
3599	kfree(creq);
3600	return err;
3601}
 
3602
3603static char *ieee80211_scan_add_ies(struct iw_request_info *info,
3604				    const struct cfg80211_bss_ies *ies,
3605				    char *current_ev, char *end_buf)
3606{
3607	const u8 *pos, *end, *next;
3608	struct iw_event iwe;
3609
3610	if (!ies)
3611		return current_ev;
3612
3613	/*
3614	 * If needed, fragment the IEs buffer (at IE boundaries) into short
3615	 * enough fragments to fit into IW_GENERIC_IE_MAX octet messages.
3616	 */
3617	pos = ies->data;
3618	end = pos + ies->len;
3619
3620	while (end - pos > IW_GENERIC_IE_MAX) {
3621		next = pos + 2 + pos[1];
3622		while (next + 2 + next[1] - pos < IW_GENERIC_IE_MAX)
3623			next = next + 2 + next[1];
3624
3625		memset(&iwe, 0, sizeof(iwe));
3626		iwe.cmd = IWEVGENIE;
3627		iwe.u.data.length = next - pos;
3628		current_ev = iwe_stream_add_point_check(info, current_ev,
3629							end_buf, &iwe,
3630							(void *)pos);
3631		if (IS_ERR(current_ev))
3632			return current_ev;
3633		pos = next;
3634	}
3635
3636	if (end > pos) {
3637		memset(&iwe, 0, sizeof(iwe));
3638		iwe.cmd = IWEVGENIE;
3639		iwe.u.data.length = end - pos;
3640		current_ev = iwe_stream_add_point_check(info, current_ev,
3641							end_buf, &iwe,
3642							(void *)pos);
3643		if (IS_ERR(current_ev))
3644			return current_ev;
3645	}
3646
3647	return current_ev;
3648}
3649
3650static char *
3651ieee80211_bss(struct wiphy *wiphy, struct iw_request_info *info,
3652	      struct cfg80211_internal_bss *bss, char *current_ev,
3653	      char *end_buf)
3654{
3655	const struct cfg80211_bss_ies *ies;
3656	struct iw_event iwe;
3657	const u8 *ie;
3658	u8 buf[50];
3659	u8 *cfg, *p, *tmp;
3660	int rem, i, sig;
3661	bool ismesh = false;
3662
3663	memset(&iwe, 0, sizeof(iwe));
3664	iwe.cmd = SIOCGIWAP;
3665	iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
3666	memcpy(iwe.u.ap_addr.sa_data, bss->pub.bssid, ETH_ALEN);
3667	current_ev = iwe_stream_add_event_check(info, current_ev, end_buf, &iwe,
3668						IW_EV_ADDR_LEN);
3669	if (IS_ERR(current_ev))
3670		return current_ev;
3671
3672	memset(&iwe, 0, sizeof(iwe));
3673	iwe.cmd = SIOCGIWFREQ;
3674	iwe.u.freq.m = ieee80211_frequency_to_channel(bss->pub.channel->center_freq);
3675	iwe.u.freq.e = 0;
3676	current_ev = iwe_stream_add_event_check(info, current_ev, end_buf, &iwe,
3677						IW_EV_FREQ_LEN);
3678	if (IS_ERR(current_ev))
3679		return current_ev;
3680
3681	memset(&iwe, 0, sizeof(iwe));
3682	iwe.cmd = SIOCGIWFREQ;
3683	iwe.u.freq.m = bss->pub.channel->center_freq;
3684	iwe.u.freq.e = 6;
3685	current_ev = iwe_stream_add_event_check(info, current_ev, end_buf, &iwe,
3686						IW_EV_FREQ_LEN);
3687	if (IS_ERR(current_ev))
3688		return current_ev;
3689
3690	if (wiphy->signal_type != CFG80211_SIGNAL_TYPE_NONE) {
3691		memset(&iwe, 0, sizeof(iwe));
3692		iwe.cmd = IWEVQUAL;
3693		iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED |
3694				     IW_QUAL_NOISE_INVALID |
3695				     IW_QUAL_QUAL_UPDATED;
3696		switch (wiphy->signal_type) {
3697		case CFG80211_SIGNAL_TYPE_MBM:
3698			sig = bss->pub.signal / 100;
3699			iwe.u.qual.level = sig;
3700			iwe.u.qual.updated |= IW_QUAL_DBM;
3701			if (sig < -110)		/* rather bad */
3702				sig = -110;
3703			else if (sig > -40)	/* perfect */
3704				sig = -40;
3705			/* will give a range of 0 .. 70 */
3706			iwe.u.qual.qual = sig + 110;
3707			break;
3708		case CFG80211_SIGNAL_TYPE_UNSPEC:
3709			iwe.u.qual.level = bss->pub.signal;
3710			/* will give range 0 .. 100 */
3711			iwe.u.qual.qual = bss->pub.signal;
3712			break;
3713		default:
3714			/* not reached */
3715			break;
3716		}
3717		current_ev = iwe_stream_add_event_check(info, current_ev,
3718							end_buf, &iwe,
3719							IW_EV_QUAL_LEN);
3720		if (IS_ERR(current_ev))
3721			return current_ev;
3722	}
3723
3724	memset(&iwe, 0, sizeof(iwe));
3725	iwe.cmd = SIOCGIWENCODE;
3726	if (bss->pub.capability & WLAN_CAPABILITY_PRIVACY)
3727		iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
3728	else
3729		iwe.u.data.flags = IW_ENCODE_DISABLED;
3730	iwe.u.data.length = 0;
3731	current_ev = iwe_stream_add_point_check(info, current_ev, end_buf,
3732						&iwe, "");
3733	if (IS_ERR(current_ev))
3734		return current_ev;
3735
3736	rcu_read_lock();
3737	ies = rcu_dereference(bss->pub.ies);
3738	rem = ies->len;
3739	ie = ies->data;
3740
3741	while (rem >= 2) {
3742		/* invalid data */
3743		if (ie[1] > rem - 2)
3744			break;
3745
3746		switch (ie[0]) {
3747		case WLAN_EID_SSID:
3748			memset(&iwe, 0, sizeof(iwe));
3749			iwe.cmd = SIOCGIWESSID;
3750			iwe.u.data.length = ie[1];
3751			iwe.u.data.flags = 1;
3752			current_ev = iwe_stream_add_point_check(info,
3753								current_ev,
3754								end_buf, &iwe,
3755								(u8 *)ie + 2);
3756			if (IS_ERR(current_ev))
3757				goto unlock;
3758			break;
3759		case WLAN_EID_MESH_ID:
3760			memset(&iwe, 0, sizeof(iwe));
3761			iwe.cmd = SIOCGIWESSID;
3762			iwe.u.data.length = ie[1];
3763			iwe.u.data.flags = 1;
3764			current_ev = iwe_stream_add_point_check(info,
3765								current_ev,
3766								end_buf, &iwe,
3767								(u8 *)ie + 2);
3768			if (IS_ERR(current_ev))
3769				goto unlock;
3770			break;
3771		case WLAN_EID_MESH_CONFIG:
3772			ismesh = true;
3773			if (ie[1] != sizeof(struct ieee80211_meshconf_ie))
3774				break;
3775			cfg = (u8 *)ie + 2;
3776			memset(&iwe, 0, sizeof(iwe));
3777			iwe.cmd = IWEVCUSTOM;
3778			iwe.u.data.length = sprintf(buf,
3779						    "Mesh Network Path Selection Protocol ID: 0x%02X",
3780						    cfg[0]);
3781			current_ev = iwe_stream_add_point_check(info,
3782								current_ev,
3783								end_buf,
3784								&iwe, buf);
3785			if (IS_ERR(current_ev))
3786				goto unlock;
3787			iwe.u.data.length = sprintf(buf,
3788						    "Path Selection Metric ID: 0x%02X",
3789						    cfg[1]);
3790			current_ev = iwe_stream_add_point_check(info,
3791								current_ev,
3792								end_buf,
3793								&iwe, buf);
3794			if (IS_ERR(current_ev))
3795				goto unlock;
3796			iwe.u.data.length = sprintf(buf,
3797						    "Congestion Control Mode ID: 0x%02X",
3798						    cfg[2]);
3799			current_ev = iwe_stream_add_point_check(info,
3800								current_ev,
3801								end_buf,
3802								&iwe, buf);
3803			if (IS_ERR(current_ev))
3804				goto unlock;
3805			iwe.u.data.length = sprintf(buf,
3806						    "Synchronization ID: 0x%02X",
3807						    cfg[3]);
3808			current_ev = iwe_stream_add_point_check(info,
3809								current_ev,
3810								end_buf,
3811								&iwe, buf);
3812			if (IS_ERR(current_ev))
3813				goto unlock;
3814			iwe.u.data.length = sprintf(buf,
3815						    "Authentication ID: 0x%02X",
3816						    cfg[4]);
3817			current_ev = iwe_stream_add_point_check(info,
3818								current_ev,
3819								end_buf,
3820								&iwe, buf);
3821			if (IS_ERR(current_ev))
3822				goto unlock;
3823			iwe.u.data.length = sprintf(buf,
3824						    "Formation Info: 0x%02X",
3825						    cfg[5]);
3826			current_ev = iwe_stream_add_point_check(info,
3827								current_ev,
3828								end_buf,
3829								&iwe, buf);
3830			if (IS_ERR(current_ev))
3831				goto unlock;
3832			iwe.u.data.length = sprintf(buf,
3833						    "Capabilities: 0x%02X",
3834						    cfg[6]);
3835			current_ev = iwe_stream_add_point_check(info,
3836								current_ev,
3837								end_buf,
3838								&iwe, buf);
3839			if (IS_ERR(current_ev))
3840				goto unlock;
3841			break;
3842		case WLAN_EID_SUPP_RATES:
3843		case WLAN_EID_EXT_SUPP_RATES:
3844			/* display all supported rates in readable format */
3845			p = current_ev + iwe_stream_lcp_len(info);
3846
3847			memset(&iwe, 0, sizeof(iwe));
3848			iwe.cmd = SIOCGIWRATE;
3849			/* Those two flags are ignored... */
3850			iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
3851
3852			for (i = 0; i < ie[1]; i++) {
3853				iwe.u.bitrate.value =
3854					((ie[i + 2] & 0x7f) * 500000);
3855				tmp = p;
3856				p = iwe_stream_add_value(info, current_ev, p,
3857							 end_buf, &iwe,
3858							 IW_EV_PARAM_LEN);
3859				if (p == tmp) {
3860					current_ev = ERR_PTR(-E2BIG);
3861					goto unlock;
3862				}
3863			}
3864			current_ev = p;
3865			break;
3866		}
3867		rem -= ie[1] + 2;
3868		ie += ie[1] + 2;
3869	}
3870
3871	if (bss->pub.capability & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS) ||
3872	    ismesh) {
3873		memset(&iwe, 0, sizeof(iwe));
3874		iwe.cmd = SIOCGIWMODE;
3875		if (ismesh)
3876			iwe.u.mode = IW_MODE_MESH;
3877		else if (bss->pub.capability & WLAN_CAPABILITY_ESS)
3878			iwe.u.mode = IW_MODE_MASTER;
3879		else
3880			iwe.u.mode = IW_MODE_ADHOC;
3881		current_ev = iwe_stream_add_event_check(info, current_ev,
3882							end_buf, &iwe,
3883							IW_EV_UINT_LEN);
3884		if (IS_ERR(current_ev))
3885			goto unlock;
3886	}
3887
3888	memset(&iwe, 0, sizeof(iwe));
3889	iwe.cmd = IWEVCUSTOM;
3890	iwe.u.data.length = sprintf(buf, "tsf=%016llx",
3891				    (unsigned long long)(ies->tsf));
3892	current_ev = iwe_stream_add_point_check(info, current_ev, end_buf,
3893						&iwe, buf);
3894	if (IS_ERR(current_ev))
3895		goto unlock;
3896	memset(&iwe, 0, sizeof(iwe));
3897	iwe.cmd = IWEVCUSTOM;
3898	iwe.u.data.length = sprintf(buf, " Last beacon: %ums ago",
3899				    elapsed_jiffies_msecs(bss->ts));
 
3900	current_ev = iwe_stream_add_point_check(info, current_ev,
3901						end_buf, &iwe, buf);
3902	if (IS_ERR(current_ev))
3903		goto unlock;
3904
3905	current_ev = ieee80211_scan_add_ies(info, ies, current_ev, end_buf);
3906
3907 unlock:
3908	rcu_read_unlock();
3909	return current_ev;
3910}
3911
3912
3913static int ieee80211_scan_results(struct cfg80211_registered_device *rdev,
3914				  struct iw_request_info *info,
3915				  char *buf, size_t len)
3916{
3917	char *current_ev = buf;
3918	char *end_buf = buf + len;
3919	struct cfg80211_internal_bss *bss;
3920	int err = 0;
3921
3922	spin_lock_bh(&rdev->bss_lock);
3923	cfg80211_bss_expire(rdev);
3924
3925	list_for_each_entry(bss, &rdev->bss_list, list) {
3926		if (buf + len - current_ev <= IW_EV_ADDR_LEN) {
3927			err = -E2BIG;
3928			break;
3929		}
3930		current_ev = ieee80211_bss(&rdev->wiphy, info, bss,
3931					   current_ev, end_buf);
3932		if (IS_ERR(current_ev)) {
3933			err = PTR_ERR(current_ev);
3934			break;
3935		}
3936	}
3937	spin_unlock_bh(&rdev->bss_lock);
3938
3939	if (err)
3940		return err;
3941	return current_ev - buf;
3942}
3943
3944
3945int cfg80211_wext_giwscan(struct net_device *dev,
3946			  struct iw_request_info *info,
3947			  union iwreq_data *wrqu, char *extra)
3948{
3949	struct iw_point *data = &wrqu->data;
3950	struct cfg80211_registered_device *rdev;
3951	int res;
3952
3953	if (!netif_running(dev))
3954		return -ENETDOWN;
3955
3956	rdev = cfg80211_get_dev_from_ifindex(dev_net(dev), dev->ifindex);
3957
3958	if (IS_ERR(rdev))
3959		return PTR_ERR(rdev);
3960
3961	if (rdev->scan_req || rdev->scan_msg)
3962		return -EAGAIN;
3963
3964	res = ieee80211_scan_results(rdev, info, extra, data->length);
3965	data->length = 0;
3966	if (res >= 0) {
3967		data->length = res;
3968		res = 0;
3969	}
3970
3971	return res;
3972}
 
3973#endif
v4.17
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * cfg80211 scan result handling
   4 *
   5 * Copyright 2008 Johannes Berg <johannes@sipsolutions.net>
   6 * Copyright 2013-2014  Intel Mobile Communications GmbH
   7 * Copyright 2016	Intel Deutschland GmbH
 
   8 */
   9#include <linux/kernel.h>
  10#include <linux/slab.h>
  11#include <linux/module.h>
  12#include <linux/netdevice.h>
  13#include <linux/wireless.h>
  14#include <linux/nl80211.h>
  15#include <linux/etherdevice.h>
 
 
  16#include <net/arp.h>
  17#include <net/cfg80211.h>
  18#include <net/cfg80211-wext.h>
  19#include <net/iw_handler.h>
 
  20#include "core.h"
  21#include "nl80211.h"
  22#include "wext-compat.h"
  23#include "rdev-ops.h"
  24
  25/**
  26 * DOC: BSS tree/list structure
  27 *
  28 * At the top level, the BSS list is kept in both a list in each
  29 * registered device (@bss_list) as well as an RB-tree for faster
  30 * lookup. In the RB-tree, entries can be looked up using their
  31 * channel, MESHID, MESHCONF (for MBSSes) or channel, BSSID, SSID
  32 * for other BSSes.
  33 *
  34 * Due to the possibility of hidden SSIDs, there's a second level
  35 * structure, the "hidden_list" and "hidden_beacon_bss" pointer.
  36 * The hidden_list connects all BSSes belonging to a single AP
  37 * that has a hidden SSID, and connects beacon and probe response
  38 * entries. For a probe response entry for a hidden SSID, the
  39 * hidden_beacon_bss pointer points to the BSS struct holding the
  40 * beacon's information.
  41 *
  42 * Reference counting is done for all these references except for
  43 * the hidden_list, so that a beacon BSS struct that is otherwise
  44 * not referenced has one reference for being on the bss_list and
  45 * one for each probe response entry that points to it using the
  46 * hidden_beacon_bss pointer. When a BSS struct that has such a
  47 * pointer is get/put, the refcount update is also propagated to
  48 * the referenced struct, this ensure that it cannot get removed
  49 * while somebody is using the probe response version.
  50 *
  51 * Note that the hidden_beacon_bss pointer never changes, due to
  52 * the reference counting. Therefore, no locking is needed for
  53 * it.
  54 *
  55 * Also note that the hidden_beacon_bss pointer is only relevant
  56 * if the driver uses something other than the IEs, e.g. private
  57 * data stored stored in the BSS struct, since the beacon IEs are
  58 * also linked into the probe response struct.
  59 */
  60
  61/*
  62 * Limit the number of BSS entries stored in mac80211. Each one is
  63 * a bit over 4k at most, so this limits to roughly 4-5M of memory.
  64 * If somebody wants to really attack this though, they'd likely
  65 * use small beacons, and only one type of frame, limiting each of
  66 * the entries to a much smaller size (in order to generate more
  67 * entries in total, so overhead is bigger.)
  68 */
  69static int bss_entries_limit = 1000;
  70module_param(bss_entries_limit, int, 0644);
  71MODULE_PARM_DESC(bss_entries_limit,
  72                 "limit to number of scan BSS entries (per wiphy, default 1000)");
  73
  74#define IEEE80211_SCAN_RESULT_EXPIRE	(30 * HZ)
  75
  76static void bss_free(struct cfg80211_internal_bss *bss)
  77{
  78	struct cfg80211_bss_ies *ies;
  79
  80	if (WARN_ON(atomic_read(&bss->hold)))
  81		return;
  82
  83	ies = (void *)rcu_access_pointer(bss->pub.beacon_ies);
  84	if (ies && !bss->pub.hidden_beacon_bss)
  85		kfree_rcu(ies, rcu_head);
  86	ies = (void *)rcu_access_pointer(bss->pub.proberesp_ies);
  87	if (ies)
  88		kfree_rcu(ies, rcu_head);
  89
  90	/*
  91	 * This happens when the module is removed, it doesn't
  92	 * really matter any more save for completeness
  93	 */
  94	if (!list_empty(&bss->hidden_list))
  95		list_del(&bss->hidden_list);
  96
  97	kfree(bss);
  98}
  99
 100static inline void bss_ref_get(struct cfg80211_registered_device *rdev,
 101			       struct cfg80211_internal_bss *bss)
 102{
 103	lockdep_assert_held(&rdev->bss_lock);
 104
 105	bss->refcount++;
 106	if (bss->pub.hidden_beacon_bss) {
 107		bss = container_of(bss->pub.hidden_beacon_bss,
 108				   struct cfg80211_internal_bss,
 109				   pub);
 110		bss->refcount++;
 111	}
 112}
 113
 114static inline void bss_ref_put(struct cfg80211_registered_device *rdev,
 115			       struct cfg80211_internal_bss *bss)
 116{
 117	lockdep_assert_held(&rdev->bss_lock);
 118
 119	if (bss->pub.hidden_beacon_bss) {
 120		struct cfg80211_internal_bss *hbss;
 121		hbss = container_of(bss->pub.hidden_beacon_bss,
 122				    struct cfg80211_internal_bss,
 123				    pub);
 124		hbss->refcount--;
 125		if (hbss->refcount == 0)
 126			bss_free(hbss);
 127	}
 
 
 
 
 
 
 
 
 
 
 128	bss->refcount--;
 129	if (bss->refcount == 0)
 130		bss_free(bss);
 131}
 132
 133static bool __cfg80211_unlink_bss(struct cfg80211_registered_device *rdev,
 134				  struct cfg80211_internal_bss *bss)
 135{
 136	lockdep_assert_held(&rdev->bss_lock);
 137
 138	if (!list_empty(&bss->hidden_list)) {
 139		/*
 140		 * don't remove the beacon entry if it has
 141		 * probe responses associated with it
 142		 */
 143		if (!bss->pub.hidden_beacon_bss)
 144			return false;
 145		/*
 146		 * if it's a probe response entry break its
 147		 * link to the other entries in the group
 148		 */
 149		list_del_init(&bss->hidden_list);
 150	}
 151
 152	list_del_init(&bss->list);
 
 153	rb_erase(&bss->rbn, &rdev->bss_tree);
 154	rdev->bss_entries--;
 155	WARN_ONCE((rdev->bss_entries == 0) ^ list_empty(&rdev->bss_list),
 156		  "rdev bss entries[%d]/list[empty:%d] corruption\n",
 157		  rdev->bss_entries, list_empty(&rdev->bss_list));
 158	bss_ref_put(rdev, bss);
 159	return true;
 160}
 161
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 162static void __cfg80211_bss_expire(struct cfg80211_registered_device *rdev,
 163				  unsigned long expire_time)
 164{
 165	struct cfg80211_internal_bss *bss, *tmp;
 166	bool expired = false;
 167
 168	lockdep_assert_held(&rdev->bss_lock);
 169
 170	list_for_each_entry_safe(bss, tmp, &rdev->bss_list, list) {
 171		if (atomic_read(&bss->hold))
 172			continue;
 173		if (!time_after(expire_time, bss->ts))
 174			continue;
 175
 176		if (__cfg80211_unlink_bss(rdev, bss))
 177			expired = true;
 178	}
 179
 180	if (expired)
 181		rdev->bss_generation++;
 182}
 183
 184static bool cfg80211_bss_expire_oldest(struct cfg80211_registered_device *rdev)
 185{
 186	struct cfg80211_internal_bss *bss, *oldest = NULL;
 187	bool ret;
 188
 189	lockdep_assert_held(&rdev->bss_lock);
 190
 191	list_for_each_entry(bss, &rdev->bss_list, list) {
 192		if (atomic_read(&bss->hold))
 193			continue;
 194
 195		if (!list_empty(&bss->hidden_list) &&
 196		    !bss->pub.hidden_beacon_bss)
 197			continue;
 198
 199		if (oldest && time_before(oldest->ts, bss->ts))
 200			continue;
 201		oldest = bss;
 202	}
 203
 204	if (WARN_ON(!oldest))
 205		return false;
 206
 207	/*
 208	 * The callers make sure to increase rdev->bss_generation if anything
 209	 * gets removed (and a new entry added), so there's no need to also do
 210	 * it here.
 211	 */
 212
 213	ret = __cfg80211_unlink_bss(rdev, oldest);
 214	WARN_ON(!ret);
 215	return ret;
 216}
 217
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 218void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev,
 219			   bool send_message)
 220{
 221	struct cfg80211_scan_request *request;
 222	struct wireless_dev *wdev;
 223	struct sk_buff *msg;
 224#ifdef CONFIG_CFG80211_WEXT
 225	union iwreq_data wrqu;
 226#endif
 227
 228	ASSERT_RTNL();
 229
 230	if (rdev->scan_msg) {
 231		nl80211_send_scan_msg(rdev, rdev->scan_msg);
 232		rdev->scan_msg = NULL;
 233		return;
 234	}
 235
 236	request = rdev->scan_req;
 237	if (!request)
 238		return;
 239
 240	wdev = request->wdev;
 
 
 
 
 
 
 
 241
 242	/*
 243	 * This must be before sending the other events!
 244	 * Otherwise, wpa_supplicant gets completely confused with
 245	 * wext events.
 246	 */
 247	if (wdev->netdev)
 248		cfg80211_sme_scan_done(wdev->netdev);
 249
 250	if (!request->info.aborted &&
 251	    request->flags & NL80211_SCAN_FLAG_FLUSH) {
 252		/* flush entries from previous scans */
 253		spin_lock_bh(&rdev->bss_lock);
 254		__cfg80211_bss_expire(rdev, request->scan_start);
 255		spin_unlock_bh(&rdev->bss_lock);
 256	}
 257
 258	msg = nl80211_build_scan_msg(rdev, wdev, request->info.aborted);
 259
 260#ifdef CONFIG_CFG80211_WEXT
 261	if (wdev->netdev && !request->info.aborted) {
 262		memset(&wrqu, 0, sizeof(wrqu));
 263
 264		wireless_send_event(wdev->netdev, SIOCGIWSCAN, &wrqu, NULL);
 265	}
 266#endif
 267
 268	if (wdev->netdev)
 269		dev_put(wdev->netdev);
 
 
 270
 
 271	rdev->scan_req = NULL;
 272	kfree(request);
 273
 274	if (!send_message)
 275		rdev->scan_msg = msg;
 276	else
 277		nl80211_send_scan_msg(rdev, msg);
 278}
 279
 280void __cfg80211_scan_done(struct work_struct *wk)
 281{
 282	struct cfg80211_registered_device *rdev;
 283
 284	rdev = container_of(wk, struct cfg80211_registered_device,
 285			    scan_done_wk);
 286
 287	rtnl_lock();
 288	___cfg80211_scan_done(rdev, true);
 289	rtnl_unlock();
 290}
 291
 292void cfg80211_scan_done(struct cfg80211_scan_request *request,
 293			struct cfg80211_scan_info *info)
 294{
 
 
 295	trace_cfg80211_scan_done(request, info);
 296	WARN_ON(request != wiphy_to_rdev(request->wiphy)->scan_req);
 
 297
 298	request->info = *info;
 
 
 
 
 
 
 
 
 
 
 
 
 299	request->notified = true;
 300	queue_work(cfg80211_wq, &wiphy_to_rdev(request->wiphy)->scan_done_wk);
 
 301}
 302EXPORT_SYMBOL(cfg80211_scan_done);
 303
 304void cfg80211_add_sched_scan_req(struct cfg80211_registered_device *rdev,
 305				 struct cfg80211_sched_scan_request *req)
 306{
 307	ASSERT_RTNL();
 308
 309	list_add_rcu(&req->list, &rdev->sched_scan_req_list);
 310}
 311
 312static void cfg80211_del_sched_scan_req(struct cfg80211_registered_device *rdev,
 313					struct cfg80211_sched_scan_request *req)
 314{
 315	ASSERT_RTNL();
 316
 317	list_del_rcu(&req->list);
 318	kfree_rcu(req, rcu_head);
 319}
 320
 321static struct cfg80211_sched_scan_request *
 322cfg80211_find_sched_scan_req(struct cfg80211_registered_device *rdev, u64 reqid)
 323{
 324	struct cfg80211_sched_scan_request *pos;
 325
 326	WARN_ON_ONCE(!rcu_read_lock_held() && !lockdep_rtnl_is_held());
 327
 328	list_for_each_entry_rcu(pos, &rdev->sched_scan_req_list, list) {
 329		if (pos->reqid == reqid)
 330			return pos;
 331	}
 332	return NULL;
 333}
 334
 335/*
 336 * Determines if a scheduled scan request can be handled. When a legacy
 337 * scheduled scan is running no other scheduled scan is allowed regardless
 338 * whether the request is for legacy or multi-support scan. When a multi-support
 339 * scheduled scan is running a request for legacy scan is not allowed. In this
 340 * case a request for multi-support scan can be handled if resources are
 341 * available, ie. struct wiphy::max_sched_scan_reqs limit is not yet reached.
 342 */
 343int cfg80211_sched_scan_req_possible(struct cfg80211_registered_device *rdev,
 344				     bool want_multi)
 345{
 346	struct cfg80211_sched_scan_request *pos;
 347	int i = 0;
 348
 349	list_for_each_entry(pos, &rdev->sched_scan_req_list, list) {
 350		/* request id zero means legacy in progress */
 351		if (!i && !pos->reqid)
 352			return -EINPROGRESS;
 353		i++;
 354	}
 355
 356	if (i) {
 357		/* no legacy allowed when multi request(s) are active */
 358		if (!want_multi)
 359			return -EINPROGRESS;
 360
 361		/* resource limit reached */
 362		if (i == rdev->wiphy.max_sched_scan_reqs)
 363			return -ENOSPC;
 364	}
 365	return 0;
 366}
 367
 368void cfg80211_sched_scan_results_wk(struct work_struct *work)
 369{
 370	struct cfg80211_registered_device *rdev;
 371	struct cfg80211_sched_scan_request *req, *tmp;
 372
 373	rdev = container_of(work, struct cfg80211_registered_device,
 374			   sched_scan_res_wk);
 375
 376	rtnl_lock();
 377	list_for_each_entry_safe(req, tmp, &rdev->sched_scan_req_list, list) {
 378		if (req->report_results) {
 379			req->report_results = false;
 380			if (req->flags & NL80211_SCAN_FLAG_FLUSH) {
 381				/* flush entries from previous scans */
 382				spin_lock_bh(&rdev->bss_lock);
 383				__cfg80211_bss_expire(rdev, req->scan_start);
 384				spin_unlock_bh(&rdev->bss_lock);
 385				req->scan_start = jiffies;
 386			}
 387			nl80211_send_sched_scan(req,
 388						NL80211_CMD_SCHED_SCAN_RESULTS);
 389		}
 390	}
 391	rtnl_unlock();
 392}
 393
 394void cfg80211_sched_scan_results(struct wiphy *wiphy, u64 reqid)
 395{
 396	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 397	struct cfg80211_sched_scan_request *request;
 398
 399	trace_cfg80211_sched_scan_results(wiphy, reqid);
 400	/* ignore if we're not scanning */
 401
 402	rcu_read_lock();
 403	request = cfg80211_find_sched_scan_req(rdev, reqid);
 404	if (request) {
 405		request->report_results = true;
 406		queue_work(cfg80211_wq, &rdev->sched_scan_res_wk);
 407	}
 408	rcu_read_unlock();
 409}
 410EXPORT_SYMBOL(cfg80211_sched_scan_results);
 411
 412void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy, u64 reqid)
 413{
 414	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 415
 416	ASSERT_RTNL();
 417
 418	trace_cfg80211_sched_scan_stopped(wiphy, reqid);
 419
 420	__cfg80211_stop_sched_scan(rdev, reqid, true);
 421}
 422EXPORT_SYMBOL(cfg80211_sched_scan_stopped_rtnl);
 423
 424void cfg80211_sched_scan_stopped(struct wiphy *wiphy, u64 reqid)
 425{
 426	rtnl_lock();
 427	cfg80211_sched_scan_stopped_rtnl(wiphy, reqid);
 428	rtnl_unlock();
 429}
 430EXPORT_SYMBOL(cfg80211_sched_scan_stopped);
 431
 432int cfg80211_stop_sched_scan_req(struct cfg80211_registered_device *rdev,
 433				 struct cfg80211_sched_scan_request *req,
 434				 bool driver_initiated)
 435{
 436	ASSERT_RTNL();
 437
 438	if (!driver_initiated) {
 439		int err = rdev_sched_scan_stop(rdev, req->dev, req->reqid);
 440		if (err)
 441			return err;
 442	}
 443
 444	nl80211_send_sched_scan(req, NL80211_CMD_SCHED_SCAN_STOPPED);
 445
 446	cfg80211_del_sched_scan_req(rdev, req);
 447
 448	return 0;
 449}
 450
 451int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
 452			       u64 reqid, bool driver_initiated)
 453{
 454	struct cfg80211_sched_scan_request *sched_scan_req;
 455
 456	ASSERT_RTNL();
 457
 458	sched_scan_req = cfg80211_find_sched_scan_req(rdev, reqid);
 459	if (!sched_scan_req)
 460		return -ENOENT;
 461
 462	return cfg80211_stop_sched_scan_req(rdev, sched_scan_req,
 463					    driver_initiated);
 464}
 465
 466void cfg80211_bss_age(struct cfg80211_registered_device *rdev,
 467                      unsigned long age_secs)
 468{
 469	struct cfg80211_internal_bss *bss;
 470	unsigned long age_jiffies = msecs_to_jiffies(age_secs * MSEC_PER_SEC);
 471
 472	spin_lock_bh(&rdev->bss_lock);
 473	list_for_each_entry(bss, &rdev->bss_list, list)
 474		bss->ts -= age_jiffies;
 475	spin_unlock_bh(&rdev->bss_lock);
 476}
 477
 478void cfg80211_bss_expire(struct cfg80211_registered_device *rdev)
 479{
 480	__cfg80211_bss_expire(rdev, jiffies - IEEE80211_SCAN_RESULT_EXPIRE);
 481}
 482
 483const u8 *cfg80211_find_ie_match(u8 eid, const u8 *ies, int len,
 484				 const u8 *match, int match_len,
 485				 int match_offset)
 486{
 487	/* match_offset can't be smaller than 2, unless match_len is
 488	 * zero, in which case match_offset must be zero as well.
 489	 */
 490	if (WARN_ON((match_len && match_offset < 2) ||
 491		    (!match_len && match_offset)))
 492		return NULL;
 493
 494	while (len >= 2 && len >= ies[1] + 2) {
 495		if ((ies[0] == eid) &&
 496		    (ies[1] + 2 >= match_offset + match_len) &&
 497		    !memcmp(ies + match_offset, match, match_len))
 498			return ies;
 499
 500		len -= ies[1] + 2;
 501		ies += ies[1] + 2;
 
 
 
 
 
 
 
 
 
 502	}
 503
 504	return NULL;
 505}
 506EXPORT_SYMBOL(cfg80211_find_ie_match);
 507
 508const u8 *cfg80211_find_vendor_ie(unsigned int oui, int oui_type,
 509				  const u8 *ies, int len)
 
 510{
 511	const u8 *ie;
 512	u8 match[] = { oui >> 16, oui >> 8, oui, oui_type };
 513	int match_len = (oui_type < 0) ? 3 : sizeof(match);
 514
 515	if (WARN_ON(oui_type > 0xff))
 516		return NULL;
 517
 518	ie = cfg80211_find_ie_match(WLAN_EID_VENDOR_SPECIFIC, ies, len,
 519				    match, match_len, 2);
 520
 521	if (ie && (ie[1] < 4))
 522		return NULL;
 523
 524	return ie;
 525}
 526EXPORT_SYMBOL(cfg80211_find_vendor_ie);
 527
 528static bool is_bss(struct cfg80211_bss *a, const u8 *bssid,
 529		   const u8 *ssid, size_t ssid_len)
 530{
 531	const struct cfg80211_bss_ies *ies;
 532	const u8 *ssidie;
 533
 534	if (bssid && !ether_addr_equal(a->bssid, bssid))
 535		return false;
 536
 537	if (!ssid)
 538		return true;
 539
 540	ies = rcu_access_pointer(a->ies);
 541	if (!ies)
 542		return false;
 543	ssidie = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len);
 544	if (!ssidie)
 545		return false;
 546	if (ssidie[1] != ssid_len)
 547		return false;
 548	return memcmp(ssidie + 2, ssid, ssid_len) == 0;
 549}
 
 550
 551/**
 552 * enum bss_compare_mode - BSS compare mode
 553 * @BSS_CMP_REGULAR: regular compare mode (for insertion and normal find)
 554 * @BSS_CMP_HIDE_ZLEN: find hidden SSID with zero-length mode
 555 * @BSS_CMP_HIDE_NUL: find hidden SSID with NUL-ed out mode
 556 */
 557enum bss_compare_mode {
 558	BSS_CMP_REGULAR,
 559	BSS_CMP_HIDE_ZLEN,
 560	BSS_CMP_HIDE_NUL,
 561};
 562
 563static int cmp_bss(struct cfg80211_bss *a,
 564		   struct cfg80211_bss *b,
 565		   enum bss_compare_mode mode)
 566{
 567	const struct cfg80211_bss_ies *a_ies, *b_ies;
 568	const u8 *ie1 = NULL;
 569	const u8 *ie2 = NULL;
 570	int i, r;
 571
 572	if (a->channel != b->channel)
 573		return b->channel->center_freq - a->channel->center_freq;
 
 574
 575	a_ies = rcu_access_pointer(a->ies);
 576	if (!a_ies)
 577		return -1;
 578	b_ies = rcu_access_pointer(b->ies);
 579	if (!b_ies)
 580		return 1;
 581
 582	if (WLAN_CAPABILITY_IS_STA_BSS(a->capability))
 583		ie1 = cfg80211_find_ie(WLAN_EID_MESH_ID,
 584				       a_ies->data, a_ies->len);
 585	if (WLAN_CAPABILITY_IS_STA_BSS(b->capability))
 586		ie2 = cfg80211_find_ie(WLAN_EID_MESH_ID,
 587				       b_ies->data, b_ies->len);
 588	if (ie1 && ie2) {
 589		int mesh_id_cmp;
 590
 591		if (ie1[1] == ie2[1])
 592			mesh_id_cmp = memcmp(ie1 + 2, ie2 + 2, ie1[1]);
 593		else
 594			mesh_id_cmp = ie2[1] - ie1[1];
 595
 596		ie1 = cfg80211_find_ie(WLAN_EID_MESH_CONFIG,
 597				       a_ies->data, a_ies->len);
 598		ie2 = cfg80211_find_ie(WLAN_EID_MESH_CONFIG,
 599				       b_ies->data, b_ies->len);
 600		if (ie1 && ie2) {
 601			if (mesh_id_cmp)
 602				return mesh_id_cmp;
 603			if (ie1[1] != ie2[1])
 604				return ie2[1] - ie1[1];
 605			return memcmp(ie1 + 2, ie2 + 2, ie1[1]);
 606		}
 607	}
 608
 609	r = memcmp(a->bssid, b->bssid, sizeof(a->bssid));
 610	if (r)
 611		return r;
 612
 613	ie1 = cfg80211_find_ie(WLAN_EID_SSID, a_ies->data, a_ies->len);
 614	ie2 = cfg80211_find_ie(WLAN_EID_SSID, b_ies->data, b_ies->len);
 615
 616	if (!ie1 && !ie2)
 617		return 0;
 618
 619	/*
 620	 * Note that with "hide_ssid", the function returns a match if
 621	 * the already-present BSS ("b") is a hidden SSID beacon for
 622	 * the new BSS ("a").
 623	 */
 624
 625	/* sort missing IE before (left of) present IE */
 626	if (!ie1)
 627		return -1;
 628	if (!ie2)
 629		return 1;
 630
 631	switch (mode) {
 632	case BSS_CMP_HIDE_ZLEN:
 633		/*
 634		 * In ZLEN mode we assume the BSS entry we're
 635		 * looking for has a zero-length SSID. So if
 636		 * the one we're looking at right now has that,
 637		 * return 0. Otherwise, return the difference
 638		 * in length, but since we're looking for the
 639		 * 0-length it's really equivalent to returning
 640		 * the length of the one we're looking at.
 641		 *
 642		 * No content comparison is needed as we assume
 643		 * the content length is zero.
 644		 */
 645		return ie2[1];
 646	case BSS_CMP_REGULAR:
 647	default:
 648		/* sort by length first, then by contents */
 649		if (ie1[1] != ie2[1])
 650			return ie2[1] - ie1[1];
 651		return memcmp(ie1 + 2, ie2 + 2, ie1[1]);
 652	case BSS_CMP_HIDE_NUL:
 653		if (ie1[1] != ie2[1])
 654			return ie2[1] - ie1[1];
 655		/* this is equivalent to memcmp(zeroes, ie2 + 2, len) */
 656		for (i = 0; i < ie2[1]; i++)
 657			if (ie2[i + 2])
 658				return -1;
 659		return 0;
 660	}
 661}
 662
 663static bool cfg80211_bss_type_match(u16 capability,
 664				    enum nl80211_band band,
 665				    enum ieee80211_bss_type bss_type)
 666{
 667	bool ret = true;
 668	u16 mask, val;
 669
 670	if (bss_type == IEEE80211_BSS_TYPE_ANY)
 671		return ret;
 672
 673	if (band == NL80211_BAND_60GHZ) {
 674		mask = WLAN_CAPABILITY_DMG_TYPE_MASK;
 675		switch (bss_type) {
 676		case IEEE80211_BSS_TYPE_ESS:
 677			val = WLAN_CAPABILITY_DMG_TYPE_AP;
 678			break;
 679		case IEEE80211_BSS_TYPE_PBSS:
 680			val = WLAN_CAPABILITY_DMG_TYPE_PBSS;
 681			break;
 682		case IEEE80211_BSS_TYPE_IBSS:
 683			val = WLAN_CAPABILITY_DMG_TYPE_IBSS;
 684			break;
 685		default:
 686			return false;
 687		}
 688	} else {
 689		mask = WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS;
 690		switch (bss_type) {
 691		case IEEE80211_BSS_TYPE_ESS:
 692			val = WLAN_CAPABILITY_ESS;
 693			break;
 694		case IEEE80211_BSS_TYPE_IBSS:
 695			val = WLAN_CAPABILITY_IBSS;
 696			break;
 697		case IEEE80211_BSS_TYPE_MBSS:
 698			val = 0;
 699			break;
 700		default:
 701			return false;
 702		}
 703	}
 704
 705	ret = ((capability & mask) == val);
 706	return ret;
 707}
 708
 709/* Returned bss is reference counted and must be cleaned up appropriately. */
 710struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
 711				      struct ieee80211_channel *channel,
 712				      const u8 *bssid,
 713				      const u8 *ssid, size_t ssid_len,
 714				      enum ieee80211_bss_type bss_type,
 715				      enum ieee80211_privacy privacy)
 
 716{
 717	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 718	struct cfg80211_internal_bss *bss, *res = NULL;
 719	unsigned long now = jiffies;
 720	int bss_privacy;
 721
 722	trace_cfg80211_get_bss(wiphy, channel, bssid, ssid, ssid_len, bss_type,
 723			       privacy);
 724
 725	spin_lock_bh(&rdev->bss_lock);
 726
 727	list_for_each_entry(bss, &rdev->bss_list, list) {
 728		if (!cfg80211_bss_type_match(bss->pub.capability,
 729					     bss->pub.channel->band, bss_type))
 730			continue;
 731
 732		bss_privacy = (bss->pub.capability & WLAN_CAPABILITY_PRIVACY);
 733		if ((privacy == IEEE80211_PRIVACY_ON && !bss_privacy) ||
 734		    (privacy == IEEE80211_PRIVACY_OFF && bss_privacy))
 735			continue;
 736		if (channel && bss->pub.channel != channel)
 737			continue;
 738		if (!is_valid_ether_addr(bss->pub.bssid))
 739			continue;
 
 
 740		/* Don't get expired BSS structs */
 741		if (time_after(now, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE) &&
 742		    !atomic_read(&bss->hold))
 743			continue;
 744		if (is_bss(&bss->pub, bssid, ssid, ssid_len)) {
 745			res = bss;
 746			bss_ref_get(rdev, res);
 747			break;
 748		}
 749	}
 750
 751	spin_unlock_bh(&rdev->bss_lock);
 752	if (!res)
 753		return NULL;
 754	trace_cfg80211_return_bss(&res->pub);
 755	return &res->pub;
 756}
 757EXPORT_SYMBOL(cfg80211_get_bss);
 758
 759static void rb_insert_bss(struct cfg80211_registered_device *rdev,
 760			  struct cfg80211_internal_bss *bss)
 761{
 762	struct rb_node **p = &rdev->bss_tree.rb_node;
 763	struct rb_node *parent = NULL;
 764	struct cfg80211_internal_bss *tbss;
 765	int cmp;
 766
 767	while (*p) {
 768		parent = *p;
 769		tbss = rb_entry(parent, struct cfg80211_internal_bss, rbn);
 770
 771		cmp = cmp_bss(&bss->pub, &tbss->pub, BSS_CMP_REGULAR);
 772
 773		if (WARN_ON(!cmp)) {
 774			/* will sort of leak this BSS */
 775			return;
 776		}
 777
 778		if (cmp < 0)
 779			p = &(*p)->rb_left;
 780		else
 781			p = &(*p)->rb_right;
 782	}
 783
 784	rb_link_node(&bss->rbn, parent, p);
 785	rb_insert_color(&bss->rbn, &rdev->bss_tree);
 
 786}
 787
 788static struct cfg80211_internal_bss *
 789rb_find_bss(struct cfg80211_registered_device *rdev,
 790	    struct cfg80211_internal_bss *res,
 791	    enum bss_compare_mode mode)
 792{
 793	struct rb_node *n = rdev->bss_tree.rb_node;
 794	struct cfg80211_internal_bss *bss;
 795	int r;
 796
 797	while (n) {
 798		bss = rb_entry(n, struct cfg80211_internal_bss, rbn);
 799		r = cmp_bss(&res->pub, &bss->pub, mode);
 800
 801		if (r == 0)
 802			return bss;
 803		else if (r < 0)
 804			n = n->rb_left;
 805		else
 806			n = n->rb_right;
 807	}
 808
 809	return NULL;
 810}
 811
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 812static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev,
 813				   struct cfg80211_internal_bss *new)
 814{
 815	const struct cfg80211_bss_ies *ies;
 816	struct cfg80211_internal_bss *bss;
 817	const u8 *ie;
 818	int i, ssidlen;
 819	u8 fold = 0;
 820	u32 n_entries = 0;
 821
 822	ies = rcu_access_pointer(new->pub.beacon_ies);
 823	if (WARN_ON(!ies))
 824		return false;
 825
 826	ie = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len);
 827	if (!ie) {
 828		/* nothing to do */
 829		return true;
 830	}
 831
 832	ssidlen = ie[1];
 833	for (i = 0; i < ssidlen; i++)
 834		fold |= ie[2 + i];
 835
 836	if (fold) {
 837		/* not a hidden SSID */
 838		return true;
 839	}
 840
 841	/* This is the bad part ... */
 842
 843	list_for_each_entry(bss, &rdev->bss_list, list) {
 844		/*
 845		 * we're iterating all the entries anyway, so take the
 846		 * opportunity to validate the list length accounting
 847		 */
 848		n_entries++;
 849
 850		if (!ether_addr_equal(bss->pub.bssid, new->pub.bssid))
 851			continue;
 852		if (bss->pub.channel != new->pub.channel)
 853			continue;
 854		if (bss->pub.scan_width != new->pub.scan_width)
 855			continue;
 856		if (rcu_access_pointer(bss->pub.beacon_ies))
 857			continue;
 858		ies = rcu_access_pointer(bss->pub.ies);
 859		if (!ies)
 860			continue;
 861		ie = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len);
 862		if (!ie)
 863			continue;
 864		if (ssidlen && ie[1] != ssidlen)
 865			continue;
 866		if (WARN_ON_ONCE(bss->pub.hidden_beacon_bss))
 867			continue;
 868		if (WARN_ON_ONCE(!list_empty(&bss->hidden_list)))
 869			list_del(&bss->hidden_list);
 870		/* combine them */
 871		list_add(&bss->hidden_list, &new->hidden_list);
 872		bss->pub.hidden_beacon_bss = &new->pub;
 873		new->refcount += bss->refcount;
 874		rcu_assign_pointer(bss->pub.beacon_ies,
 875				   new->pub.beacon_ies);
 876	}
 877
 878	WARN_ONCE(n_entries != rdev->bss_entries,
 879		  "rdev bss entries[%d]/list[len:%d] corruption\n",
 880		  rdev->bss_entries, n_entries);
 881
 882	return true;
 883}
 884
 885/* Returned bss is reference counted and must be cleaned up appropriately. */
 886static struct cfg80211_internal_bss *
 887cfg80211_bss_update(struct cfg80211_registered_device *rdev,
 888		    struct cfg80211_internal_bss *tmp,
 889		    bool signal_valid)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 890{
 891	struct cfg80211_internal_bss *found = NULL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 892
 893	if (WARN_ON(!tmp->pub.channel))
 894		return NULL;
 
 895
 896	tmp->ts = jiffies;
 
 897
 898	spin_lock_bh(&rdev->bss_lock);
 
 
 
 
 
 
 899
 900	if (WARN_ON(!rcu_access_pointer(tmp->pub.ies))) {
 901		spin_unlock_bh(&rdev->bss_lock);
 902		return NULL;
 
 
 
 
 
 
 
 
 
 
 
 
 903	}
 904
 905	found = rb_find_bss(rdev, tmp, BSS_CMP_REGULAR);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 906
 907	if (found) {
 908		/* Update IEs */
 909		if (rcu_access_pointer(tmp->pub.proberesp_ies)) {
 910			const struct cfg80211_bss_ies *old;
 911
 912			old = rcu_access_pointer(found->pub.proberesp_ies);
 913
 914			rcu_assign_pointer(found->pub.proberesp_ies,
 915					   tmp->pub.proberesp_ies);
 916			/* Override possible earlier Beacon frame IEs */
 917			rcu_assign_pointer(found->pub.ies,
 918					   tmp->pub.proberesp_ies);
 919			if (old)
 920				kfree_rcu((struct cfg80211_bss_ies *)old,
 921					  rcu_head);
 922		} else if (rcu_access_pointer(tmp->pub.beacon_ies)) {
 923			const struct cfg80211_bss_ies *old;
 924			struct cfg80211_internal_bss *bss;
 925
 926			if (found->pub.hidden_beacon_bss &&
 927			    !list_empty(&found->hidden_list)) {
 928				const struct cfg80211_bss_ies *f;
 929
 930				/*
 931				 * The found BSS struct is one of the probe
 932				 * response members of a group, but we're
 933				 * receiving a beacon (beacon_ies in the tmp
 934				 * bss is used). This can only mean that the
 935				 * AP changed its beacon from not having an
 936				 * SSID to showing it, which is confusing so
 937				 * drop this information.
 938				 */
 939
 940				f = rcu_access_pointer(tmp->pub.beacon_ies);
 941				kfree_rcu((struct cfg80211_bss_ies *)f,
 942					  rcu_head);
 943				goto drop;
 944			}
 945
 946			old = rcu_access_pointer(found->pub.beacon_ies);
 
 
 947
 948			rcu_assign_pointer(found->pub.beacon_ies,
 949					   tmp->pub.beacon_ies);
 950
 951			/* Override IEs if they were from a beacon before */
 952			if (old == rcu_access_pointer(found->pub.ies))
 953				rcu_assign_pointer(found->pub.ies,
 954						   tmp->pub.beacon_ies);
 955
 956			/* Assign beacon IEs to all sub entries */
 957			list_for_each_entry(bss, &found->hidden_list,
 958					    hidden_list) {
 959				const struct cfg80211_bss_ies *ies;
 
 
 
 
 
 
 
 
 
 960
 961				ies = rcu_access_pointer(bss->pub.beacon_ies);
 962				WARN_ON(ies != old);
 963
 964				rcu_assign_pointer(bss->pub.beacon_ies,
 965						   tmp->pub.beacon_ies);
 966			}
 
 
 
 
 
 
 
 
 
 
 
 
 
 967
 968			if (old)
 969				kfree_rcu((struct cfg80211_bss_ies *)old,
 970					  rcu_head);
 971		}
 972
 973		found->pub.beacon_interval = tmp->pub.beacon_interval;
 974		/*
 975		 * don't update the signal if beacon was heard on
 976		 * adjacent channel.
 977		 */
 978		if (signal_valid)
 979			found->pub.signal = tmp->pub.signal;
 980		found->pub.capability = tmp->pub.capability;
 981		found->ts = tmp->ts;
 982		found->ts_boottime = tmp->ts_boottime;
 983		found->parent_tsf = tmp->parent_tsf;
 984		found->pub.chains = tmp->pub.chains;
 985		memcpy(found->pub.chain_signal, tmp->pub.chain_signal,
 986		       IEEE80211_MAX_CHAINS);
 987		ether_addr_copy(found->parent_bssid, tmp->parent_bssid);
 988	} else {
 989		struct cfg80211_internal_bss *new;
 990		struct cfg80211_internal_bss *hidden;
 991		struct cfg80211_bss_ies *ies;
 992
 993		/*
 994		 * create a copy -- the "res" variable that is passed in
 995		 * is allocated on the stack since it's not needed in the
 996		 * more common case of an update
 997		 */
 998		new = kzalloc(sizeof(*new) + rdev->wiphy.bss_priv_size,
 999			      GFP_ATOMIC);
1000		if (!new) {
1001			ies = (void *)rcu_dereference(tmp->pub.beacon_ies);
1002			if (ies)
1003				kfree_rcu(ies, rcu_head);
1004			ies = (void *)rcu_dereference(tmp->pub.proberesp_ies);
1005			if (ies)
1006				kfree_rcu(ies, rcu_head);
1007			goto drop;
1008		}
1009		memcpy(new, tmp, sizeof(*new));
1010		new->refcount = 1;
1011		INIT_LIST_HEAD(&new->hidden_list);
 
 
 
1012
1013		if (rcu_access_pointer(tmp->pub.proberesp_ies)) {
1014			hidden = rb_find_bss(rdev, tmp, BSS_CMP_HIDE_ZLEN);
1015			if (!hidden)
1016				hidden = rb_find_bss(rdev, tmp,
1017						     BSS_CMP_HIDE_NUL);
1018			if (hidden) {
1019				new->pub.hidden_beacon_bss = &hidden->pub;
1020				list_add(&new->hidden_list,
1021					 &hidden->hidden_list);
1022				hidden->refcount++;
 
 
1023				rcu_assign_pointer(new->pub.beacon_ies,
1024						   hidden->pub.beacon_ies);
 
 
1025			}
1026		} else {
1027			/*
1028			 * Ok so we found a beacon, and don't have an entry. If
1029			 * it's a beacon with hidden SSID, we might be in for an
1030			 * expensive search for any probe responses that should
1031			 * be grouped with this beacon for updates ...
1032			 */
1033			if (!cfg80211_combine_bsses(rdev, new)) {
1034				kfree(new);
1035				goto drop;
1036			}
1037		}
1038
1039		if (rdev->bss_entries >= bss_entries_limit &&
1040		    !cfg80211_bss_expire_oldest(rdev)) {
1041			kfree(new);
1042			goto drop;
 
 
 
 
 
 
1043		}
1044
1045		list_add_tail(&new->list, &rdev->bss_list);
1046		rdev->bss_entries++;
1047		rb_insert_bss(rdev, new);
1048		found = new;
1049	}
1050
1051	rdev->bss_generation++;
1052	bss_ref_get(rdev, found);
1053	spin_unlock_bh(&rdev->bss_lock);
1054
1055	return found;
1056 drop:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1057	spin_unlock_bh(&rdev->bss_lock);
1058	return NULL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1059}
 
1060
 
 
 
 
 
 
 
 
1061static struct ieee80211_channel *
1062cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,
1063			 struct ieee80211_channel *channel)
1064{
1065	const u8 *tmp;
1066	u32 freq;
1067	int channel_number = -1;
 
 
 
 
 
 
 
 
 
1068
1069	tmp = cfg80211_find_ie(WLAN_EID_DS_PARAMS, ie, ielen);
1070	if (tmp && tmp[1] == 1) {
1071		channel_number = tmp[2];
1072	} else {
1073		tmp = cfg80211_find_ie(WLAN_EID_HT_OPERATION, ie, ielen);
1074		if (tmp && tmp[1] >= sizeof(struct ieee80211_ht_operation)) {
1075			struct ieee80211_ht_operation *htop = (void *)(tmp + 2);
 
1076
1077			channel_number = htop->primary_chan;
 
 
 
 
 
 
 
 
 
 
1078		}
1079	}
1080
1081	if (channel_number < 0)
1082		return channel;
 
1083
1084	freq = ieee80211_channel_to_frequency(channel_number, channel->band);
1085	channel = ieee80211_get_channel(wiphy, freq);
1086	if (!channel)
 
 
1087		return NULL;
1088	if (channel->flags & IEEE80211_CHAN_DISABLED)
1089		return NULL;
1090	return channel;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1091}
1092
1093/* Returned bss is reference counted and must be cleaned up appropriately. */
1094struct cfg80211_bss *
1095cfg80211_inform_bss_data(struct wiphy *wiphy,
1096			 struct cfg80211_inform_bss *data,
1097			 enum cfg80211_bss_frame_type ftype,
1098			 const u8 *bssid, u64 tsf, u16 capability,
1099			 u16 beacon_interval, const u8 *ie, size_t ielen,
1100			 gfp_t gfp)
1101{
 
 
1102	struct cfg80211_bss_ies *ies;
1103	struct ieee80211_channel *channel;
1104	struct cfg80211_internal_bss tmp = {}, *res;
1105	int bss_type;
1106	bool signal_valid;
 
1107
1108	if (WARN_ON(!wiphy))
1109		return NULL;
1110
1111	if (WARN_ON(wiphy->signal_type == CFG80211_SIGNAL_TYPE_UNSPEC &&
1112		    (data->signal < 0 || data->signal > 100)))
 
 
 
1113		return NULL;
1114
1115	channel = cfg80211_get_bss_channel(wiphy, ie, ielen, data->chan);
 
 
 
1116	if (!channel)
1117		return NULL;
1118
1119	memcpy(tmp.pub.bssid, bssid, ETH_ALEN);
 
 
 
 
 
 
 
 
1120	tmp.pub.channel = channel;
1121	tmp.pub.scan_width = data->scan_width;
1122	tmp.pub.signal = data->signal;
1123	tmp.pub.beacon_interval = beacon_interval;
1124	tmp.pub.capability = capability;
1125	tmp.ts_boottime = data->boottime_ns;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1126
1127	/*
1128	 * If we do not know here whether the IEs are from a Beacon or Probe
1129	 * Response frame, we need to pick one of the options and only use it
1130	 * with the driver that does not provide the full Beacon/Probe Response
1131	 * frame. Use Beacon frame pointer to avoid indicating that this should
1132	 * override the IEs pointer should we have received an earlier
1133	 * indication of Probe Response data.
1134	 */
1135	ies = kzalloc(sizeof(*ies) + ielen, gfp);
1136	if (!ies)
1137		return NULL;
1138	ies->len = ielen;
1139	ies->tsf = tsf;
1140	ies->from_beacon = false;
1141	memcpy(ies->data, ie, ielen);
1142
1143	switch (ftype) {
1144	case CFG80211_BSS_FTYPE_BEACON:
 
1145		ies->from_beacon = true;
1146		/* fall through to assign */
1147	case CFG80211_BSS_FTYPE_UNKNOWN:
1148		rcu_assign_pointer(tmp.pub.beacon_ies, ies);
1149		break;
1150	case CFG80211_BSS_FTYPE_PRESP:
1151		rcu_assign_pointer(tmp.pub.proberesp_ies, ies);
1152		break;
1153	}
1154	rcu_assign_pointer(tmp.pub.ies, ies);
1155
1156	signal_valid = abs(data->chan->center_freq - channel->center_freq) <=
1157		wiphy->max_adj_channel_rssi_comp;
1158	res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid);
1159	if (!res)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1160		return NULL;
1161
1162	if (channel->band == NL80211_BAND_60GHZ) {
1163		bss_type = res->pub.capability & WLAN_CAPABILITY_DMG_TYPE_MASK;
1164		if (bss_type == WLAN_CAPABILITY_DMG_TYPE_AP ||
1165		    bss_type == WLAN_CAPABILITY_DMG_TYPE_PBSS)
1166			regulatory_hint_found_beacon(wiphy, channel, gfp);
 
 
 
 
 
 
 
 
 
 
 
 
1167	} else {
1168		if (res->pub.capability & WLAN_CAPABILITY_ESS)
1169			regulatory_hint_found_beacon(wiphy, channel, gfp);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1170	}
1171
1172	trace_cfg80211_return_bss(&res->pub);
1173	/* cfg80211_bss_update gives us a referenced result */
1174	return &res->pub;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1175}
1176EXPORT_SYMBOL(cfg80211_inform_bss_data);
1177
1178/* cfg80211_inform_bss_width_frame helper */
1179struct cfg80211_bss *
1180cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
1181			       struct cfg80211_inform_bss *data,
1182			       struct ieee80211_mgmt *mgmt, size_t len,
1183			       gfp_t gfp)
1184
1185{
1186	struct cfg80211_internal_bss tmp = {}, *res;
1187	struct cfg80211_bss_ies *ies;
1188	struct ieee80211_channel *channel;
1189	bool signal_valid;
1190	size_t ielen = len - offsetof(struct ieee80211_mgmt,
1191				      u.probe_resp.variable);
1192	int bss_type;
1193
1194	BUILD_BUG_ON(offsetof(struct ieee80211_mgmt, u.probe_resp.variable) !=
1195			offsetof(struct ieee80211_mgmt, u.beacon.variable));
1196
1197	trace_cfg80211_inform_bss_frame(wiphy, data, mgmt, len);
1198
1199	if (WARN_ON(!mgmt))
1200		return NULL;
1201
1202	if (WARN_ON(!wiphy))
1203		return NULL;
1204
1205	if (WARN_ON(wiphy->signal_type == CFG80211_SIGNAL_TYPE_UNSPEC &&
1206		    (data->signal < 0 || data->signal > 100)))
1207		return NULL;
1208
1209	if (WARN_ON(len < offsetof(struct ieee80211_mgmt, u.probe_resp.variable)))
1210		return NULL;
1211
1212	channel = cfg80211_get_bss_channel(wiphy, mgmt->u.beacon.variable,
1213					   ielen, data->chan);
1214	if (!channel)
1215		return NULL;
 
 
 
 
 
 
 
 
 
1216
1217	ies = kzalloc(sizeof(*ies) + ielen, gfp);
1218	if (!ies)
1219		return NULL;
1220	ies->len = ielen;
1221	ies->tsf = le64_to_cpu(mgmt->u.probe_resp.timestamp);
1222	ies->from_beacon = ieee80211_is_beacon(mgmt->frame_control);
1223	memcpy(ies->data, mgmt->u.probe_resp.variable, ielen);
1224
1225	if (ieee80211_is_probe_resp(mgmt->frame_control))
1226		rcu_assign_pointer(tmp.pub.proberesp_ies, ies);
1227	else
1228		rcu_assign_pointer(tmp.pub.beacon_ies, ies);
1229	rcu_assign_pointer(tmp.pub.ies, ies);
1230
1231	memcpy(tmp.pub.bssid, mgmt->bssid, ETH_ALEN);
1232	tmp.pub.channel = channel;
1233	tmp.pub.scan_width = data->scan_width;
1234	tmp.pub.signal = data->signal;
1235	tmp.pub.beacon_interval = le16_to_cpu(mgmt->u.probe_resp.beacon_int);
1236	tmp.pub.capability = le16_to_cpu(mgmt->u.probe_resp.capab_info);
1237	tmp.ts_boottime = data->boottime_ns;
1238	tmp.parent_tsf = data->parent_tsf;
1239	tmp.pub.chains = data->chains;
1240	memcpy(tmp.pub.chain_signal, data->chain_signal, IEEE80211_MAX_CHAINS);
1241	ether_addr_copy(tmp.parent_bssid, data->parent_bssid);
1242
1243	signal_valid = abs(data->chan->center_freq - channel->center_freq) <=
1244		wiphy->max_adj_channel_rssi_comp;
1245	res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid);
1246	if (!res)
1247		return NULL;
1248
1249	if (channel->band == NL80211_BAND_60GHZ) {
1250		bss_type = res->pub.capability & WLAN_CAPABILITY_DMG_TYPE_MASK;
1251		if (bss_type == WLAN_CAPABILITY_DMG_TYPE_AP ||
1252		    bss_type == WLAN_CAPABILITY_DMG_TYPE_PBSS)
1253			regulatory_hint_found_beacon(wiphy, channel, gfp);
 
 
 
 
1254	} else {
1255		if (res->pub.capability & WLAN_CAPABILITY_ESS)
1256			regulatory_hint_found_beacon(wiphy, channel, gfp);
 
1257	}
1258
1259	trace_cfg80211_return_bss(&res->pub);
1260	/* cfg80211_bss_update gives us a referenced result */
1261	return &res->pub;
 
 
 
 
 
 
 
 
 
 
1262}
1263EXPORT_SYMBOL(cfg80211_inform_bss_frame_data);
1264
1265void cfg80211_ref_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
1266{
1267	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1268	struct cfg80211_internal_bss *bss;
1269
1270	if (!pub)
1271		return;
1272
1273	bss = container_of(pub, struct cfg80211_internal_bss, pub);
1274
1275	spin_lock_bh(&rdev->bss_lock);
1276	bss_ref_get(rdev, bss);
1277	spin_unlock_bh(&rdev->bss_lock);
1278}
1279EXPORT_SYMBOL(cfg80211_ref_bss);
1280
1281void cfg80211_put_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
1282{
1283	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1284	struct cfg80211_internal_bss *bss;
1285
1286	if (!pub)
1287		return;
1288
1289	bss = container_of(pub, struct cfg80211_internal_bss, pub);
1290
1291	spin_lock_bh(&rdev->bss_lock);
1292	bss_ref_put(rdev, bss);
1293	spin_unlock_bh(&rdev->bss_lock);
1294}
1295EXPORT_SYMBOL(cfg80211_put_bss);
1296
1297void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
1298{
1299	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1300	struct cfg80211_internal_bss *bss;
 
1301
1302	if (WARN_ON(!pub))
1303		return;
1304
1305	bss = container_of(pub, struct cfg80211_internal_bss, pub);
1306
1307	spin_lock_bh(&rdev->bss_lock);
1308	if (!list_empty(&bss->list)) {
1309		if (__cfg80211_unlink_bss(rdev, bss))
 
 
 
 
 
 
1310			rdev->bss_generation++;
1311	}
 
 
 
 
1312	spin_unlock_bh(&rdev->bss_lock);
1313}
1314EXPORT_SYMBOL(cfg80211_unlink_bss);
1315
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1316#ifdef CONFIG_CFG80211_WEXT
1317static struct cfg80211_registered_device *
1318cfg80211_get_dev_from_ifindex(struct net *net, int ifindex)
1319{
1320	struct cfg80211_registered_device *rdev;
1321	struct net_device *dev;
1322
1323	ASSERT_RTNL();
1324
1325	dev = dev_get_by_index(net, ifindex);
1326	if (!dev)
1327		return ERR_PTR(-ENODEV);
1328	if (dev->ieee80211_ptr)
1329		rdev = wiphy_to_rdev(dev->ieee80211_ptr->wiphy);
1330	else
1331		rdev = ERR_PTR(-ENODEV);
1332	dev_put(dev);
1333	return rdev;
1334}
1335
1336int cfg80211_wext_siwscan(struct net_device *dev,
1337			  struct iw_request_info *info,
1338			  union iwreq_data *wrqu, char *extra)
1339{
1340	struct cfg80211_registered_device *rdev;
1341	struct wiphy *wiphy;
1342	struct iw_scan_req *wreq = NULL;
1343	struct cfg80211_scan_request *creq = NULL;
1344	int i, err, n_channels = 0;
1345	enum nl80211_band band;
1346
1347	if (!netif_running(dev))
1348		return -ENETDOWN;
1349
1350	if (wrqu->data.length == sizeof(struct iw_scan_req))
1351		wreq = (struct iw_scan_req *)extra;
1352
1353	rdev = cfg80211_get_dev_from_ifindex(dev_net(dev), dev->ifindex);
1354
1355	if (IS_ERR(rdev))
1356		return PTR_ERR(rdev);
1357
1358	if (rdev->scan_req || rdev->scan_msg) {
1359		err = -EBUSY;
1360		goto out;
1361	}
1362
1363	wiphy = &rdev->wiphy;
1364
1365	/* Determine number of channels, needed to allocate creq */
1366	if (wreq && wreq->num_channels)
 
 
 
1367		n_channels = wreq->num_channels;
1368	else
1369		n_channels = ieee80211_get_num_supported_channels(wiphy);
 
1370
1371	creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) +
1372		       n_channels * sizeof(void *),
1373		       GFP_ATOMIC);
1374	if (!creq) {
1375		err = -ENOMEM;
1376		goto out;
1377	}
1378
1379	creq->wiphy = wiphy;
1380	creq->wdev = dev->ieee80211_ptr;
1381	/* SSIDs come after channels */
1382	creq->ssids = (void *)&creq->channels[n_channels];
1383	creq->n_channels = n_channels;
1384	creq->n_ssids = 1;
1385	creq->scan_start = jiffies;
1386
1387	/* translate "Scan on frequencies" request */
1388	i = 0;
1389	for (band = 0; band < NUM_NL80211_BANDS; band++) {
1390		int j;
1391
1392		if (!wiphy->bands[band])
1393			continue;
1394
1395		for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
 
 
1396			/* ignore disabled channels */
1397			if (wiphy->bands[band]->channels[j].flags &
1398						IEEE80211_CHAN_DISABLED)
 
1399				continue;
1400
1401			/* If we have a wireless request structure and the
1402			 * wireless request specifies frequencies, then search
1403			 * for the matching hardware channel.
1404			 */
1405			if (wreq && wreq->num_channels) {
1406				int k;
1407				int wiphy_freq = wiphy->bands[band]->channels[j].center_freq;
1408				for (k = 0; k < wreq->num_channels; k++) {
1409					struct iw_freq *freq =
1410						&wreq->channel_list[k];
1411					int wext_freq =
1412						cfg80211_wext_freq(freq);
1413
1414					if (wext_freq == wiphy_freq)
1415						goto wext_freq_found;
1416				}
1417				goto wext_freq_not_found;
1418			}
1419
1420		wext_freq_found:
1421			creq->channels[i] = &wiphy->bands[band]->channels[j];
1422			i++;
1423		wext_freq_not_found: ;
1424		}
1425	}
1426	/* No channels found? */
1427	if (!i) {
1428		err = -EINVAL;
1429		goto out;
1430	}
1431
1432	/* Set real number of channels specified in creq->channels[] */
1433	creq->n_channels = i;
1434
1435	/* translate "Scan for SSID" request */
1436	if (wreq) {
1437		if (wrqu->data.flags & IW_SCAN_THIS_ESSID) {
1438			if (wreq->essid_len > IEEE80211_MAX_SSID_LEN) {
1439				err = -EINVAL;
1440				goto out;
1441			}
1442			memcpy(creq->ssids[0].ssid, wreq->essid, wreq->essid_len);
1443			creq->ssids[0].ssid_len = wreq->essid_len;
1444		}
1445		if (wreq->scan_type == IW_SCAN_TYPE_PASSIVE)
 
1446			creq->n_ssids = 0;
 
1447	}
1448
1449	for (i = 0; i < NUM_NL80211_BANDS; i++)
1450		if (wiphy->bands[i])
1451			creq->rates[i] = (1 << wiphy->bands[i]->n_bitrates) - 1;
1452
1453	eth_broadcast_addr(creq->bssid);
1454
 
 
1455	rdev->scan_req = creq;
1456	err = rdev_scan(rdev, creq);
1457	if (err) {
1458		rdev->scan_req = NULL;
1459		/* creq will be freed below */
1460	} else {
1461		nl80211_send_scan_start(rdev, dev->ieee80211_ptr);
1462		/* creq now owned by driver */
1463		creq = NULL;
1464		dev_hold(dev);
1465	}
 
1466 out:
1467	kfree(creq);
1468	return err;
1469}
1470EXPORT_WEXT_HANDLER(cfg80211_wext_siwscan);
1471
1472static char *ieee80211_scan_add_ies(struct iw_request_info *info,
1473				    const struct cfg80211_bss_ies *ies,
1474				    char *current_ev, char *end_buf)
1475{
1476	const u8 *pos, *end, *next;
1477	struct iw_event iwe;
1478
1479	if (!ies)
1480		return current_ev;
1481
1482	/*
1483	 * If needed, fragment the IEs buffer (at IE boundaries) into short
1484	 * enough fragments to fit into IW_GENERIC_IE_MAX octet messages.
1485	 */
1486	pos = ies->data;
1487	end = pos + ies->len;
1488
1489	while (end - pos > IW_GENERIC_IE_MAX) {
1490		next = pos + 2 + pos[1];
1491		while (next + 2 + next[1] - pos < IW_GENERIC_IE_MAX)
1492			next = next + 2 + next[1];
1493
1494		memset(&iwe, 0, sizeof(iwe));
1495		iwe.cmd = IWEVGENIE;
1496		iwe.u.data.length = next - pos;
1497		current_ev = iwe_stream_add_point_check(info, current_ev,
1498							end_buf, &iwe,
1499							(void *)pos);
1500		if (IS_ERR(current_ev))
1501			return current_ev;
1502		pos = next;
1503	}
1504
1505	if (end > pos) {
1506		memset(&iwe, 0, sizeof(iwe));
1507		iwe.cmd = IWEVGENIE;
1508		iwe.u.data.length = end - pos;
1509		current_ev = iwe_stream_add_point_check(info, current_ev,
1510							end_buf, &iwe,
1511							(void *)pos);
1512		if (IS_ERR(current_ev))
1513			return current_ev;
1514	}
1515
1516	return current_ev;
1517}
1518
1519static char *
1520ieee80211_bss(struct wiphy *wiphy, struct iw_request_info *info,
1521	      struct cfg80211_internal_bss *bss, char *current_ev,
1522	      char *end_buf)
1523{
1524	const struct cfg80211_bss_ies *ies;
1525	struct iw_event iwe;
1526	const u8 *ie;
1527	u8 buf[50];
1528	u8 *cfg, *p, *tmp;
1529	int rem, i, sig;
1530	bool ismesh = false;
1531
1532	memset(&iwe, 0, sizeof(iwe));
1533	iwe.cmd = SIOCGIWAP;
1534	iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
1535	memcpy(iwe.u.ap_addr.sa_data, bss->pub.bssid, ETH_ALEN);
1536	current_ev = iwe_stream_add_event_check(info, current_ev, end_buf, &iwe,
1537						IW_EV_ADDR_LEN);
1538	if (IS_ERR(current_ev))
1539		return current_ev;
1540
1541	memset(&iwe, 0, sizeof(iwe));
1542	iwe.cmd = SIOCGIWFREQ;
1543	iwe.u.freq.m = ieee80211_frequency_to_channel(bss->pub.channel->center_freq);
1544	iwe.u.freq.e = 0;
1545	current_ev = iwe_stream_add_event_check(info, current_ev, end_buf, &iwe,
1546						IW_EV_FREQ_LEN);
1547	if (IS_ERR(current_ev))
1548		return current_ev;
1549
1550	memset(&iwe, 0, sizeof(iwe));
1551	iwe.cmd = SIOCGIWFREQ;
1552	iwe.u.freq.m = bss->pub.channel->center_freq;
1553	iwe.u.freq.e = 6;
1554	current_ev = iwe_stream_add_event_check(info, current_ev, end_buf, &iwe,
1555						IW_EV_FREQ_LEN);
1556	if (IS_ERR(current_ev))
1557		return current_ev;
1558
1559	if (wiphy->signal_type != CFG80211_SIGNAL_TYPE_NONE) {
1560		memset(&iwe, 0, sizeof(iwe));
1561		iwe.cmd = IWEVQUAL;
1562		iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED |
1563				     IW_QUAL_NOISE_INVALID |
1564				     IW_QUAL_QUAL_UPDATED;
1565		switch (wiphy->signal_type) {
1566		case CFG80211_SIGNAL_TYPE_MBM:
1567			sig = bss->pub.signal / 100;
1568			iwe.u.qual.level = sig;
1569			iwe.u.qual.updated |= IW_QUAL_DBM;
1570			if (sig < -110)		/* rather bad */
1571				sig = -110;
1572			else if (sig > -40)	/* perfect */
1573				sig = -40;
1574			/* will give a range of 0 .. 70 */
1575			iwe.u.qual.qual = sig + 110;
1576			break;
1577		case CFG80211_SIGNAL_TYPE_UNSPEC:
1578			iwe.u.qual.level = bss->pub.signal;
1579			/* will give range 0 .. 100 */
1580			iwe.u.qual.qual = bss->pub.signal;
1581			break;
1582		default:
1583			/* not reached */
1584			break;
1585		}
1586		current_ev = iwe_stream_add_event_check(info, current_ev,
1587							end_buf, &iwe,
1588							IW_EV_QUAL_LEN);
1589		if (IS_ERR(current_ev))
1590			return current_ev;
1591	}
1592
1593	memset(&iwe, 0, sizeof(iwe));
1594	iwe.cmd = SIOCGIWENCODE;
1595	if (bss->pub.capability & WLAN_CAPABILITY_PRIVACY)
1596		iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
1597	else
1598		iwe.u.data.flags = IW_ENCODE_DISABLED;
1599	iwe.u.data.length = 0;
1600	current_ev = iwe_stream_add_point_check(info, current_ev, end_buf,
1601						&iwe, "");
1602	if (IS_ERR(current_ev))
1603		return current_ev;
1604
1605	rcu_read_lock();
1606	ies = rcu_dereference(bss->pub.ies);
1607	rem = ies->len;
1608	ie = ies->data;
1609
1610	while (rem >= 2) {
1611		/* invalid data */
1612		if (ie[1] > rem - 2)
1613			break;
1614
1615		switch (ie[0]) {
1616		case WLAN_EID_SSID:
1617			memset(&iwe, 0, sizeof(iwe));
1618			iwe.cmd = SIOCGIWESSID;
1619			iwe.u.data.length = ie[1];
1620			iwe.u.data.flags = 1;
1621			current_ev = iwe_stream_add_point_check(info,
1622								current_ev,
1623								end_buf, &iwe,
1624								(u8 *)ie + 2);
1625			if (IS_ERR(current_ev))
1626				goto unlock;
1627			break;
1628		case WLAN_EID_MESH_ID:
1629			memset(&iwe, 0, sizeof(iwe));
1630			iwe.cmd = SIOCGIWESSID;
1631			iwe.u.data.length = ie[1];
1632			iwe.u.data.flags = 1;
1633			current_ev = iwe_stream_add_point_check(info,
1634								current_ev,
1635								end_buf, &iwe,
1636								(u8 *)ie + 2);
1637			if (IS_ERR(current_ev))
1638				goto unlock;
1639			break;
1640		case WLAN_EID_MESH_CONFIG:
1641			ismesh = true;
1642			if (ie[1] != sizeof(struct ieee80211_meshconf_ie))
1643				break;
1644			cfg = (u8 *)ie + 2;
1645			memset(&iwe, 0, sizeof(iwe));
1646			iwe.cmd = IWEVCUSTOM;
1647			sprintf(buf, "Mesh Network Path Selection Protocol ID: "
1648				"0x%02X", cfg[0]);
1649			iwe.u.data.length = strlen(buf);
1650			current_ev = iwe_stream_add_point_check(info,
1651								current_ev,
1652								end_buf,
1653								&iwe, buf);
1654			if (IS_ERR(current_ev))
1655				goto unlock;
1656			sprintf(buf, "Path Selection Metric ID: 0x%02X",
1657				cfg[1]);
1658			iwe.u.data.length = strlen(buf);
1659			current_ev = iwe_stream_add_point_check(info,
1660								current_ev,
1661								end_buf,
1662								&iwe, buf);
1663			if (IS_ERR(current_ev))
1664				goto unlock;
1665			sprintf(buf, "Congestion Control Mode ID: 0x%02X",
1666				cfg[2]);
1667			iwe.u.data.length = strlen(buf);
1668			current_ev = iwe_stream_add_point_check(info,
1669								current_ev,
1670								end_buf,
1671								&iwe, buf);
1672			if (IS_ERR(current_ev))
1673				goto unlock;
1674			sprintf(buf, "Synchronization ID: 0x%02X", cfg[3]);
1675			iwe.u.data.length = strlen(buf);
 
1676			current_ev = iwe_stream_add_point_check(info,
1677								current_ev,
1678								end_buf,
1679								&iwe, buf);
1680			if (IS_ERR(current_ev))
1681				goto unlock;
1682			sprintf(buf, "Authentication ID: 0x%02X", cfg[4]);
1683			iwe.u.data.length = strlen(buf);
 
1684			current_ev = iwe_stream_add_point_check(info,
1685								current_ev,
1686								end_buf,
1687								&iwe, buf);
1688			if (IS_ERR(current_ev))
1689				goto unlock;
1690			sprintf(buf, "Formation Info: 0x%02X", cfg[5]);
1691			iwe.u.data.length = strlen(buf);
 
1692			current_ev = iwe_stream_add_point_check(info,
1693								current_ev,
1694								end_buf,
1695								&iwe, buf);
1696			if (IS_ERR(current_ev))
1697				goto unlock;
1698			sprintf(buf, "Capabilities: 0x%02X", cfg[6]);
1699			iwe.u.data.length = strlen(buf);
 
1700			current_ev = iwe_stream_add_point_check(info,
1701								current_ev,
1702								end_buf,
1703								&iwe, buf);
1704			if (IS_ERR(current_ev))
1705				goto unlock;
1706			break;
1707		case WLAN_EID_SUPP_RATES:
1708		case WLAN_EID_EXT_SUPP_RATES:
1709			/* display all supported rates in readable format */
1710			p = current_ev + iwe_stream_lcp_len(info);
1711
1712			memset(&iwe, 0, sizeof(iwe));
1713			iwe.cmd = SIOCGIWRATE;
1714			/* Those two flags are ignored... */
1715			iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
1716
1717			for (i = 0; i < ie[1]; i++) {
1718				iwe.u.bitrate.value =
1719					((ie[i + 2] & 0x7f) * 500000);
1720				tmp = p;
1721				p = iwe_stream_add_value(info, current_ev, p,
1722							 end_buf, &iwe,
1723							 IW_EV_PARAM_LEN);
1724				if (p == tmp) {
1725					current_ev = ERR_PTR(-E2BIG);
1726					goto unlock;
1727				}
1728			}
1729			current_ev = p;
1730			break;
1731		}
1732		rem -= ie[1] + 2;
1733		ie += ie[1] + 2;
1734	}
1735
1736	if (bss->pub.capability & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS) ||
1737	    ismesh) {
1738		memset(&iwe, 0, sizeof(iwe));
1739		iwe.cmd = SIOCGIWMODE;
1740		if (ismesh)
1741			iwe.u.mode = IW_MODE_MESH;
1742		else if (bss->pub.capability & WLAN_CAPABILITY_ESS)
1743			iwe.u.mode = IW_MODE_MASTER;
1744		else
1745			iwe.u.mode = IW_MODE_ADHOC;
1746		current_ev = iwe_stream_add_event_check(info, current_ev,
1747							end_buf, &iwe,
1748							IW_EV_UINT_LEN);
1749		if (IS_ERR(current_ev))
1750			goto unlock;
1751	}
1752
1753	memset(&iwe, 0, sizeof(iwe));
1754	iwe.cmd = IWEVCUSTOM;
1755	sprintf(buf, "tsf=%016llx", (unsigned long long)(ies->tsf));
1756	iwe.u.data.length = strlen(buf);
1757	current_ev = iwe_stream_add_point_check(info, current_ev, end_buf,
1758						&iwe, buf);
1759	if (IS_ERR(current_ev))
1760		goto unlock;
1761	memset(&iwe, 0, sizeof(iwe));
1762	iwe.cmd = IWEVCUSTOM;
1763	sprintf(buf, " Last beacon: %ums ago",
1764		elapsed_jiffies_msecs(bss->ts));
1765	iwe.u.data.length = strlen(buf);
1766	current_ev = iwe_stream_add_point_check(info, current_ev,
1767						end_buf, &iwe, buf);
1768	if (IS_ERR(current_ev))
1769		goto unlock;
1770
1771	current_ev = ieee80211_scan_add_ies(info, ies, current_ev, end_buf);
1772
1773 unlock:
1774	rcu_read_unlock();
1775	return current_ev;
1776}
1777
1778
1779static int ieee80211_scan_results(struct cfg80211_registered_device *rdev,
1780				  struct iw_request_info *info,
1781				  char *buf, size_t len)
1782{
1783	char *current_ev = buf;
1784	char *end_buf = buf + len;
1785	struct cfg80211_internal_bss *bss;
1786	int err = 0;
1787
1788	spin_lock_bh(&rdev->bss_lock);
1789	cfg80211_bss_expire(rdev);
1790
1791	list_for_each_entry(bss, &rdev->bss_list, list) {
1792		if (buf + len - current_ev <= IW_EV_ADDR_LEN) {
1793			err = -E2BIG;
1794			break;
1795		}
1796		current_ev = ieee80211_bss(&rdev->wiphy, info, bss,
1797					   current_ev, end_buf);
1798		if (IS_ERR(current_ev)) {
1799			err = PTR_ERR(current_ev);
1800			break;
1801		}
1802	}
1803	spin_unlock_bh(&rdev->bss_lock);
1804
1805	if (err)
1806		return err;
1807	return current_ev - buf;
1808}
1809
1810
1811int cfg80211_wext_giwscan(struct net_device *dev,
1812			  struct iw_request_info *info,
1813			  struct iw_point *data, char *extra)
1814{
 
1815	struct cfg80211_registered_device *rdev;
1816	int res;
1817
1818	if (!netif_running(dev))
1819		return -ENETDOWN;
1820
1821	rdev = cfg80211_get_dev_from_ifindex(dev_net(dev), dev->ifindex);
1822
1823	if (IS_ERR(rdev))
1824		return PTR_ERR(rdev);
1825
1826	if (rdev->scan_req || rdev->scan_msg)
1827		return -EAGAIN;
1828
1829	res = ieee80211_scan_results(rdev, info, extra, data->length);
1830	data->length = 0;
1831	if (res >= 0) {
1832		data->length = res;
1833		res = 0;
1834	}
1835
1836	return res;
1837}
1838EXPORT_WEXT_HANDLER(cfg80211_wext_giwscan);
1839#endif