Skip to content

Commit

Permalink
wifi: nl80211: hold wdev mutex for channel switch APIs
Browse files Browse the repository at this point in the history
Since we deal with links in an MLD here, hold the wdev
mutex now.

Signed-off-by: Johannes Berg <[email protected]>
  • Loading branch information
jmberg-intel committed Jul 15, 2022
1 parent 858fd18 commit 4e2f3d6
Showing 1 changed file with 16 additions and 5 deletions.
21 changes: 16 additions & 5 deletions net/wireless/nl80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -3348,8 +3348,13 @@ static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
struct cfg80211_registered_device *rdev = info->user_ptr[0];
int link_id = nl80211_link_id_or_invalid(info->attrs);
struct net_device *netdev = info->user_ptr[1];
int ret;

wdev_lock(netdev->ieee80211_ptr);
ret = __nl80211_set_channel(rdev, netdev, info, link_id);
wdev_unlock(netdev->ieee80211_ptr);

return __nl80211_set_channel(rdev, netdev, info, link_id);
return ret;
}

static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
Expand Down Expand Up @@ -3461,10 +3466,16 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
}

if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
result = __nl80211_set_channel(
rdev,
nl80211_can_set_dev_channel(wdev) ? netdev : NULL,
info, -1);
if (wdev) {
wdev_lock(wdev);
result = __nl80211_set_channel(
rdev,
nl80211_can_set_dev_channel(wdev) ? netdev : NULL,
info, -1);
wdev_unlock(wdev);
} else {
result = __nl80211_set_channel(rdev, netdev, info, -1);
}
if (result)
goto out;
}
Expand Down

0 comments on commit 4e2f3d6

Please sign in to comment.