Linux Audio

Check our new training course

Loading...
v5.9
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * mac80211 configuration hooks for cfg80211
   4 *
   5 * Copyright 2006-2010	Johannes Berg <johannes@sipsolutions.net>
   6 * Copyright 2013-2015  Intel Mobile Communications GmbH
   7 * Copyright (C) 2015-2017 Intel Deutschland GmbH
   8 * Copyright (C) 2018-2020 Intel Corporation
   9 */
  10
  11#include <linux/ieee80211.h>
  12#include <linux/nl80211.h>
  13#include <linux/rtnetlink.h>
  14#include <linux/slab.h>
  15#include <net/net_namespace.h>
  16#include <linux/rcupdate.h>
  17#include <linux/fips.h>
  18#include <linux/if_ether.h>
  19#include <net/cfg80211.h>
  20#include "ieee80211_i.h"
  21#include "driver-ops.h"
  22#include "rate.h"
  23#include "mesh.h"
  24#include "wme.h"
  25
  26static void ieee80211_set_mu_mimo_follow(struct ieee80211_sub_if_data *sdata,
  27					 struct vif_params *params)
  28{
  29	bool mu_mimo_groups = false;
  30	bool mu_mimo_follow = false;
  31
  32	if (params->vht_mumimo_groups) {
  33		u64 membership;
  34
  35		BUILD_BUG_ON(sizeof(membership) != WLAN_MEMBERSHIP_LEN);
  36
  37		memcpy(sdata->vif.bss_conf.mu_group.membership,
  38		       params->vht_mumimo_groups, WLAN_MEMBERSHIP_LEN);
  39		memcpy(sdata->vif.bss_conf.mu_group.position,
  40		       params->vht_mumimo_groups + WLAN_MEMBERSHIP_LEN,
  41		       WLAN_USER_POSITION_LEN);
  42		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_MU_GROUPS);
  43		/* don't care about endianness - just check for 0 */
  44		memcpy(&membership, params->vht_mumimo_groups,
  45		       WLAN_MEMBERSHIP_LEN);
  46		mu_mimo_groups = membership != 0;
  47	}
  48
  49	if (params->vht_mumimo_follow_addr) {
  50		mu_mimo_follow =
  51			is_valid_ether_addr(params->vht_mumimo_follow_addr);
  52		ether_addr_copy(sdata->u.mntr.mu_follow_addr,
  53				params->vht_mumimo_follow_addr);
  54	}
  55
  56	sdata->vif.mu_mimo_owner = mu_mimo_groups || mu_mimo_follow;
  57}
  58
  59static int ieee80211_set_mon_options(struct ieee80211_sub_if_data *sdata,
  60				     struct vif_params *params)
  61{
  62	struct ieee80211_local *local = sdata->local;
  63	struct ieee80211_sub_if_data *monitor_sdata;
  64
  65	/* check flags first */
  66	if (params->flags && ieee80211_sdata_running(sdata)) {
  67		u32 mask = MONITOR_FLAG_COOK_FRAMES | MONITOR_FLAG_ACTIVE;
  68
  69		/*
  70		 * Prohibit MONITOR_FLAG_COOK_FRAMES and
  71		 * MONITOR_FLAG_ACTIVE to be changed while the
  72		 * interface is up.
  73		 * Else we would need to add a lot of cruft
  74		 * to update everything:
  75		 *	cooked_mntrs, monitor and all fif_* counters
  76		 *	reconfigure hardware
  77		 */
  78		if ((params->flags & mask) != (sdata->u.mntr.flags & mask))
  79			return -EBUSY;
  80	}
  81
  82	/* also validate MU-MIMO change */
  83	monitor_sdata = rtnl_dereference(local->monitor_sdata);
  84
  85	if (!monitor_sdata &&
  86	    (params->vht_mumimo_groups || params->vht_mumimo_follow_addr))
  87		return -EOPNOTSUPP;
  88
  89	/* apply all changes now - no failures allowed */
  90
  91	if (monitor_sdata)
  92		ieee80211_set_mu_mimo_follow(monitor_sdata, params);
  93
  94	if (params->flags) {
  95		if (ieee80211_sdata_running(sdata)) {
  96			ieee80211_adjust_monitor_flags(sdata, -1);
  97			sdata->u.mntr.flags = params->flags;
  98			ieee80211_adjust_monitor_flags(sdata, 1);
  99
 100			ieee80211_configure_filter(local);
 101		} else {
 102			/*
 103			 * Because the interface is down, ieee80211_do_stop
 104			 * and ieee80211_do_open take care of "everything"
 105			 * mentioned in the comment above.
 106			 */
 107			sdata->u.mntr.flags = params->flags;
 108		}
 109	}
 110
 111	return 0;
 112}
 113
 114static struct wireless_dev *ieee80211_add_iface(struct wiphy *wiphy,
 115						const char *name,
 116						unsigned char name_assign_type,
 117						enum nl80211_iftype type,
 
 118						struct vif_params *params)
 119{
 120	struct ieee80211_local *local = wiphy_priv(wiphy);
 121	struct wireless_dev *wdev;
 122	struct ieee80211_sub_if_data *sdata;
 123	int err;
 124
 125	err = ieee80211_if_add(local, name, name_assign_type, &wdev, type, params);
 126	if (err)
 127		return ERR_PTR(err);
 128
 129	sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
 130
 131	if (type == NL80211_IFTYPE_MONITOR) {
 132		err = ieee80211_set_mon_options(sdata, params);
 133		if (err) {
 134			ieee80211_if_remove(sdata);
 135			return NULL;
 136		}
 137	}
 138
 139	return wdev;
 140}
 141
 142static int ieee80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
 143{
 144	ieee80211_if_remove(IEEE80211_WDEV_TO_SUB_IF(wdev));
 145
 146	return 0;
 147}
 148
 149static int ieee80211_change_iface(struct wiphy *wiphy,
 150				  struct net_device *dev,
 151				  enum nl80211_iftype type,
 152				  struct vif_params *params)
 153{
 154	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 155	int ret;
 156
 157	ret = ieee80211_if_change_type(sdata, type);
 158	if (ret)
 159		return ret;
 160
 161	if (type == NL80211_IFTYPE_AP_VLAN && params->use_4addr == 0) {
 
 162		RCU_INIT_POINTER(sdata->u.vlan.sta, NULL);
 163		ieee80211_check_fast_rx_iface(sdata);
 164	} else if (type == NL80211_IFTYPE_STATION && params->use_4addr >= 0) {
 165		sdata->u.mgd.use_4addr = params->use_4addr;
 166	}
 167
 168	if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
 169		ret = ieee80211_set_mon_options(sdata, params);
 170		if (ret)
 171			return ret;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 172	}
 173
 174	return 0;
 175}
 176
 177static int ieee80211_start_p2p_device(struct wiphy *wiphy,
 178				      struct wireless_dev *wdev)
 179{
 180	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
 181	int ret;
 182
 183	mutex_lock(&sdata->local->chanctx_mtx);
 184	ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
 185	mutex_unlock(&sdata->local->chanctx_mtx);
 186	if (ret < 0)
 187		return ret;
 188
 189	return ieee80211_do_open(wdev, true);
 190}
 191
 192static void ieee80211_stop_p2p_device(struct wiphy *wiphy,
 193				      struct wireless_dev *wdev)
 194{
 195	ieee80211_sdata_stop(IEEE80211_WDEV_TO_SUB_IF(wdev));
 196}
 197
 198static int ieee80211_start_nan(struct wiphy *wiphy,
 199			       struct wireless_dev *wdev,
 200			       struct cfg80211_nan_conf *conf)
 201{
 202	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
 203	int ret;
 204
 205	mutex_lock(&sdata->local->chanctx_mtx);
 206	ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
 207	mutex_unlock(&sdata->local->chanctx_mtx);
 208	if (ret < 0)
 209		return ret;
 210
 211	ret = ieee80211_do_open(wdev, true);
 212	if (ret)
 213		return ret;
 214
 215	ret = drv_start_nan(sdata->local, sdata, conf);
 216	if (ret)
 217		ieee80211_sdata_stop(sdata);
 218
 219	sdata->u.nan.conf = *conf;
 220
 221	return ret;
 222}
 223
 224static void ieee80211_stop_nan(struct wiphy *wiphy,
 225			       struct wireless_dev *wdev)
 226{
 227	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
 228
 229	drv_stop_nan(sdata->local, sdata);
 230	ieee80211_sdata_stop(sdata);
 231}
 232
 233static int ieee80211_nan_change_conf(struct wiphy *wiphy,
 234				     struct wireless_dev *wdev,
 235				     struct cfg80211_nan_conf *conf,
 236				     u32 changes)
 237{
 238	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
 239	struct cfg80211_nan_conf new_conf;
 240	int ret = 0;
 241
 242	if (sdata->vif.type != NL80211_IFTYPE_NAN)
 243		return -EOPNOTSUPP;
 244
 245	if (!ieee80211_sdata_running(sdata))
 246		return -ENETDOWN;
 247
 248	new_conf = sdata->u.nan.conf;
 249
 250	if (changes & CFG80211_NAN_CONF_CHANGED_PREF)
 251		new_conf.master_pref = conf->master_pref;
 252
 253	if (changes & CFG80211_NAN_CONF_CHANGED_BANDS)
 254		new_conf.bands = conf->bands;
 255
 256	ret = drv_nan_change_conf(sdata->local, sdata, &new_conf, changes);
 257	if (!ret)
 258		sdata->u.nan.conf = new_conf;
 259
 260	return ret;
 261}
 262
 263static int ieee80211_add_nan_func(struct wiphy *wiphy,
 264				  struct wireless_dev *wdev,
 265				  struct cfg80211_nan_func *nan_func)
 266{
 267	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
 268	int ret;
 269
 270	if (sdata->vif.type != NL80211_IFTYPE_NAN)
 271		return -EOPNOTSUPP;
 272
 273	if (!ieee80211_sdata_running(sdata))
 274		return -ENETDOWN;
 275
 276	spin_lock_bh(&sdata->u.nan.func_lock);
 277
 278	ret = idr_alloc(&sdata->u.nan.function_inst_ids,
 279			nan_func, 1, sdata->local->hw.max_nan_de_entries + 1,
 280			GFP_ATOMIC);
 281	spin_unlock_bh(&sdata->u.nan.func_lock);
 282
 283	if (ret < 0)
 284		return ret;
 285
 286	nan_func->instance_id = ret;
 287
 288	WARN_ON(nan_func->instance_id == 0);
 289
 290	ret = drv_add_nan_func(sdata->local, sdata, nan_func);
 291	if (ret) {
 292		spin_lock_bh(&sdata->u.nan.func_lock);
 293		idr_remove(&sdata->u.nan.function_inst_ids,
 294			   nan_func->instance_id);
 295		spin_unlock_bh(&sdata->u.nan.func_lock);
 296	}
 297
 298	return ret;
 299}
 300
 301static struct cfg80211_nan_func *
 302ieee80211_find_nan_func_by_cookie(struct ieee80211_sub_if_data *sdata,
 303				  u64 cookie)
 304{
 305	struct cfg80211_nan_func *func;
 306	int id;
 307
 308	lockdep_assert_held(&sdata->u.nan.func_lock);
 309
 310	idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, id) {
 311		if (func->cookie == cookie)
 312			return func;
 313	}
 314
 315	return NULL;
 316}
 317
 318static void ieee80211_del_nan_func(struct wiphy *wiphy,
 319				  struct wireless_dev *wdev, u64 cookie)
 320{
 321	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
 322	struct cfg80211_nan_func *func;
 323	u8 instance_id = 0;
 324
 325	if (sdata->vif.type != NL80211_IFTYPE_NAN ||
 326	    !ieee80211_sdata_running(sdata))
 327		return;
 328
 329	spin_lock_bh(&sdata->u.nan.func_lock);
 330
 331	func = ieee80211_find_nan_func_by_cookie(sdata, cookie);
 332	if (func)
 333		instance_id = func->instance_id;
 334
 335	spin_unlock_bh(&sdata->u.nan.func_lock);
 336
 337	if (instance_id)
 338		drv_del_nan_func(sdata->local, sdata, instance_id);
 339}
 340
 341static int ieee80211_set_noack_map(struct wiphy *wiphy,
 342				  struct net_device *dev,
 343				  u16 noack_map)
 344{
 345	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 346
 347	sdata->noack_map = noack_map;
 348
 349	ieee80211_check_fast_xmit_iface(sdata);
 350
 351	return 0;
 352}
 353
 354static int ieee80211_set_tx(struct ieee80211_sub_if_data *sdata,
 355			    const u8 *mac_addr, u8 key_idx)
 356{
 357	struct ieee80211_local *local = sdata->local;
 358	struct ieee80211_key *key;
 359	struct sta_info *sta;
 360	int ret = -EINVAL;
 361
 362	if (!wiphy_ext_feature_isset(local->hw.wiphy,
 363				     NL80211_EXT_FEATURE_EXT_KEY_ID))
 364		return -EINVAL;
 365
 366	sta = sta_info_get_bss(sdata, mac_addr);
 367
 368	if (!sta)
 369		return -EINVAL;
 370
 371	if (sta->ptk_idx == key_idx)
 372		return 0;
 373
 374	mutex_lock(&local->key_mtx);
 375	key = key_mtx_dereference(local, sta->ptk[key_idx]);
 376
 377	if (key && key->conf.flags & IEEE80211_KEY_FLAG_NO_AUTO_TX)
 378		ret = ieee80211_set_tx_key(key);
 379
 380	mutex_unlock(&local->key_mtx);
 381	return ret;
 382}
 383
 384static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
 385			     u8 key_idx, bool pairwise, const u8 *mac_addr,
 386			     struct key_params *params)
 387{
 388	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 389	struct ieee80211_local *local = sdata->local;
 390	struct sta_info *sta = NULL;
 391	const struct ieee80211_cipher_scheme *cs = NULL;
 392	struct ieee80211_key *key;
 393	int err;
 394
 395	if (!ieee80211_sdata_running(sdata))
 396		return -ENETDOWN;
 397
 398	if (pairwise && params->mode == NL80211_KEY_SET_TX)
 399		return ieee80211_set_tx(sdata, mac_addr, key_idx);
 400
 401	/* reject WEP and TKIP keys if WEP failed to initialize */
 402	switch (params->cipher) {
 403	case WLAN_CIPHER_SUITE_WEP40:
 404	case WLAN_CIPHER_SUITE_TKIP:
 405	case WLAN_CIPHER_SUITE_WEP104:
 406		if (WARN_ON_ONCE(fips_enabled))
 407			return -EINVAL;
 
 408	case WLAN_CIPHER_SUITE_CCMP:
 409	case WLAN_CIPHER_SUITE_CCMP_256:
 410	case WLAN_CIPHER_SUITE_AES_CMAC:
 411	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
 412	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
 413	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
 414	case WLAN_CIPHER_SUITE_GCMP:
 415	case WLAN_CIPHER_SUITE_GCMP_256:
 416		break;
 417	default:
 418		cs = ieee80211_cs_get(local, params->cipher, sdata->vif.type);
 419		break;
 420	}
 421
 422	key = ieee80211_key_alloc(params->cipher, key_idx, params->key_len,
 423				  params->key, params->seq_len, params->seq,
 424				  cs);
 425	if (IS_ERR(key))
 426		return PTR_ERR(key);
 427
 428	if (pairwise)
 429		key->conf.flags |= IEEE80211_KEY_FLAG_PAIRWISE;
 430
 431	if (params->mode == NL80211_KEY_NO_TX)
 432		key->conf.flags |= IEEE80211_KEY_FLAG_NO_AUTO_TX;
 433
 434	mutex_lock(&local->sta_mtx);
 435
 436	if (mac_addr) {
 437		sta = sta_info_get_bss(sdata, mac_addr);
 
 
 
 438		/*
 439		 * The ASSOC test makes sure the driver is ready to
 440		 * receive the key. When wpa_supplicant has roamed
 441		 * using FT, it attempts to set the key before
 442		 * association has completed, this rejects that attempt
 443		 * so it will set the key again after association.
 444		 *
 445		 * TODO: accept the key if we have a station entry and
 446		 *       add it to the device after the station.
 447		 */
 448		if (!sta || !test_sta_flag(sta, WLAN_STA_ASSOC)) {
 449			ieee80211_key_free_unused(key);
 450			err = -ENOENT;
 451			goto out_unlock;
 452		}
 453	}
 454
 455	switch (sdata->vif.type) {
 456	case NL80211_IFTYPE_STATION:
 457		if (sdata->u.mgd.mfp != IEEE80211_MFP_DISABLED)
 458			key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
 459		break;
 460	case NL80211_IFTYPE_AP:
 461	case NL80211_IFTYPE_AP_VLAN:
 462		/* Keys without a station are used for TX only */
 463		if (sta && test_sta_flag(sta, WLAN_STA_MFP))
 464			key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
 465		break;
 466	case NL80211_IFTYPE_ADHOC:
 467		/* no MFP (yet) */
 468		break;
 469	case NL80211_IFTYPE_MESH_POINT:
 470#ifdef CONFIG_MAC80211_MESH
 471		if (sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE)
 472			key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
 473		break;
 474#endif
 475	case NL80211_IFTYPE_WDS:
 476	case NL80211_IFTYPE_MONITOR:
 477	case NL80211_IFTYPE_P2P_DEVICE:
 478	case NL80211_IFTYPE_NAN:
 479	case NL80211_IFTYPE_UNSPECIFIED:
 480	case NUM_NL80211_IFTYPES:
 481	case NL80211_IFTYPE_P2P_CLIENT:
 482	case NL80211_IFTYPE_P2P_GO:
 483	case NL80211_IFTYPE_OCB:
 484		/* shouldn't happen */
 485		WARN_ON_ONCE(1);
 486		break;
 487	}
 488
 489	if (sta)
 490		sta->cipher_scheme = cs;
 491
 492	err = ieee80211_key_link(key, sdata, sta);
 493
 494 out_unlock:
 495	mutex_unlock(&local->sta_mtx);
 496
 497	return err;
 498}
 499
 500static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
 501			     u8 key_idx, bool pairwise, const u8 *mac_addr)
 502{
 503	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 504	struct ieee80211_local *local = sdata->local;
 505	struct sta_info *sta;
 506	struct ieee80211_key *key = NULL;
 507	int ret;
 508
 509	mutex_lock(&local->sta_mtx);
 510	mutex_lock(&local->key_mtx);
 511
 512	if (mac_addr) {
 513		ret = -ENOENT;
 514
 515		sta = sta_info_get_bss(sdata, mac_addr);
 516		if (!sta)
 517			goto out_unlock;
 518
 519		if (pairwise)
 520			key = key_mtx_dereference(local, sta->ptk[key_idx]);
 521		else
 522			key = key_mtx_dereference(local, sta->gtk[key_idx]);
 523	} else
 524		key = key_mtx_dereference(local, sdata->keys[key_idx]);
 525
 526	if (!key) {
 527		ret = -ENOENT;
 528		goto out_unlock;
 529	}
 530
 531	ieee80211_key_free(key, sdata->vif.type == NL80211_IFTYPE_STATION);
 532
 533	ret = 0;
 534 out_unlock:
 535	mutex_unlock(&local->key_mtx);
 536	mutex_unlock(&local->sta_mtx);
 537
 538	return ret;
 539}
 540
 541static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
 542			     u8 key_idx, bool pairwise, const u8 *mac_addr,
 543			     void *cookie,
 544			     void (*callback)(void *cookie,
 545					      struct key_params *params))
 546{
 547	struct ieee80211_sub_if_data *sdata;
 548	struct sta_info *sta = NULL;
 549	u8 seq[6] = {0};
 550	struct key_params params;
 551	struct ieee80211_key *key = NULL;
 552	u64 pn64;
 553	u32 iv32;
 554	u16 iv16;
 555	int err = -ENOENT;
 556	struct ieee80211_key_seq kseq = {};
 557
 558	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 559
 560	rcu_read_lock();
 561
 562	if (mac_addr) {
 563		sta = sta_info_get_bss(sdata, mac_addr);
 564		if (!sta)
 565			goto out;
 566
 567		if (pairwise && key_idx < NUM_DEFAULT_KEYS)
 568			key = rcu_dereference(sta->ptk[key_idx]);
 569		else if (!pairwise &&
 570			 key_idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS +
 571			 NUM_DEFAULT_BEACON_KEYS)
 572			key = rcu_dereference(sta->gtk[key_idx]);
 573	} else
 574		key = rcu_dereference(sdata->keys[key_idx]);
 575
 576	if (!key)
 577		goto out;
 578
 579	memset(&params, 0, sizeof(params));
 580
 581	params.cipher = key->conf.cipher;
 582
 583	switch (key->conf.cipher) {
 584	case WLAN_CIPHER_SUITE_TKIP:
 585		pn64 = atomic64_read(&key->conf.tx_pn);
 586		iv32 = TKIP_PN_TO_IV32(pn64);
 587		iv16 = TKIP_PN_TO_IV16(pn64);
 588
 589		if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
 590		    !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
 591			drv_get_key_seq(sdata->local, key, &kseq);
 592			iv32 = kseq.tkip.iv32;
 593			iv16 = kseq.tkip.iv16;
 594		}
 595
 596		seq[0] = iv16 & 0xff;
 597		seq[1] = (iv16 >> 8) & 0xff;
 598		seq[2] = iv32 & 0xff;
 599		seq[3] = (iv32 >> 8) & 0xff;
 600		seq[4] = (iv32 >> 16) & 0xff;
 601		seq[5] = (iv32 >> 24) & 0xff;
 602		params.seq = seq;
 603		params.seq_len = 6;
 604		break;
 605	case WLAN_CIPHER_SUITE_CCMP:
 606	case WLAN_CIPHER_SUITE_CCMP_256:
 607	case WLAN_CIPHER_SUITE_AES_CMAC:
 608	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
 609		BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
 610			     offsetof(typeof(kseq), aes_cmac));
 611		fallthrough;
 612	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
 613	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
 614		BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
 615			     offsetof(typeof(kseq), aes_gmac));
 616		fallthrough;
 617	case WLAN_CIPHER_SUITE_GCMP:
 618	case WLAN_CIPHER_SUITE_GCMP_256:
 619		BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
 620			     offsetof(typeof(kseq), gcmp));
 621
 622		if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
 623		    !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
 624			drv_get_key_seq(sdata->local, key, &kseq);
 625			memcpy(seq, kseq.ccmp.pn, 6);
 626		} else {
 627			pn64 = atomic64_read(&key->conf.tx_pn);
 628			seq[0] = pn64;
 629			seq[1] = pn64 >> 8;
 630			seq[2] = pn64 >> 16;
 631			seq[3] = pn64 >> 24;
 632			seq[4] = pn64 >> 32;
 633			seq[5] = pn64 >> 40;
 634		}
 635		params.seq = seq;
 636		params.seq_len = 6;
 637		break;
 638	default:
 639		if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
 640			break;
 641		if (WARN_ON(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))
 642			break;
 643		drv_get_key_seq(sdata->local, key, &kseq);
 644		params.seq = kseq.hw.seq;
 645		params.seq_len = kseq.hw.seq_len;
 646		break;
 647	}
 648
 649	params.key = key->conf.key;
 650	params.key_len = key->conf.keylen;
 651
 652	callback(cookie, &params);
 653	err = 0;
 654
 655 out:
 656	rcu_read_unlock();
 657	return err;
 658}
 659
 660static int ieee80211_config_default_key(struct wiphy *wiphy,
 661					struct net_device *dev,
 662					u8 key_idx, bool uni,
 663					bool multi)
 664{
 665	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 666
 667	ieee80211_set_default_key(sdata, key_idx, uni, multi);
 668
 669	return 0;
 670}
 671
 672static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
 673					     struct net_device *dev,
 674					     u8 key_idx)
 675{
 676	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 677
 678	ieee80211_set_default_mgmt_key(sdata, key_idx);
 679
 680	return 0;
 681}
 682
 683static int ieee80211_config_default_beacon_key(struct wiphy *wiphy,
 684					       struct net_device *dev,
 685					       u8 key_idx)
 686{
 687	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 688
 689	ieee80211_set_default_beacon_key(sdata, key_idx);
 690
 691	return 0;
 692}
 693
 694void sta_set_rate_info_tx(struct sta_info *sta,
 695			  const struct ieee80211_tx_rate *rate,
 696			  struct rate_info *rinfo)
 697{
 698	rinfo->flags = 0;
 699	if (rate->flags & IEEE80211_TX_RC_MCS) {
 700		rinfo->flags |= RATE_INFO_FLAGS_MCS;
 701		rinfo->mcs = rate->idx;
 702	} else if (rate->flags & IEEE80211_TX_RC_VHT_MCS) {
 703		rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS;
 704		rinfo->mcs = ieee80211_rate_get_vht_mcs(rate);
 705		rinfo->nss = ieee80211_rate_get_vht_nss(rate);
 706	} else {
 707		struct ieee80211_supported_band *sband;
 708		int shift = ieee80211_vif_get_shift(&sta->sdata->vif);
 709		u16 brate;
 710
 711		sband = ieee80211_get_sband(sta->sdata);
 712		if (sband) {
 713			brate = sband->bitrates[rate->idx].bitrate;
 714			rinfo->legacy = DIV_ROUND_UP(brate, 1 << shift);
 715		}
 716	}
 717	if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
 718		rinfo->bw = RATE_INFO_BW_40;
 719	else if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
 720		rinfo->bw = RATE_INFO_BW_80;
 721	else if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
 722		rinfo->bw = RATE_INFO_BW_160;
 723	else
 724		rinfo->bw = RATE_INFO_BW_20;
 725	if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
 726		rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
 727}
 728
 729static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
 730				  int idx, u8 *mac, struct station_info *sinfo)
 731{
 732	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 733	struct ieee80211_local *local = sdata->local;
 734	struct sta_info *sta;
 735	int ret = -ENOENT;
 736
 737	mutex_lock(&local->sta_mtx);
 738
 739	sta = sta_info_get_by_idx(sdata, idx);
 740	if (sta) {
 741		ret = 0;
 742		memcpy(mac, sta->sta.addr, ETH_ALEN);
 743		sta_set_sinfo(sta, sinfo, true);
 744	}
 745
 746	mutex_unlock(&local->sta_mtx);
 747
 748	return ret;
 749}
 750
 751static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev,
 752				 int idx, struct survey_info *survey)
 753{
 754	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
 755
 756	return drv_get_survey(local, idx, survey);
 757}
 758
 759static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
 760				 const u8 *mac, struct station_info *sinfo)
 761{
 762	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 763	struct ieee80211_local *local = sdata->local;
 764	struct sta_info *sta;
 765	int ret = -ENOENT;
 766
 767	mutex_lock(&local->sta_mtx);
 768
 769	sta = sta_info_get_bss(sdata, mac);
 770	if (sta) {
 771		ret = 0;
 772		sta_set_sinfo(sta, sinfo, true);
 773	}
 774
 775	mutex_unlock(&local->sta_mtx);
 776
 777	return ret;
 778}
 779
 780static int ieee80211_set_monitor_channel(struct wiphy *wiphy,
 781					 struct cfg80211_chan_def *chandef)
 782{
 783	struct ieee80211_local *local = wiphy_priv(wiphy);
 784	struct ieee80211_sub_if_data *sdata;
 785	int ret = 0;
 786
 787	if (cfg80211_chandef_identical(&local->monitor_chandef, chandef))
 788		return 0;
 789
 790	mutex_lock(&local->mtx);
 
 791	if (local->use_chanctx) {
 792		sdata = rtnl_dereference(local->monitor_sdata);
 
 
 793		if (sdata) {
 794			ieee80211_vif_release_channel(sdata);
 795			ret = ieee80211_vif_use_channel(sdata, chandef,
 796					IEEE80211_CHANCTX_EXCLUSIVE);
 797		}
 798	} else if (local->open_count == local->monitors) {
 799		local->_oper_chandef = *chandef;
 800		ieee80211_hw_config(local, 0);
 801	}
 802
 803	if (ret == 0)
 804		local->monitor_chandef = *chandef;
 
 805	mutex_unlock(&local->mtx);
 806
 807	return ret;
 808}
 809
 810static int ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata,
 811				    const u8 *resp, size_t resp_len,
 812				    const struct ieee80211_csa_settings *csa)
 813{
 814	struct probe_resp *new, *old;
 815
 816	if (!resp || !resp_len)
 817		return 1;
 818
 819	old = sdata_dereference(sdata->u.ap.probe_resp, sdata);
 820
 821	new = kzalloc(sizeof(struct probe_resp) + resp_len, GFP_KERNEL);
 822	if (!new)
 823		return -ENOMEM;
 824
 825	new->len = resp_len;
 826	memcpy(new->data, resp, resp_len);
 827
 828	if (csa)
 829		memcpy(new->csa_counter_offsets, csa->counter_offsets_presp,
 830		       csa->n_counter_offsets_presp *
 831		       sizeof(new->csa_counter_offsets[0]));
 832
 833	rcu_assign_pointer(sdata->u.ap.probe_resp, new);
 834	if (old)
 835		kfree_rcu(old, rcu_head);
 836
 837	return 0;
 838}
 839
 840static int ieee80211_set_ftm_responder_params(
 841				struct ieee80211_sub_if_data *sdata,
 842				const u8 *lci, size_t lci_len,
 843				const u8 *civicloc, size_t civicloc_len)
 844{
 845	struct ieee80211_ftm_responder_params *new, *old;
 846	struct ieee80211_bss_conf *bss_conf;
 847	u8 *pos;
 848	int len;
 849
 850	if (!lci_len && !civicloc_len)
 851		return 0;
 852
 853	bss_conf = &sdata->vif.bss_conf;
 854	old = bss_conf->ftmr_params;
 855	len = lci_len + civicloc_len;
 856
 857	new = kzalloc(sizeof(*new) + len, GFP_KERNEL);
 858	if (!new)
 859		return -ENOMEM;
 860
 861	pos = (u8 *)(new + 1);
 862	if (lci_len) {
 863		new->lci_len = lci_len;
 864		new->lci = pos;
 865		memcpy(pos, lci, lci_len);
 866		pos += lci_len;
 867	}
 868
 869	if (civicloc_len) {
 870		new->civicloc_len = civicloc_len;
 871		new->civicloc = pos;
 872		memcpy(pos, civicloc, civicloc_len);
 873		pos += civicloc_len;
 874	}
 875
 876	bss_conf->ftmr_params = new;
 877	kfree(old);
 878
 879	return 0;
 880}
 881
 882static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata,
 883				   struct cfg80211_beacon_data *params,
 884				   const struct ieee80211_csa_settings *csa)
 885{
 886	struct beacon_data *new, *old;
 887	int new_head_len, new_tail_len;
 888	int size, err;
 889	u32 changed = BSS_CHANGED_BEACON;
 890
 891	old = sdata_dereference(sdata->u.ap.beacon, sdata);
 892
 893
 894	/* Need to have a beacon head if we don't have one yet */
 895	if (!params->head && !old)
 896		return -EINVAL;
 897
 898	/* new or old head? */
 899	if (params->head)
 900		new_head_len = params->head_len;
 901	else
 902		new_head_len = old->head_len;
 903
 904	/* new or old tail? */
 905	if (params->tail || !old)
 906		/* params->tail_len will be zero for !params->tail */
 907		new_tail_len = params->tail_len;
 908	else
 909		new_tail_len = old->tail_len;
 910
 911	size = sizeof(*new) + new_head_len + new_tail_len;
 912
 913	new = kzalloc(size, GFP_KERNEL);
 914	if (!new)
 915		return -ENOMEM;
 916
 917	/* start filling the new info now */
 918
 919	/*
 920	 * pointers go into the block we allocated,
 921	 * memory is | beacon_data | head | tail |
 922	 */
 923	new->head = ((u8 *) new) + sizeof(*new);
 924	new->tail = new->head + new_head_len;
 925	new->head_len = new_head_len;
 926	new->tail_len = new_tail_len;
 927
 928	if (csa) {
 929		new->csa_current_counter = csa->count;
 930		memcpy(new->csa_counter_offsets, csa->counter_offsets_beacon,
 931		       csa->n_counter_offsets_beacon *
 932		       sizeof(new->csa_counter_offsets[0]));
 933	}
 934
 935	/* copy in head */
 936	if (params->head)
 937		memcpy(new->head, params->head, new_head_len);
 938	else
 939		memcpy(new->head, old->head, new_head_len);
 940
 941	/* copy in optional tail */
 942	if (params->tail)
 943		memcpy(new->tail, params->tail, new_tail_len);
 944	else
 945		if (old)
 946			memcpy(new->tail, old->tail, new_tail_len);
 947
 948	err = ieee80211_set_probe_resp(sdata, params->probe_resp,
 949				       params->probe_resp_len, csa);
 950	if (err < 0) {
 951		kfree(new);
 952		return err;
 953	}
 954	if (err == 0)
 955		changed |= BSS_CHANGED_AP_PROBE_RESP;
 956
 957	if (params->ftm_responder != -1) {
 958		sdata->vif.bss_conf.ftm_responder = params->ftm_responder;
 959		err = ieee80211_set_ftm_responder_params(sdata,
 960							 params->lci,
 961							 params->lci_len,
 962							 params->civicloc,
 963							 params->civicloc_len);
 964
 965		if (err < 0) {
 966			kfree(new);
 967			return err;
 968		}
 969
 970		changed |= BSS_CHANGED_FTM_RESPONDER;
 971	}
 972
 973	rcu_assign_pointer(sdata->u.ap.beacon, new);
 974
 975	if (old)
 976		kfree_rcu(old, rcu_head);
 977
 978	return changed;
 979}
 980
 981static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
 982			      struct cfg80211_ap_settings *params)
 983{
 984	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 985	struct ieee80211_local *local = sdata->local;
 986	struct beacon_data *old;
 987	struct ieee80211_sub_if_data *vlan;
 988	u32 changed = BSS_CHANGED_BEACON_INT |
 989		      BSS_CHANGED_BEACON_ENABLED |
 990		      BSS_CHANGED_BEACON |
 991		      BSS_CHANGED_SSID |
 992		      BSS_CHANGED_P2P_PS |
 993		      BSS_CHANGED_TXPOWER |
 994		      BSS_CHANGED_TWT;
 995	int i, err;
 996	int prev_beacon_int;
 997
 998	old = sdata_dereference(sdata->u.ap.beacon, sdata);
 999	if (old)
1000		return -EALREADY;
1001
1002	if (params->smps_mode != NL80211_SMPS_OFF)
1003		return -ENOTSUPP;
1004
1005	sdata->smps_mode = IEEE80211_SMPS_OFF;
1006
1007	sdata->needed_rx_chains = sdata->local->rx_chains;
1008
1009	prev_beacon_int = sdata->vif.bss_conf.beacon_int;
1010	sdata->vif.bss_conf.beacon_int = params->beacon_interval;
1011
1012	if (params->he_cap && params->he_oper) {
1013		sdata->vif.bss_conf.he_support = true;
1014		sdata->vif.bss_conf.htc_trig_based_pkt_ext =
1015			le32_get_bits(params->he_oper->he_oper_params,
1016			      IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK);
1017		sdata->vif.bss_conf.frame_time_rts_th =
1018			le32_get_bits(params->he_oper->he_oper_params,
1019			      IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK);
1020		changed |= BSS_CHANGED_HE_OBSS_PD;
1021
1022		if (params->he_bss_color.enabled)
1023			changed |= BSS_CHANGED_HE_BSS_COLOR;
1024	}
 
1025
1026	mutex_lock(&local->mtx);
1027	err = ieee80211_vif_use_channel(sdata, &params->chandef,
1028					IEEE80211_CHANCTX_SHARED);
1029	if (!err)
1030		ieee80211_vif_copy_chanctx_to_vlans(sdata, false);
1031	mutex_unlock(&local->mtx);
1032	if (err) {
1033		sdata->vif.bss_conf.beacon_int = prev_beacon_int;
1034		return err;
1035	}
1036
1037	/*
1038	 * Apply control port protocol, this allows us to
1039	 * not encrypt dynamic WEP control frames.
1040	 */
1041	sdata->control_port_protocol = params->crypto.control_port_ethertype;
1042	sdata->control_port_no_encrypt = params->crypto.control_port_no_encrypt;
1043	sdata->control_port_over_nl80211 =
1044				params->crypto.control_port_over_nl80211;
1045	sdata->control_port_no_preauth =
1046				params->crypto.control_port_no_preauth;
1047	sdata->encrypt_headroom = ieee80211_cs_headroom(sdata->local,
1048							&params->crypto,
1049							sdata->vif.type);
1050
1051	list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) {
1052		vlan->control_port_protocol =
1053			params->crypto.control_port_ethertype;
1054		vlan->control_port_no_encrypt =
1055			params->crypto.control_port_no_encrypt;
1056		vlan->control_port_over_nl80211 =
1057			params->crypto.control_port_over_nl80211;
1058		vlan->control_port_no_preauth =
1059			params->crypto.control_port_no_preauth;
1060		vlan->encrypt_headroom =
1061			ieee80211_cs_headroom(sdata->local,
1062					      &params->crypto,
1063					      vlan->vif.type);
1064	}
1065
 
