wifi: cfg80211: Set SSID if it is not already set
authorMarc Bornand <dev.mbornand@systemb.ch>
Wed, 15 Feb 2023 08:47:53 +0000 (08:47 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Mar 2023 08:34:22 +0000 (09:34 +0100)
commit c38c701851011c94ce3be1ccb3593678d2933fd8 upstream.

When a connection was established without going through
NL80211_CMD_CONNECT, the ssid was never set in the wireless_dev struct.
Now we set it in __cfg80211_connect_result() when it is not already set.

When using a userspace configuration that does not call
cfg80211_connect() (can be checked with breakpoints in the kernel),
this patch should allow `networkctl status device_name` to output the
SSID instead of null.

Cc: stable@vger.kernel.org
Reported-by: Yohan Prod'homme <kernel@zoddo.fr>
Fixes: 7b0a0e3c3a88 (wifi: cfg80211: do some rework towards MLO link APIs)
Link: https://bugzilla.kernel.org/show_bug.cgi?id=216711
Signed-off-by: Marc Bornand <dev.mbornand@systemb.ch>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/wireless/sme.c

index 4758ab7..89fc568 100644 (file)
@@ -736,6 +736,7 @@ void __cfg80211_connect_result(struct net_device *dev,
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        const struct element *country_elem = NULL;
+       const struct element *ssid;
        const u8 *country_data;
        u8 country_datalen;
 #ifdef CONFIG_CFG80211_WEXT
@@ -881,6 +882,22 @@ void __cfg80211_connect_result(struct net_device *dev,
                                   country_data, country_datalen);
        kfree(country_data);
 
+       if (!wdev->u.client.ssid_len) {
+               rcu_read_lock();
+               for_each_valid_link(cr, link) {
+                       ssid = ieee80211_bss_get_elem(cr->links[link].bss,
+                                                     WLAN_EID_SSID);
+
+                       if (!ssid || !ssid->datalen)
+                               continue;
+
+                       memcpy(wdev->u.client.ssid, ssid->data, ssid->datalen);
+                       wdev->u.client.ssid_len = ssid->datalen;
+                       break;
+               }
+               rcu_read_unlock();
+       }
+
        return;
 out:
        for_each_valid_link(cr, link)