Linux Audio

Check our new training course

Loading...
v6.8
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * cfg80211 MLME SAP interface
   4 *
   5 * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
   6 * Copyright (c) 2015		Intel Deutschland GmbH
   7 * Copyright (C) 2019-2020, 2022-2023 Intel Corporation
   8 */
   9
  10#include <linux/kernel.h>
  11#include <linux/module.h>
  12#include <linux/etherdevice.h>
  13#include <linux/netdevice.h>
  14#include <linux/nl80211.h>
  15#include <linux/slab.h>
  16#include <linux/wireless.h>
  17#include <net/cfg80211.h>
  18#include <net/iw_handler.h>
  19#include "core.h"
  20#include "nl80211.h"
  21#include "rdev-ops.h"
  22
  23
  24void cfg80211_rx_assoc_resp(struct net_device *dev,
  25			    const struct cfg80211_rx_assoc_resp_data *data)
 
  26{
  27	struct wireless_dev *wdev = dev->ieee80211_ptr;
  28	struct wiphy *wiphy = wdev->wiphy;
  29	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  30	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)data->buf;
  31	struct cfg80211_connect_resp_params cr = {
  32		.timeout_reason = NL80211_TIMEOUT_UNSPECIFIED,
  33		.req_ie = data->req_ies,
  34		.req_ie_len = data->req_ies_len,
  35		.resp_ie = mgmt->u.assoc_resp.variable,
  36		.resp_ie_len = data->len -
  37			       offsetof(struct ieee80211_mgmt,
  38					u.assoc_resp.variable),
  39		.status = le16_to_cpu(mgmt->u.assoc_resp.status_code),
  40		.ap_mld_addr = data->ap_mld_addr,
  41	};
  42	unsigned int link_id;
  43
  44	for (link_id = 0; link_id < ARRAY_SIZE(data->links); link_id++) {
  45		cr.links[link_id].status = data->links[link_id].status;
  46		cr.links[link_id].bss = data->links[link_id].bss;
  47
  48		WARN_ON_ONCE(cr.links[link_id].status != WLAN_STATUS_SUCCESS &&
  49			     (!cr.ap_mld_addr || !cr.links[link_id].bss));
  50
  51		if (!cr.links[link_id].bss)
  52			continue;
  53		cr.links[link_id].bssid = data->links[link_id].bss->bssid;
  54		cr.links[link_id].addr = data->links[link_id].addr;
  55		/* need to have local link addresses for MLO connections */
  56		WARN_ON(cr.ap_mld_addr &&
  57			!is_valid_ether_addr(cr.links[link_id].addr));
  58
  59		BUG_ON(!cr.links[link_id].bss->channel);
  60
  61		if (cr.links[link_id].bss->channel->band == NL80211_BAND_S1GHZ) {
  62			WARN_ON(link_id);
  63			cr.resp_ie = (u8 *)&mgmt->u.s1g_assoc_resp.variable;
  64			cr.resp_ie_len = data->len -
  65					 offsetof(struct ieee80211_mgmt,
  66						  u.s1g_assoc_resp.variable);
  67		}
  68
  69		if (cr.ap_mld_addr)
  70			cr.valid_links |= BIT(link_id);
  71	}
  72
  73	trace_cfg80211_send_rx_assoc(dev, data);
  74
  75	/*
  76	 * This is a bit of a hack, we don't notify userspace of
  77	 * a (re-)association reply if we tried to send a reassoc
  78	 * and got a reject -- we only try again with an assoc
  79	 * frame instead of reassoc.
  80	 */
  81	if (cfg80211_sme_rx_assoc_resp(wdev, cr.status)) {
  82		for (link_id = 0; link_id < ARRAY_SIZE(data->links); link_id++) {
  83			struct cfg80211_bss *bss = data->links[link_id].bss;
  84
  85			if (!bss)
  86				continue;
  87
  88			cfg80211_unhold_bss(bss_from_pub(bss));
  89			cfg80211_put_bss(wiphy, bss);
  90		}
  91		return;
  92	}
  93
  94	nl80211_send_rx_assoc(rdev, dev, data);
 
  95	/* update current_bss etc., consumes the bss reference */
  96	__cfg80211_connect_result(dev, &cr, cr.status == WLAN_STATUS_SUCCESS);
  97}
  98EXPORT_SYMBOL(cfg80211_rx_assoc_resp);
  99
 100static void cfg80211_process_auth(struct wireless_dev *wdev,
 101				  const u8 *buf, size_t len)
 102{
 103	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
 104
 105	nl80211_send_rx_auth(rdev, wdev->netdev, buf, len, GFP_KERNEL);
 106	cfg80211_sme_rx_auth(wdev, buf, len);
 107}
 108
 109static void cfg80211_process_deauth(struct wireless_dev *wdev,
 110				    const u8 *buf, size_t len,
 111				    bool reconnect)
 112{
 113	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
 114	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
 115	const u8 *bssid = mgmt->bssid;
 116	u16 reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
 117	bool from_ap = !ether_addr_equal(mgmt->sa, wdev->netdev->dev_addr);
 118
 119	nl80211_send_deauth(rdev, wdev->netdev, buf, len, reconnect, GFP_KERNEL);
 120
 121	if (!wdev->connected || !ether_addr_equal(wdev->u.client.connected_addr, bssid))
 
 122		return;
 123
 124	__cfg80211_disconnected(wdev->netdev, NULL, 0, reason_code, from_ap);
 125	cfg80211_sme_deauth(wdev);
 126}
 127
 128static void cfg80211_process_disassoc(struct wireless_dev *wdev,
 129				      const u8 *buf, size_t len,
 130				      bool reconnect)
 131{
 132	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
 133	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
 134	const u8 *bssid = mgmt->bssid;
 135	u16 reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
 136	bool from_ap = !ether_addr_equal(mgmt->sa, wdev->netdev->dev_addr);
 137
 138	nl80211_send_disassoc(rdev, wdev->netdev, buf, len, reconnect,
 139			      GFP_KERNEL);
 140
 141	if (WARN_ON(!wdev->connected ||
 142		    !ether_addr_equal(wdev->u.client.connected_addr, bssid)))
 143		return;
 144
 145	__cfg80211_disconnected(wdev->netdev, NULL, 0, reason_code, from_ap);
 146	cfg80211_sme_disassoc(wdev);
 147}
 148
 149void cfg80211_rx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len)
 150{
 151	struct wireless_dev *wdev = dev->ieee80211_ptr;
 152	struct ieee80211_mgmt *mgmt = (void *)buf;
 153
 154	lockdep_assert_wiphy(wdev->wiphy);
 155
 156	trace_cfg80211_rx_mlme_mgmt(dev, buf, len);
 157
 158	if (WARN_ON(len < 2))
 159		return;
 160
 161	if (ieee80211_is_auth(mgmt->frame_control))
 162		cfg80211_process_auth(wdev, buf, len);
 163	else if (ieee80211_is_deauth(mgmt->frame_control))
 164		cfg80211_process_deauth(wdev, buf, len, false);
 165	else if (ieee80211_is_disassoc(mgmt->frame_control))
 166		cfg80211_process_disassoc(wdev, buf, len, false);
 167}
 168EXPORT_SYMBOL(cfg80211_rx_mlme_mgmt);
 169
 170void cfg80211_auth_timeout(struct net_device *dev, const u8 *addr)
 171{
 172	struct wireless_dev *wdev = dev->ieee80211_ptr;
 173	struct wiphy *wiphy = wdev->wiphy;
 174	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 175
 176	trace_cfg80211_send_auth_timeout(dev, addr);
 177
 178	nl80211_send_auth_timeout(rdev, dev, addr, GFP_KERNEL);
 179	cfg80211_sme_auth_timeout(wdev);
 180}
 181EXPORT_SYMBOL(cfg80211_auth_timeout);
 182
 183void cfg80211_assoc_failure(struct net_device *dev,
 184			    struct cfg80211_assoc_failure *data)
 185{
 186	struct wireless_dev *wdev = dev->ieee80211_ptr;
 187	struct wiphy *wiphy = wdev->wiphy;
 188	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 189	const u8 *addr = data->ap_mld_addr ?: data->bss[0]->bssid;
 190	int i;
 191
 192	trace_cfg80211_send_assoc_failure(dev, data);
 193
 194	if (data->timeout) {
 195		nl80211_send_assoc_timeout(rdev, dev, addr, GFP_KERNEL);
 196		cfg80211_sme_assoc_timeout(wdev);
 197	} else {
 198		cfg80211_sme_abandon_assoc(wdev);
 199	}
 200
 201	for (i = 0; i < ARRAY_SIZE(data->bss); i++) {
 202		struct cfg80211_bss *bss = data->bss[i];
 
 
 203
 204		if (!bss)
 205			continue;
 
 
 206
 207		cfg80211_unhold_bss(bss_from_pub(bss));
 208		cfg80211_put_bss(wiphy, bss);
 209	}
 
 210}
 211EXPORT_SYMBOL(cfg80211_assoc_failure);
 212
 213void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len,
 214			   bool reconnect)
 215{
 216	struct wireless_dev *wdev = dev->ieee80211_ptr;
 217	struct ieee80211_mgmt *mgmt = (void *)buf;
 218
 219	lockdep_assert_wiphy(wdev->wiphy);
 220
 221	trace_cfg80211_tx_mlme_mgmt(dev, buf, len, reconnect);
 222
 223	if (WARN_ON(len < 2))
 224		return;
 225
 226	if (ieee80211_is_deauth(mgmt->frame_control))
 227		cfg80211_process_deauth(wdev, buf, len, reconnect);
 228	else
 229		cfg80211_process_disassoc(wdev, buf, len, reconnect);
 230}
 231EXPORT_SYMBOL(cfg80211_tx_mlme_mgmt);
 232
 233void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr,
 234				  enum nl80211_key_type key_type, int key_id,
 235				  const u8 *tsc, gfp_t gfp)
 236{
 237	struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
 238	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 239#ifdef CONFIG_CFG80211_WEXT
 240	union iwreq_data wrqu;
 241	char *buf = kmalloc(128, gfp);
 242
 243	if (buf) {
 244		sprintf(buf, "MLME-MICHAELMICFAILURE.indication("
 245			"keyid=%d %scast addr=%pM)", key_id,
 246			key_type == NL80211_KEYTYPE_GROUP ? "broad" : "uni",
 247			addr);
 248		memset(&wrqu, 0, sizeof(wrqu));
 249		wrqu.data.length = strlen(buf);
 250		wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
 251		kfree(buf);
 252	}
 253#endif
 254
 255	trace_cfg80211_michael_mic_failure(dev, addr, key_type, key_id, tsc);
 256	nl80211_michael_mic_failure(rdev, dev, addr, key_type, key_id, tsc, gfp);
 257}
 258EXPORT_SYMBOL(cfg80211_michael_mic_failure);
 259
 260/* some MLME handling for userspace SME */
 261int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
 262		       struct net_device *dev,
 263		       struct cfg80211_auth_request *req)
 
 
 
 
 
 
 264{
 265	struct wireless_dev *wdev = dev->ieee80211_ptr;
 
 
 
 
 
 
 
 
 
 
 
 266
 267	lockdep_assert_wiphy(wdev->wiphy);
 268
 269	if (!req->bss)
 270		return -ENOENT;
 271
 272	if (req->link_id >= 0 &&
 273	    !(wdev->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO))
 274		return -EINVAL;
 275
 276	if (req->auth_type == NL80211_AUTHTYPE_SHARED_KEY) {
 277		if (!req->key || !req->key_len ||
 278		    req->key_idx < 0 || req->key_idx > 3)
 279			return -EINVAL;
 280	}
 281
 282	if (wdev->connected &&
 283	    ether_addr_equal(req->bss->bssid, wdev->u.client.connected_addr))
 284		return -EALREADY;
 285
 286	if (ether_addr_equal(req->bss->bssid, dev->dev_addr) ||
 287	    (req->link_id >= 0 &&
 288	     ether_addr_equal(req->ap_mld_addr, dev->dev_addr)))
 289		return -EINVAL;
 
 
 
 290
 291	return rdev_auth(rdev, dev, req);
 
 292}
 293
 294/*  Do a logical ht_capa &= ht_capa_mask.  */
 295void cfg80211_oper_and_ht_capa(struct ieee80211_ht_cap *ht_capa,
 296			       const struct ieee80211_ht_cap *ht_capa_mask)
 297{
 298	int i;
 299	u8 *p1, *p2;
 300	if (!ht_capa_mask) {
 301		memset(ht_capa, 0, sizeof(*ht_capa));
 302		return;
 303	}
 304
 305	p1 = (u8*)(ht_capa);
 306	p2 = (u8*)(ht_capa_mask);
 307	for (i = 0; i < sizeof(*ht_capa); i++)
 308		p1[i] &= p2[i];
 309}
 310
 311/*  Do a logical vht_capa &= vht_capa_mask.  */
 312void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap *vht_capa,
 313				const struct ieee80211_vht_cap *vht_capa_mask)
 314{
 315	int i;
 316	u8 *p1, *p2;
 317	if (!vht_capa_mask) {
 318		memset(vht_capa, 0, sizeof(*vht_capa));
 319		return;
 320	}
 321
 322	p1 = (u8*)(vht_capa);
 323	p2 = (u8*)(vht_capa_mask);
 324	for (i = 0; i < sizeof(*vht_capa); i++)
 325		p1[i] &= p2[i];
 326}
 327
 328/* Note: caller must cfg80211_put_bss() regardless of result */
 329int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
 330			struct net_device *dev,
 
 
 
 331			struct cfg80211_assoc_request *req)
 332{
 333	struct wireless_dev *wdev = dev->ieee80211_ptr;
 334	int err, i, j;
 335
 336	lockdep_assert_wiphy(wdev->wiphy);
 337
 338	for (i = 1; i < ARRAY_SIZE(req->links); i++) {
 339		if (!req->links[i].bss)
 340			continue;
 341		for (j = 0; j < i; j++) {
 342			if (req->links[i].bss == req->links[j].bss)
 343				return -EINVAL;
 344		}
 345
 346		if (ether_addr_equal(req->links[i].bss->bssid, dev->dev_addr))
 347			return -EINVAL;
 348	}
 349
 350	if (wdev->connected &&
 351	    (!req->prev_bssid ||
 352	     !ether_addr_equal(wdev->u.client.connected_addr, req->prev_bssid)))
 353		return -EALREADY;
 354
 355	if ((req->bss && ether_addr_equal(req->bss->bssid, dev->dev_addr)) ||
 356	    (req->link_id >= 0 &&
 357	     ether_addr_equal(req->ap_mld_addr, dev->dev_addr)))
 358		return -EINVAL;
 359
 360	cfg80211_oper_and_ht_capa(&req->ht_capa_mask,
 361				  rdev->wiphy.ht_capa_mod_mask);
 362	cfg80211_oper_and_vht_capa(&req->vht_capa_mask,
 363				   rdev->wiphy.vht_capa_mod_mask);
 364
 365	err = rdev_assoc(rdev, dev, req);
 366	if (!err) {
 367		int link_id;
 
 
 368
 369		if (req->bss) {
 370			cfg80211_ref_bss(&rdev->wiphy, req->bss);
 371			cfg80211_hold_bss(bss_from_pub(req->bss));
 372		}
 
 373
 374		for (link_id = 0; link_id < ARRAY_SIZE(req->links); link_id++) {
 375			if (!req->links[link_id].bss)
 376				continue;
 377			cfg80211_ref_bss(&rdev->wiphy, req->links[link_id].bss);
 378			cfg80211_hold_bss(bss_from_pub(req->links[link_id].bss));
 379		}
 380	}
 381	return err;
 382}
 383
 384int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
 385			 struct net_device *dev, const u8 *bssid,
 386			 const u8 *ie, int ie_len, u16 reason,
 387			 bool local_state_change)
 388{
 389	struct wireless_dev *wdev = dev->ieee80211_ptr;
 390	struct cfg80211_deauth_request req = {
 391		.bssid = bssid,
 392		.reason_code = reason,
 393		.ie = ie,
 394		.ie_len = ie_len,
 395		.local_state_change = local_state_change,
 396	};
 397
 398	lockdep_assert_wiphy(wdev->wiphy);
 399
 400	if (local_state_change &&
 401	    (!wdev->connected ||
 402	     !ether_addr_equal(wdev->u.client.connected_addr, bssid)))
 403		return 0;
 404
 405	if (ether_addr_equal(wdev->disconnect_bssid, bssid) ||
 406	    (wdev->connected &&
 407	     ether_addr_equal(wdev->u.client.connected_addr, bssid)))
 408		wdev->conn_owner_nlportid = 0;
 409
 410	return rdev_deauth(rdev, dev, &req);
 411}
 412
 413int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
 414			   struct net_device *dev, const u8 *ap_addr,
 415			   const u8 *ie, int ie_len, u16 reason,
 416			   bool local_state_change)
 417{
 418	struct wireless_dev *wdev = dev->ieee80211_ptr;
 419	struct cfg80211_disassoc_request req = {
 420		.reason_code = reason,
 421		.local_state_change = local_state_change,
 422		.ie = ie,
 423		.ie_len = ie_len,
 424		.ap_addr = ap_addr,
 425	};
 426	int err;
 427
 428	lockdep_assert_wiphy(wdev->wiphy);
 429
 430	if (!wdev->connected)
 431		return -ENOTCONN;
 432
 433	if (memcmp(wdev->u.client.connected_addr, ap_addr, ETH_ALEN))
 
 
 434		return -ENOTCONN;
 435
 436	err = rdev_disassoc(rdev, dev, &req);
 437	if (err)
 438		return err;
 439
 440	/* driver should have reported the disassoc */
 441	WARN_ON(wdev->connected);
 442	return 0;
 443}
 444
 445void cfg80211_mlme_down(struct cfg80211_registered_device *rdev,
 446			struct net_device *dev)
 447{
 448	struct wireless_dev *wdev = dev->ieee80211_ptr;
 449	u8 bssid[ETH_ALEN];
 450
 451	lockdep_assert_wiphy(wdev->wiphy);
 452
 453	if (!rdev->ops->deauth)
 454		return;
 455
 456	if (!wdev->connected)
 457		return;
 458
 459	memcpy(bssid, wdev->u.client.connected_addr, ETH_ALEN);
 460	cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0,
 461			     WLAN_REASON_DEAUTH_LEAVING, false);
 462}
 463
 464struct cfg80211_mgmt_registration {
 465	struct list_head list;
 466	struct wireless_dev *wdev;
 467
 468	u32 nlportid;
 469
 470	int match_len;
 471
 472	__le16 frame_type;
 473
 474	bool multicast_rx;
 475
 476	u8 match[];
 477};
 478
 479static void cfg80211_mgmt_registrations_update(struct wireless_dev *wdev)
 480{
 481	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
 482	struct wireless_dev *tmp;
 483	struct cfg80211_mgmt_registration *reg;
 484	struct mgmt_frame_regs upd = {};
 485
 486	lockdep_assert_held(&rdev->wiphy.mtx);
 487
 488	spin_lock_bh(&rdev->mgmt_registrations_lock);
 489	if (!wdev->mgmt_registrations_need_update) {
 490		spin_unlock_bh(&rdev->mgmt_registrations_lock);
 491		return;
 492	}
 493
 494	rcu_read_lock();
 495	list_for_each_entry_rcu(tmp, &rdev->wiphy.wdev_list, list) {
 496		list_for_each_entry(reg, &tmp->mgmt_registrations, list) {
 497			u32 mask = BIT(le16_to_cpu(reg->frame_type) >> 4);
 498			u32 mcast_mask = 0;
 499
 500			if (reg->multicast_rx)
 501				mcast_mask = mask;
 502
 503			upd.global_stypes |= mask;
 504			upd.global_mcast_stypes |= mcast_mask;
 505
 506			if (tmp == wdev) {
 507				upd.interface_stypes |= mask;
 508				upd.interface_mcast_stypes |= mcast_mask;
 509			}
 510		}
 511	}
 512	rcu_read_unlock();
 513
 514	wdev->mgmt_registrations_need_update = 0;
 515	spin_unlock_bh(&rdev->mgmt_registrations_lock);
 516
 517	rdev_update_mgmt_frame_registrations(rdev, wdev, &upd);
 518}
 519
 520void cfg80211_mgmt_registrations_update_wk(struct work_struct *wk)
 521{
 522	struct cfg80211_registered_device *rdev;
 523	struct wireless_dev *wdev;
 524
 525	rdev = container_of(wk, struct cfg80211_registered_device,
 526			    mgmt_registrations_update_wk);
 527
 528	wiphy_lock(&rdev->wiphy);
 529	list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list)
 530		cfg80211_mgmt_registrations_update(wdev);
 531	wiphy_unlock(&rdev->wiphy);
 532}
 533
 534int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_portid,
 535				u16 frame_type, const u8 *match_data,
 536				int match_len, bool multicast_rx,
 537				struct netlink_ext_ack *extack)
 538{
 539	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
 540	struct cfg80211_mgmt_registration *reg, *nreg;
 541	int err = 0;
 542	u16 mgmt_type;
 543	bool update_multicast = false;
 544
 545	if (!wdev->wiphy->mgmt_stypes)
 546		return -EOPNOTSUPP;
 547
 548	if ((frame_type & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT) {
 549		NL_SET_ERR_MSG(extack, "frame type not management");
 550		return -EINVAL;
 551	}
 552
 553	if (frame_type & ~(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) {
 554		NL_SET_ERR_MSG(extack, "Invalid frame type");
 555		return -EINVAL;
 556	}
 557
 558	mgmt_type = (frame_type & IEEE80211_FCTL_STYPE) >> 4;
 559	if (!(wdev->wiphy->mgmt_stypes[wdev->iftype].rx & BIT(mgmt_type))) {
 560		NL_SET_ERR_MSG(extack,
 561			       "Registration to specific type not supported");
 562		return -EINVAL;
 563	}
 564
 565	/*
 566	 * To support Pre Association Security Negotiation (PASN), registration
 567	 * for authentication frames should be supported. However, as some
 568	 * versions of the user space daemons wrongly register to all types of
 569	 * authentication frames (which might result in unexpected behavior)
 570	 * allow such registration if the request is for a specific
 571	 * authentication algorithm number.
 572	 */
 573	if (wdev->iftype == NL80211_IFTYPE_STATION &&
 574	    (frame_type & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_AUTH &&
 575	    !(match_data && match_len >= 2)) {
 576		NL_SET_ERR_MSG(extack,
 577			       "Authentication algorithm number required");
 578		return -EINVAL;
 579	}
 580
 581	nreg = kzalloc(sizeof(*reg) + match_len, GFP_KERNEL);
 582	if (!nreg)
 583		return -ENOMEM;
 584
 585	spin_lock_bh(&rdev->mgmt_registrations_lock);
 586
 587	list_for_each_entry(reg, &wdev->mgmt_registrations, list) {
 588		int mlen = min(match_len, reg->match_len);
 589
 590		if (frame_type != le16_to_cpu(reg->frame_type))
 591			continue;
 592
 593		if (memcmp(reg->match, match_data, mlen) == 0) {
 594			if (reg->multicast_rx != multicast_rx) {
 595				update_multicast = true;
 596				reg->multicast_rx = multicast_rx;
 597				break;
 598			}
 599			NL_SET_ERR_MSG(extack, "Match already configured");
 600			err = -EALREADY;
 601			break;
 602		}
 603	}
 604
 605	if (err)
 606		goto out;
 607
 608	if (update_multicast) {
 609		kfree(nreg);
 610	} else {
 611		memcpy(nreg->match, match_data, match_len);
 612		nreg->match_len = match_len;
 613		nreg->nlportid = snd_portid;
 614		nreg->frame_type = cpu_to_le16(frame_type);
 615		nreg->wdev = wdev;
 616		nreg->multicast_rx = multicast_rx;
 617		list_add(&nreg->list, &wdev->mgmt_registrations);
 618	}
 619	wdev->mgmt_registrations_need_update = 1;
 620	spin_unlock_bh(&rdev->mgmt_registrations_lock);
 621
 622	cfg80211_mgmt_registrations_update(wdev);
 623
 624	return 0;
 625
 626 out:
 627	kfree(nreg);
 628	spin_unlock_bh(&rdev->mgmt_registrations_lock);
 629
 630	return err;
 631}
 632
 633void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlportid)
 634{
 635	struct wiphy *wiphy = wdev->wiphy;
 636	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 637	struct cfg80211_mgmt_registration *reg, *tmp;
 638
 639	spin_lock_bh(&rdev->mgmt_registrations_lock);
 640
 641	list_for_each_entry_safe(reg, tmp, &wdev->mgmt_registrations, list) {
 642		if (reg->nlportid != nlportid)
 643			continue;
 644
 645		list_del(&reg->list);
 646		kfree(reg);
 647
 648		wdev->mgmt_registrations_need_update = 1;
 649		schedule_work(&rdev->mgmt_registrations_update_wk);
 650	}
 651
 652	spin_unlock_bh(&rdev->mgmt_registrations_lock);
 653
 654	if (nlportid && rdev->crit_proto_nlportid == nlportid) {
 655		rdev->crit_proto_nlportid = 0;
 656		rdev_crit_proto_stop(rdev, wdev);
 657	}
 658
 659	if (nlportid == wdev->ap_unexpected_nlportid)
 660		wdev->ap_unexpected_nlportid = 0;
 661}
 662
 663void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev)
 664{
 665	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
 666	struct cfg80211_mgmt_registration *reg, *tmp;
 667
 668	spin_lock_bh(&rdev->mgmt_registrations_lock);
 669	list_for_each_entry_safe(reg, tmp, &wdev->mgmt_registrations, list) {
 670		list_del(&reg->list);
 671		kfree(reg);
 672	}
 673	wdev->mgmt_registrations_need_update = 1;
 674	spin_unlock_bh(&rdev->mgmt_registrations_lock);
 675
 676	cfg80211_mgmt_registrations_update(wdev);
 677}
 678
 679static bool cfg80211_allowed_address(struct wireless_dev *wdev, const u8 *addr)
 680{
 681	int i;
 682
 683	for_each_valid_link(wdev, i) {
 684		if (ether_addr_equal(addr, wdev->links[i].addr))
 685			return true;
 686	}
 687
 688	return ether_addr_equal(addr, wdev_address(wdev));
 689}
 690
 691static bool cfg80211_allowed_random_address(struct wireless_dev *wdev,
 692					    const struct ieee80211_mgmt *mgmt)
 693{
 694	if (ieee80211_is_auth(mgmt->frame_control) ||
 695	    ieee80211_is_deauth(mgmt->frame_control)) {
 696		/* Allow random TA to be used with authentication and
 697		 * deauthentication frames if the driver has indicated support.
 698		 */
 699		if (wiphy_ext_feature_isset(
 700			    wdev->wiphy,
 701			    NL80211_EXT_FEATURE_AUTH_AND_DEAUTH_RANDOM_TA))
 702			return true;
 703	} else if (ieee80211_is_action(mgmt->frame_control) &&
 704		   mgmt->u.action.category == WLAN_CATEGORY_PUBLIC) {
 705		/* Allow random TA to be used with Public Action frames if the
 706		 * driver has indicated support.
 707		 */
 708		if (!wdev->connected &&
 709		    wiphy_ext_feature_isset(
 710			    wdev->wiphy,
 711			    NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA))
 712			return true;
 713
 714		if (wdev->connected &&
 715		    wiphy_ext_feature_isset(
 716			    wdev->wiphy,
 717			    NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA_CONNECTED))
 718			return true;
 719	}
 720
 721	return false;
 722}
 723
 724int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
 725			  struct wireless_dev *wdev,
 726			  struct cfg80211_mgmt_tx_params *params, u64 *cookie)
 727{
 728	const struct ieee80211_mgmt *mgmt;
 729	u16 stype;
 730
 731	lockdep_assert_wiphy(&rdev->wiphy);
 732
 733	if (!wdev->wiphy->mgmt_stypes)
 734		return -EOPNOTSUPP;
 735
 736	if (!rdev->ops->mgmt_tx)
 737		return -EOPNOTSUPP;
 738
 739	if (params->len < 24 + 1)
 740		return -EINVAL;
 741
 742	mgmt = (const struct ieee80211_mgmt *)params->buf;
 743
 744	if (!ieee80211_is_mgmt(mgmt->frame_control))
 745		return -EINVAL;
 746
 747	stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE;
 748	if (!(wdev->wiphy->mgmt_stypes[wdev->iftype].tx & BIT(stype >> 4)))
 749		return -EINVAL;
 750
 751	if (ieee80211_is_action(mgmt->frame_control) &&
 752	    mgmt->u.action.category != WLAN_CATEGORY_PUBLIC) {
 753		int err = 0;
 754
 
 
 755		switch (wdev->iftype) {
 756		case NL80211_IFTYPE_ADHOC:
 757			/*
 758			 * check for IBSS DA must be done by driver as
 759			 * cfg80211 doesn't track the stations
 760			 */
 761			if (!wdev->u.ibss.current_bss ||
 762			    !ether_addr_equal(wdev->u.ibss.current_bss->pub.bssid,
 763					      mgmt->bssid)) {
 764				err = -ENOTCONN;
 765				break;
 766			}
 767			break;
 768		case NL80211_IFTYPE_STATION:
 769		case NL80211_IFTYPE_P2P_CLIENT:
 770			if (!wdev->connected) {
 771				err = -ENOTCONN;
 772				break;
 773			}
 774
 775			/* FIXME: MLD may address this differently */
 776
 777			if (!ether_addr_equal(wdev->u.client.connected_addr,
 778					      mgmt->bssid)) {
 779				err = -ENOTCONN;
 780				break;
 781			}
 782
 
 
 
 
 
 
 
 783			/* for station, check that DA is the AP */
 784			if (!ether_addr_equal(wdev->u.client.connected_addr,
 785					      mgmt->da)) {
 786				err = -ENOTCONN;
 787				break;
 788			}
 789			break;
 790		case NL80211_IFTYPE_AP:
 791		case NL80211_IFTYPE_P2P_GO:
 792		case NL80211_IFTYPE_AP_VLAN:
 793			if (!ether_addr_equal(mgmt->bssid, wdev_address(wdev)) &&
 794			    (params->link_id < 0 ||
 795			     !ether_addr_equal(mgmt->bssid,
 796					       wdev->links[params->link_id].addr)))
 797				err = -EINVAL;
 798			break;
 799		case NL80211_IFTYPE_MESH_POINT:
 800			if (!ether_addr_equal(mgmt->sa, mgmt->bssid)) {
 801				err = -EINVAL;
 802				break;
 803			}
 804			/*
 805			 * check for mesh DA must be done by driver as
 806			 * cfg80211 doesn't track the stations
 807			 */
 808			break;
 809		case NL80211_IFTYPE_P2P_DEVICE:
 810			/*
 811			 * fall through, P2P device only supports
 812			 * public action frames
 813			 */
 814		case NL80211_IFTYPE_NAN:
 815		default:
 816			err = -EOPNOTSUPP;
 817			break;
 818		}
 
 819
 820		if (err)
 821			return err;
 822	}
 823
 824	if (!cfg80211_allowed_address(wdev, mgmt->sa) &&
 825	    !cfg80211_allowed_random_address(wdev, mgmt))
 826		return -EINVAL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 827
 828	/* Transmit the management frame as requested by user space */
 829	return rdev_mgmt_tx(rdev, wdev, params, cookie);
 830}
 831
 832bool cfg80211_rx_mgmt_ext(struct wireless_dev *wdev,
 833			  struct cfg80211_rx_info *info)
 834{
 835	struct wiphy *wiphy = wdev->wiphy;
 836	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 837	struct cfg80211_mgmt_registration *reg;
 838	const struct ieee80211_txrx_stypes *stypes =
 839		&wiphy->mgmt_stypes[wdev->iftype];
 840	struct ieee80211_mgmt *mgmt = (void *)info->buf;
 841	const u8 *data;
 842	int data_len;
 843	bool result = false;
 844	__le16 ftype = mgmt->frame_control &
 845		cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE);
 846	u16 stype;
 847
 848	trace_cfg80211_rx_mgmt(wdev, info);
 849	stype = (le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE) >> 4;
 850
 851	if (!(stypes->rx & BIT(stype))) {
 852		trace_cfg80211_return_bool(false);
 853		return false;
 854	}
 855
 856	data = info->buf + ieee80211_hdrlen(mgmt->frame_control);
 857	data_len = info->len - ieee80211_hdrlen(mgmt->frame_control);
 858
 859	spin_lock_bh(&rdev->mgmt_registrations_lock);
 860
 861	list_for_each_entry(reg, &wdev->mgmt_registrations, list) {
 862		if (reg->frame_type != ftype)
 863			continue;
 864
 865		if (reg->match_len > data_len)
 866			continue;
 867
 868		if (memcmp(reg->match, data, reg->match_len))
 869			continue;
 870
 871		/* found match! */
 872
 873		/* Indicate the received Action frame to user space */
 874		if (nl80211_send_mgmt(rdev, wdev, reg->nlportid, info,
 875				      GFP_ATOMIC))
 
 876			continue;
 877
 878		result = true;
 879		break;
 880	}
 881
 882	spin_unlock_bh(&rdev->mgmt_registrations_lock);
 883
 884	trace_cfg80211_return_bool(result);
 885	return result;
 886}
 887EXPORT_SYMBOL(cfg80211_rx_mgmt_ext);
 888
 889void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev)
 890{
 891	cancel_delayed_work(&rdev->dfs_update_channels_wk);
 892	queue_delayed_work(cfg80211_wq, &rdev->dfs_update_channels_wk, 0);
 893}
 894
 895void cfg80211_dfs_channels_update_work(struct work_struct *work)
 896{
 897	struct delayed_work *delayed_work = to_delayed_work(work);
 898	struct cfg80211_registered_device *rdev;
 899	struct cfg80211_chan_def chandef;
 900	struct ieee80211_supported_band *sband;
 901	struct ieee80211_channel *c;
 902	struct wiphy *wiphy;
 903	bool check_again = false;
 904	unsigned long timeout, next_time = 0;
 905	unsigned long time_dfs_update;
 906	enum nl80211_radar_event radar_event;
 907	int bandid, i;
 908
 909	rdev = container_of(delayed_work, struct cfg80211_registered_device,
 910			    dfs_update_channels_wk);
 911	wiphy = &rdev->wiphy;
 912
 913	rtnl_lock();
 914	for (bandid = 0; bandid < NUM_NL80211_BANDS; bandid++) {
 915		sband = wiphy->bands[bandid];
 916		if (!sband)
 917			continue;
 918
 919		for (i = 0; i < sband->n_channels; i++) {
 920			c = &sband->channels[i];
 921
 922			if (!(c->flags & IEEE80211_CHAN_RADAR))
 923				continue;
 924
 925			if (c->dfs_state != NL80211_DFS_UNAVAILABLE &&
 926			    c->dfs_state != NL80211_DFS_AVAILABLE)
 927				continue;
 928
 929			if (c->dfs_state == NL80211_DFS_UNAVAILABLE) {
 930				time_dfs_update = IEEE80211_DFS_MIN_NOP_TIME_MS;
 931				radar_event = NL80211_RADAR_NOP_FINISHED;
 932			} else {
 933				if (regulatory_pre_cac_allowed(wiphy) ||
 934				    cfg80211_any_wiphy_oper_chan(wiphy, c))
 935					continue;
 936
 937				time_dfs_update = REG_PRE_CAC_EXPIRY_GRACE_MS;
 938				radar_event = NL80211_RADAR_PRE_CAC_EXPIRED;
 939			}
 940
 941			timeout = c->dfs_state_entered +
 942				  msecs_to_jiffies(time_dfs_update);
 943
 944			if (time_after_eq(jiffies, timeout)) {
 945				c->dfs_state = NL80211_DFS_USABLE;
 946				c->dfs_state_entered = jiffies;
 947
 948				cfg80211_chandef_create(&chandef, c,
 949							NL80211_CHAN_NO_HT);
 950
 951				nl80211_radar_notify(rdev, &chandef,
 952						     radar_event, NULL,
 953						     GFP_ATOMIC);
 954
 955				regulatory_propagate_dfs_state(wiphy, &chandef,
 956							       c->dfs_state,
 957							       radar_event);
 958				continue;
 959			}
 960
 961			if (!check_again)
 962				next_time = timeout - jiffies;
 963			else
 964				next_time = min(next_time, timeout - jiffies);
 965			check_again = true;
 966		}
 967	}
 968	rtnl_unlock();
 969
 970	/* reschedule if there are other channels waiting to be cleared again */
 971	if (check_again)
 972		queue_delayed_work(cfg80211_wq, &rdev->dfs_update_channels_wk,
 973				   next_time);
 974}
 975
 976
 977void __cfg80211_radar_event(struct wiphy *wiphy,
 978			    struct cfg80211_chan_def *chandef,
 979			    bool offchan, gfp_t gfp)
 980{
 981	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 982
 983	trace_cfg80211_radar_event(wiphy, chandef, offchan);
 984
 985	/* only set the chandef supplied channel to unavailable, in
 986	 * case the radar is detected on only one of multiple channels
 987	 * spanned by the chandef.
 988	 */
 989	cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_UNAVAILABLE);
 990
 991	if (offchan)
 992		queue_work(cfg80211_wq, &rdev->background_cac_abort_wk);
 993
 994	cfg80211_sched_dfs_chan_update(rdev);
 995
 996	nl80211_radar_notify(rdev, chandef, NL80211_RADAR_DETECTED, NULL, gfp);
 997
 998	memcpy(&rdev->radar_chandef, chandef, sizeof(struct cfg80211_chan_def));
 999	queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk);