1066	sdata->vif.bss_conf.dtim_period = params->dtim_period;
1067	sdata->vif.bss_conf.enable_beacon = true;
1068	sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p;
1069	sdata->vif.bss_conf.twt_responder = params->twt_responder;
1070	memcpy(&sdata->vif.bss_conf.he_obss_pd, &params->he_obss_pd,
1071	       sizeof(struct ieee80211_he_obss_pd));
1072	memcpy(&sdata->vif.bss_conf.he_bss_color, &params->he_bss_color,
1073	       sizeof(struct ieee80211_he_bss_color));
1074
1075	sdata->vif.bss_conf.ssid_len = params->ssid_len;
1076	if (params->ssid_len)
1077		memcpy(sdata->vif.bss_conf.ssid, params->ssid,
1078		       params->ssid_len);
1079	sdata->vif.bss_conf.hidden_ssid =
1080		(params->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE);
1081
1082	memset(&sdata->vif.bss_conf.p2p_noa_attr, 0,
1083	       sizeof(sdata->vif.bss_conf.p2p_noa_attr));
1084	sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow =
1085		params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
1086	if (params->p2p_opp_ps)
1087		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
1088					IEEE80211_P2P_OPPPS_ENABLE_BIT;
1089
1090	sdata->beacon_rate_set = false;
1091	if (wiphy_ext_feature_isset(local->hw.wiphy,
1092				    NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) {
1093		for (i = 0; i < NUM_NL80211_BANDS; i++) {
1094			sdata->beacon_rateidx_mask[i] =
1095				params->beacon_rate.control[i].legacy;
1096			if (sdata->beacon_rateidx_mask[i])
1097				sdata->beacon_rate_set = true;
1098		}
1099	}
1100
1101	err = ieee80211_assign_beacon(sdata, &params->beacon, NULL);
1102	if (err < 0) {
1103		ieee80211_vif_release_channel(sdata);
1104		return err;
1105	}
1106	changed |= err;
1107
1108	err = drv_start_ap(sdata->local, sdata);
1109	if (err) {
1110		old = sdata_dereference(sdata->u.ap.beacon, sdata);
1111
1112		if (old)
1113			kfree_rcu(old, rcu_head);
1114		RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
1115		ieee80211_vif_release_channel(sdata);
1116		return err;
1117	}
1118
1119	ieee80211_recalc_dtim(local, sdata);
1120	ieee80211_bss_info_change_notify(sdata, changed);
1121
1122	netif_carrier_on(dev);
1123	list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
1124		netif_carrier_on(vlan->dev);
1125
1126	return 0;
1127}
1128
1129static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
1130				   struct cfg80211_beacon_data *params)
1131{
1132	struct ieee80211_sub_if_data *sdata;
1133	struct beacon_data *old;
1134	int err;
1135
1136	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1137	sdata_assert_lock(sdata);
1138
1139	/* don't allow changing the beacon while CSA is in place - offset
1140	 * of channel switch counter may change
1141	 */
1142	if (sdata->vif.csa_active)
1143		return -EBUSY;
1144
1145	old = sdata_dereference(sdata->u.ap.beacon, sdata);
1146	if (!old)
1147		return -ENOENT;
1148
1149	err = ieee80211_assign_beacon(sdata, params, NULL);
1150	if (err < 0)
1151		return err;
1152	ieee80211_bss_info_change_notify(sdata, err);
1153	return 0;
1154}
1155
1156static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
1157{
1158	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1159	struct ieee80211_sub_if_data *vlan;
1160	struct ieee80211_local *local = sdata->local;
1161	struct beacon_data *old_beacon;
1162	struct probe_resp *old_probe_resp;
1163	struct cfg80211_chan_def chandef;
1164
1165	sdata_assert_lock(sdata);
1166
1167	old_beacon = sdata_dereference(sdata->u.ap.beacon, sdata);
1168	if (!old_beacon)
1169		return -ENOENT;
1170	old_probe_resp = sdata_dereference(sdata->u.ap.probe_resp, sdata);
1171
1172	/* abort any running channel switch */
1173	mutex_lock(&local->mtx);
1174	sdata->vif.csa_active = false;
1175	if (sdata->csa_block_tx) {
1176		ieee80211_wake_vif_queues(local, sdata,
1177					  IEEE80211_QUEUE_STOP_REASON_CSA);
1178		sdata->csa_block_tx = false;
1179	}
1180
1181	mutex_unlock(&local->mtx);
1182
1183	kfree(sdata->u.ap.next_beacon);
1184	sdata->u.ap.next_beacon = NULL;
1185
1186	/* turn off carrier for this interface and dependent VLANs */
1187	list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
1188		netif_carrier_off(vlan->dev);
1189	netif_carrier_off(dev);
1190
1191	/* remove beacon and probe response */
1192	RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
1193	RCU_INIT_POINTER(sdata->u.ap.probe_resp, NULL);
1194	kfree_rcu(old_beacon, rcu_head);
1195	if (old_probe_resp)
1196		kfree_rcu(old_probe_resp, rcu_head);
1197
1198	kfree(sdata->vif.bss_conf.ftmr_params);
1199	sdata->vif.bss_conf.ftmr_params = NULL;
1200
1201	__sta_info_flush(sdata, true);
1202	ieee80211_free_keys(sdata, true);
1203
1204	sdata->vif.bss_conf.enable_beacon = false;
1205	sdata->beacon_rate_set = false;
1206	sdata->vif.bss_conf.ssid_len = 0;
1207	clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
1208	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
1209
1210	if (sdata->wdev.cac_started) {
1211		chandef = sdata->vif.bss_conf.chandef;
1212		cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
1213		cfg80211_cac_event(sdata->dev, &chandef,
1214				   NL80211_RADAR_CAC_ABORTED,
1215				   GFP_KERNEL);
1216	}
1217
1218	drv_stop_ap(sdata->local, sdata);
1219
1220	/* free all potentially still buffered bcast frames */
1221	local->total_ps_buffered -= skb_queue_len(&sdata->u.ap.ps.bc_buf);
1222	ieee80211_purge_tx_queue(&local->hw, &sdata->u.ap.ps.bc_buf);
1223
1224	mutex_lock(&local->mtx);
1225	ieee80211_vif_copy_chanctx_to_vlans(sdata, true);
1226	ieee80211_vif_release_channel(sdata);
1227	mutex_unlock(&local->mtx);
1228
1229	return 0;
1230}
1231
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1232static int sta_apply_auth_flags(struct ieee80211_local *local,
1233				struct sta_info *sta,
1234				u32 mask, u32 set)
1235{
1236	int ret;
1237
1238	if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
1239	    set & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
1240	    !test_sta_flag(sta, WLAN_STA_AUTH)) {
1241		ret = sta_info_move_state(sta, IEEE80211_STA_AUTH);
1242		if (ret)
1243			return ret;
1244	}
1245
1246	if (mask & BIT(NL80211_STA_FLAG_ASSOCIATED) &&
1247	    set & BIT(NL80211_STA_FLAG_ASSOCIATED) &&
1248	    !test_sta_flag(sta, WLAN_STA_ASSOC)) {
1249		/*
1250		 * When peer becomes associated, init rate control as
1251		 * well. Some drivers require rate control initialized
1252		 * before drv_sta_state() is called.
1253		 */
1254		if (!test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
1255			rate_control_rate_init(sta);
1256
1257		ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
1258		if (ret)
1259			return ret;
1260	}
1261
1262	if (mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
1263		if (set & BIT(NL80211_STA_FLAG_AUTHORIZED))
1264			ret = sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
1265		else if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
1266			ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
1267		else
1268			ret = 0;
1269		if (ret)
1270			return ret;
1271	}
1272
1273	if (mask & BIT(NL80211_STA_FLAG_ASSOCIATED) &&
1274	    !(set & BIT(NL80211_STA_FLAG_ASSOCIATED)) &&
1275	    test_sta_flag(sta, WLAN_STA_ASSOC)) {
1276		ret = sta_info_move_state(sta, IEEE80211_STA_AUTH);
1277		if (ret)
1278			return ret;
1279	}
1280
1281	if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
1282	    !(set & BIT(NL80211_STA_FLAG_AUTHENTICATED)) &&
1283	    test_sta_flag(sta, WLAN_STA_AUTH)) {
1284		ret = sta_info_move_state(sta, IEEE80211_STA_NONE);
1285		if (ret)
1286			return ret;
1287	}
1288
1289	return 0;
1290}
1291
1292static void sta_apply_mesh_params(struct ieee80211_local *local,
1293				  struct sta_info *sta,
1294				  struct station_parameters *params)
1295{
1296#ifdef CONFIG_MAC80211_MESH
1297	struct ieee80211_sub_if_data *sdata = sta->sdata;
1298	u32 changed = 0;
1299
1300	if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) {
1301		switch (params->plink_state) {
1302		case NL80211_PLINK_ESTAB:
1303			if (sta->mesh->plink_state != NL80211_PLINK_ESTAB)
1304				changed = mesh_plink_inc_estab_count(sdata);
1305			sta->mesh->plink_state = params->plink_state;
1306			sta->mesh->aid = params->peer_aid;
1307
1308			ieee80211_mps_sta_status_update(sta);
1309			changed |= ieee80211_mps_set_sta_local_pm(sta,
1310				      sdata->u.mesh.mshcfg.power_mode);
1311
1312			ewma_mesh_tx_rate_avg_init(&sta->mesh->tx_rate_avg);
1313			/* init at low value */
1314			ewma_mesh_tx_rate_avg_add(&sta->mesh->tx_rate_avg, 10);
1315
1316			break;
1317		case NL80211_PLINK_LISTEN:
1318		case NL80211_PLINK_BLOCKED:
1319		case NL80211_PLINK_OPN_SNT:
1320		case NL80211_PLINK_OPN_RCVD:
1321		case NL80211_PLINK_CNF_RCVD:
1322		case NL80211_PLINK_HOLDING:
1323			if (sta->mesh->plink_state == NL80211_PLINK_ESTAB)
1324				changed = mesh_plink_dec_estab_count(sdata);
1325			sta->mesh->plink_state = params->plink_state;
1326
1327			ieee80211_mps_sta_status_update(sta);
1328			changed |= ieee80211_mps_set_sta_local_pm(sta,
1329					NL80211_MESH_POWER_UNKNOWN);
1330			break;
1331		default:
1332			/*  nothing  */
1333			break;
1334		}
1335	}
1336
1337	switch (params->plink_action) {
1338	case NL80211_PLINK_ACTION_NO_ACTION:
1339		/* nothing */
1340		break;
1341	case NL80211_PLINK_ACTION_OPEN:
1342		changed |= mesh_plink_open(sta);
1343		break;
1344	case NL80211_PLINK_ACTION_BLOCK:
1345		changed |= mesh_plink_block(sta);
1346		break;
1347	}
1348
1349	if (params->local_pm)
1350		changed |= ieee80211_mps_set_sta_local_pm(sta,
1351							  params->local_pm);
1352
1353	ieee80211_mbss_info_change_notify(sdata, changed);
1354#endif
1355}
1356
1357static int sta_apply_parameters(struct ieee80211_local *local,
1358				struct sta_info *sta,
1359				struct station_parameters *params)
1360{
1361	int ret = 0;
1362	struct ieee80211_supported_band *sband;
1363	struct ieee80211_sub_if_data *sdata = sta->sdata;
 
1364	u32 mask, set;
1365
1366	sband = ieee80211_get_sband(sdata);
1367	if (!sband)
1368		return -EINVAL;
1369
1370	mask = params->sta_flags_mask;
1371	set = params->sta_flags_set;
1372
1373	if (ieee80211_vif_is_mesh(&sdata->vif)) {
1374		/*
1375		 * In mesh mode, ASSOCIATED isn't part of the nl80211
1376		 * API but must follow AUTHENTICATED for driver state.
1377		 */
1378		if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED))
1379			mask |= BIT(NL80211_STA_FLAG_ASSOCIATED);
1380		if (set & BIT(NL80211_STA_FLAG_AUTHENTICATED))
1381			set |= BIT(NL80211_STA_FLAG_ASSOCIATED);
1382	} else if (test_sta_flag(sta, WLAN_STA_TDLS_PEER)) {
1383		/*
1384		 * TDLS -- everything follows authorized, but
1385		 * only becoming authorized is possible, not
1386		 * going back
1387		 */
1388		if (set & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
1389			set |= BIT(NL80211_STA_FLAG_AUTHENTICATED) |
1390			       BIT(NL80211_STA_FLAG_ASSOCIATED);
1391			mask |= BIT(NL80211_STA_FLAG_AUTHENTICATED) |
1392				BIT(NL80211_STA_FLAG_ASSOCIATED);
1393		}
1394	}
1395
1396	if (mask & BIT(NL80211_STA_FLAG_WME) &&
1397	    local->hw.queues >= IEEE80211_NUM_ACS)
1398		sta->sta.wme = set & BIT(NL80211_STA_FLAG_WME);
1399
1400	/* auth flags will be set later for TDLS,
1401	 * and for unassociated stations that move to assocaited */
1402	if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1403	    !((mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) &&
1404	      (set & BIT(NL80211_STA_FLAG_ASSOCIATED)))) {
1405		ret = sta_apply_auth_flags(local, sta, mask, set);
1406		if (ret)
1407			return ret;
1408	}
1409
1410	if (mask & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE)) {
1411		if (set & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE))
1412			set_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE);
1413		else
1414			clear_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE);
1415	}
1416
1417	if (mask & BIT(NL80211_STA_FLAG_MFP)) {
1418		sta->sta.mfp = !!(set & BIT(NL80211_STA_FLAG_MFP));
1419		if (set & BIT(NL80211_STA_FLAG_MFP))
1420			set_sta_flag(sta, WLAN_STA_MFP);
1421		else
1422			clear_sta_flag(sta, WLAN_STA_MFP);
1423	}
1424
1425	if (mask & BIT(NL80211_STA_FLAG_TDLS_PEER)) {
1426		if (set & BIT(NL80211_STA_FLAG_TDLS_PEER))
1427			set_sta_flag(sta, WLAN_STA_TDLS_PEER);
1428		else
1429			clear_sta_flag(sta, WLAN_STA_TDLS_PEER);
1430	}
1431
1432	/* mark TDLS channel switch support, if the AP allows it */
1433	if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1434	    !sdata->u.mgd.tdls_chan_switch_prohibited &&
1435	    params->ext_capab_len >= 4 &&
1436	    params->ext_capab[3] & WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH)
1437		set_sta_flag(sta, WLAN_STA_TDLS_CHAN_SWITCH);
1438
1439	if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1440	    !sdata->u.mgd.tdls_wider_bw_prohibited &&
1441	    ieee80211_hw_check(&local->hw, TDLS_WIDER_BW) &&
1442	    params->ext_capab_len >= 8 &&
1443	    params->ext_capab[7] & WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED)
1444		set_sta_flag(sta, WLAN_STA_TDLS_WIDER_BW);
1445
1446	if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) {
1447		sta->sta.uapsd_queues = params->uapsd_queues;
1448		sta->sta.max_sp = params->max_sp;
1449	}
1450
1451	/* The sender might not have sent the last bit, consider it to be 0 */
1452	if (params->ext_capab_len >= 8) {
1453		u8 val = (params->ext_capab[7] &
1454			  WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB) >> 7;
1455
1456		/* we did get all the bits, take the MSB as well */
1457		if (params->ext_capab_len >= 9) {
1458			u8 val_msb = params->ext_capab[8] &
1459				WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB;
1460			val_msb <<= 1;
1461			val |= val_msb;
1462		}
1463
1464		switch (val) {
1465		case 1:
1466			sta->sta.max_amsdu_subframes = 32;
1467			break;
1468		case 2:
1469			sta->sta.max_amsdu_subframes = 16;
1470			break;
1471		case 3:
1472			sta->sta.max_amsdu_subframes = 8;
1473			break;
1474		default:
1475			sta->sta.max_amsdu_subframes = 0;
1476		}
1477	}
1478
1479	/*
1480	 * cfg80211 validates this (1-2007) and allows setting the AID
1481	 * only when creating a new station entry
1482	 */
1483	if (params->aid)
1484		sta->sta.aid = params->aid;
1485
1486	/*
1487	 * Some of the following updates would be racy if called on an
1488	 * existing station, via ieee80211_change_station(). However,
1489	 * all such changes are rejected by cfg80211 except for updates
1490	 * changing the supported rates on an existing but not yet used
1491	 * TDLS peer.
1492	 */
1493
1494	if (params->listen_interval >= 0)
1495		sta->listen_interval = params->listen_interval;
1496
1497	if (params->sta_modify_mask & STATION_PARAM_APPLY_STA_TXPOWER) {
1498		sta->sta.txpwr.type = params->txpwr.type;
1499		if (params->txpwr.type == NL80211_TX_POWER_LIMITED)
1500			sta->sta.txpwr.power = params->txpwr.power;
1501		ret = drv_sta_set_txpwr(local, sdata, sta);
1502		if (ret)
1503			return ret;
1504	}
1505
1506	if (params->supported_rates && params->supported_rates_len) {
1507		ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
1508					 sband, params->supported_rates,
1509					 params->supported_rates_len,
1510					 &sta->sta.supp_rates[sband->band]);
1511	}
1512
1513	if (params->ht_capa)
1514		ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
1515						  params->ht_capa, sta);
1516
1517	/* VHT can override some HT caps such as the A-MSDU max length */
1518	if (params->vht_capa)
1519		ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
1520						    params->vht_capa, sta);
1521
1522	if (params->he_capa)
1523		ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband,
1524						  (void *)params->he_capa,
1525						  params->he_capa_len,
1526						  (void *)params->he_6ghz_capa,
1527						  sta);
1528
1529	if (params->opmode_notif_used) {
1530		/* returned value is only needed for rc update, but the
1531		 * rc isn't initialized here yet, so ignore it
1532		 */
1533		__ieee80211_vht_handle_opmode(sdata, sta, params->opmode_notif,
1534					      sband->band);
1535	}
1536
1537	if (params->support_p2p_ps >= 0)
1538		sta->sta.support_p2p_ps = params->support_p2p_ps;
1539
1540	if (ieee80211_vif_is_mesh(&sdata->vif))
1541		sta_apply_mesh_params(local, sta, params);
1542
1543	if (params->airtime_weight)
1544		sta->airtime_weight = params->airtime_weight;
1545
1546	/* set the STA state after all sta info from usermode has been set */
1547	if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) ||
1548	    set & BIT(NL80211_STA_FLAG_ASSOCIATED)) {
1549		ret = sta_apply_auth_flags(local, sta, mask, set);
1550		if (ret)
1551			return ret;
1552	}
1553
1554	return 0;
1555}
1556
1557static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
1558				 const u8 *mac,
1559				 struct station_parameters *params)
1560{
1561	struct ieee80211_local *local = wiphy_priv(wiphy);
1562	struct sta_info *sta;
1563	struct ieee80211_sub_if_data *sdata;
1564	int err;
 
1565
1566	if (params->vlan) {
1567		sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
1568
1569		if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
1570		    sdata->vif.type != NL80211_IFTYPE_AP)
1571			return -EINVAL;
1572	} else
1573		sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1574
1575	if (ether_addr_equal(mac, sdata->vif.addr))
1576		return -EINVAL;
1577
1578	if (!is_valid_ether_addr(mac))
1579		return -EINVAL;
1580
1581	if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER) &&
1582	    sdata->vif.type == NL80211_IFTYPE_STATION &&
1583	    !sdata->u.mgd.associated)
1584		return -EINVAL;
1585
1586	sta = sta_info_alloc(sdata, mac, GFP_KERNEL);
1587	if (!sta)
1588		return -ENOMEM;
1589
1590	if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
1591		sta->sta.tdls = true;
1592
1593	err = sta_apply_parameters(local, sta, params);
1594	if (err) {
1595		sta_info_free(local, sta);
1596		return err;
1597	}
1598
1599	/*
1600	 * for TDLS and for unassociated station, rate control should be
1601	 * initialized only when rates are known and station is marked
1602	 * authorized/associated
1603	 */
1604	if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1605	    test_sta_flag(sta, WLAN_STA_ASSOC))
1606		rate_control_rate_init(sta);
1607
 
 
 
1608	err = sta_info_insert_rcu(sta);
1609	if (err) {
1610		rcu_read_unlock();
1611		return err;
1612	}
1613
 
 
 
