Linux Audio

Check our new training course

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