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
v6.9.4
   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->channels[n_channels] = chan;
 767	if (add_to_6ghz)
 768		request->scan_6ghz_params[request->n_6ghz_params].channel_idx =
 769			n_channels;
 770
 771	request->n_channels++;
 772}
 773
 774static bool cfg80211_find_ssid_match(struct cfg80211_colocated_ap *ap,
 775				     struct cfg80211_scan_request *request)
 776{
 777	int i;
 778	u32 s_ssid;
 779
 780	for (i = 0; i < request->n_ssids; i++) {
 781		/* wildcard ssid in the scan request */
 782		if (!request->ssids[i].ssid_len) {
 783			if (ap->multi_bss && !ap->transmitted_bssid)
 784				continue;
 785
 786			return true;
 787		}
 788
 789		if (ap->ssid_len &&
 790		    ap->ssid_len == request->ssids[i].ssid_len) {
 791			if (!memcmp(request->ssids[i].ssid, ap->ssid,
 792				    ap->ssid_len))
 793				return true;
 794		} else if (ap->short_ssid_valid) {
 795			s_ssid = ~crc32_le(~0, request->ssids[i].ssid,
 796					   request->ssids[i].ssid_len);
 797
 798			if (ap->short_ssid == s_ssid)
 799				return true;
 800		}
 801	}
 802
 803	return false;
 804}
 805
 806static int cfg80211_scan_6ghz(struct cfg80211_registered_device *rdev)
 807{
 808	u8 i;
 809	struct cfg80211_colocated_ap *ap;
 810	int n_channels, count = 0, err;
 811	struct cfg80211_scan_request *request, *rdev_req = rdev->scan_req;
 812	LIST_HEAD(coloc_ap_list);
 813	bool need_scan_psc = true;
 814	const struct ieee80211_sband_iftype_data *iftd;
 
 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) + IEEE80211_MAX_SSID_LEN,
 861					GFP_ATOMIC);
 862
 863			if (!entry)
 864				continue;
 865
 866			memcpy(entry->bssid, res->bssid, ETH_ALEN);
 867			entry->short_ssid = s_ssid_tmp;
 868			memcpy(entry->ssid, ssid_elem->data,
 869			       ssid_elem->datalen);
 870			entry->ssid_len = ssid_elem->datalen;
 871			entry->short_ssid_valid = true;
 872			entry->center_freq = res->channel->center_freq;
 873
 874			list_add_tail(&entry->list, &coloc_ap_list);
 875			count++;
 876		}
 877		spin_unlock_bh(&rdev->bss_lock);
 878	}
 879
 880	request = kzalloc(struct_size(request, channels, n_channels) +
 881			  sizeof(*request->scan_6ghz_params) * count +
 882			  sizeof(*request->ssids) * rdev_req->n_ssids,
 883			  GFP_KERNEL);
 
 
 
 
 
 884	if (!request) {
 885		cfg80211_free_coloc_ap_list(&coloc_ap_list);
 886		return -ENOMEM;
 887	}
 888
 889	*request = *rdev_req;
 890	request->n_channels = 0;
 891	request->scan_6ghz_params =
 892		(void *)&request->channels[n_channels];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 893
 894	/*
 895	 * PSC channels should not be scanned in case of direct scan with 1 SSID
 896	 * and at least one of the reported co-located APs with same SSID
 897	 * indicating that all APs in the same ESS are co-located
 898	 */
 899	if (count && request->n_ssids == 1 && request->ssids[0].ssid_len) {
 900		list_for_each_entry(ap, &coloc_ap_list, list) {
 901			if (ap->colocated_ess &&
 902			    cfg80211_find_ssid_match(ap, request)) {
 903				need_scan_psc = false;
 904				break;
 905			}
 906		}
 907	}
 908
 909	/*
 910	 * add to the scan request the channels that need to be scanned
 911	 * regardless of the collocated APs (PSC channels or all channels
 912	 * in case that NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set)
 913	 */
 914	for (i = 0; i < rdev_req->n_channels; i++) {
 915		if (rdev_req->channels[i]->band == NL80211_BAND_6GHZ &&
 916		    ((need_scan_psc &&
 917		      cfg80211_channel_is_psc(rdev_req->channels[i])) ||
 918		     !(rdev_req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ))) {
 919			cfg80211_scan_req_add_chan(request,
 920						   rdev_req->channels[i],
 921						   false);
 922		}
 923	}
 924
 925	if (!(rdev_req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ))
 926		goto skip;
 927
 928	list_for_each_entry(ap, &coloc_ap_list, list) {
 929		bool found = false;
 930		struct cfg80211_scan_6ghz_params *scan_6ghz_params =
 931			&request->scan_6ghz_params[request->n_6ghz_params];
 932		struct ieee80211_channel *chan =
 933			ieee80211_get_channel(&rdev->wiphy, ap->center_freq);
 934
 935		if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
 
 936			continue;
 937
 938		for (i = 0; i < rdev_req->n_channels; i++) {
 939			if (rdev_req->channels[i] == chan)
 940				found = true;
 941		}
 942
 943		if (!found)
 944			continue;
 945
 946		if (request->n_ssids > 0 &&
 947		    !cfg80211_find_ssid_match(ap, request))
 948			continue;
 949
 950		if (!is_broadcast_ether_addr(request->bssid) &&
 951		    !ether_addr_equal(request->bssid, ap->bssid))
 952			continue;
 953
 954		if (!request->n_ssids && ap->multi_bss && !ap->transmitted_bssid)
 955			continue;
 956
 957		cfg80211_scan_req_add_chan(request, chan, true);
 958		memcpy(scan_6ghz_params->bssid, ap->bssid, ETH_ALEN);
 959		scan_6ghz_params->short_ssid = ap->short_ssid;
 960		scan_6ghz_params->short_ssid_valid = ap->short_ssid_valid;
 961		scan_6ghz_params->unsolicited_probe = ap->unsolicited_probe;
 962		scan_6ghz_params->psd_20 = ap->psd_20;
 963
 964		/*
 965		 * If a PSC channel is added to the scan and 'need_scan_psc' is
 966		 * set to false, then all the APs that the scan logic is
 967		 * interested with on the channel are collocated and thus there
 968		 * is no need to perform the initial PSC channel listen.
 969		 */
 970		if (cfg80211_channel_is_psc(chan) && !need_scan_psc)
 971			scan_6ghz_params->psc_no_listen = true;
 972
 973		request->n_6ghz_params++;
 974	}
 975
 976skip:
 977	cfg80211_free_coloc_ap_list(&coloc_ap_list);
 978
 979	if (request->n_channels) {
 980		struct cfg80211_scan_request *old = rdev->int_scan_req;
 
 981		rdev->int_scan_req = request;
 982
 983		/*
 984		 * Add the ssids from the parent scan request to the new scan
 985		 * request, so the driver would be able to use them in its
 986		 * probe requests to discover hidden APs on PSC channels.
 987		 */
 988		request->ssids = (void *)&request->channels[request->n_channels];
 989		request->n_ssids = rdev_req->n_ssids;
 990		memcpy(request->ssids, rdev_req->ssids, sizeof(*request->ssids) *
 991		       request->n_ssids);
 992
 993		/*
 994		 * If this scan follows a previous scan, save the scan start
 995		 * info from the first part of the scan
 996		 */
 997		if (old)
 998			rdev->int_scan_req->info = old->info;
 999
1000		err = rdev_scan(rdev, request);
1001		if (err) {
1002			rdev->int_scan_req = old;
1003			kfree(request);
1004		} else {
1005			kfree(old);
1006		}
1007
1008		return err;
1009	}
1010
1011	kfree(request);
1012	return -EINVAL;
1013}
1014
1015int cfg80211_scan(struct cfg80211_registered_device *rdev)
1016{
1017	struct cfg80211_scan_request *request;
1018	struct cfg80211_scan_request *rdev_req = rdev->scan_req;
1019	u32 n_channels = 0, idx, i;
1020
1021	if (!(rdev->wiphy.flags & WIPHY_FLAG_SPLIT_SCAN_6GHZ))
1022		return rdev_scan(rdev, rdev_req);
1023
1024	for (i = 0; i < rdev_req->n_channels; i++) {
1025		if (rdev_req->channels[i]->band != NL80211_BAND_6GHZ)
1026			n_channels++;
1027	}
1028
1029	if (!n_channels)
1030		return cfg80211_scan_6ghz(rdev);
1031
1032	request = kzalloc(struct_size(request, channels, n_channels),
1033			  GFP_KERNEL);
1034	if (!request)
1035		return -ENOMEM;
1036
1037	*request = *rdev_req;
1038	request->n_channels = n_channels;
1039
1040	for (i = idx = 0; i < rdev_req->n_channels; i++) {
1041		if (rdev_req->channels[i]->band != NL80211_BAND_6GHZ)
1042			request->channels[idx++] = rdev_req->channels[i];
1043	}
1044
1045	rdev_req->scan_6ghz = false;
1046	rdev->int_scan_req = request;
1047	return rdev_scan(rdev, request);
1048}
1049
1050void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev,
1051			   bool send_message)
1052{
1053	struct cfg80211_scan_request *request, *rdev_req;
1054	struct wireless_dev *wdev;
1055	struct sk_buff *msg;
1056#ifdef CONFIG_CFG80211_WEXT
1057	union iwreq_data wrqu;
1058#endif
1059
1060	lockdep_assert_held(&rdev->wiphy.mtx);
1061
1062	if (rdev->scan_msg) {
1063		nl80211_send_scan_msg(rdev, rdev->scan_msg);
1064		rdev->scan_msg = NULL;
1065		return;
1066	}
1067
1068	rdev_req = rdev->scan_req;
1069	if (!rdev_req)
1070		return;
1071
1072	wdev = rdev_req->wdev;
1073	request = rdev->int_scan_req ? rdev->int_scan_req : rdev_req;
1074
1075	if (wdev_running(wdev) &&
1076	    (rdev->wiphy.flags & WIPHY_FLAG_SPLIT_SCAN_6GHZ) &&
1077	    !rdev_req->scan_6ghz && !request->info.aborted &&
1078	    !cfg80211_scan_6ghz(rdev))
1079		return;
1080
1081	/*
1082	 * This must be before sending the other events!
1083	 * Otherwise, wpa_supplicant gets completely confused with
1084	 * wext events.
1085	 */
1086	if (wdev->netdev)
1087		cfg80211_sme_scan_done(wdev->netdev);
1088
1089	if (!request->info.aborted &&
1090	    request->flags & NL80211_SCAN_FLAG_FLUSH) {
1091		/* flush entries from previous scans */
1092		spin_lock_bh(&rdev->bss_lock);
1093		__cfg80211_bss_expire(rdev, request->scan_start);
1094		spin_unlock_bh(&rdev->bss_lock);
1095	}
1096
1097	msg = nl80211_build_scan_msg(rdev, wdev, request->info.aborted);
1098
1099#ifdef CONFIG_CFG80211_WEXT
1100	if (wdev->netdev && !request->info.aborted) {
1101		memset(&wrqu, 0, sizeof(wrqu));
1102
1103		wireless_send_event(wdev->netdev, SIOCGIWSCAN, &wrqu, NULL);
1104	}
1105#endif
1106
1107	dev_put(wdev->netdev);
1108
1109	kfree(rdev->int_scan_req);
1110	rdev->int_scan_req = NULL;
1111
1112	kfree(rdev->scan_req);
1113	rdev->scan_req = NULL;
1114
1115	if (!send_message)
1116		rdev->scan_msg = msg;
1117	else
1118		nl80211_send_scan_msg(rdev, msg);
1119}
1120
1121void __cfg80211_scan_done(struct wiphy *wiphy, struct wiphy_work *wk)
1122{
1123	___cfg80211_scan_done(wiphy_to_rdev(wiphy), true);
1124}
1125
1126void cfg80211_scan_done(struct cfg80211_scan_request *request,
1127			struct cfg80211_scan_info *info)
1128{
1129	struct cfg80211_scan_info old_info = request->info;
1130
1131	trace_cfg80211_scan_done(request, info);
1132	WARN_ON(request != wiphy_to_rdev(request->wiphy)->scan_req &&
1133		request != wiphy_to_rdev(request->wiphy)->int_scan_req);
1134
1135	request->info = *info;
1136
1137	/*
1138	 * In case the scan is split, the scan_start_tsf and tsf_bssid should
1139	 * be of the first part. In such a case old_info.scan_start_tsf should
1140	 * be non zero.
1141	 */
1142	if (request->scan_6ghz && old_info.scan_start_tsf) {
1143		request->info.scan_start_tsf = old_info.scan_start_tsf;
1144		memcpy(request->info.tsf_bssid, old_info.tsf_bssid,
1145		       sizeof(request->info.tsf_bssid));
1146	}
1147
1148	request->notified = true;
1149	wiphy_work_queue(request->wiphy,
1150			 &wiphy_to_rdev(request->wiphy)->scan_done_wk);
1151}
1152EXPORT_SYMBOL(cfg80211_scan_done);
1153
1154void cfg80211_add_sched_scan_req(struct cfg80211_registered_device *rdev,
1155				 struct cfg80211_sched_scan_request *req)
1156{
1157	lockdep_assert_held(&rdev->wiphy.mtx);
1158
1159	list_add_rcu(&req->list, &rdev->sched_scan_req_list);
1160}
1161
1162static void cfg80211_del_sched_scan_req(struct cfg80211_registered_device *rdev,
1163					struct cfg80211_sched_scan_request *req)
1164{
1165	lockdep_assert_held(&rdev->wiphy.mtx);
1166
1167	list_del_rcu(&req->list);
1168	kfree_rcu(req, rcu_head);
1169}
1170
1171static struct cfg80211_sched_scan_request *
1172cfg80211_find_sched_scan_req(struct cfg80211_registered_device *rdev, u64 reqid)
1173{
1174	struct cfg80211_sched_scan_request *pos;
1175
1176	list_for_each_entry_rcu(pos, &rdev->sched_scan_req_list, list,
1177				lockdep_is_held(&rdev->wiphy.mtx)) {
1178		if (pos->reqid == reqid)
1179			return pos;
1180	}
1181	return NULL;
1182}
1183
1184/*
1185 * Determines if a scheduled scan request can be handled. When a legacy
1186 * scheduled scan is running no other scheduled scan is allowed regardless
1187 * whether the request is for legacy or multi-support scan. When a multi-support
1188 * scheduled scan is running a request for legacy scan is not allowed. In this
1189 * case a request for multi-support scan can be handled if resources are
1190 * available, ie. struct wiphy::max_sched_scan_reqs limit is not yet reached.
1191 */
1192int cfg80211_sched_scan_req_possible(struct cfg80211_registered_device *rdev,
1193				     bool want_multi)
1194{
1195	struct cfg80211_sched_scan_request *pos;
1196	int i = 0;
1197
1198	list_for_each_entry(pos, &rdev->sched_scan_req_list, list) {
1199		/* request id zero means legacy in progress */
1200		if (!i && !pos->reqid)
1201			return -EINPROGRESS;
1202		i++;
1203	}
1204
1205	if (i) {
1206		/* no legacy allowed when multi request(s) are active */
1207		if (!want_multi)
1208			return -EINPROGRESS;
1209
1210		/* resource limit reached */
1211		if (i == rdev->wiphy.max_sched_scan_reqs)
1212			return -ENOSPC;
1213	}
1214	return 0;
1215}
1216
1217void cfg80211_sched_scan_results_wk(struct work_struct *work)
1218{
1219	struct cfg80211_registered_device *rdev;
1220	struct cfg80211_sched_scan_request *req, *tmp;
1221
1222	rdev = container_of(work, struct cfg80211_registered_device,
1223			   sched_scan_res_wk);
1224
1225	wiphy_lock(&rdev->wiphy);
1226	list_for_each_entry_safe(req, tmp, &rdev->sched_scan_req_list, list) {
1227		if (req->report_results) {
1228			req->report_results = false;
1229			if (req->flags & NL80211_SCAN_FLAG_FLUSH) {
1230				/* flush entries from previous scans */
1231				spin_lock_bh(&rdev->bss_lock);
1232				__cfg80211_bss_expire(rdev, req->scan_start);
1233				spin_unlock_bh(&rdev->bss_lock);
1234				req->scan_start = jiffies;
1235			}
1236			nl80211_send_sched_scan(req,
1237						NL80211_CMD_SCHED_SCAN_RESULTS);
1238		}
1239	}
1240	wiphy_unlock(&rdev->wiphy);
1241}
1242
1243void cfg80211_sched_scan_results(struct wiphy *wiphy, u64 reqid)
1244{
1245	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1246	struct cfg80211_sched_scan_request *request;
1247
1248	trace_cfg80211_sched_scan_results(wiphy, reqid);
1249	/* ignore if we're not scanning */
1250
1251	rcu_read_lock();
1252	request = cfg80211_find_sched_scan_req(rdev, reqid);
1253	if (request) {
1254		request->report_results = true;
1255		queue_work(cfg80211_wq, &rdev->sched_scan_res_wk);
1256	}
1257	rcu_read_unlock();
1258}
1259EXPORT_SYMBOL(cfg80211_sched_scan_results);
1260
1261void cfg80211_sched_scan_stopped_locked(struct wiphy *wiphy, u64 reqid)
1262{
1263	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1264
1265	lockdep_assert_held(&wiphy->mtx);
1266
1267	trace_cfg80211_sched_scan_stopped(wiphy, reqid);
1268
1269	__cfg80211_stop_sched_scan(rdev, reqid, true);
1270}
1271EXPORT_SYMBOL(cfg80211_sched_scan_stopped_locked);
1272
1273void cfg80211_sched_scan_stopped(struct wiphy *wiphy, u64 reqid)
1274{
1275	wiphy_lock(wiphy);
1276	cfg80211_sched_scan_stopped_locked(wiphy, reqid);
1277	wiphy_unlock(wiphy);
1278}
1279EXPORT_SYMBOL(cfg80211_sched_scan_stopped);
1280
1281int cfg80211_stop_sched_scan_req(struct cfg80211_registered_device *rdev,
1282				 struct cfg80211_sched_scan_request *req,
1283				 bool driver_initiated)
1284{
1285	lockdep_assert_held(&rdev->wiphy.mtx);
1286
1287	if (!driver_initiated) {
1288		int err = rdev_sched_scan_stop(rdev, req->dev, req->reqid);
1289		if (err)
1290			return err;
1291	}
1292
1293	nl80211_send_sched_scan(req, NL80211_CMD_SCHED_SCAN_STOPPED);
1294
1295	cfg80211_del_sched_scan_req(rdev, req);
1296
1297	return 0;
1298}
1299
1300int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
1301			       u64 reqid, bool driver_initiated)
1302{
1303	struct cfg80211_sched_scan_request *sched_scan_req;
1304
1305	lockdep_assert_held(&rdev->wiphy.mtx);
1306
1307	sched_scan_req = cfg80211_find_sched_scan_req(rdev, reqid);
1308	if (!sched_scan_req)
1309		return -ENOENT;
1310
1311	return cfg80211_stop_sched_scan_req(rdev, sched_scan_req,
1312					    driver_initiated);
1313}
1314
1315void cfg80211_bss_age(struct cfg80211_registered_device *rdev,
1316                      unsigned long age_secs)
1317{
1318	struct cfg80211_internal_bss *bss;
1319	unsigned long age_jiffies = msecs_to_jiffies(age_secs * MSEC_PER_SEC);
1320
1321	spin_lock_bh(&rdev->bss_lock);
1322	list_for_each_entry(bss, &rdev->bss_list, list)
1323		bss->ts -= age_jiffies;
1324	spin_unlock_bh(&rdev->bss_lock);
1325}
1326
1327void cfg80211_bss_expire(struct cfg80211_registered_device *rdev)
1328{
1329	__cfg80211_bss_expire(rdev, jiffies - IEEE80211_SCAN_RESULT_EXPIRE);
1330}
1331
1332void cfg80211_bss_flush(struct wiphy *wiphy)
1333{
1334	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1335
1336	spin_lock_bh(&rdev->bss_lock);
1337	__cfg80211_bss_expire(rdev, jiffies);
1338	spin_unlock_bh(&rdev->bss_lock);
1339}
1340EXPORT_SYMBOL(cfg80211_bss_flush);
1341
1342const struct element *
1343cfg80211_find_elem_match(u8 eid, const u8 *ies, unsigned int len,
1344			 const u8 *match, unsigned int match_len,
1345			 unsigned int match_offset)
1346{
1347	const struct element *elem;
1348
1349	for_each_element_id(elem, eid, ies, len) {
1350		if (elem->datalen >= match_offset + match_len &&
1351		    !memcmp(elem->data + match_offset, match, match_len))
1352			return elem;
1353	}
1354
1355	return NULL;
1356}
1357EXPORT_SYMBOL(cfg80211_find_elem_match);
1358
1359const struct element *cfg80211_find_vendor_elem(unsigned int oui, int oui_type,
1360						const u8 *ies,
1361						unsigned int len)
1362{
1363	const struct element *elem;
1364	u8 match[] = { oui >> 16, oui >> 8, oui, oui_type };
1365	int match_len = (oui_type < 0) ? 3 : sizeof(match);
1366
1367	if (WARN_ON(oui_type > 0xff))
1368		return NULL;
1369
1370	elem = cfg80211_find_elem_match(WLAN_EID_VENDOR_SPECIFIC, ies, len,
1371					match, match_len, 0);
1372
1373	if (!elem || elem->datalen < 4)
1374		return NULL;
1375
1376	return elem;
1377}
1378EXPORT_SYMBOL(cfg80211_find_vendor_elem);
1379
1380/**
1381 * enum bss_compare_mode - BSS compare mode
1382 * @BSS_CMP_REGULAR: regular compare mode (for insertion and normal find)
1383 * @BSS_CMP_HIDE_ZLEN: find hidden SSID with zero-length mode
1384 * @BSS_CMP_HIDE_NUL: find hidden SSID with NUL-ed out mode
1385 */
1386enum bss_compare_mode {
1387	BSS_CMP_REGULAR,
1388	BSS_CMP_HIDE_ZLEN,
1389	BSS_CMP_HIDE_NUL,
1390};
1391
1392static int cmp_bss(struct cfg80211_bss *a,
1393		   struct cfg80211_bss *b,
1394		   enum bss_compare_mode mode)
1395{
1396	const struct cfg80211_bss_ies *a_ies, *b_ies;
1397	const u8 *ie1 = NULL;
1398	const u8 *ie2 = NULL;
1399	int i, r;
1400
1401	if (a->channel != b->channel)
1402		return (b->channel->center_freq * 1000 + b->channel->freq_offset) -
1403		       (a->channel->center_freq * 1000 + a->channel->freq_offset);
1404
1405	a_ies = rcu_access_pointer(a->ies);
1406	if (!a_ies)
1407		return -1;
1408	b_ies = rcu_access_pointer(b->ies);
1409	if (!b_ies)
1410		return 1;
1411
1412	if (WLAN_CAPABILITY_IS_STA_BSS(a->capability))
1413		ie1 = cfg80211_find_ie(WLAN_EID_MESH_ID,
1414				       a_ies->data, a_ies->len);
1415	if (WLAN_CAPABILITY_IS_STA_BSS(b->capability))
1416		ie2 = cfg80211_find_ie(WLAN_EID_MESH_ID,
1417				       b_ies->data, b_ies->len);
1418	if (ie1 && ie2) {
1419		int mesh_id_cmp;
1420
1421		if (ie1[1] == ie2[1])
1422			mesh_id_cmp = memcmp(ie1 + 2, ie2 + 2, ie1[1]);
1423		else
1424			mesh_id_cmp = ie2[1] - ie1[1];
1425
1426		ie1 = cfg80211_find_ie(WLAN_EID_MESH_CONFIG,
1427				       a_ies->data, a_ies->len);
1428		ie2 = cfg80211_find_ie(WLAN_EID_MESH_CONFIG,
1429				       b_ies->data, b_ies->len);
1430		if (ie1 && ie2) {
1431			if (mesh_id_cmp)
1432				return mesh_id_cmp;
1433			if (ie1[1] != ie2[1])
1434				return ie2[1] - ie1[1];
1435			return memcmp(ie1 + 2, ie2 + 2, ie1[1]);
1436		}
1437	}
1438
1439	r = memcmp(a->bssid, b->bssid, sizeof(a->bssid));
1440	if (r)
1441		return r;
1442
1443	ie1 = cfg80211_find_ie(WLAN_EID_SSID, a_ies->data, a_ies->len);
1444	ie2 = cfg80211_find_ie(WLAN_EID_SSID, b_ies->data, b_ies->len);
1445
1446	if (!ie1 && !ie2)
1447		return 0;
1448
1449	/*
1450	 * Note that with "hide_ssid", the function returns a match if
1451	 * the already-present BSS ("b") is a hidden SSID beacon for
1452	 * the new BSS ("a").
1453	 */
1454
1455	/* sort missing IE before (left of) present IE */
1456	if (!ie1)
1457		return -1;
1458	if (!ie2)
1459		return 1;
1460
1461	switch (mode) {
1462	case BSS_CMP_HIDE_ZLEN:
1463		/*
1464		 * In ZLEN mode we assume the BSS entry we're
1465		 * looking for has a zero-length SSID. So if
1466		 * the one we're looking at right now has that,
1467		 * return 0. Otherwise, return the difference
1468		 * in length, but since we're looking for the
1469		 * 0-length it's really equivalent to returning
1470		 * the length of the one we're looking at.
1471		 *
1472		 * No content comparison is needed as we assume
1473		 * the content length is zero.
1474		 */
1475		return ie2[1];
1476	case BSS_CMP_REGULAR:
1477	default:
1478		/* sort by length first, then by contents */
1479		if (ie1[1] != ie2[1])
1480			return ie2[1] - ie1[1];
1481		return memcmp(ie1 + 2, ie2 + 2, ie1[1]);
1482	case BSS_CMP_HIDE_NUL:
1483		if (ie1[1] != ie2[1])
1484			return ie2[1] - ie1[1];
1485		/* this is equivalent to memcmp(zeroes, ie2 + 2, len) */
1486		for (i = 0; i < ie2[1]; i++)
1487			if (ie2[i + 2])
1488				return -1;
1489		return 0;
1490	}
1491}
1492
1493static bool cfg80211_bss_type_match(u16 capability,
1494				    enum nl80211_band band,
1495				    enum ieee80211_bss_type bss_type)
1496{
1497	bool ret = true;
1498	u16 mask, val;
1499
1500	if (bss_type == IEEE80211_BSS_TYPE_ANY)
1501		return ret;
1502
1503	if (band == NL80211_BAND_60GHZ) {
1504		mask = WLAN_CAPABILITY_DMG_TYPE_MASK;
1505		switch (bss_type) {
1506		case IEEE80211_BSS_TYPE_ESS:
1507			val = WLAN_CAPABILITY_DMG_TYPE_AP;
1508			break;
1509		case IEEE80211_BSS_TYPE_PBSS:
1510			val = WLAN_CAPABILITY_DMG_TYPE_PBSS;
1511			break;
1512		case IEEE80211_BSS_TYPE_IBSS:
1513			val = WLAN_CAPABILITY_DMG_TYPE_IBSS;
1514			break;
1515		default:
1516			return false;
1517		}
1518	} else {
1519		mask = WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS;
1520		switch (bss_type) {
1521		case IEEE80211_BSS_TYPE_ESS:
1522			val = WLAN_CAPABILITY_ESS;
1523			break;
1524		case IEEE80211_BSS_TYPE_IBSS:
1525			val = WLAN_CAPABILITY_IBSS;
1526			break;
1527		case IEEE80211_BSS_TYPE_MBSS:
1528			val = 0;
1529			break;
1530		default:
1531			return false;
1532		}
1533	}
1534
1535	ret = ((capability & mask) == val);
1536	return ret;
1537}
1538
1539/* Returned bss is reference counted and must be cleaned up appropriately. */
1540struct cfg80211_bss *__cfg80211_get_bss(struct wiphy *wiphy,
1541					struct ieee80211_channel *channel,
1542					const u8 *bssid,
1543					const u8 *ssid, size_t ssid_len,
1544					enum ieee80211_bss_type bss_type,
1545					enum ieee80211_privacy privacy,
1546					u32 use_for)
1547{
1548	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1549	struct cfg80211_internal_bss *bss, *res = NULL;
1550	unsigned long now = jiffies;
1551	int bss_privacy;
1552
1553	trace_cfg80211_get_bss(wiphy, channel, bssid, ssid, ssid_len, bss_type,
1554			       privacy);
1555
1556	spin_lock_bh(&rdev->bss_lock);
1557
1558	list_for_each_entry(bss, &rdev->bss_list, list) {
1559		if (!cfg80211_bss_type_match(bss->pub.capability,
1560					     bss->pub.channel->band, bss_type))
1561			continue;
1562
1563		bss_privacy = (bss->pub.capability & WLAN_CAPABILITY_PRIVACY);
1564		if ((privacy == IEEE80211_PRIVACY_ON && !bss_privacy) ||
1565		    (privacy == IEEE80211_PRIVACY_OFF && bss_privacy))
1566			continue;
1567		if (channel && bss->pub.channel != channel)
1568			continue;
1569		if (!is_valid_ether_addr(bss->pub.bssid))
1570			continue;
1571		if ((bss->pub.use_for & use_for) != use_for)
1572			continue;
1573		/* Don't get expired BSS structs */
1574		if (time_after(now, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE) &&
1575		    !atomic_read(&bss->hold))
1576			continue;
1577		if (is_bss(&bss->pub, bssid, ssid, ssid_len)) {
1578			res = bss;
1579			bss_ref_get(rdev, res);
1580			break;
1581		}
1582	}
1583
1584	spin_unlock_bh(&rdev->bss_lock);
1585	if (!res)
1586		return NULL;
1587	trace_cfg80211_return_bss(&res->pub);
1588	return &res->pub;
1589}
1590EXPORT_SYMBOL(__cfg80211_get_bss);
1591
1592static void rb_insert_bss(struct cfg80211_registered_device *rdev,
1593			  struct cfg80211_internal_bss *bss)
1594{
1595	struct rb_node **p = &rdev->bss_tree.rb_node;
1596	struct rb_node *parent = NULL;
1597	struct cfg80211_internal_bss *tbss;
1598	int cmp;
1599
1600	while (*p) {
1601		parent = *p;
1602		tbss = rb_entry(parent, struct cfg80211_internal_bss, rbn);
1603
1604		cmp = cmp_bss(&bss->pub, &tbss->pub, BSS_CMP_REGULAR);
1605
1606		if (WARN_ON(!cmp)) {
1607			/* will sort of leak this BSS */
1608			return;
1609		}
1610
1611		if (cmp < 0)
1612			p = &(*p)->rb_left;
1613		else
1614			p = &(*p)->rb_right;
1615	}
1616
1617	rb_link_node(&bss->rbn, parent, p);
1618	rb_insert_color(&bss->rbn, &rdev->bss_tree);
 
1619}
1620
1621static struct cfg80211_internal_bss *
1622rb_find_bss(struct cfg80211_registered_device *rdev,
1623	    struct cfg80211_internal_bss *res,
1624	    enum bss_compare_mode mode)
1625{
1626	struct rb_node *n = rdev->bss_tree.rb_node;
1627	struct cfg80211_internal_bss *bss;
1628	int r;
1629
1630	while (n) {
1631		bss = rb_entry(n, struct cfg80211_internal_bss, rbn);
1632		r = cmp_bss(&res->pub, &bss->pub, mode);
1633
1634		if (r == 0)
1635			return bss;
1636		else if (r < 0)
1637			n = n->rb_left;
1638		else
1639			n = n->rb_right;
1640	}
1641
1642	return NULL;
1643}
1644
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1645static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev,
1646				   struct cfg80211_internal_bss *new)
1647{
1648	const struct cfg80211_bss_ies *ies;
1649	struct cfg80211_internal_bss *bss;
1650	const u8 *ie;
1651	int i, ssidlen;
1652	u8 fold = 0;
1653	u32 n_entries = 0;
1654
1655	ies = rcu_access_pointer(new->pub.beacon_ies);
1656	if (WARN_ON(!ies))
1657		return false;
1658
1659	ie = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len);
1660	if (!ie) {
1661		/* nothing to do */
1662		return true;
1663	}
1664
1665	ssidlen = ie[1];
1666	for (i = 0; i < ssidlen; i++)
1667		fold |= ie[2 + i];
1668
1669	if (fold) {
1670		/* not a hidden SSID */
1671		return true;
1672	}
1673
1674	/* This is the bad part ... */
1675
1676	list_for_each_entry(bss, &rdev->bss_list, list) {
1677		/*
1678		 * we're iterating all the entries anyway, so take the
1679		 * opportunity to validate the list length accounting
1680		 */
1681		n_entries++;
1682
1683		if (!ether_addr_equal(bss->pub.bssid, new->pub.bssid))
1684			continue;
1685		if (bss->pub.channel != new->pub.channel)
1686			continue;
1687		if (rcu_access_pointer(bss->pub.beacon_ies))
1688			continue;
1689		ies = rcu_access_pointer(bss->pub.ies);
1690		if (!ies)
1691			continue;
1692		ie = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len);
1693		if (!ie)
1694			continue;
1695		if (ssidlen && ie[1] != ssidlen)
1696			continue;
1697		if (WARN_ON_ONCE(bss->pub.hidden_beacon_bss))
1698			continue;
1699		if (WARN_ON_ONCE(!list_empty(&bss->hidden_list)))
1700			list_del(&bss->hidden_list);
1701		/* combine them */
1702		list_add(&bss->hidden_list, &new->hidden_list);
1703		bss->pub.hidden_beacon_bss = &new->pub;
1704		new->refcount += bss->refcount;
1705		rcu_assign_pointer(bss->pub.beacon_ies,
1706				   new->pub.beacon_ies);
1707	}
1708
1709	WARN_ONCE(n_entries != rdev->bss_entries,
1710		  "rdev bss entries[%d]/list[len:%d] corruption\n",
1711		  rdev->bss_entries, n_entries);
1712
1713	return true;
1714}
1715
1716static void cfg80211_update_hidden_bsses(struct cfg80211_internal_bss *known,
1717					 const struct cfg80211_bss_ies *new_ies,
1718					 const struct cfg80211_bss_ies *old_ies)
1719{
1720	struct cfg80211_internal_bss *bss;
1721
1722	/* Assign beacon IEs to all sub entries */
1723	list_for_each_entry(bss, &known->hidden_list, hidden_list) {
1724		const struct cfg80211_bss_ies *ies;
1725
1726		ies = rcu_access_pointer(bss->pub.beacon_ies);
1727		WARN_ON(ies != old_ies);
1728
1729		rcu_assign_pointer(bss->pub.beacon_ies, new_ies);
1730	}
1731}
1732
1733static void cfg80211_check_stuck_ecsa(struct cfg80211_registered_device *rdev,
1734				      struct cfg80211_internal_bss *known,
1735				      const struct cfg80211_bss_ies *old)
1736{
1737	const struct ieee80211_ext_chansw_ie *ecsa;
1738	const struct element *elem_new, *elem_old;
1739	const struct cfg80211_bss_ies *new, *bcn;
1740
1741	if (known->pub.proberesp_ecsa_stuck)
1742		return;
1743
1744	new = rcu_dereference_protected(known->pub.proberesp_ies,
1745					lockdep_is_held(&rdev->bss_lock));
1746	if (WARN_ON(!new))
1747		return;
1748
1749	if (new->tsf - old->tsf < USEC_PER_SEC)
1750		return;
1751
1752	elem_old = cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN,
1753				      old->data, old->len);
1754	if (!elem_old)
1755		return;
1756
1757	elem_new = cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN,
1758				      new->data, new->len);
1759	if (!elem_new)
1760		return;
1761
1762	bcn = rcu_dereference_protected(known->pub.beacon_ies,
1763					lockdep_is_held(&rdev->bss_lock));
1764	if (bcn &&
1765	    cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN,
1766			       bcn->data, bcn->len))
1767		return;
1768
1769	if (elem_new->datalen != elem_old->datalen)
1770		return;
1771	if (elem_new->datalen < sizeof(struct ieee80211_ext_chansw_ie))
1772		return;
1773	if (memcmp(elem_new->data, elem_old->data, elem_new->datalen))
1774		return;
1775
1776	ecsa = (void *)elem_new->data;
1777
1778	if (!ecsa->mode)
1779		return;
1780
1781	if (ecsa->new_ch_num !=
1782	    ieee80211_frequency_to_channel(known->pub.channel->center_freq))
1783		return;
1784
1785	known->pub.proberesp_ecsa_stuck = 1;
1786}
1787
1788static bool
1789cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,
1790			  struct cfg80211_internal_bss *known,
1791			  struct cfg80211_internal_bss *new,
1792			  bool signal_valid)
1793{
1794	lockdep_assert_held(&rdev->bss_lock);
1795
1796	/* Update IEs */
1797	if (rcu_access_pointer(new->pub.proberesp_ies)) {
1798		const struct cfg80211_bss_ies *old;
1799
1800		old = rcu_access_pointer(known->pub.proberesp_ies);
1801
1802		rcu_assign_pointer(known->pub.proberesp_ies,
1803				   new->pub.proberesp_ies);
1804		/* Override possible earlier Beacon frame IEs */
1805		rcu_assign_pointer(known->pub.ies,
1806				   new->pub.proberesp_ies);
1807		if (old) {
1808			cfg80211_check_stuck_ecsa(rdev, known, old);
1809			kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
1810		}
1811	}
1812
1813	if (rcu_access_pointer(new->pub.beacon_ies)) {
1814		const struct cfg80211_bss_ies *old;
1815
1816		if (known->pub.hidden_beacon_bss &&
1817		    !list_empty(&known->hidden_list)) {
1818			const struct cfg80211_bss_ies *f;
1819
1820			/* The known BSS struct is one of the probe
1821			 * response members of a group, but we're
1822			 * receiving a beacon (beacon_ies in the new
1823			 * bss is used). This can only mean that the
1824			 * AP changed its beacon from not having an
1825			 * SSID to showing it, which is confusing so
1826			 * drop this information.
1827			 */
1828
1829			f = rcu_access_pointer(new->pub.beacon_ies);
1830			kfree_rcu((struct cfg80211_bss_ies *)f, rcu_head);
1831			return false;
1832		}
1833
1834		old = rcu_access_pointer(known->pub.beacon_ies);
1835
1836		rcu_assign_pointer(known->pub.beacon_ies, new->pub.beacon_ies);
1837
1838		/* Override IEs if they were from a beacon before */
1839		if (old == rcu_access_pointer(known->pub.ies))
1840			rcu_assign_pointer(known->pub.ies, new->pub.beacon_ies);
1841
1842		cfg80211_update_hidden_bsses(known,
1843					     rcu_access_pointer(new->pub.beacon_ies),
1844					     old);
1845
1846		if (old)
1847			kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
1848	}
1849
1850	known->pub.beacon_interval = new->pub.beacon_interval;
1851
1852	/* don't update the signal if beacon was heard on
1853	 * adjacent channel.
1854	 */
1855	if (signal_valid)
1856		known->pub.signal = new->pub.signal;
1857	known->pub.capability = new->pub.capability;
1858	known->ts = new->ts;
1859	known->ts_boottime = new->ts_boottime;
1860	known->parent_tsf = new->parent_tsf;
1861	known->pub.chains = new->pub.chains;
1862	memcpy(known->pub.chain_signal, new->pub.chain_signal,
1863	       IEEE80211_MAX_CHAINS);
1864	ether_addr_copy(known->parent_bssid, new->parent_bssid);
1865	known->pub.max_bssid_indicator = new->pub.max_bssid_indicator;
1866	known->pub.bssid_index = new->pub.bssid_index;
1867	known->pub.use_for &= new->pub.use_for;
1868	known->pub.cannot_use_reasons = new->pub.cannot_use_reasons;
 
1869
1870	return true;
1871}
1872
1873/* Returned bss is reference counted and must be cleaned up appropriately. */
1874static struct cfg80211_internal_bss *
1875__cfg80211_bss_update(struct cfg80211_registered_device *rdev,
1876		      struct cfg80211_internal_bss *tmp,
1877		      bool signal_valid, unsigned long ts)
1878{
1879	struct cfg80211_internal_bss *found = NULL;
1880	struct cfg80211_bss_ies *ies;
1881
1882	if (WARN_ON(!tmp->pub.channel))
1883		goto free_ies;
1884
1885	tmp->ts = ts;
1886
1887	if (WARN_ON(!rcu_access_pointer(tmp->pub.ies)))
1888		goto free_ies;
1889
1890	found = rb_find_bss(rdev, tmp, BSS_CMP_REGULAR);
1891
1892	if (found) {
1893		if (!cfg80211_update_known_bss(rdev, found, tmp, signal_valid))
1894			return NULL;
1895	} else {
1896		struct cfg80211_internal_bss *new;
1897		struct cfg80211_internal_bss *hidden;
1898
1899		/*
1900		 * create a copy -- the "res" variable that is passed in
1901		 * is allocated on the stack since it's not needed in the
1902		 * more common case of an update
1903		 */
1904		new = kzalloc(sizeof(*new) + rdev->wiphy.bss_priv_size,
1905			      GFP_ATOMIC);
1906		if (!new)
1907			goto free_ies;
1908		memcpy(new, tmp, sizeof(*new));
1909		new->refcount = 1;
1910		INIT_LIST_HEAD(&new->hidden_list);
1911		INIT_LIST_HEAD(&new->pub.nontrans_list);
1912		/* we'll set this later if it was non-NULL */
1913		new->pub.transmitted_bss = NULL;
1914
1915		if (rcu_access_pointer(tmp->pub.proberesp_ies)) {
1916			hidden = rb_find_bss(rdev, tmp, BSS_CMP_HIDE_ZLEN);
1917			if (!hidden)
1918				hidden = rb_find_bss(rdev, tmp,
1919						     BSS_CMP_HIDE_NUL);
1920			if (hidden) {
1921				new->pub.hidden_beacon_bss = &hidden->pub;
1922				list_add(&new->hidden_list,
1923					 &hidden->hidden_list);
1924				hidden->refcount++;
1925
1926				ies = (void *)rcu_access_pointer(new->pub.beacon_ies);
1927				rcu_assign_pointer(new->pub.beacon_ies,
1928						   hidden->pub.beacon_ies);
1929				if (ies)
1930					kfree_rcu(ies, rcu_head);
1931			}
1932		} else {
1933			/*
1934			 * Ok so we found a beacon, and don't have an entry. If
1935			 * it's a beacon with hidden SSID, we might be in for an
1936			 * expensive search for any probe responses that should
1937			 * be grouped with this beacon for updates ...
1938			 */
1939			if (!cfg80211_combine_bsses(rdev, new)) {
1940				bss_ref_put(rdev, new);
1941				return NULL;
1942			}
1943		}
1944
1945		if (rdev->bss_entries >= bss_entries_limit &&
1946		    !cfg80211_bss_expire_oldest(rdev)) {
1947			bss_ref_put(rdev, new);
1948			return NULL;
1949		}
1950
1951		/* This must be before the call to bss_ref_get */
1952		if (tmp->pub.transmitted_bss) {
1953			new->pub.transmitted_bss = tmp->pub.transmitted_bss;
1954			bss_ref_get(rdev, bss_from_pub(tmp->pub.transmitted_bss));
1955		}
1956
1957		list_add_tail(&new->list, &rdev->bss_list);
1958		rdev->bss_entries++;
1959		rb_insert_bss(rdev, new);
1960		found = new;
1961	}
1962
1963	rdev->bss_generation++;
1964	bss_ref_get(rdev, found);
1965
1966	return found;
1967
1968free_ies:
1969	ies = (void *)rcu_dereference(tmp->pub.beacon_ies);
1970	if (ies)
1971		kfree_rcu(ies, rcu_head);
1972	ies = (void *)rcu_dereference(tmp->pub.proberesp_ies);
1973	if (ies)
1974		kfree_rcu(ies, rcu_head);
1975
1976	return NULL;
1977}
1978
1979struct cfg80211_internal_bss *
1980cfg80211_bss_update(struct cfg80211_registered_device *rdev,
1981		    struct cfg80211_internal_bss *tmp,
1982		    bool signal_valid, unsigned long ts)
1983{
1984	struct cfg80211_internal_bss *res;
1985
1986	spin_lock_bh(&rdev->bss_lock);
1987	res = __cfg80211_bss_update(rdev, tmp, signal_valid, ts);
1988	spin_unlock_bh(&rdev->bss_lock);
1989
1990	return res;
1991}
1992
1993int cfg80211_get_ies_channel_number(const u8 *ie, size_t ielen,
1994				    enum nl80211_band band)
1995{
1996	const struct element *tmp;
1997
1998	if (band == NL80211_BAND_6GHZ) {
1999		struct ieee80211_he_operation *he_oper;
2000
2001		tmp = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ie,
2002					     ielen);
2003		if (tmp && tmp->datalen >= sizeof(*he_oper) &&
2004		    tmp->datalen >= ieee80211_he_oper_size(&tmp->data[1])) {
2005			const struct ieee80211_he_6ghz_oper *he_6ghz_oper;
2006
2007			he_oper = (void *)&tmp->data[1];
2008
2009			he_6ghz_oper = ieee80211_he_6ghz_oper(he_oper);
2010			if (!he_6ghz_oper)
2011				return -1;
2012
2013			return he_6ghz_oper->primary;
2014		}
2015	} else if (band == NL80211_BAND_S1GHZ) {
2016		tmp = cfg80211_find_elem(WLAN_EID_S1G_OPERATION, ie, ielen);
2017		if (tmp && tmp->datalen >= sizeof(struct ieee80211_s1g_oper_ie)) {
2018			struct ieee80211_s1g_oper_ie *s1gop = (void *)tmp->data;
2019
2020			return s1gop->oper_ch;
2021		}
2022	} else {
2023		tmp = cfg80211_find_elem(WLAN_EID_DS_PARAMS, ie, ielen);
2024		if (tmp && tmp->datalen == 1)
2025			return tmp->data[0];
2026
2027		tmp = cfg80211_find_elem(WLAN_EID_HT_OPERATION, ie, ielen);
2028		if (tmp &&
2029		    tmp->datalen >= sizeof(struct ieee80211_ht_operation)) {
2030			struct ieee80211_ht_operation *htop = (void *)tmp->data;
2031
2032			return htop->primary_chan;
2033		}
2034	}
2035
2036	return -1;
2037}
2038EXPORT_SYMBOL(cfg80211_get_ies_channel_number);
2039
2040/*
2041 * Update RX channel information based on the available frame payload
2042 * information. This is mainly for the 2.4 GHz band where frames can be received
2043 * from neighboring channels and the Beacon frames use the DSSS Parameter Set
2044 * element to indicate the current (transmitting) channel, but this might also
2045 * be needed on other bands if RX frequency does not match with the actual
2046 * operating channel of a BSS, or if the AP reports a different primary channel.
2047 */
2048static struct ieee80211_channel *
2049cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,
2050			 struct ieee80211_channel *channel)
2051{
2052	u32 freq;
2053	int channel_number;
2054	struct ieee80211_channel *alt_channel;
2055
2056	channel_number = cfg80211_get_ies_channel_number(ie, ielen,
2057							 channel->band);
2058
2059	if (channel_number < 0) {
2060		/* No channel information in frame payload */
2061		return channel;
2062	}
2063
2064	freq = ieee80211_channel_to_freq_khz(channel_number, channel->band);
2065
2066	/*
2067	 * Frame info (beacon/prob res) is the same as received channel,
2068	 * no need for further processing.
2069	 */
2070	if (freq == ieee80211_channel_to_khz(channel))
2071		return channel;
2072
2073	alt_channel = ieee80211_get_channel_khz(wiphy, freq);
2074	if (!alt_channel) {
2075		if (channel->band == NL80211_BAND_2GHZ ||
2076		    channel->band == NL80211_BAND_6GHZ) {
2077			/*
2078			 * Better not allow unexpected channels when that could
2079			 * be going beyond the 1-11 range (e.g., discovering
2080			 * BSS on channel 12 when radio is configured for
2081			 * channel 11) or beyond the 6 GHz channel range.
2082			 */
2083			return NULL;
2084		}
2085
2086		/* No match for the payload channel number - ignore it */
2087		return channel;
2088	}
2089
2090	/*
2091	 * Use the channel determined through the payload channel number
2092	 * instead of the RX channel reported by the driver.
2093	 */
2094	if (alt_channel->flags & IEEE80211_CHAN_DISABLED)
2095		return NULL;
2096	return alt_channel;
2097}
2098
2099struct cfg80211_inform_single_bss_data {
2100	struct cfg80211_inform_bss *drv_data;
2101	enum cfg80211_bss_frame_type ftype;
2102	struct ieee80211_channel *channel;
2103	u8 bssid[ETH_ALEN];
2104	u64 tsf;
2105	u16 capability;
2106	u16 beacon_interval;
2107	const u8 *ie;
2108	size_t ielen;
2109
2110	enum {
2111		BSS_SOURCE_DIRECT = 0,
2112		BSS_SOURCE_MBSSID,
2113		BSS_SOURCE_STA_PROFILE,
2114	} bss_source;
2115	/* Set if reporting bss_source != BSS_SOURCE_DIRECT */
2116	struct cfg80211_bss *source_bss;
2117	u8 max_bssid_indicator;
2118	u8 bssid_index;
2119
2120	u8 use_for;
2121	u64 cannot_use_reasons;
2122};
2123
2124static bool cfg80211_6ghz_power_type_valid(const u8 *ie, size_t ielen,
2125					   const u32 flags)
2126{
 
 
2127	const struct element *tmp;
2128	struct ieee80211_he_operation *he_oper;
2129
2130	tmp = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ie, ielen);
2131	if (tmp && tmp->datalen >= sizeof(*he_oper) + 1) {
2132		const struct ieee80211_he_6ghz_oper *he_6ghz_oper;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2133
2134		he_oper = (void *)&tmp->data[1];
2135		he_6ghz_oper = ieee80211_he_6ghz_oper(he_oper);
2136
2137		if (!he_6ghz_oper)
2138			return false;
2139
2140		switch (u8_get_bits(he_6ghz_oper->control,
2141				    IEEE80211_HE_6GHZ_OPER_CTRL_REG_INFO)) {
2142		case IEEE80211_6GHZ_CTRL_REG_LPI_AP:
2143			return true;
2144		case IEEE80211_6GHZ_CTRL_REG_SP_AP:
2145			return !(flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT);
2146		case IEEE80211_6GHZ_CTRL_REG_VLP_AP:
2147			return !(flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT);
2148		}
2149	}
2150	return false;
2151}
2152
2153/* Returned bss is reference counted and must be cleaned up appropriately. */
2154static struct cfg80211_bss *
2155cfg80211_inform_single_bss_data(struct wiphy *wiphy,
2156				struct cfg80211_inform_single_bss_data *data,
2157				gfp_t gfp)
2158{
2159	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
2160	struct cfg80211_inform_bss *drv_data = data->drv_data;
2161	struct cfg80211_bss_ies *ies;
2162	struct ieee80211_channel *channel;
2163	struct cfg80211_internal_bss tmp = {}, *res;
2164	int bss_type;
2165	bool signal_valid;
2166	unsigned long ts;
2167
2168	if (WARN_ON(!wiphy))
2169		return NULL;
2170
2171	if (WARN_ON(wiphy->signal_type == CFG80211_SIGNAL_TYPE_UNSPEC &&
2172		    (drv_data->signal < 0 || drv_data->signal > 100)))
2173		return NULL;
2174
2175	if (WARN_ON(data->bss_source != BSS_SOURCE_DIRECT && !data->source_bss))
2176		return NULL;
2177
2178	channel = data->channel;
2179	if (!channel)
2180		channel = cfg80211_get_bss_channel(wiphy, data->ie, data->ielen,
2181						   drv_data->chan);
2182	if (!channel)
2183		return NULL;
2184
2185	if (channel->band == NL80211_BAND_6GHZ &&
2186	    !cfg80211_6ghz_power_type_valid(data->ie, data->ielen,
2187					    channel->flags)) {
2188		data->use_for = 0;
2189		data->cannot_use_reasons =
2190			NL80211_BSS_CANNOT_USE_6GHZ_PWR_MISMATCH;
2191	}
2192
2193	memcpy(tmp.pub.bssid, data->bssid, ETH_ALEN);
2194	tmp.pub.channel = channel;
2195	if (data->bss_source != BSS_SOURCE_STA_PROFILE)
2196		tmp.pub.signal = drv_data->signal;
2197	else
2198		tmp.pub.signal = 0;
2199	tmp.pub.beacon_interval = data->beacon_interval;
2200	tmp.pub.capability = data->capability;
2201	tmp.ts_boottime = drv_data->boottime_ns;
2202	tmp.parent_tsf = drv_data->parent_tsf;
2203	ether_addr_copy(tmp.parent_bssid, drv_data->parent_bssid);
2204	tmp.pub.chains = drv_data->chains;
2205	memcpy(tmp.pub.chain_signal, drv_data->chain_signal,
2206	       IEEE80211_MAX_CHAINS);
2207	tmp.pub.use_for = data->use_for;
2208	tmp.pub.cannot_use_reasons = data->cannot_use_reasons;
 
2209
2210	switch (data->bss_source) {
2211	case BSS_SOURCE_MBSSID:
2212		tmp.pub.transmitted_bss = data->source_bss;
2213		fallthrough;
2214	case BSS_SOURCE_STA_PROFILE:
2215		ts = bss_from_pub(data->source_bss)->ts;
2216		tmp.pub.bssid_index = data->bssid_index;
2217		tmp.pub.max_bssid_indicator = data->max_bssid_indicator;
2218		break;
2219	case BSS_SOURCE_DIRECT:
2220		ts = jiffies;
2221
2222		if (channel->band == NL80211_BAND_60GHZ) {
2223			bss_type = data->capability &
2224				   WLAN_CAPABILITY_DMG_TYPE_MASK;
2225			if (bss_type == WLAN_CAPABILITY_DMG_TYPE_AP ||
2226			    bss_type == WLAN_CAPABILITY_DMG_TYPE_PBSS)
2227				regulatory_hint_found_beacon(wiphy, channel,
2228							     gfp);
2229		} else {
2230			if (data->capability & WLAN_CAPABILITY_ESS)
2231				regulatory_hint_found_beacon(wiphy, channel,
2232							     gfp);
2233		}
2234		break;
2235	}
2236
2237	/*
2238	 * If we do not know here whether the IEs are from a Beacon or Probe
2239	 * Response frame, we need to pick one of the options and only use it
2240	 * with the driver that does not provide the full Beacon/Probe Response
2241	 * frame. Use Beacon frame pointer to avoid indicating that this should
2242	 * override the IEs pointer should we have received an earlier
2243	 * indication of Probe Response data.
2244	 */
2245	ies = kzalloc(sizeof(*ies) + data->ielen, gfp);
2246	if (!ies)
2247		return NULL;
2248	ies->len = data->ielen;
2249	ies->tsf = data->tsf;
2250	ies->from_beacon = false;
2251	memcpy(ies->data, data->ie, data->ielen);
2252
2253	switch (data->ftype) {
2254	case CFG80211_BSS_FTYPE_BEACON:
2255	case CFG80211_BSS_FTYPE_S1G_BEACON:
2256		ies->from_beacon = true;
2257		fallthrough;
2258	case CFG80211_BSS_FTYPE_UNKNOWN:
2259		rcu_assign_pointer(tmp.pub.beacon_ies, ies);
2260		break;
2261	case CFG80211_BSS_FTYPE_PRESP:
2262		rcu_assign_pointer(tmp.pub.proberesp_ies, ies);
2263		break;
2264	}
2265	rcu_assign_pointer(tmp.pub.ies, ies);
2266
2267	signal_valid = drv_data->chan == channel;
2268	spin_lock_bh(&rdev->bss_lock);
2269	res = __cfg80211_bss_update(rdev, &tmp, signal_valid, ts);
2270	if (!res)
2271		goto drop;
2272
2273	rdev_inform_bss(rdev, &res->pub, ies, drv_data->drv_data);
2274
2275	if (data->bss_source == BSS_SOURCE_MBSSID) {
2276		/* this is a nontransmitting bss, we need to add it to
2277		 * transmitting bss' list if it is not there
2278		 */
2279		if (cfg80211_add_nontrans_list(data->source_bss, &res->pub)) {
2280			if (__cfg80211_unlink_bss(rdev, res)) {
2281				rdev->bss_generation++;
2282				res = NULL;
2283			}
2284		}
2285
2286		if (!res)
2287			goto drop;
2288	}
2289	spin_unlock_bh(&rdev->bss_lock);
2290
2291	trace_cfg80211_return_bss(&res->pub);
2292	/* __cfg80211_bss_update gives us a referenced result */
2293	return &res->pub;
2294
2295drop:
2296	spin_unlock_bh(&rdev->bss_lock);
2297	return NULL;
2298}
2299
2300static const struct element
2301*cfg80211_get_profile_continuation(const u8 *ie, size_t ielen,
2302				   const struct element *mbssid_elem,
2303				   const struct element *sub_elem)
2304{
2305	const u8 *mbssid_end = mbssid_elem->data + mbssid_elem->datalen;
2306	const struct element *next_mbssid;
2307	const struct element *next_sub;
2308
2309	next_mbssid = cfg80211_find_elem(WLAN_EID_MULTIPLE_BSSID,
2310					 mbssid_end,
2311					 ielen - (mbssid_end - ie));
2312
2313	/*
2314	 * If it is not the last subelement in current MBSSID IE or there isn't
2315	 * a next MBSSID IE - profile is complete.
2316	*/
2317	if ((sub_elem->data + sub_elem->datalen < mbssid_end - 1) ||
2318	    !next_mbssid)
2319		return NULL;
2320
2321	/* For any length error, just return NULL */
2322
2323	if (next_mbssid->datalen < 4)
2324		return NULL;
2325
2326	next_sub = (void *)&next_mbssid->data[1];
2327
2328	if (next_mbssid->data + next_mbssid->datalen <
2329	    next_sub->data + next_sub->datalen)
2330		return NULL;
2331
2332	if (next_sub->id != 0 || next_sub->datalen < 2)
2333		return NULL;
2334
2335	/*
2336	 * Check if the first element in the next sub element is a start
2337	 * of a new profile
2338	 */
2339	return next_sub->data[0] == WLAN_EID_NON_TX_BSSID_CAP ?
2340	       NULL : next_mbssid;
2341}
2342
2343size_t cfg80211_merge_profile(const u8 *ie, size_t ielen,
2344			      const struct element *mbssid_elem,
2345			      const struct element *sub_elem,
2346			      u8 *merged_ie, size_t max_copy_len)
2347{
2348	size_t copied_len = sub_elem->datalen;
2349	const struct element *next_mbssid;
2350
2351	if (sub_elem->datalen > max_copy_len)
2352		return 0;
2353
2354	memcpy(merged_ie, sub_elem->data, sub_elem->datalen);
2355
2356	while ((next_mbssid = cfg80211_get_profile_continuation(ie, ielen,
2357								mbssid_elem,
2358								sub_elem))) {
2359		const struct element *next_sub = (void *)&next_mbssid->data[1];
2360
2361		if (copied_len + next_sub->datalen > max_copy_len)
2362			break;
2363		memcpy(merged_ie + copied_len, next_sub->data,
2364		       next_sub->datalen);
2365		copied_len += next_sub->datalen;
2366	}
2367
2368	return copied_len;
2369}
2370EXPORT_SYMBOL(cfg80211_merge_profile);
2371
2372static void
2373cfg80211_parse_mbssid_data(struct wiphy *wiphy,
2374			   struct cfg80211_inform_single_bss_data *tx_data,
2375			   struct cfg80211_bss *source_bss,
2376			   gfp_t gfp)
2377{
2378	struct cfg80211_inform_single_bss_data data = {
2379		.drv_data = tx_data->drv_data,
2380		.ftype = tx_data->ftype,
2381		.tsf = tx_data->tsf,
2382		.beacon_interval = tx_data->beacon_interval,
2383		.source_bss = source_bss,
2384		.bss_source = BSS_SOURCE_MBSSID,
2385		.use_for = tx_data->use_for,
2386		.cannot_use_reasons = tx_data->cannot_use_reasons,
2387	};
2388	const u8 *mbssid_index_ie;
2389	const struct element *elem, *sub;
2390	u8 *new_ie, *profile;
2391	u64 seen_indices = 0;
2392	struct cfg80211_bss *bss;
2393
2394	if (!source_bss)
2395		return;
2396	if (!cfg80211_find_elem(WLAN_EID_MULTIPLE_BSSID,
2397				tx_data->ie, tx_data->ielen))
2398		return;
2399	if (!wiphy->support_mbssid)
2400		return;
2401	if (wiphy->support_only_he_mbssid &&
2402	    !cfg80211_find_ext_elem(WLAN_EID_EXT_HE_CAPABILITY,
2403				    tx_data->ie, tx_data->ielen))
2404		return;
2405
2406	new_ie = kmalloc(IEEE80211_MAX_DATA_LEN, gfp);
2407	if (!new_ie)
2408		return;
2409
2410	profile = kmalloc(tx_data->ielen, gfp);
2411	if (!profile)
2412		goto out;
2413
2414	for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID,
2415			    tx_data->ie, tx_data->ielen) {
2416		if (elem->datalen < 4)
2417			continue;
2418		if (elem->data[0] < 1 || (int)elem->data[0] > 8)
2419			continue;
2420		for_each_element(sub, elem->data + 1, elem->datalen - 1) {
2421			u8 profile_len;
2422
2423			if (sub->id != 0 || sub->datalen < 4) {
2424				/* not a valid BSS profile */
2425				continue;
2426			}
2427
2428			if (sub->data[0] != WLAN_EID_NON_TX_BSSID_CAP ||
2429			    sub->data[1] != 2) {
2430				/* The first element within the Nontransmitted
2431				 * BSSID Profile is not the Nontransmitted
2432				 * BSSID Capability element.
2433				 */
2434				continue;
2435			}
2436
2437			memset(profile, 0, tx_data->ielen);
2438			profile_len = cfg80211_merge_profile(tx_data->ie,
2439							     tx_data->ielen,
2440							     elem,
2441							     sub,
2442							     profile,
2443							     tx_data->ielen);
2444
2445			/* found a Nontransmitted BSSID Profile */
2446			mbssid_index_ie = cfg80211_find_ie
2447				(WLAN_EID_MULTI_BSSID_IDX,
2448				 profile, profile_len);
2449			if (!mbssid_index_ie || mbssid_index_ie[1] < 1 ||
2450			    mbssid_index_ie[2] == 0 ||
2451			    mbssid_index_ie[2] > 46) {
 
2452				/* No valid Multiple BSSID-Index element */
2453				continue;
2454			}
2455
2456			if (seen_indices & BIT_ULL(mbssid_index_ie[2]))
2457				/* We don't support legacy split of a profile */
2458				net_dbg_ratelimited("Partial info for BSSID index %d\n",
2459						    mbssid_index_ie[2]);
2460
2461			seen_indices |= BIT_ULL(mbssid_index_ie[2]);
2462
2463			data.bssid_index = mbssid_index_ie[2];
2464			data.max_bssid_indicator = elem->data[0];
2465
2466			cfg80211_gen_new_bssid(tx_data->bssid,
2467					       data.max_bssid_indicator,
2468					       data.bssid_index,
2469					       data.bssid);
2470
2471			memset(new_ie, 0, IEEE80211_MAX_DATA_LEN);
2472			data.ie = new_ie;
2473			data.ielen = cfg80211_gen_new_ie(tx_data->ie,
2474							 tx_data->ielen,
2475							 profile,
2476							 profile_len,
2477							 new_ie,
2478							 IEEE80211_MAX_DATA_LEN);
2479			if (!data.ielen)
2480				continue;
2481
2482			data.capability = get_unaligned_le16(profile + 2);
2483			bss = cfg80211_inform_single_bss_data(wiphy, &data, gfp);
2484			if (!bss)
2485				break;
2486			cfg80211_put_bss(wiphy, bss);
2487		}
2488	}
2489
2490out:
2491	kfree(new_ie);
2492	kfree(profile);
2493}
2494
2495ssize_t cfg80211_defragment_element(const struct element *elem, const u8 *ies,
2496				    size_t ieslen, u8 *data, size_t data_len,
2497				    u8 frag_id)
2498{
2499	const struct element *next;
2500	ssize_t copied;
2501	u8 elem_datalen;
2502
2503	if (!elem)
2504		return -EINVAL;
2505
2506	/* elem might be invalid after the memmove */
2507	next = (void *)(elem->data + elem->datalen);
2508	elem_datalen = elem->datalen;
2509
2510	if (elem->id == WLAN_EID_EXTENSION) {
2511		copied = elem->datalen - 1;
2512
2513		if (data) {
2514			if (copied > data_len)
2515				return -ENOSPC;
2516
2517			memmove(data, elem->data + 1, copied);
2518		}
2519	} else {
2520		copied = elem->datalen;
2521
2522		if (data) {
2523			if (copied > data_len)
2524				return -ENOSPC;
2525
2526			memmove(data, elem->data, copied);
2527		}
2528	}
2529
2530	/* Fragmented elements must have 255 bytes */
2531	if (elem_datalen < 255)
2532		return copied;
2533
2534	for (elem = next;
2535	     elem->data < ies + ieslen &&
2536		elem->data + elem->datalen <= ies + ieslen;
2537	     elem = next) {
2538		/* elem might be invalid after the memmove */
2539		next = (void *)(elem->data + elem->datalen);
2540
2541		if (elem->id != frag_id)
2542			break;
2543
2544		elem_datalen = elem->datalen;
2545
2546		if (data) {
2547			if (copied + elem_datalen > data_len)
2548				return -ENOSPC;
2549
2550			memmove(data + copied, elem->data, elem_datalen);
2551		}
2552
2553		copied += elem_datalen;
2554
2555		/* Only the last fragment may be short */
2556		if (elem_datalen != 255)
2557			break;
2558	}
2559
2560	return copied;
2561}
2562EXPORT_SYMBOL(cfg80211_defragment_element);
2563
2564struct cfg80211_mle {
2565	struct ieee80211_multi_link_elem *mle;
2566	struct ieee80211_mle_per_sta_profile
2567		*sta_prof[IEEE80211_MLD_MAX_NUM_LINKS];
2568	ssize_t sta_prof_len[IEEE80211_MLD_MAX_NUM_LINKS];
2569
2570	u8 data[];
2571};
2572
2573static struct cfg80211_mle *
2574cfg80211_defrag_mle(const struct element *mle, const u8 *ie, size_t ielen,
2575		    gfp_t gfp)
2576{
2577	const struct element *elem;
2578	struct cfg80211_mle *res;
2579	size_t buf_len;
2580	ssize_t mle_len;
2581	u8 common_size, idx;
2582
2583	if (!mle || !ieee80211_mle_size_ok(mle->data + 1, mle->datalen - 1))
2584		return NULL;
2585
2586	/* Required length for first defragmentation */
2587	buf_len = mle->datalen - 1;
2588	for_each_element(elem, mle->data + mle->datalen,
2589			 ielen - sizeof(*mle) + mle->datalen) {
2590		if (elem->id != WLAN_EID_FRAGMENT)
2591			break;
2592
2593		buf_len += elem->datalen;
2594	}
2595
2596	res = kzalloc(struct_size(res, data, buf_len), gfp);
2597	if (!res)
2598		return NULL;
2599
2600	mle_len = cfg80211_defragment_element(mle, ie, ielen,
2601					      res->data, buf_len,
2602					      WLAN_EID_FRAGMENT);
2603	if (mle_len < 0)
2604		goto error;
2605
2606	res->mle = (void *)res->data;
2607
2608	/* Find the sub-element area in the buffer */
2609	common_size = ieee80211_mle_common_size((u8 *)res->mle);
2610	ie = res->data + common_size;
2611	ielen = mle_len - common_size;
2612
2613	idx = 0;
2614	for_each_element_id(elem, IEEE80211_MLE_SUBELEM_PER_STA_PROFILE,
2615			    ie, ielen) {
2616		res->sta_prof[idx] = (void *)elem->data;
2617		res->sta_prof_len[idx] = elem->datalen;
2618
2619		idx++;
2620		if (idx >= IEEE80211_MLD_MAX_NUM_LINKS)
2621			break;
2622	}
2623	if (!for_each_element_completed(elem, ie, ielen))
2624		goto error;
2625
2626	/* Defragment sta_info in-place */
2627	for (idx = 0; idx < IEEE80211_MLD_MAX_NUM_LINKS && res->sta_prof[idx];
2628	     idx++) {
2629		if (res->sta_prof_len[idx] < 255)
2630			continue;
2631
2632		elem = (void *)res->sta_prof[idx] - 2;
2633
2634		if (idx + 1 < ARRAY_SIZE(res->sta_prof) &&
2635		    res->sta_prof[idx + 1])
2636			buf_len = (u8 *)res->sta_prof[idx + 1] -
2637				  (u8 *)res->sta_prof[idx];
2638		else
2639			buf_len = ielen + ie - (u8 *)elem;
2640
2641		res->sta_prof_len[idx] =
2642			cfg80211_defragment_element(elem,
2643						    (u8 *)elem, buf_len,
2644						    (u8 *)res->sta_prof[idx],
2645						    buf_len,
2646						    IEEE80211_MLE_SUBELEM_FRAGMENT);
2647		if (res->sta_prof_len[idx] < 0)
2648			goto error;
2649	}
2650
2651	return res;
2652
2653error:
2654	kfree(res);
2655	return NULL;
2656}
2657
2658struct tbtt_info_iter_data {
2659	const struct ieee80211_neighbor_ap_info *ap_info;
2660	u8 param_ch_count;
2661	u32 use_for;
2662	u8 mld_id, link_id;
2663	bool non_tx;
2664};
2665
2666static enum cfg80211_rnr_iter_ret
2667cfg802121_mld_ap_rnr_iter(void *_data, u8 type,
2668			  const struct ieee80211_neighbor_ap_info *info,
2669			  const u8 *tbtt_info, u8 tbtt_info_len)
2670{
2671	const struct ieee80211_rnr_mld_params *mld_params;
2672	struct tbtt_info_iter_data *data = _data;
2673	u8 link_id;
2674	bool non_tx = false;
2675
2676	if (type == IEEE80211_TBTT_INFO_TYPE_TBTT &&
2677	    tbtt_info_len >= offsetofend(struct ieee80211_tbtt_info_ge_11,
2678					 mld_params)) {
2679		const struct ieee80211_tbtt_info_ge_11 *tbtt_info_ge_11 =
2680			(void *)tbtt_info;
2681
2682		non_tx = (tbtt_info_ge_11->bss_params &
2683			  (IEEE80211_RNR_TBTT_PARAMS_MULTI_BSSID |
2684			   IEEE80211_RNR_TBTT_PARAMS_TRANSMITTED_BSSID)) ==
2685			 IEEE80211_RNR_TBTT_PARAMS_MULTI_BSSID;
2686		mld_params = &tbtt_info_ge_11->mld_params;
2687	} else if (type == IEEE80211_TBTT_INFO_TYPE_MLD &&
2688		 tbtt_info_len >= sizeof(struct ieee80211_rnr_mld_params))
2689		mld_params = (void *)tbtt_info;
2690	else
2691		return RNR_ITER_CONTINUE;
2692
2693	link_id = le16_get_bits(mld_params->params,
2694				IEEE80211_RNR_MLD_PARAMS_LINK_ID);
2695
2696	if (data->mld_id != mld_params->mld_id)
2697		return RNR_ITER_CONTINUE;
2698
2699	if (data->link_id != link_id)
2700		return RNR_ITER_CONTINUE;
2701
2702	data->ap_info = info;
2703	data->param_ch_count =
2704		le16_get_bits(mld_params->params,
2705			      IEEE80211_RNR_MLD_PARAMS_BSS_CHANGE_COUNT);
2706	data->non_tx = non_tx;
2707
2708	if (type == IEEE80211_TBTT_INFO_TYPE_TBTT)
2709		data->use_for = NL80211_BSS_USE_FOR_ALL;
2710	else
2711		data->use_for = NL80211_BSS_USE_FOR_MLD_LINK;
2712	return RNR_ITER_BREAK;
2713}
2714
2715static u8
2716cfg80211_rnr_info_for_mld_ap(const u8 *ie, size_t ielen, u8 mld_id, u8 link_id,
2717			     const struct ieee80211_neighbor_ap_info **ap_info,
2718			     u8 *param_ch_count, bool *non_tx)
2719{
2720	struct tbtt_info_iter_data data = {
2721		.mld_id = mld_id,
2722		.link_id = link_id,
2723	};
2724
2725	cfg80211_iter_rnr(ie, ielen, cfg802121_mld_ap_rnr_iter, &data);
2726
2727	*ap_info = data.ap_info;
2728	*param_ch_count = data.param_ch_count;
2729	*non_tx = data.non_tx;
2730
2731	return data.use_for;
2732}
2733
2734static struct element *
2735cfg80211_gen_reporter_rnr(struct cfg80211_bss *source_bss, bool is_mbssid,
2736			  bool same_mld, u8 link_id, u8 bss_change_count,
2737			  gfp_t gfp)
2738{
2739	const struct cfg80211_bss_ies *ies;
2740	struct ieee80211_neighbor_ap_info ap_info;
2741	struct ieee80211_tbtt_info_ge_11 tbtt_info;
2742	u32 short_ssid;
2743	const struct element *elem;
2744	struct element *res;
2745
2746	/*
2747	 * We only generate the RNR to permit ML lookups. For that we do not
2748	 * need an entry for the corresponding transmitting BSS, lets just skip
2749	 * it even though it would be easy to add.
2750	 */
2751	if (!same_mld)
2752		return NULL;
2753
2754	/* We could use tx_data->ies if we change cfg80211_calc_short_ssid */
2755	rcu_read_lock();
2756	ies = rcu_dereference(source_bss->ies);
2757
2758	ap_info.tbtt_info_len = offsetofend(typeof(tbtt_info), mld_params);
2759	ap_info.tbtt_info_hdr =
2760			u8_encode_bits(IEEE80211_TBTT_INFO_TYPE_TBTT,
2761				       IEEE80211_AP_INFO_TBTT_HDR_TYPE) |
2762			u8_encode_bits(0, IEEE80211_AP_INFO_TBTT_HDR_COUNT);
2763
2764	ap_info.channel = ieee80211_frequency_to_channel(source_bss->channel->center_freq);
2765
2766	/* operating class */
2767	elem = cfg80211_find_elem(WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
2768				  ies->data, ies->len);
2769	if (elem && elem->datalen >= 1) {
2770		ap_info.op_class = elem->data[0];
2771	} else {
2772		struct cfg80211_chan_def chandef;
2773
2774		/* The AP is not providing us with anything to work with. So
2775		 * make up a somewhat reasonable operating class, but don't
2776		 * bother with it too much as no one will ever use the
2777		 * information.
2778		 */
2779		cfg80211_chandef_create(&chandef, source_bss->channel,
2780					NL80211_CHAN_NO_HT);
2781
2782		if (!ieee80211_chandef_to_operating_class(&chandef,
2783							  &ap_info.op_class))
2784			goto out_unlock;
2785	}
2786
2787	/* Just set TBTT offset and PSD 20 to invalid/unknown */
2788	tbtt_info.tbtt_offset = 255;
2789	tbtt_info.psd_20 = IEEE80211_RNR_TBTT_PARAMS_PSD_RESERVED;
2790
2791	memcpy(tbtt_info.bssid, source_bss->bssid, ETH_ALEN);
2792	if (cfg80211_calc_short_ssid(ies, &elem, &short_ssid))
2793		goto out_unlock;
2794
2795	rcu_read_unlock();
2796
2797	tbtt_info.short_ssid = cpu_to_le32(short_ssid);
2798
2799	tbtt_info.bss_params = IEEE80211_RNR_TBTT_PARAMS_SAME_SSID;
2800
2801	if (is_mbssid) {
2802		tbtt_info.bss_params |= IEEE80211_RNR_TBTT_PARAMS_MULTI_BSSID;
2803		tbtt_info.bss_params |= IEEE80211_RNR_TBTT_PARAMS_TRANSMITTED_BSSID;
2804	}
2805
2806	tbtt_info.mld_params.mld_id = 0;
2807	tbtt_info.mld_params.params =
2808		le16_encode_bits(link_id, IEEE80211_RNR_MLD_PARAMS_LINK_ID) |
2809		le16_encode_bits(bss_change_count,
2810				 IEEE80211_RNR_MLD_PARAMS_BSS_CHANGE_COUNT);
2811
2812	res = kzalloc(struct_size(res, data,
2813				  sizeof(ap_info) + ap_info.tbtt_info_len),
2814		      gfp);
2815	if (!res)
2816		return NULL;
2817
2818	/* Copy the data */
2819	res->id = WLAN_EID_REDUCED_NEIGHBOR_REPORT;
2820	res->datalen = sizeof(ap_info) + ap_info.tbtt_info_len;
2821	memcpy(res->data, &ap_info, sizeof(ap_info));
2822	memcpy(res->data + sizeof(ap_info), &tbtt_info, ap_info.tbtt_info_len);
2823
2824	return res;
2825
2826out_unlock:
2827	rcu_read_unlock();
2828	return NULL;
2829}
2830
2831static void
2832cfg80211_parse_ml_elem_sta_data(struct wiphy *wiphy,
2833				struct cfg80211_inform_single_bss_data *tx_data,
2834				struct cfg80211_bss *source_bss,
2835				const struct element *elem,
2836				gfp_t gfp)
2837{
2838	struct cfg80211_inform_single_bss_data data = {
2839		.drv_data = tx_data->drv_data,
2840		.ftype = tx_data->ftype,
2841		.source_bss = source_bss,
2842		.bss_source = BSS_SOURCE_STA_PROFILE,
2843	};
2844	struct element *reporter_rnr = NULL;
2845	struct ieee80211_multi_link_elem *ml_elem;
2846	struct cfg80211_mle *mle;
 
 
 
2847	u16 control;
2848	u8 ml_common_len;
2849	u8 *new_ie = NULL;
2850	struct cfg80211_bss *bss;
2851	u8 mld_id, reporter_link_id, bss_change_count;
2852	u16 seen_links = 0;
2853	u8 i;
2854
2855	if (!ieee80211_mle_type_ok(elem->data + 1,
2856				   IEEE80211_ML_CONTROL_TYPE_BASIC,
2857				   elem->datalen - 1))
2858		return;
2859
2860	ml_elem = (void *)(elem->data + 1);
2861	control = le16_to_cpu(ml_elem->control);
2862	ml_common_len = ml_elem->variable[0];
2863
2864	/* Must be present when transmitted by an AP (in a probe response) */
2865	if (!(control & IEEE80211_MLC_BASIC_PRES_BSS_PARAM_CH_CNT) ||
2866	    !(control & IEEE80211_MLC_BASIC_PRES_LINK_ID) ||
2867	    !(control & IEEE80211_MLC_BASIC_PRES_MLD_CAPA_OP))
2868		return;
2869
2870	reporter_link_id = ieee80211_mle_get_link_id(elem->data + 1);
2871	bss_change_count = ieee80211_mle_get_bss_param_ch_cnt(elem->data + 1);
2872
2873	/*
2874	 * The MLD ID of the reporting AP is always zero. It is set if the AP
2875	 * is part of an MBSSID set and will be non-zero for ML Elements
2876	 * relating to a nontransmitted BSS (matching the Multi-BSSID Index,
2877	 * Draft P802.11be_D3.2, 35.3.4.2)
2878	 */
2879	mld_id = ieee80211_mle_get_mld_id(elem->data + 1);
2880
2881	/* Fully defrag the ML element for sta information/profile iteration */
2882	mle = cfg80211_defrag_mle(elem, tx_data->ie, tx_data->ielen, gfp);
2883	if (!mle)
2884		return;
2885
2886	/* No point in doing anything if there is no per-STA profile */
2887	if (!mle->sta_prof[0])
2888		goto out;
2889
2890	new_ie = kmalloc(IEEE80211_MAX_DATA_LEN, gfp);
2891	if (!new_ie)
2892		goto out;
2893
2894	reporter_rnr = cfg80211_gen_reporter_rnr(source_bss,
2895						 u16_get_bits(control,
2896							      IEEE80211_MLC_BASIC_PRES_MLD_ID),
2897						 mld_id == 0, reporter_link_id,
2898						 bss_change_count,
2899						 gfp);
2900
 
 
 
 
 
 
 
2901	for (i = 0; i < ARRAY_SIZE(mle->sta_prof) && mle->sta_prof[i]; i++) {
2902		const struct ieee80211_neighbor_ap_info *ap_info;
2903		enum nl80211_band band;
2904		u32 freq;
2905		const u8 *profile;
2906		ssize_t profile_len;
2907		u8 param_ch_count;
2908		u8 link_id, use_for;
2909		bool non_tx;
2910
2911		if (!ieee80211_mle_basic_sta_prof_size_ok((u8 *)mle->sta_prof[i],
2912							  mle->sta_prof_len[i]))
2913			continue;
2914
2915		control = le16_to_cpu(mle->sta_prof[i]->control);
2916
2917		if (!(control & IEEE80211_MLE_STA_CONTROL_COMPLETE_PROFILE))
2918			continue;
2919
2920		link_id = u16_get_bits(control,
2921				       IEEE80211_MLE_STA_CONTROL_LINK_ID);
2922		if (seen_links & BIT(link_id))
2923			break;
2924		seen_links |= BIT(link_id);
2925
2926		if (!(control & IEEE80211_MLE_STA_CONTROL_BEACON_INT_PRESENT) ||
2927		    !(control & IEEE80211_MLE_STA_CONTROL_TSF_OFFS_PRESENT) ||
2928		    !(control & IEEE80211_MLE_STA_CONTROL_STA_MAC_ADDR_PRESENT))
2929			continue;
2930
2931		memcpy(data.bssid, mle->sta_prof[i]->variable, ETH_ALEN);
2932		data.beacon_interval =
2933			get_unaligned_le16(mle->sta_prof[i]->variable + 6);
2934		data.tsf = tx_data->tsf +
2935			   get_unaligned_le64(mle->sta_prof[i]->variable + 8);
2936
2937		/* sta_info_len counts itself */
2938		profile = mle->sta_prof[i]->variable +
2939			  mle->sta_prof[i]->sta_info_len - 1;
2940		profile_len = (u8 *)mle->sta_prof[i] + mle->sta_prof_len[i] -
2941			      profile;
2942
2943		if (profile_len < 2)
2944			continue;
2945
2946		data.capability = get_unaligned_le16(profile);
2947		profile += 2;
2948		profile_len -= 2;
2949
2950		/* Find in RNR to look up channel information */
2951		use_for = cfg80211_rnr_info_for_mld_ap(tx_data->ie,
2952						       tx_data->ielen,
2953						       mld_id, link_id,
2954						       &ap_info,
2955						       &param_ch_count,
2956						       &non_tx);
2957		if (!use_for)
2958			continue;
2959
2960		/*
2961		 * As of 802.11be_D5.0, the specification does not give us any
2962		 * way of discovering both the MaxBSSID and the Multiple-BSSID
2963		 * Index. It does seem like the Multiple-BSSID Index element
2964		 * may be provided, but section 9.4.2.45 explicitly forbids
2965		 * including a Multiple-BSSID Element (in this case without any
2966		 * subelements).
2967		 * Without both pieces of information we cannot calculate the
2968		 * reference BSSID, so simply ignore the BSS.
2969		 */
2970		if (non_tx)
2971			continue;
2972
2973		/* We could sanity check the BSSID is included */
2974
2975		if (!ieee80211_operating_class_to_band(ap_info->op_class,
2976						       &band))
2977			continue;
2978
2979		freq = ieee80211_channel_to_freq_khz(ap_info->channel, band);
2980		data.channel = ieee80211_get_channel_khz(wiphy, freq);
2981
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2982		if (use_for == NL80211_BSS_USE_FOR_MLD_LINK &&
2983		    !(wiphy->flags & WIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY)) {
2984			use_for = 0;
2985			data.cannot_use_reasons =
2986				NL80211_BSS_CANNOT_USE_NSTR_NONPRIMARY;
2987		}
2988		data.use_for = use_for;
2989
2990		/* Generate new elements */
2991		memset(new_ie, 0, IEEE80211_MAX_DATA_LEN);
2992		data.ie = new_ie;
2993		data.ielen = cfg80211_gen_new_ie(tx_data->ie, tx_data->ielen,
2994						 profile, profile_len,
2995						 new_ie,
2996						 IEEE80211_MAX_DATA_LEN);
2997		if (!data.ielen)
2998			continue;
2999
3000		/* The generated elements do not contain:
3001		 *  - Basic ML element
3002		 *  - A TBTT entry in the RNR for the transmitting AP
3003		 *
3004		 * This information is needed both internally and in userspace
3005		 * as such, we should append it here.
3006		 */
3007		if (data.ielen + 3 + sizeof(*ml_elem) + ml_common_len >
3008		    IEEE80211_MAX_DATA_LEN)
3009			continue;
3010
3011		/* Copy the Basic Multi-Link element including the common
3012		 * information, and then fix up the link ID and BSS param
3013		 * change count.
3014		 * Note that the ML element length has been verified and we
3015		 * also checked that it contains the link ID.
3016		 */
3017		new_ie[data.ielen++] = WLAN_EID_EXTENSION;
3018		new_ie[data.ielen++] = 1 + sizeof(*ml_elem) + ml_common_len;
3019		new_ie[data.ielen++] = WLAN_EID_EXT_EHT_MULTI_LINK;
3020		memcpy(new_ie + data.ielen, ml_elem,
3021		       sizeof(*ml_elem) + ml_common_len);
3022
3023		new_ie[data.ielen + sizeof(*ml_elem) + 1 + ETH_ALEN] = link_id;
3024		new_ie[data.ielen + sizeof(*ml_elem) + 1 + ETH_ALEN + 1] =
3025			param_ch_count;
3026
3027		data.ielen += sizeof(*ml_elem) + ml_common_len;
3028
3029		if (reporter_rnr && (use_for & NL80211_BSS_USE_FOR_NORMAL)) {
3030			if (data.ielen + sizeof(struct element) +
3031			    reporter_rnr->datalen > IEEE80211_MAX_DATA_LEN)
3032				continue;
3033
3034			memcpy(new_ie + data.ielen, reporter_rnr,
3035			       sizeof(struct element) + reporter_rnr->datalen);
3036			data.ielen += sizeof(struct element) +
3037				      reporter_rnr->datalen;
3038		}
3039
3040		bss = cfg80211_inform_single_bss_data(wiphy, &data, gfp);
3041		if (!bss)
3042			break;
3043		cfg80211_put_bss(wiphy, bss);
3044	}
3045
3046out:
3047	kfree(reporter_rnr);
3048	kfree(new_ie);
3049	kfree(mle);
3050}
3051
3052static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy,
3053				       struct cfg80211_inform_single_bss_data *tx_data,
3054				       struct cfg80211_bss *source_bss,
3055				       gfp_t gfp)
3056{
3057	const struct element *elem;
3058
3059	if (!source_bss)
3060		return;
3061
3062	if (tx_data->ftype != CFG80211_BSS_FTYPE_PRESP)
3063		return;
3064
3065	for_each_element_extid(elem, WLAN_EID_EXT_EHT_MULTI_LINK,
3066			       tx_data->ie, tx_data->ielen)
3067		cfg80211_parse_ml_elem_sta_data(wiphy, tx_data, source_bss,
3068						elem, gfp);
3069}
3070
3071struct cfg80211_bss *
3072cfg80211_inform_bss_data(struct wiphy *wiphy,
3073			 struct cfg80211_inform_bss *data,
3074			 enum cfg80211_bss_frame_type ftype,
3075			 const u8 *bssid, u64 tsf, u16 capability,
3076			 u16 beacon_interval, const u8 *ie, size_t ielen,
3077			 gfp_t gfp)
3078{
3079	struct cfg80211_inform_single_bss_data inform_data = {
3080		.drv_data = data,
3081		.ftype = ftype,
3082		.tsf = tsf,
3083		.capability = capability,
3084		.beacon_interval = beacon_interval,
3085		.ie = ie,
3086		.ielen = ielen,
3087		.use_for = data->restrict_use ?
3088				data->use_for :
3089				NL80211_BSS_USE_FOR_ALL,
3090		.cannot_use_reasons = data->cannot_use_reasons,
3091	};
3092	struct cfg80211_bss *res;
3093
3094	memcpy(inform_data.bssid, bssid, ETH_ALEN);
3095
3096	res = cfg80211_inform_single_bss_data(wiphy, &inform_data, gfp);
3097	if (!res)
3098		return NULL;
3099
3100	/* don't do any further MBSSID/ML handling for S1G */
3101	if (ftype == CFG80211_BSS_FTYPE_S1G_BEACON)
3102		return res;
3103
3104	cfg80211_parse_mbssid_data(wiphy, &inform_data, res, gfp);
3105
3106	cfg80211_parse_ml_sta_data(wiphy, &inform_data, res, gfp);
3107
3108	return res;
3109}
3110EXPORT_SYMBOL(cfg80211_inform_bss_data);
3111
3112struct cfg80211_bss *
3113cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
3114			       struct cfg80211_inform_bss *data,
3115			       struct ieee80211_mgmt *mgmt, size_t len,
3116			       gfp_t gfp)
3117{
3118	size_t min_hdr_len = offsetof(struct ieee80211_mgmt,
3119				      u.probe_resp.variable);
3120	struct ieee80211_ext *ext = NULL;
3121	enum cfg80211_bss_frame_type ftype;
3122	u16 beacon_interval;
3123	const u8 *bssid;
3124	u16 capability;
3125	const u8 *ie;
3126	size_t ielen;
3127	u64 tsf;
3128
3129	if (WARN_ON(!mgmt))
3130		return NULL;
3131
3132	if (WARN_ON(!wiphy))
3133		return NULL;
3134
3135	BUILD_BUG_ON(offsetof(struct ieee80211_mgmt, u.probe_resp.variable) !=
3136		     offsetof(struct ieee80211_mgmt, u.beacon.variable));
3137
3138	trace_cfg80211_inform_bss_frame(wiphy, data, mgmt, len);
3139
3140	if (ieee80211_is_s1g_beacon(mgmt->frame_control)) {
3141		ext = (void *) mgmt;
3142		min_hdr_len = offsetof(struct ieee80211_ext, u.s1g_beacon);
3143		if (ieee80211_is_s1g_short_beacon(mgmt->frame_control))
3144			min_hdr_len = offsetof(struct ieee80211_ext,
3145					       u.s1g_short_beacon.variable);
 
 
 
 
 
 
 
3146	}
3147
3148	if (WARN_ON(len < min_hdr_len))
3149		return NULL;
3150
3151	ielen = len - min_hdr_len;
3152	ie = mgmt->u.probe_resp.variable;
3153	if (ext) {
3154		const struct ieee80211_s1g_bcn_compat_ie *compat;
3155		const struct element *elem;
3156
3157		if (ieee80211_is_s1g_short_beacon(mgmt->frame_control))
3158			ie = ext->u.s1g_short_beacon.variable;
3159		else
3160			ie = ext->u.s1g_beacon.variable;
3161
3162		elem = cfg80211_find_elem(WLAN_EID_S1G_BCN_COMPAT, ie, ielen);
3163		if (!elem)
3164			return NULL;
3165		if (elem->datalen < sizeof(*compat))
3166			return NULL;
3167		compat = (void *)elem->data;
3168		bssid = ext->u.s1g_beacon.sa;
3169		capability = le16_to_cpu(compat->compat_info);
3170		beacon_interval = le16_to_cpu(compat->beacon_int);
3171	} else {
3172		bssid = mgmt->bssid;
3173		beacon_interval = le16_to_cpu(mgmt->u.probe_resp.beacon_int);
3174		capability = le16_to_cpu(mgmt->u.probe_resp.capab_info);
3175	}
3176
3177	tsf = le64_to_cpu(mgmt->u.probe_resp.timestamp);
3178
3179	if (ieee80211_is_probe_resp(mgmt->frame_control))
3180		ftype = CFG80211_BSS_FTYPE_PRESP;
3181	else if (ext)
3182		ftype = CFG80211_BSS_FTYPE_S1G_BEACON;
3183	else
3184		ftype = CFG80211_BSS_FTYPE_BEACON;
3185
3186	return cfg80211_inform_bss_data(wiphy, data, ftype,
3187					bssid, tsf, capability,
3188					beacon_interval, ie, ielen,
3189					gfp);
3190}
3191EXPORT_SYMBOL(cfg80211_inform_bss_frame_data);
3192
3193void cfg80211_ref_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
3194{
3195	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
3196
3197	if (!pub)
3198		return;
3199
3200	spin_lock_bh(&rdev->bss_lock);
3201	bss_ref_get(rdev, bss_from_pub(pub));
3202	spin_unlock_bh(&rdev->bss_lock);
3203}
3204EXPORT_SYMBOL(cfg80211_ref_bss);
3205
3206void cfg80211_put_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
3207{
3208	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
3209
3210	if (!pub)
3211		return;
3212
3213	spin_lock_bh(&rdev->bss_lock);
3214	bss_ref_put(rdev, bss_from_pub(pub));
3215	spin_unlock_bh(&rdev->bss_lock);
3216}
3217EXPORT_SYMBOL(cfg80211_put_bss);
3218
3219void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
3220{
3221	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
3222	struct cfg80211_internal_bss *bss, *tmp1;
3223	struct cfg80211_bss *nontrans_bss, *tmp;
3224
3225	if (WARN_ON(!pub))
3226		return;
3227
3228	bss = bss_from_pub(pub);
3229
3230	spin_lock_bh(&rdev->bss_lock);
3231	if (list_empty(&bss->list))
3232		goto out;
3233
3234	list_for_each_entry_safe(nontrans_bss, tmp,
3235				 &pub->nontrans_list,
3236				 nontrans_list) {
3237		tmp1 = bss_from_pub(nontrans_bss);
3238		if (__cfg80211_unlink_bss(rdev, tmp1))
3239			rdev->bss_generation++;
3240	}
3241
3242	if (__cfg80211_unlink_bss(rdev, bss))
3243		rdev->bss_generation++;
3244out:
3245	spin_unlock_bh(&rdev->bss_lock);
3246}
3247EXPORT_SYMBOL(cfg80211_unlink_bss);
3248
3249void cfg80211_bss_iter(struct wiphy *wiphy,
3250		       struct cfg80211_chan_def *chandef,
3251		       void (*iter)(struct wiphy *wiphy,
3252				    struct cfg80211_bss *bss,
3253				    void *data),
3254		       void *iter_data)
3255{
3256	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
3257	struct cfg80211_internal_bss *bss;
3258
3259	spin_lock_bh(&rdev->bss_lock);
3260
3261	list_for_each_entry(bss, &rdev->bss_list, list) {
3262		if (!chandef || cfg80211_is_sub_chan(chandef, bss->pub.channel,
3263						     false))
3264			iter(wiphy, &bss->pub, iter_data);
3265	}
3266
3267	spin_unlock_bh(&rdev->bss_lock);
3268}
3269EXPORT_SYMBOL(cfg80211_bss_iter);
3270
3271void cfg80211_update_assoc_bss_entry(struct wireless_dev *wdev,
3272				     unsigned int link_id,
3273				     struct ieee80211_channel *chan)
3274{
3275	struct wiphy *wiphy = wdev->wiphy;
3276	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
3277	struct cfg80211_internal_bss *cbss = wdev->links[link_id].client.current_bss;
3278	struct cfg80211_internal_bss *new = NULL;
3279	struct cfg80211_internal_bss *bss;
3280	struct cfg80211_bss *nontrans_bss;
3281	struct cfg80211_bss *tmp;
3282
3283	spin_lock_bh(&rdev->bss_lock);
3284
3285	/*
3286	 * Some APs use CSA also for bandwidth changes, i.e., without actually
3287	 * changing the control channel, so no need to update in such a case.
3288	 */
3289	if (cbss->pub.channel == chan)
3290		goto done;
3291
3292	/* use transmitting bss */
3293	if (cbss->pub.transmitted_bss)
3294		cbss = bss_from_pub(cbss->pub.transmitted_bss);
3295
3296	cbss->pub.channel = chan;
3297
3298	list_for_each_entry(bss, &rdev->bss_list, list) {
3299		if (!cfg80211_bss_type_match(bss->pub.capability,
3300					     bss->pub.channel->band,
3301					     wdev->conn_bss_type))
3302			continue;
3303
3304		if (bss == cbss)
3305			continue;
3306
3307		if (!cmp_bss(&bss->pub, &cbss->pub, BSS_CMP_REGULAR)) {
3308			new = bss;
3309			break;
3310		}
3311	}
3312
3313	if (new) {
3314		/* to save time, update IEs for transmitting bss only */
3315		cfg80211_update_known_bss(rdev, cbss, new, false);
3316		new->pub.proberesp_ies = NULL;
3317		new->pub.beacon_ies = NULL;
3318
3319		list_for_each_entry_safe(nontrans_bss, tmp,
3320					 &new->pub.nontrans_list,
3321					 nontrans_list) {
3322			bss = bss_from_pub(nontrans_bss);
3323			if (__cfg80211_unlink_bss(rdev, bss))
3324				rdev->bss_generation++;
3325		}
3326
3327		WARN_ON(atomic_read(&new->hold));
3328		if (!WARN_ON(!__cfg80211_unlink_bss(rdev, new)))
3329			rdev->bss_generation++;
3330	}
3331
3332	rb_erase(&cbss->rbn, &rdev->bss_tree);
3333	rb_insert_bss(rdev, cbss);
3334	rdev->bss_generation++;
3335
3336	list_for_each_entry_safe(nontrans_bss, tmp,
3337				 &cbss->pub.nontrans_list,
3338				 nontrans_list) {
3339		bss = bss_from_pub(nontrans_bss);
3340		bss->pub.channel = chan;
3341		rb_erase(&bss->rbn, &rdev->bss_tree);
3342		rb_insert_bss(rdev, bss);
3343		rdev->bss_generation++;
3344	}
3345
3346done:
3347	spin_unlock_bh(&rdev->bss_lock);
3348}
3349
3350#ifdef CONFIG_CFG80211_WEXT
3351static struct cfg80211_registered_device *
3352cfg80211_get_dev_from_ifindex(struct net *net, int ifindex)
3353{
3354	struct cfg80211_registered_device *rdev;
3355	struct net_device *dev;
3356
3357	ASSERT_RTNL();
3358
3359	dev = dev_get_by_index(net, ifindex);
3360	if (!dev)
3361		return ERR_PTR(-ENODEV);
3362	if (dev->ieee80211_ptr)
3363		rdev = wiphy_to_rdev(dev->ieee80211_ptr->wiphy);
3364	else
3365		rdev = ERR_PTR(-ENODEV);
3366	dev_put(dev);
3367	return rdev;
3368}
3369
3370int cfg80211_wext_siwscan(struct net_device *dev,
3371			  struct iw_request_info *info,
3372			  union iwreq_data *wrqu, char *extra)
3373{
3374	struct cfg80211_registered_device *rdev;
3375	struct wiphy *wiphy;
3376	struct iw_scan_req *wreq = NULL;
3377	struct cfg80211_scan_request *creq;
3378	int i, err, n_channels = 0;
3379	enum nl80211_band band;
3380
3381	if (!netif_running(dev))
3382		return -ENETDOWN;
3383
3384	if (wrqu->data.length == sizeof(struct iw_scan_req))
3385		wreq = (struct iw_scan_req *)extra;
3386
3387	rdev = cfg80211_get_dev_from_ifindex(dev_net(dev), dev->ifindex);
3388
3389	if (IS_ERR(rdev))
3390		return PTR_ERR(rdev);
3391
3392	if (rdev->scan_req || rdev->scan_msg)
3393		return -EBUSY;
3394
3395	wiphy = &rdev->wiphy;
3396
3397	/* Determine number of channels, needed to allocate creq */
3398	if (wreq && wreq->num_channels)
 
 
 
3399		n_channels = wreq->num_channels;
3400	else
3401		n_channels = ieee80211_get_num_supported_channels(wiphy);
 
3402
3403	creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) +
3404		       n_channels * sizeof(void *),
3405		       GFP_ATOMIC);
3406	if (!creq)
3407		return -ENOMEM;
3408
3409	creq->wiphy = wiphy;
3410	creq->wdev = dev->ieee80211_ptr;
3411	/* SSIDs come after channels */
3412	creq->ssids = (void *)&creq->channels[n_channels];
3413	creq->n_channels = n_channels;
3414	creq->n_ssids = 1;
3415	creq->scan_start = jiffies;
3416
3417	/* translate "Scan on frequencies" request */
3418	i = 0;
3419	for (band = 0; band < NUM_NL80211_BANDS; band++) {
3420		int j;
3421
3422		if (!wiphy->bands[band])
3423			continue;
3424
3425		for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
 
 
3426			/* ignore disabled channels */
3427			if (wiphy->bands[band]->channels[j].flags &
3428						IEEE80211_CHAN_DISABLED)
 
3429				continue;
3430
3431			/* If we have a wireless request structure and the
3432			 * wireless request specifies frequencies, then search
3433			 * for the matching hardware channel.
3434			 */
3435			if (wreq && wreq->num_channels) {
3436				int k;
3437				int wiphy_freq = wiphy->bands[band]->channels[j].center_freq;
3438				for (k = 0; k < wreq->num_channels; k++) {
3439					struct iw_freq *freq =
3440						&wreq->channel_list[k];
3441					int wext_freq =
3442						cfg80211_wext_freq(freq);
3443
3444					if (wext_freq == wiphy_freq)
3445						goto wext_freq_found;
3446				}
3447				goto wext_freq_not_found;
3448			}
3449
3450		wext_freq_found:
3451			creq->channels[i] = &wiphy->bands[band]->channels[j];
3452			i++;
3453		wext_freq_not_found: ;
3454		}
3455	}
3456	/* No channels found? */
3457	if (!i) {
3458		err = -EINVAL;
3459		goto out;
3460	}
3461
3462	/* Set real number of channels specified in creq->channels[] */
3463	creq->n_channels = i;
3464
3465	/* translate "Scan for SSID" request */
3466	if (wreq) {
3467		if (wrqu->data.flags & IW_SCAN_THIS_ESSID) {
3468			if (wreq->essid_len > IEEE80211_MAX_SSID_LEN) {
3469				err = -EINVAL;
3470				goto out;
3471			}
3472			memcpy(creq->ssids[0].ssid, wreq->essid, wreq->essid_len);
3473			creq->ssids[0].ssid_len = wreq->essid_len;
3474		}
3475		if (wreq->scan_type == IW_SCAN_TYPE_PASSIVE)
 
3476			creq->n_ssids = 0;
 
3477	}
3478
3479	for (i = 0; i < NUM_NL80211_BANDS; i++)
3480		if (wiphy->bands[i])
3481			creq->rates[i] = (1 << wiphy->bands[i]->n_bitrates) - 1;
3482
3483	eth_broadcast_addr(creq->bssid);
3484
3485	wiphy_lock(&rdev->wiphy);
3486
3487	rdev->scan_req = creq;
3488	err = rdev_scan(rdev, creq);
3489	if (err) {
3490		rdev->scan_req = NULL;
3491		/* creq will be freed below */
3492	} else {
3493		nl80211_send_scan_start(rdev, dev->ieee80211_ptr);
3494		/* creq now owned by driver */
3495		creq = NULL;
3496		dev_hold(dev);
3497	}
3498	wiphy_unlock(&rdev->wiphy);
3499 out:
3500	kfree(creq);
3501	return err;
3502}
3503EXPORT_WEXT_HANDLER(cfg80211_wext_siwscan);
3504
3505static char *ieee80211_scan_add_ies(struct iw_request_info *info,
3506				    const struct cfg80211_bss_ies *ies,
3507				    char *current_ev, char *end_buf)
3508{
3509	const u8 *pos, *end, *next;
3510	struct iw_event iwe;
3511
3512	if (!ies)
3513		return current_ev;
3514
3515	/*
3516	 * If needed, fragment the IEs buffer (at IE boundaries) into short
3517	 * enough fragments to fit into IW_GENERIC_IE_MAX octet messages.
3518	 */
3519	pos = ies->data;
3520	end = pos + ies->len;
3521
3522	while (end - pos > IW_GENERIC_IE_MAX) {
3523		next = pos + 2 + pos[1];
3524		while (next + 2 + next[1] - pos < IW_GENERIC_IE_MAX)
3525			next = next + 2 + next[1];
3526
3527		memset(&iwe, 0, sizeof(iwe));
3528		iwe.cmd = IWEVGENIE;
3529		iwe.u.data.length = next - pos;
3530		current_ev = iwe_stream_add_point_check(info, current_ev,
3531							end_buf, &iwe,
3532							(void *)pos);
3533		if (IS_ERR(current_ev))
3534			return current_ev;
3535		pos = next;
3536	}
3537
3538	if (end > pos) {
3539		memset(&iwe, 0, sizeof(iwe));
3540		iwe.cmd = IWEVGENIE;
3541		iwe.u.data.length = end - pos;
3542		current_ev = iwe_stream_add_point_check(info, current_ev,
3543							end_buf, &iwe,
3544							(void *)pos);
3545		if (IS_ERR(current_ev))
3546			return current_ev;
3547	}
3548
3549	return current_ev;
3550}
3551
3552static char *
3553ieee80211_bss(struct wiphy *wiphy, struct iw_request_info *info,
3554	      struct cfg80211_internal_bss *bss, char *current_ev,
3555	      char *end_buf)
3556{
3557	const struct cfg80211_bss_ies *ies;
3558	struct iw_event iwe;
3559	const u8 *ie;
3560	u8 buf[50];
3561	u8 *cfg, *p, *tmp;
3562	int rem, i, sig;
3563	bool ismesh = false;
3564
3565	memset(&iwe, 0, sizeof(iwe));
3566	iwe.cmd = SIOCGIWAP;
3567	iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
3568	memcpy(iwe.u.ap_addr.sa_data, bss->pub.bssid, ETH_ALEN);
3569	current_ev = iwe_stream_add_event_check(info, current_ev, end_buf, &iwe,
3570						IW_EV_ADDR_LEN);
3571	if (IS_ERR(current_ev))
3572		return current_ev;
3573
3574	memset(&iwe, 0, sizeof(iwe));
3575	iwe.cmd = SIOCGIWFREQ;
3576	iwe.u.freq.m = ieee80211_frequency_to_channel(bss->pub.channel->center_freq);
3577	iwe.u.freq.e = 0;
3578	current_ev = iwe_stream_add_event_check(info, current_ev, end_buf, &iwe,
3579						IW_EV_FREQ_LEN);
3580	if (IS_ERR(current_ev))
3581		return current_ev;
3582
3583	memset(&iwe, 0, sizeof(iwe));
3584	iwe.cmd = SIOCGIWFREQ;
3585	iwe.u.freq.m = bss->pub.channel->center_freq;
3586	iwe.u.freq.e = 6;
3587	current_ev = iwe_stream_add_event_check(info, current_ev, end_buf, &iwe,
3588						IW_EV_FREQ_LEN);
3589	if (IS_ERR(current_ev))
3590		return current_ev;
3591
3592	if (wiphy->signal_type != CFG80211_SIGNAL_TYPE_NONE) {
3593		memset(&iwe, 0, sizeof(iwe));
3594		iwe.cmd = IWEVQUAL;
3595		iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED |
3596				     IW_QUAL_NOISE_INVALID |
3597				     IW_QUAL_QUAL_UPDATED;
3598		switch (wiphy->signal_type) {
3599		case CFG80211_SIGNAL_TYPE_MBM:
3600			sig = bss->pub.signal / 100;
3601			iwe.u.qual.level = sig;
3602			iwe.u.qual.updated |= IW_QUAL_DBM;
3603			if (sig < -110)		/* rather bad */
3604				sig = -110;
3605			else if (sig > -40)	/* perfect */
3606				sig = -40;
3607			/* will give a range of 0 .. 70 */
3608			iwe.u.qual.qual = sig + 110;
3609			break;
3610		case CFG80211_SIGNAL_TYPE_UNSPEC:
3611			iwe.u.qual.level = bss->pub.signal;
3612			/* will give range 0 .. 100 */
3613			iwe.u.qual.qual = bss->pub.signal;
3614			break;
3615		default:
3616			/* not reached */
3617			break;
3618		}
3619		current_ev = iwe_stream_add_event_check(info, current_ev,
3620							end_buf, &iwe,
3621							IW_EV_QUAL_LEN);
3622		if (IS_ERR(current_ev))
3623			return current_ev;
3624	}
3625
3626	memset(&iwe, 0, sizeof(iwe));
3627	iwe.cmd = SIOCGIWENCODE;
3628	if (bss->pub.capability & WLAN_CAPABILITY_PRIVACY)
3629		iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
3630	else
3631		iwe.u.data.flags = IW_ENCODE_DISABLED;
3632	iwe.u.data.length = 0;
3633	current_ev = iwe_stream_add_point_check(info, current_ev, end_buf,
3634						&iwe, "");
3635	if (IS_ERR(current_ev))
3636		return current_ev;
3637
3638	rcu_read_lock();
3639	ies = rcu_dereference(bss->pub.ies);
3640	rem = ies->len;
3641	ie = ies->data;
3642
3643	while (rem >= 2) {
3644		/* invalid data */
3645		if (ie[1] > rem - 2)
3646			break;
3647
3648		switch (ie[0]) {
3649		case WLAN_EID_SSID:
3650			memset(&iwe, 0, sizeof(iwe));
3651			iwe.cmd = SIOCGIWESSID;
3652			iwe.u.data.length = ie[1];
3653			iwe.u.data.flags = 1;
3654			current_ev = iwe_stream_add_point_check(info,
3655								current_ev,
3656								end_buf, &iwe,
3657								(u8 *)ie + 2);
3658			if (IS_ERR(current_ev))
3659				goto unlock;
3660			break;
3661		case WLAN_EID_MESH_ID:
3662			memset(&iwe, 0, sizeof(iwe));
3663			iwe.cmd = SIOCGIWESSID;
3664			iwe.u.data.length = ie[1];
3665			iwe.u.data.flags = 1;
3666			current_ev = iwe_stream_add_point_check(info,
3667								current_ev,
3668								end_buf, &iwe,
3669								(u8 *)ie + 2);
3670			if (IS_ERR(current_ev))
3671				goto unlock;
3672			break;
3673		case WLAN_EID_MESH_CONFIG:
3674			ismesh = true;
3675			if (ie[1] != sizeof(struct ieee80211_meshconf_ie))
3676				break;
3677			cfg = (u8 *)ie + 2;
3678			memset(&iwe, 0, sizeof(iwe));
3679			iwe.cmd = IWEVCUSTOM;
3680			iwe.u.data.length = sprintf(buf,
3681						    "Mesh Network Path Selection Protocol ID: 0x%02X",
3682						    cfg[0]);
3683			current_ev = iwe_stream_add_point_check(info,
3684								current_ev,
3685								end_buf,
3686								&iwe, buf);
3687			if (IS_ERR(current_ev))
3688				goto unlock;
3689			iwe.u.data.length = sprintf(buf,
3690						    "Path Selection Metric ID: 0x%02X",
3691						    cfg[1]);
3692			current_ev = iwe_stream_add_point_check(info,
3693								current_ev,
3694								end_buf,
3695								&iwe, buf);
3696			if (IS_ERR(current_ev))
3697				goto unlock;
3698			iwe.u.data.length = sprintf(buf,
3699						    "Congestion Control Mode ID: 0x%02X",
3700						    cfg[2]);
3701			current_ev = iwe_stream_add_point_check(info,
3702								current_ev,
3703								end_buf,
3704								&iwe, buf);
3705			if (IS_ERR(current_ev))
3706				goto unlock;
3707			iwe.u.data.length = sprintf(buf,
3708						    "Synchronization ID: 0x%02X",
3709						    cfg[3]);
3710			current_ev = iwe_stream_add_point_check(info,
3711								current_ev,
3712								end_buf,
3713								&iwe, buf);
3714			if (IS_ERR(current_ev))
3715				goto unlock;
3716			iwe.u.data.length = sprintf(buf,
3717						    "Authentication ID: 0x%02X",
3718						    cfg[4]);
3719			current_ev = iwe_stream_add_point_check(info,
3720								current_ev,
3721								end_buf,
3722								&iwe, buf);
3723			if (IS_ERR(current_ev))
3724				goto unlock;
3725			iwe.u.data.length = sprintf(buf,
3726						    "Formation Info: 0x%02X",
3727						    cfg[5]);
3728			current_ev = iwe_stream_add_point_check(info,
3729								current_ev,
3730								end_buf,
3731								&iwe, buf);
3732			if (IS_ERR(current_ev))
3733				goto unlock;
3734			iwe.u.data.length = sprintf(buf,
3735						    "Capabilities: 0x%02X",
3736						    cfg[6]);
3737			current_ev = iwe_stream_add_point_check(info,
3738								current_ev,
3739								end_buf,
3740								&iwe, buf);
3741			if (IS_ERR(current_ev))
3742				goto unlock;
3743			break;
3744		case WLAN_EID_SUPP_RATES:
3745		case WLAN_EID_EXT_SUPP_RATES:
3746			/* display all supported rates in readable format */
3747			p = current_ev + iwe_stream_lcp_len(info);
3748
3749			memset(&iwe, 0, sizeof(iwe));
3750			iwe.cmd = SIOCGIWRATE;
3751			/* Those two flags are ignored... */
3752			iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
3753
3754			for (i = 0; i < ie[1]; i++) {
3755				iwe.u.bitrate.value =
3756					((ie[i + 2] & 0x7f) * 500000);
3757				tmp = p;
3758				p = iwe_stream_add_value(info, current_ev, p,
3759							 end_buf, &iwe,
3760							 IW_EV_PARAM_LEN);
3761				if (p == tmp) {
3762					current_ev = ERR_PTR(-E2BIG);
3763					goto unlock;
3764				}
3765			}
3766			current_ev = p;
3767			break;
3768		}
3769		rem -= ie[1] + 2;
3770		ie += ie[1] + 2;
3771	}
3772
3773	if (bss->pub.capability & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS) ||
3774	    ismesh) {
3775		memset(&iwe, 0, sizeof(iwe));
3776		iwe.cmd = SIOCGIWMODE;
3777		if (ismesh)
3778			iwe.u.mode = IW_MODE_MESH;
3779		else if (bss->pub.capability & WLAN_CAPABILITY_ESS)
3780			iwe.u.mode = IW_MODE_MASTER;
3781		else
3782			iwe.u.mode = IW_MODE_ADHOC;
3783		current_ev = iwe_stream_add_event_check(info, current_ev,
3784							end_buf, &iwe,
3785							IW_EV_UINT_LEN);
3786		if (IS_ERR(current_ev))
3787			goto unlock;
3788	}
3789
3790	memset(&iwe, 0, sizeof(iwe));
3791	iwe.cmd = IWEVCUSTOM;
3792	iwe.u.data.length = sprintf(buf, "tsf=%016llx",
3793				    (unsigned long long)(ies->tsf));
3794	current_ev = iwe_stream_add_point_check(info, current_ev, end_buf,
3795						&iwe, buf);
3796	if (IS_ERR(current_ev))
3797		goto unlock;
3798	memset(&iwe, 0, sizeof(iwe));
3799	iwe.cmd = IWEVCUSTOM;
3800	iwe.u.data.length = sprintf(buf, " Last beacon: %ums ago",
3801				    elapsed_jiffies_msecs(bss->ts));
3802	current_ev = iwe_stream_add_point_check(info, current_ev,
3803						end_buf, &iwe, buf);
3804	if (IS_ERR(current_ev))
3805		goto unlock;
3806
3807	current_ev = ieee80211_scan_add_ies(info, ies, current_ev, end_buf);
3808
3809 unlock:
3810	rcu_read_unlock();
3811	return current_ev;
3812}
3813
3814
3815static int ieee80211_scan_results(struct cfg80211_registered_device *rdev,
3816				  struct iw_request_info *info,
3817				  char *buf, size_t len)
3818{
3819	char *current_ev = buf;
3820	char *end_buf = buf + len;
3821	struct cfg80211_internal_bss *bss;
3822	int err = 0;
3823
3824	spin_lock_bh(&rdev->bss_lock);
3825	cfg80211_bss_expire(rdev);
3826
3827	list_for_each_entry(bss, &rdev->bss_list, list) {
3828		if (buf + len - current_ev <= IW_EV_ADDR_LEN) {
3829			err = -E2BIG;
3830			break;
3831		}
3832		current_ev = ieee80211_bss(&rdev->wiphy, info, bss,
3833					   current_ev, end_buf);
3834		if (IS_ERR(current_ev)) {
3835			err = PTR_ERR(current_ev);
3836			break;
3837		}
3838	}
3839	spin_unlock_bh(&rdev->bss_lock);
3840
3841	if (err)
3842		return err;
3843	return current_ev - buf;
3844}
3845
3846
3847int cfg80211_wext_giwscan(struct net_device *dev,
3848			  struct iw_request_info *info,
3849			  union iwreq_data *wrqu, char *extra)
3850{
3851	struct iw_point *data = &wrqu->data;
3852	struct cfg80211_registered_device *rdev;
3853	int res;
3854
3855	if (!netif_running(dev))
3856		return -ENETDOWN;
3857
3858	rdev = cfg80211_get_dev_from_ifindex(dev_net(dev), dev->ifindex);
3859
3860	if (IS_ERR(rdev))
3861		return PTR_ERR(rdev);
3862
3863	if (rdev->scan_req || rdev->scan_msg)
3864		return -EAGAIN;
3865
3866	res = ieee80211_scan_results(rdev, info, extra, data->length);
3867	data->length = 0;
3868	if (res >= 0) {
3869		data->length = res;
3870		res = 0;
3871	}
3872
3873	return res;
3874}
3875EXPORT_WEXT_HANDLER(cfg80211_wext_giwscan);
3876#endif