1614	rcu_read_unlock();
1615
1616	return 0;
1617}
1618
1619static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
1620				 struct station_del_parameters *params)
1621{
1622	struct ieee80211_sub_if_data *sdata;
1623
1624	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1625
1626	if (params->mac)
1627		return sta_info_destroy_addr_bss(sdata, params->mac);
1628
1629	sta_info_flush(sdata);
1630	return 0;
1631}
1632
1633static int ieee80211_change_station(struct wiphy *wiphy,
1634				    struct net_device *dev, const u8 *mac,
1635				    struct station_parameters *params)
1636{
1637	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1638	struct ieee80211_local *local = wiphy_priv(wiphy);
1639	struct sta_info *sta;
1640	struct ieee80211_sub_if_data *vlansdata;
1641	enum cfg80211_station_type statype;
1642	int err;
1643
1644	mutex_lock(&local->sta_mtx);
1645
1646	sta = sta_info_get_bss(sdata, mac);
1647	if (!sta) {
1648		err = -ENOENT;
1649		goto out_err;
1650	}
1651
1652	switch (sdata->vif.type) {
1653	case NL80211_IFTYPE_MESH_POINT:
1654		if (sdata->u.mesh.user_mpm)
1655			statype = CFG80211_STA_MESH_PEER_USER;
1656		else
1657			statype = CFG80211_STA_MESH_PEER_KERNEL;
1658		break;
1659	case NL80211_IFTYPE_ADHOC:
1660		statype = CFG80211_STA_IBSS;
1661		break;
1662	case NL80211_IFTYPE_STATION:
1663		if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER)) {
1664			statype = CFG80211_STA_AP_STA;
1665			break;
1666		}
1667		if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
1668			statype = CFG80211_STA_TDLS_PEER_ACTIVE;
1669		else
1670			statype = CFG80211_STA_TDLS_PEER_SETUP;
1671		break;
1672	case NL80211_IFTYPE_AP:
1673	case NL80211_IFTYPE_AP_VLAN:
1674		if (test_sta_flag(sta, WLAN_STA_ASSOC))
1675			statype = CFG80211_STA_AP_CLIENT;
1676		else
1677			statype = CFG80211_STA_AP_CLIENT_UNASSOC;
1678		break;
1679	default:
1680		err = -EOPNOTSUPP;
1681		goto out_err;
1682	}
1683
1684	err = cfg80211_check_station_change(wiphy, params, statype);
1685	if (err)
1686		goto out_err;
1687
1688	if (params->vlan && params->vlan != sta->sdata->dev) {
 
 
 
1689		vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
1690
1691		if (params->vlan->ieee80211_ptr->use_4addr) {
1692			if (vlansdata->u.vlan.sta) {
1693				err = -EBUSY;
1694				goto out_err;
1695			}
1696
1697			rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
1698			__ieee80211_check_fast_rx_iface(vlansdata);
1699		}
1700
1701		if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
1702		    sta->sdata->u.vlan.sta)
1703			RCU_INIT_POINTER(sta->sdata->u.vlan.sta, NULL);
1704
1705		if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
1706			ieee80211_vif_dec_num_mcast(sta->sdata);
1707
1708		sta->sdata = vlansdata;
1709		ieee80211_check_fast_xmit(sta);
1710
1711		if (test_sta_flag(sta, WLAN_STA_AUTHORIZED)) {
1712			ieee80211_vif_inc_num_mcast(sta->sdata);
1713			cfg80211_send_layer2_update(sta->sdata->dev,
1714						    sta->sta.addr);
 
 
1715		}
 
 
1716	}
1717
1718	err = sta_apply_parameters(local, sta, params);
1719	if (err)
1720		goto out_err;
1721
1722	mutex_unlock(&local->sta_mtx);
1723
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1724	if (sdata->vif.type == NL80211_IFTYPE_STATION &&
1725	    params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
1726		ieee80211_recalc_ps(local);
1727		ieee80211_recalc_ps_vif(sdata);
1728	}
1729
1730	return 0;
1731out_err:
1732	mutex_unlock(&local->sta_mtx);
1733	return err;
1734}
1735
1736#ifdef CONFIG_MAC80211_MESH
1737static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
1738			       const u8 *dst, const u8 *next_hop)
1739{
1740	struct ieee80211_sub_if_data *sdata;
1741	struct mesh_path *mpath;
1742	struct sta_info *sta;
1743
1744	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1745
1746	rcu_read_lock();
1747	sta = sta_info_get(sdata, next_hop);
1748	if (!sta) {
1749		rcu_read_unlock();
1750		return -ENOENT;
1751	}
1752
1753	mpath = mesh_path_add(sdata, dst);
1754	if (IS_ERR(mpath)) {
1755		rcu_read_unlock();
1756		return PTR_ERR(mpath);
1757	}
1758
1759	mesh_path_fix_nexthop(mpath, sta);
1760
1761	rcu_read_unlock();
1762	return 0;
1763}
1764
1765static int ieee80211_del_mpath(struct wiphy *wiphy, struct net_device *dev,
1766			       const u8 *dst)
1767{
1768	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1769
1770	if (dst)
1771		return mesh_path_del(sdata, dst);
1772
1773	mesh_path_flush_by_iface(sdata);
1774	return 0;
1775}
1776
1777static int ieee80211_change_mpath(struct wiphy *wiphy, struct net_device *dev,
1778				  const u8 *dst, const u8 *next_hop)
1779{
1780	struct ieee80211_sub_if_data *sdata;
1781	struct mesh_path *mpath;
1782	struct sta_info *sta;
1783
1784	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1785
1786	rcu_read_lock();
1787
1788	sta = sta_info_get(sdata, next_hop);
1789	if (!sta) {
1790		rcu_read_unlock();
1791		return -ENOENT;
1792	}
1793
1794	mpath = mesh_path_lookup(sdata, dst);
1795	if (!mpath) {
1796		rcu_read_unlock();
1797		return -ENOENT;
1798	}
1799
1800	mesh_path_fix_nexthop(mpath, sta);
1801
1802	rcu_read_unlock();
1803	return 0;
1804}
1805
1806static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
1807			    struct mpath_info *pinfo)
1808{
1809	struct sta_info *next_hop_sta = rcu_dereference(mpath->next_hop);
1810
1811	if (next_hop_sta)
1812		memcpy(next_hop, next_hop_sta->sta.addr, ETH_ALEN);
1813	else
1814		eth_zero_addr(next_hop);
1815
1816	memset(pinfo, 0, sizeof(*pinfo));
1817
1818	pinfo->generation = mpath->sdata->u.mesh.mesh_paths_generation;
1819
1820	pinfo->filled = MPATH_INFO_FRAME_QLEN |
1821			MPATH_INFO_SN |
1822			MPATH_INFO_METRIC |
1823			MPATH_INFO_EXPTIME |
1824			MPATH_INFO_DISCOVERY_TIMEOUT |
1825			MPATH_INFO_DISCOVERY_RETRIES |
1826			MPATH_INFO_FLAGS |
1827			MPATH_INFO_HOP_COUNT |
1828			MPATH_INFO_PATH_CHANGE;
1829
1830	pinfo->frame_qlen = mpath->frame_queue.qlen;
1831	pinfo->sn = mpath->sn;
1832	pinfo->metric = mpath->metric;
1833	if (time_before(jiffies, mpath->exp_time))
1834		pinfo->exptime = jiffies_to_msecs(mpath->exp_time - jiffies);
1835	pinfo->discovery_timeout =
1836			jiffies_to_msecs(mpath->discovery_timeout);
1837	pinfo->discovery_retries = mpath->discovery_retries;
1838	if (mpath->flags & MESH_PATH_ACTIVE)
1839		pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE;
1840	if (mpath->flags & MESH_PATH_RESOLVING)
1841		pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
1842	if (mpath->flags & MESH_PATH_SN_VALID)
1843		pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID;
1844	if (mpath->flags & MESH_PATH_FIXED)
1845		pinfo->flags |= NL80211_MPATH_FLAG_FIXED;
1846	if (mpath->flags & MESH_PATH_RESOLVED)
1847		pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED;
1848	pinfo->hop_count = mpath->hop_count;
1849	pinfo->path_change_count = mpath->path_change_count;
1850}
1851
1852static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
1853			       u8 *dst, u8 *next_hop, struct mpath_info *pinfo)
1854
1855{
1856	struct ieee80211_sub_if_data *sdata;
1857	struct mesh_path *mpath;
1858
1859	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1860
1861	rcu_read_lock();
1862	mpath = mesh_path_lookup(sdata, dst);
1863	if (!mpath) {
1864		rcu_read_unlock();
1865		return -ENOENT;
1866	}
1867	memcpy(dst, mpath->dst, ETH_ALEN);
1868	mpath_set_pinfo(mpath, next_hop, pinfo);
1869	rcu_read_unlock();
1870	return 0;
1871}
1872
1873static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev,
1874				int idx, u8 *dst, u8 *next_hop,
1875				struct mpath_info *pinfo)
1876{
1877	struct ieee80211_sub_if_data *sdata;
1878	struct mesh_path *mpath;
1879
1880	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1881
1882	rcu_read_lock();
1883	mpath = mesh_path_lookup_by_idx(sdata, idx);
1884	if (!mpath) {
1885		rcu_read_unlock();
1886		return -ENOENT;
1887	}
1888	memcpy(dst, mpath->dst, ETH_ALEN);
1889	mpath_set_pinfo(mpath, next_hop, pinfo);
1890	rcu_read_unlock();
1891	return 0;
1892}
1893
1894static void mpp_set_pinfo(struct mesh_path *mpath, u8 *mpp,
1895			  struct mpath_info *pinfo)
1896{
1897	memset(pinfo, 0, sizeof(*pinfo));
1898	memcpy(mpp, mpath->mpp, ETH_ALEN);
1899
1900	pinfo->generation = mpath->sdata->u.mesh.mpp_paths_generation;
1901}
1902
1903static int ieee80211_get_mpp(struct wiphy *wiphy, struct net_device *dev,
1904			     u8 *dst, u8 *mpp, struct mpath_info *pinfo)
1905
1906{
1907	struct ieee80211_sub_if_data *sdata;
1908	struct mesh_path *mpath;
1909
1910	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1911
1912	rcu_read_lock();
1913	mpath = mpp_path_lookup(sdata, dst);
1914	if (!mpath) {
1915		rcu_read_unlock();
1916		return -ENOENT;
1917	}
1918	memcpy(dst, mpath->dst, ETH_ALEN);
1919	mpp_set_pinfo(mpath, mpp, pinfo);
1920	rcu_read_unlock();
1921	return 0;
1922}
1923
1924static int ieee80211_dump_mpp(struct wiphy *wiphy, struct net_device *dev,
1925			      int idx, u8 *dst, u8 *mpp,
1926			      struct mpath_info *pinfo)
1927{
1928	struct ieee80211_sub_if_data *sdata;
1929	struct mesh_path *mpath;
1930
1931	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1932
1933	rcu_read_lock();
1934	mpath = mpp_path_lookup_by_idx(sdata, idx);
1935	if (!mpath) {
1936		rcu_read_unlock();
1937		return -ENOENT;
1938	}
1939	memcpy(dst, mpath->dst, ETH_ALEN);
1940	mpp_set_pinfo(mpath, mpp, pinfo);
1941	rcu_read_unlock();
1942	return 0;
1943}
1944
1945static int ieee80211_get_mesh_config(struct wiphy *wiphy,
1946				struct net_device *dev,
1947				struct mesh_config *conf)
1948{
1949	struct ieee80211_sub_if_data *sdata;
1950	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1951
1952	memcpy(conf, &(sdata->u.mesh.mshcfg), sizeof(struct mesh_config));
1953	return 0;
1954}
1955
1956static inline bool _chg_mesh_attr(enum nl80211_meshconf_params parm, u32 mask)
1957{
1958	return (mask >> (parm-1)) & 0x1;
1959}
1960
1961static int copy_mesh_setup(struct ieee80211_if_mesh *ifmsh,
1962		const struct mesh_setup *setup)
1963{
1964	u8 *new_ie;
1965	const u8 *old_ie;
1966	struct ieee80211_sub_if_data *sdata = container_of(ifmsh,
1967					struct ieee80211_sub_if_data, u.mesh);
1968	int i;
1969
1970	/* allocate information elements */
1971	new_ie = NULL;
1972	old_ie = ifmsh->ie;
1973
1974	if (setup->ie_len) {
1975		new_ie = kmemdup(setup->ie, setup->ie_len,
1976				GFP_KERNEL);
1977		if (!new_ie)
1978			return -ENOMEM;
1979	}
1980	ifmsh->ie_len = setup->ie_len;
1981	ifmsh->ie = new_ie;
1982	kfree(old_ie);
1983
1984	/* now copy the rest of the setup parameters */
1985	ifmsh->mesh_id_len = setup->mesh_id_len;
1986	memcpy(ifmsh->mesh_id, setup->mesh_id, ifmsh->mesh_id_len);
1987	ifmsh->mesh_sp_id = setup->sync_method;
1988	ifmsh->mesh_pp_id = setup->path_sel_proto;
1989	ifmsh->mesh_pm_id = setup->path_metric;
1990	ifmsh->user_mpm = setup->user_mpm;
1991	ifmsh->mesh_auth_id = setup->auth_id;
1992	ifmsh->security = IEEE80211_MESH_SEC_NONE;
1993	ifmsh->userspace_handles_dfs = setup->userspace_handles_dfs;
1994	if (setup->is_authenticated)
1995		ifmsh->security |= IEEE80211_MESH_SEC_AUTHED;
1996	if (setup->is_secure)
1997		ifmsh->security |= IEEE80211_MESH_SEC_SECURED;
1998
1999	/* mcast rate setting in Mesh Node */
2000	memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate,
2001						sizeof(setup->mcast_rate));
2002	sdata->vif.bss_conf.basic_rates = setup->basic_rates;
2003
2004	sdata->vif.bss_conf.beacon_int = setup->beacon_interval;
2005	sdata->vif.bss_conf.dtim_period = setup->dtim_period;
2006
2007	sdata->beacon_rate_set = false;
2008	if (wiphy_ext_feature_isset(sdata->local->hw.wiphy,
2009				    NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) {
2010		for (i = 0; i < NUM_NL80211_BANDS; i++) {
2011			sdata->beacon_rateidx_mask[i] =
2012				setup->beacon_rate.control[i].legacy;
2013			if (sdata->beacon_rateidx_mask[i])
2014				sdata->beacon_rate_set = true;
2015		}
2016	}
2017
2018	return 0;
2019}
2020
2021static int ieee80211_update_mesh_config(struct wiphy *wiphy,
2022					struct net_device *dev, u32 mask,
2023					const struct mesh_config *nconf)
2024{
2025	struct mesh_config *conf;
2026	struct ieee80211_sub_if_data *sdata;
2027	struct ieee80211_if_mesh *ifmsh;
2028
2029	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2030	ifmsh = &sdata->u.mesh;
2031
2032	/* Set the config options which we are interested in setting */
2033	conf = &(sdata->u.mesh.mshcfg);
2034	if (_chg_mesh_attr(NL80211_MESHCONF_RETRY_TIMEOUT, mask))
2035		conf->dot11MeshRetryTimeout = nconf->dot11MeshRetryTimeout;
2036	if (_chg_mesh_attr(NL80211_MESHCONF_CONFIRM_TIMEOUT, mask))
2037		conf->dot11MeshConfirmTimeout = nconf->dot11MeshConfirmTimeout;
2038	if (_chg_mesh_attr(NL80211_MESHCONF_HOLDING_TIMEOUT, mask))
2039		conf->dot11MeshHoldingTimeout = nconf->dot11MeshHoldingTimeout;
2040	if (_chg_mesh_attr(NL80211_MESHCONF_MAX_PEER_LINKS, mask))
2041		conf->dot11MeshMaxPeerLinks = nconf->dot11MeshMaxPeerLinks;
2042	if (_chg_mesh_attr(NL80211_MESHCONF_MAX_RETRIES, mask))
2043		conf->dot11MeshMaxRetries = nconf->dot11MeshMaxRetries;
2044	if (_chg_mesh_attr(NL80211_MESHCONF_TTL, mask))
2045		conf->dot11MeshTTL = nconf->dot11MeshTTL;
2046	if (_chg_mesh_attr(NL80211_MESHCONF_ELEMENT_TTL, mask))
2047		conf->element_ttl = nconf->element_ttl;
2048	if (_chg_mesh_attr(NL80211_MESHCONF_AUTO_OPEN_PLINKS, mask)) {
2049		if (ifmsh->user_mpm)
2050			return -EBUSY;
2051		conf->auto_open_plinks = nconf->auto_open_plinks;
2052	}
2053	if (_chg_mesh_attr(NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, mask))
2054		conf->dot11MeshNbrOffsetMaxNeighbor =
2055			nconf->dot11MeshNbrOffsetMaxNeighbor;
2056	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, mask))
2057		conf->dot11MeshHWMPmaxPREQretries =
2058			nconf->dot11MeshHWMPmaxPREQretries;
2059	if (_chg_mesh_attr(NL80211_MESHCONF_PATH_REFRESH_TIME, mask))
2060		conf->path_refresh_time = nconf->path_refresh_time;
2061	if (_chg_mesh_attr(NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, mask))
2062		conf->min_discovery_timeout = nconf->min_discovery_timeout;
2063	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, mask))
2064		conf->dot11MeshHWMPactivePathTimeout =
2065			nconf->dot11MeshHWMPactivePathTimeout;
2066	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, mask))
2067		conf->dot11MeshHWMPpreqMinInterval =
2068			nconf->dot11MeshHWMPpreqMinInterval;
2069	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, mask))
2070		conf->dot11MeshHWMPperrMinInterval =
2071			nconf->dot11MeshHWMPperrMinInterval;
2072	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
2073			   mask))
2074		conf->dot11MeshHWMPnetDiameterTraversalTime =
2075			nconf->dot11MeshHWMPnetDiameterTraversalTime;
2076	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOTMODE, mask)) {
2077		conf->dot11MeshHWMPRootMode = nconf->dot11MeshHWMPRootMode;
2078		ieee80211_mesh_root_setup(ifmsh);
2079	}
2080	if (_chg_mesh_attr(NL80211_MESHCONF_GATE_ANNOUNCEMENTS, mask)) {
2081		/* our current gate announcement implementation rides on root
2082		 * announcements, so require this ifmsh to also be a root node
2083		 * */
2084		if (nconf->dot11MeshGateAnnouncementProtocol &&
2085		    !(conf->dot11MeshHWMPRootMode > IEEE80211_ROOTMODE_ROOT)) {
2086			conf->dot11MeshHWMPRootMode = IEEE80211_PROACTIVE_RANN;
2087			ieee80211_mesh_root_setup(ifmsh);
2088		}
2089		conf->dot11MeshGateAnnouncementProtocol =
2090			nconf->dot11MeshGateAnnouncementProtocol;
2091	}
2092	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_RANN_INTERVAL, mask))
2093		conf->dot11MeshHWMPRannInterval =
2094			nconf->dot11MeshHWMPRannInterval;
2095	if (_chg_mesh_attr(NL80211_MESHCONF_FORWARDING, mask))
2096		conf->dot11MeshForwarding = nconf->dot11MeshForwarding;
2097	if (_chg_mesh_attr(NL80211_MESHCONF_RSSI_THRESHOLD, mask)) {
2098		/* our RSSI threshold implementation is supported only for
2099		 * devices that report signal in dBm.
2100		 */
2101		if (!ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM))
2102			return -ENOTSUPP;
2103		conf->rssi_threshold = nconf->rssi_threshold;
2104	}
2105	if (_chg_mesh_attr(NL80211_MESHCONF_HT_OPMODE, mask)) {
2106		conf->ht_opmode = nconf->ht_opmode;
2107		sdata->vif.bss_conf.ht_operation_mode = nconf->ht_opmode;
2108		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_HT);
2109	}
2110	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, mask))
2111		conf->dot11MeshHWMPactivePathToRootTimeout =
2112			nconf->dot11MeshHWMPactivePathToRootTimeout;
2113	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOT_INTERVAL, mask))
2114		conf->dot11MeshHWMProotInterval =
2115			nconf->dot11MeshHWMProotInterval;
2116	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, mask))
2117		conf->dot11MeshHWMPconfirmationInterval =
2118			nconf->dot11MeshHWMPconfirmationInterval;
2119	if (_chg_mesh_attr(NL80211_MESHCONF_POWER_MODE, mask)) {
2120		conf->power_mode = nconf->power_mode;
2121		ieee80211_mps_local_status_update(sdata);
2122	}
2123	if (_chg_mesh_attr(NL80211_MESHCONF_AWAKE_WINDOW, mask))
2124		conf->dot11MeshAwakeWindowDuration =
2125			nconf->dot11MeshAwakeWindowDuration;
2126	if (_chg_mesh_attr(NL80211_MESHCONF_PLINK_TIMEOUT, mask))
2127		conf->plink_timeout = nconf->plink_timeout;
2128	if (_chg_mesh_attr(NL80211_MESHCONF_CONNECTED_TO_GATE, mask))
2129		conf->dot11MeshConnectedToMeshGate =
2130			nconf->dot11MeshConnectedToMeshGate;
2131	if (_chg_mesh_attr(NL80211_MESHCONF_NOLEARN, mask))
2132		conf->dot11MeshNolearn = nconf->dot11MeshNolearn;
2133	if (_chg_mesh_attr(NL80211_MESHCONF_CONNECTED_TO_AS, mask))
2134		conf->dot11MeshConnectedToAuthServer =
2135			nconf->dot11MeshConnectedToAuthServer;
2136	ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON);
2137	return 0;
2138}
2139
2140static int ieee80211_join_mesh(struct wiphy *wiphy, struct net_device *dev,
2141			       const struct mesh_config *conf,
2142			       const struct mesh_setup *setup)
2143{
2144	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2145	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
2146	int err;
2147
2148	memcpy(&ifmsh->mshcfg, conf, sizeof(struct mesh_config));
2149	err = copy_mesh_setup(ifmsh, setup);
2150	if (err)
2151		return err;
2152
2153	sdata->control_port_over_nl80211 = setup->control_port_over_nl80211;
2154
2155	/* can mesh use other SMPS modes? */
2156	sdata->smps_mode = IEEE80211_SMPS_OFF;
2157	sdata->needed_rx_chains = sdata->local->rx_chains;
2158
2159	mutex_lock(&sdata->local->mtx);
2160	err = ieee80211_vif_use_channel(sdata, &setup->chandef,
2161					IEEE80211_CHANCTX_SHARED);
2162	mutex_unlock(&sdata->local->mtx);
2163	if (err)
2164		return err;
2165
2166	return ieee80211_start_mesh(sdata);
2167}
2168
2169static int ieee80211_leave_mesh(struct wiphy *wiphy, struct net_device *dev)
2170{
2171	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2172
2173	ieee80211_stop_mesh(sdata);
2174	mutex_lock(&sdata->local->mtx);
2175	ieee80211_vif_release_channel(sdata);
2176	kfree(sdata->u.mesh.ie);
2177	mutex_unlock(&sdata->local->mtx);
2178
2179	return 0;
2180}
2181#endif
2182
2183static int ieee80211_change_bss(struct wiphy *wiphy,
2184				struct net_device *dev,
2185				struct bss_parameters *params)
2186{
2187	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2188	struct ieee80211_supported_band *sband;
2189	u32 changed = 0;
2190
2191	if (!sdata_dereference(sdata->u.ap.beacon, sdata))
2192		return -ENOENT;
2193
2194	sband = ieee80211_get_sband(sdata);
2195	if (!sband)
2196		return -EINVAL;
2197
2198	if (params->use_cts_prot >= 0) {
2199		sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot;
2200		changed |= BSS_CHANGED_ERP_CTS_PROT;
2201	}
2202	if (params->use_short_preamble >= 0) {
2203		sdata->vif.bss_conf.use_short_preamble =
2204			params->use_short_preamble;
2205		changed |= BSS_CHANGED_ERP_PREAMBLE;
2206	}
2207
2208	if (!sdata->vif.bss_conf.use_short_slot &&
2209	    (sband->band == NL80211_BAND_5GHZ ||
2210	     sband->band == NL80211_BAND_6GHZ)) {
2211		sdata->vif.bss_conf.use_short_slot = true;
2212		changed |= BSS_CHANGED_ERP_SLOT;
2213	}
2214
2215	if (params->use_short_slot_time >= 0) {
2216		sdata->vif.bss_conf.use_short_slot =
2217			params->use_short_slot_time;
2218		changed |= BSS_CHANGED_ERP_SLOT;
2219	}
2220
2221	if (params->basic_rates) {
2222		ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
2223					 wiphy->bands[sband->band],
2224					 params->basic_rates,
2225					 params->basic_rates_len,
2226					 &sdata->vif.bss_conf.basic_rates);
2227		changed |= BSS_CHANGED_BASIC_RATES;
2228		ieee80211_check_rate_mask(sdata);
2229	}
2230
2231	if (params->ap_isolate >= 0) {
2232		if (params->ap_isolate)
2233			sdata->flags |= IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
2234		else
2235			sdata->flags &= ~IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
2236		ieee80211_check_fast_rx_iface(sdata);
2237	}
2238
2239	if (params->ht_opmode >= 0) {
2240		sdata->vif.bss_conf.ht_operation_mode =
2241			(u16) params->ht_opmode;
2242		changed |= BSS_CHANGED_HT;
2243	}
2244
2245	if (params->p2p_ctwindow >= 0) {
2246		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &=
2247					~IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
2248		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
2249			params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
2250		changed |= BSS_CHANGED_P2P_PS;
2251	}
2252
2253	if (params->p2p_opp_ps > 0) {
2254		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
2255					IEEE80211_P2P_OPPPS_ENABLE_BIT;
2256		changed |= BSS_CHANGED_P2P_PS;
2257	} else if (params->p2p_opp_ps == 0) {
2258		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &=
2259					~IEEE80211_P2P_OPPPS_ENABLE_BIT;
2260		changed |= BSS_CHANGED_P2P_PS;
2261	}
2262
2263	ieee80211_bss_info_change_notify(sdata, changed);
2264
2265	return 0;
2266}
2267
2268static int ieee80211_set_txq_params(struct wiphy *wiphy,
2269				    struct net_device *dev,
2270				    struct ieee80211_txq_params *params)
2271{
2272	struct ieee80211_local *local = wiphy_priv(wiphy);
2273	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2274	struct ieee80211_tx_queue_params p;
2275
2276	if (!local->ops->conf_tx)
2277		return -EOPNOTSUPP;
2278
2279	if (local->hw.queues < IEEE80211_NUM_ACS)
2280		return -EOPNOTSUPP;
2281
2282	memset(&p, 0, sizeof(p));
2283	p.aifs = params->aifs;
2284	p.cw_max = params->cwmax;
2285	p.cw_min = params->cwmin;
2286	p.txop = params->txop;
2287
2288	/*
2289	 * Setting tx queue params disables u-apsd because it's only
2290	 * called in master mode.
2291	 */
2292	p.uapsd = false;
2293
2294	ieee80211_regulatory_limit_wmm_params(sdata, &p, params->ac);
2295
2296	sdata->tx_conf[params->ac] = p;
2297	if (drv_conf_tx(local, sdata, params->ac, &p)) {
2298		wiphy_debug(local->hw.wiphy,
2299			    "failed to set TX queue parameters for AC %d\n",
2300			    params->ac);
2301		return -EINVAL;
2302	}
2303
2304	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS);
2305
2306	return 0;
2307}
2308
2309#ifdef CONFIG_PM
2310static int ieee80211_suspend(struct wiphy *wiphy,
2311			     struct cfg80211_wowlan *wowlan)
2312{
2313	return __ieee80211_suspend(wiphy_priv(wiphy), wowlan);
2314}
2315
2316static int ieee80211_resume(struct wiphy *wiphy)
2317{
2318	return __ieee80211_resume(wiphy_priv(wiphy));
2319}
2320#else
2321#define ieee80211_suspend NULL
2322#define ieee80211_resume NULL
2323#endif
2324
2325static int ieee80211_scan(struct wiphy *wiphy,
2326			  struct cfg80211_scan_request *req)
2327{
2328	struct ieee80211_sub_if_data *sdata;
2329
2330	sdata = IEEE80211_WDEV_TO_SUB_IF(req->wdev);
2331
2332	switch (ieee80211_vif_type_p2p(&sdata->vif)) {
2333	case NL80211_IFTYPE_STATION:
2334	case NL80211_IFTYPE_ADHOC:
2335	case NL80211_IFTYPE_MESH_POINT:
2336	case NL80211_IFTYPE_P2P_CLIENT:
2337	case NL80211_IFTYPE_P2P_DEVICE:
2338		break;
2339	case NL80211_IFTYPE_P2P_GO:
2340		if (sdata->local->ops->hw_scan)
2341			break;
2342		/*
2343		 * FIXME: implement NoA while scanning in software,
2344		 * for now fall through to allow scanning only when
2345		 * beaconing hasn't been configured yet
2346		 */
2347		fallthrough;
2348	case NL80211_IFTYPE_AP:
2349		/*
2350		 * If the scan has been forced (and the driver supports
2351		 * forcing), don't care about being beaconing already.
2352		 * This will create problems to the attached stations (e.g. all
2353		 * the  frames sent while scanning on other channel will be
2354		 * lost)
2355		 */
2356		if (sdata->u.ap.beacon &&
2357		    (!(wiphy->features & NL80211_FEATURE_AP_SCAN) ||
2358		     !(req->flags & NL80211_SCAN_FLAG_AP)))
2359			return -EOPNOTSUPP;
2360		break;
2361	case NL80211_IFTYPE_NAN:
2362	default:
2363		return -EOPNOTSUPP;
2364	}
2365
2366	return ieee80211_request_scan(sdata, req);
2367}
2368
2369static void ieee80211_abort_scan(struct wiphy *wiphy, struct wireless_dev *wdev)
2370{
2371	ieee80211_scan_cancel(wiphy_priv(wiphy));
2372}
2373
2374static int
2375ieee80211_sched_scan_start(struct wiphy *wiphy,
2376			   struct net_device *dev,
2377			   struct cfg80211_sched_scan_request *req)
2378{
2379	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2380
2381	if (!sdata->local->ops->sched_scan_start)
2382		return -EOPNOTSUPP;
2383
2384	return ieee80211_request_sched_scan_start(sdata, req);
2385}
2386
2387static int
2388ieee80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev,
2389			  u64 reqid)
2390{
2391	struct ieee80211_local *local = wiphy_priv(wiphy);
2392
2393	if (!local->ops->sched_scan_stop)
2394		return -EOPNOTSUPP;
2395
2396	return ieee80211_request_sched_scan_stop(local);
2397}
2398
2399static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev,
2400			  struct cfg80211_auth_request *req)
2401{
2402	return ieee80211_mgd_auth(IEEE80211_DEV_TO_SUB_IF(dev), req);
2403}
2404
2405static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
2406			   struct cfg80211_assoc_request *req)
2407{
2408	return ieee80211_mgd_assoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
2409}
2410
2411static int ieee80211_deauth(struct wiphy *wiphy, struct net_device *dev,
2412			    struct cfg80211_deauth_request *req)
2413{
2414	return ieee80211_mgd_deauth(IEEE80211_DEV_TO_SUB_IF(dev), req);
2415}
2416
2417static int ieee80211_disassoc(struct wiphy *wiphy, struct net_device *dev,
2418			      struct cfg80211_disassoc_request *req)
2419{
2420	return ieee80211_mgd_disassoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
2421}
2422
2423static int ieee80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
2424			       struct cfg80211_ibss_params *params)
2425{
2426	return ieee80211_ibss_join(IEEE80211_DEV_TO_SUB_IF(dev), params);
2427}
2428
2429static int ieee80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
2430{
2431	return ieee80211_ibss_leave(IEEE80211_DEV_TO_SUB_IF(dev));
2432}
2433
2434static int ieee80211_join_ocb(struct wiphy *wiphy, struct net_device *dev,
2435			      struct ocb_setup *setup)
2436{
2437	return ieee80211_ocb_join(IEEE80211_DEV_TO_SUB_IF(dev), setup);
2438}
2439
2440static int ieee80211_leave_ocb(struct wiphy *wiphy, struct net_device *dev)
2441{
2442	return ieee80211_ocb_leave(IEEE80211_DEV_TO_SUB_IF(dev));
2443}
2444
2445static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev,
2446				    int rate[NUM_NL80211_BANDS])
2447{
2448	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2449
2450	memcpy(sdata->vif.bss_conf.mcast_rate, rate,
2451	       sizeof(int) * NUM_NL80211_BANDS);
2452
2453	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_MCAST_RATE);
2454
2455	return 0;
2456}
2457
2458static int ieee80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
2459{
2460	struct ieee80211_local *local = wiphy_priv(wiphy);
2461	int err;
2462
2463	if (changed & WIPHY_PARAM_FRAG_THRESHOLD) {
2464		ieee80211_check_fast_xmit_all(local);
2465
2466		err = drv_set_frag_threshold(local, wiphy->frag_threshold);
2467
2468		if (err) {
2469			ieee80211_check_fast_xmit_all(local);
2470			return err;
2471		}
2472	}
2473
2474	if ((changed & WIPHY_PARAM_COVERAGE_CLASS) ||
2475	    (changed & WIPHY_PARAM_DYN_ACK)) {
2476		s16 coverage_class;
2477
2478		coverage_class = changed & WIPHY_PARAM_COVERAGE_CLASS ?
2479					wiphy->coverage_class : -1;
2480		err = drv_set_coverage_class(local, coverage_class);
2481
2482		if (err)
2483			return err;
2484	}
2485
2486	if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
2487		err = drv_set_rts_threshold(local, wiphy->rts_threshold);
2488
2489		if (err)
2490			return err;
2491	}
2492
2493	if (changed & WIPHY_PARAM_RETRY_SHORT) {
2494		if (wiphy->retry_short > IEEE80211_MAX_TX_RETRY)
2495			return -EINVAL;
2496		local->hw.conf.short_frame_max_tx_count = wiphy->retry_short;
2497	}
2498	if (changed & WIPHY_PARAM_RETRY_LONG) {
2499		if (wiphy->retry_long > IEEE80211_MAX_TX_RETRY)
2500			return -EINVAL;
2501		local->hw.conf.long_frame_max_tx_count = wiphy->retry_long;
2502	}
2503	if (changed &
2504	    (WIPHY_PARAM_RETRY_SHORT | WIPHY_PARAM_RETRY_LONG))
2505		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_RETRY_LIMITS);
2506
2507	if (changed & (WIPHY_PARAM_TXQ_LIMIT |
2508		       WIPHY_PARAM_TXQ_MEMORY_LIMIT |
2509		       WIPHY_PARAM_TXQ_QUANTUM))
2510		ieee80211_txq_set_params(local);
2511
2512	return 0;
2513}
2514
2515static int ieee80211_set_tx_power(struct wiphy *wiphy,
2516				  struct wireless_dev *wdev,
2517				  enum nl80211_tx_power_setting type, int mbm)
2518{
2519	struct ieee80211_local *local = wiphy_priv(wiphy);
2520	struct ieee80211_sub_if_data *sdata;
2521	enum nl80211_tx_power_setting txp_type = type;
2522	bool update_txp_type = false;
2523	bool has_monitor = false;
2524
2525	if (wdev) {
2526		sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2527
2528		if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
2529			sdata = rtnl_dereference(local->monitor_sdata);
2530			if (!sdata)
2531				return -EOPNOTSUPP;
2532		}
2533
2534		switch (type) {
2535		case NL80211_TX_POWER_AUTOMATIC:
2536			sdata->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
2537			txp_type = NL80211_TX_POWER_LIMITED;
2538			break;
2539		case NL80211_TX_POWER_LIMITED:
2540		case NL80211_TX_POWER_FIXED:
2541			if (mbm < 0 || (mbm % 100))
2542				return -EOPNOTSUPP;
2543			sdata->user_power_level = MBM_TO_DBM(mbm);
2544			break;
2545		}
2546
2547		if (txp_type != sdata->vif.bss_conf.txpower_type) {
2548			update_txp_type = true;
2549			sdata->vif.bss_conf.txpower_type = txp_type;
2550		}
2551
2552		ieee80211_recalc_txpower(sdata, update_txp_type);
2553
2554		return 0;
2555	}
2556
2557	switch (type) {
2558	case NL80211_TX_POWER_AUTOMATIC:
2559		local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
2560		txp_type = NL80211_TX_POWER_LIMITED;
2561		break;
2562	case NL80211_TX_POWER_LIMITED:
2563	case NL80211_TX_POWER_FIXED:
2564		if (mbm < 0 || (mbm % 100))
2565			return -EOPNOTSUPP;
2566		local->user_power_level = MBM_TO_DBM(mbm);
2567		break;
2568	}
2569
2570	mutex_lock(&local->iflist_mtx);
2571	list_for_each_entry(sdata, &local->interfaces, list) {
2572		if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
2573			has_monitor = true;
2574			continue;
2575		}
2576		sdata->user_power_level = local->user_power_level;
2577		if (txp_type != sdata->vif.bss_conf.txpower_type)
2578			update_txp_type = true;
2579		sdata->vif.bss_conf.txpower_type = txp_type;
2580	}
2581	list_for_each_entry(sdata, &local->interfaces, list) {
2582		if (sdata->vif.type == NL80211_IFTYPE_MONITOR)
2583			continue;
2584		ieee80211_recalc_txpower(sdata, update_txp_type);
2585	}
2586	mutex_unlock(&local->iflist_mtx);
2587
2588	if (has_monitor) {
2589		sdata = rtnl_dereference(local->monitor_sdata);
2590		if (sdata) {
2591			sdata->user_power_level = local->user_power_level;
2592			if (txp_type != sdata->vif.bss_conf.txpower_type)
2593				update_txp_type = true;
2594			sdata->vif.bss_conf.txpower_type = txp_type;
2595
2596			ieee80211_recalc_txpower(sdata, update_txp_type);
2597		}
2598	}
2599
2600	return 0;
2601}
2602
2603static int ieee80211_get_tx_power(struct wiphy *wiphy,
2604				  struct wireless_dev *wdev,
2605				  int *dbm)
2606{
2607	struct ieee80211_local *local = wiphy_priv(wiphy);
2608	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2609
2610	if (local->ops->get_txpower)
2611		return drv_get_txpower(local, sdata, dbm);
2612
2613	if (!local->use_chanctx)
2614		*dbm = local->hw.conf.power_level;
2615	else
2616		*dbm = sdata->vif.bss_conf.txpower;
2617
2618	return 0;
2619}
2620
2621static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
2622				  const u8 *addr)
2623{
2624	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2625
2626	memcpy(&sdata->u.wds.remote_addr, addr, ETH_ALEN);
2627
2628	return 0;
2629}
2630
2631static void ieee80211_rfkill_poll(struct wiphy *wiphy)
2632{
2633	struct ieee80211_local *local = wiphy_priv(wiphy);
2634
2635	drv_rfkill_poll(local);
2636}
2637
2638#ifdef CONFIG_NL80211_TESTMODE
2639static int ieee80211_testmode_cmd(struct wiphy *wiphy,
2640				  struct wireless_dev *wdev,
2641				  void *data, int len)
2642{
2643	struct ieee80211_local *local = wiphy_priv(wiphy);
2644	struct ieee80211_vif *vif = NULL;
2645
2646	if (!local->ops->testmode_cmd)
2647		return -EOPNOTSUPP;
2648
2649	if (wdev) {
2650		struct ieee80211_sub_if_data *sdata;
2651
2652		sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2653		if (sdata->flags & IEEE80211_SDATA_IN_DRIVER)
2654			vif = &sdata->vif;
2655	}
2656
2657	return local->ops->testmode_cmd(&local->hw, vif, data, len);
2658}
2659
2660static int ieee80211_testmode_dump(struct wiphy *wiphy,
2661				   struct sk_buff *skb,
2662				   struct netlink_callback *cb,
2663				   void *data, int len)
2664{
2665	struct ieee80211_local *local = wiphy_priv(wiphy);
2666
2667	if (!local->ops->testmode_dump)
2668		return -EOPNOTSUPP;
2669
2670	return local->ops->testmode_dump(&local->hw, skb, cb, data, len);
2671}
2672#endif
2673
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2674int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata,
2675				 enum ieee80211_smps_mode smps_mode)
2676{
2677	const u8 *ap;
2678	enum ieee80211_smps_mode old_req;
2679	int err;
2680	struct sta_info *sta;
2681	bool tdls_peer_found = false;
2682
2683	lockdep_assert_held(&sdata->wdev.mtx);
2684
2685	if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION))
2686		return -EINVAL;
2687
2688	old_req = sdata->u.mgd.req_smps;
2689	sdata->u.mgd.req_smps = smps_mode;
2690
2691	if (old_req == smps_mode &&
2692	    smps_mode != IEEE80211_SMPS_AUTOMATIC)
2693		return 0;
2694
2695	/*
2696	 * If not associated, or current association is not an HT
2697	 * association, there's no need to do anything, just store
2698	 * the new value until we associate.
2699	 */
2700	if (!sdata->u.mgd.associated ||
2701	    sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
2702		return 0;
2703
2704	ap = sdata->u.mgd.associated->bssid;
2705
2706	rcu_read_lock();
2707	list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) {
2708		if (!sta->sta.tdls || sta->sdata != sdata || !sta->uploaded ||
2709		    !test_sta_flag(sta, WLAN_STA_AUTHORIZED))
2710			continue;
2711
2712		tdls_peer_found = true;
2713		break;
2714	}
2715	rcu_read_unlock();
2716
2717	if (smps_mode == IEEE80211_SMPS_AUTOMATIC) {
2718		if (tdls_peer_found || !sdata->u.mgd.powersave)
2719			smps_mode = IEEE80211_SMPS_OFF;
2720		else
2721			smps_mode = IEEE80211_SMPS_DYNAMIC;
2722	}
2723
2724	/* send SM PS frame to AP */
2725	err = ieee80211_send_smps_action(sdata, smps_mode,
2726					 ap, ap);
2727	if (err)
2728		sdata->u.mgd.req_smps = old_req;
2729	else if (smps_mode != IEEE80211_SMPS_OFF && tdls_peer_found)
2730		ieee80211_teardown_tdls_peers(sdata);
2731
2732	return err;
2733}
2734
2735static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
2736				    bool enabled, int timeout)
2737{
2738	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2739	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
2740
2741	if (sdata->vif.type != NL80211_IFTYPE_STATION)
2742		return -EOPNOTSUPP;
2743
2744	if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS))
2745		return -EOPNOTSUPP;
2746
2747	if (enabled == sdata->u.mgd.powersave &&
2748	    timeout == local->dynamic_ps_forced_timeout)
2749		return 0;
2750
2751	sdata->u.mgd.powersave = enabled;
2752	local->dynamic_ps_forced_timeout = timeout;
2753
2754	/* no change, but if automatic follow powersave */
2755	sdata_lock(sdata);
2756	__ieee80211_request_smps_mgd(sdata, sdata->u.mgd.req_smps);
2757	sdata_unlock(sdata);
2758
2759	if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS))
2760		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
2761
2762	ieee80211_recalc_ps(local);
2763	ieee80211_recalc_ps_vif(sdata);
2764	ieee80211_check_fast_rx_iface(sdata);
2765
2766	return 0;
2767}
2768
2769static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
2770					 struct net_device *dev,
2771					 s32 rssi_thold, u32 rssi_hyst)
2772{
2773	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2774	struct ieee80211_vif *vif = &sdata->vif;
2775	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
2776
2777	if (rssi_thold == bss_conf->cqm_rssi_thold &&
2778	    rssi_hyst == bss_conf->cqm_rssi_hyst)
2779		return 0;
2780
2781	if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER &&
2782	    !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI))
2783		return -EOPNOTSUPP;
2784
2785	bss_conf->cqm_rssi_thold = rssi_thold;
2786	bss_conf->cqm_rssi_hyst = rssi_hyst;
2787	bss_conf->cqm_rssi_low = 0;
2788	bss_conf->cqm_rssi_high = 0;
2789	sdata->u.mgd.last_cqm_event_signal = 0;
2790
2791	/* tell the driver upon association, unless already associated */
2792	if (sdata->u.mgd.associated &&
2793	    sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)
2794		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
2795
2796	return 0;
2797}
2798
2799static int ieee80211_set_cqm_rssi_range_config(struct wiphy *wiphy,
2800					       struct net_device *dev,
2801					       s32 rssi_low, s32 rssi_high)
2802{
2803	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2804	struct ieee80211_vif *vif = &sdata->vif;
2805	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
2806
2807	if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER)
2808		return -EOPNOTSUPP;
2809
2810	bss_conf->cqm_rssi_low = rssi_low;
2811	bss_conf->cqm_rssi_high = rssi_high;
2812	bss_conf->cqm_rssi_thold = 0;
2813	bss_conf->cqm_rssi_hyst = 0;
2814	sdata->u.mgd.last_cqm_event_signal = 0;
2815
2816	/* tell the driver upon association, unless already associated */
2817	if (sdata->u.mgd.associated &&
2818	    sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)
2819		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
2820
2821	return 0;
2822}
2823
2824static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
2825				      struct net_device *dev,
2826				      const u8 *addr,
2827				      const struct cfg80211_bitrate_mask *mask)
2828{
2829	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2830	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
2831	int i, ret;
2832
2833	if (!ieee80211_sdata_running(sdata))
2834		return -ENETDOWN;
2835
2836	/*
2837	 * If active validate the setting and reject it if it doesn't leave
2838	 * at least one basic rate usable, since we really have to be able
2839	 * to send something, and if we're an AP we have to be able to do
2840	 * so at a basic rate so that all clients can receive it.
2841	 */
2842	if (rcu_access_pointer(sdata->vif.chanctx_conf) &&
2843	    sdata->vif.bss_conf.chandef.chan) {
2844		u32 basic_rates = sdata->vif.bss_conf.basic_rates;
2845		enum nl80211_band band = sdata->vif.bss_conf.chandef.chan->band;
2846
2847		if (!(mask->control[band].legacy & basic_rates))
2848			return -EINVAL;
2849	}
2850
2851	if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) {
2852		ret = drv_set_bitrate_mask(local, sdata, mask);
2853		if (ret)
2854			return ret;
2855	}
2856
2857	for (i = 0; i < NUM_NL80211_BANDS; i++) {
2858		struct ieee80211_supported_band *sband = wiphy->bands[i];
2859		int j;
2860
2861		sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
2862		memcpy(sdata->rc_rateidx_mcs_mask[i], mask->control[i].ht_mcs,
2863		       sizeof(mask->control[i].ht_mcs));
2864		memcpy(sdata->rc_rateidx_vht_mcs_mask[i],
2865		       mask->control[i].vht_mcs,
2866		       sizeof(mask->control[i].vht_mcs));
2867
2868		sdata->rc_has_mcs_mask[i] = false;
2869		sdata->rc_has_vht_mcs_mask[i] = false;
2870		if (!sband)
2871			continue;
2872
2873		for (j = 0; j < IEEE80211_HT_MCS_MASK_LEN; j++) {
2874			if (~sdata->rc_rateidx_mcs_mask[i][j]) {
2875				sdata->rc_has_mcs_mask[i] = true;
2876				break;
2877			}
2878		}
2879
2880		for (j = 0; j < NL80211_VHT_NSS_MAX; j++) {
2881			if (~sdata->rc_rateidx_vht_mcs_mask[i][j]) {
2882				sdata->rc_has_vht_mcs_mask[i] = true;
2883				break;
2884			}
2885		}
2886	}
2887
2888	return 0;
2889}
2890
2891static int ieee80211_start_radar_detection(struct wiphy *wiphy,
2892					   struct net_device *dev,
2893					   struct cfg80211_chan_def *chandef,
2894					   u32 cac_time_ms)
2895{
2896	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2897	struct ieee80211_local *local = sdata->local;
2898	int err;
2899
2900	mutex_lock(&local->mtx);
2901	if (!list_empty(&local->roc_list) || local->scanning) {
2902		err = -EBUSY;
2903		goto out_unlock;
2904	}
2905
2906	/* whatever, but channel contexts should not complain about that one */
2907	sdata->smps_mode = IEEE80211_SMPS_OFF;
2908	sdata->needed_rx_chains = local->rx_chains;
2909
2910	err = ieee80211_vif_use_channel(sdata, chandef,
2911					IEEE80211_CHANCTX_SHARED);
2912	if (err)
2913		goto out_unlock;
2914
2915	ieee80211_queue_delayed_work(&sdata->local->hw,
2916				     &sdata->dfs_cac_timer_work,
2917				     msecs_to_jiffies(cac_time_ms));
2918
2919 out_unlock:
2920	mutex_unlock(&local->mtx);
2921	return err;
2922}
2923
2924static void ieee80211_end_cac(struct wiphy *wiphy,
2925			      struct net_device *dev)
2926{
2927	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2928	struct ieee80211_local *local = sdata->local;
2929
2930	mutex_lock(&local->mtx);
2931	list_for_each_entry(sdata, &local->interfaces, list) {
2932		/* it might be waiting for the local->mtx, but then
2933		 * by the time it gets it, sdata->wdev.cac_started
2934		 * will no longer be true
2935		 */
2936		cancel_delayed_work(&sdata->dfs_cac_timer_work);
2937
2938		if (sdata->wdev.cac_started) {
2939			ieee80211_vif_release_channel(sdata);
2940			sdata->wdev.cac_started = false;
2941		}
2942	}
2943	mutex_unlock(&local->mtx);
2944}
2945
2946static struct cfg80211_beacon_data *
2947cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
2948{
2949	struct cfg80211_beacon_data *new_beacon;
2950	u8 *pos;
2951	int len;
2952
2953	len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len +
2954	      beacon->proberesp_ies_len + beacon->assocresp_ies_len +
2955	      beacon->probe_resp_len + beacon->lci_len + beacon->civicloc_len;
2956
2957	new_beacon = kzalloc(sizeof(*new_beacon) + len, GFP_KERNEL);
2958	if (!new_beacon)
2959		return NULL;
2960
2961	pos = (u8 *)(new_beacon + 1);
2962	if (beacon->head_len) {
2963		new_beacon->head_len = beacon->head_len;
2964		new_beacon->head = pos;
2965		memcpy(pos, beacon->head, beacon->head_len);
2966		pos += beacon->head_len;
2967	}
2968	if (beacon->tail_len) {
2969		new_beacon->tail_len = beacon->tail_len;
2970		new_beacon->tail = pos;
2971		memcpy(pos, beacon->tail, beacon->tail_len);
2972		pos += beacon->tail_len;
2973	}
2974	if (beacon->beacon_ies_len) {
2975		new_beacon->beacon_ies_len = beacon->beacon_ies_len;
2976		new_beacon->beacon_ies = pos;
2977		memcpy(pos, beacon->beacon_ies, beacon->beacon_ies_len);
2978		pos += beacon->beacon_ies_len;
2979	}
2980	if (beacon->proberesp_ies_len) {
2981		new_beacon->proberesp_ies_len = beacon->proberesp_ies_len;
2982		new_beacon->proberesp_ies = pos;
2983		memcpy(pos, beacon->proberesp_ies, beacon->proberesp_ies_len);
2984		pos += beacon->proberesp_ies_len;
2985	}
2986	if (beacon->assocresp_ies_len) {
2987		new_beacon->assocresp_ies_len = beacon->assocresp_ies_len;
2988		new_beacon->assocresp_ies = pos;
2989		memcpy(pos, beacon->assocresp_ies, beacon->assocresp_ies_len);
2990		pos += beacon->assocresp_ies_len;
2991	}
2992	if (beacon->probe_resp_len) {
2993		new_beacon->probe_resp_len = beacon->probe_resp_len;
2994		new_beacon->probe_resp = pos;
2995		memcpy(pos, beacon->probe_resp, beacon->probe_resp_len);
2996		pos += beacon->probe_resp_len;
2997	}
2998
2999	/* might copy -1, meaning no changes requested */
3000	new_beacon->ftm_responder = beacon->ftm_responder;
3001	if (beacon->lci) {
3002		new_beacon->lci_len = beacon->lci_len;
3003		new_beacon->lci = pos;
3004		memcpy(pos, beacon->lci, beacon->lci_len);
3005		pos += beacon->lci_len;
3006	}
3007	if (beacon->civicloc) {
3008		new_beacon->civicloc_len = beacon->civicloc_len;
3009		new_beacon->civicloc = pos;
3010		memcpy(pos, beacon->civicloc, beacon->civicloc_len);
3011		pos += beacon->civicloc_len;
3012	}
3013
3014	return new_beacon;
3015}
3016
3017void ieee80211_csa_finish(struct ieee80211_vif *vif)
3018{
3019	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
3020
3021	ieee80211_queue_work(&sdata->local->hw,
3022			     &sdata->csa_finalize_work);
3023}
3024EXPORT_SYMBOL(ieee80211_csa_finish);
3025
3026static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata,
3027					  u32 *changed)
3028{
3029	int err;
3030
3031	switch (sdata->vif.type) {
3032	case NL80211_IFTYPE_AP:
3033		err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon,
3034					      NULL);
3035		kfree(sdata->u.ap.next_beacon);
3036		sdata->u.ap.next_beacon = NULL;
3037
3038		if (err < 0)
3039			return err;
3040		*changed |= err;
3041		break;
3042	case NL80211_IFTYPE_ADHOC:
3043		err = ieee80211_ibss_finish_csa(sdata);
3044		if (err < 0)
3045			return err;
3046		*changed |= err;
3047		break;
3048#ifdef CONFIG_MAC80211_MESH
3049	case NL80211_IFTYPE_MESH_POINT:
3050		err = ieee80211_mesh_finish_csa(sdata);
3051		if (err < 0)
3052			return err;
3053		*changed |= err;
3054		break;
3055#endif
3056	default:
3057		WARN_ON(1);
3058		return -EINVAL;
3059	}
3060
3061	return 0;
3062}
3063
3064static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
3065{
3066	struct ieee80211_local *local = sdata->local;
3067	u32 changed = 0;
3068	int err;
3069
3070	sdata_assert_lock(sdata);
3071	lockdep_assert_held(&local->mtx);
3072	lockdep_assert_held(&local->chanctx_mtx);
3073
3074	/*
3075	 * using reservation isn't immediate as it may be deferred until later
3076	 * with multi-vif. once reservation is complete it will re-schedule the
3077	 * work with no reserved_chanctx so verify chandef to check if it
3078	 * completed successfully
3079	 */
3080
3081	if (sdata->reserved_chanctx) {
3082		/*
3083		 * with multi-vif csa driver may call ieee80211_csa_finish()
3084		 * many times while waiting for other interfaces to use their
3085		 * reservations
3086		 */
3087		if (sdata->reserved_ready)
3088			return 0;
3089
3090		return ieee80211_vif_use_reserved_context(sdata);
3091	}
3092
3093	if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef,
3094					&sdata->csa_chandef))
3095		return -EINVAL;
3096
3097	sdata->vif.csa_active = false;
3098
3099	err = ieee80211_set_after_csa_beacon(sdata, &changed);
3100	if (err)
3101		return err;
3102
3103	ieee80211_bss_info_change_notify(sdata, changed);
3104
3105	if (sdata->csa_block_tx) {
3106		ieee80211_wake_vif_queues(local, sdata,
3107					  IEEE80211_QUEUE_STOP_REASON_CSA);
3108		sdata->csa_block_tx = false;
3109	}
3110
3111	err = drv_post_channel_switch(sdata);
3112	if (err)
3113		return err;
3114
3115	cfg80211_ch_switch_notify(sdata->dev, &sdata->csa_chandef);
3116
3117	return 0;
3118}
3119
3120static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
3121{
3122	if (__ieee80211_csa_finalize(sdata)) {
3123		sdata_info(sdata, "failed to finalize CSA, disconnecting\n");
3124		cfg80211_stop_iface(sdata->local->hw.wiphy, &sdata->wdev,
3125				    GFP_KERNEL);
3126	}
3127}
3128
3129void ieee80211_csa_finalize_work(struct work_struct *work)
3130{
3131	struct ieee80211_sub_if_data *sdata =
3132		container_of(work, struct ieee80211_sub_if_data,
3133			     csa_finalize_work);
3134	struct ieee80211_local *local = sdata->local;
3135
3136	sdata_lock(sdata);
3137	mutex_lock(&local->mtx);
3138	mutex_lock(&local->chanctx_mtx);
3139
3140	/* AP might have been stopped while waiting for the lock. */
3141	if (!sdata->vif.csa_active)
3142		goto unlock;
3143
3144	if (!ieee80211_sdata_running(sdata))
3145		goto unlock;
3146
3147	ieee80211_csa_finalize(sdata);
3148
3149unlock:
3150	mutex_unlock(&local->chanctx_mtx);
3151	mutex_unlock(&local->mtx);
3152	sdata_unlock(sdata);
3153}
3154
3155static int ieee80211_set_csa_beacon(struct ieee80211_sub_if_data *sdata,
3156				    struct cfg80211_csa_settings *params,
3157				    u32 *changed)
3158{
3159	struct ieee80211_csa_settings csa = {};
3160	int err;
3161
3162	switch (sdata->vif.type) {
3163	case NL80211_IFTYPE_AP:
3164		sdata->u.ap.next_beacon =
3165			cfg80211_beacon_dup(&params->beacon_after);
3166		if (!sdata->u.ap.next_beacon)
3167			return -ENOMEM;
3168
3169		/*
3170		 * With a count of 0, we don't have to wait for any
3171		 * TBTT before switching, so complete the CSA
3172		 * immediately.  In theory, with a count == 1 we
3173		 * should delay the switch until just before the next
3174		 * TBTT, but that would complicate things so we switch
3175		 * immediately too.  If we would delay the switch
3176		 * until the next TBTT, we would have to set the probe
3177		 * response here.
3178		 *
3179		 * TODO: A channel switch with count <= 1 without
3180		 * sending a CSA action frame is kind of useless,
3181		 * because the clients won't know we're changing
3182		 * channels.  The action frame must be implemented
3183		 * either here or in the userspace.
3184		 */
3185		if (params->count <= 1)
3186			break;
3187
3188		if ((params->n_counter_offsets_beacon >
3189		     IEEE80211_MAX_CSA_COUNTERS_NUM) ||
3190		    (params->n_counter_offsets_presp >
3191		     IEEE80211_MAX_CSA_COUNTERS_NUM))
3192			return -EINVAL;
3193
3194		csa.counter_offsets_beacon = params->counter_offsets_beacon;
3195		csa.counter_offsets_presp = params->counter_offsets_presp;
3196		csa.n_counter_offsets_beacon = params->n_counter_offsets_beacon;
3197		csa.n_counter_offsets_presp = params->n_counter_offsets_presp;
3198		csa.count = params->count;
3199
3200		err = ieee80211_assign_beacon(sdata, &params->beacon_csa, &csa);
3201		if (err < 0) {
3202			kfree(sdata->u.ap.next_beacon);
3203			return err;
3204		}
3205		*changed |= err;
3206
3207		break;
3208	case NL80211_IFTYPE_ADHOC:
3209		if (!sdata->vif.bss_conf.ibss_joined)
3210			return -EINVAL;
3211
3212		if (params->chandef.width != sdata->u.ibss.chandef.width)
3213			return -EINVAL;
3214
3215		switch (params->chandef.width) {
3216		case NL80211_CHAN_WIDTH_40:
3217			if (cfg80211_get_chandef_type(&params->chandef) !=
3218			    cfg80211_get_chandef_type(&sdata->u.ibss.chandef))
3219				return -EINVAL;
3220		case NL80211_CHAN_WIDTH_5:
3221		case NL80211_CHAN_WIDTH_10:
3222		case NL80211_CHAN_WIDTH_20_NOHT:
3223		case NL80211_CHAN_WIDTH_20:
3224			break;
3225		default:
3226			return -EINVAL;
3227		}
3228
3229		/* changes into another band are not supported */
3230		if (sdata->u.ibss.chandef.chan->band !=
3231		    params->chandef.chan->band)
3232			return -EINVAL;
3233
3234		/* see comments in the NL80211_IFTYPE_AP block */
3235		if (params->count > 1) {
3236			err = ieee80211_ibss_csa_beacon(sdata, params);
3237			if (err < 0)
3238				return err;
3239			*changed |= err;
3240		}
3241
3242		ieee80211_send_action_csa(sdata, params);
3243
3244		break;
3245#ifdef CONFIG_MAC80211_MESH
3246	case NL80211_IFTYPE_MESH_POINT: {
3247		struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
3248
3249		if (params->chandef.width != sdata->vif.bss_conf.chandef.width)
3250			return -EINVAL;
3251
3252		/* changes into another band are not supported */
3253		if (sdata->vif.bss_conf.chandef.chan->band !=
3254		    params->chandef.chan->band)
3255			return -EINVAL;
3256
3257		if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_NONE) {
3258			ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_INIT;
3259			if (!ifmsh->pre_value)
3260				ifmsh->pre_value = 1;
3261			else
3262				ifmsh->pre_value++;
3263		}
3264
3265		/* see comments in the NL80211_IFTYPE_AP block */
3266		if (params->count > 1) {
3267			err = ieee80211_mesh_csa_beacon(sdata, params);
3268			if (err < 0) {
3269				ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_NONE;
3270				return err;
3271			}
3272			*changed |= err;
3273		}
3274
3275		if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_INIT)
3276			ieee80211_send_action_csa(sdata, params);
3277
3278		break;
3279		}
3280#endif
3281	default:
3282		return -EOPNOTSUPP;
3283	}
3284
3285	return 0;
3286}
3287
3288static int
3289__ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
3290			   struct cfg80211_csa_settings *params)
3291{
3292	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3293	struct ieee80211_local *local = sdata->local;
3294	struct ieee80211_channel_switch ch_switch;
3295	struct ieee80211_chanctx_conf *conf;
3296	struct ieee80211_chanctx *chanctx;
3297	u32 changed = 0;
3298	int err;
3299
3300	sdata_assert_lock(sdata);
3301	lockdep_assert_held(&local->mtx);
3302
3303	if (!list_empty(&local->roc_list) || local->scanning)
3304		return -EBUSY;
3305
3306	if (sdata->wdev.cac_started)
3307		return -EBUSY;
3308
3309	if (cfg80211_chandef_identical(&params->chandef,
3310				       &sdata->vif.bss_conf.chandef))
3311		return -EINVAL;
3312
3313	/* don't allow another channel switch if one is already active. */
3314	if (sdata->vif.csa_active)
3315		return -EBUSY;
3316
3317	mutex_lock(&local->chanctx_mtx);
3318	conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
3319					 lockdep_is_held(&local->chanctx_mtx));
3320	if (!conf) {
3321		err = -EBUSY;
3322		goto out;
3323	}
3324
3325	if (params->chandef.chan->freq_offset) {
3326		/* this may work, but is untested */
3327		err = -EOPNOTSUPP;
3328		goto out;
3329	}
3330
3331	chanctx = container_of(conf, struct ieee80211_chanctx, conf);
3332
3333	ch_switch.timestamp = 0;
3334	ch_switch.device_timestamp = 0;
3335	ch_switch.block_tx = params->block_tx;
3336	ch_switch.chandef = params->chandef;
3337	ch_switch.count = params->count;
3338
3339	err = drv_pre_channel_switch(sdata, &ch_switch);
3340	if (err)
3341		goto out;
3342
3343	err = ieee80211_vif_reserve_chanctx(sdata, &params->chandef,
3344					    chanctx->mode,
3345					    params->radar_required);
3346	if (err)
3347		goto out;
3348
3349	/* if reservation is invalid then this will fail */
3350	err = ieee80211_check_combinations(sdata, NULL, chanctx->mode, 0);
3351	if (err) {
3352		ieee80211_vif_unreserve_chanctx(sdata);
3353		goto out;
3354	}
3355
3356	err = ieee80211_set_csa_beacon(sdata, params, &changed);
3357	if (err) {
3358		ieee80211_vif_unreserve_chanctx(sdata);
3359		goto out;
3360	}
3361
3362	sdata->csa_chandef = params->chandef;
3363	sdata->csa_block_tx = params->block_tx;
3364	sdata->vif.csa_active = true;
3365
3366	if (sdata->csa_block_tx)
3367		ieee80211_stop_vif_queues(local, sdata,
3368					  IEEE80211_QUEUE_STOP_REASON_CSA);
3369
3370	cfg80211_ch_switch_started_notify(sdata->dev, &sdata->csa_chandef,
3371					  params->count);
3372
3373	if (changed) {
3374		ieee80211_bss_info_change_notify(sdata, changed);
3375		drv_channel_switch_beacon(sdata, &params->chandef);
3376	} else {
3377		/* if the beacon didn't change, we can finalize immediately */
3378		ieee80211_csa_finalize(sdata);
3379	}
3380
3381out:
3382	mutex_unlock(&local->chanctx_mtx);
3383	return err;
3384}
3385
3386int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
3387			     struct cfg80211_csa_settings *params)
3388{
3389	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3390	struct ieee80211_local *local = sdata->local;
3391	int err;
3392
3393	mutex_lock(&local->mtx);
3394	err = __ieee80211_channel_switch(wiphy, dev, params);
3395	mutex_unlock(&local->mtx);
3396
3397	return err;
3398}
3399
3400u64 ieee80211_mgmt_tx_cookie(struct ieee80211_local *local)
3401{
3402	lockdep_assert_held(&local->mtx);
3403
3404	local->roc_cookie_counter++;
3405
3406	/* wow, you wrapped 64 bits ... more likely a bug */
3407	if (WARN_ON(local->roc_cookie_counter == 0))
3408		local->roc_cookie_counter++;
3409
3410	return local->roc_cookie_counter;
3411}
3412
3413int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,
3414			     u64 *cookie, gfp_t gfp)
3415{
3416	unsigned long spin_flags;
3417	struct sk_buff *ack_skb;
3418	int id;
3419
3420	ack_skb = skb_copy(skb, gfp);
3421	if (!ack_skb)
3422		return -ENOMEM;
3423
3424	spin_lock_irqsave(&local->ack_status_lock, spin_flags);
3425	id = idr_alloc(&local->ack_status_frames, ack_skb,
3426		       1, 0x2000, GFP_ATOMIC);
3427	spin_unlock_irqrestore(&local->ack_status_lock, spin_flags);
3428
3429	if (id < 0) {
3430		kfree_skb(ack_skb);
3431		return -ENOMEM;
3432	}
3433
3434	IEEE80211_SKB_CB(skb)->ack_frame_id = id;
3435
3436	*cookie = ieee80211_mgmt_tx_cookie(local);
3437	IEEE80211_SKB_CB(ack_skb)->ack.cookie = *cookie;
3438
3439	return 0;
3440}
3441
3442static void
3443ieee80211_update_mgmt_frame_registrations(struct wiphy *wiphy,
3444					  struct wireless_dev *wdev,
3445					  struct mgmt_frame_regs *upd)
3446{
3447	struct ieee80211_local *local = wiphy_priv(wiphy);
3448	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
3449	u32 preq_mask = BIT(IEEE80211_STYPE_PROBE_REQ >> 4);
3450	u32 action_mask = BIT(IEEE80211_STYPE_ACTION >> 4);
3451	bool global_change, intf_change;
3452
3453	global_change =
3454		(local->probe_req_reg != !!(upd->global_stypes & preq_mask)) ||
3455		(local->rx_mcast_action_reg !=
3456		 !!(upd->global_mcast_stypes & action_mask));
3457	local->probe_req_reg = upd->global_stypes & preq_mask;
3458	local->rx_mcast_action_reg = upd->global_mcast_stypes & action_mask;
3459
3460	intf_change = (sdata->vif.probe_req_reg !=
3461		       !!(upd->interface_stypes & preq_mask)) ||
3462		(sdata->vif.rx_mcast_action_reg !=
3463		 !!(upd->interface_mcast_stypes & action_mask));
3464	sdata->vif.probe_req_reg = upd->interface_stypes & preq_mask;
3465	sdata->vif.rx_mcast_action_reg =
3466		upd->interface_mcast_stypes & action_mask;
3467
3468	if (!local->open_count)
3469		return;
 
 
 
 
 
 
 
 
 
 
 
 
 
3470
3471	if (intf_change && ieee80211_sdata_running(sdata))
3472		drv_config_iface_filter(local, sdata,
3473					sdata->vif.probe_req_reg ?
3474						FIF_PROBE_REQ : 0,
3475					FIF_PROBE_REQ);
 
3476
3477	if (global_change)
3478		ieee80211_configure_filter(local);
 
 
 
 
3479}
3480
3481static int ieee80211_set_antenna(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant)
3482{
3483	struct ieee80211_local *local = wiphy_priv(wiphy);
3484
3485	if (local->started)
3486		return -EOPNOTSUPP;
3487
3488	return drv_set_antenna(local, tx_ant, rx_ant);
3489}
3490
3491static int ieee80211_get_antenna(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant)
3492{
3493	struct ieee80211_local *local = wiphy_priv(wiphy);
3494
3495	return drv_get_antenna(local, tx_ant, rx_ant);
3496}
3497
3498static int ieee80211_set_rekey_data(struct wiphy *wiphy,
3499				    struct net_device *dev,
3500				    struct cfg80211_gtk_rekey_data *data)
3501{
3502	struct ieee80211_local *local = wiphy_priv(wiphy);
3503	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3504
3505	if (!local->ops->set_rekey_data)
3506		return -EOPNOTSUPP;
3507
3508	drv_set_rekey_data(local, sdata, data);
3509
3510	return 0;
3511}
3512
3513static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
3514				  const u8 *peer, u64 *cookie)
3515{
3516	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3517	struct ieee80211_local *local = sdata->local;
3518	struct ieee80211_qos_hdr *nullfunc;
3519	struct sk_buff *skb;
3520	int size = sizeof(*nullfunc);
3521	__le16 fc;
3522	bool qos;
3523	struct ieee80211_tx_info *info;
3524	struct sta_info *sta;
3525	struct ieee80211_chanctx_conf *chanctx_conf;
3526	enum nl80211_band band;
3527	int ret;
3528
3529	/* the lock is needed to assign the cookie later */
3530	mutex_lock(&local->mtx);
3531
3532	rcu_read_lock();
3533	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
3534	if (WARN_ON(!chanctx_conf)) {
3535		ret = -EINVAL;
3536		goto unlock;
3537	}
3538	band = chanctx_conf->def.chan->band;
3539	sta = sta_info_get_bss(sdata, peer);
3540	if (sta) {
3541		qos = sta->sta.wme;
3542	} else {
3543		ret = -ENOLINK;
3544		goto unlock;
3545	}
3546
3547	if (qos) {
3548		fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
3549				 IEEE80211_STYPE_QOS_NULLFUNC |
3550				 IEEE80211_FCTL_FROMDS);
3551	} else {
3552		size -= 2;
3553		fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
3554				 IEEE80211_STYPE_NULLFUNC |
3555				 IEEE80211_FCTL_FROMDS);
3556	}
3557
3558	skb = dev_alloc_skb(local->hw.extra_tx_headroom + size);
3559	if (!skb) {
3560		ret = -ENOMEM;
3561		goto unlock;
3562	}
3563
3564	skb->dev = dev;
3565
3566	skb_reserve(skb, local->hw.extra_tx_headroom);
3567
3568	nullfunc = skb_put(skb, size);
3569	nullfunc->frame_control = fc;
3570	nullfunc->duration_id = 0;
3571	memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN);
3572	memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN);
3573	memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN);
3574	nullfunc->seq_ctrl = 0;
3575
3576	info = IEEE80211_SKB_CB(skb);
3577
3578	info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS |
3579		       IEEE80211_TX_INTFL_NL80211_FRAME_TX;
3580	info->band = band;
3581
3582	skb_set_queue_mapping(skb, IEEE80211_AC_VO);
3583	skb->priority = 7;
3584	if (qos)
3585		nullfunc->qos_ctrl = cpu_to_le16(7);
3586
3587	ret = ieee80211_attach_ack_skb(local, skb, cookie, GFP_ATOMIC);
3588	if (ret) {
3589		kfree_skb(skb);
3590		goto unlock;
3591	}
3592
3593	local_bh_disable();
3594	ieee80211_xmit(sdata, sta, skb);
3595	local_bh_enable();
3596
3597	ret = 0;
3598unlock:
3599	rcu_read_unlock();
3600	mutex_unlock(&local->mtx);
3601
3602	return ret;
3603}
3604
3605static int ieee80211_cfg_get_channel(struct wiphy *wiphy,
3606				     struct wireless_dev *wdev,
3607				     struct cfg80211_chan_def *chandef)
3608{
3609	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
3610	struct ieee80211_local *local = wiphy_priv(wiphy);
3611	struct ieee80211_chanctx_conf *chanctx_conf;
3612	int ret = -ENODATA;
3613
3614	rcu_read_lock();
3615	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
3616	if (chanctx_conf) {
3617		*chandef = sdata->vif.bss_conf.chandef;
3618		ret = 0;
3619	} else if (local->open_count > 0 &&
3620		   local->open_count == local->monitors &&
3621		   sdata->vif.type == NL80211_IFTYPE_MONITOR) {
3622		if (local->use_chanctx)
3623			*chandef = local->monitor_chandef;
3624		else
3625			*chandef = local->_oper_chandef;
3626		ret = 0;
3627	}
3628	rcu_read_unlock();
3629
3630	return ret;
3631}
3632
3633#ifdef CONFIG_PM
3634static void ieee80211_set_wakeup(struct wiphy *wiphy, bool enabled)
3635{
3636	drv_set_wakeup(wiphy_priv(wiphy), enabled);
3637}
3638#endif
3639
3640static int ieee80211_set_qos_map(struct wiphy *wiphy,
3641				 struct net_device *dev,
3642				 struct cfg80211_qos_map *qos_map)
3643{
3644	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3645	struct mac80211_qos_map *new_qos_map, *old_qos_map;
3646
3647	if (qos_map) {
3648		new_qos_map = kzalloc(sizeof(*new_qos_map), GFP_KERNEL);
3649		if (!new_qos_map)
3650			return -ENOMEM;
3651		memcpy(&new_qos_map->qos_map, qos_map, sizeof(*qos_map));
3652	} else {
3653		/* A NULL qos_map was passed to disable QoS mapping */
3654		new_qos_map = NULL;
3655	}
3656
3657	old_qos_map = sdata_dereference(sdata->qos_map, sdata);
3658	rcu_assign_pointer(sdata->qos_map, new_qos_map);
3659	if (old_qos_map)
3660		kfree_rcu(old_qos_map, rcu_head);
3661
3662	return 0;
3663}
3664
3665static int ieee80211_set_ap_chanwidth(struct wiphy *wiphy,
3666				      struct net_device *dev,
3667				      struct cfg80211_chan_def *chandef)
3668{
3669	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3670	int ret;
3671	u32 changed = 0;
3672
3673	ret = ieee80211_vif_change_bandwidth(sdata, chandef, &changed);
3674	if (ret == 0)
3675		ieee80211_bss_info_change_notify(sdata, changed);
3676
3677	return ret;
3678}
3679
3680static int ieee80211_add_tx_ts(struct wiphy *wiphy, struct net_device *dev,
3681			       u8 tsid, const u8 *peer, u8 up,
3682			       u16 admitted_time)
3683{
3684	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3685	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3686	int ac = ieee802_1d_to_ac[up];
3687
3688	if (sdata->vif.type != NL80211_IFTYPE_STATION)
3689		return -EOPNOTSUPP;
3690
3691	if (!(sdata->wmm_acm & BIT(up)))
3692		return -EINVAL;
3693
3694	if (ifmgd->tx_tspec[ac].admitted_time)
3695		return -EBUSY;
3696
3697	if (admitted_time) {
3698		ifmgd->tx_tspec[ac].admitted_time = 32 * admitted_time;
3699		ifmgd->tx_tspec[ac].tsid = tsid;
3700		ifmgd->tx_tspec[ac].up = up;
3701	}
3702
3703	return 0;
3704}
3705
3706static int ieee80211_del_tx_ts(struct wiphy *wiphy, struct net_device *dev,
3707			       u8 tsid, const u8 *peer)
3708{
3709	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3710	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3711	struct ieee80211_local *local = wiphy_priv(wiphy);
3712	int ac;
3713
3714	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
3715		struct ieee80211_sta_tx_tspec *tx_tspec = &ifmgd->tx_tspec[ac];
3716
3717		/* skip unused entries */
3718		if (!tx_tspec->admitted_time)
3719			continue;
3720
3721		if (tx_tspec->tsid != tsid)
3722			continue;
3723
3724		/* due to this new packets will be reassigned to non-ACM ACs */
3725		tx_tspec->up = -1;
3726
3727		/* Make sure that all packets have been sent to avoid to
3728		 * restore the QoS params on packets that are still on the
3729		 * queues.
3730		 */
3731		synchronize_net();
3732		ieee80211_flush_queues(local, sdata, false);
3733
3734		/* restore the normal QoS parameters
3735		 * (unconditionally to avoid races)
3736		 */
3737		tx_tspec->action = TX_TSPEC_ACTION_STOP_DOWNGRADE;
3738		tx_tspec->downgraded = false;
3739		ieee80211_sta_handle_tspec_ac_params(sdata);
3740
3741		/* finally clear all the data */
3742		memset(tx_tspec, 0, sizeof(*tx_tspec));
3743
3744		return 0;
3745	}
3746
3747	return -ENOENT;
3748}
3749
3750void ieee80211_nan_func_terminated(struct ieee80211_vif *vif,
3751				   u8 inst_id,
3752				   enum nl80211_nan_func_term_reason reason,
3753				   gfp_t gfp)
3754{
3755	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
3756	struct cfg80211_nan_func *func;
3757	u64 cookie;
3758
3759	if (WARN_ON(vif->type != NL80211_IFTYPE_NAN))
3760		return;
3761
3762	spin_lock_bh(&sdata->u.nan.func_lock);
3763
3764	func = idr_find(&sdata->u.nan.function_inst_ids, inst_id);
3765	if (WARN_ON(!func)) {
3766		spin_unlock_bh(&sdata->u.nan.func_lock);
3767		return;
3768	}
3769
3770	cookie = func->cookie;
3771	idr_remove(&sdata->u.nan.function_inst_ids, inst_id);
3772
3773	spin_unlock_bh(&sdata->u.nan.func_lock);
3774
3775	cfg80211_free_nan_func(func);
3776
3777	cfg80211_nan_func_terminated(ieee80211_vif_to_wdev(vif), inst_id,
3778				     reason, cookie, gfp);
3779}
3780EXPORT_SYMBOL(ieee80211_nan_func_terminated);
3781
3782void ieee80211_nan_func_match(struct ieee80211_vif *vif,
3783			      struct cfg80211_nan_match_params *match,
3784			      gfp_t gfp)
3785{
3786	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
3787	struct cfg80211_nan_func *func;
3788
3789	if (WARN_ON(vif->type != NL80211_IFTYPE_NAN))
3790		return;
3791
3792	spin_lock_bh(&sdata->u.nan.func_lock);
3793
3794	func = idr_find(&sdata->u.nan.function_inst_ids,  match->inst_id);
3795	if (WARN_ON(!func)) {
3796		spin_unlock_bh(&sdata->u.nan.func_lock);
3797		return;
3798	}
3799	match->cookie = func->cookie;
3800
3801	spin_unlock_bh(&sdata->u.nan.func_lock);
3802
3803	cfg80211_nan_match(ieee80211_vif_to_wdev(vif), match, gfp);
3804}
3805EXPORT_SYMBOL(ieee80211_nan_func_match);
3806
3807static int ieee80211_set_multicast_to_unicast(struct wiphy *wiphy,
3808					      struct net_device *dev,
3809					      const bool enabled)
3810{
3811	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3812
3813	sdata->u.ap.multicast_to_unicast = enabled;
3814
3815	return 0;
3816}
3817
3818void ieee80211_fill_txq_stats(struct cfg80211_txq_stats *txqstats,
3819			      struct txq_info *txqi)
3820{
3821	if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_BACKLOG_BYTES))) {
3822		txqstats->filled |= BIT(NL80211_TXQ_STATS_BACKLOG_BYTES);
3823		txqstats->backlog_bytes = txqi->tin.backlog_bytes;
3824	}
3825
3826	if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_BACKLOG_PACKETS))) {
3827		txqstats->filled |= BIT(NL80211_TXQ_STATS_BACKLOG_PACKETS);
3828		txqstats->backlog_packets = txqi->tin.backlog_packets;
3829	}
3830
3831	if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_FLOWS))) {
3832		txqstats->filled |= BIT(NL80211_TXQ_STATS_FLOWS);
3833		txqstats->flows = txqi->tin.flows;
3834	}
3835
3836	if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_DROPS))) {
3837		txqstats->filled |= BIT(NL80211_TXQ_STATS_DROPS);
3838		txqstats->drops = txqi->cstats.drop_count;
3839	}
3840
3841	if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_ECN_MARKS))) {
3842		txqstats->filled |= BIT(NL80211_TXQ_STATS_ECN_MARKS);
3843		txqstats->ecn_marks = txqi->cstats.ecn_mark;
3844	}
3845
3846	if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_OVERLIMIT))) {
3847		txqstats->filled |= BIT(NL80211_TXQ_STATS_OVERLIMIT);
3848		txqstats->overlimit = txqi->tin.overlimit;
3849	}
3850
3851	if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_COLLISIONS))) {
3852		txqstats->filled |= BIT(NL80211_TXQ_STATS_COLLISIONS);
3853		txqstats->collisions = txqi->tin.collisions;
3854	}
3855
3856	if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_TX_BYTES))) {
3857		txqstats->filled |= BIT(NL80211_TXQ_STATS_TX_BYTES);
3858		txqstats->tx_bytes = txqi->tin.tx_bytes;
3859	}
3860
3861	if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_TX_PACKETS))) {
3862		txqstats->filled |= BIT(NL80211_TXQ_STATS_TX_PACKETS);
3863		txqstats->tx_packets = txqi->tin.tx_packets;
3864	}
3865}
3866
3867static int ieee80211_get_txq_stats(struct wiphy *wiphy,
3868				   struct wireless_dev *wdev,
3869				   struct cfg80211_txq_stats *txqstats)
3870{
3871	struct ieee80211_local *local = wiphy_priv(wiphy);
3872	struct ieee80211_sub_if_data *sdata;
3873	int ret = 0;
3874
3875	if (!local->ops->wake_tx_queue)
3876		return 1;
3877
3878	spin_lock_bh(&local->fq.lock);
3879	rcu_read_lock();
3880
3881	if (wdev) {
3882		sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
3883		if (!sdata->vif.txq) {
3884			ret = 1;
3885			goto out;
3886		}
3887		ieee80211_fill_txq_stats(txqstats, to_txq_info(sdata->vif.txq));
3888	} else {
3889		/* phy stats */
3890		txqstats->filled |= BIT(NL80211_TXQ_STATS_BACKLOG_PACKETS) |
3891				    BIT(NL80211_TXQ_STATS_BACKLOG_BYTES) |
3892				    BIT(NL80211_TXQ_STATS_OVERLIMIT) |
3893				    BIT(NL80211_TXQ_STATS_OVERMEMORY) |
3894				    BIT(NL80211_TXQ_STATS_COLLISIONS) |
3895				    BIT(NL80211_TXQ_STATS_MAX_FLOWS);
3896		txqstats->backlog_packets = local->fq.backlog;
3897		txqstats->backlog_bytes = local->fq.memory_usage;
3898		txqstats->overlimit = local->fq.overlimit;
3899		txqstats->overmemory = local->fq.overmemory;
3900		txqstats->collisions = local->fq.collisions;
3901		txqstats->max_flows = local->fq.flows_cnt;
3902	}
3903
3904out:
3905	rcu_read_unlock();
3906	spin_unlock_bh(&local->fq.lock);
3907
3908	return ret;
3909}
3910
3911static int
3912ieee80211_get_ftm_responder_stats(struct wiphy *wiphy,
3913				  struct net_device *dev,
3914				  struct cfg80211_ftm_responder_stats *ftm_stats)
3915{
3916	struct ieee80211_local *local = wiphy_priv(wiphy);
3917	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3918
3919	return drv_get_ftm_responder_stats(local, sdata, ftm_stats);
3920}
3921
3922static int
3923ieee80211_start_pmsr(struct wiphy *wiphy, struct wireless_dev *dev,
3924		     struct cfg80211_pmsr_request *request)
3925{
3926	struct ieee80211_local *local = wiphy_priv(wiphy);
3927	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(dev);
3928
3929	return drv_start_pmsr(local, sdata, request);
3930}
3931
3932static void
3933ieee80211_abort_pmsr(struct wiphy *wiphy, struct wireless_dev *dev,
3934		     struct cfg80211_pmsr_request *request)
3935{
3936	struct ieee80211_local *local = wiphy_priv(wiphy);
3937	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(dev);
3938
3939	return drv_abort_pmsr(local, sdata, request);
3940}
3941
3942static int ieee80211_set_tid_config(struct wiphy *wiphy,
3943				    struct net_device *dev,
3944				    struct cfg80211_tid_config *tid_conf)
3945{
3946	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3947	struct sta_info *sta;
3948	int ret;
3949
3950	if (!sdata->local->ops->set_tid_config)
3951		return -EOPNOTSUPP;
3952
3953	if (!tid_conf->peer)
3954		return drv_set_tid_config(sdata->local, sdata, NULL, tid_conf);
3955
3956	mutex_lock(&sdata->local->sta_mtx);
3957	sta = sta_info_get_bss(sdata, tid_conf->peer);
3958	if (!sta) {
3959		mutex_unlock(&sdata->local->sta_mtx);
3960		return -ENOENT;
3961	}
3962
3963	ret = drv_set_tid_config(sdata->local, sdata, &sta->sta, tid_conf);
3964	mutex_unlock(&sdata->local->sta_mtx);
3965
3966	return ret;
3967}
3968
3969static int ieee80211_reset_tid_config(struct wiphy *wiphy,
3970				      struct net_device *dev,
3971				      const u8 *peer, u8 tids)
3972{
3973	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3974	struct sta_info *sta;
3975	int ret;
3976
3977	if (!sdata->local->ops->reset_tid_config)
3978		return -EOPNOTSUPP;
3979
3980	if (!peer)
3981		return drv_reset_tid_config(sdata->local, sdata, NULL, tids);
3982
3983	mutex_lock(&sdata->local->sta_mtx);
3984	sta = sta_info_get_bss(sdata, peer);
3985	if (!sta) {
3986		mutex_unlock(&sdata->local->sta_mtx);
3987		return -ENOENT;
3988	}
3989
3990	ret = drv_reset_tid_config(sdata->local, sdata, &sta->sta, tids);
3991	mutex_unlock(&sdata->local->sta_mtx);
3992
3993	return ret;
3994}
3995
3996const struct cfg80211_ops mac80211_config_ops = {
3997	.add_virtual_intf = ieee80211_add_iface,
3998	.del_virtual_intf = ieee80211_del_iface,
3999	.change_virtual_intf = ieee80211_change_iface,
4000	.start_p2p_device = ieee80211_start_p2p_device,
4001	.stop_p2p_device = ieee80211_stop_p2p_device,
4002	.add_key = ieee80211_add_key,
4003	.del_key = ieee80211_del_key,
4004	.get_key = ieee80211_get_key,
4005	.set_default_key = ieee80211_config_default_key,
4006	.set_default_mgmt_key = ieee80211_config_default_mgmt_key,
4007	.set_default_beacon_key = ieee80211_config_default_beacon_key,
4008	.start_ap = ieee80211_start_ap,
4009	.change_beacon = ieee80211_change_beacon,
4010	.stop_ap = ieee80211_stop_ap,
4011	.add_station = ieee80211_add_station,
4012	.del_station = ieee80211_del_station,
4013	.change_station = ieee80211_change_station,
4014	.get_station = ieee80211_get_station,
4015	.dump_station = ieee80211_dump_station,
4016	.dump_survey = ieee80211_dump_survey,
4017#ifdef CONFIG_MAC80211_MESH
4018	.add_mpath = ieee80211_add_mpath,
4019	.del_mpath = ieee80211_del_mpath,
4020	.change_mpath = ieee80211_change_mpath,
4021	.get_mpath = ieee80211_get_mpath,
4022	.dump_mpath = ieee80211_dump_mpath,
4023	.get_mpp = ieee80211_get_mpp,
4024	.dump_mpp = ieee80211_dump_mpp,
4025	.update_mesh_config = ieee80211_update_mesh_config,
4026	.get_mesh_config = ieee80211_get_mesh_config,
4027	.join_mesh = ieee80211_join_mesh,
4028	.leave_mesh = ieee80211_leave_mesh,
4029#endif
4030	.join_ocb = ieee80211_join_ocb,
4031	.leave_ocb = ieee80211_leave_ocb,
4032	.change_bss = ieee80211_change_bss,
4033	.set_txq_params = ieee80211_set_txq_params,
4034	.set_monitor_channel = ieee80211_set_monitor_channel,
4035	.suspend = ieee80211_suspend,
4036	.resume = ieee80211_resume,
4037	.scan = ieee80211_scan,
4038	.abort_scan = ieee80211_abort_scan,
4039	.sched_scan_start = ieee80211_sched_scan_start,
4040	.sched_scan_stop = ieee80211_sched_scan_stop,
4041	.auth = ieee80211_auth,
4042	.assoc = ieee80211_assoc,
4043	.deauth = ieee80211_deauth,
4044	.disassoc = ieee80211_disassoc,
4045	.join_ibss = ieee80211_join_ibss,
4046	.leave_ibss = ieee80211_leave_ibss,
4047	.set_mcast_rate = ieee80211_set_mcast_rate,
4048	.set_wiphy_params = ieee80211_set_wiphy_params,
4049	.set_tx_power = ieee80211_set_tx_power,
4050	.get_tx_power = ieee80211_get_tx_power,
4051	.set_wds_peer = ieee80211_set_wds_peer,
4052	.rfkill_poll = ieee80211_rfkill_poll,
4053	CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
4054	CFG80211_TESTMODE_DUMP(ieee80211_testmode_dump)
4055	.set_power_mgmt = ieee80211_set_power_mgmt,
4056	.set_bitrate_mask = ieee80211_set_bitrate_mask,
4057	.remain_on_channel = ieee80211_remain_on_channel,
4058	.cancel_remain_on_channel = ieee80211_cancel_remain_on_channel,
4059	.mgmt_tx = ieee80211_mgmt_tx,
4060	.mgmt_tx_cancel_wait = ieee80211_mgmt_tx_cancel_wait,
4061	.set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
4062	.set_cqm_rssi_range_config = ieee80211_set_cqm_rssi_range_config,
4063	.update_mgmt_frame_registrations =
4064		ieee80211_update_mgmt_frame_registrations,
4065	.set_antenna = ieee80211_set_antenna,
4066	.get_antenna = ieee80211_get_antenna,
4067	.set_rekey_data = ieee80211_set_rekey_data,
4068	.tdls_oper = ieee80211_tdls_oper,
4069	.tdls_mgmt = ieee80211_tdls_mgmt,
4070	.tdls_channel_switch = ieee80211_tdls_channel_switch,
4071	.tdls_cancel_channel_switch = ieee80211_tdls_cancel_channel_switch,
4072	.probe_client = ieee80211_probe_client,
4073	.set_noack_map = ieee80211_set_noack_map,
4074#ifdef CONFIG_PM
4075	.set_wakeup = ieee80211_set_wakeup,
4076#endif
4077	.get_channel = ieee80211_cfg_get_channel,
4078	.start_radar_detection = ieee80211_start_radar_detection,
4079	.end_cac = ieee80211_end_cac,
4080	.channel_switch = ieee80211_channel_switch,
4081	.set_qos_map = ieee80211_set_qos_map,
4082	.set_ap_chanwidth = ieee80211_set_ap_chanwidth,
4083	.add_tx_ts = ieee80211_add_tx_ts,
4084	.del_tx_ts = ieee80211_del_tx_ts,
4085	.start_nan = ieee80211_start_nan,
4086	.stop_nan = ieee80211_stop_nan,
4087	.nan_change_conf = ieee80211_nan_change_conf,
4088	.add_nan_func = ieee80211_add_nan_func,
4089	.del_nan_func = ieee80211_del_nan_func,
4090	.set_multicast_to_unicast = ieee80211_set_multicast_to_unicast,
4091	.tx_control_port = ieee80211_tx_control_port,
4092	.get_txq_stats = ieee80211_get_txq_stats,
4093	.get_ftm_responder_stats = ieee80211_get_ftm_responder_stats,
4094	.start_pmsr = ieee80211_start_pmsr,
4095	.abort_pmsr = ieee80211_abort_pmsr,
4096	.probe_mesh_link = ieee80211_probe_mesh_link,
4097	.set_tid_config = ieee80211_set_tid_config,
4098	.reset_tid_config = ieee80211_reset_tid_config,
4099};
v4.6
 
   1/*
   2 * mac80211 configuration hooks for cfg80211
   3 *
   4 * Copyright 2006-2010	Johannes Berg <johannes@sipsolutions.net>
   5 * Copyright 2013-2015  Intel Mobile Communications GmbH
   6 *
   7 * This file is GPLv2 as found in COPYING.
   8 */
   9
  10#include <linux/ieee80211.h>
  11#include <linux/nl80211.h>
  12#include <linux/rtnetlink.h>
  13#include <linux/slab.h>
  14#include <net/net_namespace.h>
  15#include <linux/rcupdate.h>
 
  16#include <linux/if_ether.h>
  17#include <net/cfg80211.h>
  18#include "ieee80211_i.h"
  19#include "driver-ops.h"
  20#include "rate.h"
  21#include "mesh.h"
  22#include "wme.h"
  23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  24static struct wireless_dev *ieee80211_add_iface(struct wiphy *wiphy,
  25						const char *name,
  26						unsigned char name_assign_type,
  27						enum nl80211_iftype type,
  28						u32 *flags,
  29						struct vif_params *params)
  30{
  31	struct ieee80211_local *local = wiphy_priv(wiphy);
  32	struct wireless_dev *wdev;
  33	struct ieee80211_sub_if_data *sdata;
  34	int err;
  35
  36	err = ieee80211_if_add(local, name, name_assign_type, &wdev, type, params);
  37	if (err)
  38		return ERR_PTR(err);
  39
  40	if (type == NL80211_IFTYPE_MONITOR && flags) {
  41		sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
  42		sdata->u.mntr_flags = *flags;
 
 
 
 
 
  43	}
  44
  45	return wdev;
  46}
  47
  48static int ieee80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
  49{
  50	ieee80211_if_remove(IEEE80211_WDEV_TO_SUB_IF(wdev));
  51
  52	return 0;
  53}
  54
  55static int ieee80211_change_iface(struct wiphy *wiphy,
  56				  struct net_device *dev,
  57				  enum nl80211_iftype type, u32 *flags,
  58				  struct vif_params *params)
  59{
  60	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  61	int ret;
  62
  63	ret = ieee80211_if_change_type(sdata, type);
  64	if (ret)
  65		return ret;
  66
  67	if (type == NL80211_IFTYPE_AP_VLAN &&
  68	    params && params->use_4addr == 0)
  69		RCU_INIT_POINTER(sdata->u.vlan.sta, NULL);
  70	else if (type == NL80211_IFTYPE_STATION &&
  71		 params && params->use_4addr >= 0)
  72		sdata->u.mgd.use_4addr = params->use_4addr;
 
  73
  74	if (sdata->vif.type == NL80211_IFTYPE_MONITOR && flags) {
  75		struct ieee80211_local *local = sdata->local;
  76
  77		if (ieee80211_sdata_running(sdata)) {
  78			u32 mask = MONITOR_FLAG_COOK_FRAMES |
  79				   MONITOR_FLAG_ACTIVE;
  80
  81			/*
  82			 * Prohibit MONITOR_FLAG_COOK_FRAMES and
  83			 * MONITOR_FLAG_ACTIVE to be changed while the
  84			 * interface is up.
  85			 * Else we would need to add a lot of cruft
  86			 * to update everything:
  87			 *	cooked_mntrs, monitor and all fif_* counters
  88			 *	reconfigure hardware
  89			 */
  90			if ((*flags & mask) != (sdata->u.mntr_flags & mask))
  91				return -EBUSY;
  92
  93			ieee80211_adjust_monitor_flags(sdata, -1);
  94			sdata->u.mntr_flags = *flags;
  95			ieee80211_adjust_monitor_flags(sdata, 1);
  96
  97			ieee80211_configure_filter(local);
  98		} else {
  99			/*
 100			 * Because the interface is down, ieee80211_do_stop
 101			 * and ieee80211_do_open take care of "everything"
 102			 * mentioned in the comment above.
 103			 */
 104			sdata->u.mntr_flags = *flags;
 105		}
 106	}
 107
 108	return 0;
 109}
 110
 111static int ieee80211_start_p2p_device(struct wiphy *wiphy,
 112				      struct wireless_dev *wdev)
 113{
 114	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
 115	int ret;
 116
 117	mutex_lock(&sdata->local->chanctx_mtx);
 118	ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
 119	mutex_unlock(&sdata->local->chanctx_mtx);
 120	if (ret < 0)
 121		return ret;
 122
 123	return ieee80211_do_open(wdev, true);
 124}
 125
 126static void ieee80211_stop_p2p_device(struct wiphy *wiphy,
 127				      struct wireless_dev *wdev)
 128{
 129	ieee80211_sdata_stop(IEEE80211_WDEV_TO_SUB_IF(wdev));
 130}
 131
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 132static int ieee80211_set_noack_map(struct wiphy *wiphy,
 133				  struct net_device *dev,
 134				  u16 noack_map)
 135{
 136	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 137
 138	sdata->noack_map = noack_map;
 139
 140	ieee80211_check_fast_xmit_iface(sdata);
 141
 142	return 0;
 143}
 144
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 145static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
 146			     u8 key_idx, bool pairwise, const u8 *mac_addr,
 147			     struct key_params *params)
 148{
 149	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 150	struct ieee80211_local *local = sdata->local;
 151	struct sta_info *sta = NULL;
 152	const struct ieee80211_cipher_scheme *cs = NULL;
 153	struct ieee80211_key *key;
 154	int err;
 155
 156	if (!ieee80211_sdata_running(sdata))
 157		return -ENETDOWN;
 158
 
 
 
 159	/* reject WEP and TKIP keys if WEP failed to initialize */
 160	switch (params->cipher) {
 161	case WLAN_CIPHER_SUITE_WEP40:
 162	case WLAN_CIPHER_SUITE_TKIP:
 163	case WLAN_CIPHER_SUITE_WEP104:
 164		if (IS_ERR(local->wep_tx_tfm))
 165			return -EINVAL;
 166		break;
 167	case WLAN_CIPHER_SUITE_CCMP:
 168	case WLAN_CIPHER_SUITE_CCMP_256:
 169	case WLAN_CIPHER_SUITE_AES_CMAC:
 170	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
 171	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
 172	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
 173	case WLAN_CIPHER_SUITE_GCMP:
 174	case WLAN_CIPHER_SUITE_GCMP_256:
 175		break;
 176	default:
 177		cs = ieee80211_cs_get(local, params->cipher, sdata->vif.type);
 178		break;
 179	}
 180
 181	key = ieee80211_key_alloc(params->cipher, key_idx, params->key_len,
 182				  params->key, params->seq_len, params->seq,
 183				  cs);
 184	if (IS_ERR(key))
 185		return PTR_ERR(key);
 186
 187	if (pairwise)
 188		key->conf.flags |= IEEE80211_KEY_FLAG_PAIRWISE;
 189
 
 
 
 190	mutex_lock(&local->sta_mtx);
 191
 192	if (mac_addr) {
 193		if (ieee80211_vif_is_mesh(&sdata->vif))
 194			sta = sta_info_get(sdata, mac_addr);
 195		else
 196			sta = sta_info_get_bss(sdata, mac_addr);
 197		/*
 198		 * The ASSOC test makes sure the driver is ready to
 199		 * receive the key. When wpa_supplicant has roamed
 200		 * using FT, it attempts to set the key before
 201		 * association has completed, this rejects that attempt
 202		 * so it will set the key again after association.
 203		 *
 204		 * TODO: accept the key if we have a station entry and
 205		 *       add it to the device after the station.
 206		 */
 207		if (!sta || !test_sta_flag(sta, WLAN_STA_ASSOC)) {
 208			ieee80211_key_free_unused(key);
 209			err = -ENOENT;
 210			goto out_unlock;
 211		}
 212	}
 213
 214	switch (sdata->vif.type) {
 215	case NL80211_IFTYPE_STATION:
 216		if (sdata->u.mgd.mfp != IEEE80211_MFP_DISABLED)
 217			key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
 218		break;
 219	case NL80211_IFTYPE_AP:
 220	case NL80211_IFTYPE_AP_VLAN:
 221		/* Keys without a station are used for TX only */
 222		if (key->sta && test_sta_flag(key->sta, WLAN_STA_MFP))
 223			key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
 224		break;
 225	case NL80211_IFTYPE_ADHOC:
 226		/* no MFP (yet) */
 227		break;
 228	case NL80211_IFTYPE_MESH_POINT:
 229#ifdef CONFIG_MAC80211_MESH
 230		if (sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE)
 231			key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
 232		break;
 233#endif
 234	case NL80211_IFTYPE_WDS:
 235	case NL80211_IFTYPE_MONITOR:
 236	case NL80211_IFTYPE_P2P_DEVICE:
 
 237	case NL80211_IFTYPE_UNSPECIFIED:
 238	case NUM_NL80211_IFTYPES:
 239	case NL80211_IFTYPE_P2P_CLIENT:
 240	case NL80211_IFTYPE_P2P_GO:
 241	case NL80211_IFTYPE_OCB:
 242		/* shouldn't happen */
 243		WARN_ON_ONCE(1);
 244		break;
 245	}
 246
 247	if (sta)
 248		sta->cipher_scheme = cs;
 249
 250	err = ieee80211_key_link(key, sdata, sta);
 251
 252 out_unlock:
 253	mutex_unlock(&local->sta_mtx);
 254
 255	return err;
 256}
 257
 258static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
 259			     u8 key_idx, bool pairwise, const u8 *mac_addr)
 260{
 261	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 262	struct ieee80211_local *local = sdata->local;
 263	struct sta_info *sta;
 264	struct ieee80211_key *key = NULL;
 265	int ret;
 266
 267	mutex_lock(&local->sta_mtx);
 268	mutex_lock(&local->key_mtx);
 269
 270	if (mac_addr) {
 271		ret = -ENOENT;
 272
 273		sta = sta_info_get_bss(sdata, mac_addr);
 274		if (!sta)
 275			goto out_unlock;
 276
 277		if (pairwise)
 278			key = key_mtx_dereference(local, sta->ptk[key_idx]);
 279		else
 280			key = key_mtx_dereference(local, sta->gtk[key_idx]);
 281	} else
 282		key = key_mtx_dereference(local, sdata->keys[key_idx]);
 283
 284	if (!key) {
 285		ret = -ENOENT;
 286		goto out_unlock;
 287	}
 288
 289	ieee80211_key_free(key, true);
 290
 291	ret = 0;
 292 out_unlock:
 293	mutex_unlock(&local->key_mtx);
 294	mutex_unlock(&local->sta_mtx);
 295
 296	return ret;
 297}
 298
 299static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
 300			     u8 key_idx, bool pairwise, const u8 *mac_addr,
 301			     void *cookie,
 302			     void (*callback)(void *cookie,
 303					      struct key_params *params))
 304{
 305	struct ieee80211_sub_if_data *sdata;
 306	struct sta_info *sta = NULL;
 307	u8 seq[6] = {0};
 308	struct key_params params;
 309	struct ieee80211_key *key = NULL;
 310	u64 pn64;
 311	u32 iv32;
 312	u16 iv16;
 313	int err = -ENOENT;
 314	struct ieee80211_key_seq kseq = {};
 315
 316	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 317
 318	rcu_read_lock();
 319
 320	if (mac_addr) {
 321		sta = sta_info_get_bss(sdata, mac_addr);
 322		if (!sta)
 323			goto out;
 324
 325		if (pairwise && key_idx < NUM_DEFAULT_KEYS)
 326			key = rcu_dereference(sta->ptk[key_idx]);
 327		else if (!pairwise &&
 328			 key_idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS)
 
 329			key = rcu_dereference(sta->gtk[key_idx]);
 330	} else
 331		key = rcu_dereference(sdata->keys[key_idx]);
 332
 333	if (!key)
 334		goto out;
 335
 336	memset(&params, 0, sizeof(params));
 337
 338	params.cipher = key->conf.cipher;
 339
 340	switch (key->conf.cipher) {
 341	case WLAN_CIPHER_SUITE_TKIP:
 342		pn64 = atomic64_read(&key->conf.tx_pn);
 343		iv32 = TKIP_PN_TO_IV32(pn64);
 344		iv16 = TKIP_PN_TO_IV16(pn64);
 345
 346		if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
 347		    !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
 348			drv_get_key_seq(sdata->local, key, &kseq);
 349			iv32 = kseq.tkip.iv32;
 350			iv16 = kseq.tkip.iv16;
 351		}
 352
 353		seq[0] = iv16 & 0xff;
 354		seq[1] = (iv16 >> 8) & 0xff;
 355		seq[2] = iv32 & 0xff;
 356		seq[3] = (iv32 >> 8) & 0xff;
 357		seq[4] = (iv32 >> 16) & 0xff;
 358		seq[5] = (iv32 >> 24) & 0xff;
 359		params.seq = seq;
 360		params.seq_len = 6;
 361		break;
 362	case WLAN_CIPHER_SUITE_CCMP:
 363	case WLAN_CIPHER_SUITE_CCMP_256:
 364	case WLAN_CIPHER_SUITE_AES_CMAC:
 365	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
 366		BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
 367			     offsetof(typeof(kseq), aes_cmac));
 
 368	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
 369	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
 370		BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
 371			     offsetof(typeof(kseq), aes_gmac));
 
 372	case WLAN_CIPHER_SUITE_GCMP:
 373	case WLAN_CIPHER_SUITE_GCMP_256:
 374		BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
 375			     offsetof(typeof(kseq), gcmp));
 376
 377		if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
 378		    !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
 379			drv_get_key_seq(sdata->local, key, &kseq);
 380			memcpy(seq, kseq.ccmp.pn, 6);
 381		} else {
 382			pn64 = atomic64_read(&key->conf.tx_pn);
 383			seq[0] = pn64;
 384			seq[1] = pn64 >> 8;
 385			seq[2] = pn64 >> 16;
 386			seq[3] = pn64 >> 24;
 387			seq[4] = pn64 >> 32;
 388			seq[5] = pn64 >> 40;
 389		}
 390		params.seq = seq;
 391		params.seq_len = 6;
 392		break;
 393	default:
 394		if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
 395			break;
 396		if (WARN_ON(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))
 397			break;
 398		drv_get_key_seq(sdata->local, key, &kseq);
 399		params.seq = kseq.hw.seq;
 400		params.seq_len = kseq.hw.seq_len;
 401		break;
 402	}
 403
 404	params.key = key->conf.key;
 405	params.key_len = key->conf.keylen;
 406
 407	callback(cookie, &params);
 408	err = 0;
 409
 410 out:
 411	rcu_read_unlock();
 412	return err;
 413}
 414
 415static int ieee80211_config_default_key(struct wiphy *wiphy,
 416					struct net_device *dev,
 417					u8 key_idx, bool uni,
 418					bool multi)
 419{
 420	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 421
 422	ieee80211_set_default_key(sdata, key_idx, uni, multi);
 423
 424	return 0;
 425}
 426
 427static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
 428					     struct net_device *dev,
 429					     u8 key_idx)
 430{
 431	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 432
 433	ieee80211_set_default_mgmt_key(sdata, key_idx);
 434
 435	return 0;
 436}
 437
 
 
 
 
 
 
 
 
 
 
 
 438void sta_set_rate_info_tx(struct sta_info *sta,
 439			  const struct ieee80211_tx_rate *rate,
 440			  struct rate_info *rinfo)
 441{
 442	rinfo->flags = 0;
 443	if (rate->flags & IEEE80211_TX_RC_MCS) {
 444		rinfo->flags |= RATE_INFO_FLAGS_MCS;
 445		rinfo->mcs = rate->idx;
 446	} else if (rate->flags & IEEE80211_TX_RC_VHT_MCS) {
 447		rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS;
 448		rinfo->mcs = ieee80211_rate_get_vht_mcs(rate);
 449		rinfo->nss = ieee80211_rate_get_vht_nss(rate);
 450	} else {
 451		struct ieee80211_supported_band *sband;
 452		int shift = ieee80211_vif_get_shift(&sta->sdata->vif);
 453		u16 brate;
 454
 455		sband = sta->local->hw.wiphy->bands[
 456				ieee80211_get_sdata_band(sta->sdata)];
 457		brate = sband->bitrates[rate->idx].bitrate;
 458		rinfo->legacy = DIV_ROUND_UP(brate, 1 << shift);
 
 459	}
 460	if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
 461		rinfo->bw = RATE_INFO_BW_40;
 462	else if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
 463		rinfo->bw = RATE_INFO_BW_80;
 464	else if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
 465		rinfo->bw = RATE_INFO_BW_160;
 466	else
 467		rinfo->bw = RATE_INFO_BW_20;
 468	if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
 469		rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
 470}
 471
 472static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
 473				  int idx, u8 *mac, struct station_info *sinfo)
 474{
 475	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 476	struct ieee80211_local *local = sdata->local;
 477	struct sta_info *sta;
 478	int ret = -ENOENT;
 479
 480	mutex_lock(&local->sta_mtx);
 481
 482	sta = sta_info_get_by_idx(sdata, idx);
 483	if (sta) {
 484		ret = 0;
 485		memcpy(mac, sta->sta.addr, ETH_ALEN);
 486		sta_set_sinfo(sta, sinfo);
 487	}
 488
 489	mutex_unlock(&local->sta_mtx);
 490
 491	return ret;
 492}
 493
 494static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev,
 495				 int idx, struct survey_info *survey)
 496{
 497	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
 498
 499	return drv_get_survey(local, idx, survey);
 500}
 501
 502static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
 503				 const u8 *mac, struct station_info *sinfo)
 504{
 505	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 506	struct ieee80211_local *local = sdata->local;
 507	struct sta_info *sta;
 508	int ret = -ENOENT;
 509
 510	mutex_lock(&local->sta_mtx);
 511
 512	sta = sta_info_get_bss(sdata, mac);
 513	if (sta) {
 514		ret = 0;
 515		sta_set_sinfo(sta, sinfo);
 516	}
 517
 518	mutex_unlock(&local->sta_mtx);
 519
 520	return ret;
 521}
 522
 523static int ieee80211_set_monitor_channel(struct wiphy *wiphy,
 524					 struct cfg80211_chan_def *chandef)
 525{
 526	struct ieee80211_local *local = wiphy_priv(wiphy);
 527	struct ieee80211_sub_if_data *sdata;
 528	int ret = 0;
 529
 530	if (cfg80211_chandef_identical(&local->monitor_chandef, chandef))
 531		return 0;
 532
 533	mutex_lock(&local->mtx);
 534	mutex_lock(&local->iflist_mtx);
 535	if (local->use_chanctx) {
 536		sdata = rcu_dereference_protected(
 537				local->monitor_sdata,
 538				lockdep_is_held(&local->iflist_mtx));
 539		if (sdata) {
 540			ieee80211_vif_release_channel(sdata);
 541			ret = ieee80211_vif_use_channel(sdata, chandef,
 542					IEEE80211_CHANCTX_EXCLUSIVE);
 543		}
 544	} else if (local->open_count == local->monitors) {
 545		local->_oper_chandef = *chandef;
 546		ieee80211_hw_config(local, 0);
 547	}
 548
 549	if (ret == 0)
 550		local->monitor_chandef = *chandef;
 551	mutex_unlock(&local->iflist_mtx);
 552	mutex_unlock(&local->mtx);
 553
 554	return ret;
 555}
 556
 557static int ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata,
 558				    const u8 *resp, size_t resp_len,
 559				    const struct ieee80211_csa_settings *csa)
 560{
 561	struct probe_resp *new, *old;
 562
 563	if (!resp || !resp_len)
 564		return 1;
 565
 566	old = sdata_dereference(sdata->u.ap.probe_resp, sdata);
 567
 568	new = kzalloc(sizeof(struct probe_resp) + resp_len, GFP_KERNEL);
 569	if (!new)
 570		return -ENOMEM;
 571
 572	new->len = resp_len;
 573	memcpy(new->data, resp, resp_len);
 574
 575	if (csa)
 576		memcpy(new->csa_counter_offsets, csa->counter_offsets_presp,
 577		       csa->n_counter_offsets_presp *
 578		       sizeof(new->csa_counter_offsets[0]));
 579
 580	rcu_assign_pointer(sdata->u.ap.probe_resp, new);
 581	if (old)
 582		kfree_rcu(old, rcu_head);
 583
 584	return 0;
 585}
 586
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 587static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata,
 588				   struct cfg80211_beacon_data *params,
 589				   const struct ieee80211_csa_settings *csa)
 590{
 591	struct beacon_data *new, *old;
 592	int new_head_len, new_tail_len;
 593	int size, err;
 594	u32 changed = BSS_CHANGED_BEACON;
 595
 596	old = sdata_dereference(sdata->u.ap.beacon, sdata);
 597
 598
 599	/* Need to have a beacon head if we don't have one yet */
 600	if (!params->head && !old)
 601		return -EINVAL;
 602
 603	/* new or old head? */
 604	if (params->head)
 605		new_head_len = params->head_len;
 606	else
 607		new_head_len = old->head_len;
 608
 609	/* new or old tail? */
 610	if (params->tail || !old)
 611		/* params->tail_len will be zero for !params->tail */
 612		new_tail_len = params->tail_len;
 613	else
 614		new_tail_len = old->tail_len;
 615
 616	size = sizeof(*new) + new_head_len + new_tail_len;
 617
 618	new = kzalloc(size, GFP_KERNEL);
 619	if (!new)
 620		return -ENOMEM;
 621
 622	/* start filling the new info now */
 623
 624	/*
 625	 * pointers go into the block we allocated,
 626	 * memory is | beacon_data | head | tail |
 627	 */
 628	new->head = ((u8 *) new) + sizeof(*new);
 629	new->tail = new->head + new_head_len;
 630	new->head_len = new_head_len;
 631	new->tail_len = new_tail_len;
 632
 633	if (csa) {
 634		new->csa_current_counter = csa->count;
 635		memcpy(new->csa_counter_offsets, csa->counter_offsets_beacon,
 636		       csa->n_counter_offsets_beacon *
 637		       sizeof(new->csa_counter_offsets[0]));
 638	}
 639
 640	/* copy in head */
 641	if (params->head)
 642		memcpy(new->head, params->head, new_head_len);
 643	else
 644		memcpy(new->head, old->head, new_head_len);
 645
 646	/* copy in optional tail */
 647	if (params->tail)
 648		memcpy(new->tail, params->tail, new_tail_len);
 649	else
 650		if (old)
 651			memcpy(new->tail, old->tail, new_tail_len);
 652
 653	err = ieee80211_set_probe_resp(sdata, params->probe_resp,
 654				       params->probe_resp_len, csa);
 655	if (err < 0)
 
 656		return err;
 
 657	if (err == 0)
 658		changed |= BSS_CHANGED_AP_PROBE_RESP;
 659
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 660	rcu_assign_pointer(sdata->u.ap.beacon, new);
 661
 662	if (old)
 663		kfree_rcu(old, rcu_head);
 664
 665	return changed;
 666}
 667
 668static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
 669			      struct cfg80211_ap_settings *params)
 670{
 671	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 672	struct ieee80211_local *local = sdata->local;
 673	struct beacon_data *old;
 674	struct ieee80211_sub_if_data *vlan;
 675	u32 changed = BSS_CHANGED_BEACON_INT |
 676		      BSS_CHANGED_BEACON_ENABLED |
 677		      BSS_CHANGED_BEACON |
 678		      BSS_CHANGED_SSID |
 679		      BSS_CHANGED_P2P_PS |
 680		      BSS_CHANGED_TXPOWER;
 681	int err;
 
 
 682
 683	old = sdata_dereference(sdata->u.ap.beacon, sdata);
 684	if (old)
 685		return -EALREADY;
 686
 687	switch (params->smps_mode) {
 688	case NL80211_SMPS_OFF:
 689		sdata->smps_mode = IEEE80211_SMPS_OFF;
 690		break;
 691	case NL80211_SMPS_STATIC:
 692		sdata->smps_mode = IEEE80211_SMPS_STATIC;
 693		break;
 694	case NL80211_SMPS_DYNAMIC:
 695		sdata->smps_mode = IEEE80211_SMPS_DYNAMIC;
 696		break;
 697	default:
 698		return -EINVAL;
 
 
 
 
 
 
 
 
 
 
 699	}
 700	sdata->needed_rx_chains = sdata->local->rx_chains;
 701
 702	mutex_lock(&local->mtx);
 703	err = ieee80211_vif_use_channel(sdata, &params->chandef,
 704					IEEE80211_CHANCTX_SHARED);
 705	if (!err)
 706		ieee80211_vif_copy_chanctx_to_vlans(sdata, false);
 707	mutex_unlock(&local->mtx);
 708	if (err)
 
 709		return err;
 
 710
 711	/*
 712	 * Apply control port protocol, this allows us to
 713	 * not encrypt dynamic WEP control frames.
 714	 */
 715	sdata->control_port_protocol = params->crypto.control_port_ethertype;
 716	sdata->control_port_no_encrypt = params->crypto.control_port_no_encrypt;
 
 
 
 
 717	sdata->encrypt_headroom = ieee80211_cs_headroom(sdata->local,
 718							&params->crypto,
 719							sdata->vif.type);
 720
 721	list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) {
 722		vlan->control_port_protocol =
 723			params->crypto.control_port_ethertype;
 724		vlan->control_port_no_encrypt =
 725			params->crypto.control_port_no_encrypt;
 
 
 
 
 726		vlan->encrypt_headroom =
 727			ieee80211_cs_headroom(sdata->local,
 728					      &params->crypto,
 729					      vlan->vif.type);
 730	}
 731
 732	sdata->vif.bss_conf.beacon_int = params->beacon_interval;
 733	sdata->vif.bss_conf.dtim_period = params->dtim_period;
 734	sdata->vif.bss_conf.enable_beacon = true;
 
 
 
 
 
 
 735
 736	sdata->vif.bss_conf.ssid_len = params->ssid_len;
 737	if (params->ssid_len)
 738		memcpy(sdata->vif.bss_conf.ssid, params->ssid,
 739		       params->ssid_len);
 740	sdata->vif.bss_conf.hidden_ssid =
 741		(params->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE);
 742
 743	memset(&sdata->vif.bss_conf.p2p_noa_attr, 0,
 744	       sizeof(sdata->vif.bss_conf.p2p_noa_attr));
 745	sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow =
 746		params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
 747	if (params->p2p_opp_ps)
 748		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
 749					IEEE80211_P2P_OPPPS_ENABLE_BIT;
 750
 
 
 
 
 
 
 
 
 
 
 
 751	err = ieee80211_assign_beacon(sdata, &params->beacon, NULL);
 752	if (err < 0) {
 753		ieee80211_vif_release_channel(sdata);
 754		return err;
 755	}
 756	changed |= err;
 757
 758	err = drv_start_ap(sdata->local, sdata);
 759	if (err) {
 760		old = sdata_dereference(sdata->u.ap.beacon, sdata);
 761
 762		if (old)
 763			kfree_rcu(old, rcu_head);
 764		RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
 765		ieee80211_vif_release_channel(sdata);
 766		return err;
 767	}
 768
 769	ieee80211_recalc_dtim(local, sdata);
 770	ieee80211_bss_info_change_notify(sdata, changed);
 771
 772	netif_carrier_on(dev);
 773	list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
 774		netif_carrier_on(vlan->dev);
 775
 776	return 0;
 777}
 778
 779static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
 780				   struct cfg80211_beacon_data *params)
 781{
 782	struct ieee80211_sub_if_data *sdata;
 783	struct beacon_data *old;
 784	int err;
 785
 786	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 787	sdata_assert_lock(sdata);
 788
 789	/* don't allow changing the beacon while CSA is in place - offset
 790	 * of channel switch counter may change
 791	 */
 792	if (sdata->vif.csa_active)
 793		return -EBUSY;
 794
 795	old = sdata_dereference(sdata->u.ap.beacon, sdata);
 796	if (!old)
 797		return -ENOENT;
 798
 799	err = ieee80211_assign_beacon(sdata, params, NULL);
 800	if (err < 0)
 801		return err;
 802	ieee80211_bss_info_change_notify(sdata, err);
 803	return 0;
 804}
 805
 806static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
 807{
 808	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 809	struct ieee80211_sub_if_data *vlan;
 810	struct ieee80211_local *local = sdata->local;
 811	struct beacon_data *old_beacon;
 812	struct probe_resp *old_probe_resp;
 813	struct cfg80211_chan_def chandef;
 814
 815	sdata_assert_lock(sdata);
 816
 817	old_beacon = sdata_dereference(sdata->u.ap.beacon, sdata);
 818	if (!old_beacon)
 819		return -ENOENT;
 820	old_probe_resp = sdata_dereference(sdata->u.ap.probe_resp, sdata);
 821
 822	/* abort any running channel switch */
 823	mutex_lock(&local->mtx);
 824	sdata->vif.csa_active = false;
 825	if (sdata->csa_block_tx) {
 826		ieee80211_wake_vif_queues(local, sdata,
 827					  IEEE80211_QUEUE_STOP_REASON_CSA);
 828		sdata->csa_block_tx = false;
 829	}
 830
 831	mutex_unlock(&local->mtx);
 832
 833	kfree(sdata->u.ap.next_beacon);
 834	sdata->u.ap.next_beacon = NULL;
 835
 836	/* turn off carrier for this interface and dependent VLANs */
 837	list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
 838		netif_carrier_off(vlan->dev);
 839	netif_carrier_off(dev);
 840
 841	/* remove beacon and probe response */
 842	RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
 843	RCU_INIT_POINTER(sdata->u.ap.probe_resp, NULL);
 844	kfree_rcu(old_beacon, rcu_head);
 845	if (old_probe_resp)
 846		kfree_rcu(old_probe_resp, rcu_head);
 847	sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF;
 
 
 848
 849	__sta_info_flush(sdata, true);
 850	ieee80211_free_keys(sdata, true);
 851
 852	sdata->vif.bss_conf.enable_beacon = false;
 
 853	sdata->vif.bss_conf.ssid_len = 0;
 854	clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
 855	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
 856
 857	if (sdata->wdev.cac_started) {
 858		chandef = sdata->vif.bss_conf.chandef;
 859		cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
 860		cfg80211_cac_event(sdata->dev, &chandef,
 861				   NL80211_RADAR_CAC_ABORTED,
 862				   GFP_KERNEL);
 863	}
 864
 865	drv_stop_ap(sdata->local, sdata);
 866
 867	/* free all potentially still buffered bcast frames */
 868	local->total_ps_buffered -= skb_queue_len(&sdata->u.ap.ps.bc_buf);
 869	skb_queue_purge(&sdata->u.ap.ps.bc_buf);
 870
 871	mutex_lock(&local->mtx);
 872	ieee80211_vif_copy_chanctx_to_vlans(sdata, true);
 873	ieee80211_vif_release_channel(sdata);
 874	mutex_unlock(&local->mtx);
 875
 876	return 0;
 877}
 878
 879/* Layer 2 Update frame (802.2 Type 1 LLC XID Update response) */
 880struct iapp_layer2_update {
 881	u8 da[ETH_ALEN];	/* broadcast */
 882	u8 sa[ETH_ALEN];	/* STA addr */
 883	__be16 len;		/* 6 */
 884	u8 dsap;		/* 0 */
 885	u8 ssap;		/* 0 */
 886	u8 control;
 887	u8 xid_info[3];
 888} __packed;
 889
 890static void ieee80211_send_layer2_update(struct sta_info *sta)
 891{
 892	struct iapp_layer2_update *msg;
 893	struct sk_buff *skb;
 894
 895	/* Send Level 2 Update Frame to update forwarding tables in layer 2
 896	 * bridge devices */
 897
 898	skb = dev_alloc_skb(sizeof(*msg));
 899	if (!skb)
 900		return;
 901	msg = (struct iapp_layer2_update *)skb_put(skb, sizeof(*msg));
 902
 903	/* 802.2 Type 1 Logical Link Control (LLC) Exchange Identifier (XID)
 904	 * Update response frame; IEEE Std 802.2-1998, 5.4.1.2.1 */
 905
 906	eth_broadcast_addr(msg->da);
 907	memcpy(msg->sa, sta->sta.addr, ETH_ALEN);
 908	msg->len = htons(6);
 909	msg->dsap = 0;
 910	msg->ssap = 0x01;	/* NULL LSAP, CR Bit: Response */
 911	msg->control = 0xaf;	/* XID response lsb.1111F101.
 912				 * F=0 (no poll command; unsolicited frame) */
 913	msg->xid_info[0] = 0x81;	/* XID format identifier */
 914	msg->xid_info[1] = 1;	/* LLC types/classes: Type 1 LLC */
 915	msg->xid_info[2] = 0;	/* XID sender's receive window size (RW) */
 916
 917	skb->dev = sta->sdata->dev;
 918	skb->protocol = eth_type_trans(skb, sta->sdata->dev);
 919	memset(skb->cb, 0, sizeof(skb->cb));
 920	netif_rx_ni(skb);
 921}
 922
 923static int sta_apply_auth_flags(struct ieee80211_local *local,
 924				struct sta_info *sta,
 925				u32 mask, u32 set)
 926{
 927	int ret;
 928
 929	if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
 930	    set & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
 931	    !test_sta_flag(sta, WLAN_STA_AUTH)) {
 932		ret = sta_info_move_state(sta, IEEE80211_STA_AUTH);
 933		if (ret)
 934			return ret;
 935	}
 936
 937	if (mask & BIT(NL80211_STA_FLAG_ASSOCIATED) &&
 938	    set & BIT(NL80211_STA_FLAG_ASSOCIATED) &&
 939	    !test_sta_flag(sta, WLAN_STA_ASSOC)) {
 940		/*
 941		 * When peer becomes associated, init rate control as
 942		 * well. Some drivers require rate control initialized
 943		 * before drv_sta_state() is called.
 944		 */
 945		if (!test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
 946			rate_control_rate_init(sta);
 947
 948		ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
 949		if (ret)
 950			return ret;
 951	}
 952
 953	if (mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
 954		if (set & BIT(NL80211_STA_FLAG_AUTHORIZED))
 955			ret = sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
 956		else if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
 957			ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
 958		else
 959			ret = 0;
 960		if (ret)
 961			return ret;
 962	}
 963
 964	if (mask & BIT(NL80211_STA_FLAG_ASSOCIATED) &&
 965	    !(set & BIT(NL80211_STA_FLAG_ASSOCIATED)) &&
 966	    test_sta_flag(sta, WLAN_STA_ASSOC)) {
 967		ret = sta_info_move_state(sta, IEEE80211_STA_AUTH);
 968		if (ret)
 969			return ret;
 970	}
 971
 972	if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
 973	    !(set & BIT(NL80211_STA_FLAG_AUTHENTICATED)) &&
 974	    test_sta_flag(sta, WLAN_STA_AUTH)) {
 975		ret = sta_info_move_state(sta, IEEE80211_STA_NONE);
 976		if (ret)
 977			return ret;
 978	}
 979
 980	return 0;
 981}
 982
 983static void sta_apply_mesh_params(struct ieee80211_local *local,
 984				  struct sta_info *sta,
 985				  struct station_parameters *params)
 986{
 987#ifdef CONFIG_MAC80211_MESH
 988	struct ieee80211_sub_if_data *sdata = sta->sdata;
 989	u32 changed = 0;
 990
 991	if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) {
 992		switch (params->plink_state) {
 993		case NL80211_PLINK_ESTAB:
 994			if (sta->mesh->plink_state != NL80211_PLINK_ESTAB)
 995				changed = mesh_plink_inc_estab_count(sdata);
 996			sta->mesh->plink_state = params->plink_state;
 
 997
 998			ieee80211_mps_sta_status_update(sta);
 999			changed |= ieee80211_mps_set_sta_local_pm(sta,
1000				      sdata->u.mesh.mshcfg.power_mode);
 
 
 
 
 
1001			break;
1002		case NL80211_PLINK_LISTEN:
1003		case NL80211_PLINK_BLOCKED:
1004		case NL80211_PLINK_OPN_SNT:
1005		case NL80211_PLINK_OPN_RCVD:
1006		case NL80211_PLINK_CNF_RCVD:
1007		case NL80211_PLINK_HOLDING:
1008			if (sta->mesh->plink_state == NL80211_PLINK_ESTAB)
1009				changed = mesh_plink_dec_estab_count(sdata);
1010			sta->mesh->plink_state = params->plink_state;
1011
1012			ieee80211_mps_sta_status_update(sta);
1013			changed |= ieee80211_mps_set_sta_local_pm(sta,
1014					NL80211_MESH_POWER_UNKNOWN);
1015			break;
1016		default:
1017			/*  nothing  */
1018			break;
1019		}
1020	}
1021
1022	switch (params->plink_action) {
1023	case NL80211_PLINK_ACTION_NO_ACTION:
1024		/* nothing */
1025		break;
1026	case NL80211_PLINK_ACTION_OPEN:
1027		changed |= mesh_plink_open(sta);
1028		break;
1029	case NL80211_PLINK_ACTION_BLOCK:
1030		changed |= mesh_plink_block(sta);
1031		break;
1032	}
1033
1034	if (params->local_pm)
1035		changed |= ieee80211_mps_set_sta_local_pm(sta,
1036							  params->local_pm);
1037
1038	ieee80211_mbss_info_change_notify(sdata, changed);
1039#endif
1040}
1041
1042static int sta_apply_parameters(struct ieee80211_local *local,
1043				struct sta_info *sta,
1044				struct station_parameters *params)
1045{
1046	int ret = 0;
1047	struct ieee80211_supported_band *sband;
1048	struct ieee80211_sub_if_data *sdata = sta->sdata;
1049	enum ieee80211_band band = ieee80211_get_sdata_band(sdata);
1050	u32 mask, set;
1051
1052	sband = local->hw.wiphy->bands[band];
 
 
1053
1054	mask = params->sta_flags_mask;
1055	set = params->sta_flags_set;
1056
1057	if (ieee80211_vif_is_mesh(&sdata->vif)) {
1058		/*
1059		 * In mesh mode, ASSOCIATED isn't part of the nl80211
1060		 * API but must follow AUTHENTICATED for driver state.
1061		 */
1062		if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED))
1063			mask |= BIT(NL80211_STA_FLAG_ASSOCIATED);
1064		if (set & BIT(NL80211_STA_FLAG_AUTHENTICATED))
1065			set |= BIT(NL80211_STA_FLAG_ASSOCIATED);
1066	} else if (test_sta_flag(sta, WLAN_STA_TDLS_PEER)) {
1067		/*
1068		 * TDLS -- everything follows authorized, but
1069		 * only becoming authorized is possible, not
1070		 * going back
1071		 */
1072		if (set & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
1073			set |= BIT(NL80211_STA_FLAG_AUTHENTICATED) |
1074			       BIT(NL80211_STA_FLAG_ASSOCIATED);
1075			mask |= BIT(NL80211_STA_FLAG_AUTHENTICATED) |
1076				BIT(NL80211_STA_FLAG_ASSOCIATED);
1077		}
1078	}
1079
1080	if (mask & BIT(NL80211_STA_FLAG_WME) &&
1081	    local->hw.queues >= IEEE80211_NUM_ACS)
1082		sta->sta.wme = set & BIT(NL80211_STA_FLAG_WME);
1083
1084	/* auth flags will be set later for TDLS,
1085	 * and for unassociated stations that move to assocaited */
1086	if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1087	    !((mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) &&
1088	      (set & BIT(NL80211_STA_FLAG_ASSOCIATED)))) {
1089		ret = sta_apply_auth_flags(local, sta, mask, set);
1090		if (ret)
1091			return ret;
1092	}
1093
1094	if (mask & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE)) {
1095		if (set & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE))
1096			set_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE);
1097		else
1098			clear_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE);
1099	}
1100
1101	if (mask & BIT(NL80211_STA_FLAG_MFP)) {
1102		sta->sta.mfp = !!(set & BIT(NL80211_STA_FLAG_MFP));
1103		if (set & BIT(NL80211_STA_FLAG_MFP))
1104			set_sta_flag(sta, WLAN_STA_MFP);
1105		else
1106			clear_sta_flag(sta, WLAN_STA_MFP);
1107	}
1108
1109	if (mask & BIT(NL80211_STA_FLAG_TDLS_PEER)) {
1110		if (set & BIT(NL80211_STA_FLAG_TDLS_PEER))
1111			set_sta_flag(sta, WLAN_STA_TDLS_PEER);
1112		else
1113			clear_sta_flag(sta, WLAN_STA_TDLS_PEER);
1114	}
1115
1116	/* mark TDLS channel switch support, if the AP allows it */
1117	if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1118	    !sdata->u.mgd.tdls_chan_switch_prohibited &&
1119	    params->ext_capab_len >= 4 &&
1120	    params->ext_capab[3] & WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH)
1121		set_sta_flag(sta, WLAN_STA_TDLS_CHAN_SWITCH);
1122
1123	if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1124	    !sdata->u.mgd.tdls_wider_bw_prohibited &&
1125	    ieee80211_hw_check(&local->hw, TDLS_WIDER_BW) &&
1126	    params->ext_capab_len >= 8 &&
1127	    params->ext_capab[7] & WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED)
1128		set_sta_flag(sta, WLAN_STA_TDLS_WIDER_BW);
1129
1130	if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) {
1131		sta->sta.uapsd_queues = params->uapsd_queues;
1132		sta->sta.max_sp = params->max_sp;
1133	}
1134
1135	/* The sender might not have sent the last bit, consider it to be 0 */
1136	if (params->ext_capab_len >= 8) {
1137		u8 val = (params->ext_capab[7] &
1138			  WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB) >> 7;
1139
1140		/* we did get all the bits, take the MSB as well */
1141		if (params->ext_capab_len >= 9) {
1142			u8 val_msb = params->ext_capab[8] &
1143				WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB;
1144			val_msb <<= 1;
1145			val |= val_msb;
1146		}
1147
1148		switch (val) {
1149		case 1:
1150			sta->sta.max_amsdu_subframes = 32;
1151			break;
1152		case 2:
1153			sta->sta.max_amsdu_subframes = 16;
1154			break;
1155		case 3:
1156			sta->sta.max_amsdu_subframes = 8;
1157			break;
1158		default:
1159			sta->sta.max_amsdu_subframes = 0;
1160		}
1161	}
1162
1163	/*
1164	 * cfg80211 validates this (1-2007) and allows setting the AID
1165	 * only when creating a new station entry
1166	 */
1167	if (params->aid)
1168		sta->sta.aid = params->aid;
1169
1170	/*
1171	 * Some of the following updates would be racy if called on an
1172	 * existing station, via ieee80211_change_station(). However,
1173	 * all such changes are rejected by cfg80211 except for updates
1174	 * changing the supported rates on an existing but not yet used
1175	 * TDLS peer.
1176	 */
1177
1178	if (params->listen_interval >= 0)
1179		sta->listen_interval = params->listen_interval;
1180
1181	if (params->supported_rates) {
 
 
 
 
 
 
 
 
 
1182		ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
1183					 sband, params->supported_rates,
1184					 params->supported_rates_len,
1185					 &sta->sta.supp_rates[band]);
1186	}
1187
1188	if (params->ht_capa)
1189		ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
1190						  params->ht_capa, sta);
1191
1192	/* VHT can override some HT caps such as the A-MSDU max length */
1193	if (params->vht_capa)
1194		ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
1195						    params->vht_capa, sta);
1196
 
 
 
 
 
 
 
