summaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
authorJohannes Berg2010-10-07 13:10:30 +0200
committerJohn W. Linville2010-10-07 20:41:27 +0200
commit43b19952de54b0fccfcdc5968891ebe550367fe8 (patch)
tree2657f6820dfbaaaab1aa3dc4af48ecbeef363a89 /net/wireless
parentmac80211: fix sw scan locking (diff)
downloadkernel-qcow2-linux-43b19952de54b0fccfcdc5968891ebe550367fe8.tar.gz
kernel-qcow2-linux-43b19952de54b0fccfcdc5968891ebe550367fe8.tar.xz
kernel-qcow2-linux-43b19952de54b0fccfcdc5968891ebe550367fe8.zip
nl80211: use new genl helpers for WDS
Bill Jordan's patch to allow setting the WDS peer crossed with my patch removing all the boilerplate code in nl80211, and consequently he didn't make use of it yet. Fix that. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/nl80211.c45
1 files changed, 12 insertions, 33 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 524f55402838..4fed1663aba3 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -876,48 +876,25 @@ static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info)
{
- struct cfg80211_registered_device *rdev;
- struct wireless_dev *wdev;
- struct net_device *dev;
+ struct cfg80211_registered_device *rdev = info->user_ptr[0];
+ struct net_device *dev = info->user_ptr[1];
+ struct wireless_dev *wdev = dev->ieee80211_ptr;
u8 *bssid;
- int err;
if (!info->attrs[NL80211_ATTR_MAC])
return -EINVAL;
- rtnl_lock();
-
- err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
- if (err)
- goto unlock_rtnl;
-
- wdev = dev->ieee80211_ptr;
-
- if (netif_running(dev)) {
- err = -EBUSY;
- goto out;
- }
+ if (netif_running(dev))
+ return -EBUSY;
- if (!rdev->ops->set_wds_peer) {
- err = -EOPNOTSUPP;
- goto out;
- }
+ if (!rdev->ops->set_wds_peer)
+ return -EOPNOTSUPP;
- if (wdev->iftype != NL80211_IFTYPE_WDS) {
- err = -EOPNOTSUPP;
- goto out;
- }
+ if (wdev->iftype != NL80211_IFTYPE_WDS)
+ return -EOPNOTSUPP;
bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
- err = rdev->ops->set_wds_peer(wdev->wiphy, dev, bssid);
-
-out:
- cfg80211_unlock_rdev(rdev);
- dev_put(dev);
-unlock_rtnl:
- rtnl_unlock();
-
- return err;
+ return rdev->ops->set_wds_peer(wdev->wiphy, dev, bssid);
}
@@ -4860,6 +4837,8 @@ static struct genl_ops nl80211_ops[] = {
.doit = nl80211_set_wds_peer,
.policy = nl80211_policy,
.flags = GENL_ADMIN_PERM,
+ .internal_flags = NL80211_FLAG_NEED_NETDEV |
+ NL80211_FLAG_NEED_RTNL,
},
};