1000}
1001EXPORT_SYMBOL(__cfg80211_radar_event);
1002
1003void cfg80211_cac_event(struct net_device *netdev,
1004			const struct cfg80211_chan_def *chandef,
1005			enum nl80211_radar_event event, gfp_t gfp)
1006{
1007	struct wireless_dev *wdev = netdev->ieee80211_ptr;
1008	struct wiphy *wiphy = wdev->wiphy;
1009	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1010	unsigned long timeout;
1011
1012	/* not yet supported */
1013	if (wdev->valid_links)
1014		return;
1015
1016	trace_cfg80211_cac_event(netdev, event);
1017
1018	if (WARN_ON(!wdev->cac_started && event != NL80211_RADAR_CAC_STARTED))
1019		return;
1020
 
 
 
1021	switch (event) {
1022	case NL80211_RADAR_CAC_FINISHED:
1023		timeout = wdev->cac_start_time +
1024			  msecs_to_jiffies(wdev->cac_time_ms);
1025		WARN_ON(!time_after_eq(jiffies, timeout));
1026		cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_AVAILABLE);
1027		memcpy(&rdev->cac_done_chandef, chandef,
1028		       sizeof(struct cfg80211_chan_def));
1029		queue_work(cfg80211_wq, &rdev->propagate_cac_done_wk);
1030		cfg80211_sched_dfs_chan_update(rdev);
1031		fallthrough;
1032	case NL80211_RADAR_CAC_ABORTED:
1033		wdev->cac_started = false;
1034		break;
1035	case NL80211_RADAR_CAC_STARTED:
1036		wdev->cac_started = true;
1037		break;
1038	default:
1039		WARN_ON(1);
1040		return;
1041	}
1042
1043	nl80211_radar_notify(rdev, chandef, event, netdev, gfp);
1044}
1045EXPORT_SYMBOL(cfg80211_cac_event);
1046
1047static void
1048__cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
1049				struct wireless_dev *wdev,
1050				const struct cfg80211_chan_def *chandef,
1051				enum nl80211_radar_event event)
1052{
1053	struct wiphy *wiphy = &rdev->wiphy;
1054	struct net_device *netdev;
1055
1056	lockdep_assert_wiphy(&rdev->wiphy);
1057
1058	if (!cfg80211_chandef_valid(chandef))
1059		return;
1060
1061	if (!rdev->background_radar_wdev)
1062		return;
1063
1064	switch (event) {
1065	case NL80211_RADAR_CAC_FINISHED:
1066		cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_AVAILABLE);
1067		memcpy(&rdev->cac_done_chandef, chandef, sizeof(*chandef));
1068		queue_work(cfg80211_wq, &rdev->propagate_cac_done_wk);
1069		cfg80211_sched_dfs_chan_update(rdev);
1070		wdev = rdev->background_radar_wdev;
1071		break;
1072	case NL80211_RADAR_CAC_ABORTED:
1073		if (!cancel_delayed_work(&rdev->background_cac_done_wk))
1074			return;
1075		wdev = rdev->background_radar_wdev;
1076		break;
1077	case NL80211_RADAR_CAC_STARTED:
1078		break;
1079	default:
1080		return;
1081	}
1082
1083	netdev = wdev ? wdev->netdev : NULL;
1084	nl80211_radar_notify(rdev, chandef, event, netdev, GFP_KERNEL);
1085}
1086
1087static void
1088cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
1089			      const struct cfg80211_chan_def *chandef,
1090			      enum nl80211_radar_event event)
1091{
1092	wiphy_lock(&rdev->wiphy);
1093	__cfg80211_background_cac_event(rdev, rdev->background_radar_wdev,
1094					chandef, event);
1095	wiphy_unlock(&rdev->wiphy);
1096}
1097
1098void cfg80211_background_cac_done_wk(struct work_struct *work)
1099{
1100	struct delayed_work *delayed_work = to_delayed_work(work);
1101	struct cfg80211_registered_device *rdev;
1102
1103	rdev = container_of(delayed_work, struct cfg80211_registered_device,
1104			    background_cac_done_wk);
1105	cfg80211_background_cac_event(rdev, &rdev->background_radar_chandef,
1106				      NL80211_RADAR_CAC_FINISHED);
1107}
1108
1109void cfg80211_background_cac_abort_wk(struct work_struct *work)
1110{
1111	struct cfg80211_registered_device *rdev;
1112
1113	rdev = container_of(work, struct cfg80211_registered_device,
1114			    background_cac_abort_wk);
1115	cfg80211_background_cac_event(rdev, &rdev->background_radar_chandef,
1116				      NL80211_RADAR_CAC_ABORTED);
1117}
1118
1119void cfg80211_background_cac_abort(struct wiphy *wiphy)
1120{
1121	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1122
1123	queue_work(cfg80211_wq, &rdev->background_cac_abort_wk);
1124}
1125EXPORT_SYMBOL(cfg80211_background_cac_abort);
1126
1127int
1128cfg80211_start_background_radar_detection(struct cfg80211_registered_device *rdev,
1129					  struct wireless_dev *wdev,
1130					  struct cfg80211_chan_def *chandef)
1131{
1132	unsigned int cac_time_ms;
1133	int err;
1134
1135	lockdep_assert_wiphy(&rdev->wiphy);
1136
1137	if (!wiphy_ext_feature_isset(&rdev->wiphy,
1138				     NL80211_EXT_FEATURE_RADAR_BACKGROUND))
1139		return -EOPNOTSUPP;
1140
1141	/* Offchannel chain already locked by another wdev */
1142	if (rdev->background_radar_wdev && rdev->background_radar_wdev != wdev)
1143		return -EBUSY;
1144
1145	/* CAC already in progress on the offchannel chain */
1146	if (rdev->background_radar_wdev == wdev &&
1147	    delayed_work_pending(&rdev->background_cac_done_wk))
1148		return -EBUSY;
1149
1150	err = rdev_set_radar_background(rdev, chandef);
1151	if (err)
1152		return err;
1153
1154	cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, chandef);
1155	if (!cac_time_ms)
1156		cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
1157
1158	rdev->background_radar_chandef = *chandef;
1159	rdev->background_radar_wdev = wdev; /* Get offchain ownership */
1160
1161	__cfg80211_background_cac_event(rdev, wdev, chandef,
1162					NL80211_RADAR_CAC_STARTED);
1163	queue_delayed_work(cfg80211_wq, &rdev->background_cac_done_wk,
1164			   msecs_to_jiffies(cac_time_ms));
1165
1166	return 0;
1167}
1168
1169void cfg80211_stop_background_radar_detection(struct wireless_dev *wdev)
1170{
1171	struct wiphy *wiphy = wdev->wiphy;
1172	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1173
1174	lockdep_assert_wiphy(wiphy);
1175
1176	if (wdev != rdev->background_radar_wdev)
1177		return;
1178
1179	rdev_set_radar_background(rdev, NULL);
1180	rdev->background_radar_wdev = NULL; /* Release offchain ownership */
1181
1182	__cfg80211_background_cac_event(rdev, wdev,
1183					&rdev->background_radar_chandef,
1184					NL80211_RADAR_CAC_ABORTED);
1185}
v5.14.15
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 * cfg80211 MLME SAP interface
  4 *
  5 * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
  6 * Copyright (c) 2015		Intel Deutschland GmbH
  7 * Copyright (C) 2019-2020 Intel Corporation
  8 */
  9
 10#include <linux/kernel.h>
 11#include <linux/module.h>
 12#include <linux/etherdevice.h>
 13#include <linux/netdevice.h>
 14#include <linux/nl80211.h>
 15#include <linux/slab.h>
 16#include <linux/wireless.h>
 17#include <net/cfg80211.h>
 18#include <net/iw_handler.h>
 19#include "core.h"
 20#include "nl80211.h"
 21#include "rdev-ops.h"
 22
 23
 24void cfg80211_rx_assoc_resp(struct net_device *dev, struct cfg80211_bss *bss,
 25			    const u8 *buf, size_t len, int uapsd_queues,
 26			    const u8 *req_ies, size_t req_ies_len)
 27{
 28	struct wireless_dev *wdev = dev->ieee80211_ptr;
 29	struct wiphy *wiphy = wdev->wiphy;
 30	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 31	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
 32	struct cfg80211_connect_resp_params cr;
 33	const u8 *resp_ie = mgmt->u.assoc_resp.variable;
 34	size_t resp_ie_len = len - offsetof(struct ieee80211_mgmt,
 35					    u.assoc_resp.variable);
 36
 37	if (bss->channel->band == NL80211_BAND_S1GHZ) {
 38		resp_ie = (u8 *)&mgmt->u.s1g_assoc_resp.variable;
 39		resp_ie_len = len - offsetof(struct ieee80211_mgmt,
 40					     u.s1g_assoc_resp.variable);
 41	}
 42
 43	memset(&cr, 0, sizeof(cr));
 44	cr.status = (int)le16_to_cpu(mgmt->u.assoc_resp.status_code);
 45	cr.bssid = mgmt->bssid;
 46	cr.bss = bss;
 47	cr.req_ie = req_ies;
 48	cr.req_ie_len = req_ies_len;
 49	cr.resp_ie = resp_ie;
 50	cr.resp_ie_len = resp_ie_len;
 51	cr.timeout_reason = NL80211_TIMEOUT_UNSPECIFIED;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 52
 53	trace_cfg80211_send_rx_assoc(dev, bss);
 54
 55	/*
 56	 * This is a bit of a hack, we don't notify userspace of
 57	 * a (re-)association reply if we tried to send a reassoc
 58	 * and got a reject -- we only try again with an assoc
 59	 * frame instead of reassoc.
 60	 */
 61	if (cfg80211_sme_rx_assoc_resp(wdev, cr.status)) {
 62		cfg80211_unhold_bss(bss_from_pub(bss));
 63		cfg80211_put_bss(wiphy, bss);
 
 
 
 
 
 
 
 64		return;
 65	}
 66
 67	nl80211_send_rx_assoc(rdev, dev, buf, len, GFP_KERNEL, uapsd_queues,
 68			      req_ies, req_ies_len);
 69	/* update current_bss etc., consumes the bss reference */
 70	__cfg80211_connect_result(dev, &cr, cr.status == WLAN_STATUS_SUCCESS);
 71}
 72EXPORT_SYMBOL(cfg80211_rx_assoc_resp);
 73
 74static void cfg80211_process_auth(struct wireless_dev *wdev,
 75				  const u8 *buf, size_t len)
 76{
 77	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
 78
 79	nl80211_send_rx_auth(rdev, wdev->netdev, buf, len, GFP_KERNEL);
 80	cfg80211_sme_rx_auth(wdev, buf, len);
 81}
 82
 83static void cfg80211_process_deauth(struct wireless_dev *wdev,
 84				    const u8 *buf, size_t len,
 85				    bool reconnect)
 86{
 87	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
 88	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
 89	const u8 *bssid = mgmt->bssid;
 90	u16 reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
 91	bool from_ap = !ether_addr_equal(mgmt->sa, wdev->netdev->dev_addr);
 92
 93	nl80211_send_deauth(rdev, wdev->netdev, buf, len, reconnect, GFP_KERNEL);
 94
 95	if (!wdev->current_bss ||
 96	    !ether_addr_equal(wdev->current_bss->pub.bssid, bssid))
 97		return;
 98
 99	__cfg80211_disconnected(wdev->netdev, NULL, 0, reason_code, from_ap);
100	cfg80211_sme_deauth(wdev);
101}
102
103static void cfg80211_process_disassoc(struct wireless_dev *wdev,
104				      const u8 *buf, size_t len,
105				      bool reconnect)
106{
107	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
108	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
109	const u8 *bssid = mgmt->bssid;
110	u16 reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
111	bool from_ap = !ether_addr_equal(mgmt->sa, wdev->netdev->dev_addr);
112
113	nl80211_send_disassoc(rdev, wdev->netdev, buf, len, reconnect,
114			      GFP_KERNEL);
115
116	if (WARN_ON(!wdev->current_bss ||
117		    !ether_addr_equal(wdev->current_bss->pub.bssid, bssid)))
118		return;
119
120	__cfg80211_disconnected(wdev->netdev, NULL, 0, reason_code, from_ap);
121	cfg80211_sme_disassoc(wdev);
122}
123
124void cfg80211_rx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len)
125{
126	struct wireless_dev *wdev = dev->ieee80211_ptr;
127	struct ieee80211_mgmt *mgmt = (void *)buf;
128
129	ASSERT_WDEV_LOCK(wdev);
130
131	trace_cfg80211_rx_mlme_mgmt(dev, buf, len);
132
133	if (WARN_ON(len < 2))
134		return;
135
136	if (ieee80211_is_auth(mgmt->frame_control))
137		cfg80211_process_auth(wdev, buf, len);
138	else if (ieee80211_is_deauth(mgmt->frame_control))
139		cfg80211_process_deauth(wdev, buf, len, false);
140	else if (ieee80211_is_disassoc(mgmt->frame_control))
141		cfg80211_process_disassoc(wdev, buf, len, false);
142}
143EXPORT_SYMBOL(cfg80211_rx_mlme_mgmt);
144
145void cfg80211_auth_timeout(struct net_device *dev, const u8 *addr)
146{
147	struct wireless_dev *wdev = dev->ieee80211_ptr;
148	struct wiphy *wiphy = wdev->wiphy;
149	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
150
151	trace_cfg80211_send_auth_timeout(dev, addr);
152
153	nl80211_send_auth_timeout(rdev, dev, addr, GFP_KERNEL);
154	cfg80211_sme_auth_timeout(wdev);
155}
156EXPORT_SYMBOL(cfg80211_auth_timeout);
157
158void cfg80211_assoc_timeout(struct net_device *dev, struct cfg80211_bss *bss)
 