1197	if (params->opmode_notif_used) {
1198		/* returned value is only needed for rc update, but the
1199		 * rc isn't initialized here yet, so ignore it
1200		 */
1201		__ieee80211_vht_handle_opmode(sdata, sta,
1202					      params->opmode_notif, band);
1203	}
1204
 
 
 
1205	if (ieee80211_vif_is_mesh(&sdata->vif))
1206		sta_apply_mesh_params(local, sta, params);
1207
 
 
 
1208	/* set the STA state after all sta info from usermode has been set */
1209	if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) ||
1210	    set & BIT(NL80211_STA_FLAG_ASSOCIATED)) {
1211		ret = sta_apply_auth_flags(local, sta, mask, set);
1212		if (ret)
1213			return ret;
1214	}
1215
1216	return 0;
1217}
1218
1219static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
1220				 const u8 *mac,
1221				 struct station_parameters *params)
1222{
1223	struct ieee80211_local *local = wiphy_priv(wiphy);
1224	struct sta_info *sta;
1225	struct ieee80211_sub_if_data *sdata;
1226	int err;
1227	int layer2_update;
1228
1229	if (params->vlan) {
1230		sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
1231
1232		if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
1233		    sdata->vif.type != NL80211_IFTYPE_AP)
1234			return -EINVAL;
1235	} else
1236		sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1237
1238	if (ether_addr_equal(mac, sdata->vif.addr))
1239		return -EINVAL;
1240
1241	if (is_multicast_ether_addr(mac))
 
 
 
 
 
