@@ -10424,23 +10424,53 @@ static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
10424
10424
return 0;
10425
10425
}
10426
10426
10427
+ static struct cfg80211_bss *nl80211_assoc_bss(struct cfg80211_registered_device *rdev,
10428
+ const u8 *ssid, int ssid_len,
10429
+ struct nlattr **attrs,
10430
+ const u8 **bssid_out)
10431
+ {
10432
+ struct ieee80211_channel *chan;
10433
+ struct cfg80211_bss *bss;
10434
+ const u8 *bssid;
10435
+ u32 freq;
10436
+
10437
+ if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_WIPHY_FREQ])
10438
+ return ERR_PTR(-EINVAL);
10439
+
10440
+ bssid = nla_data(attrs[NL80211_ATTR_MAC]);
10441
+
10442
+ freq = MHZ_TO_KHZ(nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ]));
10443
+ if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
10444
+ freq += nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
10445
+
10446
+ chan = nl80211_get_valid_chan(&rdev->wiphy, freq);
10447
+ if (!chan)
10448
+ return ERR_PTR(-EINVAL);
10449
+
10450
+ bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid,
10451
+ ssid, ssid_len,
10452
+ IEEE80211_BSS_TYPE_ESS,
10453
+ IEEE80211_PRIVACY_ANY);
10454
+ if (!bss)
10455
+ return ERR_PTR(-ENOENT);
10456
+
10457
+ *bssid_out = bssid;
10458
+ return bss;
10459
+ }
10460
+
10427
10461
static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
10428
10462
{
10429
10463
struct cfg80211_registered_device *rdev = info->user_ptr[0];
10430
10464
struct net_device *dev = info->user_ptr[1];
10431
- struct ieee80211_channel *chan;
10432
10465
struct cfg80211_assoc_request req = {};
10433
10466
const u8 *bssid, *ssid;
10434
10467
int err, ssid_len;
10435
- u32 freq;
10436
10468
10437
10469
if (dev->ieee80211_ptr->conn_owner_nlportid &&
10438
10470
dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
10439
10471
return -EPERM;
10440
10472
10441
- if (!info->attrs[NL80211_ATTR_MAC] ||
10442
- !info->attrs[NL80211_ATTR_SSID] ||
10443
- !info->attrs[NL80211_ATTR_WIPHY_FREQ])
10473
+ if (!info->attrs[NL80211_ATTR_SSID])
10444
10474
return -EINVAL;
10445
10475
10446
10476
if (!rdev->ops->assoc)
@@ -10450,16 +10480,6 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
10450
10480
dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
10451
10481
return -EOPNOTSUPP;
10452
10482
10453
- bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
10454
-
10455
- freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
10456
- if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
10457
- freq +=
10458
- nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
10459
- chan = nl80211_get_valid_chan(&rdev->wiphy, freq);
10460
- if (!chan)
10461
- return -EINVAL;
10462
-
10463
10483
ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
10464
10484
ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
10465
10485
@@ -10553,12 +10573,9 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
10553
10573
sizeof(req.s1g_capa));
10554
10574
}
10555
10575
10556
- req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid,
10557
- ssid, ssid_len,
10558
- IEEE80211_BSS_TYPE_ESS,
10559
- IEEE80211_PRIVACY_ANY);
10560
- if (!req.bss)
10561
- return -ENOENT;
10576
+ req.bss = nl80211_assoc_bss(rdev, ssid, ssid_len, info->attrs, &bssid);
10577
+ if (IS_ERR(req.bss))
10578
+ return PTR_ERR(req.bss);
10562
10579
10563
10580
err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
10564
10581
if (!err) {
0 commit comments