Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7fee4778 authored by Johannes Berg's avatar Johannes Berg
Browse files

nl80211: refactor __cfg80211_rdev_from_info



Refactor the function to make it easier to
extend.

Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent a9455408
Loading
Loading
Loading
Loading
+31 −28
Original line number Diff line number Diff line
@@ -73,44 +73,47 @@ static int get_rdev_dev_by_ifindex(struct net *netns, struct nlattr **attrs,
static struct cfg80211_registered_device *
__cfg80211_rdev_from_info(struct genl_info *info)
{
	int ifindex;
	struct cfg80211_registered_device *bywiphyidx = NULL, *byifidx = NULL;
	struct net_device *dev;
	int err = -EINVAL;
	struct cfg80211_registered_device *rdev = NULL, *tmp;
	struct net_device *netdev;

	assert_cfg80211_lock();

	if (info->attrs[NL80211_ATTR_WIPHY]) {
		bywiphyidx = cfg80211_rdev_by_wiphy_idx(
	if (!info->attrs[NL80211_ATTR_WIPHY] &&
	    !info->attrs[NL80211_ATTR_IFINDEX])
		return ERR_PTR(-EINVAL);

	if (info->attrs[NL80211_ATTR_WIPHY])
		rdev = cfg80211_rdev_by_wiphy_idx(
				nla_get_u32(info->attrs[NL80211_ATTR_WIPHY]));
		err = -ENODEV;
	}

	if (info->attrs[NL80211_ATTR_IFINDEX]) {
		ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
		dev = dev_get_by_index(genl_info_net(info), ifindex);
		if (dev) {
			if (dev->ieee80211_ptr)
				byifidx =
					wiphy_to_dev(dev->ieee80211_ptr->wiphy);
			dev_put(dev);
		}
		err = -ENODEV;
	}
		int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
		netdev = dev_get_by_index(genl_info_net(info), ifindex);
		if (netdev) {
			if (netdev->ieee80211_ptr)
				tmp = wiphy_to_dev(
						netdev->ieee80211_ptr->wiphy);
			else
				tmp = NULL;

			dev_put(netdev);

	if (bywiphyidx && byifidx) {
		if (bywiphyidx != byifidx)
			/* not wireless device -- return error */
			if (!tmp)
				return ERR_PTR(-EINVAL);
		else
			return bywiphyidx; /* == byifidx */

			/* mismatch -- return error */
			if (rdev && tmp != rdev)
				return ERR_PTR(-EINVAL);

			rdev = tmp;
		}
	}
	if (bywiphyidx)
		return bywiphyidx;

	if (byifidx)
		return byifidx;
	if (rdev)
		return rdev;

	return ERR_PTR(err);
	return ERR_PTR(-ENODEV);
}

/*