1242		return -EINVAL;
1243
1244	sta = sta_info_alloc(sdata, mac, GFP_KERNEL);
1245	if (!sta)
1246		return -ENOMEM;
1247
1248	if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
1249		sta->sta.tdls = true;
1250
1251	err = sta_apply_parameters(local, sta, params);
1252	if (err) {
1253		sta_info_free(local, sta);
1254		return err;
1255	}
1256
1257	/*
1258	 * for TDLS and for unassociated station, rate control should be
1259	 * initialized only when rates are known and station is marked
1260	 * authorized/associated
1261	 */
1262	if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1263	    test_sta_flag(sta, WLAN_STA_ASSOC))
1264		rate_control_rate_init(sta);
1265
1266	layer2_update = sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
1267		sdata->vif.type == NL80211_IFTYPE_AP;
1268
1269	err = sta_info_insert_rcu(sta);
1270	if (err) {
1271		rcu_read_unlock();
1272		return err;
1273	}
1274
1275	if (layer2_update)
1276		ieee80211_send_layer2_update(sta);
1277
1278	rcu_read_unlock();
1279
1280	return 0;
1281}
1282
1283static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
1284				 struct station_del_parameters *params)
1285{
1286	struct ieee80211_sub_if_data *sdata;
1287
1288	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1289
1290	if (params->mac)
1291		return sta_info_destroy_addr_bss(sdata, params->mac);
1292
1293	sta_info_flush(sdata);
1294	return 0;
1295}
1296
1297static int ieee80211_change_station(struct wiphy *wiphy,
1298				    struct net_device *dev, const u8 *mac,
1299				    struct station_parameters *params)
1300{
1301	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1302	struct ieee80211_local *local = wiphy_priv(wiphy);
1303	struct sta_info *sta;
1304	struct ieee80211_sub_if_data *vlansdata;
1305	enum cfg80211_station_type statype;
1306	int err;
1307
1308	mutex_lock(&local->sta_mtx);
1309
1310	sta = sta_info_get_bss(sdata, mac);
1311	if (!sta) {
1312		err = -ENOENT;
1313		goto out_err;
1314	}
1315
1316	switch (sdata->vif.type) {
1317	case NL80211_IFTYPE_MESH_POINT:
1318		if (sdata->u.mesh.user_mpm)
1319			statype = CFG80211_STA_MESH_PEER_USER;
1320		else
1321			statype = CFG80211_STA_MESH_PEER_KERNEL;
1322		break;
1323	case NL80211_IFTYPE_ADHOC:
1324		statype = CFG80211_STA_IBSS;
1325		break;
1326	case NL80211_IFTYPE_STATION:
1327		if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER)) {
1328			statype = CFG80211_STA_AP_STA;
1329			break;
1330		}
1331		if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
1332			statype = CFG80211_STA_TDLS_PEER_ACTIVE;
1333		else
1334			statype = CFG80211_STA_TDLS_PEER_SETUP;
1335		break;
1336	case NL80211_IFTYPE_AP:
1337	case NL80211_IFTYPE_AP_VLAN:
1338		if (test_sta_flag(sta, WLAN_STA_ASSOC))
1339			statype = CFG80211_STA_AP_CLIENT;
1340		else
1341			statype = CFG80211_STA_AP_CLIENT_UNASSOC;
1342		break;
1343	default:
1344		err = -EOPNOTSUPP;
1345		goto out_err;
1346	}
1347
1348	err = cfg80211_check_station_change(wiphy, params, statype);
1349	if (err)
1350		goto out_err;
1351
1352	if (params->vlan && params->vlan != sta->sdata->dev) {
1353		bool prev_4addr = false;
1354		bool new_4addr = false;
1355
1356		vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
1357
1358		if (params->vlan->ieee80211_ptr->use_4addr) {
1359			if (vlansdata->u.vlan.sta) {
1360				err = -EBUSY;
1361				goto out_err;
1362			}
1363
1364			rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
1365			new_4addr = true;
1366		}
1367
1368		if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
1369		    sta->sdata->u.vlan.sta) {
1370			RCU_INIT_POINTER(sta->sdata->u.vlan.sta, NULL);
1371			prev_4addr = true;
1372		}
 
