diff options
author | Thomas Haller <thaller@redhat.com> | 2017-06-03 17:40:53 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-06-03 17:42:22 +0200 |
commit | c5fb410998b395e0a0fb9e0c22e86befa69b7599 (patch) | |
tree | 4c28656de66d55a7c497b96d01f66678712ec48a | |
parent | 74335004f37bb554facc8394a5eb7d05e30f97d8 (diff) | |
download | NetworkManager-c5fb410998b395e0a0fb9e0c22e86befa69b7599.tar.gz |
wifi: fix completing Wi-Fi connection for AP mode
In AP mode we should not look up an access point. It is wrong to
do, and it ends up marking the connection as hidden.
It seems wrong to me that if the client explicitly set
hidden=FALSE before AddAndActivate(), that complete_connection()
would still set it to TRUE if it cannot find the access
point. That is, because complete_connection() does not know
whether hidden was omitted or set intentionally by the user.
-rw-r--r-- | src/devices/wifi/nm-device-wifi.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/src/devices/wifi/nm-device-wifi.c b/src/devices/wifi/nm-device-wifi.c index 68751cd225..28b8c26039 100644 --- a/src/devices/wifi/nm-device-wifi.c +++ b/src/devices/wifi/nm-device-wifi.c @@ -791,15 +791,18 @@ complete_connection (NMDevice *device, NMSettingWireless *s_wifi; const char *setting_mac; char *str_ssid = NULL; - NMWifiAP *ap = NULL; + NMWifiAP *ap; const GByteArray *ssid = NULL; GByteArray *tmp_ssid = NULL; GBytes *setting_ssid = NULL; gboolean hidden = FALSE; const char *perm_hw_addr; + const char *mode; s_wifi = nm_connection_get_setting_wireless (connection); + mode = s_wifi ? nm_setting_wireless_get_mode (s_wifi) : NULL; + if (!specific_object) { /* If not given a specific object, we need at minimum an SSID */ if (!s_wifi) { @@ -819,19 +822,29 @@ complete_connection (NMDevice *device, return FALSE; } - /* Find a compatible AP in the scan list */ - ap = find_first_compatible_ap (self, connection, FALSE); + if (!nm_streq0 (mode, NM_SETTING_WIRELESS_MODE_AP)) { + /* Find a compatible AP in the scan list */ + ap = find_first_compatible_ap (self, connection, FALSE); - /* If we still don't have an AP, then the WiFI settings needs to be - * fully specified by the client. Might not be able to find an AP - * if the network isn't broadcasting the SSID for example. - */ - if (!ap) { + /* If we still don't have an AP, then the WiFI settings needs to be + * fully specified by the client. Might not be able to find an AP + * if the network isn't broadcasting the SSID for example. + */ + if (!ap) { + if (!nm_setting_verify (NM_SETTING (s_wifi), connection, error)) + return FALSE; + + hidden = TRUE; + } + } else { if (!nm_setting_verify (NM_SETTING (s_wifi), connection, error)) return FALSE; - - hidden = TRUE; + ap = NULL; } + } else if (nm_streq0 (mode, NM_SETTING_WIRELESS_MODE_AP)) { + if (!nm_setting_verify (NM_SETTING (s_wifi), connection, error)) + return FALSE; + ap = NULL; } else { ap = get_ap_by_path (self, specific_object); if (!ap) { |