159{
160	struct wireless_dev *wdev = dev->ieee80211_ptr;
161	struct wiphy *wiphy = wdev->wiphy;
162	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
 
 
163
164	trace_cfg80211_send_assoc_timeout(dev, bss->bssid);
165
166	nl80211_send_assoc_timeout(rdev, dev, bss->bssid, GFP_KERNEL);
167	cfg80211_sme_assoc_timeout(wdev);
 
 
 
 
168
169	cfg80211_unhold_bss(bss_from_pub(bss));
170	cfg80211_put_bss(wiphy, bss);
171}
172EXPORT_SYMBOL(cfg80211_assoc_timeout);
173
174void cfg80211_abandon_assoc(struct net_device *dev, struct cfg80211_bss *bss)
175{
176	struct wireless_dev *wdev = dev->ieee80211_ptr;
177	struct wiphy *wiphy = wdev->wiphy;
178
179	cfg80211_sme_abandon_assoc(wdev);
180
181	cfg80211_unhold_bss(bss_from_pub(bss));
182	cfg80211_put_bss(wiphy, bss);
183}
184EXPORT_SYMBOL(cfg80211_abandon_assoc);
185
186void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len,
187			   bool reconnect)
188{
189	struct wireless_dev *wdev = dev->ieee80211_ptr;
190	struct ieee80211_mgmt *mgmt = (void *)buf;
191
192	ASSERT_WDEV_LOCK(wdev);
193
194	trace_cfg80211_tx_mlme_mgmt(dev, buf, len, reconnect);
195
196	if (WARN_ON(len < 2))
197		return;
198
199	if (ieee80211_is_deauth(mgmt->frame_control))
200		cfg80211_process_deauth(wdev, buf, len, reconnect);
201	else
202		cfg80211_process_disassoc(wdev, buf, len, reconnect);
203}
204EXPORT_SYMBOL(cfg80211_tx_mlme_mgmt);
205
206void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr,
207				  enum nl80211_key_type key_type, int key_id,
208				  const u8 *tsc, gfp_t gfp)
209{
210	struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
211	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
212#ifdef CONFIG_CFG80211_WEXT
213	union iwreq_data wrqu;
214	char *buf = kmalloc(128, gfp);
215
216	if (buf) {
217		sprintf(buf, "MLME-MICHAELMICFAILURE.indication("
218			"keyid=%d %scast addr=%pM)", key_id,
219			key_type == NL80211_KEYTYPE_GROUP ? "broad" : "uni",
220			addr);
221		memset(&wrqu, 0, sizeof(wrqu));
222		wrqu.data.length = strlen(buf);
223		wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
224		kfree(buf);
225	}
226#endif
227
228	trace_cfg80211_michael_mic_failure(dev, addr, key_type, key_id, tsc);
229	nl80211_michael_mic_failure(rdev, dev, addr, key_type, key_id, tsc, gfp);
230}
231EXPORT_SYMBOL(cfg80211_michael_mic_failure);
232
233/* some MLME handling for userspace SME */
234int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
235		       struct net_device *dev,
236		       struct ieee80211_channel *chan,
237		       enum nl80211_auth_type auth_type,
238		       const u8 *bssid,
239		       const u8 *ssid, int ssid_len,
240		       const u8 *ie, int ie_len,
241		       const u8 *key, int key_len, int key_idx,
242		       const u8 *auth_data, int auth_data_len)
243{
244	struct wireless_dev *wdev = dev->ieee80211_ptr;
245	struct cfg80211_auth_request req = {
246		.ie = ie,
247		.ie_len = ie_len,
248		.auth_data = auth_data,
249		.auth_data_len = auth_data_len,
250		.auth_type = auth_type,
251		.key = key,
252		.key_len = key_len,
253		.key_idx = key_idx,
254	};
255	int err;
256
257	ASSERT_WDEV_LOCK(wdev);
 
 
 
258
259	if (auth_type == NL80211_AUTHTYPE_SHARED_KEY)
260		if (!key || !key_len || key_idx < 0 || key_idx > 3)
 
 
 
 
 
261			return -EINVAL;
 
262
263	if (wdev->current_bss &&
264	    ether_addr_equal(bssid, wdev->current_bss->pub.bssid))
265		return -EALREADY;
266
267	req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len,
268				   IEEE80211_BSS_TYPE_ESS,
269				   IEEE80211_PRIVACY_ANY);
270	if (!req.bss)
271		return -ENOENT;
272
273	err = rdev_auth(rdev, dev, &req);
274
275	cfg80211_put_bss(&rdev->wiphy, req.bss);
276	return err;
277}
278
279/*  Do a logical ht_capa &= ht_capa_mask.  */
280void cfg80211_oper_and_ht_capa(struct ieee80211_ht_cap *ht_capa,
281			       const struct ieee80211_ht_cap *ht_capa_mask)
282{
283	int i;
284	u8 *p1, *p2;
285	if (!ht_capa_mask) {
286		memset(ht_capa, 0, sizeof(*ht_capa));
287		return;
288	}
289
290	p1 = (u8*)(ht_capa);
291	p2 = (u8*)(ht_capa_mask);
292	for (i = 0; i < sizeof(*ht_capa); i++)
293		p1[i] &= p2[i];
294}
295
296/*  Do a logical vht_capa &= vht_capa_mask.  */
297void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap *vht_capa,
298				const struct ieee80211_vht_cap *vht_capa_mask)
299{
300	int i;
301	u8 *p1, *p2;
302	if (!vht_capa_mask) {
303		memset(vht_capa, 0, sizeof(*vht_capa));
304		return;
305	}
306
307	p1 = (u8*)(vht_capa);
308	p2 = (u8*)(vht_capa_mask);
309	for (i = 0; i < sizeof(*vht_capa); i++)
310		p1[i] &= p2[i];
311}
312
 
