mirror of
https://github.com/pentoo/pentoo-overlay
synced 2026-05-06 03:20:43 +02:00
4242 lines
125 KiB
Diff
4242 lines
125 KiB
Diff
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/ath/ath11k/reg.c linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/ath11k/reg.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/ath/ath11k/reg.c 2021-01-26 20:37:38.071158833 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/ath11k/reg.c 2021-01-26 20:40:20.718165379 -0500
|
|
@@ -247,7 +247,9 @@
|
|
}
|
|
|
|
rtnl_lock();
|
|
- ret = regulatory_set_wiphy_regd_sync_rtnl(ar->hw->wiphy, regd_copy);
|
|
+ wiphy_lock(ar->hw->wiphy);
|
|
+ ret = regulatory_set_wiphy_regd_sync(ar->hw->wiphy, regd_copy);
|
|
+ wiphy_unlock(ar->hw->wiphy);
|
|
rtnl_unlock();
|
|
|
|
kfree(regd_copy);
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/ath/ath6kl/cfg80211.c linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/ath6kl/cfg80211.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/ath/ath6kl/cfg80211.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/ath6kl/cfg80211.c 2021-01-26 20:40:20.719165379 -0500
|
|
@@ -3648,7 +3648,7 @@
|
|
kfree(mc_filter);
|
|
}
|
|
|
|
- unregister_netdevice(vif->ndev);
|
|
+ cfg80211_unregister_netdevice(vif->ndev);
|
|
|
|
ar->num_vif--;
|
|
}
|
|
@@ -3821,7 +3821,7 @@
|
|
|
|
netdev_set_default_ethtool_ops(ndev, &ath6kl_ethtool_ops);
|
|
|
|
- if (register_netdevice(ndev))
|
|
+ if (cfg80211_register_netdevice(ndev))
|
|
goto err;
|
|
|
|
ar->avail_idx_map &= ~BIT(fw_vif_idx);
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/ath/ath6kl/core.c linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/ath6kl/core.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/ath/ath6kl/core.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/ath6kl/core.c 2021-01-26 20:40:20.719165379 -0500
|
|
@@ -212,11 +212,13 @@
|
|
ar->avail_idx_map |= BIT(i);
|
|
|
|
rtnl_lock();
|
|
+ wiphy_lock(ar->wiphy);
|
|
|
|
/* Add an initial station interface */
|
|
wdev = ath6kl_interface_add(ar, "wlan%d", NET_NAME_ENUM,
|
|
NL80211_IFTYPE_STATION, 0, INFRA_NETWORK);
|
|
|
|
+ wiphy_unlock(ar->wiphy);
|
|
rtnl_unlock();
|
|
|
|
if (!wdev) {
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/ath/ath6kl/init.c linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/ath6kl/init.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/ath/ath6kl/init.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/ath6kl/init.c 2021-01-26 20:40:20.719165379 -0500
|
|
@@ -1904,7 +1904,9 @@
|
|
spin_unlock_bh(&ar->list_lock);
|
|
ath6kl_cfg80211_vif_stop(vif, test_bit(WMI_READY, &ar->flag));
|
|
rtnl_lock();
|
|
+ wiphy_lock(ar->wiphy);
|
|
ath6kl_cfg80211_vif_cleanup(vif);
|
|
+ wiphy_unlock(ar->wiphy);
|
|
rtnl_unlock();
|
|
spin_lock_bh(&ar->list_lock);
|
|
}
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/ath/wil6210/cfg80211.c linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/wil6210/cfg80211.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/ath/wil6210/cfg80211.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/wil6210/cfg80211.c 2021-01-26 20:40:20.719165379 -0500
|
|
@@ -2820,7 +2820,9 @@
|
|
wil->radio_wdev = wil->main_ndev->ieee80211_ptr;
|
|
mutex_unlock(&wil->vif_mutex);
|
|
if (p2p_wdev) {
|
|
+ wiphy_lock(wil->wiphy);
|
|
cfg80211_unregister_wdev(p2p_wdev);
|
|
+ wiphy_unlock(wil->wiphy);
|
|
kfree(p2p_wdev);
|
|
}
|
|
}
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/ath/wil6210/netdev.c linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/wil6210/netdev.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/ath/wil6210/netdev.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/wil6210/netdev.c 2021-01-26 20:40:20.719165379 -0500
|
|
@@ -424,7 +424,7 @@
|
|
if (rc)
|
|
return rc;
|
|
}
|
|
- rc = register_netdevice(ndev);
|
|
+ rc = cfg80211_register_netdevice(ndev);
|
|
if (rc < 0) {
|
|
dev_err(&ndev->dev, "Failed to register netdev: %d\n", rc);
|
|
if (any_active && vif->mid != 0)
|
|
@@ -473,7 +473,9 @@
|
|
wil_update_net_queues_bh(wil, vif, NULL, true);
|
|
|
|
rtnl_lock();
|
|
+ wiphy_lock(wiphy);
|
|
rc = wil_vif_add(wil, vif);
|
|
+ wiphy_unlock(wiphy);
|
|
rtnl_unlock();
|
|
if (rc < 0)
|
|
goto out_wiphy;
|
|
@@ -511,7 +513,7 @@
|
|
/* during unregister_netdevice cfg80211_leave may perform operations
|
|
* such as stop AP, disconnect, so we only clear the VIF afterwards
|
|
*/
|
|
- unregister_netdevice(ndev);
|
|
+ cfg80211_unregister_netdevice(ndev);
|
|
|
|
if (any_active && vif->mid != 0)
|
|
wmi_port_delete(wil, vif->mid);
|
|
@@ -543,15 +545,18 @@
|
|
{
|
|
struct net_device *ndev = wil->main_ndev;
|
|
struct wireless_dev *wdev = ndev->ieee80211_ptr;
|
|
+ struct wiphy *wiphy = wdev->wiphy;
|
|
|
|
wil_dbg_misc(wil, "if_remove\n");
|
|
|
|
rtnl_lock();
|
|
+ wiphy_lock(wiphy);
|
|
wil_vif_remove(wil, 0);
|
|
+ wiphy_unlock(wiphy);
|
|
rtnl_unlock();
|
|
|
|
netif_napi_del(&wil->napi_tx);
|
|
netif_napi_del(&wil->napi_rx);
|
|
|
|
- wiphy_unregister(wdev->wiphy);
|
|
+ wiphy_unregister(wiphy);
|
|
}
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/ath/wil6210/pcie_bus.c linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/wil6210/pcie_bus.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/ath/wil6210/pcie_bus.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/ath/wil6210/pcie_bus.c 2021-01-26 20:40:20.721165379 -0500
|
|
@@ -473,8 +473,10 @@
|
|
|
|
wil6210_debugfs_remove(wil);
|
|
rtnl_lock();
|
|
+ wiphy_lock(wil->wiphy);
|
|
wil_p2p_wdev_free(wil);
|
|
wil_remove_all_additional_vifs(wil);
|
|
+ wiphy_unlock(wil->wiphy);
|
|
rtnl_unlock();
|
|
wil_if_remove(wil);
|
|
wil_if_pcie_disable(wil);
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c linux-5.10.10-pentoo-johill/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c 2021-01-26 20:40:20.721165379 -0500
|
|
@@ -633,7 +633,7 @@
|
|
.ndo_set_rx_mode = brcmf_netdev_set_multicast_list
|
|
};
|
|
|
|
-int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
|
|
+int brcmf_net_attach(struct brcmf_if *ifp, bool locked)
|
|
{
|
|
struct brcmf_pub *drvr = ifp->drvr;
|
|
struct net_device *ndev;
|
|
@@ -656,8 +656,8 @@
|
|
INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list);
|
|
INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable);
|
|
|
|
- if (rtnl_locked)
|
|
- err = register_netdevice(ndev);
|
|
+ if (locked)
|
|
+ err = cfg80211_register_netdevice(ndev);
|
|
else
|
|
err = register_netdev(ndev);
|
|
if (err != 0) {
|
|
@@ -677,11 +677,11 @@
|
|
return -EBADE;
|
|
}
|
|
|
|
-void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
|
|
+void brcmf_net_detach(struct net_device *ndev, bool locked)
|
|
{
|
|
if (ndev->reg_state == NETREG_REGISTERED) {
|
|
- if (rtnl_locked)
|
|
- unregister_netdevice(ndev);
|
|
+ if (locked)
|
|
+ cfg80211_unregister_netdevice(ndev);
|
|
else
|
|
unregister_netdev(ndev);
|
|
} else {
|
|
@@ -758,7 +758,7 @@
|
|
ndev = ifp->ndev;
|
|
ndev->netdev_ops = &brcmf_netdev_ops_mon;
|
|
|
|
- err = register_netdevice(ndev);
|
|
+ err = cfg80211_register_netdevice(ndev);
|
|
if (err)
|
|
bphy_err(drvr, "Failed to register %s device\n", ndev->name);
|
|
|
|
@@ -909,7 +909,7 @@
|
|
}
|
|
|
|
static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx,
|
|
- bool rtnl_locked)
|
|
+ bool locked)
|
|
{
|
|
struct brcmf_if *ifp;
|
|
int ifidx;
|
|
@@ -938,7 +938,7 @@
|
|
cancel_work_sync(&ifp->multicast_work);
|
|
cancel_work_sync(&ifp->ndoffload_work);
|
|
}
|
|
- brcmf_net_detach(ifp->ndev, rtnl_locked);
|
|
+ brcmf_net_detach(ifp->ndev, locked);
|
|
} else {
|
|
/* Only p2p device interfaces which get dynamically created
|
|
* end up here. In this case the p2p module should be informed
|
|
@@ -947,7 +947,7 @@
|
|
* serious troublesome side effects. The p2p module will clean
|
|
* up the ifp if needed.
|
|
*/
|
|
- brcmf_p2p_ifp_removed(ifp, rtnl_locked);
|
|
+ brcmf_p2p_ifp_removed(ifp, locked);
|
|
kfree(ifp);
|
|
}
|
|
|
|
@@ -956,14 +956,14 @@
|
|
drvr->if2bss[ifidx] = BRCMF_BSSIDX_INVALID;
|
|
}
|
|
|
|
-void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked)
|
|
+void brcmf_remove_interface(struct brcmf_if *ifp, bool locked)
|
|
{
|
|
if (!ifp || WARN_ON(ifp->drvr->iflist[ifp->bsscfgidx] != ifp))
|
|
return;
|
|
brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", ifp->bsscfgidx,
|
|
ifp->ifidx);
|
|
brcmf_proto_del_if(ifp->drvr, ifp);
|
|
- brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked);
|
|
+ brcmf_del_if(ifp->drvr, ifp->bsscfgidx, locked);
|
|
}
|
|
|
|
static int brcmf_psm_watchdog_notify(struct brcmf_if *ifp,
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h linux-5.10.10-pentoo-johill/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h 2021-01-26 20:40:20.721165379 -0500
|
|
@@ -201,16 +201,16 @@
|
|
char *brcmf_ifname(struct brcmf_if *ifp);
|
|
struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx);
|
|
void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable);
|
|
-int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked);
|
|
+int brcmf_net_attach(struct brcmf_if *ifp, bool locked);
|
|
struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx,
|
|
bool is_p2pdev, const char *name, u8 *mac_addr);
|
|
-void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked);
|
|
+void brcmf_remove_interface(struct brcmf_if *ifp, bool locked);
|
|
void brcmf_txflowblock_if(struct brcmf_if *ifp,
|
|
enum brcmf_netif_stop_reason reason, bool state);
|
|
void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
|
|
void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb, bool inirq);
|
|
void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb);
|
|
-void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked);
|
|
+void brcmf_net_detach(struct net_device *ndev, bool locked);
|
|
int brcmf_net_mon_attach(struct brcmf_if *ifp);
|
|
void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
|
|
int __init brcmf_core_init(void);
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c linux-5.10.10-pentoo-johill/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c 2021-01-26 20:40:20.721165379 -0500
|
|
@@ -2430,7 +2430,7 @@
|
|
return err;
|
|
}
|
|
|
|
-void brcmf_p2p_ifp_removed(struct brcmf_if *ifp, bool rtnl_locked)
|
|
+void brcmf_p2p_ifp_removed(struct brcmf_if *ifp, bool locked)
|
|
{
|
|
struct brcmf_cfg80211_info *cfg;
|
|
struct brcmf_cfg80211_vif *vif;
|
|
@@ -2439,11 +2439,15 @@
|
|
vif = ifp->vif;
|
|
cfg = wdev_to_cfg(&vif->wdev);
|
|
cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
|
|
- if (!rtnl_locked)
|
|
+ if (locked) {
|
|
rtnl_lock();
|
|
- cfg80211_unregister_wdev(&vif->wdev);
|
|
- if (!rtnl_locked)
|
|
+ wiphy_lock(cfg->wiphy);
|
|
+ cfg80211_unregister_wdev(&vif->wdev);
|
|
+ wiphy_unlock(cfg->wiphy);
|
|
rtnl_unlock();
|
|
+ } else {
|
|
+ cfg80211_unregister_wdev(&vif->wdev);
|
|
+ }
|
|
brcmf_free_vif(vif);
|
|
}
|
|
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/intel/iwlwifi/mvm/d3.c linux-5.10.10-pentoo-johill/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/intel/iwlwifi/mvm/d3.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/intel/iwlwifi/mvm/d3.c 2021-01-26 20:40:20.721165379 -0500
|
|
@@ -2213,7 +2213,7 @@
|
|
|
|
out_iterate:
|
|
if (!test)
|
|
- ieee80211_iterate_active_interfaces_rtnl(mvm->hw,
|
|
+ ieee80211_iterate_active_interfaces_mtx(mvm->hw,
|
|
IEEE80211_IFACE_ITER_NORMAL,
|
|
iwl_mvm_d3_disconnect_iter, keep ? vif : NULL);
|
|
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c linux-5.10.10-pentoo-johill/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c 2021-01-26 20:40:20.722165379 -0500
|
|
@@ -315,7 +315,7 @@
|
|
int ret;
|
|
bool changed;
|
|
const struct ieee80211_regdomain *r =
|
|
- rtnl_dereference(mvm->hw->wiphy->regd);
|
|
+ wiphy_dereference(mvm->hw->wiphy, mvm->hw->wiphy->regd);
|
|
|
|
if (!r)
|
|
return -ENOENT;
|
|
@@ -337,7 +337,7 @@
|
|
|
|
/* update cfg80211 if the regdomain was changed */
|
|
if (changed)
|
|
- ret = regulatory_set_wiphy_regd_sync_rtnl(mvm->hw->wiphy, regd);
|
|
+ ret = regulatory_set_wiphy_regd_sync(mvm->hw->wiphy, regd);
|
|
else
|
|
ret = 0;
|
|
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c linux-5.10.10-pentoo-johill/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c 2021-01-26 20:40:20.722165379 -0500
|
|
@@ -602,7 +602,7 @@
|
|
return -EIO;
|
|
}
|
|
|
|
- retval = regulatory_set_wiphy_regd_sync_rtnl(mvm->hw->wiphy, regd);
|
|
+ retval = regulatory_set_wiphy_regd_sync(mvm->hw->wiphy, regd);
|
|
kfree(regd);
|
|
return retval;
|
|
}
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/marvell/mwifiex/cfg80211.c linux-5.10.10-pentoo-johill/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/marvell/mwifiex/cfg80211.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/marvell/mwifiex/cfg80211.c 2021-01-26 20:40:20.723165379 -0500
|
|
@@ -2097,7 +2097,7 @@
|
|
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
|
|
|
|
if (!mwifiex_stop_bg_scan(priv))
|
|
- cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy, 0);
|
|
+ cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0);
|
|
|
|
if (mwifiex_deauthenticate(priv, NULL))
|
|
return -EFAULT;
|
|
@@ -2366,7 +2366,7 @@
|
|
(int)sme->ssid_len, (char *)sme->ssid, sme->bssid);
|
|
|
|
if (!mwifiex_stop_bg_scan(priv))
|
|
- cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy, 0);
|
|
+ cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0);
|
|
|
|
ret = mwifiex_cfg80211_assoc(priv, sme->ssid_len, sme->ssid, sme->bssid,
|
|
priv->bss_mode, sme->channel, sme, 0);
|
|
@@ -2576,7 +2576,7 @@
|
|
priv->scan_block = false;
|
|
|
|
if (!mwifiex_stop_bg_scan(priv))
|
|
- cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy, 0);
|
|
+ cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0);
|
|
|
|
user_scan_cfg = kzalloc(sizeof(*user_scan_cfg), GFP_KERNEL);
|
|
if (!user_scan_cfg)
|
|
@@ -3081,7 +3081,7 @@
|
|
mutex_init(&priv->async_mutex);
|
|
|
|
/* Register network device */
|
|
- if (register_netdevice(dev)) {
|
|
+ if (cfg80211_register_netdevice(dev)) {
|
|
mwifiex_dbg(adapter, ERROR, "cannot register network device\n");
|
|
ret = -EFAULT;
|
|
goto err_reg_netdev;
|
|
@@ -3160,7 +3160,7 @@
|
|
netif_carrier_off(priv->netdev);
|
|
|
|
if (wdev->netdev->reg_state == NETREG_REGISTERED)
|
|
- unregister_netdevice(wdev->netdev);
|
|
+ cfg80211_unregister_netdevice(wdev->netdev);
|
|
|
|
if (priv->dfs_cac_workqueue) {
|
|
flush_workqueue(priv->dfs_cac_workqueue);
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/marvell/mwifiex/main.c linux-5.10.10-pentoo-johill/drivers/net/wireless/marvell/mwifiex/main.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/marvell/mwifiex/main.c 2021-01-26 20:37:38.075158833 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/marvell/mwifiex/main.c 2021-01-26 20:40:20.723165379 -0500
|
|
@@ -598,12 +598,14 @@
|
|
}
|
|
|
|
rtnl_lock();
|
|
+ wiphy_lock(adapter->wiphy);
|
|
/* Create station interface by default */
|
|
wdev = mwifiex_add_virtual_intf(adapter->wiphy, "mlan%d", NET_NAME_ENUM,
|
|
NL80211_IFTYPE_STATION, NULL);
|
|
if (IS_ERR(wdev)) {
|
|
mwifiex_dbg(adapter, ERROR,
|
|
"cannot create default STA interface\n");
|
|
+ wiphy_unlock(adapter->wiphy);
|
|
rtnl_unlock();
|
|
goto err_add_intf;
|
|
}
|
|
@@ -614,6 +616,7 @@
|
|
if (IS_ERR(wdev)) {
|
|
mwifiex_dbg(adapter, ERROR,
|
|
"cannot create AP interface\n");
|
|
+ wiphy_unlock(adapter->wiphy);
|
|
rtnl_unlock();
|
|
goto err_add_intf;
|
|
}
|
|
@@ -625,10 +628,12 @@
|
|
if (IS_ERR(wdev)) {
|
|
mwifiex_dbg(adapter, ERROR,
|
|
"cannot create p2p client interface\n");
|
|
+ wiphy_unlock(adapter->wiphy);
|
|
rtnl_unlock();
|
|
goto err_add_intf;
|
|
}
|
|
}
|
|
+ wiphy_unlock(adapter->wiphy);
|
|
rtnl_unlock();
|
|
|
|
mwifiex_drv_get_driver_version(adapter, fmt, sizeof(fmt) - 1);
|
|
@@ -1440,9 +1445,11 @@
|
|
if (!priv)
|
|
continue;
|
|
rtnl_lock();
|
|
+ wiphy_lock(adapter->wiphy);
|
|
if (priv->netdev &&
|
|
priv->wdev.iftype != NL80211_IFTYPE_UNSPECIFIED)
|
|
mwifiex_del_virtual_intf(adapter->wiphy, &priv->wdev);
|
|
+ wiphy_unlock(adapter->wiphy);
|
|
rtnl_unlock();
|
|
}
|
|
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/microchip/wilc1000/cfg80211.c linux-5.10.10-pentoo-johill/drivers/net/wireless/microchip/wilc1000/cfg80211.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/microchip/wilc1000/cfg80211.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/microchip/wilc1000/cfg80211.c 2021-01-26 20:40:20.723165379 -0500
|
|
@@ -1538,7 +1538,7 @@
|
|
wilc_wfi_deinit_mon_interface(wl, true);
|
|
vif = netdev_priv(wdev->netdev);
|
|
cfg80211_stop_iface(wiphy, wdev, GFP_KERNEL);
|
|
- unregister_netdevice(vif->ndev);
|
|
+ cfg80211_unregister_netdevice(vif->ndev);
|
|
vif->monitor_flag = 0;
|
|
|
|
wilc_set_operation_mode(vif, 0, 0, 0);
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/microchip/wilc1000/mon.c linux-5.10.10-pentoo-johill/drivers/net/wireless/microchip/wilc1000/mon.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/microchip/wilc1000/mon.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/microchip/wilc1000/mon.c 2021-01-26 20:40:20.723165379 -0500
|
|
@@ -233,7 +233,7 @@
|
|
wl->monitor_dev->netdev_ops = &wilc_wfi_netdev_ops;
|
|
wl->monitor_dev->needs_free_netdev = true;
|
|
|
|
- if (register_netdevice(wl->monitor_dev)) {
|
|
+ if (cfg80211_register_netdevice(wl->monitor_dev)) {
|
|
netdev_err(real_dev, "register_netdevice failed\n");
|
|
free_netdev(wl->monitor_dev);
|
|
return NULL;
|
|
@@ -251,7 +251,7 @@
|
|
return;
|
|
|
|
if (rtnl_locked)
|
|
- unregister_netdevice(wl->monitor_dev);
|
|
+ cfg80211_unregister_netdevice(wl->monitor_dev);
|
|
else
|
|
unregister_netdev(wl->monitor_dev);
|
|
wl->monitor_dev = NULL;
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/microchip/wilc1000/netdev.c linux-5.10.10-pentoo-johill/drivers/net/wireless/microchip/wilc1000/netdev.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/microchip/wilc1000/netdev.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/microchip/wilc1000/netdev.c 2021-01-26 20:40:20.723165379 -0500
|
|
@@ -912,7 +912,7 @@
|
|
vif->priv.dev = ndev;
|
|
|
|
if (rtnl_locked)
|
|
- ret = register_netdevice(ndev);
|
|
+ ret = cfg80211_register_netdevice(ndev);
|
|
else
|
|
ret = register_netdev(ndev);
|
|
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c linux-5.10.10-pentoo-johill/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c 2021-01-26 20:40:20.724165379 -0500
|
|
@@ -180,7 +180,7 @@
|
|
cancel_work_sync(&vif->high_pri_tx_work);
|
|
|
|
if (netdev->reg_state == NETREG_REGISTERED)
|
|
- unregister_netdevice(netdev);
|
|
+ cfg80211_unregister_netdevice(netdev);
|
|
|
|
if (qtnf_cmd_send_del_intf(vif))
|
|
pr_err("VIF%u.%u: failed to delete VIF\n", vif->mac->macid,
|
|
@@ -267,7 +267,7 @@
|
|
if (qtnf_hwcap_is_set(&mac->bus->hw_info, QLINK_HW_CAPAB_HW_BRIDGE)) {
|
|
ret = qtnf_cmd_netdev_changeupper(vif, vif->netdev->ifindex);
|
|
if (ret) {
|
|
- unregister_netdevice(vif->netdev);
|
|
+ cfg80211_unregister_netdevice(vif->netdev);
|
|
vif->netdev = NULL;
|
|
goto error_del_vif;
|
|
}
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/quantenna/qtnfmac/core.c linux-5.10.10-pentoo-johill/drivers/net/wireless/quantenna/qtnfmac/core.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/quantenna/qtnfmac/core.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/quantenna/qtnfmac/core.c 2021-01-26 20:40:20.724165379 -0500
|
|
@@ -497,7 +497,7 @@
|
|
|
|
SET_NETDEV_DEV(dev, wiphy_dev(wiphy));
|
|
|
|
- ret = register_netdevice(dev);
|
|
+ ret = cfg80211_register_netdevice(dev);
|
|
if (ret) {
|
|
free_netdev(dev);
|
|
vif->netdev = NULL;
|
|
@@ -617,8 +617,9 @@
|
|
mac->wiphy_registered = 1;
|
|
|
|
rtnl_lock();
|
|
-
|
|
+ wiphy_lock(priv_to_wiphy(mac));
|
|
ret = qtnf_core_net_attach(mac, vif, "wlan%d", NET_NAME_ENUM);
|
|
+ wiphy_unlock(priv_to_wiphy(mac));
|
|
rtnl_unlock();
|
|
|
|
if (ret) {
|
|
diff -Naur linux-5.10.10-pentoo/drivers/net/wireless/virt_wifi.c linux-5.10.10-pentoo-johill/drivers/net/wireless/virt_wifi.c
|
|
--- linux-5.10.10-pentoo/drivers/net/wireless/virt_wifi.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/drivers/net/wireless/virt_wifi.c 2021-01-26 20:40:20.724165379 -0500
|
|
@@ -537,7 +537,9 @@
|
|
dev->ieee80211_ptr->iftype = NL80211_IFTYPE_STATION;
|
|
dev->ieee80211_ptr->wiphy = common_wiphy;
|
|
|
|
+ wiphy_lock(common_wiphy);
|
|
err = register_netdevice(dev);
|
|
+ wiphy_unlock(common_wiphy);
|
|
if (err) {
|
|
dev_err(&priv->lowerdev->dev, "can't register_netdevice: %d\n",
|
|
err);
|
|
@@ -560,7 +562,9 @@
|
|
|
|
return 0;
|
|
unregister_netdev:
|
|
+ wiphy_lock(common_wiphy);
|
|
unregister_netdevice(dev);
|
|
+ wiphy_unlock(common_wiphy);
|
|
free_wireless_dev:
|
|
kfree(dev->ieee80211_ptr);
|
|
dev->ieee80211_ptr = NULL;
|
|
@@ -586,7 +590,9 @@
|
|
netdev_rx_handler_unregister(priv->lowerdev);
|
|
netdev_upper_dev_unlink(priv->lowerdev, dev);
|
|
|
|
+ wiphy_lock(common_wiphy);
|
|
unregister_netdevice_queue(dev, head);
|
|
+ wiphy_unlock(common_wiphy);
|
|
module_put(THIS_MODULE);
|
|
|
|
/* Deleting the wiphy is handled in the module destructor. */
|
|
@@ -625,7 +631,9 @@
|
|
upper_dev = priv->upperdev;
|
|
|
|
upper_dev->rtnl_link_ops->dellink(upper_dev, &list_kill);
|
|
+ wiphy_lock(common_wiphy);
|
|
unregister_netdevice_many(&list_kill);
|
|
+ wiphy_unlock(common_wiphy);
|
|
break;
|
|
}
|
|
|
|
diff -Naur linux-5.10.10-pentoo/include/net/cfg80211.h linux-5.10.10-pentoo-johill/include/net/cfg80211.h
|
|
--- linux-5.10.10-pentoo/include/net/cfg80211.h 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/include/net/cfg80211.h 2021-01-26 20:41:32.544168270 -0500
|
|
@@ -3577,9 +3577,10 @@
|
|
* All callbacks except where otherwise noted should return 0
|
|
* on success or a negative error code.
|
|
*
|
|
- * All operations are currently invoked under rtnl for consistency with the
|
|
- * wireless extensions but this is subject to reevaluation as soon as this
|
|
- * code is used more widely and we have a first user without wext.
|
|
+ * All operations are invoked with the wiphy mutex held. The RTNL may be
|
|
+ * held in addition (due to wireless extensions) but this cannot be relied
|
|
+ * upon except in cases where documented below. Note that due to ordering,
|
|
+ * the RTNL also cannot be acquired in any handlers.
|
|
*
|
|
* @suspend: wiphy device needs to be suspended. The variable @wow will
|
|
* be %NULL or contain the enabled Wake-on-Wireless triggers that are
|
|
@@ -3594,11 +3595,14 @@
|
|
* the new netdev in the wiphy's network namespace! Returns the struct
|
|
* wireless_dev, or an ERR_PTR. For P2P device wdevs, the driver must
|
|
* also set the address member in the wdev.
|
|
+ * This additionally holds the RTNL to be able to do netdev changes.
|
|
*
|
|
* @del_virtual_intf: remove the virtual interface
|
|
+ * This additionally holds the RTNL to be able to do netdev changes.
|
|
*
|
|
* @change_virtual_intf: change type/configuration of virtual interface,
|
|
* keep the struct wireless_dev's iftype updated.
|
|
+ * This additionally holds the RTNL to be able to do netdev changes.
|
|
*
|
|
* @add_key: add a key with the given parameters. @mac_addr will be %NULL
|
|
* when adding a group key.
|
|
@@ -4689,6 +4693,7 @@
|
|
|
|
/**
|
|
* struct wiphy - wireless hardware description
|
|
+ * @mtx: mutex for the data (structures) of this device
|
|
* @reg_notifier: the driver's regulatory notification callback,
|
|
* note that if your driver uses wiphy_apply_custom_regulatory()
|
|
* the reg_notifier's request can be passed as NULL
|
|
@@ -4881,6 +4886,8 @@
|
|
* %NL80211_TID_CONFIG_ATTR_RETRY_LONG attributes
|
|
*/
|
|
struct wiphy {
|
|
+ struct mutex mtx;
|
|
+
|
|
/* assign these fields before you register the wiphy */
|
|
|
|
u8 perm_addr[ETH_ALEN];
|
|
@@ -5131,6 +5138,37 @@
|
|
*/
|
|
int wiphy_register(struct wiphy *wiphy);
|
|
|
|
+/* this is a define for better error reporting (file/line) */
|
|
+#define lockdep_assert_wiphy(wiphy) lockdep_assert_held(&(wiphy)->mtx)
|
|
+
|
|
+/**
|
|
+ * rcu_dereference_wiphy - rcu_dereference with debug checking
|
|
+ * @wiphy: the wiphy to check the locking on
|
|
+ * @p: The pointer to read, prior to dereferencing
|
|
+ *
|
|
+ * Do an rcu_dereference(p), but check caller either holds rcu_read_lock()
|
|
+ * or RTNL. Note: Please prefer wiphy_dereference() or rcu_dereference().
|
|
+ */
|
|
+#define rcu_dereference_wiphy(wiphy, p) \
|
|
+ rcu_dereference_check(p, lockdep_is_held(&wiphy->mtx))
|
|
+
|
|
+/**
|
|
+ * wiphy_dereference - fetch RCU pointer when updates are prevented by wiphy mtx
|
|
+ * @wiphy: the wiphy to check the locking on
|
|
+ * @p: The pointer to read, prior to dereferencing
|
|
+ *
|
|
+ * Return the value of the specified RCU-protected pointer, but omit the
|
|
+ * READ_ONCE(), because caller holds the wiphy mutex used for updates.
|
|
+ */
|
|
+#define wiphy_dereference(wiphy, p) \
|
|
+ rcu_dereference_protected(p, lockdep_is_held(&wiphy->mtx))
|
|
+
|
|
+/**
|
|
+ * get_wiphy_regdom - get custom regdomain for the given wiphy
|
|
+ * @wiphy: the wiphy to get the regdomain from
|
|
+ */
|
|
+const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy);
|
|
+
|
|
/**
|
|
* wiphy_unregister - deregister a wiphy from cfg80211
|
|
*
|
|
@@ -5156,13 +5194,45 @@
|
|
struct cfg80211_cqm_config;
|
|
|
|
/**
|
|
+ * wiphy_lock - lock the wiphy
|
|
+ * @wiphy: the wiphy to lock
|
|
+ *
|
|
+ * This is mostly exposed so it can be done around registering and
|
|
+ * unregistering netdevs that aren't created through cfg80211 calls,
|
|
+ * since that requires locking in cfg80211 when the notifiers is
|
|
+ * called, but that cannot differentiate which way it's called.
|
|
+ *
|
|
+ * When cfg80211 ops are called, the wiphy is already locked.
|
|
+ */
|
|
+static inline void wiphy_lock(struct wiphy *wiphy)
|
|
+ __acquires(&wiphy->mtx)
|
|
+{
|
|
+ mutex_lock(&wiphy->mtx);
|
|
+ __acquire(&wiphy->mtx);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * wiphy_unlock - unlock the wiphy again
|
|
+ * @wiphy: the wiphy to unlock
|
|
+ */
|
|
+static inline void wiphy_unlock(struct wiphy *wiphy)
|
|
+ __releases(&wiphy->mtx)
|
|
+{
|
|
+ __release(&wiphy->mtx);
|
|
+ mutex_unlock(&wiphy->mtx);
|
|
+}
|
|
+
|
|
+/**
|
|
* struct wireless_dev - wireless device state
|
|
*
|
|
* For netdevs, this structure must be allocated by the driver
|
|
* that uses the ieee80211_ptr field in struct net_device (this
|
|
* is intentional so it can be allocated along with the netdev.)
|
|
* It need not be registered then as netdev registration will
|
|
- * be intercepted by cfg80211 to see the new wireless device.
|
|
+ * be intercepted by cfg80211 to see the new wireless device,
|
|
+ * however, drivers must lock the wiphy before registering or
|
|
+ * unregistering netdevs if they pre-create any netdevs (in ops
|
|
+ * called from cfg80211, the wiphy is already locked.)
|
|
*
|
|
* For non-netdev uses, it must also be allocated by the driver
|
|
* in response to the cfg80211 callbacks that require it, as
|
|
@@ -5171,6 +5241,7 @@
|
|
*
|
|
* @wiphy: pointer to hardware description
|
|
* @iftype: interface type
|
|
+ * @registered: is this wdev already registered with cfg80211
|
|
* @list: (private) Used to collect the interfaces
|
|
* @netdev: (private) Used to reference back to the netdev, may be %NULL
|
|
* @identifier: (private) Identifier used in nl80211 to identify this
|
|
@@ -5254,7 +5325,7 @@
|
|
|
|
struct mutex mtx;
|
|
|
|
- bool use_4addr, is_running;
|
|
+ bool use_4addr, is_running, registered;
|
|
|
|
u8 address[ETH_ALEN] __aligned(sizeof(u16));
|
|
|
|
@@ -5923,18 +5994,18 @@
|
|
struct ieee80211_regdomain *rd);
|
|
|
|
/**
|
|
- * regulatory_set_wiphy_regd_sync_rtnl - set regdom for self-managed drivers
|
|
+ * regulatory_set_wiphy_regd_sync - set regdom for self-managed drivers
|
|
* @wiphy: the wireless device we want to process the regulatory domain on
|
|
* @rd: the regulatory domain information to use for this wiphy
|
|
*
|
|
- * This functions requires the RTNL to be held and applies the new regdomain
|
|
- * synchronously to this wiphy. For more details see
|
|
- * regulatory_set_wiphy_regd().
|
|
+ * This functions requires the RTNL and the wiphy mutex to be held and
|
|
+ * applies the new regdomain synchronously to this wiphy. For more details
|
|
+ * see regulatory_set_wiphy_regd().
|
|
*
|
|
* Return: 0 on success. -EINVAL, -EPERM
|
|
*/
|
|
-int regulatory_set_wiphy_regd_sync_rtnl(struct wiphy *wiphy,
|
|
- struct ieee80211_regdomain *rd);
|
|
+int regulatory_set_wiphy_regd_sync(struct wiphy *wiphy,
|
|
+ struct ieee80211_regdomain *rd);
|
|
|
|
/**
|
|
* wiphy_apply_custom_regulatory - apply a custom driver regulatory domain
|
|
@@ -6052,7 +6123,7 @@
|
|
void cfg80211_sched_scan_stopped(struct wiphy *wiphy, u64 reqid);
|
|
|
|
/**
|
|
- * cfg80211_sched_scan_stopped_rtnl - notify that the scheduled scan has stopped
|
|
+ * cfg80211_sched_scan_stopped_locked - notify that the scheduled scan has stopped
|
|
*
|
|
* @wiphy: the wiphy on which the scheduled scan stopped
|
|
* @reqid: identifier for the related scheduled scan request
|
|
@@ -6060,9 +6131,9 @@
|
|
* The driver can call this function to inform cfg80211 that the
|
|
* scheduled scan had to be stopped, for whatever reason. The driver
|
|
* is then called back via the sched_scan_stop operation when done.
|
|
- * This function should be called with rtnl locked.
|
|
+ * This function should be called with the wiphy mutex held.
|
|
*/
|
|
-void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy, u64 reqid);
|
|
+void cfg80211_sched_scan_stopped_locked(struct wiphy *wiphy, u64 reqid);
|
|
|
|
/**
|
|
* cfg80211_inform_bss_frame_data - inform cfg80211 of a received BSS frame
|
|
@@ -7497,7 +7568,7 @@
|
|
* also checks if IR-relaxation conditions apply, to allow beaconing under
|
|
* more permissive conditions.
|
|
*
|
|
- * Requires the RTNL to be held.
|
|
+ * Requires the wiphy mutex to be held.
|
|
*/
|
|
bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy,
|
|
struct cfg80211_chan_def *chandef,
|
|
@@ -7594,19 +7665,47 @@
|
|
* cfg80211_unregister_wdev - remove the given wdev
|
|
* @wdev: struct wireless_dev to remove
|
|
*
|
|
- * Call this function only for wdevs that have no netdev assigned,
|
|
- * e.g. P2P Devices. It removes the device from the list so that
|
|
- * it can no longer be used. It is necessary to call this function
|
|
- * even when cfg80211 requests the removal of the interface by
|
|
- * calling the del_virtual_intf() callback. The function must also
|
|
- * be called when the driver wishes to unregister the wdev, e.g.
|
|
- * when the device is unbound from the driver.
|
|
+ * This function removes the device so it can no longer be used. It is necessary
|
|
+ * to call this function even when cfg80211 requests the removal of the device
|
|
+ * by calling the del_virtual_intf() callback. The function must also be called
|
|
+ * when the driver wishes to unregister the wdev, e.g. when the hardware device
|
|
+ * is unbound from the driver.
|
|
+ * This function removes the device so it can no longer be used. It is necessary
|
|
+ * to call this function even when cfg80211 requests the removal of the device
|
|
+ * by calling the del_virtual_intf() callback. The function must also be called
|
|
+ * when the driver wishes to unregister the wdev, e.g. when the hardware device
|
|
+ * is unbound from the driver.
|
|
*
|
|
- * Requires the RTNL to be held.
|
|
+ * Requires the RTNL and wiphy mutex to be held.
|
|
*/
|
|
void cfg80211_unregister_wdev(struct wireless_dev *wdev);
|
|
|
|
/**
|
|
+ * cfg80211_register_netdevice - register the given netdev
|
|
+ * @dev: the netdev to register
|
|
+ *
|
|
+ * Note: In contexts coming from cfg80211 callbacks, you must call this rather
|
|
+ * than register_netdevice(), unregister_netdev() is impossible as the RTNL is
|
|
+ * held. Otherwise, both register_netdevice() and register_netdev() are usable
|
|
+ * instead as well.
|
|
+ */
|
|
+int cfg80211_register_netdevice(struct net_device *dev);
|
|
+
|
|
+/**
|
|
+ * cfg80211_unregister_netdevice - unregister the given netdev
|
|
+ * @dev: the netdev to register
|
|
+ *
|
|
+ * Note: In contexts coming from cfg80211 callbacks, you must call this rather
|
|
+ * than unregister_netdevice(), unregister_netdev() is impossible as the RTNL
|
|
+ * is held. Otherwise, both unregister_netdevice() and unregister_netdev() are
|
|
+ * usable instead as well.
|
|
+ */
|
|
+static inline void cfg80211_unregister_netdevice(struct net_device *dev)
|
|
+{
|
|
+ cfg80211_unregister_wdev(dev->ieee80211_ptr);
|
|
+}
|
|
+
|
|
+/**
|
|
* struct cfg80211_ft_event_params - FT Information Elements
|
|
* @ies: FT IEs
|
|
* @ies_len: length of the FT IE in bytes
|
|
diff -Naur linux-5.10.10-pentoo/include/net/mac80211.h linux-5.10.10-pentoo-johill/include/net/mac80211.h
|
|
--- linux-5.10.10-pentoo/include/net/mac80211.h 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/include/net/mac80211.h 2021-01-26 20:40:20.725165379 -0500
|
|
@@ -5487,7 +5487,7 @@
|
|
void *data);
|
|
|
|
/**
|
|
- * ieee80211_iterate_active_interfaces_rtnl - iterate active interfaces
|
|
+ * ieee80211_iterate_active_interfaces_mtx - iterate active interfaces
|
|
*
|
|
* This function iterates over the interfaces associated with a given
|
|
* hardware that are currently active and calls the callback for them.
|
|
@@ -5498,12 +5498,12 @@
|
|
* @iterator: the iterator function to call, cannot sleep
|
|
* @data: first argument of the iterator function
|
|
*/
|
|
-void ieee80211_iterate_active_interfaces_rtnl(struct ieee80211_hw *hw,
|
|
- u32 iter_flags,
|
|
- void (*iterator)(void *data,
|
|
+void ieee80211_iterate_active_interfaces_mtx(struct ieee80211_hw *hw,
|
|
+ u32 iter_flags,
|
|
+ void (*iterator)(void *data,
|
|
u8 *mac,
|
|
struct ieee80211_vif *vif),
|
|
- void *data);
|
|
+ void *data);
|
|
|
|
/**
|
|
* ieee80211_iterate_stations_atomic - iterate stations
|
|
diff -Naur linux-5.10.10-pentoo/net/mac80211/iface.c linux-5.10.10-pentoo-johill/net/mac80211/iface.c
|
|
--- linux-5.10.10-pentoo/net/mac80211/iface.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/mac80211/iface.c 2021-01-26 20:40:20.725165379 -0500
|
|
@@ -361,11 +361,14 @@
|
|
if (err)
|
|
return err;
|
|
|
|
- return ieee80211_do_open(&sdata->wdev, true);
|
|
+ wiphy_lock(sdata->local->hw.wiphy);
|
|
+ err = ieee80211_do_open(&sdata->wdev, true);
|
|
+ wiphy_unlock(sdata->local->hw.wiphy);
|
|
+
|
|
+ return err;
|
|
}
|
|
|
|
-static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
|
- bool going_down)
|
|
+static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_down)
|
|
{
|
|
struct ieee80211_local *local = sdata->local;
|
|
unsigned long flags;
|
|
@@ -645,7 +648,9 @@
|
|
{
|
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
|
|
|
+ wiphy_lock(sdata->local->hw.wiphy);
|
|
ieee80211_do_stop(sdata, true);
|
|
+ wiphy_unlock(sdata->local->hw.wiphy);
|
|
|
|
return 0;
|
|
}
|
|
@@ -2003,7 +2008,7 @@
|
|
ndev->min_mtu = 256;
|
|
ndev->max_mtu = local->hw.max_mtu;
|
|
|
|
- ret = register_netdevice(ndev);
|
|
+ ret = cfg80211_register_netdevice(ndev);
|
|
if (ret) {
|
|
free_netdev(ndev);
|
|
return ret;
|
|
@@ -2033,10 +2038,9 @@
|
|
|
|
synchronize_rcu();
|
|
|
|
- if (sdata->dev) {
|
|
- unregister_netdevice(sdata->dev);
|
|
- } else {
|
|
- cfg80211_unregister_wdev(&sdata->wdev);
|
|
+ cfg80211_unregister_wdev(&sdata->wdev);
|
|
+
|
|
+ if (!sdata->dev) {
|
|
ieee80211_teardown_sdata(sdata);
|
|
kfree(sdata);
|
|
}
|
|
@@ -2085,13 +2089,16 @@
|
|
list_add(&sdata->list, &wdev_list);
|
|
}
|
|
mutex_unlock(&local->iflist_mtx);
|
|
+
|
|
unregister_netdevice_many(&unreg_list);
|
|
|
|
+ wiphy_lock(local->hw.wiphy);
|
|
list_for_each_entry_safe(sdata, tmp, &wdev_list, list) {
|
|
list_del(&sdata->list);
|
|
cfg80211_unregister_wdev(&sdata->wdev);
|
|
kfree(sdata);
|
|
}
|
|
+ wiphy_unlock(local->hw.wiphy);
|
|
}
|
|
|
|
static int netdev_notify(struct notifier_block *nb,
|
|
diff -Naur linux-5.10.10-pentoo/net/mac80211/key.c linux-5.10.10-pentoo-johill/net/mac80211/key.c
|
|
--- linux-5.10.10-pentoo/net/mac80211/key.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/mac80211/key.c 2021-01-26 20:40:20.725165379 -0500
|
|
@@ -887,7 +887,7 @@
|
|
struct ieee80211_key *key;
|
|
struct ieee80211_sub_if_data *vlan;
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_wiphy(sdata->local->hw.wiphy);
|
|
|
|
mutex_lock(&sdata->local->key_mtx);
|
|
|
|
@@ -924,7 +924,7 @@
|
|
struct ieee80211_key *key, *tmp;
|
|
struct ieee80211_sub_if_data *sdata;
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_wiphy(hw->wiphy);
|
|
|
|
mutex_lock(&local->key_mtx);
|
|
if (vif) {
|
|
diff -Naur linux-5.10.10-pentoo/net/mac80211/main.c linux-5.10.10-pentoo-johill/net/mac80211/main.c
|
|
--- linux-5.10.10-pentoo/net/mac80211/main.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/mac80211/main.c 2021-01-26 20:40:20.725165379 -0500
|
|
@@ -261,7 +261,9 @@
|
|
"%s called with hardware scan in progress\n", __func__);
|
|
|
|
flush_work(&local->radar_detected_work);
|
|
+ /* we might do interface manipulations, so need both */
|
|
rtnl_lock();
|
|
+ wiphy_lock(local->hw.wiphy);
|
|
list_for_each_entry(sdata, &local->interfaces, list) {
|
|
/*
|
|
* XXX: there may be more work for other vif types and even
|
|
@@ -293,6 +295,7 @@
|
|
synchronize_net();
|
|
|
|
ieee80211_reconfig(local);
|
|
+ wiphy_unlock(local->hw.wiphy);
|
|
rtnl_unlock();
|
|
}
|
|
|
|
@@ -1284,6 +1287,7 @@
|
|
rate_control_add_debugfs(local);
|
|
|
|
rtnl_lock();
|
|
+ wiphy_lock(hw->wiphy);
|
|
|
|
/* add one default STA interface if supported */
|
|
if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION) &&
|
|
@@ -1297,6 +1301,7 @@
|
|
"Failed to add default virtual iface\n");
|
|
}
|
|
|
|
+ wiphy_unlock(hw->wiphy);
|
|
rtnl_unlock();
|
|
|
|
#ifdef CONFIG_INET
|
|
diff -Naur linux-5.10.10-pentoo/net/mac80211/pm.c linux-5.10.10-pentoo-johill/net/mac80211/pm.c
|
|
--- linux-5.10.10-pentoo/net/mac80211/pm.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/mac80211/pm.c 2021-01-26 20:40:20.725165379 -0500
|
|
@@ -1,4 +1,8 @@
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
+/*
|
|
+ * Portions
|
|
+ * Copyright (C) 2020-2021 Intel Corporation
|
|
+ */
|
|
#include <net/mac80211.h>
|
|
#include <net/rtnetlink.h>
|
|
|
|
@@ -11,7 +15,7 @@
|
|
{
|
|
if (ieee80211_request_sched_scan_stop(local))
|
|
return;
|
|
- cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy, 0);
|
|
+ cfg80211_sched_scan_stopped_locked(local->hw.wiphy, 0);
|
|
}
|
|
|
|
int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
|
|
diff -Naur linux-5.10.10-pentoo/net/mac80211/tdls.c linux-5.10.10-pentoo-johill/net/mac80211/tdls.c
|
|
--- linux-5.10.10-pentoo/net/mac80211/tdls.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/mac80211/tdls.c 2021-01-26 20:40:20.726165380 -0500
|
|
@@ -1927,7 +1927,7 @@
|
|
struct ieee80211_tdls_data *tf = (void *)skb->data;
|
|
struct wiphy *wiphy = sdata->local->hw.wiphy;
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_wiphy(wiphy);
|
|
|
|
/* make sure the driver supports it */
|
|
if (!(wiphy->features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
|
|
@@ -1979,7 +1979,7 @@
|
|
struct sk_buff *skb;
|
|
struct ieee80211_tdls_data *tf;
|
|
|
|
- rtnl_lock();
|
|
+ wiphy_lock(local->hw.wiphy);
|
|
while ((skb = skb_dequeue(&local->skb_queue_tdls_chsw))) {
|
|
tf = (struct ieee80211_tdls_data *)skb->data;
|
|
list_for_each_entry(sdata, &local->interfaces, list) {
|
|
@@ -1994,7 +1994,7 @@
|
|
|
|
kfree_skb(skb);
|
|
}
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(local->hw.wiphy);
|
|
}
|
|
|
|
void ieee80211_tdls_handle_disconnect(struct ieee80211_sub_if_data *sdata,
|
|
diff -Naur linux-5.10.10-pentoo/net/mac80211/util.c linux-5.10.10-pentoo-johill/net/mac80211/util.c
|
|
--- linux-5.10.10-pentoo/net/mac80211/util.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/mac80211/util.c 2021-01-26 20:40:20.726165380 -0500
|
|
@@ -831,7 +831,7 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic);
|
|
|
|
-void ieee80211_iterate_active_interfaces_rtnl(
|
|
+void ieee80211_iterate_active_interfaces_mtx(
|
|
struct ieee80211_hw *hw, u32 iter_flags,
|
|
void (*iterator)(void *data, u8 *mac,
|
|
struct ieee80211_vif *vif),
|
|
@@ -839,12 +839,12 @@
|
|
{
|
|
struct ieee80211_local *local = hw_to_local(hw);
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_wiphy(hw->wiphy);
|
|
|
|
__iterate_interfaces(local, iter_flags | IEEE80211_IFACE_ITER_ACTIVE,
|
|
iterator, data);
|
|
}
|
|
-EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_rtnl);
|
|
+EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_mtx);
|
|
|
|
static void __iterate_stations(struct ieee80211_local *local,
|
|
void (*iterator)(void *data,
|
|
@@ -2594,7 +2594,7 @@
|
|
mutex_unlock(&local->mtx);
|
|
|
|
if (sched_scan_stopped)
|
|
- cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy, 0);
|
|
+ cfg80211_sched_scan_stopped_locked(local->hw.wiphy, 0);
|
|
|
|
wake_up:
|
|
|
|
@@ -3746,7 +3746,7 @@
|
|
struct cfg80211_chan_def chandef;
|
|
|
|
/* for interface list, to avoid linking iflist_mtx and chanctx_mtx */
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_wiphy(local->hw.wiphy);
|
|
|
|
mutex_lock(&local->mtx);
|
|
list_for_each_entry(sdata, &local->interfaces, list) {
|
|
@@ -3786,9 +3786,9 @@
|
|
}
|
|
mutex_unlock(&local->chanctx_mtx);
|
|
|
|
- rtnl_lock();
|
|
+ wiphy_lock(local->hw.wiphy);
|
|
ieee80211_dfs_cac_cancel(local);
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(local->hw.wiphy);
|
|
|
|
if (num_chanctx > 1)
|
|
/* XXX: multi-channel is not supported yet */
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/chan.c linux-5.10.10-pentoo-johill/net/wireless/chan.c
|
|
--- linux-5.10.10-pentoo/net/wireless/chan.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/chan.c 2021-01-26 20:40:20.726165380 -0500
|
|
@@ -1093,7 +1093,7 @@
|
|
struct wireless_dev *wdev;
|
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
if (!IS_ENABLED(CONFIG_CFG80211_REG_RELAX_NO_IR) ||
|
|
!(wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR))
|
|
@@ -1216,9 +1216,10 @@
|
|
struct cfg80211_chan_def *chandef,
|
|
enum nl80211_iftype iftype)
|
|
{
|
|
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
|
bool check_no_ir;
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
/*
|
|
* Under certain conditions suggested by some regulatory bodies a
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/core.c linux-5.10.10-pentoo-johill/net/wireless/core.c
|
|
--- linux-5.10.10-pentoo/net/wireless/core.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/core.c 2021-01-26 20:40:20.727165380 -0500
|
|
@@ -222,7 +222,7 @@
|
|
void cfg80211_stop_p2p_device(struct cfg80211_registered_device *rdev,
|
|
struct wireless_dev *wdev)
|
|
{
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
if (WARN_ON(wdev->iftype != NL80211_IFTYPE_P2P_DEVICE))
|
|
return;
|
|
@@ -247,7 +247,7 @@
|
|
void cfg80211_stop_nan(struct cfg80211_registered_device *rdev,
|
|
struct wireless_dev *wdev)
|
|
{
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
if (WARN_ON(wdev->iftype != NL80211_IFTYPE_NAN))
|
|
return;
|
|
@@ -273,7 +273,11 @@
|
|
dev_close(wdev->netdev);
|
|
continue;
|
|
}
|
|
+
|
|
/* otherwise, check iftype */
|
|
+
|
|
+ wiphy_lock(wiphy);
|
|
+
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_P2P_DEVICE:
|
|
cfg80211_stop_p2p_device(rdev, wdev);
|
|
@@ -284,6 +288,8 @@
|
|
default:
|
|
break;
|
|
}
|
|
+
|
|
+ wiphy_unlock(wiphy);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(cfg80211_shutdown_all_interfaces);
|
|
@@ -318,9 +324,9 @@
|
|
rdev = container_of(work, struct cfg80211_registered_device,
|
|
event_work);
|
|
|
|
- rtnl_lock();
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
cfg80211_process_rdev_events(rdev);
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
}
|
|
|
|
void cfg80211_destroy_ifaces(struct cfg80211_registered_device *rdev)
|
|
@@ -475,6 +481,7 @@
|
|
}
|
|
}
|
|
|
|
+ mutex_init(&rdev->wiphy.mtx);
|
|
INIT_LIST_HEAD(&rdev->wiphy.wdev_list);
|
|
INIT_LIST_HEAD(&rdev->beacon_registrations);
|
|
spin_lock_init(&rdev->beacon_registrations_lock);
|
|
@@ -1011,15 +1018,16 @@
|
|
|
|
wait_event(rdev->dev_wait, ({
|
|
int __count;
|
|
- rtnl_lock();
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
__count = rdev->opencount;
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
__count == 0; }));
|
|
|
|
if (rdev->rfkill)
|
|
rfkill_unregister(rdev->rfkill);
|
|
|
|
rtnl_lock();
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
nl80211_notify_wiphy(rdev, NL80211_CMD_DEL_WIPHY);
|
|
rdev->wiphy.registered = false;
|
|
|
|
@@ -1042,6 +1050,7 @@
|
|
cfg80211_rdev_list_generation++;
|
|
device_del(&rdev->wiphy.dev);
|
|
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
rtnl_unlock();
|
|
|
|
flush_work(&rdev->scan_done_wk);
|
|
@@ -1074,6 +1083,7 @@
|
|
}
|
|
list_for_each_entry_safe(scan, tmp, &rdev->bss_list, list)
|
|
cfg80211_put_bss(&rdev->wiphy, &scan->pub);
|
|
+ mutex_destroy(&rdev->wiphy.mtx);
|
|
kfree(rdev);
|
|
}
|
|
|
|
@@ -1098,19 +1108,28 @@
|
|
wdev->cqm_config = NULL;
|
|
}
|
|
|
|
-static void __cfg80211_unregister_wdev(struct wireless_dev *wdev, bool sync)
|
|
+static void _cfg80211_unregister_wdev(struct wireless_dev *wdev,
|
|
+ bool unregister_netdev)
|
|
{
|
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
|
|
ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
flush_work(&wdev->pmsr_free_wk);
|
|
|
|
nl80211_notify_iface(rdev, wdev, NL80211_CMD_DEL_INTERFACE);
|
|
|
|
+ wdev->registered = false;
|
|
+
|
|
+ if (wdev->netdev) {
|
|
+ sysfs_remove_link(&wdev->netdev->dev.kobj, "phy80211");
|
|
+ if (unregister_netdev)
|
|
+ unregister_netdevice(wdev->netdev);
|
|
+ }
|
|
+
|
|
list_del_rcu(&wdev->list);
|
|
- if (sync)
|
|
- synchronize_rcu();
|
|
+ synchronize_net();
|
|
rdev->devlist_generation++;
|
|
|
|
cfg80211_mlme_purge_registrations(wdev);
|
|
@@ -1135,14 +1154,23 @@
|
|
flush_work(&wdev->disconnect_wk);
|
|
|
|
cfg80211_cqm_config_free(wdev);
|
|
+
|
|
+ /*
|
|
+ * Ensure that all events have been processed and
|
|
+ * freed.
|
|
+ */
|
|
+ cfg80211_process_wdev_events(wdev);
|
|
+
|
|
+ if (WARN_ON(wdev->current_bss)) {
|
|
+ cfg80211_unhold_bss(wdev->current_bss);
|
|
+ cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);
|
|
+ wdev->current_bss = NULL;
|
|
+ }
|
|
}
|
|
|
|
void cfg80211_unregister_wdev(struct wireless_dev *wdev)
|
|
{
|
|
- if (WARN_ON(wdev->netdev))
|
|
- return;
|
|
-
|
|
- __cfg80211_unregister_wdev(wdev, true);
|
|
+ _cfg80211_unregister_wdev(wdev, true);
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_unregister_wdev);
|
|
|
|
@@ -1153,7 +1181,7 @@
|
|
void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
|
|
enum nl80211_iftype iftype, int num)
|
|
{
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
rdev->num_running_ifaces += num;
|
|
if (iftype == NL80211_IFTYPE_MONITOR)
|
|
@@ -1166,7 +1194,7 @@
|
|
struct net_device *dev = wdev->netdev;
|
|
struct cfg80211_sched_scan_request *pos, *tmp;
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
ASSERT_WDEV_LOCK(wdev);
|
|
|
|
cfg80211_pmsr_wdev_down(wdev);
|
|
@@ -1285,6 +1313,9 @@
|
|
void cfg80211_register_wdev(struct cfg80211_registered_device *rdev,
|
|
struct wireless_dev *wdev)
|
|
{
|
|
+ ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
+
|
|
/*
|
|
* We get here also when the interface changes network namespaces,
|
|
* as it's registered into the new one, but we don't want it to
|
|
@@ -1296,10 +1327,49 @@
|
|
wdev->identifier = ++rdev->wdev_id;
|
|
list_add_rcu(&wdev->list, &rdev->wiphy.wdev_list);
|
|
rdev->devlist_generation++;
|
|
+ wdev->registered = true;
|
|
|
|
nl80211_notify_iface(rdev, wdev, NL80211_CMD_NEW_INTERFACE);
|
|
}
|
|
|
|
+int cfg80211_register_netdevice(struct net_device *dev)
|
|
+{
|
|
+ struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
+ struct cfg80211_registered_device *rdev;
|
|
+ int ret;
|
|
+
|
|
+ ASSERT_RTNL();
|
|
+
|
|
+ if (WARN_ON(!wdev))
|
|
+ return -EINVAL;
|
|
+
|
|
+ rdev = wiphy_to_rdev(wdev->wiphy);
|
|
+
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
+
|
|
+ /* we'll take care of this */
|
|
+ wdev->registered = true;
|
|
+ ret = register_netdevice(dev);
|
|
+ if (ret)
|
|
+ goto out;
|
|
+
|
|
+ if (sysfs_create_link(&dev->dev.kobj, &rdev->wiphy.dev.kobj,
|
|
+ "phy80211")) {
|
|
+ pr_err("failed to add phy80211 symlink to netdev!\n");
|
|
+ unregister_netdevice(dev);
|
|
+ ret = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ cfg80211_register_wdev(rdev, wdev);
|
|
+ ret = 0;
|
|
+out:
|
|
+ if (ret)
|
|
+ wdev->registered = false;
|
|
+ return ret;
|
|
+}
|
|
+EXPORT_SYMBOL(cfg80211_register_netdevice);
|
|
+
|
|
static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
|
|
unsigned long state, void *ptr)
|
|
{
|
|
@@ -1325,22 +1395,28 @@
|
|
cfg80211_init_wdev(wdev);
|
|
break;
|
|
case NETDEV_REGISTER:
|
|
+ if (!wdev->registered) {
|
|
+ cfg80211_register_wdev(rdev, wdev);
|
|
+ }
|
|
+ break;
|
|
+ case NETDEV_UNREGISTER:
|
|
/*
|
|
- * NB: cannot take rdev->mtx here because this may be
|
|
- * called within code protected by it when interfaces
|
|
- * are added with nl80211.
|
|
+ * It is possible to get NETDEV_UNREGISTER multiple times,
|
|
+ * so check wdev->registered.
|
|
*/
|
|
- if (sysfs_create_link(&dev->dev.kobj, &rdev->wiphy.dev.kobj,
|
|
- "phy80211")) {
|
|
- pr_err("failed to add phy80211 symlink to netdev!\n");
|
|
+ if (wdev->registered) {
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
+ _cfg80211_unregister_wdev(wdev, false);
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
}
|
|
-
|
|
- cfg80211_register_wdev(rdev, wdev);
|
|
break;
|
|
case NETDEV_GOING_DOWN:
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
cfg80211_leave(rdev, wdev);
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
break;
|
|
case NETDEV_DOWN:
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
cfg80211_update_iface_num(rdev, wdev->iftype, -1);
|
|
if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
|
|
if (WARN_ON(!rdev->scan_req->notified &&
|
|
@@ -1357,9 +1433,11 @@
|
|
}
|
|
|
|
rdev->opencount--;
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
wake_up(&rdev->dev_wait);
|
|
break;
|
|
case NETDEV_UP:
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
cfg80211_update_iface_num(rdev, wdev->iftype, 1);
|
|
wdev_lock(wdev);
|
|
switch (wdev->iftype) {
|
|
@@ -1406,38 +1484,7 @@
|
|
/* assume this means it's off */
|
|
wdev->ps = false;
|
|
}
|
|
- break;
|
|
- case NETDEV_UNREGISTER:
|
|
- /*
|
|
- * It is possible to get NETDEV_UNREGISTER
|
|
- * multiple times. To detect that, check
|
|
- * that the interface is still on the list
|
|
- * of registered interfaces, and only then
|
|
- * remove and clean it up.
|
|
- */
|
|
- if (!list_empty(&wdev->list)) {
|
|
- __cfg80211_unregister_wdev(wdev, false);
|
|
- sysfs_remove_link(&dev->dev.kobj, "phy80211");
|
|
- }
|
|
- /*
|
|
- * synchronise (so that we won't find this netdev
|
|
- * from other code any more) and then clear the list
|
|
- * head so that the above code can safely check for
|
|
- * !list_empty() to avoid double-cleanup.
|
|
- */
|
|
- synchronize_rcu();
|
|
- INIT_LIST_HEAD(&wdev->list);
|
|
- /*
|
|
- * Ensure that all events have been processed and
|
|
- * freed.
|
|
- */
|
|
- cfg80211_process_wdev_events(wdev);
|
|
-
|
|
- if (WARN_ON(wdev->current_bss)) {
|
|
- cfg80211_unhold_bss(wdev->current_bss);
|
|
- cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);
|
|
- wdev->current_bss = NULL;
|
|
- }
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
break;
|
|
case NETDEV_PRE_UP:
|
|
if (!cfg80211_iftype_allowed(wdev->wiphy, wdev->iftype,
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/core.h linux-5.10.10-pentoo-johill/net/wireless/core.h
|
|
--- linux-5.10.10-pentoo/net/wireless/core.h 2021-01-26 20:37:37.588158814 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/core.h 2021-01-26 20:40:20.727165380 -0500
|
|
@@ -231,7 +231,7 @@
|
|
|
|
static inline bool cfg80211_has_monitors_only(struct cfg80211_registered_device *rdev)
|
|
{
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
return rdev->num_running_ifaces == rdev->num_running_monitor_ifaces &&
|
|
rdev->num_running_ifaces > 0;
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/debugfs.c linux-5.10.10-pentoo-johill/net/wireless/debugfs.c
|
|
--- linux-5.10.10-pentoo/net/wireless/debugfs.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/debugfs.c 2021-01-26 20:40:20.727165380 -0500
|
|
@@ -73,8 +73,6 @@
|
|
if (!buf)
|
|
return -ENOMEM;
|
|
|
|
- rtnl_lock();
|
|
-
|
|
for (band = 0; band < NUM_NL80211_BANDS; band++) {
|
|
sband = wiphy->bands[band];
|
|
if (!sband)
|
|
@@ -84,8 +82,6 @@
|
|
buf, buf_size, offset);
|
|
}
|
|
|
|
- rtnl_unlock();
|
|
-
|
|
r = simple_read_from_buffer(user_buf, count, ppos, buf, offset);
|
|
|
|
kfree(buf);
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/ibss.c linux-5.10.10-pentoo-johill/net/wireless/ibss.c
|
|
--- linux-5.10.10-pentoo/net/wireless/ibss.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/ibss.c 2021-01-26 20:40:20.727165380 -0500
|
|
@@ -3,6 +3,7 @@
|
|
* Some IBSS support code for cfg80211.
|
|
*
|
|
* Copyright 2009 Johannes Berg <johannes@sipsolutions.net>
|
|
+ * Copyright (C) 2020-2021 Intel Corporation
|
|
*/
|
|
|
|
#include <linux/etherdevice.h>
|
|
@@ -92,7 +93,7 @@
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
int err;
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
ASSERT_WDEV_LOCK(wdev);
|
|
|
|
if (wdev->ssid_len)
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/mlme.c linux-5.10.10-pentoo-johill/net/wireless/mlme.c
|
|
--- linux-5.10.10-pentoo/net/wireless/mlme.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/mlme.c 2021-01-26 20:40:20.727165380 -0500
|
|
@@ -446,7 +446,7 @@
|
|
struct cfg80211_mgmt_registration *reg;
|
|
struct mgmt_frame_regs upd = {};
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
spin_lock_bh(&wdev->mgmt_registrations_lock);
|
|
if (!wdev->mgmt_registrations_need_update) {
|
|
@@ -488,10 +488,10 @@
|
|
rdev = container_of(wk, struct cfg80211_registered_device,
|
|
mgmt_registrations_update_wk);
|
|
|
|
- rtnl_lock();
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list)
|
|
cfg80211_mgmt_registrations_update(wdev);
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
}
|
|
|
|
int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_portid,
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/nl80211.c linux-5.10.10-pentoo-johill/net/wireless/nl80211.c
|
|
--- linux-5.10.10-pentoo/net/wireless/nl80211.c 2021-01-26 20:37:37.589158814 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/nl80211.c 2021-01-26 20:40:20.730165380 -0500
|
|
@@ -64,9 +64,9 @@
|
|
|
|
/* returns ERR_PTR values */
|
|
static struct wireless_dev *
|
|
-__cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs)
|
|
+__cfg80211_wdev_from_attrs(struct cfg80211_registered_device *rdev,
|
|
+ struct net *netns, struct nlattr **attrs)
|
|
{
|
|
- struct cfg80211_registered_device *rdev;
|
|
struct wireless_dev *result = NULL;
|
|
bool have_ifidx = attrs[NL80211_ATTR_IFINDEX];
|
|
bool have_wdev_id = attrs[NL80211_ATTR_WDEV];
|
|
@@ -74,8 +74,6 @@
|
|
int wiphy_idx = -1;
|
|
int ifidx = -1;
|
|
|
|
- ASSERT_RTNL();
|
|
-
|
|
if (!have_ifidx && !have_wdev_id)
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
@@ -86,6 +84,28 @@
|
|
wiphy_idx = wdev_id >> 32;
|
|
}
|
|
|
|
+ if (rdev) {
|
|
+ struct wireless_dev *wdev;
|
|
+
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
+
|
|
+ list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
|
|
+ if (have_ifidx && wdev->netdev &&
|
|
+ wdev->netdev->ifindex == ifidx) {
|
|
+ result = wdev;
|
|
+ break;
|
|
+ }
|
|
+ if (have_wdev_id && wdev->identifier == (u32)wdev_id) {
|
|
+ result = wdev;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return result ?: ERR_PTR(-ENODEV);
|
|
+ }
|
|
+
|
|
+ ASSERT_RTNL();
|
|
+
|
|
list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
|
|
struct wireless_dev *wdev;
|
|
|
|
@@ -897,22 +917,31 @@
|
|
return err;
|
|
}
|
|
|
|
- *wdev = __cfg80211_wdev_from_attrs(sock_net(cb->skb->sk),
|
|
+ rtnl_lock();
|
|
+ *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk),
|
|
attrbuf);
|
|
kfree(attrbuf);
|
|
- if (IS_ERR(*wdev))
|
|
+ if (IS_ERR(*wdev)) {
|
|
+ rtnl_unlock();
|
|
return PTR_ERR(*wdev);
|
|
+ }
|
|
*rdev = wiphy_to_rdev((*wdev)->wiphy);
|
|
+ mutex_lock(&(*rdev)->wiphy.mtx);
|
|
+ rtnl_unlock();
|
|
/* 0 is the first index - add 1 to parse only once */
|
|
cb->args[0] = (*rdev)->wiphy_idx + 1;
|
|
cb->args[1] = (*wdev)->identifier;
|
|
} else {
|
|
/* subtract the 1 again here */
|
|
- struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
|
|
+ struct wiphy *wiphy;
|
|
struct wireless_dev *tmp;
|
|
|
|
- if (!wiphy)
|
|
+ rtnl_lock();
|
|
+ wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
|
|
+ if (!wiphy) {
|
|
+ rtnl_unlock();
|
|
return -ENODEV;
|
|
+ }
|
|
*rdev = wiphy_to_rdev(wiphy);
|
|
*wdev = NULL;
|
|
|
|
@@ -923,8 +952,12 @@
|
|
}
|
|
}
|
|
|
|
- if (!*wdev)
|
|
+ if (!*wdev) {
|
|
+ rtnl_unlock();
|
|
return -ENODEV;
|
|
+ }
|
|
+ mutex_lock(&(*rdev)->wiphy.mtx);
|
|
+ rtnl_unlock();
|
|
}
|
|
|
|
return 0;
|
|
@@ -3091,7 +3124,7 @@
|
|
|
|
static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
|
|
{
|
|
- struct cfg80211_registered_device *rdev;
|
|
+ struct cfg80211_registered_device *rdev = NULL;
|
|
struct net_device *netdev = NULL;
|
|
struct wireless_dev *wdev;
|
|
int result = 0, rem_txq_params = 0;
|
|
@@ -3102,8 +3135,7 @@
|
|
u8 coverage_class = 0;
|
|
u32 txq_limit = 0, txq_memory_limit = 0, txq_quantum = 0;
|
|
|
|
- ASSERT_RTNL();
|
|
-
|
|
+ rtnl_lock();
|
|
/*
|
|
* Try to find the wiphy and netdev. Normally this
|
|
* function shouldn't need the netdev, but this is
|
|
@@ -3127,14 +3159,19 @@
|
|
if (!netdev) {
|
|
rdev = __cfg80211_rdev_from_attrs(genl_info_net(info),
|
|
info->attrs);
|
|
- if (IS_ERR(rdev))
|
|
+ if (IS_ERR(rdev)) {
|
|
+ rtnl_unlock();
|
|
return PTR_ERR(rdev);
|
|
+ }
|
|
wdev = NULL;
|
|
netdev = NULL;
|
|
result = 0;
|
|
} else
|
|
wdev = netdev->ieee80211_ptr;
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
+ rtnl_unlock();
|
|
+
|
|
/*
|
|
* end workaround code, by now the rdev is available
|
|
* and locked, and wdev may or may not be NULL.
|
|
@@ -3145,24 +3182,32 @@
|
|
rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
|
|
|
|
if (result)
|
|
- return result;
|
|
+ goto out;
|
|
|
|
if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
|
|
struct ieee80211_txq_params txq_params;
|
|
struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
|
|
|
|
- if (!rdev->ops->set_txq_params)
|
|
- return -EOPNOTSUPP;
|
|
+ if (!rdev->ops->set_txq_params) {
|
|
+ result = -EOPNOTSUPP;
|
|
+ goto out;
|
|
+ }
|
|
|
|
- if (!netdev)
|
|
- return -EINVAL;
|
|
+ if (!netdev) {
|
|
+ result = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
|
|
if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
|
|
- netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
|
|
- return -EINVAL;
|
|
+ netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
|
|
+ result = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
|
|
- if (!netif_running(netdev))
|
|
- return -ENETDOWN;
|
|
+ if (!netif_running(netdev)) {
|
|
+ result = -ENETDOWN;
|
|
+ goto out;
|
|
+ }
|
|
|
|
nla_for_each_nested(nl_txq_params,
|
|
info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
|
|
@@ -3173,15 +3218,15 @@
|
|
txq_params_policy,
|
|
info->extack);
|
|
if (result)
|
|
- return result;
|
|
+ goto out;
|
|
result = parse_txq_params(tb, &txq_params);
|
|
if (result)
|
|
- return result;
|
|
+ goto out;
|
|
|
|
result = rdev_set_txq_params(rdev, netdev,
|
|
&txq_params);
|
|
if (result)
|
|
- return result;
|
|
+ goto out;
|
|
}
|
|
}
|
|
|
|
@@ -3191,7 +3236,7 @@
|
|
nl80211_can_set_dev_channel(wdev) ? netdev : NULL,
|
|
info);
|
|
if (result)
|
|
- return result;
|
|
+ goto out;
|
|
}
|
|
|
|
if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
|
|
@@ -3202,15 +3247,19 @@
|
|
if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER))
|
|
txp_wdev = NULL;
|
|
|
|
- if (!rdev->ops->set_tx_power)
|
|
- return -EOPNOTSUPP;
|
|
+ if (!rdev->ops->set_tx_power) {
|
|
+ result = -EOPNOTSUPP;
|
|
+ goto out;
|
|
+ }
|
|
|
|
idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
|
|
type = nla_get_u32(info->attrs[idx]);
|
|
|
|
if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
|
|
- (type != NL80211_TX_POWER_AUTOMATIC))
|
|
- return -EINVAL;
|
|
+ (type != NL80211_TX_POWER_AUTOMATIC)) {
|
|
+ result = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
|
|
if (type != NL80211_TX_POWER_AUTOMATIC) {
|
|
idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
|
|
@@ -3219,7 +3268,7 @@
|
|
|
|
result = rdev_set_tx_power(rdev, txp_wdev, type, mbm);
|
|
if (result)
|
|
- return result;
|
|
+ goto out;
|
|
}
|
|
|
|
if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
|
|
@@ -3228,8 +3277,10 @@
|
|
|
|
if ((!rdev->wiphy.available_antennas_tx &&
|
|
!rdev->wiphy.available_antennas_rx) ||
|
|
- !rdev->ops->set_antenna)
|
|
- return -EOPNOTSUPP;
|
|
+ !rdev->ops->set_antenna) {
|
|
+ result = -EOPNOTSUPP;
|
|
+ goto out;
|
|
+ }
|
|
|
|
tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
|
|
rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
|
|
@@ -3237,15 +3288,17 @@
|
|
/* reject antenna configurations which don't match the
|
|
* available antenna masks, except for the "all" mask */
|
|
if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
|
|
- (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx)))
|
|
- return -EINVAL;
|
|
+ (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) {
|
|
+ result = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
|
|
tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
|
|
rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
|
|
|
|
result = rdev_set_antenna(rdev, tx_ant, rx_ant);
|
|
if (result)
|
|
- return result;
|
|
+ goto out;
|
|
}
|
|
|
|
changed = 0;
|
|
@@ -3267,8 +3320,10 @@
|
|
if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
|
|
frag_threshold = nla_get_u32(
|
|
info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
|
|
- if (frag_threshold < 256)
|
|
- return -EINVAL;
|
|
+ if (frag_threshold < 256) {
|
|
+ result = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
|
|
if (frag_threshold != (u32) -1) {
|
|
/*
|
|
@@ -3289,8 +3344,10 @@
|
|
}
|
|
|
|
if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
|
|
- if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK])
|
|
- return -EINVAL;
|
|
+ if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) {
|
|
+ result = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
|
|
coverage_class = nla_get_u8(
|
|
info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
|
|
@@ -3298,16 +3355,20 @@
|
|
}
|
|
|
|
if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) {
|
|
- if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION))
|
|
- return -EOPNOTSUPP;
|
|
+ if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) {
|
|
+ result = -EOPNOTSUPP;
|
|
+ goto out;
|
|
+ }
|
|
|
|
changed |= WIPHY_PARAM_DYN_ACK;
|
|
}
|
|
|
|
if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) {
|
|
if (!wiphy_ext_feature_isset(&rdev->wiphy,
|
|
- NL80211_EXT_FEATURE_TXQS))
|
|
- return -EOPNOTSUPP;
|
|
+ NL80211_EXT_FEATURE_TXQS)) {
|
|
+ result = -EOPNOTSUPP;
|
|
+ goto out;
|
|
+ }
|
|
txq_limit = nla_get_u32(
|
|
info->attrs[NL80211_ATTR_TXQ_LIMIT]);
|
|
changed |= WIPHY_PARAM_TXQ_LIMIT;
|
|
@@ -3315,8 +3376,10 @@
|
|
|
|
if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) {
|
|
if (!wiphy_ext_feature_isset(&rdev->wiphy,
|
|
- NL80211_EXT_FEATURE_TXQS))
|
|
- return -EOPNOTSUPP;
|
|
+ NL80211_EXT_FEATURE_TXQS)) {
|
|
+ result = -EOPNOTSUPP;
|
|
+ goto out;
|
|
+ }
|
|
txq_memory_limit = nla_get_u32(
|
|
info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]);
|
|
changed |= WIPHY_PARAM_TXQ_MEMORY_LIMIT;
|
|
@@ -3324,8 +3387,10 @@
|
|
|
|
if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) {
|
|
if (!wiphy_ext_feature_isset(&rdev->wiphy,
|
|
- NL80211_EXT_FEATURE_TXQS))
|
|
- return -EOPNOTSUPP;
|
|
+ NL80211_EXT_FEATURE_TXQS)) {
|
|
+ result = -EOPNOTSUPP;
|
|
+ goto out;
|
|
+ }
|
|
txq_quantum = nla_get_u32(
|
|
info->attrs[NL80211_ATTR_TXQ_QUANTUM]);
|
|
changed |= WIPHY_PARAM_TXQ_QUANTUM;
|
|
@@ -3337,8 +3402,10 @@
|
|
u8 old_coverage_class;
|
|
u32 old_txq_limit, old_txq_memory_limit, old_txq_quantum;
|
|
|
|
- if (!rdev->ops->set_wiphy_params)
|
|
- return -EOPNOTSUPP;
|
|
+ if (!rdev->ops->set_wiphy_params) {
|
|
+ result = -EOPNOTSUPP;
|
|
+ goto out;
|
|
+ }
|
|
|
|
old_retry_short = rdev->wiphy.retry_short;
|
|
old_retry_long = rdev->wiphy.retry_long;
|
|
@@ -3376,10 +3443,15 @@
|
|
rdev->wiphy.txq_limit = old_txq_limit;
|
|
rdev->wiphy.txq_memory_limit = old_txq_memory_limit;
|
|
rdev->wiphy.txq_quantum = old_txq_quantum;
|
|
- return result;
|
|
+ goto out;
|
|
}
|
|
}
|
|
- return 0;
|
|
+
|
|
+ result = 0;
|
|
+
|
|
+out:
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+ return result;
|
|
}
|
|
|
|
static int nl80211_send_chandef(struct sk_buff *msg,
|
|
@@ -3910,6 +3982,17 @@
|
|
return -EOPNOTSUPP;
|
|
|
|
/*
|
|
+ * We hold RTNL, so this is safe, without RTNL opencount cannot
|
|
+ * reach 0, and thus the rdev cannot be deleted.
|
|
+ *
|
|
+ * We need to do it for the dev_close(), since that will call
|
|
+ * the netdev notifiers, and we need to acquire the mutex there
|
|
+ * but don't know if we get there from here or from some other
|
|
+ * place (e.g. "ip link set ... down").
|
|
+ */
|
|
+ mutex_unlock(&rdev->wiphy.mtx);
|
|
+
|
|
+ /*
|
|
* If we remove a wireless device without a netdev then clear
|
|
* user_ptr[1] so that nl80211_post_doit won't dereference it
|
|
* to check if it needs to do dev_put(). Otherwise it crashes
|
|
@@ -3918,6 +4001,10 @@
|
|
*/
|
|
if (!wdev->netdev)
|
|
info->user_ptr[1] = NULL;
|
|
+ else
|
|
+ dev_close(wdev->netdev);
|
|
+
|
|
+ mutex_lock(&rdev->wiphy.mtx);
|
|
|
|
return rdev_del_virtual_intf(rdev, wdev);
|
|
}
|
|
@@ -5807,10 +5894,11 @@
|
|
int sta_idx = cb->args[2];
|
|
int err;
|
|
|
|
- rtnl_lock();
|
|
err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
|
|
if (err)
|
|
- goto out_err;
|
|
+ return err;
|
|
+ /* nl80211_prepare_wdev_dump acquired it in the successful case */
|
|
+ __acquire(&rdev->wiphy.mtx);
|
|
|
|
if (!wdev->netdev) {
|
|
err = -EINVAL;
|
|
@@ -5845,7 +5933,7 @@
|
|
cb->args[2] = sta_idx;
|
|
err = skb->len;
|
|
out_err:
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
|
|
return err;
|
|
}
|
|
@@ -6703,10 +6791,11 @@
|
|
int path_idx = cb->args[2];
|
|
int err;
|
|
|
|
- rtnl_lock();
|
|
err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
|
|
if (err)
|
|
- goto out_err;
|
|
+ return err;
|
|
+ /* nl80211_prepare_wdev_dump acquired it in the successful case */
|
|
+ __acquire(&rdev->wiphy.mtx);
|
|
|
|
if (!rdev->ops->dump_mpath) {
|
|
err = -EOPNOTSUPP;
|
|
@@ -6739,7 +6828,7 @@
|
|
cb->args[2] = path_idx;
|
|
err = skb->len;
|
|
out_err:
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
return err;
|
|
}
|
|
|
|
@@ -6902,10 +6991,11 @@
|
|
int path_idx = cb->args[2];
|
|
int err;
|
|
|
|
- rtnl_lock();
|
|
err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
|
|
if (err)
|
|
- goto out_err;
|
|
+ return err;
|
|
+ /* nl80211_prepare_wdev_dump acquired it in the successful case */
|
|
+ __acquire(&rdev->wiphy.mtx);
|
|
|
|
if (!rdev->ops->dump_mpp) {
|
|
err = -EOPNOTSUPP;
|
|
@@ -6938,7 +7028,7 @@
|
|
cb->args[2] = path_idx;
|
|
err = skb->len;
|
|
out_err:
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
return err;
|
|
}
|
|
|
|
@@ -7557,12 +7647,15 @@
|
|
if (!hdr)
|
|
goto put_failure;
|
|
|
|
+ rtnl_lock();
|
|
+
|
|
if (info->attrs[NL80211_ATTR_WIPHY]) {
|
|
bool self_managed;
|
|
|
|
rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
|
|
if (IS_ERR(rdev)) {
|
|
nlmsg_free(msg);
|
|
+ rtnl_unlock();
|
|
return PTR_ERR(rdev);
|
|
}
|
|
|
|
@@ -7574,6 +7667,7 @@
|
|
/* a self-managed-reg device must have a private regdom */
|
|
if (WARN_ON(!regdom && self_managed)) {
|
|
nlmsg_free(msg);
|
|
+ rtnl_unlock();
|
|
return -EINVAL;
|
|
}
|
|
|
|
@@ -7598,11 +7692,13 @@
|
|
rcu_read_unlock();
|
|
|
|
genlmsg_end(msg, hdr);
|
|
+ rtnl_unlock();
|
|
return genlmsg_reply(msg, info);
|
|
|
|
nla_put_failure_rcu:
|
|
rcu_read_unlock();
|
|
nla_put_failure:
|
|
+ rtnl_unlock();
|
|
put_failure:
|
|
nlmsg_free(msg);
|
|
return -EMSGSIZE;
|
|
@@ -7765,12 +7861,17 @@
|
|
return -EINVAL;
|
|
}
|
|
|
|
- if (!reg_is_valid_request(alpha2))
|
|
- return -EINVAL;
|
|
+ rtnl_lock();
|
|
+ if (!reg_is_valid_request(alpha2)) {
|
|
+ r = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
|
|
rd = kzalloc(struct_size(rd, reg_rules, num_rules), GFP_KERNEL);
|
|
- if (!rd)
|
|
- return -ENOMEM;
|
|
+ if (!rd) {
|
|
+ r = -ENOMEM;
|
|
+ goto out;
|
|
+ }
|
|
|
|
rd->n_reg_rules = num_rules;
|
|
rd->alpha2[0] = alpha2[0];
|
|
@@ -7802,10 +7903,13 @@
|
|
}
|
|
}
|
|
|
|
+ r = set_regdom(rd, REGD_SOURCE_CRDA);
|
|
/* set_regdom takes ownership of rd */
|
|
- return set_regdom(rd, REGD_SOURCE_CRDA);
|
|
+ rd = NULL;
|
|
bad_reg:
|
|
kfree(rd);
|
|
+ out:
|
|
+ rtnl_unlock();
|
|
return r;
|
|
}
|
|
#endif /* CONFIG_CFG80211_CRDA_SUPPORT */
|
|
@@ -8979,10 +9083,7 @@
|
|
struct net_device *dev = info->user_ptr[1];
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
struct cfg80211_csa_settings params;
|
|
- /* csa_attrs is defined static to avoid waste of stack size - this
|
|
- * function is called under RTNL lock, so this should not be a problem.
|
|
- */
|
|
- static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1];
|
|
+ struct nlattr **csa_attrs = NULL;
|
|
int err;
|
|
bool need_new_beacon = false;
|
|
bool need_handle_dfs_flag = true;
|
|
@@ -9047,28 +9148,39 @@
|
|
if (err)
|
|
return err;
|
|
|
|
+ csa_attrs = kcalloc(NL80211_ATTR_MAX + 1, sizeof(*csa_attrs),
|
|
+ GFP_KERNEL);
|
|
+ if (!csa_attrs)
|
|
+ return -ENOMEM;
|
|
+
|
|
err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX,
|
|
info->attrs[NL80211_ATTR_CSA_IES],
|
|
nl80211_policy, info->extack);
|
|
if (err)
|
|
- return err;
|
|
+ goto free;
|
|
|
|
err = nl80211_parse_beacon(rdev, csa_attrs, ¶ms.beacon_csa);
|
|
if (err)
|
|
- return err;
|
|
+ goto free;
|
|
|
|
- if (!csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON])
|
|
- return -EINVAL;
|
|
+ if (!csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]) {
|
|
+ err = -EINVAL;
|
|
+ goto free;
|
|
+ }
|
|
|
|
len = nla_len(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]);
|
|
- if (!len || (len % sizeof(u16)))
|
|
- return -EINVAL;
|
|
+ if (!len || (len % sizeof(u16))) {
|
|
+ err = -EINVAL;
|
|
+ goto free;
|
|
+ }
|
|
|
|
params.n_counter_offsets_beacon = len / sizeof(u16);
|
|
if (rdev->wiphy.max_num_csa_counters &&
|
|
(params.n_counter_offsets_beacon >
|
|
- rdev->wiphy.max_num_csa_counters))
|
|
- return -EINVAL;
|
|
+ rdev->wiphy.max_num_csa_counters)) {
|
|
+ err = -EINVAL;
|
|
+ goto free;
|
|
+ }
|
|
|
|
params.counter_offsets_beacon =
|
|
nla_data(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]);
|
|
@@ -9077,23 +9189,31 @@
|
|
for (i = 0; i < params.n_counter_offsets_beacon; i++) {
|
|
u16 offset = params.counter_offsets_beacon[i];
|
|
|
|
- if (offset >= params.beacon_csa.tail_len)
|
|
- return -EINVAL;
|
|
+ if (offset >= params.beacon_csa.tail_len) {
|
|
+ err = -EINVAL;
|
|
+ goto free;
|
|
+ }
|
|
|
|
- if (params.beacon_csa.tail[offset] != params.count)
|
|
- return -EINVAL;
|
|
+ if (params.beacon_csa.tail[offset] != params.count) {
|
|
+ err = -EINVAL;
|
|
+ goto free;
|
|
+ }
|
|
}
|
|
|
|
if (csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP]) {
|
|
len = nla_len(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP]);
|
|
- if (!len || (len % sizeof(u16)))
|
|
- return -EINVAL;
|
|
+ if (!len || (len % sizeof(u16))) {
|
|
+ err = -EINVAL;
|
|
+ goto free;
|
|
+ }
|
|
|
|
params.n_counter_offsets_presp = len / sizeof(u16);
|
|
if (rdev->wiphy.max_num_csa_counters &&
|
|
(params.n_counter_offsets_presp >
|
|
- rdev->wiphy.max_num_csa_counters))
|
|
- return -EINVAL;
|
|
+ rdev->wiphy.max_num_csa_counters)) {
|
|
+ err = -EINVAL;
|
|
+ goto free;
|
|
+ }
|
|
|
|
params.counter_offsets_presp =
|
|
nla_data(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP]);
|
|
@@ -9102,35 +9222,42 @@
|
|
for (i = 0; i < params.n_counter_offsets_presp; i++) {
|
|
u16 offset = params.counter_offsets_presp[i];
|
|
|
|
- if (offset >= params.beacon_csa.probe_resp_len)
|
|
- return -EINVAL;
|
|
+ if (offset >= params.beacon_csa.probe_resp_len) {
|
|
+ err = -EINVAL;
|
|
+ goto free;
|
|
+ }
|
|
|
|
if (params.beacon_csa.probe_resp[offset] !=
|
|
- params.count)
|
|
- return -EINVAL;
|
|
+ params.count) {
|
|
+ err = -EINVAL;
|
|
+ goto free;
|
|
+ }
|
|
}
|
|
}
|
|
|
|
skip_beacons:
|
|
err = nl80211_parse_chandef(rdev, info, ¶ms.chandef);
|
|
if (err)
|
|
- return err;
|
|
+ goto free;
|
|
|
|
if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef,
|
|
- wdev->iftype))
|
|
- return -EINVAL;
|
|
+ wdev->iftype)) {
|
|
+ err = -EINVAL;
|
|
+ goto free;
|
|
+ }
|
|
|
|
err = cfg80211_chandef_dfs_required(wdev->wiphy,
|
|
¶ms.chandef,
|
|
wdev->iftype);
|
|
if (err < 0)
|
|
- return err;
|
|
+ goto free;
|
|
|
|
if (err > 0) {
|
|
params.radar_required = true;
|
|
if (need_handle_dfs_flag &&
|
|
!nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) {
|
|
- return -EINVAL;
|
|
+ err = -EINVAL;
|
|
+ goto free;
|
|
}
|
|
}
|
|
|
|
@@ -9141,6 +9268,8 @@
|
|
err = rdev_channel_switch(rdev, dev, ¶ms);
|
|
wdev_unlock(wdev);
|
|
|
|
+free:
|
|
+ kfree(csa_attrs);
|
|
return err;
|
|
}
|
|
|
|
@@ -9291,12 +9420,11 @@
|
|
int start = cb->args[2], idx = 0;
|
|
int err;
|
|
|
|
- rtnl_lock();
|
|
err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
|
|
- if (err) {
|
|
- rtnl_unlock();
|
|
+ if (err)
|
|
return err;
|
|
- }
|
|
+ /* nl80211_prepare_wdev_dump acquired it in the successful case */
|
|
+ __acquire(&rdev->wiphy.mtx);
|
|
|
|
wdev_lock(wdev);
|
|
spin_lock_bh(&rdev->bss_lock);
|
|
@@ -9327,7 +9455,7 @@
|
|
wdev_unlock(wdev);
|
|
|
|
cb->args[2] = idx;
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
|
|
return skb->len;
|
|
}
|
|
@@ -9425,10 +9553,13 @@
|
|
if (!attrbuf)
|
|
return -ENOMEM;
|
|
|
|
- rtnl_lock();
|
|
res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
|
|
- if (res)
|
|
- goto out_err;
|
|
+ if (res) {
|
|
+ kfree(attrbuf);
|
|
+ return res;
|
|
+ }
|
|
+ /* nl80211_prepare_wdev_dump acquired it in the successful case */
|
|
+ __acquire(&rdev->wiphy.mtx);
|
|
|
|
/* prepare_wdev_dump parsed the attributes */
|
|
radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
|
|
@@ -9470,7 +9601,7 @@
|
|
res = skb->len;
|
|
out_err:
|
|
kfree(attrbuf);
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
return res;
|
|
}
|
|
|
|
@@ -10326,10 +10457,14 @@
|
|
static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
|
|
{
|
|
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
|
- struct wireless_dev *wdev =
|
|
- __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
|
|
+ struct wireless_dev *wdev;
|
|
int err;
|
|
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
+
|
|
+ wdev = __cfg80211_wdev_from_attrs(rdev, genl_info_net(info),
|
|
+ info->attrs);
|
|
+
|
|
if (!rdev->ops->testmode_cmd)
|
|
return -EOPNOTSUPP;
|
|
|
|
@@ -13513,7 +13648,8 @@
|
|
{
|
|
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
|
struct wireless_dev *wdev =
|
|
- __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
|
|
+ __cfg80211_wdev_from_attrs(rdev, genl_info_net(info),
|
|
+ info->attrs);
|
|
int i, err;
|
|
u32 vid, subcmd;
|
|
|
|
@@ -13637,7 +13773,7 @@
|
|
goto out;
|
|
}
|
|
|
|
- *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf);
|
|
+ *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf);
|
|
if (IS_ERR(*wdev))
|
|
*wdev = NULL;
|
|
|
|
@@ -14571,31 +14707,24 @@
|
|
static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
|
|
struct genl_info *info)
|
|
{
|
|
- struct cfg80211_registered_device *rdev;
|
|
+ struct cfg80211_registered_device *rdev = NULL;
|
|
struct wireless_dev *wdev;
|
|
struct net_device *dev;
|
|
- bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL;
|
|
-
|
|
- if (rtnl)
|
|
- rtnl_lock();
|
|
|
|
+ rtnl_lock();
|
|
if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) {
|
|
rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
|
|
if (IS_ERR(rdev)) {
|
|
- if (rtnl)
|
|
- rtnl_unlock();
|
|
+ rtnl_unlock();
|
|
return PTR_ERR(rdev);
|
|
}
|
|
info->user_ptr[0] = rdev;
|
|
} else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV ||
|
|
ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
|
|
- ASSERT_RTNL();
|
|
-
|
|
- wdev = __cfg80211_wdev_from_attrs(genl_info_net(info),
|
|
+ wdev = __cfg80211_wdev_from_attrs(NULL, genl_info_net(info),
|
|
info->attrs);
|
|
if (IS_ERR(wdev)) {
|
|
- if (rtnl)
|
|
- rtnl_unlock();
|
|
+ rtnl_unlock();
|
|
return PTR_ERR(wdev);
|
|
}
|
|
|
|
@@ -14604,8 +14733,7 @@
|
|
|
|
if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) {
|
|
if (!dev) {
|
|
- if (rtnl)
|
|
- rtnl_unlock();
|
|
+ rtnl_unlock();
|
|
return -EINVAL;
|
|
}
|
|
|
|
@@ -14616,8 +14744,7 @@
|
|
|
|
if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
|
|
!wdev_running(wdev)) {
|
|
- if (rtnl)
|
|
- rtnl_unlock();
|
|
+ rtnl_unlock();
|
|
return -ENETDOWN;
|
|
}
|
|
|
|
@@ -14627,6 +14754,14 @@
|
|
info->user_ptr[0] = rdev;
|
|
}
|
|
|
|
+ if (rdev) {
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
+ /* we keep the mutex locked until post_doit */
|
|
+ __release(&rdev->wiphy.mtx);
|
|
+ }
|
|
+ if (!(ops->internal_flags & NL80211_FLAG_NEED_RTNL))
|
|
+ rtnl_unlock();
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -14644,6 +14779,14 @@
|
|
}
|
|
}
|
|
|
|
+ if (info->user_ptr[0]) {
|
|
+ struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
|
+
|
|
+ /* we kept the mutex locked since pre_doit */
|
|
+ __acquire(&rdev->wiphy.mtx);
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+ }
|
|
+
|
|
if (ops->internal_flags & NL80211_FLAG_NEED_RTNL)
|
|
rtnl_unlock();
|
|
|
|
@@ -14667,8 +14810,7 @@
|
|
.dumpit = nl80211_dump_wiphy,
|
|
.done = nl80211_dump_wiphy_done,
|
|
/* can be retrieved by unprivileged users */
|
|
- .internal_flags = NL80211_FLAG_NEED_WIPHY |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WIPHY,
|
|
},
|
|
};
|
|
|
|
@@ -14678,7 +14820,6 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_wiphy,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_RTNL,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_GET_INTERFACE,
|
|
@@ -14686,8 +14827,7 @@
|
|
.doit = nl80211_get_interface,
|
|
.dumpit = nl80211_dump_interface,
|
|
/* can be retrieved by unprivileged users */
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_INTERFACE,
|
|
@@ -14718,8 +14858,7 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_get_key,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_KEY,
|
|
@@ -14727,7 +14866,6 @@
|
|
.doit = nl80211_set_key,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL |
|
|
NL80211_FLAG_CLEAR_SKB,
|
|
},
|
|
{
|
|
@@ -14736,7 +14874,6 @@
|
|
.doit = nl80211_new_key,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL |
|
|
NL80211_FLAG_CLEAR_SKB,
|
|
},
|
|
{
|
|
@@ -14744,64 +14881,56 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_del_key,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_BEACON,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
.doit = nl80211_set_beacon,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_START_AP,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
.doit = nl80211_start_ap,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_STOP_AP,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
.doit = nl80211_stop_ap,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_GET_STATION,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_get_station,
|
|
.dumpit = nl80211_dump_station,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_STATION,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_station,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_NEW_STATION,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_new_station,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_DEL_STATION,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_del_station,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_GET_MPATH,
|
|
@@ -14809,8 +14938,7 @@
|
|
.doit = nl80211_get_mpath,
|
|
.dumpit = nl80211_dump_mpath,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_GET_MPP,
|
|
@@ -14818,47 +14946,42 @@
|
|
.doit = nl80211_get_mpp,
|
|
.dumpit = nl80211_dump_mpp,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_MPATH,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_mpath,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_NEW_MPATH,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_new_mpath,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_DEL_MPATH,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_del_mpath,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_BSS,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_bss,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_GET_REG,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_get_reg_do,
|
|
.dumpit = nl80211_get_reg_dump,
|
|
- .internal_flags = NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = 0,
|
|
/* can be retrieved by unprivileged users */
|
|
},
|
|
#ifdef CONFIG_CFG80211_CRDA_SUPPORT
|
|
@@ -14867,7 +14990,7 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_reg,
|
|
.flags = GENL_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = 0,
|
|
},
|
|
#endif
|
|
{
|
|
@@ -14887,32 +15010,28 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_get_mesh_config,
|
|
/* can be retrieved by unprivileged users */
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_MESH_CONFIG,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_update_mesh_config,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_TRIGGER_SCAN,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_trigger_scan,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_ABORT_SCAN,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_abort_scan,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_GET_SCAN,
|
|
@@ -14924,16 +15043,14 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_start_sched_scan,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_STOP_SCHED_SCAN,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_stop_sched_scan,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_AUTHENTICATE,
|
|
@@ -14941,7 +15058,7 @@
|
|
.doit = nl80211_authenticate,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL |
|
|
+ 0 |
|
|
NL80211_FLAG_CLEAR_SKB,
|
|
},
|
|
{
|
|
@@ -14950,7 +15067,7 @@
|
|
.doit = nl80211_associate,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL |
|
|
+ 0 |
|
|
NL80211_FLAG_CLEAR_SKB,
|
|
},
|
|
{
|
|
@@ -14958,32 +15075,28 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_deauthenticate,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_DISASSOCIATE,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_disassociate,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_JOIN_IBSS,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_join_ibss,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_LEAVE_IBSS,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_leave_ibss,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
#ifdef CONFIG_NL80211_TESTMODE
|
|
{
|
|
@@ -14992,8 +15105,7 @@
|
|
.doit = nl80211_testmode_do,
|
|
.dumpit = nl80211_testmode_dump,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WIPHY |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WIPHY,
|
|
},
|
|
#endif
|
|
{
|
|
@@ -15002,7 +15114,7 @@
|
|
.doit = nl80211_connect,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL |
|
|
+ 0 |
|
|
NL80211_FLAG_CLEAR_SKB,
|
|
},
|
|
{
|
|
@@ -15011,7 +15123,7 @@
|
|
.doit = nl80211_update_connect_params,
|
|
.flags = GENL_ADMIN_PERM,
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL |
|
|
+ 0 |
|
|
NL80211_FLAG_CLEAR_SKB,
|
|
},
|
|
{
|
|
@@ -15019,16 +15131,14 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_disconnect,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_WIPHY_NETNS,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_wiphy_netns,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WIPHY |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WIPHY,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_GET_SURVEY,
|
|
@@ -15041,7 +15151,7 @@
|
|
.doit = nl80211_setdel_pmksa,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL |
|
|
+ 0 |
|
|
NL80211_FLAG_CLEAR_SKB,
|
|
},
|
|
{
|
|
@@ -15049,96 +15159,84 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_setdel_pmksa,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_FLUSH_PMKSA,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_flush_pmksa,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_remain_on_channel,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_cancel_remain_on_channel,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_tx_bitrate_mask,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_REGISTER_FRAME,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_register_mgmt,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_FRAME,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_tx_mgmt,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_tx_mgmt_cancel_wait,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_POWER_SAVE,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_power_save,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_GET_POWER_SAVE,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_get_power_save,
|
|
/* can be retrieved by unprivileged users */
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_CQM,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_cqm,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_CHANNEL,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_channel,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_WDS_PEER,
|
|
@@ -15153,32 +15251,28 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_join_mesh,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_LEAVE_MESH,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_leave_mesh,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_JOIN_OCB,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_join_ocb,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_LEAVE_OCB,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_leave_ocb,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
#ifdef CONFIG_PM
|
|
{
|
|
@@ -15186,16 +15280,14 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_get_wowlan,
|
|
/* can be retrieved by unprivileged users */
|
|
- .internal_flags = NL80211_FLAG_NEED_WIPHY |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WIPHY,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_WOWLAN,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_wowlan,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WIPHY |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WIPHY,
|
|
},
|
|
#endif
|
|
{
|
|
@@ -15204,7 +15296,7 @@
|
|
.doit = nl80211_set_rekey_data,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL |
|
|
+ 0 |
|
|
NL80211_FLAG_CLEAR_SKB,
|
|
},
|
|
{
|
|
@@ -15212,48 +15304,42 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_tdls_mgmt,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_TDLS_OPER,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_tdls_oper,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_UNEXPECTED_FRAME,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_register_unexpected_frame,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_PROBE_CLIENT,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_probe_client,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_REGISTER_BEACONS,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_register_beacons,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WIPHY |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WIPHY,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_NOACK_MAP,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_noack_map,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_START_P2P_DEVICE,
|
|
@@ -15292,48 +15378,42 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_nan_add_func,
|
|
.flags = GENL_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_DEL_NAN_FUNCTION,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_nan_del_func,
|
|
.flags = GENL_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_CHANGE_NAN_CONFIG,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_nan_change_config,
|
|
.flags = GENL_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_MCAST_RATE,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_mcast_rate,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_MAC_ACL,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_mac_acl,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_RADAR_DETECT,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_start_radar_detection,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
|
|
@@ -15345,47 +15425,41 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_update_ft_ies,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_CRIT_PROTOCOL_START,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_crit_protocol_start,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_crit_protocol_stop,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_GET_COALESCE,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_get_coalesce,
|
|
- .internal_flags = NL80211_FLAG_NEED_WIPHY |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WIPHY,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_COALESCE,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_coalesce,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WIPHY |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WIPHY,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_CHANNEL_SWITCH,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_channel_switch,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_VENDOR,
|
|
@@ -15394,7 +15468,7 @@
|
|
.dumpit = nl80211_vendor_cmd_dump,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
.internal_flags = NL80211_FLAG_NEED_WIPHY |
|
|
- NL80211_FLAG_NEED_RTNL |
|
|
+ 0 |
|
|
NL80211_FLAG_CLEAR_SKB,
|
|
},
|
|
{
|
|
@@ -15402,123 +15476,108 @@
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_qos_map,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_ADD_TX_TS,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_add_tx_ts,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_DEL_TX_TS,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_del_tx_ts,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_tdls_channel_switch,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_tdls_cancel_channel_switch,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_multicast_to_unicast,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_PMK,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_set_pmk,
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL |
|
|
+ 0 |
|
|
NL80211_FLAG_CLEAR_SKB,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_DEL_PMK,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_del_pmk,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_EXTERNAL_AUTH,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_external_auth,
|
|
.flags = GENL_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_CONTROL_PORT_FRAME,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_tx_control_port,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_get_ftm_responder_stats,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_PEER_MEASUREMENT_START,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_pmsr_start,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_WDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_NOTIFY_RADAR,
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
|
.doit = nl80211_notify_radar_detection,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_UPDATE_OWE_INFO,
|
|
.doit = nl80211_update_owe_info,
|
|
.flags = GENL_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_PROBE_MESH_LINK,
|
|
.doit = nl80211_probe_mesh_link,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP,
|
|
},
|
|
{
|
|
.cmd = NL80211_CMD_SET_TID_CONFIG,
|
|
.doit = nl80211_set_tid_config,
|
|
.flags = GENL_UNS_ADMIN_PERM,
|
|
- .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
- NL80211_FLAG_NEED_RTNL,
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV,
|
|
},
|
|
};
|
|
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/reg.c linux-5.10.10-pentoo-johill/net/wireless/reg.c
|
|
--- linux-5.10.10-pentoo/net/wireless/reg.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/reg.c 2021-01-26 20:40:20.731165380 -0500
|
|
@@ -141,8 +141,11 @@
|
|
|
|
const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy)
|
|
{
|
|
- return rcu_dereference_rtnl(wiphy->regd);
|
|
+ return rcu_dereference_check(wiphy->regd,
|
|
+ lockdep_is_held(&wiphy->mtx) ||
|
|
+ lockdep_rtnl_is_held());
|
|
}
|
|
+EXPORT_SYMBOL(get_wiphy_regdom);
|
|
|
|
static const char *reg_dfs_region_str(enum nl80211_dfs_regions dfs_region)
|
|
{
|
|
@@ -164,7 +167,9 @@
|
|
const struct ieee80211_regdomain *regd = NULL;
|
|
const struct ieee80211_regdomain *wiphy_regd = NULL;
|
|
|
|
+ rcu_read_lock();
|
|
regd = get_cfg80211_regdom();
|
|
+
|
|
if (!wiphy)
|
|
goto out;
|
|
|
|
@@ -181,6 +186,8 @@
|
|
reg_dfs_region_str(regd->dfs_region));
|
|
|
|
out:
|
|
+ rcu_read_unlock();
|
|
+
|
|
return regd->dfs_region;
|
|
}
|
|
|
|
@@ -2727,7 +2734,10 @@
|
|
return REG_REQ_IGNORE;
|
|
|
|
tmp = get_wiphy_regdom(wiphy);
|
|
+ ASSERT_RTNL();
|
|
+ wiphy_lock(wiphy);
|
|
rcu_assign_pointer(wiphy->regd, regd);
|
|
+ wiphy_unlock(wiphy);
|
|
rcu_free_regdom(tmp);
|
|
}
|
|
|
|
@@ -3059,41 +3069,52 @@
|
|
spin_unlock_bh(®_pending_beacons_lock);
|
|
}
|
|
|
|
-static void reg_process_self_managed_hints(void)
|
|
+static void reg_process_self_managed_hint(struct wiphy *wiphy)
|
|
{
|
|
- struct cfg80211_registered_device *rdev;
|
|
- struct wiphy *wiphy;
|
|
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
|
const struct ieee80211_regdomain *tmp;
|
|
const struct ieee80211_regdomain *regd;
|
|
enum nl80211_band band;
|
|
struct regulatory_request request = {};
|
|
|
|
- list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
|
|
- wiphy = &rdev->wiphy;
|
|
+ ASSERT_RTNL();
|
|
+ lockdep_assert_wiphy(wiphy);
|
|
|
|
- spin_lock(®_requests_lock);
|
|
- regd = rdev->requested_regd;
|
|
- rdev->requested_regd = NULL;
|
|
- spin_unlock(®_requests_lock);
|
|
+ spin_lock(®_requests_lock);
|
|
+ regd = rdev->requested_regd;
|
|
+ rdev->requested_regd = NULL;
|
|
+ spin_unlock(®_requests_lock);
|
|
|
|
- if (regd == NULL)
|
|
- continue;
|
|
+ if (!regd)
|
|
+ return;
|
|
|
|
- tmp = get_wiphy_regdom(wiphy);
|
|
- rcu_assign_pointer(wiphy->regd, regd);
|
|
- rcu_free_regdom(tmp);
|
|
+ tmp = get_wiphy_regdom(wiphy);
|
|
+ rcu_assign_pointer(wiphy->regd, regd);
|
|
+ rcu_free_regdom(tmp);
|
|
+
|
|
+ for (band = 0; band < NUM_NL80211_BANDS; band++)
|
|
+ handle_band_custom(wiphy, wiphy->bands[band], regd);
|
|
|
|
- for (band = 0; band < NUM_NL80211_BANDS; band++)
|
|
- handle_band_custom(wiphy, wiphy->bands[band], regd);
|
|
+ reg_process_ht_flags(wiphy);
|
|
|
|
- reg_process_ht_flags(wiphy);
|
|
+ request.wiphy_idx = get_wiphy_idx(wiphy);
|
|
+ request.alpha2[0] = regd->alpha2[0];
|
|
+ request.alpha2[1] = regd->alpha2[1];
|
|
+ request.initiator = NL80211_REGDOM_SET_BY_DRIVER;
|
|
|
|
- request.wiphy_idx = get_wiphy_idx(wiphy);
|
|
- request.alpha2[0] = regd->alpha2[0];
|
|
- request.alpha2[1] = regd->alpha2[1];
|
|
- request.initiator = NL80211_REGDOM_SET_BY_DRIVER;
|
|
+ nl80211_send_wiphy_reg_change_event(&request);
|
|
+}
|
|
|
|
- nl80211_send_wiphy_reg_change_event(&request);
|
|
+static void reg_process_self_managed_hints(void)
|
|
+{
|
|
+ struct cfg80211_registered_device *rdev;
|
|
+
|
|
+ ASSERT_RTNL();
|
|
+
|
|
+ list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
+ reg_process_self_managed_hint(&rdev->wiphy);
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
}
|
|
|
|
reg_check_channels();
|
|
@@ -3772,14 +3793,21 @@
|
|
return -ENODEV;
|
|
|
|
if (!driver_request->intersect) {
|
|
- if (request_wiphy->regd)
|
|
+ ASSERT_RTNL();
|
|
+ wiphy_lock(request_wiphy);
|
|
+ if (request_wiphy->regd) {
|
|
+ wiphy_unlock(request_wiphy);
|
|
return -EALREADY;
|
|
+ }
|
|
|
|
regd = reg_copy_regd(rd);
|
|
- if (IS_ERR(regd))
|
|
+ if (IS_ERR(regd)) {
|
|
+ wiphy_unlock(request_wiphy);
|
|
return PTR_ERR(regd);
|
|
+ }
|
|
|
|
rcu_assign_pointer(request_wiphy->regd, regd);
|
|
+ wiphy_unlock(request_wiphy);
|
|
reset_regdomains(false, rd);
|
|
return 0;
|
|
}
|
|
@@ -3961,8 +3989,8 @@
|
|
}
|
|
EXPORT_SYMBOL(regulatory_set_wiphy_regd);
|
|
|
|
-int regulatory_set_wiphy_regd_sync_rtnl(struct wiphy *wiphy,
|
|
- struct ieee80211_regdomain *rd)
|
|
+int regulatory_set_wiphy_regd_sync(struct wiphy *wiphy,
|
|
+ struct ieee80211_regdomain *rd)
|
|
{
|
|
int ret;
|
|
|
|
@@ -3973,10 +4001,11 @@
|
|
return ret;
|
|
|
|
/* process the request immediately */
|
|
- reg_process_self_managed_hints();
|
|
+ reg_process_self_managed_hint(wiphy);
|
|
+ reg_check_channels();
|
|
return 0;
|
|
}
|
|
-EXPORT_SYMBOL(regulatory_set_wiphy_regd_sync_rtnl);
|
|
+EXPORT_SYMBOL(regulatory_set_wiphy_regd_sync);
|
|
|
|
void wiphy_regulatory_register(struct wiphy *wiphy)
|
|
{
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/reg.h linux-5.10.10-pentoo-johill/net/wireless/reg.h
|
|
--- linux-5.10.10-pentoo/net/wireless/reg.h 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/reg.h 2021-01-26 20:40:20.731165380 -0500
|
|
@@ -63,7 +63,6 @@
|
|
const struct ieee80211_reg_rule *rule);
|
|
|
|
bool reg_last_request_cell_base(void);
|
|
-const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy);
|
|
|
|
/**
|
|
* regulatory_hint_found_beacon - hints a beacon was found on a channel
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/scan.c linux-5.10.10-pentoo-johill/net/wireless/scan.c
|
|
--- linux-5.10.10-pentoo/net/wireless/scan.c 2021-01-26 20:37:38.163158837 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/scan.c 2021-01-26 20:40:20.731165380 -0500
|
|
@@ -920,7 +920,7 @@
|
|
union iwreq_data wrqu;
|
|
#endif
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
if (rdev->scan_msg) {
|
|
nl80211_send_scan_msg(rdev, rdev->scan_msg);
|
|
@@ -989,9 +989,9 @@
|
|
rdev = container_of(wk, struct cfg80211_registered_device,
|
|
scan_done_wk);
|
|
|
|
- rtnl_lock();
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
___cfg80211_scan_done(rdev, true);
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
}
|
|
|
|
void cfg80211_scan_done(struct cfg80211_scan_request *request,
|
|
@@ -1024,7 +1024,7 @@
|
|
void cfg80211_add_sched_scan_req(struct cfg80211_registered_device *rdev,
|
|
struct cfg80211_sched_scan_request *req)
|
|
{
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
list_add_rcu(&req->list, &rdev->sched_scan_req_list);
|
|
}
|
|
@@ -1032,7 +1032,7 @@
|
|
static void cfg80211_del_sched_scan_req(struct cfg80211_registered_device *rdev,
|
|
struct cfg80211_sched_scan_request *req)
|
|
{
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
list_del_rcu(&req->list);
|
|
kfree_rcu(req, rcu_head);
|
|
@@ -1044,7 +1044,7 @@
|
|
struct cfg80211_sched_scan_request *pos;
|
|
|
|
list_for_each_entry_rcu(pos, &rdev->sched_scan_req_list, list,
|
|
- lockdep_rtnl_is_held()) {
|
|
+ lockdep_is_held(&rdev->wiphy.mtx)) {
|
|
if (pos->reqid == reqid)
|
|
return pos;
|
|
}
|
|
@@ -1092,7 +1092,7 @@
|
|
rdev = container_of(work, struct cfg80211_registered_device,
|
|
sched_scan_res_wk);
|
|
|
|
- rtnl_lock();
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
list_for_each_entry_safe(req, tmp, &rdev->sched_scan_req_list, list) {
|
|
if (req->report_results) {
|
|
req->report_results = false;
|
|
@@ -1107,7 +1107,7 @@
|
|
NL80211_CMD_SCHED_SCAN_RESULTS);
|
|
}
|
|
}
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
}
|
|
|
|
void cfg80211_sched_scan_results(struct wiphy *wiphy, u64 reqid)
|
|
@@ -1128,23 +1128,23 @@
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_sched_scan_results);
|
|
|
|
-void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy, u64 reqid)
|
|
+void cfg80211_sched_scan_stopped_locked(struct wiphy *wiphy, u64 reqid)
|
|
{
|
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&wiphy->mtx);
|
|
|
|
trace_cfg80211_sched_scan_stopped(wiphy, reqid);
|
|
|
|
__cfg80211_stop_sched_scan(rdev, reqid, true);
|
|
}
|
|
-EXPORT_SYMBOL(cfg80211_sched_scan_stopped_rtnl);
|
|
+EXPORT_SYMBOL(cfg80211_sched_scan_stopped_locked);
|
|
|
|
void cfg80211_sched_scan_stopped(struct wiphy *wiphy, u64 reqid)
|
|
{
|
|
- rtnl_lock();
|
|
- cfg80211_sched_scan_stopped_rtnl(wiphy, reqid);
|
|
- rtnl_unlock();
|
|
+ wiphy_lock(wiphy);
|
|
+ cfg80211_sched_scan_stopped_locked(wiphy, reqid);
|
|
+ wiphy_unlock(wiphy);
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_sched_scan_stopped);
|
|
|
|
@@ -1152,7 +1152,7 @@
|
|
struct cfg80211_sched_scan_request *req,
|
|
bool driver_initiated)
|
|
{
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
if (!driver_initiated) {
|
|
int err = rdev_sched_scan_stop(rdev, req->dev, req->reqid);
|
|
@@ -1172,7 +1172,7 @@
|
|
{
|
|
struct cfg80211_sched_scan_request *sched_scan_req;
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
sched_scan_req = cfg80211_find_sched_scan_req(rdev, reqid);
|
|
if (!sched_scan_req)
|
|
@@ -2773,6 +2773,8 @@
|
|
|
|
eth_broadcast_addr(creq->bssid);
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
+
|
|
rdev->scan_req = creq;
|
|
err = rdev_scan(rdev, creq);
|
|
if (err) {
|
|
@@ -2784,6 +2786,7 @@
|
|
creq = NULL;
|
|
dev_hold(dev);
|
|
}
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
out:
|
|
kfree(creq);
|
|
return err;
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/sme.c linux-5.10.10-pentoo-johill/net/wireless/sme.c
|
|
--- linux-5.10.10-pentoo/net/wireless/sme.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/sme.c 2021-01-26 20:40:20.731165380 -0500
|
|
@@ -67,7 +67,6 @@
|
|
struct cfg80211_scan_request *request;
|
|
int n_channels, err;
|
|
|
|
- ASSERT_RTNL();
|
|
ASSERT_WDEV_LOCK(wdev);
|
|
|
|
if (rdev->scan_req || rdev->scan_msg)
|
|
@@ -233,7 +232,7 @@
|
|
u8 bssid_buf[ETH_ALEN], *bssid = NULL;
|
|
enum nl80211_timeout_reason treason;
|
|
|
|
- rtnl_lock();
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
|
|
list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
|
|
if (!wdev->netdev)
|
|
@@ -266,7 +265,7 @@
|
|
wdev_unlock(wdev);
|
|
}
|
|
|
|
- rtnl_unlock();
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
}
|
|
|
|
/* Returned bss is reference counted and must be cleaned up appropriately. */
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/sysfs.c linux-5.10.10-pentoo-johill/net/wireless/sysfs.c
|
|
--- linux-5.10.10-pentoo/net/wireless/sysfs.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/sysfs.c 2021-01-26 20:40:20.731165380 -0500
|
|
@@ -5,6 +5,7 @@
|
|
*
|
|
* Copyright 2005-2006 Jiri Benc <jbenc@suse.cz>
|
|
* Copyright 2006 Johannes Berg <johannes@sipsolutions.net>
|
|
+ * Copyright (C) 2020-2021 Intel Corporation
|
|
*/
|
|
|
|
#include <linux/device.h>
|
|
@@ -104,6 +105,7 @@
|
|
rdev->suspend_at = ktime_get_boottime_seconds();
|
|
|
|
rtnl_lock();
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
if (rdev->wiphy.registered) {
|
|
if (!rdev->wiphy.wowlan_config) {
|
|
cfg80211_leave_all(rdev);
|
|
@@ -118,6 +120,7 @@
|
|
ret = rdev_suspend(rdev, NULL);
|
|
}
|
|
}
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
rtnl_unlock();
|
|
|
|
return ret;
|
|
@@ -132,8 +135,10 @@
|
|
cfg80211_bss_age(rdev, ktime_get_boottime_seconds() - rdev->suspend_at);
|
|
|
|
rtnl_lock();
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
if (rdev->wiphy.registered && rdev->ops->resume)
|
|
ret = rdev_resume(rdev);
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
rtnl_unlock();
|
|
|
|
return ret;
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/util.c linux-5.10.10-pentoo-johill/net/wireless/util.c
|
|
--- linux-5.10.10-pentoo/net/wireless/util.c 2021-01-26 20:37:37.589158814 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/util.c 2021-01-26 20:40:20.731165380 -0500
|
|
@@ -997,7 +997,7 @@
|
|
{
|
|
struct wireless_dev *wdev;
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list)
|
|
cfg80211_process_wdev_events(wdev);
|
|
@@ -1010,7 +1010,7 @@
|
|
int err;
|
|
enum nl80211_iftype otype = dev->ieee80211_ptr->iftype;
|
|
|
|
- ASSERT_RTNL();
|
|
+ lockdep_assert_held(&rdev->wiphy.mtx);
|
|
|
|
/* don't support changing VLANs, you just re-create them */
|
|
if (otype == NL80211_IFTYPE_AP_VLAN)
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/wext-compat.c linux-5.10.10-pentoo-johill/net/wireless/wext-compat.c
|
|
--- linux-5.10.10-pentoo/net/wireless/wext-compat.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/wext-compat.c 2021-01-26 20:40:20.732165380 -0500
|
|
@@ -7,7 +7,7 @@
|
|
* we directly assign the wireless handlers of wireless interfaces.
|
|
*
|
|
* Copyright 2008-2009 Johannes Berg <johannes@sipsolutions.net>
|
|
- * Copyright (C) 2019 Intel Corporation
|
|
+ * Copyright (C) 2019-2021 Intel Corporation
|
|
*/
|
|
|
|
#include <linux/export.h>
|
|
@@ -256,17 +256,23 @@
|
|
u32 orts = wdev->wiphy->rts_threshold;
|
|
int err;
|
|
|
|
- if (rts->disabled || !rts->fixed)
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
+ if (rts->disabled || !rts->fixed) {
|
|
wdev->wiphy->rts_threshold = (u32) -1;
|
|
- else if (rts->value < 0)
|
|
- return -EINVAL;
|
|
- else
|
|
+ } else if (rts->value < 0) {
|
|
+ err = -EINVAL;
|
|
+ goto out;
|
|
+ } else {
|
|
wdev->wiphy->rts_threshold = rts->value;
|
|
+ }
|
|
|
|
err = rdev_set_wiphy_params(rdev, WIPHY_PARAM_RTS_THRESHOLD);
|
|
+
|
|
if (err)
|
|
wdev->wiphy->rts_threshold = orts;
|
|
|
|
+out:
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
return err;
|
|
}
|
|
EXPORT_WEXT_HANDLER(cfg80211_wext_siwrts);
|
|
@@ -294,11 +300,13 @@
|
|
u32 ofrag = wdev->wiphy->frag_threshold;
|
|
int err;
|
|
|
|
- if (frag->disabled || !frag->fixed)
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
+ if (frag->disabled || !frag->fixed) {
|
|
wdev->wiphy->frag_threshold = (u32) -1;
|
|
- else if (frag->value < 256)
|
|
- return -EINVAL;
|
|
- else {
|
|
+ } else if (frag->value < 256) {
|
|
+ err = -EINVAL;
|
|
+ goto out;
|
|
+ } else {
|
|
/* Fragment length must be even, so strip LSB. */
|
|
wdev->wiphy->frag_threshold = frag->value & ~0x1;
|
|
}
|
|
@@ -306,6 +314,8 @@
|
|
err = rdev_set_wiphy_params(rdev, WIPHY_PARAM_FRAG_THRESHOLD);
|
|
if (err)
|
|
wdev->wiphy->frag_threshold = ofrag;
|
|
+out:
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
|
|
return err;
|
|
}
|
|
@@ -340,6 +350,7 @@
|
|
(retry->flags & IW_RETRY_TYPE) != IW_RETRY_LIMIT)
|
|
return -EINVAL;
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
if (retry->flags & IW_RETRY_LONG) {
|
|
wdev->wiphy->retry_long = retry->value;
|
|
changed |= WIPHY_PARAM_RETRY_LONG;
|
|
@@ -358,6 +369,7 @@
|
|
wdev->wiphy->retry_short = oshort;
|
|
wdev->wiphy->retry_long = olong;
|
|
}
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
|
|
return err;
|
|
}
|
|
@@ -580,15 +592,18 @@
|
|
!rdev->ops->set_default_key)
|
|
return -EOPNOTSUPP;
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
idx = erq->flags & IW_ENCODE_INDEX;
|
|
if (idx == 0) {
|
|
idx = wdev->wext.default_key;
|
|
if (idx < 0)
|
|
idx = 0;
|
|
- } else if (idx < 1 || idx > 4)
|
|
- return -EINVAL;
|
|
- else
|
|
+ } else if (idx < 1 || idx > 4) {
|
|
+ err = -EINVAL;
|
|
+ goto out;
|
|
+ } else {
|
|
idx--;
|
|
+ }
|
|
|
|
if (erq->flags & IW_ENCODE_DISABLED)
|
|
remove = true;
|
|
@@ -602,22 +617,28 @@
|
|
if (!err)
|
|
wdev->wext.default_key = idx;
|
|
wdev_unlock(wdev);
|
|
- return err;
|
|
+ goto out;
|
|
}
|
|
|
|
memset(¶ms, 0, sizeof(params));
|
|
params.key = keybuf;
|
|
params.key_len = erq->length;
|
|
- if (erq->length == 5)
|
|
+ if (erq->length == 5) {
|
|
params.cipher = WLAN_CIPHER_SUITE_WEP40;
|
|
- else if (erq->length == 13)
|
|
+ } else if (erq->length == 13) {
|
|
params.cipher = WLAN_CIPHER_SUITE_WEP104;
|
|
- else if (!remove)
|
|
- return -EINVAL;
|
|
+ } else if (!remove) {
|
|
+ err = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ err = cfg80211_set_encryption(rdev, dev, false, NULL, remove,
|
|
+ wdev->wext.default_key == -1,
|
|
+ idx, ¶ms);
|
|
+out:
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
|
|
- return cfg80211_set_encryption(rdev, dev, false, NULL, remove,
|
|
- wdev->wext.default_key == -1,
|
|
- idx, ¶ms);
|
|
+ return err;
|
|
}
|
|
|
|
static int cfg80211_wext_siwencodeext(struct net_device *dev,
|
|
@@ -757,38 +778,61 @@
|
|
struct cfg80211_chan_def chandef = {
|
|
.width = NL80211_CHAN_WIDTH_20_NOHT,
|
|
};
|
|
- int freq;
|
|
+ int freq, ret;
|
|
+
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_STATION:
|
|
- return cfg80211_mgd_wext_siwfreq(dev, info, wextfreq, extra);
|
|
+ ret = cfg80211_mgd_wext_siwfreq(dev, info, wextfreq, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- return cfg80211_ibss_wext_siwfreq(dev, info, wextfreq, extra);
|
|
+ ret = cfg80211_ibss_wext_siwfreq(dev, info, wextfreq, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_MONITOR:
|
|
freq = cfg80211_wext_freq(wextfreq);
|
|
- if (freq < 0)
|
|
- return freq;
|
|
- if (freq == 0)
|
|
- return -EINVAL;
|
|
+ if (freq < 0) {
|
|
+ ret = freq;
|
|
+ break;
|
|
+ }
|
|
+ if (freq == 0) {
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
+ }
|
|
chandef.center_freq1 = freq;
|
|
chandef.chan = ieee80211_get_channel(&rdev->wiphy, freq);
|
|
- if (!chandef.chan)
|
|
- return -EINVAL;
|
|
- return cfg80211_set_monitor_channel(rdev, &chandef);
|
|
+ if (!chandef.chan) {
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
+ }
|
|
+ ret = cfg80211_set_monitor_channel(rdev, &chandef);
|
|
+ break;
|
|
case NL80211_IFTYPE_MESH_POINT:
|
|
freq = cfg80211_wext_freq(wextfreq);
|
|
- if (freq < 0)
|
|
- return freq;
|
|
- if (freq == 0)
|
|
- return -EINVAL;
|
|
+ if (freq < 0) {
|
|
+ ret = freq;
|
|
+ break;
|
|
+ }
|
|
+ if (freq == 0) {
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
+ }
|
|
chandef.center_freq1 = freq;
|
|
chandef.chan = ieee80211_get_channel(&rdev->wiphy, freq);
|
|
- if (!chandef.chan)
|
|
- return -EINVAL;
|
|
- return cfg80211_set_mesh_channel(rdev, wdev, &chandef);
|
|
+ if (!chandef.chan) {
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
+ }
|
|
+ ret = cfg80211_set_mesh_channel(rdev, wdev, &chandef);
|
|
+ break;
|
|
default:
|
|
- return -EOPNOTSUPP;
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
}
|
|
+
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_giwfreq(struct net_device *dev,
|
|
@@ -800,24 +844,35 @@
|
|
struct cfg80211_chan_def chandef = {};
|
|
int ret;
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_STATION:
|
|
- return cfg80211_mgd_wext_giwfreq(dev, info, freq, extra);
|
|
+ ret = cfg80211_mgd_wext_giwfreq(dev, info, freq, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- return cfg80211_ibss_wext_giwfreq(dev, info, freq, extra);
|
|
+ ret = cfg80211_ibss_wext_giwfreq(dev, info, freq, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_MONITOR:
|
|
- if (!rdev->ops->get_channel)
|
|
- return -EINVAL;
|
|
+ if (!rdev->ops->get_channel) {
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
+ }
|
|
|
|
ret = rdev_get_channel(rdev, wdev, &chandef);
|
|
if (ret)
|
|
- return ret;
|
|
+ break;
|
|
freq->m = chandef.chan->center_freq;
|
|
freq->e = 6;
|
|
- return 0;
|
|
+ ret = 0;
|
|
+ break;
|
|
default:
|
|
- return -EINVAL;
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
}
|
|
+
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_siwtxpower(struct net_device *dev,
|
|
@@ -828,6 +883,7 @@
|
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
enum nl80211_tx_power_setting type;
|
|
int dbm = 0;
|
|
+ int ret;
|
|
|
|
if ((data->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
|
|
return -EINVAL;
|
|
@@ -869,7 +925,11 @@
|
|
return 0;
|
|
}
|
|
|
|
- return rdev_set_tx_power(rdev, wdev, type, DBM_TO_MBM(dbm));
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
+ ret = rdev_set_tx_power(rdev, wdev, type, DBM_TO_MBM(dbm));
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_giwtxpower(struct net_device *dev,
|
|
@@ -888,7 +948,9 @@
|
|
if (!rdev->ops->get_tx_power)
|
|
return -EOPNOTSUPP;
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
err = rdev_get_tx_power(rdev, wdev, &val);
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
if (err)
|
|
return err;
|
|
|
|
@@ -1128,7 +1190,9 @@
|
|
timeout = wrq->value / 1000;
|
|
}
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
err = rdev_set_power_mgmt(rdev, dev, ps, timeout);
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
if (err)
|
|
return err;
|
|
|
|
@@ -1203,7 +1267,7 @@
|
|
struct cfg80211_bitrate_mask mask;
|
|
u32 fixed, maxrate;
|
|
struct ieee80211_supported_band *sband;
|
|
- int band, ridx;
|
|
+ int band, ridx, ret;
|
|
bool match = false;
|
|
|
|
if (!rdev->ops->set_bitrate_mask)
|
|
@@ -1242,7 +1306,11 @@
|
|
if (!match)
|
|
return -EINVAL;
|
|
|
|
- return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
+ ret = rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_giwrate(struct net_device *dev,
|
|
@@ -1271,7 +1339,9 @@
|
|
if (err)
|
|
return err;
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
err = rdev_get_station(rdev, dev, addr, &sinfo);
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
if (err)
|
|
return err;
|
|
|
|
@@ -1296,6 +1366,7 @@
|
|
static struct iw_statistics wstats;
|
|
static struct station_info sinfo = {};
|
|
u8 bssid[ETH_ALEN];
|
|
+ int ret;
|
|
|
|
if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION)
|
|
return NULL;
|
|
@@ -1314,7 +1385,11 @@
|
|
|
|
memset(&sinfo, 0, sizeof(sinfo));
|
|
|
|
- if (rdev_get_station(rdev, dev, bssid, &sinfo))
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
+ ret = rdev_get_station(rdev, dev, bssid, &sinfo);
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+
|
|
+ if (ret)
|
|
return NULL;
|
|
|
|
memset(&wstats, 0, sizeof(wstats));
|
|
@@ -1365,17 +1440,27 @@
|
|
struct sockaddr *ap_addr, char *extra)
|
|
{
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
+ int ret;
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- return cfg80211_ibss_wext_siwap(dev, info, ap_addr, extra);
|
|
+ ret = cfg80211_ibss_wext_siwap(dev, info, ap_addr, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_STATION:
|
|
- return cfg80211_mgd_wext_siwap(dev, info, ap_addr, extra);
|
|
+ ret = cfg80211_mgd_wext_siwap(dev, info, ap_addr, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_WDS:
|
|
- return cfg80211_wds_wext_siwap(dev, info, ap_addr, extra);
|
|
+ ret = cfg80211_wds_wext_siwap(dev, info, ap_addr, extra);
|
|
+ break;
|
|
default:
|
|
- return -EOPNOTSUPP;
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
}
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_giwap(struct net_device *dev,
|
|
@@ -1383,17 +1468,27 @@
|
|
struct sockaddr *ap_addr, char *extra)
|
|
{
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
+ int ret;
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- return cfg80211_ibss_wext_giwap(dev, info, ap_addr, extra);
|
|
+ ret = cfg80211_ibss_wext_giwap(dev, info, ap_addr, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_STATION:
|
|
- return cfg80211_mgd_wext_giwap(dev, info, ap_addr, extra);
|
|
+ ret = cfg80211_mgd_wext_giwap(dev, info, ap_addr, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_WDS:
|
|
- return cfg80211_wds_wext_giwap(dev, info, ap_addr, extra);
|
|
+ ret = cfg80211_wds_wext_giwap(dev, info, ap_addr, extra);
|
|
+ break;
|
|
default:
|
|
- return -EOPNOTSUPP;
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
}
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_siwessid(struct net_device *dev,
|
|
@@ -1401,15 +1496,24 @@
|
|
struct iw_point *data, char *ssid)
|
|
{
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
+ int ret;
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- return cfg80211_ibss_wext_siwessid(dev, info, data, ssid);
|
|
+ ret = cfg80211_ibss_wext_siwessid(dev, info, data, ssid);
|
|
+ break;
|
|
case NL80211_IFTYPE_STATION:
|
|
- return cfg80211_mgd_wext_siwessid(dev, info, data, ssid);
|
|
+ ret = cfg80211_mgd_wext_siwessid(dev, info, data, ssid);
|
|
+ break;
|
|
default:
|
|
- return -EOPNOTSUPP;
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
}
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_giwessid(struct net_device *dev,
|
|
@@ -1417,18 +1521,27 @@
|
|
struct iw_point *data, char *ssid)
|
|
{
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
+ int ret;
|
|
|
|
data->flags = 0;
|
|
data->length = 0;
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- return cfg80211_ibss_wext_giwessid(dev, info, data, ssid);
|
|
+ ret = cfg80211_ibss_wext_giwessid(dev, info, data, ssid);
|
|
+ break;
|
|
case NL80211_IFTYPE_STATION:
|
|
- return cfg80211_mgd_wext_giwessid(dev, info, data, ssid);
|
|
+ ret = cfg80211_mgd_wext_giwessid(dev, info, data, ssid);
|
|
+ break;
|
|
default:
|
|
- return -EOPNOTSUPP;
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
}
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_siwpmksa(struct net_device *dev,
|
|
@@ -1439,6 +1552,7 @@
|
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
struct cfg80211_pmksa cfg_pmksa;
|
|
struct iw_pmksa *pmksa = (struct iw_pmksa *)extra;
|
|
+ int ret;
|
|
|
|
memset(&cfg_pmksa, 0, sizeof(struct cfg80211_pmksa));
|
|
|
|
@@ -1448,28 +1562,39 @@
|
|
cfg_pmksa.bssid = pmksa->bssid.sa_data;
|
|
cfg_pmksa.pmkid = pmksa->pmkid;
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
switch (pmksa->cmd) {
|
|
case IW_PMKSA_ADD:
|
|
- if (!rdev->ops->set_pmksa)
|
|
- return -EOPNOTSUPP;
|
|
-
|
|
- return rdev_set_pmksa(rdev, dev, &cfg_pmksa);
|
|
+ if (!rdev->ops->set_pmksa) {
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
+ }
|
|
|
|
+ ret = rdev_set_pmksa(rdev, dev, &cfg_pmksa);
|
|
+ break;
|
|
case IW_PMKSA_REMOVE:
|
|
- if (!rdev->ops->del_pmksa)
|
|
- return -EOPNOTSUPP;
|
|
-
|
|
- return rdev_del_pmksa(rdev, dev, &cfg_pmksa);
|
|
+ if (!rdev->ops->del_pmksa) {
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
+ }
|
|
|
|
+ ret = rdev_del_pmksa(rdev, dev, &cfg_pmksa);
|
|
+ break;
|
|
case IW_PMKSA_FLUSH:
|
|
- if (!rdev->ops->flush_pmksa)
|
|
- return -EOPNOTSUPP;
|
|
-
|
|
- return rdev_flush_pmksa(rdev, dev);
|
|
+ if (!rdev->ops->flush_pmksa) {
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
+ }
|
|
|
|
+ ret = rdev_flush_pmksa(rdev, dev);
|
|
+ break;
|
|
default:
|
|
- return -EOPNOTSUPP;
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
}
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static const iw_handler cfg80211_handlers[] = {
|
|
diff -Naur linux-5.10.10-pentoo/net/wireless/wext-sme.c linux-5.10.10-pentoo-johill/net/wireless/wext-sme.c
|
|
--- linux-5.10.10-pentoo/net/wireless/wext-sme.c 2020-12-13 17:41:30.000000000 -0500
|
|
+++ linux-5.10.10-pentoo-johill/net/wireless/wext-sme.c 2021-01-26 20:40:20.732165380 -0500
|
|
@@ -3,7 +3,7 @@
|
|
* cfg80211 wext compat for managed mode.
|
|
*
|
|
* Copyright 2009 Johannes Berg <johannes@sipsolutions.net>
|
|
- * Copyright (C) 2009 Intel Corporation. All rights reserved.
|
|
+ * Copyright (C) 2009, 2020-2021 Intel Corporation.
|
|
*/
|
|
|
|
#include <linux/export.h>
|
|
@@ -379,6 +379,7 @@
|
|
if (mlme->addr.sa_family != ARPHRD_ETHER)
|
|
return -EINVAL;
|
|
|
|
+ wiphy_lock(&rdev->wiphy);
|
|
wdev_lock(wdev);
|
|
switch (mlme->cmd) {
|
|
case IW_MLME_DEAUTH:
|
|
@@ -390,6 +391,7 @@
|
|
break;
|
|
}
|
|
wdev_unlock(wdev);
|
|
+ wiphy_unlock(&rdev->wiphy);
|
|
|
|
return err;
|
|
}
|