Commit 2d33ecf5 authored by Johannes Berg's avatar Johannes Berg
Browse files

wifi: cfg80211: restrict operation during radar detection



Just like it's not currently possible to start radar
detection while already operating, it shouldn't be
possible to start operating while radar detection is
running. Fix that.

Also, improve the check whether operating (carrier
might not be up if e.g. attempting to join IBSS).

Reviewed-by: default avatarMiriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240506211158.ae8dca3d0d6c.I7c70a66a5fbdbc63a78fee8a34f31d1995491bc3@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent ce9e660e
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
 * Some IBSS support code for cfg80211.
 *
 * Copyright 2009	Johannes Berg <johannes@sipsolutions.net>
 * Copyright (C) 2020-2023 Intel Corporation
 * Copyright (C) 2020-2024 Intel Corporation
 */

#include <linux/etherdevice.h>
@@ -94,6 +94,9 @@ int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,

	lockdep_assert_held(&rdev->wiphy.mtx);

	if (wdev->cac_started)
		return -EBUSY;

	if (wdev->u.ibss.ssid_len)
		return -EALREADY;

+4 −1
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * Portions
 * Copyright (C) 2022-2023 Intel Corporation
 * Copyright (C) 2022-2024 Intel Corporation
 */
#include <linux/ieee80211.h>
#include <linux/export.h>
@@ -127,6 +127,9 @@ int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
	if (!rdev->ops->join_mesh)
		return -EOPNOTSUPP;

	if (wdev->cac_started)
		return -EBUSY;

	if (!setup->chandef.chan) {
		/* if no channel explicitly given, use preset channel */
		setup->chandef = wdev->u.mesh.preset_chandef;
+15 −6
Original line number Diff line number Diff line
@@ -5964,6 +5964,9 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
	if (!rdev->ops->start_ap)
		return -EOPNOTSUPP;
	if (wdev->cac_started)
		return -EBUSY;
	if (wdev->links[link_id].ap.beacon_interval)
		return -EALREADY;
@@ -9956,6 +9959,17 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
	flush_delayed_work(&rdev->dfs_update_channels_wk);
	switch (wdev->iftype) {
	case NL80211_IFTYPE_AP:
	case NL80211_IFTYPE_P2P_GO:
	case NL80211_IFTYPE_MESH_POINT:
	case NL80211_IFTYPE_ADHOC:
		break;
	default:
		/* caution - see cfg80211_beaconing_iface_active() below */
		return -EINVAL;
	}
	wiphy_lock(wiphy);
	dfs_region = reg_get_dfs_region(wiphy);
@@ -9986,12 +10000,7 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
		goto unlock;
	}
	if (netif_carrier_ok(dev)) {
		err = -EBUSY;
		goto unlock;
	}
	if (wdev->cac_started) {
	if (cfg80211_beaconing_iface_active(wdev) || wdev->cac_started) {
		err = -EBUSY;
		goto unlock;
	}