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
v4.6
 
   1/*
   2 * cfg80211 scan result handling
   3 *
   4 * Copyright 2008 Johannes Berg <johannes@sipsolutions.net>
   5 * Copyright 2013-2014  Intel Mobile Communications GmbH
 
 
   6 */
   7#include <linux/kernel.h>
   8#include <linux/slab.h>
   9#include <linux/module.h>
  10#include <linux/netdevice.h>
  11#include <linux/wireless.h>
  12#include <linux/nl80211.h>
  13#include <linux/etherdevice.h>
 
 
  14#include <net/arp.h>
  15#include <net/cfg80211.h>
  16#include <net/cfg80211-wext.h>
  17#include <net/iw_handler.h>
 
  18#include "core.h"
  19#include "nl80211.h"
  20#include "wext-compat.h"
  21#include "rdev-ops.h"
  22
  23/**
  24 * DOC: BSS tree/list structure
  25 *
  26 * At the top level, the BSS list is kept in both a list in each
  27 * registered device (@bss_list) as well as an RB-tree for faster
  28 * lookup. In the RB-tree, entries can be looked up using their
  29 * channel, MESHID, MESHCONF (for MBSSes) or channel, BSSID, SSID
  30 * for other BSSes.
  31 *
  32 * Due to the possibility of hidden SSIDs, there's a second level
  33 * structure, the "hidden_list" and "hidden_beacon_bss" pointer.
  34 * The hidden_list connects all BSSes belonging to a single AP
  35 * that has a hidden SSID, and connects beacon and probe response
  36 * entries. For a probe response entry for a hidden SSID, the
  37 * hidden_beacon_bss pointer points to the BSS struct holding the
  38 * beacon's information.
  39 *
  40 * Reference counting is done for all these references except for
  41 * the hidden_list, so that a beacon BSS struct that is otherwise
  42 * not referenced has one reference for being on the bss_list and
  43 * one for each probe response entry that points to it using the
  44 * hidden_beacon_bss pointer. When a BSS struct that has such a
  45 * pointer is get/put, the refcount update is also propagated to
  46 * the referenced struct, this ensure that it cannot get removed
  47 * while somebody is using the probe response version.
  48 *
  49 * Note that the hidden_beacon_bss pointer never changes, due to
  50 * the reference counting. Therefore, no locking is needed for
  51 * it.
  52 *
  53 * Also note that the hidden_beacon_bss pointer is only relevant
  54 * if the driver uses something other than the IEs, e.g. private
  55 * data stored stored in the BSS struct, since the beacon IEs are
  56 * also linked into the probe response struct.
  57 */
  58
 
 
 
 
 
 
 
 
 
 
 
 
 
  59#define IEEE80211_SCAN_RESULT_EXPIRE	(30 * HZ)
  60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  61static void bss_free(struct cfg80211_internal_bss *bss)
  62{
  63	struct cfg80211_bss_ies *ies;
  64
  65	if (WARN_ON(atomic_read(&bss->hold)))
  66		return;
  67
  68	ies = (void *)rcu_access_pointer(bss->pub.beacon_ies);
  69	if (ies && !bss->pub.hidden_beacon_bss)
  70		kfree_rcu(ies, rcu_head);
  71	ies = (void *)rcu_access_pointer(bss->pub.proberesp_ies);
  72	if (ies)
  73		kfree_rcu(ies, rcu_head);
  74
  75	/*
  76	 * This happens when the module is removed, it doesn't
  77	 * really matter any more save for completeness
  78	 */
  79	if (!list_empty(&bss->hidden_list))
  80		list_del(&bss->hidden_list);
  81
  82	kfree(bss);
  83}
  84
  85static inline void bss_ref_get(struct cfg80211_registered_device *rdev,
  86			       struct cfg80211_internal_bss *bss)
  87{
  88	lockdep_assert_held(&rdev->bss_lock);
  89
  90	bss->refcount++;
  91	if (bss->pub.hidden_beacon_bss) {
  92		bss = container_of(bss->pub.hidden_beacon_bss,
  93				   struct cfg80211_internal_bss,
  94				   pub);
  95		bss->refcount++;
  96	}
  97}
  98
  99static inline void bss_ref_put(struct cfg80211_registered_device *rdev,
 100			       struct cfg80211_internal_bss *bss)
 101{
 102	lockdep_assert_held(&rdev->bss_lock);
 103
 104	if (bss->pub.hidden_beacon_bss) {
 105		struct cfg80211_internal_bss *hbss;
 106		hbss = container_of(bss->pub.hidden_beacon_bss,
 107				    struct cfg80211_internal_bss,
 108				    pub);
 109		hbss->refcount--;
 110		if (hbss->refcount == 0)
 111			bss_free(hbss);
 112	}
 
 
 
 
 
 
 
 
 
 
 113	bss->refcount--;
 114	if (bss->refcount == 0)
 115		bss_free(bss);
 116}
 117
 118static bool __cfg80211_unlink_bss(struct cfg80211_registered_device *rdev,
 119				  struct cfg80211_internal_bss *bss)
 120{
 121	lockdep_assert_held(&rdev->bss_lock);
 122
 123	if (!list_empty(&bss->hidden_list)) {
 124		/*
 125		 * don't remove the beacon entry if it has
 126		 * probe responses associated with it
 127		 */
 128		if (!bss->pub.hidden_beacon_bss)
 129			return false;
 130		/*
 131		 * if it's a probe response entry break its
 132		 * link to the other entries in the group
 133		 */
 134		list_del_init(&bss->hidden_list);
 135	}
 136
 137	list_del_init(&bss->list);
 
 138	rb_erase(&bss->rbn, &rdev->bss_tree);
 
 
 
 
 139	bss_ref_put(rdev, bss);
 140	return true;
 141}
 142
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 143static void __cfg80211_bss_expire(struct cfg80211_registered_device *rdev,
 144				  unsigned long expire_time)
 145{
 146	struct cfg80211_internal_bss *bss, *tmp;
 147	bool expired = false;
 148
 149	lockdep_assert_held(&rdev->bss_lock);
 150
 151	list_for_each_entry_safe(bss, tmp, &rdev->bss_list, list) {
 152		if (atomic_read(&bss->hold))
 153			continue;
 154		if (!time_after(expire_time, bss->ts))
 155			continue;
 156
 157		if (__cfg80211_unlink_bss(rdev, bss))
 158			expired = true;
 159	}
 160
 161	if (expired)
 162		rdev->bss_generation++;
 163}
 164
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 165void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev,
 166			   bool send_message)
 167{
 168	struct cfg80211_scan_request *request;
 169	struct wireless_dev *wdev;
 170	struct sk_buff *msg;
 171#ifdef CONFIG_CFG80211_WEXT
 172	union iwreq_data wrqu;
 173#endif
 174
 175	ASSERT_RTNL();
 176
 177	if (rdev->scan_msg) {
 178		nl80211_send_scan_result(rdev, rdev->scan_msg);
 179		rdev->scan_msg = NULL;
 180		return;
 181	}
 182
 183	request = rdev->scan_req;
 184	if (!request)
 185		return;
 186
 187	wdev = request->wdev;
 
 
 
 
 
 
 
 188
 189	/*
 190	 * This must be before sending the other events!
 191	 * Otherwise, wpa_supplicant gets completely confused with
 192	 * wext events.
 193	 */
 194	if (wdev->netdev)
 195		cfg80211_sme_scan_done(wdev->netdev);
 196
 197	if (!request->aborted &&
 198	    request->flags & NL80211_SCAN_FLAG_FLUSH) {
 199		/* flush entries from previous scans */
 200		spin_lock_bh(&rdev->bss_lock);
 201		__cfg80211_bss_expire(rdev, request->scan_start);
 202		spin_unlock_bh(&rdev->bss_lock);
 203	}
 204
 205	msg = nl80211_build_scan_msg(rdev, wdev, request->aborted);
 206
 207#ifdef CONFIG_CFG80211_WEXT
 208	if (wdev->netdev && !request->aborted) {
 209		memset(&wrqu, 0, sizeof(wrqu));
 210
 211		wireless_send_event(wdev->netdev, SIOCGIWSCAN, &wrqu, NULL);
 212	}
 213#endif
 214
 215	if (wdev->netdev)
 216		dev_put(wdev->netdev);
 
 
 217
 
 218	rdev->scan_req = NULL;
 219	kfree(request);
 220
 221	if (!send_message)
 222		rdev->scan_msg = msg;
 223	else
 224		nl80211_send_scan_result(rdev, msg);
 225}
 226
 227void __cfg80211_scan_done(struct work_struct *wk)
 228{
 229	struct cfg80211_registered_device *rdev;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 230
 231	rdev = container_of(wk, struct cfg80211_registered_device,
 232			    scan_done_wk);
 
 
 233
 234	rtnl_lock();
 235	___cfg80211_scan_done(rdev, true);
 236	rtnl_unlock();
 237}
 238
 239void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted)
 
 240{
 241	trace_cfg80211_scan_done(request, aborted);
 242	WARN_ON(request != wiphy_to_rdev(request->wiphy)->scan_req);
 243
 244	request->aborted = aborted;
 245	request->notified = true;
 246	queue_work(cfg80211_wq, &wiphy_to_rdev(request->wiphy)->scan_done_wk);
 
 
 
 247}
 248EXPORT_SYMBOL(cfg80211_scan_done);
 249
 250void __cfg80211_sched_scan_results(struct work_struct *wk)
 
 
 
 
 
 
 
 
 
 251{
 252	struct cfg80211_registered_device *rdev;
 253	struct cfg80211_sched_scan_request *request;
 254
 255	rdev = container_of(wk, struct cfg80211_registered_device,
 256			    sched_scan_results_wk);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 257
 258	rtnl_lock();
 
 
 
 259
 260	request = rtnl_dereference(rdev->sched_scan_req);
 
 261
 262	/* we don't have sched_scan_req anymore if the scan is stopping */
 263	if (request) {
 264		if (request->flags & NL80211_SCAN_FLAG_FLUSH) {
 265			/* flush entries from previous scans */
 266			spin_lock_bh(&rdev->bss_lock);
 267			__cfg80211_bss_expire(rdev, request->scan_start);
 268			spin_unlock_bh(&rdev->bss_lock);
 269			request->scan_start = jiffies;
 
 
 
 
 
 270		}
 271		nl80211_send_sched_scan_results(rdev, request->dev);
 272	}
 273
 274	rtnl_unlock();
 275}
 276
 277void cfg80211_sched_scan_results(struct wiphy *wiphy)
 278{
 279	trace_cfg80211_sched_scan_results(wiphy);
 
 
 
 280	/* ignore if we're not scanning */
 281
 282	if (rcu_access_pointer(wiphy_to_rdev(wiphy)->sched_scan_req))
 283		queue_work(cfg80211_wq,
 284			   &wiphy_to_rdev(wiphy)->sched_scan_results_wk);
 
 
 
 
 285}
 286EXPORT_SYMBOL(cfg80211_sched_scan_results);
 287
 288void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy)
 289{
 290	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 291
 292	ASSERT_RTNL();
 293
 294	trace_cfg80211_sched_scan_stopped(wiphy);
 295
 296	__cfg80211_stop_sched_scan(rdev, true);
 297}
 298EXPORT_SYMBOL(cfg80211_sched_scan_stopped_rtnl);
 299
 300void cfg80211_sched_scan_stopped(struct wiphy *wiphy)
 301{
 302	rtnl_lock();
 303	cfg80211_sched_scan_stopped_rtnl(wiphy);
 304	rtnl_unlock();
 305}
 306EXPORT_SYMBOL(cfg80211_sched_scan_stopped);
 307
 308int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
 309			       bool driver_initiated)
 
 310{
 311	struct cfg80211_sched_scan_request *sched_scan_req;
 312	struct net_device *dev;
 313
 314	ASSERT_RTNL();
 315
 316	if (!rdev->sched_scan_req)
 317		return -ENOENT;
 318
 319	sched_scan_req = rtnl_dereference(rdev->sched_scan_req);
 320	dev = sched_scan_req->dev;
 321
 322	if (!driver_initiated) {
 323		int err = rdev_sched_scan_stop(rdev, dev);
 324		if (err)
 325			return err;
 326	}
 327
 328	nl80211_send_sched_scan(rdev, dev, NL80211_CMD_SCHED_SCAN_STOPPED);
 329
 330	RCU_INIT_POINTER(rdev->sched_scan_req, NULL);
 331	kfree_rcu(sched_scan_req, rcu_head);
 332
 333	return 0;
 334}
 335
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 336void cfg80211_bss_age(struct cfg80211_registered_device *rdev,
 337                      unsigned long age_secs)
 338{
 339	struct cfg80211_internal_bss *bss;
 340	unsigned long age_jiffies = msecs_to_jiffies(age_secs * MSEC_PER_SEC);
 341
 342	spin_lock_bh(&rdev->bss_lock);
 343	list_for_each_entry(bss, &rdev->bss_list, list)
 344		bss->ts -= age_jiffies;
 345	spin_unlock_bh(&rdev->bss_lock);
 346}
 347
 348void cfg80211_bss_expire(struct cfg80211_registered_device *rdev)
 349{
 350	__cfg80211_bss_expire(rdev, jiffies - IEEE80211_SCAN_RESULT_EXPIRE);
 351}
 352
 353const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len)
 354{
 355	while (len > 2 && ies[0] != eid) {
 356		len -= ies[1] + 2;
 357		ies += ies[1] + 2;
 358	}
 359	if (len < 2)
 360		return NULL;
 361	if (len < 2 + ies[1])
 362		return NULL;
 363	return ies;
 364}
 365EXPORT_SYMBOL(cfg80211_find_ie);
 366
 367const u8 *cfg80211_find_vendor_ie(unsigned int oui, u8 oui_type,
 368				  const u8 *ies, int len)
 369{
 370	struct ieee80211_vendor_ie *ie;
 371	const u8 *pos = ies, *end = ies + len;
 372	int ie_oui;
 373
 374	while (pos < end) {
 375		pos = cfg80211_find_ie(WLAN_EID_VENDOR_SPECIFIC, pos,
 376				       end - pos);
 377		if (!pos)
 378			return NULL;
 379
 380		ie = (struct ieee80211_vendor_ie *)pos;
 381
 382		/* make sure we can access ie->len */
 383		BUILD_BUG_ON(offsetof(struct ieee80211_vendor_ie, len) != 1);
 384
 385		if (ie->len < sizeof(*ie))
 386			goto cont;
 387
 388		ie_oui = ie->oui[0] << 16 | ie->oui[1] << 8 | ie->oui[2];
 389		if (ie_oui == oui && ie->oui_type == oui_type)
 390			return pos;
 391cont:
 392		pos += 2 + ie->len;
 393	}
 394	return NULL;
 395}
 396EXPORT_SYMBOL(cfg80211_find_vendor_ie);
 397
 398static bool is_bss(struct cfg80211_bss *a, const u8 *bssid,
 399		   const u8 *ssid, size_t ssid_len)
 
 400{
 401	const struct cfg80211_bss_ies *ies;
 402	const u8 *ssidie;
 
 
 
 
 403
 404	if (bssid && !ether_addr_equal(a->bssid, bssid))
 405		return false;
 406
 407	if (!ssid)
 408		return true;
 409
 410	ies = rcu_access_pointer(a->ies);
 411	if (!ies)
 412		return false;
 413	ssidie = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len);
 414	if (!ssidie)
 415		return false;
 416	if (ssidie[1] != ssid_len)
 417		return false;
 418	return memcmp(ssidie + 2, ssid, ssid_len) == 0;
 419}
 
 420
 421/**
 422 * enum bss_compare_mode - BSS compare mode
 423 * @BSS_CMP_REGULAR: regular compare mode (for insertion and normal find)
 424 * @BSS_CMP_HIDE_ZLEN: find hidden SSID with zero-length mode
 425 * @BSS_CMP_HIDE_NUL: find hidden SSID with NUL-ed out mode
 426 */
 427enum bss_compare_mode {
 428	BSS_CMP_REGULAR,
 429	BSS_CMP_HIDE_ZLEN,
 430	BSS_CMP_HIDE_NUL,
 431};
 432
 433static int cmp_bss(struct cfg80211_bss *a,
 434		   struct cfg80211_bss *b,
 435		   enum bss_compare_mode mode)
 436{
 437	const struct cfg80211_bss_ies *a_ies, *b_ies;
 438	const u8 *ie1 = NULL;
 439	const u8 *ie2 = NULL;
 440	int i, r;
 441
 442	if (a->channel != b->channel)
 443		return b->channel->center_freq - a->channel->center_freq;
 
 444
 445	a_ies = rcu_access_pointer(a->ies);
 446	if (!a_ies)
 447		return -1;
 448	b_ies = rcu_access_pointer(b->ies);
 449	if (!b_ies)
 450		return 1;
 451
 452	if (WLAN_CAPABILITY_IS_STA_BSS(a->capability))
 453		ie1 = cfg80211_find_ie(WLAN_EID_MESH_ID,
 454				       a_ies->data, a_ies->len);
 455	if (WLAN_CAPABILITY_IS_STA_BSS(b->capability))
 456		ie2 = cfg80211_find_ie(WLAN_EID_MESH_ID,
 457				       b_ies->data, b_ies->len);
 458	if (ie1 && ie2) {
 459		int mesh_id_cmp;
 460
 461		if (ie1[1] == ie2[1])
 462			mesh_id_cmp = memcmp(ie1 + 2, ie2 + 2, ie1[1]);
 463		else
 464			mesh_id_cmp = ie2[1] - ie1[1];
 465
 466		ie1 = cfg80211_find_ie(WLAN_EID_MESH_CONFIG,
 467				       a_ies->data, a_ies->len);
 468		ie2 = cfg80211_find_ie(WLAN_EID_MESH_CONFIG,
 469				       b_ies->data, b_ies->len);
 470		if (ie1 && ie2) {
 471			if (mesh_id_cmp)
 472				return mesh_id_cmp;
 473			if (ie1[1] != ie2[1])
 474				return ie2[1] - ie1[1];
 475			return memcmp(ie1 + 2, ie2 + 2, ie1[1]);
 476		}
 477	}
 478
 479	r = memcmp(a->bssid, b->bssid, sizeof(a->bssid));
 480	if (r)
 481		return r;
 482
 483	ie1 = cfg80211_find_ie(WLAN_EID_SSID, a_ies->data, a_ies->len);
 484	ie2 = cfg80211_find_ie(WLAN_EID_SSID, b_ies->data, b_ies->len);
 485
 486	if (!ie1 && !ie2)
 487		return 0;
 488
 489	/*
 490	 * Note that with "hide_ssid", the function returns a match if
 491	 * the already-present BSS ("b") is a hidden SSID beacon for
 492	 * the new BSS ("a").
 493	 */
 494
 495	/* sort missing IE before (left of) present IE */
 496	if (!ie1)
 497		return -1;
 498	if (!ie2)
 499		return 1;
 500
 501	switch (mode) {
 502	case BSS_CMP_HIDE_ZLEN:
 503		/*
 504		 * In ZLEN mode we assume the BSS entry we're
 505		 * looking for has a zero-length SSID. So if
 506		 * the one we're looking at right now has that,
 507		 * return 0. Otherwise, return the difference
 508		 * in length, but since we're looking for the
 509		 * 0-length it's really equivalent to returning
 510		 * the length of the one we're looking at.
 511		 *
 512		 * No content comparison is needed as we assume
 513		 * the content length is zero.
 514		 */
 515		return ie2[1];
 516	case BSS_CMP_REGULAR:
 517	default:
 518		/* sort by length first, then by contents */
 519		if (ie1[1] != ie2[1])
 520			return ie2[1] - ie1[1];
 521		return memcmp(ie1 + 2, ie2 + 2, ie1[1]);
 522	case BSS_CMP_HIDE_NUL:
 523		if (ie1[1] != ie2[1])
 524			return ie2[1] - ie1[1];
 525		/* this is equivalent to memcmp(zeroes, ie2 + 2, len) */
 526		for (i = 0; i < ie2[1]; i++)
 527			if (ie2[i + 2])
 528				return -1;
 529		return 0;
 530	}
 531}
 532
 533static bool cfg80211_bss_type_match(u16 capability,
 534				    enum ieee80211_band band,
 535				    enum ieee80211_bss_type bss_type)
 536{
 537	bool ret = true;
 538	u16 mask, val;
 539
 540	if (bss_type == IEEE80211_BSS_TYPE_ANY)
 541		return ret;
 542
 543	if (band == IEEE80211_BAND_60GHZ) {
 544		mask = WLAN_CAPABILITY_DMG_TYPE_MASK;
 545		switch (bss_type) {
 546		case IEEE80211_BSS_TYPE_ESS:
 547			val = WLAN_CAPABILITY_DMG_TYPE_AP;
 548			break;
 549		case IEEE80211_BSS_TYPE_PBSS:
 550			val = WLAN_CAPABILITY_DMG_TYPE_PBSS;
 551			break;
 552		case IEEE80211_BSS_TYPE_IBSS:
 553			val = WLAN_CAPABILITY_DMG_TYPE_IBSS;
 554			break;
 555		default:
 556			return false;
 557		}
 558	} else {
 559		mask = WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS;
 560		switch (bss_type) {
 561		case IEEE80211_BSS_TYPE_ESS:
 562			val = WLAN_CAPABILITY_ESS;
 563			break;
 564		case IEEE80211_BSS_TYPE_IBSS:
 565			val = WLAN_CAPABILITY_IBSS;
 566			break;
 567		case IEEE80211_BSS_TYPE_MBSS:
 568			val = 0;
 569			break;
 570		default:
 571			return false;
 572		}
 573	}
 574
 575	ret = ((capability & mask) == val);
 576	return ret;
 577}
 578
 579/* Returned bss is reference counted and must be cleaned up appropriately. */
 580struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
 581				      struct ieee80211_channel *channel,
 582				      const u8 *bssid,
 583				      const u8 *ssid, size_t ssid_len,
 584				      enum ieee80211_bss_type bss_type,
 585				      enum ieee80211_privacy privacy)
 
 586{
 587	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 588	struct cfg80211_internal_bss *bss, *res = NULL;
 589	unsigned long now = jiffies;
 590	int bss_privacy;
 591
 592	trace_cfg80211_get_bss(wiphy, channel, bssid, ssid, ssid_len, bss_type,
 593			       privacy);
 594
 595	spin_lock_bh(&rdev->bss_lock);
 596
 597	list_for_each_entry(bss, &rdev->bss_list, list) {
 598		if (!cfg80211_bss_type_match(bss->pub.capability,
 599					     bss->pub.channel->band, bss_type))
 600			continue;
 601
 602		bss_privacy = (bss->pub.capability & WLAN_CAPABILITY_PRIVACY);
 603		if ((privacy == IEEE80211_PRIVACY_ON && !bss_privacy) ||
 604		    (privacy == IEEE80211_PRIVACY_OFF && bss_privacy))
 605			continue;
 606		if (channel && bss->pub.channel != channel)
 607			continue;
 608		if (!is_valid_ether_addr(bss->pub.bssid))
 609			continue;
 
 
 610		/* Don't get expired BSS structs */
 611		if (time_after(now, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE) &&
 612		    !atomic_read(&bss->hold))
 613			continue;
 614		if (is_bss(&bss->pub, bssid, ssid, ssid_len)) {
 615			res = bss;
 616			bss_ref_get(rdev, res);
 617			break;
 618		}
 619	}
 620
 621	spin_unlock_bh(&rdev->bss_lock);
 622	if (!res)
 623		return NULL;
 624	trace_cfg80211_return_bss(&res->pub);
 625	return &res->pub;
 626}
 627EXPORT_SYMBOL(cfg80211_get_bss);
 628
 629static void rb_insert_bss(struct cfg80211_registered_device *rdev,
 630			  struct cfg80211_internal_bss *bss)
 631{
 632	struct rb_node **p = &rdev->bss_tree.rb_node;
 633	struct rb_node *parent = NULL;
 634	struct cfg80211_internal_bss *tbss;
 635	int cmp;
 636
 637	while (*p) {
 638		parent = *p;
 639		tbss = rb_entry(parent, struct cfg80211_internal_bss, rbn);
 640
 641		cmp = cmp_bss(&bss->pub, &tbss->pub, BSS_CMP_REGULAR);
 642
 643		if (WARN_ON(!cmp)) {
 644			/* will sort of leak this BSS */
 645			return;
 646		}
 647
 648		if (cmp < 0)
 649			p = &(*p)->rb_left;
 650		else
 651			p = &(*p)->rb_right;
 652	}
 653
 654	rb_link_node(&bss->rbn, parent, p);
 655	rb_insert_color(&bss->rbn, &rdev->bss_tree);
 656}
 657
 658static struct cfg80211_internal_bss *
 659rb_find_bss(struct cfg80211_registered_device *rdev,
 660	    struct cfg80211_internal_bss *res,
 661	    enum bss_compare_mode mode)
 662{
 663	struct rb_node *n = rdev->bss_tree.rb_node;
 664	struct cfg80211_internal_bss *bss;
 665	int r;
 666
 667	while (n) {
 668		bss = rb_entry(n, struct cfg80211_internal_bss, rbn);
 669		r = cmp_bss(&res->pub, &bss->pub, mode);
 670
 671		if (r == 0)
 672			return bss;
 673		else if (r < 0)
 674			n = n->rb_left;
 675		else
 676			n = n->rb_right;
 677	}
 678
 679	return NULL;
 680}
 681
 682static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev,
 683				   struct cfg80211_internal_bss *new)
 684{
 685	const struct cfg80211_bss_ies *ies;
 686	struct cfg80211_internal_bss *bss;
 687	const u8 *ie;
 688	int i, ssidlen;
 689	u8 fold = 0;
 
 690
 691	ies = rcu_access_pointer(new->pub.beacon_ies);
 692	if (WARN_ON(!ies))
 693		return false;
 694
 695	ie = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len);
 696	if (!ie) {
 697		/* nothing to do */
 698		return true;
 699	}
 700
 701	ssidlen = ie[1];
 702	for (i = 0; i < ssidlen; i++)
 703		fold |= ie[2 + i];
 704
 705	if (fold) {
 706		/* not a hidden SSID */
 707		return true;
 708	}
 709
 710	/* This is the bad part ... */
 711
 712	list_for_each_entry(bss, &rdev->bss_list, list) {
 
 
 
 
 
 
 713		if (!ether_addr_equal(bss->pub.bssid, new->pub.bssid))
 714			continue;
 715		if (bss->pub.channel != new->pub.channel)
 716			continue;
 717		if (bss->pub.scan_width != new->pub.scan_width)
 718			continue;
 719		if (rcu_access_pointer(bss->pub.beacon_ies))
 720			continue;
 721		ies = rcu_access_pointer(bss->pub.ies);
 722		if (!ies)
 723			continue;
 724		ie = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len);
 725		if (!ie)
 726			continue;
 727		if (ssidlen && ie[1] != ssidlen)
 728			continue;
 729		if (WARN_ON_ONCE(bss->pub.hidden_beacon_bss))
 730			continue;
 731		if (WARN_ON_ONCE(!list_empty(&bss->hidden_list)))
 732			list_del(&bss->hidden_list);
 733		/* combine them */
 734		list_add(&bss->hidden_list, &new->hidden_list);
 735		bss->pub.hidden_beacon_bss = &new->pub;
 736		new->refcount += bss->refcount;
 737		rcu_assign_pointer(bss->pub.beacon_ies,
 738				   new->pub.beacon_ies);
 739	}
 740
 
 
 
 
 741	return true;
 742}
 743
 744/* Returned bss is reference counted and must be cleaned up appropriately. */
 745static struct cfg80211_internal_bss *
 746cfg80211_bss_update(struct cfg80211_registered_device *rdev,
 747		    struct cfg80211_internal_bss *tmp,
 748		    bool signal_valid)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 749{
 750	struct cfg80211_internal_bss *found = NULL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 751
 752	if (WARN_ON(!tmp->pub.channel))
 753		return NULL;
 
 754
 755	tmp->ts = jiffies;
 
 756
 757	spin_lock_bh(&rdev->bss_lock);
 
 
 
 
 
 
 758
 759	if (WARN_ON(!rcu_access_pointer(tmp->pub.ies))) {
 760		spin_unlock_bh(&rdev->bss_lock);
 761		return NULL;
 
 
 
 
 
 
 
 
 
 
 
 
 762	}
 763
 764	found = rb_find_bss(rdev, tmp, BSS_CMP_REGULAR);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 765
 766	if (found) {
 767		/* Update IEs */
 768		if (rcu_access_pointer(tmp->pub.proberesp_ies)) {
 769			const struct cfg80211_bss_ies *old;
 770
 771			old = rcu_access_pointer(found->pub.proberesp_ies);
 
 
 772
 773			rcu_assign_pointer(found->pub.proberesp_ies,
 774					   tmp->pub.proberesp_ies);
 775			/* Override possible earlier Beacon frame IEs */
 776			rcu_assign_pointer(found->pub.ies,
 777					   tmp->pub.proberesp_ies);
 778			if (old)
 779				kfree_rcu((struct cfg80211_bss_ies *)old,
 780					  rcu_head);
 781		} else if (rcu_access_pointer(tmp->pub.beacon_ies)) {
 782			const struct cfg80211_bss_ies *old;
 783			struct cfg80211_internal_bss *bss;
 784
 785			if (found->pub.hidden_beacon_bss &&
 786			    !list_empty(&found->hidden_list)) {
 787				const struct cfg80211_bss_ies *f;
 788
 789				/*
 790				 * The found BSS struct is one of the probe
 791				 * response members of a group, but we're
 792				 * receiving a beacon (beacon_ies in the tmp
 793				 * bss is used). This can only mean that the
 794				 * AP changed its beacon from not having an
 795				 * SSID to showing it, which is confusing so
 796				 * drop this information.
 797				 */
 798
 799				f = rcu_access_pointer(tmp->pub.beacon_ies);
 800				kfree_rcu((struct cfg80211_bss_ies *)f,
 801					  rcu_head);
 802				goto drop;
 803			}
 
 
 
 
 
 
 
 
 
 
 
 
 804
 805			old = rcu_access_pointer(found->pub.beacon_ies);
 
 806
 807			rcu_assign_pointer(found->pub.beacon_ies,
 808					   tmp->pub.beacon_ies);
 
 
 
 
 
 
 809
 810			/* Override IEs if they were from a beacon before */
 811			if (old == rcu_access_pointer(found->pub.ies))
 812				rcu_assign_pointer(found->pub.ies,
 813						   tmp->pub.beacon_ies);
 814
 815			/* Assign beacon IEs to all sub entries */
 816			list_for_each_entry(bss, &found->hidden_list,
 817					    hidden_list) {
 818				const struct cfg80211_bss_ies *ies;
 819
 820				ies = rcu_access_pointer(bss->pub.beacon_ies);
 821				WARN_ON(ies != old);
 822
 823				rcu_assign_pointer(bss->pub.beacon_ies,
 824						   tmp->pub.beacon_ies);
 825			}
 826
 827			if (old)
 828				kfree_rcu((struct cfg80211_bss_ies *)old,
 829					  rcu_head);
 830		}
 831
 832		found->pub.beacon_interval = tmp->pub.beacon_interval;
 833		/*
 834		 * don't update the signal if beacon was heard on
 835		 * adjacent channel.
 836		 */
 837		if (signal_valid)
 838			found->pub.signal = tmp->pub.signal;
 839		found->pub.capability = tmp->pub.capability;
 840		found->ts = tmp->ts;
 841		found->ts_boottime = tmp->ts_boottime;
 842	} else {
 843		struct cfg80211_internal_bss *new;
 844		struct cfg80211_internal_bss *hidden;
 845		struct cfg80211_bss_ies *ies;
 846
 847		/*
 848		 * create a copy -- the "res" variable that is passed in
 849		 * is allocated on the stack since it's not needed in the
 850		 * more common case of an update
 851		 */
 852		new = kzalloc(sizeof(*new) + rdev->wiphy.bss_priv_size,
 853			      GFP_ATOMIC);
 854		if (!new) {
 855			ies = (void *)rcu_dereference(tmp->pub.beacon_ies);
 856			if (ies)
 857				kfree_rcu(ies, rcu_head);
 858			ies = (void *)rcu_dereference(tmp->pub.proberesp_ies);
 859			if (ies)
 860				kfree_rcu(ies, rcu_head);
 861			goto drop;
 862		}
 863		memcpy(new, tmp, sizeof(*new));
 864		new->refcount = 1;
 865		INIT_LIST_HEAD(&new->hidden_list);
 
 
 
 866
 867		if (rcu_access_pointer(tmp->pub.proberesp_ies)) {
 868			hidden = rb_find_bss(rdev, tmp, BSS_CMP_HIDE_ZLEN);
 869			if (!hidden)
 870				hidden = rb_find_bss(rdev, tmp,
 871						     BSS_CMP_HIDE_NUL);
 872			if (hidden) {
 873				new->pub.hidden_beacon_bss = &hidden->pub;
 874				list_add(&new->hidden_list,
 875					 &hidden->hidden_list);
 876				hidden->refcount++;
 
 
 877				rcu_assign_pointer(new->pub.beacon_ies,
 878						   hidden->pub.beacon_ies);
 
 
 879			}
 880		} else {
 881			/*
 882			 * Ok so we found a beacon, and don't have an entry. If
 883			 * it's a beacon with hidden SSID, we might be in for an
 884			 * expensive search for any probe responses that should
 885			 * be grouped with this beacon for updates ...
 886			 */
 887			if (!cfg80211_combine_bsses(rdev, new)) {
 888				kfree(new);
 889				goto drop;
 890			}
 891		}
 892
 
 
 
 
 
 
 
 
 
 
 
 
 893		list_add_tail(&new->list, &rdev->bss_list);
 
 894		rb_insert_bss(rdev, new);
 895		found = new;
 896	}
 897
 898	rdev->bss_generation++;
 899	bss_ref_get(rdev, found);
 900	spin_unlock_bh(&rdev->bss_lock);
 901
 902	return found;
 903 drop:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 904	spin_unlock_bh(&rdev->bss_lock);
 905	return NULL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 906}
 
 907
 
 
 
 
 
 
 
 
 908static struct ieee80211_channel *
 909cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,
 910			 struct ieee80211_channel *channel)
 911{
 912	const u8 *tmp;
 913	u32 freq;
 914	int channel_number = -1;
 
 915
 916	tmp = cfg80211_find_ie(WLAN_EID_DS_PARAMS, ie, ielen);
 917	if (tmp && tmp[1] == 1) {
 918		channel_number = tmp[2];
 919	} else {
 920		tmp = cfg80211_find_ie(WLAN_EID_HT_OPERATION, ie, ielen);
 921		if (tmp && tmp[1] >= sizeof(struct ieee80211_ht_operation)) {
 922			struct ieee80211_ht_operation *htop = (void *)(tmp + 2);
 
 
 
 
 
 
 
 
 
 923
 924			channel_number = htop->primary_chan;
 
 
 
 
 
 
 
 
 
 
 925		}
 926	}
 927
 928	if (channel_number < 0)
 929		return channel;
 
 930
 931	freq = ieee80211_channel_to_frequency(channel_number, channel->band);
 932	channel = ieee80211_get_channel(wiphy, freq);
 933	if (!channel)
 
 
 934		return NULL;
 935	if (channel->flags & IEEE80211_CHAN_DISABLED)
 936		return NULL;
 937	return channel;
 938}
 939
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 940/* Returned bss is reference counted and must be cleaned up appropriately. */
 941struct cfg80211_bss *
 942cfg80211_inform_bss_data(struct wiphy *wiphy,
 943			 struct cfg80211_inform_bss *data,
 944			 enum cfg80211_bss_frame_type ftype,
 945			 const u8 *bssid, u64 tsf, u16 capability,
 946			 u16 beacon_interval, const u8 *ie, size_t ielen,
 947			 gfp_t gfp)
 948{
 
 
 949	struct cfg80211_bss_ies *ies;
 950	struct ieee80211_channel *channel;
 951	struct cfg80211_internal_bss tmp = {}, *res;
 952	int bss_type;
 953	bool signal_valid;
 
 954
 955	if (WARN_ON(!wiphy))
 956		return NULL;
 957
 958	if (WARN_ON(wiphy->signal_type == CFG80211_SIGNAL_TYPE_UNSPEC &&
 959		    (data->signal < 0 || data->signal > 100)))
 
 
 
 960		return NULL;
 961
 962	channel = cfg80211_get_bss_channel(wiphy, ie, ielen, data->chan);
 
 
 
 963	if (!channel)
 964		return NULL;
 965
 966	memcpy(tmp.pub.bssid, bssid, ETH_ALEN);
 967	tmp.pub.channel = channel;
 968	tmp.pub.scan_width = data->scan_width;
 969	tmp.pub.signal = data->signal;
 970	tmp.pub.beacon_interval = beacon_interval;
 971	tmp.pub.capability = capability;
 972	tmp.ts_boottime = data->boottime_ns;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 973
 974	/*
 975	 * If we do not know here whether the IEs are from a Beacon or Probe
 976	 * Response frame, we need to pick one of the options and only use it
 977	 * with the driver that does not provide the full Beacon/Probe Response
 978	 * frame. Use Beacon frame pointer to avoid indicating that this should
 979	 * override the IEs pointer should we have received an earlier
 980	 * indication of Probe Response data.
 981	 */
 982	ies = kzalloc(sizeof(*ies) + ielen, gfp);
 983	if (!ies)
 984		return NULL;
 985	ies->len = ielen;
 986	ies->tsf = tsf;
 987	ies->from_beacon = false;
 988	memcpy(ies->data, ie, ielen);
 989
 990	switch (ftype) {
 991	case CFG80211_BSS_FTYPE_BEACON:
 992		ies->from_beacon = true;
 993		/* fall through to assign */
 994	case CFG80211_BSS_FTYPE_UNKNOWN:
 995		rcu_assign_pointer(tmp.pub.beacon_ies, ies);
 996		break;
 997	case CFG80211_BSS_FTYPE_PRESP:
 998		rcu_assign_pointer(tmp.pub.proberesp_ies, ies);
 999		break;
1000	}
1001	rcu_assign_pointer(tmp.pub.ies, ies);
1002
1003	signal_valid = abs(data->chan->center_freq - channel->center_freq) <=
1004		wiphy->max_adj_channel_rssi_comp;
1005	res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid);
1006	if (!res)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1007		return NULL;
1008
1009	if (channel->band == IEEE80211_BAND_60GHZ) {
1010		bss_type = res->pub.capability & WLAN_CAPABILITY_DMG_TYPE_MASK;
1011		if (bss_type == WLAN_CAPABILITY_DMG_TYPE_AP ||
1012		    bss_type == WLAN_CAPABILITY_DMG_TYPE_PBSS)
1013			regulatory_hint_found_beacon(wiphy, channel, gfp);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1014	} else {
1015		if (res->pub.capability & WLAN_CAPABILITY_ESS)
1016			regulatory_hint_found_beacon(wiphy, channel, gfp);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1017	}
1018
1019	trace_cfg80211_return_bss(&res->pub);
1020	/* cfg80211_bss_update gives us a referenced result */
1021	return &res->pub;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1022}
1023EXPORT_SYMBOL(cfg80211_inform_bss_data);
1024
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1025/* cfg80211_inform_bss_width_frame helper */
1026struct cfg80211_bss *
1027cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
1028			       struct cfg80211_inform_bss *data,
1029			       struct ieee80211_mgmt *mgmt, size_t len,
1030			       gfp_t gfp)
1031
1032{
 
1033	struct cfg80211_internal_bss tmp = {}, *res;
1034	struct cfg80211_bss_ies *ies;
1035	struct ieee80211_channel *channel;
1036	bool signal_valid;
1037	size_t ielen = len - offsetof(struct ieee80211_mgmt,
1038				      u.probe_resp.variable);
 
 
 
1039	int bss_type;
1040
1041	BUILD_BUG_ON(offsetof(struct ieee80211_mgmt, u.probe_resp.variable) !=
1042			offsetof(struct ieee80211_mgmt, u.beacon.variable));
1043
1044	trace_cfg80211_inform_bss_frame(wiphy, data, mgmt, len);
1045
1046	if (WARN_ON(!mgmt))
1047		return NULL;
1048
1049	if (WARN_ON(!wiphy))
1050		return NULL;
1051
1052	if (WARN_ON(wiphy->signal_type == CFG80211_SIGNAL_TYPE_UNSPEC &&
1053		    (data->signal < 0 || data->signal > 100)))
1054		return NULL;
1055
1056	if (WARN_ON(len < offsetof(struct ieee80211_mgmt, u.probe_resp.variable)))
 
 
 
 
 
 
 
 
1057		return NULL;
1058
1059	channel = cfg80211_get_bss_channel(wiphy, mgmt->u.beacon.variable,
1060					   ielen, data->chan);
 
 
 
 
 
 
 
 
1061	if (!channel)
1062		return NULL;
1063
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1064	ies = kzalloc(sizeof(*ies) + ielen, gfp);
1065	if (!ies)
1066		return NULL;
1067	ies->len = ielen;
1068	ies->tsf = le64_to_cpu(mgmt->u.probe_resp.timestamp);
1069	ies->from_beacon = ieee80211_is_beacon(mgmt->frame_control);
1070	memcpy(ies->data, mgmt->u.probe_resp.variable, ielen);
 
1071
1072	if (ieee80211_is_probe_resp(mgmt->frame_control))
1073		rcu_assign_pointer(tmp.pub.proberesp_ies, ies);
1074	else
1075		rcu_assign_pointer(tmp.pub.beacon_ies, ies);
1076	rcu_assign_pointer(tmp.pub.ies, ies);
1077	
1078	memcpy(tmp.pub.bssid, mgmt->bssid, ETH_ALEN);
 
 
1079	tmp.pub.channel = channel;
1080	tmp.pub.scan_width = data->scan_width;
1081	tmp.pub.signal = data->signal;
1082	tmp.pub.beacon_interval = le16_to_cpu(mgmt->u.probe_resp.beacon_int);
1083	tmp.pub.capability = le16_to_cpu(mgmt->u.probe_resp.capab_info);
1084	tmp.ts_boottime = data->boottime_ns;
 
 
 
 
 
 
 
 
1085
1086	signal_valid = abs(data->chan->center_freq - channel->center_freq) <=
1087		wiphy->max_adj_channel_rssi_comp;
1088	res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid);
1089	if (!res)
1090		return NULL;
 
 
1091
1092	if (channel->band == IEEE80211_BAND_60GHZ) {
1093		bss_type = res->pub.capability & WLAN_CAPABILITY_DMG_TYPE_MASK;
1094		if (bss_type == WLAN_CAPABILITY_DMG_TYPE_AP ||
1095		    bss_type == WLAN_CAPABILITY_DMG_TYPE_PBSS)
1096			regulatory_hint_found_beacon(wiphy, channel, gfp);
1097	} else {
1098		if (res->pub.capability & WLAN_CAPABILITY_ESS)
1099			regulatory_hint_found_beacon(wiphy, channel, gfp);
1100	}
1101
1102	trace_cfg80211_return_bss(&res->pub);
1103	/* cfg80211_bss_update gives us a referenced result */
1104	return &res->pub;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1105}
1106EXPORT_SYMBOL(cfg80211_inform_bss_frame_data);
1107
1108void cfg80211_ref_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
1109{
1110	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1111	struct cfg80211_internal_bss *bss;
1112
1113	if (!pub)
1114		return;
1115
1116	bss = container_of(pub, struct cfg80211_internal_bss, pub);
1117
1118	spin_lock_bh(&rdev->bss_lock);
1119	bss_ref_get(rdev, bss);
1120	spin_unlock_bh(&rdev->bss_lock);
1121}
1122EXPORT_SYMBOL(cfg80211_ref_bss);
1123
1124void cfg80211_put_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
1125{
1126	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1127	struct cfg80211_internal_bss *bss;
1128
1129	if (!pub)
1130		return;
1131
1132	bss = container_of(pub, struct cfg80211_internal_bss, pub);
1133
1134	spin_lock_bh(&rdev->bss_lock);
1135	bss_ref_put(rdev, bss);
1136	spin_unlock_bh(&rdev->bss_lock);
1137}
1138EXPORT_SYMBOL(cfg80211_put_bss);
1139
1140void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
1141{
1142	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1143	struct cfg80211_internal_bss *bss;
 
1144
1145	if (WARN_ON(!pub))
1146		return;
1147
1148	bss = container_of(pub, struct cfg80211_internal_bss, pub);
1149
1150	spin_lock_bh(&rdev->bss_lock);
1151	if (!list_empty(&bss->list)) {
1152		if (__cfg80211_unlink_bss(rdev, bss))
 
 
 
 
 
 
1153			rdev->bss_generation++;
1154	}
 
 
 
 
1155	spin_unlock_bh(&rdev->bss_lock);
1156}
1157EXPORT_SYMBOL(cfg80211_unlink_bss);
1158
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1159#ifdef CONFIG_CFG80211_WEXT
1160static struct cfg80211_registered_device *
1161cfg80211_get_dev_from_ifindex(struct net *net, int ifindex)
1162{
1163	struct cfg80211_registered_device *rdev;
1164	struct net_device *dev;
1165
1166	ASSERT_RTNL();
1167
1168	dev = dev_get_by_index(net, ifindex);
1169	if (!dev)
1170		return ERR_PTR(-ENODEV);
1171	if (dev->ieee80211_ptr)
1172		rdev = wiphy_to_rdev(dev->ieee80211_ptr->wiphy);
1173	else
1174		rdev = ERR_PTR(-ENODEV);
1175	dev_put(dev);
1176	return rdev;
1177}
1178
1179int cfg80211_wext_siwscan(struct net_device *dev,
1180			  struct iw_request_info *info,
1181			  union iwreq_data *wrqu, char *extra)
1182{
1183	struct cfg80211_registered_device *rdev;
1184	struct wiphy *wiphy;
1185	struct iw_scan_req *wreq = NULL;
1186	struct cfg80211_scan_request *creq = NULL;
1187	int i, err, n_channels = 0;
1188	enum ieee80211_band band;
1189
1190	if (!netif_running(dev))
1191		return -ENETDOWN;
1192
1193	if (wrqu->data.length == sizeof(struct iw_scan_req))
1194		wreq = (struct iw_scan_req *)extra;
1195
1196	rdev = cfg80211_get_dev_from_ifindex(dev_net(dev), dev->ifindex);
1197
1198	if (IS_ERR(rdev))
1199		return PTR_ERR(rdev);
1200
1201	if (rdev->scan_req || rdev->scan_msg) {
1202		err = -EBUSY;
1203		goto out;
1204	}
1205
1206	wiphy = &rdev->wiphy;
1207
1208	/* Determine number of channels, needed to allocate creq */
1209	if (wreq && wreq->num_channels)
1210		n_channels = wreq->num_channels;
1211	else
1212		n_channels = ieee80211_get_num_supported_channels(wiphy);
1213
1214	creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) +
1215		       n_channels * sizeof(void *),
1216		       GFP_ATOMIC);
1217	if (!creq) {
1218		err = -ENOMEM;
1219		goto out;
1220	}
1221
1222	creq->wiphy = wiphy;
1223	creq->wdev = dev->ieee80211_ptr;
1224	/* SSIDs come after channels */
1225	creq->ssids = (void *)&creq->channels[n_channels];
1226	creq->n_channels = n_channels;
1227	creq->n_ssids = 1;
1228	creq->scan_start = jiffies;
1229
1230	/* translate "Scan on frequencies" request */
1231	i = 0;
1232	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1233		int j;
1234
1235		if (!wiphy->bands[band])
1236			continue;
1237
1238		for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
1239			/* ignore disabled channels */
1240			if (wiphy->bands[band]->channels[j].flags &
1241						IEEE80211_CHAN_DISABLED)
1242				continue;
1243
1244			/* If we have a wireless request structure and the
1245			 * wireless request specifies frequencies, then search
1246			 * for the matching hardware channel.
1247			 */
1248			if (wreq && wreq->num_channels) {
1249				int k;
1250				int wiphy_freq = wiphy->bands[band]->channels[j].center_freq;
1251				for (k = 0; k < wreq->num_channels; k++) {
1252					struct iw_freq *freq =
1253						&wreq->channel_list[k];
1254					int wext_freq =
1255						cfg80211_wext_freq(freq);
1256
1257					if (wext_freq == wiphy_freq)
1258						goto wext_freq_found;
1259				}
1260				goto wext_freq_not_found;
1261			}
1262
1263		wext_freq_found:
1264			creq->channels[i] = &wiphy->bands[band]->channels[j];
1265			i++;
1266		wext_freq_not_found: ;
1267		}
1268	}
1269	/* No channels found? */
1270	if (!i) {
1271		err = -EINVAL;
1272		goto out;
1273	}
1274
1275	/* Set real number of channels specified in creq->channels[] */
1276	creq->n_channels = i;
1277
1278	/* translate "Scan for SSID" request */
1279	if (wreq) {
1280		if (wrqu->data.flags & IW_SCAN_THIS_ESSID) {
1281			if (wreq->essid_len > IEEE80211_MAX_SSID_LEN) {
1282				err = -EINVAL;
1283				goto out;
1284			}
1285			memcpy(creq->ssids[0].ssid, wreq->essid, wreq->essid_len);
1286			creq->ssids[0].ssid_len = wreq->essid_len;
1287		}
1288		if (wreq->scan_type == IW_SCAN_TYPE_PASSIVE)
1289			creq->n_ssids = 0;
1290	}
1291
1292	for (i = 0; i < IEEE80211_NUM_BANDS; i++)
1293		if (wiphy->bands[i])
1294			creq->rates[i] = (1 << wiphy->bands[i]->n_bitrates) - 1;
1295
 
 
 
 
1296	rdev->scan_req = creq;
1297	err = rdev_scan(rdev, creq);
1298	if (err) {
1299		rdev->scan_req = NULL;
1300		/* creq will be freed below */
1301	} else {
1302		nl80211_send_scan_start(rdev, dev->ieee80211_ptr);
1303		/* creq now owned by driver */
1304		creq = NULL;
1305		dev_hold(dev);
1306	}
 