1373
1374		sta->sdata = vlansdata;
1375		ieee80211_check_fast_xmit(sta);
1376
1377		if (sta->sta_state == IEEE80211_STA_AUTHORIZED &&
1378		    prev_4addr != new_4addr) {
1379			if (new_4addr)
1380				atomic_dec(&sta->sdata->bss->num_mcast_sta);
1381			else
1382				atomic_inc(&sta->sdata->bss->num_mcast_sta);
1383		}
1384
1385		ieee80211_send_layer2_update(sta);
1386	}
1387
1388	err = sta_apply_parameters(local, sta, params);
1389	if (err)
1390		goto out_err;
1391
1392	mutex_unlock(&local->sta_mtx);
1393
1394	if ((sdata->vif.type == NL80211_IFTYPE_AP ||
1395	     sdata->vif.type == NL80211_IFTYPE_AP_VLAN) &&
1396	    sta->known_smps_mode != sta->sdata->bss->req_smps &&
1397	    test_sta_flag(sta, WLAN_STA_AUTHORIZED) &&
1398	    sta_info_tx_streams(sta) != 1) {
1399		ht_dbg(sta->sdata,
1400		       "%pM just authorized and MIMO capable - update SMPS\n",
1401		       sta->sta.addr);
1402		ieee80211_send_smps_action(sta->sdata,
1403			sta->sdata->bss->req_smps,
1404			sta->sta.addr,
1405			sta->sdata->vif.bss_conf.bssid);
1406	}
1407
1408	if (sdata->vif.type == NL80211_IFTYPE_STATION &&
1409	    params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
1410		ieee80211_recalc_ps(local);
1411		ieee80211_recalc_ps_vif(sdata);
1412	}
1413
1414	return 0;
1415out_err:
1416	mutex_unlock(&local->sta_mtx);
1417	return err;
1418}
1419
1420#ifdef CONFIG_MAC80211_MESH
1421static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
1422			       const u8 *dst, const u8 *next_hop)
1423{
1424	struct ieee80211_sub_if_data *sdata;
1425	struct mesh_path *mpath;
1426	struct sta_info *sta;
1427
1428	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1429
1430	rcu_read_lock();
1431	sta = sta_info_get(sdata, next_hop);
1432	if (!sta) {
1433		rcu_read_unlock();
1434		return -ENOENT;
1435	}
1436
1437	mpath = mesh_path_add(sdata, dst);
1438	if (IS_ERR(mpath)) {
1439		rcu_read_unlock();
1440		return PTR_ERR(mpath);
1441	}
1442
1443	mesh_path_fix_nexthop(mpath, sta);
1444
1445	rcu_read_unlock();
1446	return 0;
1447}
1448
1449static int ieee80211_del_mpath(struct wiphy *wiphy, struct net_device *dev,
1450			       const u8 *dst)
1451{
1452	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1453
1454	if (dst)
1455		return mesh_path_del(sdata, dst);
1456
1457	mesh_path_flush_by_iface(sdata);
1458	return 0;
1459}
1460
1461static int ieee80211_change_mpath(struct wiphy *wiphy, struct net_device *dev,
1462				  const u8 *dst, const u8 *next_hop)
1463{
1464	struct ieee80211_sub_if_data *sdata;
1465	struct mesh_path *mpath;
1466	struct sta_info *sta;
1467
1468	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1469
1470	rcu_read_lock();
1471
1472	sta = sta_info_get(sdata, next_hop);
1473	if (!sta) {
1474		rcu_read_unlock();
1475		return -ENOENT;
1476	}
1477
1478	mpath = mesh_path_lookup(sdata, dst);
1479	if (!mpath) {
1480		rcu_read_unlock();
1481		return -ENOENT;
1482	}
1483
1484	mesh_path_fix_nexthop(mpath, sta);
1485
1486	rcu_read_unlock();
1487	return 0;
1488}
1489
1490static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
1491			    struct mpath_info *pinfo)
1492{
1493	struct sta_info *next_hop_sta = rcu_dereference(mpath->next_hop);
1494
1495	if (next_hop_sta)
1496		memcpy(next_hop, next_hop_sta->sta.addr, ETH_ALEN);
1497	else
1498		eth_zero_addr(next_hop);
1499
1500	memset(pinfo, 0, sizeof(*pinfo));
1501
1502	pinfo->generation = mesh_paths_generation;
1503
1504	pinfo->filled = MPATH_INFO_FRAME_QLEN |
1505			MPATH_INFO_SN |
1506			MPATH_INFO_METRIC |
1507			MPATH_INFO_EXPTIME |
1508			MPATH_INFO_DISCOVERY_TIMEOUT |
1509			MPATH_INFO_DISCOVERY_RETRIES |
1510			MPATH_INFO_FLAGS;
 
 
1511
1512	pinfo->frame_qlen = mpath->frame_queue.qlen;
1513	pinfo->sn = mpath->sn;
1514	pinfo->metric = mpath->metric;
1515	if (time_before(jiffies, mpath->exp_time))
1516		pinfo->exptime = jiffies_to_msecs(mpath->exp_time - jiffies);
1517	pinfo->discovery_timeout =
1518			jiffies_to_msecs(mpath->discovery_timeout);
1519	pinfo->discovery_retries = mpath->discovery_retries;
1520	if (mpath->flags & MESH_PATH_ACTIVE)
1521		pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE;
1522	if (mpath->flags & MESH_PATH_RESOLVING)
1523		pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
1524	if (mpath->flags & MESH_PATH_SN_VALID)
1525		pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID;
1526	if (mpath->flags & MESH_PATH_FIXED)
1527		pinfo->flags |= NL80211_MPATH_FLAG_FIXED;
1528	if (mpath->flags & MESH_PATH_RESOLVED)
1529		pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED;
 
 
1530}
1531
1532static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
1533			       u8 *dst, u8 *next_hop, struct mpath_info *pinfo)
1534
1535{
1536	struct ieee80211_sub_if_data *sdata;
1537	struct mesh_path *mpath;
1538
1539	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1540
1541	rcu_read_lock();
1542	mpath = mesh_path_lookup(sdata, dst);
1543	if (!mpath) {
1544		rcu_read_unlock();
1545		return -ENOENT;
1546	}
1547	memcpy(dst, mpath->dst, ETH_ALEN);
1548	mpath_set_pinfo(mpath, next_hop, pinfo);
1549	rcu_read_unlock();
1550	return 0;
1551}
1552
1553static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev,
1554				int idx, u8 *dst, u8 *next_hop,
1555				struct mpath_info *pinfo)
1556{
1557	struct ieee80211_sub_if_data *sdata;
1558	struct mesh_path *mpath;
1559
1560	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1561
1562	rcu_read_lock();
1563	mpath = mesh_path_lookup_by_idx(sdata, idx);
1564	if (!mpath) {
1565		rcu_read_unlock();
1566		return -ENOENT;
1567	}
1568	memcpy(dst, mpath->dst, ETH_ALEN);
1569	mpath_set_pinfo(mpath, next_hop, pinfo);
1570	rcu_read_unlock();
1571	return 0;
1572}
1573
1574static void mpp_set_pinfo(struct mesh_path *mpath, u8 *mpp,
1575			  struct mpath_info *pinfo)
1576{
1577	memset(pinfo, 0, sizeof(*pinfo));
1578	memcpy(mpp, mpath->mpp, ETH_ALEN);
1579
1580	pinfo->generation = mpp_paths_generation;
1581}
1582
1583static int ieee80211_get_mpp(struct wiphy *wiphy, struct net_device *dev,
1584			     u8 *dst, u8 *mpp, struct mpath_info *pinfo)
1585
1586{
1587	struct ieee80211_sub_if_data *sdata;
1588	struct mesh_path *mpath;
1589
1590	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1591
1592	rcu_read_lock();
1593	mpath = mpp_path_lookup(sdata, dst);
1594	if (!mpath) {
1595		rcu_read_unlock();
1596		return -ENOENT;
1597	}
1598	memcpy(dst, mpath->dst, ETH_ALEN);
1599	mpp_set_pinfo(mpath, mpp, pinfo);
1600	rcu_read_unlock();
1601	return 0;
1602}
1603
1604static int ieee80211_dump_mpp(struct wiphy *wiphy, struct net_device *dev,
1605			      int idx, u8 *dst, u8 *mpp,
1606			      struct mpath_info *pinfo)
1607{
1608	struct ieee80211_sub_if_data *sdata;
1609	struct mesh_path *mpath;
1610
1611	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1612
1613	rcu_read_lock();
1614	mpath = mpp_path_lookup_by_idx(sdata, idx);
1615	if (!mpath) {
1616		rcu_read_unlock();
1617		return -ENOENT;
1618	}
1619	memcpy(dst, mpath->dst, ETH_ALEN);
1620	mpp_set_pinfo(mpath, mpp, pinfo);
1621	rcu_read_unlock();
1622	return 0;
1623}
1624
1625static int ieee80211_get_mesh_config(struct wiphy *wiphy,
1626				struct net_device *dev,
1627				struct mesh_config *conf)
1628{
1629	struct ieee80211_sub_if_data *sdata;
1630	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1631
1632	memcpy(conf, &(sdata->u.mesh.mshcfg), sizeof(struct mesh_config));
1633	return 0;
1634}
1635
1636static inline bool _chg_mesh_attr(enum nl80211_meshconf_params parm, u32 mask)
1637{
1638	return (mask >> (parm-1)) & 0x1;
1639}
1640
1641static int copy_mesh_setup(struct ieee80211_if_mesh *ifmsh,
1642		const struct mesh_setup *setup)
1643{
1644	u8 *new_ie;
1645	const u8 *old_ie;
1646	struct ieee80211_sub_if_data *sdata = container_of(ifmsh,
1647					struct ieee80211_sub_if_data, u.mesh);
 
1648
1649	/* allocate information elements */
1650	new_ie = NULL;
1651	old_ie = ifmsh->ie;
1652
1653	if (setup->ie_len) {
1654		new_ie = kmemdup(setup->ie, setup->ie_len,
1655				GFP_KERNEL);
1656		if (!new_ie)
1657			return -ENOMEM;
1658	}
1659	ifmsh->ie_len = setup->ie_len;
1660	ifmsh->ie = new_ie;
1661	kfree(old_ie);
1662
1663	/* now copy the rest of the setup parameters */
1664	ifmsh->mesh_id_len = setup->mesh_id_len;
1665	memcpy(ifmsh->mesh_id, setup->mesh_id, ifmsh->mesh_id_len);
1666	ifmsh->mesh_sp_id = setup->sync_method;
1667	ifmsh->mesh_pp_id = setup->path_sel_proto;
1668	ifmsh->mesh_pm_id = setup->path_metric;
1669	ifmsh->user_mpm = setup->user_mpm;
1670	ifmsh->mesh_auth_id = setup->auth_id;
1671	ifmsh->security = IEEE80211_MESH_SEC_NONE;
 
1672	if (setup->is_authenticated)
1673		ifmsh->security |= IEEE80211_MESH_SEC_AUTHED;
1674	if (setup->is_secure)
1675		ifmsh->security |= IEEE80211_MESH_SEC_SECURED;
1676
1677	/* mcast rate setting in Mesh Node */
1678	memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate,
1679						sizeof(setup->mcast_rate));
1680	sdata->vif.bss_conf.basic_rates = setup->basic_rates;
1681
1682	sdata->vif.bss_conf.beacon_int = setup->beacon_interval;
1683	sdata->vif.bss_conf.dtim_period = setup->dtim_period;
1684
 
 
 
 
 
 
 
 
 
 
 
