nl80211: use new genl helpers for WDS
authorJohannes Berg <johannes.berg@intel.com>
Thu, 7 Oct 2010 11:10:30 +0000 (13:10 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 7 Oct 2010 18:41:27 +0000 (14:41 -0400)
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>
net/wireless/nl80211.c

index 524f5540283819b65c0b6bf675118f16b7b48d6f..4fed1663aba3ebc45e85b4d6000d8a5532d2f6b3 100644 (file)
@@ -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,
        },
 };