wifi: cfg80211: mlme: get BSS entry outside cfg80211_mlme_assoc()
authorJohannes Berg <johannes.berg@intel.com>
Tue, 31 May 2022 16:00:00 +0000 (18:00 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 20 Jun 2022 10:55:43 +0000 (12:55 +0200)
Today it makes more sense to pass the necessary parameters to
look up the BSS entry to cfg80211_mlme_assoc(), but with MLO
we will need to look up multiple, and that gets awkward. Pull
the lookup code into the callers so we can change it better.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/wireless/core.h
net/wireless/mlme.c
net/wireless/nl80211.c
net/wireless/sme.c

index 2c195067ddff65fe3fba99b36fbf1582a6a0659b..f20857f36764b2ab351bf1d70ca9c5269af2df60 100644 (file)
@@ -372,9 +372,6 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
                       const u8 *auth_data, int auth_data_len);
 int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
                        struct net_device *dev,
-                       struct ieee80211_channel *chan,
-                       const u8 *bssid,
-                       const u8 *ssid, int ssid_len,
                        struct cfg80211_assoc_request *req);
 int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
                         struct net_device *dev, const u8 *bssid,
index fab2d6206cdd9b8c27ea7dcfd6023ea5e1eb9724..1263623a7a327ec9f82f3df45031b752953695c4 100644 (file)
@@ -309,11 +309,9 @@ void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap *vht_capa,
                p1[i] &= p2[i];
 }
 
+/* Note: caller must cfg80211_put_bss() regardless of result */
 int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
                        struct net_device *dev,
-                       struct ieee80211_channel *chan,
-                       const u8 *bssid,
-                       const u8 *ssid, int ssid_len,
                        struct cfg80211_assoc_request *req)
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
@@ -331,18 +329,11 @@ int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
        cfg80211_oper_and_vht_capa(&req->vht_capa_mask,
                                   rdev->wiphy.vht_capa_mod_mask);
 
-       req->bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len,
-                                   IEEE80211_BSS_TYPE_ESS,
-                                   IEEE80211_PRIVACY_ANY);
-       if (!req->bss)
-               return -ENOENT;
-
        err = rdev_assoc(rdev, dev, req);
-       if (!err)
+       if (!err) {
+               cfg80211_ref_bss(&rdev->wiphy, req->bss);
                cfg80211_hold_bss(bss_from_pub(req->bss));
-       else
-               cfg80211_put_bss(&rdev->wiphy, req->bss);
-
+       }
        return err;
 }
 
index af31978fc9cc2c5a4152059579d3b9b6f5d58c16..5ccd2b0f68c9ef794a6d42d1e40def4e7c548867 100644 (file)
@@ -10431,7 +10431,7 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
        struct ieee80211_channel *chan;
        struct cfg80211_assoc_request req = {};
        const u8 *bssid, *ssid;
-       int err, ssid_len = 0;
+       int err, ssid_len;
        u32 freq;
 
        if (dev->ieee80211_ptr->conn_owner_nlportid &&
@@ -10553,12 +10553,18 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
                       sizeof(req.s1g_capa));
        }
 
+       req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid,
+                                  ssid, ssid_len,
+                                  IEEE80211_BSS_TYPE_ESS,
+                                  IEEE80211_PRIVACY_ANY);
+       if (!req.bss)
+               return -ENOENT;
+
        err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
        if (!err) {
                wdev_lock(dev->ieee80211_ptr);
 
-               err = cfg80211_mlme_assoc(rdev, dev, chan, bssid,
-                                         ssid, ssid_len, &req);
+               err = cfg80211_mlme_assoc(rdev, dev, &req);
 
                if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
                        dev->ieee80211_ptr->conn_owner_nlportid =
@@ -10570,6 +10576,8 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
                wdev_unlock(dev->ieee80211_ptr);
        }
 
+       cfg80211_put_bss(&rdev->wiphy, req.bss);
+
        return err;
 }
 
index 35602201057b61708e66f7348afb10ab3e5c724d..c869152629b6916969d439a1d6c4517a37b04f36 100644 (file)
@@ -193,9 +193,18 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev,
                req.vht_capa = params->vht_capa;
                req.vht_capa_mask = params->vht_capa_mask;
 
-               err = cfg80211_mlme_assoc(rdev, wdev->netdev, params->channel,
-                                         params->bssid, params->ssid,
-                                         params->ssid_len, &req);
+               req.bss = cfg80211_get_bss(&rdev->wiphy, params->channel,
+                                          params->bssid,
+                                          params->ssid, params->ssid_len,
+                                          IEEE80211_BSS_TYPE_ESS,
+                                          IEEE80211_PRIVACY_ANY);
+               if (!req.bss) {
+                       err = -ENOENT;
+               } else {
+                       err = cfg80211_mlme_assoc(rdev, wdev->netdev, &req);
+                       cfg80211_put_bss(&rdev->wiphy, req.bss);
+               }
+
                if (err)
                        cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
                                             NULL, 0,