313int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
314			struct net_device *dev,
315			struct ieee80211_channel *chan,
316			const u8 *bssid,
317			const u8 *ssid, int ssid_len,
318			struct cfg80211_assoc_request *req)
319{
320	struct wireless_dev *wdev = dev->ieee80211_ptr;
321	int err;
322
323	ASSERT_WDEV_LOCK(wdev);
324
325	if (wdev->current_bss &&
326	    (!req->prev_bssid || !ether_addr_equal(wdev->current_bss->pub.bssid,
327						   req->prev_bssid)))
 
 
 
 
 
 
 
 
 
 
 
 
328		return -EALREADY;
329
 
 
 
 
 
330	cfg80211_oper_and_ht_capa(&req->ht_capa_mask,
331				  rdev->wiphy.ht_capa_mod_mask);
332	cfg80211_oper_and_vht_capa(&req->vht_capa_mask,
333				   rdev->wiphy.vht_capa_mod_mask);
334
335	req->bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len,
336				    IEEE80211_BSS_TYPE_ESS,
337				    IEEE80211_PRIVACY_ANY);
338	if (!req->bss)
339		return -ENOENT;
340
341	err = rdev_assoc(rdev, dev, req);
342	if (!err)
343		cfg80211_hold_bss(bss_from_pub(req->bss));
344	else
345		cfg80211_put_bss(&rdev->wiphy, req->bss);
346
 
 
 
 
 
 
 