1307 out:
1308	kfree(creq);
1309	return err;
1310}
1311EXPORT_WEXT_HANDLER(cfg80211_wext_siwscan);
1312
1313static char *ieee80211_scan_add_ies(struct iw_request_info *info,
1314				    const struct cfg80211_bss_ies *ies,
1315				    char *current_ev, char *end_buf)
1316{
1317	const u8 *pos, *end, *next;
1318	struct iw_event iwe;
1319
1320	if (!ies)
1321		return current_ev;
1322
1323	/*
1324	 * If needed, fragment the IEs buffer (at IE boundaries) into short
1325	 * enough fragments to fit into IW_GENERIC_IE_MAX octet messages.
1326	 */
1327	pos = ies->data;
1328	end = pos + ies->len;
1329
1330	while (end - pos > IW_GENERIC_IE_MAX) {
1331		next = pos + 2 + pos[1];
1332		while (next + 2 + next[1] - pos < IW_GENERIC_IE_MAX)
1333			next = next + 2 + next[1];
1334
1335		memset(&iwe, 0, sizeof(iwe));
1336		iwe.cmd = IWEVGENIE;
1337		iwe.u.data.length = next - pos;
1338		current_ev = iwe_stream_add_point_check(info, current_ev,
1339							end_buf, &iwe,
1340							(void *)pos);
1341		if (IS_ERR(current_ev))
1342			return current_ev;
1343		pos = next;
1344	}
1345
1346	if (end > pos) {
1347		memset(&iwe, 0, sizeof(iwe));
1348		iwe.cmd = IWEVGENIE;
1349		iwe.u.data.length = end - pos;
1350		current_ev = iwe_stream_add_point_check(info, current_ev,
1351							end_buf, &iwe,
1352							(void *)pos);
1353		if (IS_ERR(current_ev))
1354			return current_ev;
1355	}
1356
1357	return current_ev;
1358}
1359
1360static char *
1361ieee80211_bss(struct wiphy *wiphy, struct iw_request_info *info,
1362	      struct cfg80211_internal_bss *bss, char *current_ev,
1363	      char *end_buf)
1364{
1365	const struct cfg80211_bss_ies *ies;
1366	struct iw_event iwe;
1367	const u8 *ie;
1368	u8 buf[50];
1369	u8 *cfg, *p, *tmp;
1370	int rem, i, sig;
1371	bool ismesh = false;
1372
1373	memset(&iwe, 0, sizeof(iwe));
1374	iwe.cmd = SIOCGIWAP;
1375	iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
1376	memcpy(iwe.u.ap_addr.sa_data, bss->pub.bssid, ETH_ALEN);
1377	current_ev = iwe_stream_add_event_check(info, current_ev, end_buf, &iwe,
1378						IW_EV_ADDR_LEN);
1379	if (IS_ERR(current_ev))
1380		return current_ev;
1381
1382	memset(&iwe, 0, sizeof(iwe));
1383	iwe.cmd = SIOCGIWFREQ;
1384	iwe.u.freq.m = ieee80211_frequency_to_channel(bss->pub.channel->center_freq);
1385	iwe.u.freq.e = 0;
1386	current_ev = iwe_stream_add_event_check(info, current_ev, end_buf, &iwe,
1387						IW_EV_FREQ_LEN);
1388	if (IS_ERR(current_ev))
1389		return current_ev;
1390
1391	memset(&iwe, 0, sizeof(iwe));
1392	iwe.cmd = SIOCGIWFREQ;
1393	iwe.u.freq.m = bss->pub.channel->center_freq;
1394	iwe.u.freq.e = 6;
1395	current_ev = iwe_stream_add_event_check(info, current_ev, end_buf, &iwe,
1396						IW_EV_FREQ_LEN);
1397	if (IS_ERR(current_ev))
1398		return current_ev;
1399
1400	if (wiphy->signal_type != CFG80211_SIGNAL_TYPE_NONE) {
1401		memset(&iwe, 0, sizeof(iwe));
1402		iwe.cmd = IWEVQUAL;
1403		iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED |
1404				     IW_QUAL_NOISE_INVALID |
1405				     IW_QUAL_QUAL_UPDATED;
1406		switch (wiphy->signal_type) {
1407		case CFG80211_SIGNAL_TYPE_MBM:
1408			sig = bss->pub.signal / 100;
1409			iwe.u.qual.level = sig;
1410			iwe.u.qual.updated |= IW_QUAL_DBM;
1411			if (sig < -110)		/* rather bad */
1412				sig = -110;
1413			else if (sig > -40)	/* perfect */
1414				sig = -40;
1415			/* will give a range of 0 .. 70 */
1416			iwe.u.qual.qual = sig + 110;
1417			break;
1418		case CFG80211_SIGNAL_TYPE_UNSPEC:
1419			iwe.u.qual.level = bss->pub.signal;
1420			/* will give range 0 .. 100 */
1421			iwe.u.qual.qual = bss->pub.signal;
1422			break;
1423		default:
1424			/* not reached */
1425			break;
1426		}
1427		current_ev = iwe_stream_add_event_check(info, current_ev,
1428							end_buf, &iwe,
1429							IW_EV_QUAL_LEN);
1430		if (IS_ERR(current_ev))
1431			return current_ev;
1432	}
1433
1434	memset(&iwe, 0, sizeof(iwe));
1435	iwe.cmd = SIOCGIWENCODE;
1436	if (bss->pub.capability & WLAN_CAPABILITY_PRIVACY)
1437		iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
1438	else
1439		iwe.u.data.flags = IW_ENCODE_DISABLED;
1440	iwe.u.data.length = 0;
1441	current_ev = iwe_stream_add_point_check(info, current_ev, end_buf,
1442						&iwe, "");
1443	if (IS_ERR(current_ev))
1444		return current_ev;
1445
1446	rcu_read_lock();
1447	ies = rcu_dereference(bss->pub.ies);
1448	rem = ies->len;
1449	ie = ies->data;
1450
1451	while (rem >= 2) {
1452		/* invalid data */
1453		if (ie[1] > rem - 2)
1454			break;
1455
1456		switch (ie[0]) {
1457		case WLAN_EID_SSID:
1458			memset(&iwe, 0, sizeof(iwe));
1459			iwe.cmd = SIOCGIWESSID;
1460			iwe.u.data.length = ie[1];
1461			iwe.u.data.flags = 1;
1462			current_ev = iwe_stream_add_point_check(info,
1463								current_ev,
1464								end_buf, &iwe,
1465								(u8 *)ie + 2);
1466			if (IS_ERR(current_ev))
1467				goto unlock;
1468			break;
1469		case WLAN_EID_MESH_ID:
1470			memset(&iwe, 0, sizeof(iwe));
1471			iwe.cmd = SIOCGIWESSID;
1472			iwe.u.data.length = ie[1];
1473			iwe.u.data.flags = 1;
1474			current_ev = iwe_stream_add_point_check(info,
1475								current_ev,
1476								end_buf, &iwe,
1477								(u8 *)ie + 2);
1478			if (IS_ERR(current_ev))
1479				goto unlock;
1480			break;
1481		case WLAN_EID_MESH_CONFIG:
1482			ismesh = true;
1483			if (ie[1] != sizeof(struct ieee80211_meshconf_ie))
1484				break;
1485			cfg = (u8 *)ie + 2;
1486			memset(&iwe, 0, sizeof(iwe));
1487			iwe.cmd = IWEVCUSTOM;
1488			sprintf(buf, "Mesh Network Path Selection Protocol ID: "
1489				"0x%02X", cfg[0]);
1490			iwe.u.data.length = strlen(buf);
1491			current_ev = iwe_stream_add_point_check(info,
1492								current_ev,
1493								end_buf,
1494								&iwe, buf);
1495			if (IS_ERR(current_ev))
1496				goto unlock;
1497			sprintf(buf, "Path Selection Metric ID: 0x%02X",
1498				cfg[1]);
1499			iwe.u.data.length = strlen(buf);
1500			current_ev = iwe_stream_add_point_check(info,
1501								current_ev,
1502								end_buf,
1503								&iwe, buf);
1504			if (IS_ERR(current_ev))
1505				goto unlock;
1506			sprintf(buf, "Congestion Control Mode ID: 0x%02X",
1507				cfg[2]);
1508			iwe.u.data.length = strlen(buf);
1509			current_ev = iwe_stream_add_point_check(info,
1510								current_ev,
1511								end_buf,
1512								&iwe, buf);
1513			if (IS_ERR(current_ev))
1514				goto unlock;
1515			sprintf(buf, "Synchronization ID: 0x%02X", cfg[3]);
1516			iwe.u.data.length = strlen(buf);
 
1517			current_ev = iwe_stream_add_point_check(info,
1518								current_ev,
1519								end_buf,
1520								&iwe, buf);
1521			if (IS_ERR(current_ev))
1522				goto unlock;
1523			sprintf(buf, "Authentication ID: 0x%02X", cfg[4]);
1524			iwe.u.data.length = strlen(buf);
 
1525			current_ev = iwe_stream_add_point_check(info,
1526								current_ev,
1527								end_buf,
1528								&iwe, buf);
1529			if (IS_ERR(current_ev))
1530				goto unlock;
1531			sprintf(buf, "Formation Info: 0x%02X", cfg[5]);
1532			iwe.u.data.length = strlen(buf);
 
1533			current_ev = iwe_stream_add_point_check(info,
1534								current_ev,
1535								end_buf,
1536								&iwe, buf);
1537			if (IS_ERR(current_ev))
1538				goto unlock;
1539			sprintf(buf, "Capabilities: 0x%02X", cfg[6]);
1540			iwe.u.data.length = strlen(buf);
 
1541			current_ev = iwe_stream_add_point_check(info,
1542								current_ev,
1543								end_buf,
1544								&iwe, buf);
1545			if (IS_ERR(current_ev))
1546				goto unlock;
1547			break;
1548		case WLAN_EID_SUPP_RATES:
1549		case WLAN_EID_EXT_SUPP_RATES:
1550			/* display all supported rates in readable format */
1551			p = current_ev + iwe_stream_lcp_len(info);
1552
1553			memset(&iwe, 0, sizeof(iwe));
1554			iwe.cmd = SIOCGIWRATE;
1555			/* Those two flags are ignored... */
1556			iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
1557
1558			for (i = 0; i < ie[1]; i++) {
1559				iwe.u.bitrate.value =
1560					((ie[i + 2] & 0x7f) * 500000);
1561				tmp = p;
1562				p = iwe_stream_add_value(info, current_ev, p,
1563							 end_buf, &iwe,
1564							 IW_EV_PARAM_LEN);
1565				if (p == tmp) {
1566					current_ev = ERR_PTR(-E2BIG);
1567					goto unlock;
1568				}
1569			}
1570			current_ev = p;
1571			break;
1572		}
1573		rem -= ie[1] + 2;
1574		ie += ie[1] + 2;
1575	}
1576
1577	if (bss->pub.capability & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS) ||
1578	    ismesh) {
1579		memset(&iwe, 0, sizeof(iwe));
1580		iwe.cmd = SIOCGIWMODE;
1581		if (ismesh)
1582			iwe.u.mode = IW_MODE_MESH;
1583		else if (bss->pub.capability & WLAN_CAPABILITY_ESS)
1584			iwe.u.mode = IW_MODE_MASTER;
1585		else
1586			iwe.u.mode = IW_MODE_ADHOC;
1587		current_ev = iwe_stream_add_event_check(info, current_ev,
1588							end_buf, &iwe,
1589							IW_EV_UINT_LEN);
1590		if (IS_ERR(current_ev))
1591			goto unlock;
1592	}
1593
1594	memset(&iwe, 0, sizeof(iwe));
1595	iwe.cmd = IWEVCUSTOM;
1596	sprintf(buf, "tsf=%016llx", (unsigned long long)(ies->tsf));
1597	iwe.u.data.length = strlen(buf);
1598	current_ev = iwe_stream_add_point_check(info, current_ev, end_buf,
1599						&iwe, buf);
1600	if (IS_ERR(current_ev))
1601		goto unlock;
1602	memset(&iwe, 0, sizeof(iwe));
1603	iwe.cmd = IWEVCUSTOM;
1604	sprintf(buf, " Last beacon: %ums ago",
1605		elapsed_jiffies_msecs(bss->ts));
1606	iwe.u.data.length = strlen(buf);
1607	current_ev = iwe_stream_add_point_check(info, current_ev,
1608						end_buf, &iwe, buf);
1609	if (IS_ERR(current_ev))
1610		goto unlock;
1611
1612	current_ev = ieee80211_scan_add_ies(info, ies, current_ev, end_buf);
1613
1614 unlock:
1615	rcu_read_unlock();
1616	return current_ev;
1617}
1618
1619
1620static int ieee80211_scan_results(struct cfg80211_registered_device *rdev,
1621				  struct iw_request_info *info,
1622				  char *buf, size_t len)
1623{
1624	char *current_ev = buf;
1625	char *end_buf = buf + len;
1626	struct cfg80211_internal_bss *bss;
1627	int err = 0;
1628
1629	spin_lock_bh(&rdev->bss_lock);
1630	cfg80211_bss_expire(rdev);
1631
1632	list_for_each_entry(bss, &rdev->bss_list, list) {
1633		if (buf + len - current_ev <= IW_EV_ADDR_LEN) {
1634			err = -E2BIG;
1635			break;
1636		}
1637		current_ev = ieee80211_bss(&rdev->wiphy, info, bss,
1638					   current_ev, end_buf);
1639		if (IS_ERR(current_ev)) {
1640			err = PTR_ERR(current_ev);
1641			break;
1642		}
1643	}
1644	spin_unlock_bh(&rdev->bss_lock);
1645
1646	if (err)
1647		return err;
1648	return current_ev - buf;
1649}
1650
1651
1652int cfg80211_wext_giwscan(struct net_device *dev,
1653			  struct iw_request_info *info,
1654			  struct iw_point *data, char *extra)
1655{
 
1656	struct cfg80211_registered_device *rdev;
1657	int res;
1658
1659	if (!netif_running(dev))
1660		return -ENETDOWN;
1661
1662	rdev = cfg80211_get_dev_from_ifindex(dev_net(dev), dev->ifindex);
1663
1664	if (IS_ERR(rdev))
1665		return PTR_ERR(rdev);
1666
1667	if (rdev->scan_req || rdev->scan_msg)
1668		return -EAGAIN;
1669
1670	res = ieee80211_scan_results(rdev, info, extra, data->length);
1671	data->length = 0;
1672	if (res >= 0) {
1673		data->length = res;
1674		res = 0;
1675	}
1676
1677	return res;
1678}
1679EXPORT_WEXT_HANDLER(cfg80211_wext_giwscan);
1680#endif