]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
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)
committerAndrea Righi <andrea.righi@canonical.com>
Tue, 14 Mar 2023 15:47:33 +0000 (16:47 +0100)
BugLink: https://bugs.launchpad.net/bugs/2011425
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>
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
net/wireless/sme.c

index e2dcc28f437eb5e7d454b335c6bd9fcfc4c49e14..4f813e346a8bcd677d7429b7ca6abfa7cddfb3b1 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
@@ -895,6 +896,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)