347	return err;
348}
349
350int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
351			 struct net_device *dev, const u8 *bssid,
352			 const u8 *ie, int ie_len, u16 reason,
353			 bool local_state_change)
354{
355	struct wireless_dev *wdev = dev->ieee80211_ptr;
356	struct cfg80211_deauth_request req = {
357		.bssid = bssid,
358		.reason_code = reason,
359		.ie = ie,
360		.ie_len = ie_len,
361		.local_state_change = local_state_change,
362	};
363
364	ASSERT_WDEV_LOCK(wdev);
365
366	if (local_state_change &&
367	    (!wdev->current_bss ||
368	     !ether_addr_equal(wdev->current_bss->pub.bssid, bssid)))
369		return 0;
370
371	if (ether_addr_equal(wdev->disconnect_bssid, bssid) ||
372	    (wdev->current_bss &&
373	     ether_addr_equal(wdev->current_bss->pub.bssid, bssid)))
374		wdev->conn_owner_nlportid = 0;
375
376	return rdev_deauth(rdev, dev, &req);
377}
378
379int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
380			   struct net_device *dev, const u8 *bssid,
381			   const u8 *ie, int ie_len, u16 reason,
382			   bool local_state_change)
383{
384	struct wireless_dev *wdev = dev->ieee80211_ptr;
385	struct cfg80211_disassoc_request req = {
386		.reason_code = reason,
387		.local_state_change = local_state_change,
388		.ie = ie,
389		.ie_len = ie_len,
 
390	};
391	int err;
392
393	ASSERT_WDEV_LOCK(wdev);
394
395	if (!wdev->current_bss)
396		return -ENOTCONN;
397
398	if (ether_addr_equal(wdev->current_bss->pub.bssid, bssid))
399		req.bss = &wdev->current_bss->pub;
400	else
401		return -ENOTCONN;
402
403	err = rdev_disassoc(rdev, dev, &req);
404	if (err)
405		return err;
406
407	/* driver should have reported the disassoc */
408	WARN_ON(wdev->current_bss);
409	return 0;
410}
411
412void cfg80211_mlme_down(struct cfg80211_registered_device *rdev,
413			struct net_device *dev)
414{
415	struct wireless_dev *wdev = dev->ieee80211_ptr;
416	u8 bssid[ETH_ALEN];
417
418	ASSERT_WDEV_LOCK(wdev);
419
420	if (!rdev->ops->deauth)
421		return;
422
423	if (!wdev->current_bss)
424		return;
425
426	memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN);
427	cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0,
428			     WLAN_REASON_DEAUTH_LEAVING, false);
429}
430
431struct cfg80211_mgmt_registration {
432	struct list_head list;
433	struct wireless_dev *wdev;
434
435	u32 nlportid;
436
437	int match_len;
438
439	__le16 frame_type;
440
441	bool multicast_rx;
442
443	u8 match[];
444};
445
446static void cfg80211_mgmt_registrations_update(struct wireless_dev *wdev)
447{
448	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
449	struct wireless_dev *tmp;
450	struct cfg80211_mgmt_registration *reg;
451	struct mgmt_frame_regs upd = {};
452
453	lockdep_assert_held(&rdev->wiphy.mtx);
454
455	spin_lock_bh(&wdev->mgmt_registrations_lock);
456	if (!wdev->mgmt_registrations_need_update) {
457		spin_unlock_bh(&wdev->mgmt_registrations_lock);
458		return;
459	}
460
461	rcu_read_lock();
462	list_for_each_entry_rcu(tmp, &rdev->wiphy.wdev_list, list) {
463		list_for_each_entry(reg, &tmp->mgmt_registrations, list) {
464			u32 mask = BIT(le16_to_cpu(reg->frame_type) >> 4);
465			u32 mcast_mask = 0;
466
467			if (reg->multicast_rx)
468				mcast_mask = mask;
469
470			upd.global_stypes |= mask;
471			upd.global_mcast_stypes |= mcast_mask;
472
473			if (tmp == wdev) {
474				upd.interface_stypes |= mask;
475				upd.interface_mcast_stypes |= mcast_mask;
476			}
477		}
478	}
479	rcu_read_unlock();
480
481	wdev->mgmt_registrations_need_update = 0;
482	spin_unlock_bh(&wdev->mgmt_registrations_lock);
483
484	rdev_update_mgmt_frame_registrations(rdev, wdev, &upd);
485}
486
487void cfg80211_mgmt_registrations_update_wk(struct work_struct *wk)
488{
489	struct cfg80211_registered_device *rdev;
490	struct wireless_dev *wdev;
491
492	rdev = container_of(wk, struct cfg80211_registered_device,
493			    mgmt_registrations_update_wk);
494
495	wiphy_lock(&rdev->wiphy);
496	list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list)
497		cfg80211_mgmt_registrations_update(wdev);
498	wiphy_unlock(&rdev->wiphy);
499}
500
501int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_portid,
502				u16 frame_type, const u8 *match_data,
503				int match_len, bool multicast_rx,
504				struct netlink_ext_ack *extack)
505{
 
506	struct cfg80211_mgmt_registration *reg, *nreg;
507	int err = 0;
508	u16 mgmt_type;
509	bool update_multicast = false;
510
511	if (!wdev->wiphy->mgmt_stypes)
512		return -EOPNOTSUPP;
513
514	if ((frame_type & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT) {
515		NL_SET_ERR_MSG(extack, "frame type not management");
516		return -EINVAL;
517	}
518
519	if (frame_type & ~(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) {
520		NL_SET_ERR_MSG(extack, "Invalid frame type");
521		return -EINVAL;
522	}
523
524	mgmt_type = (frame_type & IEEE80211_FCTL_STYPE) >> 4;
525	if (!(wdev->wiphy->mgmt_stypes[wdev->iftype].rx & BIT(mgmt_type))) {
526		NL_SET_ERR_MSG(extack,
527			       "Registration to specific type not supported");
528		return -EINVAL;
529	}
530
531	/*
532	 * To support Pre Association Security Negotiation (PASN), registration
533	 * for authentication frames should be supported. However, as some
534	 * versions of the user space daemons wrongly register to all types of
535	 * authentication frames (which might result in unexpected behavior)
536	 * allow such registration if the request is for a specific
537	 * authentication algorithm number.
538	 */
539	if (wdev->iftype == NL80211_IFTYPE_STATION &&
540	    (frame_type & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_AUTH &&
541	    !(match_data && match_len >= 2)) {
542		NL_SET_ERR_MSG(extack,
543			       "Authentication algorithm number required");
544		return -EINVAL;
545	}
546
547	nreg = kzalloc(sizeof(*reg) + match_len, GFP_KERNEL);
548	if (!nreg)
549		return -ENOMEM;
550
551	spin_lock_bh(&wdev->mgmt_registrations_lock);
552
553	list_for_each_entry(reg, &wdev->mgmt_registrations, list) {
554		int mlen = min(match_len, reg->match_len);
555
556		if (frame_type != le16_to_cpu(reg->frame_type))
557			continue;
558
559		if (memcmp(reg->match, match_data, mlen) == 0) {
560			if (reg->multicast_rx != multicast_rx) {
561				update_multicast = true;
562				reg->multicast_rx = multicast_rx;
563				break;
564			}
565			NL_SET_ERR_MSG(extack, "Match already configured");
566			err = -EALREADY;
567			break;
568		}
569	}
570
571	if (err)
572		goto out;
573
574	if (update_multicast) {
575		kfree(nreg);
576	} else {
577		memcpy(nreg->match, match_data, match_len);
578		nreg->match_len = match_len;
579		nreg->nlportid = snd_portid;
580		nreg->frame_type = cpu_to_le16(frame_type);
581		nreg->wdev = wdev;
582		nreg->multicast_rx = multicast_rx;
583		list_add(&nreg->list, &wdev->mgmt_registrations);
584	}
585	wdev->mgmt_registrations_need_update = 1;
586	spin_unlock_bh(&wdev->mgmt_registrations_lock);
587
588	cfg80211_mgmt_registrations_update(wdev);
589
590	return 0;
591
592 out:
593	kfree(nreg);
594	spin_unlock_bh(&wdev->mgmt_registrations_lock);
595
596	return err;
597}
598
599void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlportid)
600{
601	struct wiphy *wiphy = wdev->wiphy;
602	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
603	struct cfg80211_mgmt_registration *reg, *tmp;
604
605	spin_lock_bh(&wdev->mgmt_registrations_lock);
606
607	list_for_each_entry_safe(reg, tmp, &wdev->mgmt_registrations, list) {
608		if (reg->nlportid != nlportid)
609			continue;
610
611		list_del(&reg->list);
612		kfree(reg);
613
614		wdev->mgmt_registrations_need_update = 1;
615		schedule_work(&rdev->mgmt_registrations_update_wk);
616	}
617
618	spin_unlock_bh(&wdev->mgmt_registrations_lock);
619
620	if (nlportid && rdev->crit_proto_nlportid == nlportid) {
621		rdev->crit_proto_nlportid = 0;
622		rdev_crit_proto_stop(rdev, wdev);
623	}
624
625	if (nlportid == wdev->ap_unexpected_nlportid)
626		wdev->ap_unexpected_nlportid = 0;
627}
628
629void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev)
630{
 
631	struct cfg80211_mgmt_registration *reg, *tmp;
632
633	spin_lock_bh(&wdev->mgmt_registrations_lock);
634	list_for_each_entry_safe(reg, tmp, &wdev->mgmt_registrations, list) {
635		list_del(&reg->list);
636		kfree(reg);
637	}
638	wdev->mgmt_registrations_need_update = 1;
639	spin_unlock_bh(&wdev->mgmt_registrations_lock);
640
641	cfg80211_mgmt_registrations_update(wdev);
642}
643
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
644int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
645			  struct wireless_dev *wdev,
646			  struct cfg80211_mgmt_tx_params *params, u64 *cookie)
647{
648	const struct ieee80211_mgmt *mgmt;
649	u16 stype;
650
 
 
651	if (!wdev->wiphy->mgmt_stypes)
652		return -EOPNOTSUPP;
653
654	if (!rdev->ops->mgmt_tx)
655		return -EOPNOTSUPP;
656
657	if (params->len < 24 + 1)
658		return -EINVAL;
659
660	mgmt = (const struct ieee80211_mgmt *)params->buf;
661
662	if (!ieee80211_is_mgmt(mgmt->frame_control))
663		return -EINVAL;
664
665	stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE;
666	if (!(wdev->wiphy->mgmt_stypes[wdev->iftype].tx & BIT(stype >> 4)))
667		return -EINVAL;
668
669	if (ieee80211_is_action(mgmt->frame_control) &&
670	    mgmt->u.action.category != WLAN_CATEGORY_PUBLIC) {
671		int err = 0;
672
673		wdev_lock(wdev);
674
675		switch (wdev->iftype) {
676		case NL80211_IFTYPE_ADHOC:
 
 
 
 
 
 
 
 
 
 
 
677		case NL80211_IFTYPE_STATION:
678		case NL80211_IFTYPE_P2P_CLIENT:
679			if (!wdev->current_bss) {
680				err = -ENOTCONN;
681				break;
682			}
683
684			if (!ether_addr_equal(wdev->current_bss->pub.bssid,
 
 
685					      mgmt->bssid)) {
686				err = -ENOTCONN;
687				break;
688			}
689
690			/*
691			 * check for IBSS DA must be done by driver as
692			 * cfg80211 doesn't track the stations
693			 */
694			if (wdev->iftype == NL80211_IFTYPE_ADHOC)
695				break;
696
697			/* for station, check that DA is the AP */
698			if (!ether_addr_equal(wdev->current_bss->pub.bssid,
699					      mgmt->da)) {
700				err = -ENOTCONN;
701				break;
702			}
703			break;
704		case NL80211_IFTYPE_AP:
705		case NL80211_IFTYPE_P2P_GO:
706		case NL80211_IFTYPE_AP_VLAN:
707			if (!ether_addr_equal(mgmt->bssid, wdev_address(wdev)))
 
 
 
708				err = -EINVAL;
709			break;
710		case NL80211_IFTYPE_MESH_POINT:
711			if (!ether_addr_equal(mgmt->sa, mgmt->bssid)) {
712				err = -EINVAL;
713				break;
714			}
715			/*
716			 * check for mesh DA must be done by driver as
717			 * cfg80211 doesn't track the stations
718			 */
719			break;
720		case NL80211_IFTYPE_P2P_DEVICE:
721			/*
722			 * fall through, P2P device only supports
723			 * public action frames
724			 */
725		case NL80211_IFTYPE_NAN:
726		default:
727			err = -EOPNOTSUPP;
728			break;
729		}
730		wdev_unlock(wdev);
731
732		if (err)
733			return err;
734	}
735
736	if (!ether_addr_equal(mgmt->sa, wdev_address(wdev))) {
737		/* Allow random TA to be used with Public Action frames if the
738		 * driver has indicated support for this. Otherwise, only allow
739		 * the local address to be used.
740		 */
741		if (!ieee80211_is_action(mgmt->frame_control) ||
742		    mgmt->u.action.category != WLAN_CATEGORY_PUBLIC)
743			return -EINVAL;
744		if (!wdev->current_bss &&
745		    !wiphy_ext_feature_isset(
746			    &rdev->wiphy,
747			    NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA))
748			return -EINVAL;
749		if (wdev->current_bss &&
750		    !wiphy_ext_feature_isset(
751			    &rdev->wiphy,
752			    NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA_CONNECTED))
753			return -EINVAL;
754	}
755
756	/* Transmit the Action frame as requested by user space */
757	return rdev_mgmt_tx(rdev, wdev, params, cookie);
758}
759
760bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm,
761			  const u8 *buf, size_t len, u32 flags)
762{
763	struct wiphy *wiphy = wdev->wiphy;
764	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
765	struct cfg80211_mgmt_registration *reg;
766	const struct ieee80211_txrx_stypes *stypes =
767		&wiphy->mgmt_stypes[wdev->iftype];
768	struct ieee80211_mgmt *mgmt = (void *)buf;
769	const u8 *data;
770	int data_len;
771	bool result = false;
772	__le16 ftype = mgmt->frame_control &
773		cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE);
774	u16 stype;
775
776	trace_cfg80211_rx_mgmt(wdev, freq, sig_dbm);
777	stype = (le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE) >> 4;
778
779	if (!(stypes->rx & BIT(stype))) {
780		trace_cfg80211_return_bool(false);
781		return false;
782	}
783
784	data = buf + ieee80211_hdrlen(mgmt->frame_control);
785	data_len = len - ieee80211_hdrlen(mgmt->frame_control);
786
787	spin_lock_bh(&wdev->mgmt_registrations_lock);
788
789	list_for_each_entry(reg, &wdev->mgmt_registrations, list) {
790		if (reg->frame_type != ftype)
791			continue;
792
793		if (reg->match_len > data_len)
794			continue;
795
796		if (memcmp(reg->match, data, reg->match_len))
797			continue;
798
799		/* found match! */
800
801		/* Indicate the received Action frame to user space */
802		if (nl80211_send_mgmt(rdev, wdev, reg->nlportid,
803				      freq, sig_dbm,
804				      buf, len, flags, GFP_ATOMIC))
805			continue;
806
807		result = true;
808		break;
809	}
810
811	spin_unlock_bh(&wdev->mgmt_registrations_lock);
812
813	trace_cfg80211_return_bool(result);
814	return result;
815}
816EXPORT_SYMBOL(cfg80211_rx_mgmt_khz);
817
818void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev)
819{
820	cancel_delayed_work(&rdev->dfs_update_channels_wk);
821	queue_delayed_work(cfg80211_wq, &rdev->dfs_update_channels_wk, 0);
822}
823
824void cfg80211_dfs_channels_update_work(struct work_struct *work)
825{
826	struct delayed_work *delayed_work = to_delayed_work(work);
827	struct cfg80211_registered_device *rdev;
828	struct cfg80211_chan_def chandef;
829	struct ieee80211_supported_band *sband;
830	struct ieee80211_channel *c;
831	struct wiphy *wiphy;
832	bool check_again = false;
833	unsigned long timeout, next_time = 0;
834	unsigned long time_dfs_update;
835	enum nl80211_radar_event radar_event;
836	int bandid, i;
837
838	rdev = container_of(delayed_work, struct cfg80211_registered_device,
839			    dfs_update_channels_wk);
840	wiphy = &rdev->wiphy;
841
842	rtnl_lock();
843	for (bandid = 0; bandid < NUM_NL80211_BANDS; bandid++) {
844		sband = wiphy->bands[bandid];
845		if (!sband)
846			continue;
847
848		for (i = 0; i < sband->n_channels; i++) {
849			c = &sband->channels[i];
850
851			if (!(c->flags & IEEE80211_CHAN_RADAR))
852				continue;
853
854			if (c->dfs_state != NL80211_DFS_UNAVAILABLE &&
855			    c->dfs_state != NL80211_DFS_AVAILABLE)
856				continue;
857
858			if (c->dfs_state == NL80211_DFS_UNAVAILABLE) {
859				time_dfs_update = IEEE80211_DFS_MIN_NOP_TIME_MS;
860				radar_event = NL80211_RADAR_NOP_FINISHED;
861			} else {
862				if (regulatory_pre_cac_allowed(wiphy) ||
863				    cfg80211_any_wiphy_oper_chan(wiphy, c))
864					continue;
865
866				time_dfs_update = REG_PRE_CAC_EXPIRY_GRACE_MS;
867				radar_event = NL80211_RADAR_PRE_CAC_EXPIRED;
868			}
869
870			timeout = c->dfs_state_entered +
871				  msecs_to_jiffies(time_dfs_update);
872
873			if (time_after_eq(jiffies, timeout)) {
874				c->dfs_state = NL80211_DFS_USABLE;
875				c->dfs_state_entered = jiffies;
876
877				cfg80211_chandef_create(&chandef, c,
878							NL80211_CHAN_NO_HT);
879
880				nl80211_radar_notify(rdev, &chandef,
881						     radar_event, NULL,
882						     GFP_ATOMIC);
883
884				regulatory_propagate_dfs_state(wiphy, &chandef,
885							       c->dfs_state,
886							       radar_event);
887				continue;
888			}
889
890			if (!check_again)
891				next_time = timeout - jiffies;
892			else
893				next_time = min(next_time, timeout - jiffies);
894			check_again = true;
895		}
896	}
897	rtnl_unlock();
898
899	/* reschedule if there are other channels waiting to be cleared again */
900	if (check_again)
901		queue_delayed_work(cfg80211_wq, &rdev->dfs_update_channels_wk,
902				   next_time);
903}
904
905
906void cfg80211_radar_event(struct wiphy *wiphy,
907			  struct cfg80211_chan_def *chandef,
908			  gfp_t gfp)
909{
910	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
911
912	trace_cfg80211_radar_event(wiphy, chandef);
913
914	/* only set the chandef supplied channel to unavailable, in
915	 * case the radar is detected on only one of multiple channels
916	 * spanned by the chandef.
917	 */
918	cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_UNAVAILABLE);
919
 
 
 