1685	return 0;
1686}
1687
1688static int ieee80211_update_mesh_config(struct wiphy *wiphy,
1689					struct net_device *dev, u32 mask,
1690					const struct mesh_config *nconf)
1691{
1692	struct mesh_config *conf;
1693	struct ieee80211_sub_if_data *sdata;
1694	struct ieee80211_if_mesh *ifmsh;
1695
1696	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1697	ifmsh = &sdata->u.mesh;
1698
1699	/* Set the config options which we are interested in setting */
1700	conf = &(sdata->u.mesh.mshcfg);
1701	if (_chg_mesh_attr(NL80211_MESHCONF_RETRY_TIMEOUT, mask))
1702		conf->dot11MeshRetryTimeout = nconf->dot11MeshRetryTimeout;
1703	if (_chg_mesh_attr(NL80211_MESHCONF_CONFIRM_TIMEOUT, mask))
1704		conf->dot11MeshConfirmTimeout = nconf->dot11MeshConfirmTimeout;
1705	if (_chg_mesh_attr(NL80211_MESHCONF_HOLDING_TIMEOUT, mask))
1706		conf->dot11MeshHoldingTimeout = nconf->dot11MeshHoldingTimeout;
1707	if (_chg_mesh_attr(NL80211_MESHCONF_MAX_PEER_LINKS, mask))
1708		conf->dot11MeshMaxPeerLinks = nconf->dot11MeshMaxPeerLinks;
1709	if (_chg_mesh_attr(NL80211_MESHCONF_MAX_RETRIES, mask))
1710		conf->dot11MeshMaxRetries = nconf->dot11MeshMaxRetries;
1711	if (_chg_mesh_attr(NL80211_MESHCONF_TTL, mask))
1712		conf->dot11MeshTTL = nconf->dot11MeshTTL;
1713	if (_chg_mesh_attr(NL80211_MESHCONF_ELEMENT_TTL, mask))
1714		conf->element_ttl = nconf->element_ttl;
1715	if (_chg_mesh_attr(NL80211_MESHCONF_AUTO_OPEN_PLINKS, mask)) {
1716		if (ifmsh->user_mpm)
1717			return -EBUSY;
1718		conf->auto_open_plinks = nconf->auto_open_plinks;
1719	}
1720	if (_chg_mesh_attr(NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, mask))
1721		conf->dot11MeshNbrOffsetMaxNeighbor =
1722			nconf->dot11MeshNbrOffsetMaxNeighbor;
1723	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, mask))
1724		conf->dot11MeshHWMPmaxPREQretries =
1725			nconf->dot11MeshHWMPmaxPREQretries;
1726	if (_chg_mesh_attr(NL80211_MESHCONF_PATH_REFRESH_TIME, mask))
1727		conf->path_refresh_time = nconf->path_refresh_time;
1728	if (_chg_mesh_attr(NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, mask))
1729		conf->min_discovery_timeout = nconf->min_discovery_timeout;
1730	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, mask))
1731		conf->dot11MeshHWMPactivePathTimeout =
1732			nconf->dot11MeshHWMPactivePathTimeout;
1733	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, mask))
1734		conf->dot11MeshHWMPpreqMinInterval =
1735			nconf->dot11MeshHWMPpreqMinInterval;
1736	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, mask))
1737		conf->dot11MeshHWMPperrMinInterval =
1738			nconf->dot11MeshHWMPperrMinInterval;
1739	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
1740			   mask))
1741		conf->dot11MeshHWMPnetDiameterTraversalTime =
1742			nconf->dot11MeshHWMPnetDiameterTraversalTime;
1743	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOTMODE, mask)) {
1744		conf->dot11MeshHWMPRootMode = nconf->dot11MeshHWMPRootMode;
1745		ieee80211_mesh_root_setup(ifmsh);
1746	}
1747	if (_chg_mesh_attr(NL80211_MESHCONF_GATE_ANNOUNCEMENTS, mask)) {
1748		/* our current gate announcement implementation rides on root
1749		 * announcements, so require this ifmsh to also be a root node
1750		 * */
1751		if (nconf->dot11MeshGateAnnouncementProtocol &&
1752		    !(conf->dot11MeshHWMPRootMode > IEEE80211_ROOTMODE_ROOT)) {
1753			conf->dot11MeshHWMPRootMode = IEEE80211_PROACTIVE_RANN;
1754			ieee80211_mesh_root_setup(ifmsh);
1755		}
1756		conf->dot11MeshGateAnnouncementProtocol =
1757			nconf->dot11MeshGateAnnouncementProtocol;
1758	}
1759	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_RANN_INTERVAL, mask))
1760		conf->dot11MeshHWMPRannInterval =
1761			nconf->dot11MeshHWMPRannInterval;
1762	if (_chg_mesh_attr(NL80211_MESHCONF_FORWARDING, mask))
1763		conf->dot11MeshForwarding = nconf->dot11MeshForwarding;
1764	if (_chg_mesh_attr(NL80211_MESHCONF_RSSI_THRESHOLD, mask)) {
1765		/* our RSSI threshold implementation is supported only for
1766		 * devices that report signal in dBm.
1767		 */
1768		if (!ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM))
1769			return -ENOTSUPP;
1770		conf->rssi_threshold = nconf->rssi_threshold;
1771	}
1772	if (_chg_mesh_attr(NL80211_MESHCONF_HT_OPMODE, mask)) {
1773		conf->ht_opmode = nconf->ht_opmode;
1774		sdata->vif.bss_conf.ht_operation_mode = nconf->ht_opmode;
1775		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_HT);
1776	}
1777	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, mask))
1778		conf->dot11MeshHWMPactivePathToRootTimeout =
1779			nconf->dot11MeshHWMPactivePathToRootTimeout;
1780	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOT_INTERVAL, mask))
1781		conf->dot11MeshHWMProotInterval =
1782			nconf->dot11MeshHWMProotInterval;
1783	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, mask))
1784		conf->dot11MeshHWMPconfirmationInterval =
1785			nconf->dot11MeshHWMPconfirmationInterval;
1786	if (_chg_mesh_attr(NL80211_MESHCONF_POWER_MODE, mask)) {
1787		conf->power_mode = nconf->power_mode;
1788		ieee80211_mps_local_status_update(sdata);
1789	}
1790	if (_chg_mesh_attr(NL80211_MESHCONF_AWAKE_WINDOW, mask))
1791		conf->dot11MeshAwakeWindowDuration =
1792			nconf->dot11MeshAwakeWindowDuration;
1793	if (_chg_mesh_attr(NL80211_MESHCONF_PLINK_TIMEOUT, mask))
1794		conf->plink_timeout = nconf->plink_timeout;
 
 
 
 
 
 
 
 
1795	ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON);
1796	return 0;
1797}
1798
1799static int ieee80211_join_mesh(struct wiphy *wiphy, struct net_device *dev,
1800			       const struct mesh_config *conf,
1801			       const struct mesh_setup *setup)
1802{
1803	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1804	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1805	int err;
1806
1807	memcpy(&ifmsh->mshcfg, conf, sizeof(struct mesh_config));
1808	err = copy_mesh_setup(ifmsh, setup);
1809	if (err)
1810		return err;
1811
 
 
1812	/* can mesh use other SMPS modes? */
1813	sdata->smps_mode = IEEE80211_SMPS_OFF;
1814	sdata->needed_rx_chains = sdata->local->rx_chains;
1815
1816	mutex_lock(&sdata->local->mtx);
1817	err = ieee80211_vif_use_channel(sdata, &setup->chandef,
1818					IEEE80211_CHANCTX_SHARED);
1819	mutex_unlock(&sdata->local->mtx);
1820	if (err)
1821		return err;
1822
1823	return ieee80211_start_mesh(sdata);
1824}
1825
1826static int ieee80211_leave_mesh(struct wiphy *wiphy, struct net_device *dev)
1827{
1828	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1829
1830	ieee80211_stop_mesh(sdata);
1831	mutex_lock(&sdata->local->mtx);
1832	ieee80211_vif_release_channel(sdata);
 
1833	mutex_unlock(&sdata->local->mtx);
1834
1835	return 0;
1836}
1837#endif
1838
1839static int ieee80211_change_bss(struct wiphy *wiphy,
1840				struct net_device *dev,
1841				struct bss_parameters *params)
1842{
1843	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1844	enum ieee80211_band band;
1845	u32 changed = 0;
1846
1847	if (!sdata_dereference(sdata->u.ap.beacon, sdata))
1848		return -ENOENT;
1849
1850	band = ieee80211_get_sdata_band(sdata);
 
 
1851
1852	if (params->use_cts_prot >= 0) {
1853		sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot;
1854		changed |= BSS_CHANGED_ERP_CTS_PROT;
1855	}
1856	if (params->use_short_preamble >= 0) {
1857		sdata->vif.bss_conf.use_short_preamble =
1858			params->use_short_preamble;
1859		changed |= BSS_CHANGED_ERP_PREAMBLE;
1860	}
1861
1862	if (!sdata->vif.bss_conf.use_short_slot &&
1863	    band == IEEE80211_BAND_5GHZ) {
 
1864		sdata->vif.bss_conf.use_short_slot = true;
1865		changed |= BSS_CHANGED_ERP_SLOT;
1866	}
1867
1868	if (params->use_short_slot_time >= 0) {
1869		sdata->vif.bss_conf.use_short_slot =
1870			params->use_short_slot_time;
1871		changed |= BSS_CHANGED_ERP_SLOT;
1872	}
1873
1874	if (params->basic_rates) {
1875		ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
1876					 wiphy->bands[band],
1877					 params->basic_rates,
1878					 params->basic_rates_len,
1879					 &sdata->vif.bss_conf.basic_rates);
1880		changed |= BSS_CHANGED_BASIC_RATES;
 
1881	}
1882
1883	if (params->ap_isolate >= 0) {
1884		if (params->ap_isolate)
1885			sdata->flags |= IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
1886		else
1887			sdata->flags &= ~IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
 
1888	}
1889
1890	if (params->ht_opmode >= 0) {
1891		sdata->vif.bss_conf.ht_operation_mode =
1892			(u16) params->ht_opmode;
1893		changed |= BSS_CHANGED_HT;
1894	}
1895
1896	if (params->p2p_ctwindow >= 0) {
1897		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &=
1898					~IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
1899		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
1900			params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
1901		changed |= BSS_CHANGED_P2P_PS;
1902	}
1903
1904	if (params->p2p_opp_ps > 0) {
1905		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
1906					IEEE80211_P2P_OPPPS_ENABLE_BIT;
1907		changed |= BSS_CHANGED_P2P_PS;
1908	} else if (params->p2p_opp_ps == 0) {
1909		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &=
1910					~IEEE80211_P2P_OPPPS_ENABLE_BIT;
1911		changed |= BSS_CHANGED_P2P_PS;
1912	}
1913
1914	ieee80211_bss_info_change_notify(sdata, changed);
1915
1916	return 0;
1917}
1918
1919static int ieee80211_set_txq_params(struct wiphy *wiphy,
1920				    struct net_device *dev,
1921				    struct ieee80211_txq_params *params)
1922{
1923	struct ieee80211_local *local = wiphy_priv(wiphy);
1924	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1925	struct ieee80211_tx_queue_params p;
1926
1927	if (!local->ops->conf_tx)
1928		return -EOPNOTSUPP;
1929
1930	if (local->hw.queues < IEEE80211_NUM_ACS)
1931		return -EOPNOTSUPP;
1932
1933	memset(&p, 0, sizeof(p));
1934	p.aifs = params->aifs;
1935	p.cw_max = params->cwmax;
1936	p.cw_min = params->cwmin;
1937	p.txop = params->txop;
1938
1939	/*
1940	 * Setting tx queue params disables u-apsd because it's only
1941	 * called in master mode.
1942	 */
1943	p.uapsd = false;
1944
 
 
1945	sdata->tx_conf[params->ac] = p;
1946	if (drv_conf_tx(local, sdata, params->ac, &p)) {
1947		wiphy_debug(local->hw.wiphy,
1948			    "failed to set TX queue parameters for AC %d\n",
1949			    params->ac);
1950		return -EINVAL;
1951	}
1952
1953	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS);
1954
1955	return 0;
1956}
1957
1958#ifdef CONFIG_PM
1959static int ieee80211_suspend(struct wiphy *wiphy,
1960			     struct cfg80211_wowlan *wowlan)
1961{
1962	return __ieee80211_suspend(wiphy_priv(wiphy), wowlan);
1963}
1964
1965static int ieee80211_resume(struct wiphy *wiphy)
1966{
1967	return __ieee80211_resume(wiphy_priv(wiphy));
1968}
1969#else
1970#define ieee80211_suspend NULL
1971#define ieee80211_resume NULL
1972#endif
1973
1974static int ieee80211_scan(struct wiphy *wiphy,
1975			  struct cfg80211_scan_request *req)
1976{
1977	struct ieee80211_sub_if_data *sdata;
1978
1979	sdata = IEEE80211_WDEV_TO_SUB_IF(req->wdev);
1980
1981	switch (ieee80211_vif_type_p2p(&sdata->vif)) {
1982	case NL80211_IFTYPE_STATION:
1983	case NL80211_IFTYPE_ADHOC:
1984	case NL80211_IFTYPE_MESH_POINT:
1985	case NL80211_IFTYPE_P2P_CLIENT:
1986	case NL80211_IFTYPE_P2P_DEVICE:
1987		break;
1988	case NL80211_IFTYPE_P2P_GO:
1989		if (sdata->local->ops->hw_scan)
1990			break;
1991		/*
1992		 * FIXME: implement NoA while scanning in software,
1993		 * for now fall through to allow scanning only when
1994		 * beaconing hasn't been configured yet
1995		 */
 
1996	case NL80211_IFTYPE_AP:
1997		/*
1998		 * If the scan has been forced (and the driver supports
1999		 * forcing), don't care about being beaconing already.
2000		 * This will create problems to the attached stations (e.g. all
2001		 * the  frames sent while scanning on other channel will be
2002		 * lost)
2003		 */
2004		if (sdata->u.ap.beacon &&
2005		    (!(wiphy->features & NL80211_FEATURE_AP_SCAN) ||
2006		     !(req->flags & NL80211_SCAN_FLAG_AP)))
2007			return -EOPNOTSUPP;
2008		break;
 
2009	default:
2010		return -EOPNOTSUPP;
2011	}
2012
2013	return ieee80211_request_scan(sdata, req);
2014}
2015
2016static void ieee80211_abort_scan(struct wiphy *wiphy, struct wireless_dev *wdev)
2017{
2018	ieee80211_scan_cancel(wiphy_priv(wiphy));
2019}
2020
2021static int
2022ieee80211_sched_scan_start(struct wiphy *wiphy,
2023			   struct net_device *dev,
2024			   struct cfg80211_sched_scan_request *req)
2025{
2026	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2027
2028	if (!sdata->local->ops->sched_scan_start)
2029		return -EOPNOTSUPP;
2030
2031	return ieee80211_request_sched_scan_start(sdata, req);
2032}
2033
2034static int
2035ieee80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev)
 
2036{
2037	struct ieee80211_local *local = wiphy_priv(wiphy);
2038
2039	if (!local->ops->sched_scan_stop)
2040		return -EOPNOTSUPP;
2041
2042	return ieee80211_request_sched_scan_stop(local);
2043}
2044
2045static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev,
2046			  struct cfg80211_auth_request *req)
2047{
2048	return ieee80211_mgd_auth(IEEE80211_DEV_TO_SUB_IF(dev), req);
2049}
2050
2051static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
2052			   struct cfg80211_assoc_request *req)
2053{
2054	return ieee80211_mgd_assoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
2055}
2056
2057static int ieee80211_deauth(struct wiphy *wiphy, struct net_device *dev,
2058			    struct cfg80211_deauth_request *req)
2059{
2060	return ieee80211_mgd_deauth(IEEE80211_DEV_TO_SUB_IF(dev), req);
2061}
2062
2063static int ieee80211_disassoc(struct wiphy *wiphy, struct net_device *dev,
2064			      struct cfg80211_disassoc_request *req)
2065{
2066	return ieee80211_mgd_disassoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
2067}
2068
2069static int ieee80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
2070			       struct cfg80211_ibss_params *params)
2071{
2072	return ieee80211_ibss_join(IEEE80211_DEV_TO_SUB_IF(dev), params);
2073}
2074
2075static int ieee80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
2076{
2077	return ieee80211_ibss_leave(IEEE80211_DEV_TO_SUB_IF(dev));
2078}
2079
2080static int ieee80211_join_ocb(struct wiphy *wiphy, struct net_device *dev,
2081			      struct ocb_setup *setup)
2082{
2083	return ieee80211_ocb_join(IEEE80211_DEV_TO_SUB_IF(dev), setup);
2084}
2085
2086static int ieee80211_leave_ocb(struct wiphy *wiphy, struct net_device *dev)
2087{
2088	return ieee80211_ocb_leave(IEEE80211_DEV_TO_SUB_IF(dev));
2089}
2090
2091static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev,
2092				    int rate[IEEE80211_NUM_BANDS])
2093{
2094	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2095
2096	memcpy(sdata->vif.bss_conf.mcast_rate, rate,
2097	       sizeof(int) * IEEE80211_NUM_BANDS);
 
 
2098
2099	return 0;
2100}
2101
2102static int ieee80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
2103{
2104	struct ieee80211_local *local = wiphy_priv(wiphy);
2105	int err;
2106
2107	if (changed & WIPHY_PARAM_FRAG_THRESHOLD) {
2108		ieee80211_check_fast_xmit_all(local);
2109
2110		err = drv_set_frag_threshold(local, wiphy->frag_threshold);
2111
2112		if (err) {
2113			ieee80211_check_fast_xmit_all(local);
2114			return err;
2115		}
2116	}
2117
2118	if ((changed & WIPHY_PARAM_COVERAGE_CLASS) ||
2119	    (changed & WIPHY_PARAM_DYN_ACK)) {
2120		s16 coverage_class;
2121
2122		coverage_class = changed & WIPHY_PARAM_COVERAGE_CLASS ?
2123					wiphy->coverage_class : -1;
2124		err = drv_set_coverage_class(local, coverage_class);
2125
2126		if (err)
2127			return err;
2128	}
2129
2130	if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
2131		err = drv_set_rts_threshold(local, wiphy->rts_threshold);
2132
2133		if (err)
2134			return err;
2135	}
2136
2137	if (changed & WIPHY_PARAM_RETRY_SHORT) {
2138		if (wiphy->retry_short > IEEE80211_MAX_TX_RETRY)
2139			return -EINVAL;
2140		local->hw.conf.short_frame_max_tx_count = wiphy->retry_short;
2141	}
2142	if (changed & WIPHY_PARAM_RETRY_LONG) {
2143		if (wiphy->retry_long > IEEE80211_MAX_TX_RETRY)
2144			return -EINVAL;
2145		local->hw.conf.long_frame_max_tx_count = wiphy->retry_long;
2146	}
2147	if (changed &
2148	    (WIPHY_PARAM_RETRY_SHORT | WIPHY_PARAM_RETRY_LONG))
2149		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_RETRY_LIMITS);
2150
 
 
 
 
 
2151	return 0;
2152}
2153
2154static int ieee80211_set_tx_power(struct wiphy *wiphy,
2155				  struct wireless_dev *wdev,
2156				  enum nl80211_tx_power_setting type, int mbm)
2157{
2158	struct ieee80211_local *local = wiphy_priv(wiphy);
2159	struct ieee80211_sub_if_data *sdata;
2160	enum nl80211_tx_power_setting txp_type = type;
2161	bool update_txp_type = false;
 
2162
2163	if (wdev) {
2164		sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2165
 
 
 
 
 
 
2166		switch (type) {
2167		case NL80211_TX_POWER_AUTOMATIC:
2168			sdata->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
2169			txp_type = NL80211_TX_POWER_LIMITED;
2170			break;
2171		case NL80211_TX_POWER_LIMITED:
2172		case NL80211_TX_POWER_FIXED:
2173			if (mbm < 0 || (mbm % 100))
2174				return -EOPNOTSUPP;
2175			sdata->user_power_level = MBM_TO_DBM(mbm);
2176			break;
2177		}
2178
2179		if (txp_type != sdata->vif.bss_conf.txpower_type) {
2180			update_txp_type = true;
2181			sdata->vif.bss_conf.txpower_type = txp_type;
2182		}
2183
2184		ieee80211_recalc_txpower(sdata, update_txp_type);
2185
2186		return 0;
2187	}
2188
2189	switch (type) {
2190	case NL80211_TX_POWER_AUTOMATIC:
2191		local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
2192		txp_type = NL80211_TX_POWER_LIMITED;
2193		break;
2194	case NL80211_TX_POWER_LIMITED:
2195	case NL80211_TX_POWER_FIXED:
2196		if (mbm < 0 || (mbm % 100))
2197			return -EOPNOTSUPP;
2198		local->user_power_level = MBM_TO_DBM(mbm);
2199		break;
2200	}
2201
2202	mutex_lock(&local->iflist_mtx);
2203	list_for_each_entry(sdata, &local->interfaces, list) {
 
 
 
 
2204		sdata->user_power_level = local->user_power_level;
2205		if (txp_type != sdata->vif.bss_conf.txpower_type)
2206			update_txp_type = true;
2207		sdata->vif.bss_conf.txpower_type = txp_type;
2208	}
2209	list_for_each_entry(sdata, &local->interfaces, list)
 
 
2210		ieee80211_recalc_txpower(sdata, update_txp_type);
 
2211	mutex_unlock(&local->iflist_mtx);
2212
 
 
 
 
 
 
 
 
 
 
 
 
2213	return 0;
2214}
2215
2216static int ieee80211_get_tx_power(struct wiphy *wiphy,
2217				  struct wireless_dev *wdev,
2218				  int *dbm)
2219{
2220	struct ieee80211_local *local = wiphy_priv(wiphy);
2221	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2222
2223	if (local->ops->get_txpower)
2224		return drv_get_txpower(local, sdata, dbm);
2225
2226	if (!local->use_chanctx)
2227		*dbm = local->hw.conf.power_level;
2228	else
2229		*dbm = sdata->vif.bss_conf.txpower;
2230
2231	return 0;
2232}
2233
2234static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
2235				  const u8 *addr)
2236{
2237	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2238
2239	memcpy(&sdata->u.wds.remote_addr, addr, ETH_ALEN);
2240
2241	return 0;
2242}
2243
2244static void ieee80211_rfkill_poll(struct wiphy *wiphy)
2245{
2246	struct ieee80211_local *local = wiphy_priv(wiphy);
2247
2248	drv_rfkill_poll(local);
2249}
2250
2251#ifdef CONFIG_NL80211_TESTMODE
2252static int ieee80211_testmode_cmd(struct wiphy *wiphy,
2253				  struct wireless_dev *wdev,
2254				  void *data, int len)
2255{
2256	struct ieee80211_local *local = wiphy_priv(wiphy);
2257	struct ieee80211_vif *vif = NULL;
2258
2259	if (!local->ops->testmode_cmd)
2260		return -EOPNOTSUPP;
2261
2262	if (wdev) {
2263		struct ieee80211_sub_if_data *sdata;
2264
2265		sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2266		if (sdata->flags & IEEE80211_SDATA_IN_DRIVER)
2267			vif = &sdata->vif;
2268	}
2269
2270	return local->ops->testmode_cmd(&local->hw, vif, data, len);
2271}
2272
2273static int ieee80211_testmode_dump(struct wiphy *wiphy,
2274				   struct sk_buff *skb,
2275				   struct netlink_callback *cb,
2276				   void *data, int len)
2277{
2278	struct ieee80211_local *local = wiphy_priv(wiphy);
2279
2280	if (!local->ops->testmode_dump)
2281		return -EOPNOTSUPP;
2282
2283	return local->ops->testmode_dump(&local->hw, skb, cb, data, len);
2284}
2285#endif
2286
2287int __ieee80211_request_smps_ap(struct ieee80211_sub_if_data *sdata,
2288				enum ieee80211_smps_mode smps_mode)
2289{
2290	struct sta_info *sta;
2291	enum ieee80211_smps_mode old_req;
2292
2293	if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP))
2294		return -EINVAL;
2295
2296	if (sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
2297		return 0;
2298
2299	old_req = sdata->u.ap.req_smps;
2300	sdata->u.ap.req_smps = smps_mode;
2301
2302	/* AUTOMATIC doesn't mean much for AP - don't allow it */
2303	if (old_req == smps_mode ||
2304	    smps_mode == IEEE80211_SMPS_AUTOMATIC)
2305		return 0;
2306
2307	 /* If no associated stations, there's no need to do anything */
2308	if (!atomic_read(&sdata->u.ap.num_mcast_sta)) {
2309		sdata->smps_mode = smps_mode;
2310		ieee80211_queue_work(&sdata->local->hw, &sdata->recalc_smps);
2311		return 0;
2312	}
2313
2314	ht_dbg(sdata,
2315	       "SMPS %d requested in AP mode, sending Action frame to %d stations\n",
2316	       smps_mode, atomic_read(&sdata->u.ap.num_mcast_sta));
2317
2318	mutex_lock(&sdata->local->sta_mtx);
2319	list_for_each_entry(sta, &sdata->local->sta_list, list) {
2320		/*
2321		 * Only stations associated to our AP and
2322		 * associated VLANs
2323		 */
2324		if (sta->sdata->bss != &sdata->u.ap)
2325			continue;
2326
2327		/* This station doesn't support MIMO - skip it */
2328		if (sta_info_tx_streams(sta) == 1)
2329			continue;
2330
2331		/*
2332		 * Don't wake up a STA just to send the action frame
2333		 * unless we are getting more restrictive.
2334		 */
2335		if (test_sta_flag(sta, WLAN_STA_PS_STA) &&
2336		    !ieee80211_smps_is_restrictive(sta->known_smps_mode,
2337						   smps_mode)) {
2338			ht_dbg(sdata, "Won't send SMPS to sleeping STA %pM\n",
2339			       sta->sta.addr);
2340			continue;
2341		}
2342
2343		/*
2344		 * If the STA is not authorized, wait until it gets
2345		 * authorized and the action frame will be sent then.
2346		 */
2347		if (!test_sta_flag(sta, WLAN_STA_AUTHORIZED))
2348			continue;
2349
2350		ht_dbg(sdata, "Sending SMPS to %pM\n", sta->sta.addr);
2351		ieee80211_send_smps_action(sdata, smps_mode, sta->sta.addr,
2352					   sdata->vif.bss_conf.bssid);
2353	}
2354	mutex_unlock(&sdata->local->sta_mtx);
2355
2356	sdata->smps_mode = smps_mode;
2357	ieee80211_queue_work(&sdata->local->hw, &sdata->recalc_smps);
2358
2359	return 0;
2360}
2361
2362int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata,
2363				 enum ieee80211_smps_mode smps_mode)
2364{
2365	const u8 *ap;
2366	enum ieee80211_smps_mode old_req;
2367	int err;
2368	struct sta_info *sta;
2369	bool tdls_peer_found = false;
2370
2371	lockdep_assert_held(&sdata->wdev.mtx);
2372
2373	if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION))
2374		return -EINVAL;
2375
2376	old_req = sdata->u.mgd.req_smps;
2377	sdata->u.mgd.req_smps = smps_mode;
2378
2379	if (old_req == smps_mode &&
2380	    smps_mode != IEEE80211_SMPS_AUTOMATIC)
2381		return 0;
2382
2383	/*
2384	 * If not associated, or current association is not an HT
2385	 * association, there's no need to do anything, just store
2386	 * the new value until we associate.
2387	 */
2388	if (!sdata->u.mgd.associated ||
2389	    sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
2390		return 0;
2391
2392	ap = sdata->u.mgd.associated->bssid;
2393
2394	rcu_read_lock();
2395	list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) {
2396		if (!sta->sta.tdls || sta->sdata != sdata || !sta->uploaded ||
2397		    !test_sta_flag(sta, WLAN_STA_AUTHORIZED))
2398			continue;
2399
2400		tdls_peer_found = true;
2401		break;
2402	}
2403	rcu_read_unlock();
2404
2405	if (smps_mode == IEEE80211_SMPS_AUTOMATIC) {
2406		if (tdls_peer_found || !sdata->u.mgd.powersave)
2407			smps_mode = IEEE80211_SMPS_OFF;
2408		else
2409			smps_mode = IEEE80211_SMPS_DYNAMIC;
2410	}
2411
2412	/* send SM PS frame to AP */
2413	err = ieee80211_send_smps_action(sdata, smps_mode,
2414					 ap, ap);
2415	if (err)
2416		sdata->u.mgd.req_smps = old_req;
2417	else if (smps_mode != IEEE80211_SMPS_OFF && tdls_peer_found)
2418		ieee80211_teardown_tdls_peers(sdata);
2419
2420	return err;
2421}
2422
2423static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
2424				    bool enabled, int timeout)
2425{
2426	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2427	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
2428
2429	if (sdata->vif.type != NL80211_IFTYPE_STATION)
2430		return -EOPNOTSUPP;
2431
2432	if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS))
2433		return -EOPNOTSUPP;
2434
2435	if (enabled == sdata->u.mgd.powersave &&
2436	    timeout == local->dynamic_ps_forced_timeout)
2437		return 0;
2438
2439	sdata->u.mgd.powersave = enabled;
2440	local->dynamic_ps_forced_timeout = timeout;
2441
2442	/* no change, but if automatic follow powersave */
2443	sdata_lock(sdata);
2444	__ieee80211_request_smps_mgd(sdata, sdata->u.mgd.req_smps);
2445	sdata_unlock(sdata);
2446
2447	if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS))
2448		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
2449
2450	ieee80211_recalc_ps(local);
2451	ieee80211_recalc_ps_vif(sdata);
 
