|
@@ -857,6 +857,19 @@ static int nl80211_key_allowed(struct wireless_dev *wdev)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy,
|
|
|
|
+ struct nlattr *tb)
|
|
|
|
+{
|
|
|
|
+ struct ieee80211_channel *chan;
|
|
|
|
+
|
|
|
|
+ if (tb == NULL)
|
|
|
|
+ return NULL;
|
|
|
|
+ chan = ieee80211_get_channel(wiphy, nla_get_u32(tb));
|
|
|
|
+ if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
|
|
|
|
+ return NULL;
|
|
|
|
+ return chan;
|
|
|
|
+}
|
|
|
|
+
|
|
static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
|
|
static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
|
|
{
|
|
{
|
|
struct nlattr *nl_modes = nla_nest_start(msg, attr);
|
|
struct nlattr *nl_modes = nla_nest_start(msg, attr);
|
|
@@ -6199,9 +6212,9 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
|
|
|
|
bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
|
|
bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
|
|
- chan = ieee80211_get_channel(&rdev->wiphy,
|
|
|
|
- nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
|
|
|
|
- if (!chan || (chan->flags & IEEE80211_CHAN_DISABLED))
|
|
|
|
|
|
+ chan = nl80211_get_valid_chan(&rdev->wiphy,
|
|
|
|
+ info->attrs[NL80211_ATTR_WIPHY_FREQ]);
|
|
|
|
+ if (!chan)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
|
|
ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
|
|
@@ -6354,9 +6367,9 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
|
|
|
|
|
|
bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
|
|
bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
|
|
|
|
|
|
- chan = ieee80211_get_channel(&rdev->wiphy,
|
|
|
|
- nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
|
|
|
|
- if (!chan || (chan->flags & IEEE80211_CHAN_DISABLED))
|
|
|
|
|
|
+ chan = nl80211_get_valid_chan(&rdev->wiphy,
|
|
|
|
+ info->attrs[NL80211_ATTR_WIPHY_FREQ]);
|
|
|
|
+ if (!chan)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
|
|
ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
|
|
@@ -7013,19 +7026,14 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
|
}
|
|
}
|
|
|
|
|
|
if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
|
|
if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
|
|
- connect.channel =
|
|
|
|
- ieee80211_get_channel(wiphy,
|
|
|
|
- nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
|
|
|
|
- if (!connect.channel ||
|
|
|
|
- connect.channel->flags & IEEE80211_CHAN_DISABLED)
|
|
|
|
|
|
+ connect.channel = nl80211_get_valid_chan(
|
|
|
|
+ wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ]);
|
|
|
|
+ if (!connect.channel)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
} else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) {
|
|
} else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) {
|
|
- connect.channel_hint =
|
|
|
|
- ieee80211_get_channel(wiphy,
|
|
|
|
- nla_get_u32(
|
|
|
|
- info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]));
|
|
|
|
- if (!connect.channel_hint ||
|
|
|
|
- connect.channel_hint->flags & IEEE80211_CHAN_DISABLED)
|
|
|
|
|
|
+ connect.channel_hint = nl80211_get_valid_chan(
|
|
|
|
+ wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]);
|
|
|
|
+ if (!connect.channel_hint)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
|