Skip to content

Commit 9ecff10

Browse files
committed
wifi: nl80211: refactor BSS lookup in nl80211_associate()
For MLO we'll need to do this multiple times, so refactor this. For now keep the disconnect_bssid, but we'll need to figure out how to handle that with MLD. Signed-off-by: Johannes Berg <[email protected]>
1 parent 0f75944 commit 9ecff10

File tree

1 file changed

+38
-21
lines changed

1 file changed

+38
-21
lines changed

net/wireless/nl80211.c

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10424,23 +10424,53 @@ static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
1042410424
return 0;
1042510425
}
1042610426

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+
1042710461
static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
1042810462
{
1042910463
struct cfg80211_registered_device *rdev = info->user_ptr[0];
1043010464
struct net_device *dev = info->user_ptr[1];
10431-
struct ieee80211_channel *chan;
1043210465
struct cfg80211_assoc_request req = {};
1043310466
const u8 *bssid, *ssid;
1043410467
int err, ssid_len;
10435-
u32 freq;
1043610468

1043710469
if (dev->ieee80211_ptr->conn_owner_nlportid &&
1043810470
dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
1043910471
return -EPERM;
1044010472

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])
1044410474
return -EINVAL;
1044510475

1044610476
if (!rdev->ops->assoc)
@@ -10450,16 +10480,6 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
1045010480
dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
1045110481
return -EOPNOTSUPP;
1045210482

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-
1046310483
ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
1046410484
ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
1046510485

@@ -10553,12 +10573,9 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
1055310573
sizeof(req.s1g_capa));
1055410574
}
1055510575

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);
1056210579

1056310580
err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
1056410581
if (!err) {

0 commit comments

Comments
 (0)