2452
2453	return 0;
2454}
2455
2456static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
2457					 struct net_device *dev,
2458					 s32 rssi_thold, u32 rssi_hyst)
2459{
2460	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2461	struct ieee80211_vif *vif = &sdata->vif;
2462	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
2463
2464	if (rssi_thold == bss_conf->cqm_rssi_thold &&
2465	    rssi_hyst == bss_conf->cqm_rssi_hyst)
2466		return 0;
2467
2468	if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER &&
2469	    !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI))
2470		return -EOPNOTSUPP;
2471
2472	bss_conf->cqm_rssi_thold = rssi_thold;
2473	bss_conf->cqm_rssi_hyst = rssi_hyst;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2474	sdata->u.mgd.last_cqm_event_signal = 0;
2475
2476	/* tell the driver upon association, unless already associated */
2477	if (sdata->u.mgd.associated &&
2478	    sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)
2479		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
2480
2481	return 0;
2482}
2483
2484static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
2485				      struct net_device *dev,
2486				      const u8 *addr,
2487				      const struct cfg80211_bitrate_mask *mask)
2488{
2489	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2490	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
2491	int i, ret;
2492
2493	if (!ieee80211_sdata_running(sdata))
2494		return -ENETDOWN;
2495
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2496	if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) {
2497		ret = drv_set_bitrate_mask(local, sdata, mask);
2498		if (ret)
2499			return ret;
2500	}
2501
2502	for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
2503		struct ieee80211_supported_band *sband = wiphy->bands[i];
2504		int j;
2505
2506		sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
2507		memcpy(sdata->rc_rateidx_mcs_mask[i], mask->control[i].ht_mcs,
2508		       sizeof(mask->control[i].ht_mcs));
2509		memcpy(sdata->rc_rateidx_vht_mcs_mask[i],
2510		       mask->control[i].vht_mcs,
2511		       sizeof(mask->control[i].vht_mcs));
2512
2513		sdata->rc_has_mcs_mask[i] = false;
2514		sdata->rc_has_vht_mcs_mask[i] = false;
2515		if (!sband)
2516			continue;
2517
2518		for (j = 0; j < IEEE80211_HT_MCS_MASK_LEN; j++) {
2519			if (~sdata->rc_rateidx_mcs_mask[i][j]) {
2520				sdata->rc_has_mcs_mask[i] = true;
2521				break;
2522			}
2523		}
2524
2525		for (j = 0; j < NL80211_VHT_NSS_MAX; j++) {
2526			if (~sdata->rc_rateidx_vht_mcs_mask[i][j]) {
2527				sdata->rc_has_vht_mcs_mask[i] = true;
2528				break;
2529			}
2530		}
2531	}
2532
2533	return 0;
2534}
2535
2536static int ieee80211_start_radar_detection(struct wiphy *wiphy,
2537					   struct net_device *dev,
2538					   struct cfg80211_chan_def *chandef,
2539					   u32 cac_time_ms)
2540{
2541	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2542	struct ieee80211_local *local = sdata->local;
2543	int err;
2544
2545	mutex_lock(&local->mtx);
2546	if (!list_empty(&local->roc_list) || local->scanning) {
2547		err = -EBUSY;
2548		goto out_unlock;
2549	}
2550
2551	/* whatever, but channel contexts should not complain about that one */
2552	sdata->smps_mode = IEEE80211_SMPS_OFF;
2553	sdata->needed_rx_chains = local->rx_chains;
2554
2555	err = ieee80211_vif_use_channel(sdata, chandef,
2556					IEEE80211_CHANCTX_SHARED);
2557	if (err)
2558		goto out_unlock;
2559
2560	ieee80211_queue_delayed_work(&sdata->local->hw,
2561				     &sdata->dfs_cac_timer_work,
2562				     msecs_to_jiffies(cac_time_ms));
2563
2564 out_unlock:
2565	mutex_unlock(&local->mtx);
2566	return err;
2567}
2568
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2569static struct cfg80211_beacon_data *
2570cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
2571{
2572	struct cfg80211_beacon_data *new_beacon;
2573	u8 *pos;
2574	int len;
2575
2576	len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len +
2577	      beacon->proberesp_ies_len + beacon->assocresp_ies_len +
2578	      beacon->probe_resp_len;
2579
2580	new_beacon = kzalloc(sizeof(*new_beacon) + len, GFP_KERNEL);
2581	if (!new_beacon)
2582		return NULL;
2583
2584	pos = (u8 *)(new_beacon + 1);
2585	if (beacon->head_len) {
2586		new_beacon->head_len = beacon->head_len;
2587		new_beacon->head = pos;
2588		memcpy(pos, beacon->head, beacon->head_len);
2589		pos += beacon->head_len;
2590	}
2591	if (beacon->tail_len) {
2592		new_beacon->tail_len = beacon->tail_len;
2593		new_beacon->tail = pos;
2594		memcpy(pos, beacon->tail, beacon->tail_len);
2595		pos += beacon->tail_len;
2596	}
2597	if (beacon->beacon_ies_len) {
2598		new_beacon->beacon_ies_len = beacon->beacon_ies_len;
2599		new_beacon->beacon_ies = pos;
2600		memcpy(pos, beacon->beacon_ies, beacon->beacon_ies_len);
2601		pos += beacon->beacon_ies_len;
2602	}
2603	if (beacon->proberesp_ies_len) {
2604		new_beacon->proberesp_ies_len = beacon->proberesp_ies_len;
2605		new_beacon->proberesp_ies = pos;
2606		memcpy(pos, beacon->proberesp_ies, beacon->proberesp_ies_len);
2607		pos += beacon->proberesp_ies_len;
2608	}
2609	if (beacon->assocresp_ies_len) {
2610		new_beacon->assocresp_ies_len = beacon->assocresp_ies_len;
2611		new_beacon->assocresp_ies = pos;
2612		memcpy(pos, beacon->assocresp_ies, beacon->assocresp_ies_len);
2613		pos += beacon->assocresp_ies_len;
2614	}
2615	if (beacon->probe_resp_len) {
2616		new_beacon->probe_resp_len = beacon->probe_resp_len;
2617		beacon->probe_resp = pos;
2618		memcpy(pos, beacon->probe_resp, beacon->probe_resp_len);
2619		pos += beacon->probe_resp_len;
2620	}
2621
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2622	return new_beacon;
2623}
2624
2625void ieee80211_csa_finish(struct ieee80211_vif *vif)
2626{
2627	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2628
2629	ieee80211_queue_work(&sdata->local->hw,
2630			     &sdata->csa_finalize_work);
2631}
2632EXPORT_SYMBOL(ieee80211_csa_finish);
2633
2634static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata,
2635					  u32 *changed)
2636{
2637	int err;
2638
2639	switch (sdata->vif.type) {
2640	case NL80211_IFTYPE_AP:
2641		err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon,
2642					      NULL);
2643		kfree(sdata->u.ap.next_beacon);
2644		sdata->u.ap.next_beacon = NULL;
2645
2646		if (err < 0)
2647			return err;
2648		*changed |= err;
2649		break;
2650	case NL80211_IFTYPE_ADHOC:
2651		err = ieee80211_ibss_finish_csa(sdata);
2652		if (err < 0)
2653			return err;
2654		*changed |= err;
2655		break;
2656#ifdef CONFIG_MAC80211_MESH
2657	case NL80211_IFTYPE_MESH_POINT:
2658		err = ieee80211_mesh_finish_csa(sdata);
2659		if (err < 0)
2660			return err;
2661		*changed |= err;
2662		break;
2663#endif
2664	default:
2665		WARN_ON(1);
2666		return -EINVAL;
2667	}
2668
2669	return 0;
2670}
2671
2672static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
2673{
2674	struct ieee80211_local *local = sdata->local;
2675	u32 changed = 0;
2676	int err;
2677
2678	sdata_assert_lock(sdata);
2679	lockdep_assert_held(&local->mtx);
2680	lockdep_assert_held(&local->chanctx_mtx);
2681
2682	/*
2683	 * using reservation isn't immediate as it may be deferred until later
2684	 * with multi-vif. once reservation is complete it will re-schedule the
2685	 * work with no reserved_chanctx so verify chandef to check if it
2686	 * completed successfully
2687	 */
2688
2689	if (sdata->reserved_chanctx) {
2690		/*
2691		 * with multi-vif csa driver may call ieee80211_csa_finish()
2692		 * many times while waiting for other interfaces to use their
2693		 * reservations
2694		 */
2695		if (sdata->reserved_ready)
2696			return 0;
2697
2698		return ieee80211_vif_use_reserved_context(sdata);
2699	}
2700
2701	if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef,
2702					&sdata->csa_chandef))
2703		return -EINVAL;
2704
2705	sdata->vif.csa_active = false;
2706
2707	err = ieee80211_set_after_csa_beacon(sdata, &changed);
2708	if (err)
2709		return err;
2710
2711	ieee80211_bss_info_change_notify(sdata, changed);
2712
2713	if (sdata->csa_block_tx) {
2714		ieee80211_wake_vif_queues(local, sdata,
2715					  IEEE80211_QUEUE_STOP_REASON_CSA);
2716		sdata->csa_block_tx = false;
2717	}
2718
2719	err = drv_post_channel_switch(sdata);
2720	if (err)
2721		return err;
2722
2723	cfg80211_ch_switch_notify(sdata->dev, &sdata->csa_chandef);
2724
2725	return 0;
2726}
2727
2728static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
2729{
2730	if (__ieee80211_csa_finalize(sdata)) {
2731		sdata_info(sdata, "failed to finalize CSA, disconnecting\n");
2732		cfg80211_stop_iface(sdata->local->hw.wiphy, &sdata->wdev,
2733				    GFP_KERNEL);
2734	}
2735}
2736
2737void ieee80211_csa_finalize_work(struct work_struct *work)
2738{
2739	struct ieee80211_sub_if_data *sdata =
2740		container_of(work, struct ieee80211_sub_if_data,
2741			     csa_finalize_work);
2742	struct ieee80211_local *local = sdata->local;
2743
2744	sdata_lock(sdata);
2745	mutex_lock(&local->mtx);
2746	mutex_lock(&local->chanctx_mtx);
2747
2748	/* AP might have been stopped while waiting for the lock. */
2749	if (!sdata->vif.csa_active)
2750		goto unlock;
2751
2752	if (!ieee80211_sdata_running(sdata))
2753		goto unlock;
2754
2755	ieee80211_csa_finalize(sdata);
2756
2757unlock:
2758	mutex_unlock(&local->chanctx_mtx);
2759	mutex_unlock(&local->mtx);
2760	sdata_unlock(sdata);
2761}
2762
2763static int ieee80211_set_csa_beacon(struct ieee80211_sub_if_data *sdata,
2764				    struct cfg80211_csa_settings *params,
2765				    u32 *changed)
2766{
2767	struct ieee80211_csa_settings csa = {};
2768	int err;
2769
2770	switch (sdata->vif.type) {
2771	case NL80211_IFTYPE_AP:
2772		sdata->u.ap.next_beacon =
2773			cfg80211_beacon_dup(&params->beacon_after);
2774		if (!sdata->u.ap.next_beacon)
2775			return -ENOMEM;
2776
2777		/*
2778		 * With a count of 0, we don't have to wait for any
2779		 * TBTT before switching, so complete the CSA
2780		 * immediately.  In theory, with a count == 1 we
2781		 * should delay the switch until just before the next
2782		 * TBTT, but that would complicate things so we switch
2783		 * immediately too.  If we would delay the switch
2784		 * until the next TBTT, we would have to set the probe
2785		 * response here.
2786		 *
2787		 * TODO: A channel switch with count <= 1 without
2788		 * sending a CSA action frame is kind of useless,
2789		 * because the clients won't know we're changing
2790		 * channels.  The action frame must be implemented
2791		 * either here or in the userspace.
2792		 */
2793		if (params->count <= 1)
2794			break;
2795
2796		if ((params->n_counter_offsets_beacon >
2797		     IEEE80211_MAX_CSA_COUNTERS_NUM) ||
2798		    (params->n_counter_offsets_presp >
2799		     IEEE80211_MAX_CSA_COUNTERS_NUM))
2800			return -EINVAL;
2801
2802		csa.counter_offsets_beacon = params->counter_offsets_beacon;
2803		csa.counter_offsets_presp = params->counter_offsets_presp;
2804		csa.n_counter_offsets_beacon = params->n_counter_offsets_beacon;
2805		csa.n_counter_offsets_presp = params->n_counter_offsets_presp;
2806		csa.count = params->count;
2807
2808		err = ieee80211_assign_beacon(sdata, &params->beacon_csa, &csa);
2809		if (err < 0) {
2810			kfree(sdata->u.ap.next_beacon);
2811			return err;
2812		}
2813		*changed |= err;
2814
2815		break;
2816	case NL80211_IFTYPE_ADHOC:
2817		if (!sdata->vif.bss_conf.ibss_joined)
2818			return -EINVAL;
2819
2820		if (params->chandef.width != sdata->u.ibss.chandef.width)
2821			return -EINVAL;
2822
2823		switch (params->chandef.width) {
2824		case NL80211_CHAN_WIDTH_40:
2825			if (cfg80211_get_chandef_type(&params->chandef) !=
2826			    cfg80211_get_chandef_type(&sdata->u.ibss.chandef))
2827				return -EINVAL;
2828		case NL80211_CHAN_WIDTH_5:
2829		case NL80211_CHAN_WIDTH_10:
2830		case NL80211_CHAN_WIDTH_20_NOHT:
2831		case NL80211_CHAN_WIDTH_20:
2832			break;
2833		default:
2834			return -EINVAL;
2835		}
2836
2837		/* changes into another band are not supported */
2838		if (sdata->u.ibss.chandef.chan->band !=
2839		    params->chandef.chan->band)
2840			return -EINVAL;
2841
2842		/* see comments in the NL80211_IFTYPE_AP block */
2843		if (params->count > 1) {
2844			err = ieee80211_ibss_csa_beacon(sdata, params);
2845			if (err < 0)
2846				return err;
2847			*changed |= err;
2848		}
2849
2850		ieee80211_send_action_csa(sdata, params);
2851
2852		break;
2853#ifdef CONFIG_MAC80211_MESH
2854	case NL80211_IFTYPE_MESH_POINT: {
2855		struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
2856
2857		if (params->chandef.width != sdata->vif.bss_conf.chandef.width)
2858			return -EINVAL;
2859
2860		/* changes into another band are not supported */
2861		if (sdata->vif.bss_conf.chandef.chan->band !=
2862		    params->chandef.chan->band)
2863			return -EINVAL;
2864
2865		if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_NONE) {
2866			ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_INIT;
2867			if (!ifmsh->pre_value)
2868				ifmsh->pre_value = 1;
2869			else
2870				ifmsh->pre_value++;
2871		}
2872
2873		/* see comments in the NL80211_IFTYPE_AP block */
2874		if (params->count > 1) {
2875			err = ieee80211_mesh_csa_beacon(sdata, params);
2876			if (err < 0) {
2877				ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_NONE;
2878				return err;
2879			}
2880			*changed |= err;
2881		}
2882
2883		if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_INIT)
2884			ieee80211_send_action_csa(sdata, params);
2885
2886		break;
2887		}
2888#endif
2889	default:
2890		return -EOPNOTSUPP;
2891	}
2892
2893	return 0;
2894}
2895
2896static int
2897__ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
2898			   struct cfg80211_csa_settings *params)
2899{
2900	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2901	struct ieee80211_local *local = sdata->local;
2902	struct ieee80211_channel_switch ch_switch;
2903	struct ieee80211_chanctx_conf *conf;
2904	struct ieee80211_chanctx *chanctx;
2905	u32 changed = 0;
2906	int err;
2907
2908	sdata_assert_lock(sdata);
2909	lockdep_assert_held(&local->mtx);
2910
2911	if (!list_empty(&local->roc_list) || local->scanning)
2912		return -EBUSY;
2913
2914	if (sdata->wdev.cac_started)
2915		return -EBUSY;
2916
2917	if (cfg80211_chandef_identical(&params->chandef,
2918				       &sdata->vif.bss_conf.chandef))
2919		return -EINVAL;
2920
2921	/* don't allow another channel switch if one is already active. */
2922	if (sdata->vif.csa_active)
2923		return -EBUSY;
2924
2925	mutex_lock(&local->chanctx_mtx);
2926	conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
2927					 lockdep_is_held(&local->chanctx_mtx));
2928	if (!conf) {
2929		err = -EBUSY;
2930		goto out;
2931	}
2932
2933	chanctx = container_of(conf, struct ieee80211_chanctx, conf);
2934	if (!chanctx) {
2935		err = -EBUSY;
2936		goto out;
2937	}
2938
 
 
2939	ch_switch.timestamp = 0;
2940	ch_switch.device_timestamp = 0;
2941	ch_switch.block_tx = params->block_tx;
2942	ch_switch.chandef = params->chandef;
2943	ch_switch.count = params->count;
2944
2945	err = drv_pre_channel_switch(sdata, &ch_switch);
2946	if (err)
2947		goto out;
2948
2949	err = ieee80211_vif_reserve_chanctx(sdata, &params->chandef,
2950					    chanctx->mode,
2951					    params->radar_required);
2952	if (err)
2953		goto out;
2954
2955	/* if reservation is invalid then this will fail */
2956	err = ieee80211_check_combinations(sdata, NULL, chanctx->mode, 0);
2957	if (err) {
2958		ieee80211_vif_unreserve_chanctx(sdata);
2959		goto out;
2960	}
2961
2962	err = ieee80211_set_csa_beacon(sdata, params, &changed);
2963	if (err) {
2964		ieee80211_vif_unreserve_chanctx(sdata);
2965		goto out;
2966	}
2967
2968	sdata->csa_chandef = params->chandef;
2969	sdata->csa_block_tx = params->block_tx;
2970	sdata->vif.csa_active = true;
2971
2972	if (sdata->csa_block_tx)
2973		ieee80211_stop_vif_queues(local, sdata,
2974					  IEEE80211_QUEUE_STOP_REASON_CSA);
2975
2976	cfg80211_ch_switch_started_notify(sdata->dev, &sdata->csa_chandef,
2977					  params->count);
2978
2979	if (changed) {
2980		ieee80211_bss_info_change_notify(sdata, changed);
2981		drv_channel_switch_beacon(sdata, &params->chandef);
2982	} else {
2983		/* if the beacon didn't change, we can finalize immediately */
2984		ieee80211_csa_finalize(sdata);
2985	}
2986
2987out:
2988	mutex_unlock(&local->chanctx_mtx);
2989	return err;
2990}
2991
2992int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
2993			     struct cfg80211_csa_settings *params)
2994{
2995	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2996	struct ieee80211_local *local = sdata->local;
2997	int err;
2998
2999	mutex_lock(&local->mtx);
3000	err = __ieee80211_channel_switch(wiphy, dev, params);
3001	mutex_unlock(&local->mtx);
3002
3003	return err;
3004}
3005
3006u64 ieee80211_mgmt_tx_cookie(struct ieee80211_local *local)
3007{
3008	lockdep_assert_held(&local->mtx);
3009
3010	local->roc_cookie_counter++;
3011
3012	/* wow, you wrapped 64 bits ... more likely a bug */
3013	if (WARN_ON(local->roc_cookie_counter == 0))
3014		local->roc_cookie_counter++;
3015
3016	return local->roc_cookie_counter;
3017}
3018
3019int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,
3020			     u64 *cookie, gfp_t gfp)
3021{
3022	unsigned long spin_flags;
3023	struct sk_buff *ack_skb;
3024	int id;
3025
3026	ack_skb = skb_copy(skb, gfp);
3027	if (!ack_skb)
3028		return -ENOMEM;
3029
3030	spin_lock_irqsave(&local->ack_status_lock, spin_flags);
3031	id = idr_alloc(&local->ack_status_frames, ack_skb,
3032		       1, 0x10000, GFP_ATOMIC);
3033	spin_unlock_irqrestore(&local->ack_status_lock, spin_flags);
3034
3035	if (id < 0) {
3036		kfree_skb(ack_skb);
3037		return -ENOMEM;
3038	}
3039
3040	IEEE80211_SKB_CB(skb)->ack_frame_id = id;
3041
3042	*cookie = ieee80211_mgmt_tx_cookie(local);
3043	IEEE80211_SKB_CB(ack_skb)->ack.cookie = *cookie;
3044
3045	return 0;
3046}
3047
3048static void ieee80211_mgmt_frame_register(struct wiphy *wiphy,
 
3049					  struct wireless_dev *wdev,
3050					  u16 frame_type, bool reg)
3051{
3052	struct ieee80211_local *local = wiphy_priv(wiphy);
3053	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3054
3055	switch (frame_type) {
3056	case IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ:
3057		if (reg) {
3058			local->probe_req_reg++;
3059			sdata->vif.probe_req_reg++;
3060		} else {
3061			if (local->probe_req_reg)
3062				local->probe_req_reg--;
3063
3064			if (sdata->vif.probe_req_reg)
3065				sdata->vif.probe_req_reg--;
3066		}
3067
3068		if (!local->open_count)
3069			break;
3070
3071		if (sdata->vif.probe_req_reg == 1)
3072			drv_config_iface_filter(local, sdata, FIF_PROBE_REQ,
3073						FIF_PROBE_REQ);
3074		else if (sdata->vif.probe_req_reg == 0)
3075			drv_config_iface_filter(local, sdata, 0,
3076						FIF_PROBE_REQ);
3077
 
3078		ieee80211_configure_filter(local);
3079		break;
3080	default:
3081		break;
3082	}
3083}
3084
3085static int ieee80211_set_antenna(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant)
3086{
3087	struct ieee80211_local *local = wiphy_priv(wiphy);
3088
3089	if (local->started)
3090		return -EOPNOTSUPP;
3091
3092	return drv_set_antenna(local, tx_ant, rx_ant);
3093}
3094
3095static int ieee80211_get_antenna(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant)
3096{
3097	struct ieee80211_local *local = wiphy_priv(wiphy);
3098
3099	return drv_get_antenna(local, tx_ant, rx_ant);
3100}
3101
3102static int ieee80211_set_rekey_data(struct wiphy *wiphy,
3103				    struct net_device *dev,
3104				    struct cfg80211_gtk_rekey_data *data)
3105{
3106	struct ieee80211_local *local = wiphy_priv(wiphy);
3107	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3108
3109	if (!local->ops->set_rekey_data)
3110		return -EOPNOTSUPP;
3111
3112	drv_set_rekey_data(local, sdata, data);
3113
3114	return 0;
3115}
3116
3117static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
3118				  const u8 *peer, u64 *cookie)
3119{
3120	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3121	struct ieee80211_local *local = sdata->local;
3122	struct ieee80211_qos_hdr *nullfunc;
3123	struct sk_buff *skb;
3124	int size = sizeof(*nullfunc);
3125	__le16 fc;
3126	bool qos;
3127	struct ieee80211_tx_info *info;
3128	struct sta_info *sta;
3129	struct ieee80211_chanctx_conf *chanctx_conf;
3130	enum ieee80211_band band;
3131	int ret;
3132
3133	/* the lock is needed to assign the cookie later */
3134	mutex_lock(&local->mtx);
3135
3136	rcu_read_lock();
3137	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
3138	if (WARN_ON(!chanctx_conf)) {
3139		ret = -EINVAL;
3140		goto unlock;
3141	}
3142	band = chanctx_conf->def.chan->band;
3143	sta = sta_info_get_bss(sdata, peer);
3144	if (sta) {
3145		qos = sta->sta.wme;
3146	} else {
3147		ret = -ENOLINK;
3148		goto unlock;
3149	}
3150
3151	if (qos) {
3152		fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
3153				 IEEE80211_STYPE_QOS_NULLFUNC |
3154				 IEEE80211_FCTL_FROMDS);
3155	} else {
3156		size -= 2;
3157		fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
3158				 IEEE80211_STYPE_NULLFUNC |
3159				 IEEE80211_FCTL_FROMDS);
3160	}
3161
3162	skb = dev_alloc_skb(local->hw.extra_tx_headroom + size);
3163	if (!skb) {
3164		ret = -ENOMEM;
3165		goto unlock;
3166	}
3167
3168	skb->dev = dev;
3169
3170	skb_reserve(skb, local->hw.extra_tx_headroom);
3171
3172	nullfunc = (void *) skb_put(skb, size);
3173	nullfunc->frame_control = fc;
3174	nullfunc->duration_id = 0;
3175	memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN);
3176	memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN);
3177	memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN);
3178	nullfunc->seq_ctrl = 0;
3179
3180	info = IEEE80211_SKB_CB(skb);
3181
3182	info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS |
3183		       IEEE80211_TX_INTFL_NL80211_FRAME_TX;
3184	info->band = band;
3185
3186	skb_set_queue_mapping(skb, IEEE80211_AC_VO);
3187	skb->priority = 7;
3188	if (qos)
3189		nullfunc->qos_ctrl = cpu_to_le16(7);
3190
3191	ret = ieee80211_attach_ack_skb(local, skb, cookie, GFP_ATOMIC);
3192	if (ret) {
3193		kfree_skb(skb);
3194		goto unlock;
3195	}
3196
3197	local_bh_disable();
3198	ieee80211_xmit(sdata, sta, skb);
3199	local_bh_enable();
3200
3201	ret = 0;
3202unlock:
3203	rcu_read_unlock();
3204	mutex_unlock(&local->mtx);
3205
3206	return ret;
3207}
3208
3209static int ieee80211_cfg_get_channel(struct wiphy *wiphy,
3210				     struct wireless_dev *wdev,
3211				     struct cfg80211_chan_def *chandef)
3212{
3213	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
3214	struct ieee80211_local *local = wiphy_priv(wiphy);
3215	struct ieee80211_chanctx_conf *chanctx_conf;
3216	int ret = -ENODATA;
3217
3218	rcu_read_lock();
3219	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
3220	if (chanctx_conf) {
3221		*chandef = sdata->vif.bss_conf.chandef;
3222		ret = 0;
3223	} else if (local->open_count > 0 &&
3224		   local->open_count == local->monitors &&
3225		   sdata->vif.type == NL80211_IFTYPE_MONITOR) {
3226		if (local->use_chanctx)
3227			*chandef = local->monitor_chandef;
3228		else
3229			*chandef = local->_oper_chandef;
3230		ret = 0;
3231	}
3232	rcu_read_unlock();
3233
3234	return ret;
3235}
3236
3237#ifdef CONFIG_PM
3238static void ieee80211_set_wakeup(struct wiphy *wiphy, bool enabled)
3239{
3240	drv_set_wakeup(wiphy_priv(wiphy), enabled);
3241}
3242#endif
3243
3244static int ieee80211_set_qos_map(struct wiphy *wiphy,
3245				 struct net_device *dev,
3246				 struct cfg80211_qos_map *qos_map)
3247{
3248	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3249	struct mac80211_qos_map *new_qos_map, *old_qos_map;
3250
3251	if (qos_map) {
3252		new_qos_map = kzalloc(sizeof(*new_qos_map), GFP_KERNEL);
3253		if (!new_qos_map)
3254			return -ENOMEM;
3255		memcpy(&new_qos_map->qos_map, qos_map, sizeof(*qos_map));
3256	} else {
3257		/* A NULL qos_map was passed to disable QoS mapping */
3258		new_qos_map = NULL;
3259	}
3260
3261	old_qos_map = sdata_dereference(sdata->qos_map, sdata);
3262	rcu_assign_pointer(sdata->qos_map, new_qos_map);
3263	if (old_qos_map)
3264		kfree_rcu(old_qos_map, rcu_head);
3265
3266	return 0;
3267}
3268
3269static int ieee80211_set_ap_chanwidth(struct wiphy *wiphy,
3270				      struct net_device *dev,
3271				      struct cfg80211_chan_def *chandef)
3272{
3273	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3274	int ret;
3275	u32 changed = 0;
3276
3277	ret = ieee80211_vif_change_bandwidth(sdata, chandef, &changed);
3278	if (ret == 0)
3279		ieee80211_bss_info_change_notify(sdata, changed);
3280
3281	return ret;
3282}
3283
3284static int ieee80211_add_tx_ts(struct wiphy *wiphy, struct net_device *dev,
3285			       u8 tsid, const u8 *peer, u8 up,
3286			       u16 admitted_time)
3287{
3288	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3289	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3290	int ac = ieee802_1d_to_ac[up];
3291
3292	if (sdata->vif.type != NL80211_IFTYPE_STATION)
3293		return -EOPNOTSUPP;
3294
3295	if (!(sdata->wmm_acm & BIT(up)))
3296		return -EINVAL;
3297
3298	if (ifmgd->tx_tspec[ac].admitted_time)
3299		return -EBUSY;
3300
3301	if (admitted_time) {
3302		ifmgd->tx_tspec[ac].admitted_time = 32 * admitted_time;
3303		ifmgd->tx_tspec[ac].tsid = tsid;
3304		ifmgd->tx_tspec[ac].up = up;
3305	}
3306
3307	return 0;
3308}
3309
3310static int ieee80211_del_tx_ts(struct wiphy *wiphy, struct net_device *dev,
3311			       u8 tsid, const u8 *peer)
3312{
3313	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3314	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3315	struct ieee80211_local *local = wiphy_priv(wiphy);
3316	int ac;
3317
3318	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
3319		struct ieee80211_sta_tx_tspec *tx_tspec = &ifmgd->tx_tspec[ac];
3320
3321		/* skip unused entries */
3322		if (!tx_tspec->admitted_time)
3323			continue;
3324
3325		if (tx_tspec->tsid != tsid)
3326			continue;
3327
3328		/* due to this new packets will be reassigned to non-ACM ACs */
3329		tx_tspec->up = -1;
3330
3331		/* Make sure that all packets have been sent to avoid to
3332		 * restore the QoS params on packets that are still on the
3333		 * queues.
3334		 */
3335		synchronize_net();
3336		ieee80211_flush_queues(local, sdata, false);
3337
3338		/* restore the normal QoS parameters
3339		 * (unconditionally to avoid races)
3340		 */
3341		tx_tspec->action = TX_TSPEC_ACTION_STOP_DOWNGRADE;
3342		tx_tspec->downgraded = false;
3343		ieee80211_sta_handle_tspec_ac_params(sdata);
3344
3345		/* finally clear all the data */
3346		memset(tx_tspec, 0, sizeof(*tx_tspec));
3347
3348		return 0;
3349	}
3350
3351	return -ENOENT;
3352}
3353
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3354const struct cfg80211_ops mac80211_config_ops = {
3355	.add_virtual_intf = ieee80211_add_iface,
3356	.del_virtual_intf = ieee80211_del_iface,
3357	.change_virtual_intf = ieee80211_change_iface,
3358	.start_p2p_device = ieee80211_start_p2p_device,
3359	.stop_p2p_device = ieee80211_stop_p2p_device,
3360	.add_key = ieee80211_add_key,
3361	.del_key = ieee80211_del_key,
3362	.get_key = ieee80211_get_key,
3363	.set_default_key = ieee80211_config_default_key,
3364	.set_default_mgmt_key = ieee80211_config_default_mgmt_key,
 
3365	.start_ap = ieee80211_start_ap,
3366	.change_beacon = ieee80211_change_beacon,
3367	.stop_ap = ieee80211_stop_ap,
3368	.add_station = ieee80211_add_station,
3369	.del_station = ieee80211_del_station,
3370	.change_station = ieee80211_change_station,
3371	.get_station = ieee80211_get_station,
3372	.dump_station = ieee80211_dump_station,
3373	.dump_survey = ieee80211_dump_survey,
3374#ifdef CONFIG_MAC80211_MESH
3375	.add_mpath = ieee80211_add_mpath,
3376	.del_mpath = ieee80211_del_mpath,
3377	.change_mpath = ieee80211_change_mpath,
3378	.get_mpath = ieee80211_get_mpath,
3379	.dump_mpath = ieee80211_dump_mpath,
3380	.get_mpp = ieee80211_get_mpp,
3381	.dump_mpp = ieee80211_dump_mpp,
3382	.update_mesh_config = ieee80211_update_mesh_config,
3383	.get_mesh_config = ieee80211_get_mesh_config,
3384	.join_mesh = ieee80211_join_mesh,
3385	.leave_mesh = ieee80211_leave_mesh,
3386#endif
3387	.join_ocb = ieee80211_join_ocb,
3388	.leave_ocb = ieee80211_leave_ocb,
3389	.change_bss = ieee80211_change_bss,
3390	.set_txq_params = ieee80211_set_txq_params,
3391	.set_monitor_channel = ieee80211_set_monitor_channel,
3392	.suspend = ieee80211_suspend,
3393	.resume = ieee80211_resume,
3394	.scan = ieee80211_scan,
3395	.abort_scan = ieee80211_abort_scan,
3396	.sched_scan_start = ieee80211_sched_scan_start,
3397	.sched_scan_stop = ieee80211_sched_scan_stop,
3398	.auth = ieee80211_auth,
3399	.assoc = ieee80211_assoc,
3400	.deauth = ieee80211_deauth,
3401	.disassoc = ieee80211_disassoc,
3402	.join_ibss = ieee80211_join_ibss,
3403	.leave_ibss = ieee80211_leave_ibss,
3404	.set_mcast_rate = ieee80211_set_mcast_rate,
3405	.set_wiphy_params = ieee80211_set_wiphy_params,
3406	.set_tx_power = ieee80211_set_tx_power,
3407	.get_tx_power = ieee80211_get_tx_power,
3408	.set_wds_peer = ieee80211_set_wds_peer,
3409	.rfkill_poll = ieee80211_rfkill_poll,
3410	CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
3411	CFG80211_TESTMODE_DUMP(ieee80211_testmode_dump)
3412	.set_power_mgmt = ieee80211_set_power_mgmt,
3413	.set_bitrate_mask = ieee80211_set_bitrate_mask,
3414	.remain_on_channel = ieee80211_remain_on_channel,
3415	.cancel_remain_on_channel = ieee80211_cancel_remain_on_channel,
3416	.mgmt_tx = ieee80211_mgmt_tx,
3417	.mgmt_tx_cancel_wait = ieee80211_mgmt_tx_cancel_wait,
3418	.set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
3419	.mgmt_frame_register = ieee80211_mgmt_frame_register,
 
 
3420	.set_antenna = ieee80211_set_antenna,
3421	.get_antenna = ieee80211_get_antenna,
3422	.set_rekey_data = ieee80211_set_rekey_data,
3423	.tdls_oper = ieee80211_tdls_oper,
3424	.tdls_mgmt = ieee80211_tdls_mgmt,
3425	.tdls_channel_switch = ieee80211_tdls_channel_switch,
3426	.tdls_cancel_channel_switch = ieee80211_tdls_cancel_channel_switch,
3427	.probe_client = ieee80211_probe_client,
3428	.set_noack_map = ieee80211_set_noack_map,
3429#ifdef CONFIG_PM
3430	.set_wakeup = ieee80211_set_wakeup,
3431#endif
3432	.get_channel = ieee80211_cfg_get_channel,
3433	.start_radar_detection = ieee80211_start_radar_detection,
 
3434	.channel_switch = ieee80211_channel_switch,
3435	.set_qos_map = ieee80211_set_qos_map,
3436	.set_ap_chanwidth = ieee80211_set_ap_chanwidth,
3437	.add_tx_ts = ieee80211_add_tx_ts,
3438	.del_tx_ts = ieee80211_del_tx_ts,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3439};