920	cfg80211_sched_dfs_chan_update(rdev);
921
922	nl80211_radar_notify(rdev, chandef, NL80211_RADAR_DETECTED, NULL, gfp);
923
924	memcpy(&rdev->radar_chandef, chandef, sizeof(struct cfg80211_chan_def));
925	queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk);
926}
927EXPORT_SYMBOL(cfg80211_radar_event);
928
929void cfg80211_cac_event(struct net_device *netdev,
930			const struct cfg80211_chan_def *chandef,
931			enum nl80211_radar_event event, gfp_t gfp)
932{
933	struct wireless_dev *wdev = netdev->ieee80211_ptr;
934	struct wiphy *wiphy = wdev->wiphy;
935	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
936	unsigned long timeout;
937
 
 
 
 
938	trace_cfg80211_cac_event(netdev, event);
939
940	if (WARN_ON(!wdev->cac_started && event != NL80211_RADAR_CAC_STARTED))
941		return;
942
943	if (WARN_ON(!wdev->chandef.chan))
944		return;
945
946	switch (event) {
947	case NL80211_RADAR_CAC_FINISHED:
948		timeout = wdev->cac_start_time +
949			  msecs_to_jiffies(wdev->cac_time_ms);
950		WARN_ON(!time_after_eq(jiffies, timeout));
951		cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_AVAILABLE);
952		memcpy(&rdev->cac_done_chandef, chandef,
953		       sizeof(struct cfg80211_chan_def));
954		queue_work(cfg80211_wq, &rdev->propagate_cac_done_wk);
955		cfg80211_sched_dfs_chan_update(rdev);
956		fallthrough;
957	case NL80211_RADAR_CAC_ABORTED:
958		wdev->cac_started = false;
959		break;
960	case NL80211_RADAR_CAC_STARTED:
961		wdev->cac_started = true;
962		break;
963	default:
964		WARN_ON(1);
965		return;
966	}
967
968	nl80211_radar_notify(rdev, chandef, event, netdev, gfp);
969}
970EXPORT_SYMBOL(cfg80211_cac_event);