summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-08-12 19:19:21 +0200
committerThomas Haller <thaller@redhat.com>2018-08-22 10:14:33 +0200
commit9be685faf6e87b989dabd15e65e975c9ed1699be (patch)
treee00ff8709801b8907c0d714d5c26b9d7fe751986
parent344595f37352fa78fe536304fa96c98d3237a1f1 (diff)
wifi: refactor nm_wifi_ap_set_ssid() to accept GBytesth/wifi-gbytes-ssid
- have two variants of functions to set the SSID of an access point: one that passes SSID as GBytes, and one that passes it as plain data with length. Accepting a GBytes allows to share the immutable GBytes instance. - both functions now also support clearing the SSID. In nm_wifi_ap_update_from_properties(), if the GVariant specifies a "SSID", we always update the access point. We already support chaging the SSID, so why not support changing it to *no* SSID (hidden).
-rw-r--r--src/devices/wifi/nm-device-iwd.c7
-rw-r--r--src/devices/wifi/nm-device-wifi.c6
-rw-r--r--src/devices/wifi/nm-wifi-ap.c77
-rw-r--r--src/devices/wifi/nm-wifi-ap.h6
4 files changed, 62 insertions, 34 deletions
diff --git a/src/devices/wifi/nm-device-iwd.c b/src/devices/wifi/nm-device-iwd.c
index 84ee421740..3a6855cbad 100644
--- a/src/devices/wifi/nm-device-iwd.c
+++ b/src/devices/wifi/nm-device-iwd.c
@@ -296,8 +296,11 @@ get_ordered_networks_cb (GObject *source, GAsyncResult *res, gpointer user_data)
props = g_variant_new ("a{sv}", &builder);
ap = nm_wifi_ap_new_from_properties (path, props);
- if (name[0] != '\0')
- nm_wifi_ap_set_ssid (ap, (const guint8 *) name, strlen (name));
+
+ nm_wifi_ap_set_ssid_arr (ap,
+ (const guint8 *) name,
+ NM_MIN (32, strlen (name)));
+
nm_wifi_ap_set_strength (ap, nm_wifi_utils_level_to_quality (signal / 100));
nm_wifi_ap_set_freq (ap, 2417);
nm_wifi_ap_set_max_bitrate (ap, 65000);
diff --git a/src/devices/wifi/nm-device-wifi.c b/src/devices/wifi/nm-device-wifi.c
index 2245fccf08..6c5a4723fb 100644
--- a/src/devices/wifi/nm-device-wifi.c
+++ b/src/devices/wifi/nm-device-wifi.c
@@ -1515,11 +1515,7 @@ try_fill_ssid_for_hidden_ap (NMDeviceWifi *self,
s_wifi = nm_connection_get_setting_wireless (connection);
if (s_wifi) {
if (nm_settings_connection_has_seen_bssid (NM_SETTINGS_CONNECTION (connection), bssid)) {
- GBytes *ssid = nm_setting_wireless_get_ssid (s_wifi);
-
- nm_wifi_ap_set_ssid (ap,
- g_bytes_get_data (ssid, NULL),
- g_bytes_get_size (ssid));
+ nm_wifi_ap_set_ssid (ap, nm_setting_wireless_get_ssid (s_wifi));
break;
}
}
diff --git a/src/devices/wifi/nm-wifi-ap.c b/src/devices/wifi/nm-wifi-ap.c
index f6b6fc5882..ec138f6396 100644
--- a/src/devices/wifi/nm-wifi-ap.c
+++ b/src/devices/wifi/nm-wifi-ap.c
@@ -104,32 +104,56 @@ nm_wifi_ap_get_ssid (const NMWifiAP *ap)
}
gboolean
-nm_wifi_ap_set_ssid (NMWifiAP *ap, const guint8 *ssid, gsize len)
+nm_wifi_ap_set_ssid_arr (NMWifiAP *ap,
+ const guint8 *ssid,
+ gsize ssid_len)
{
NMWifiAPPrivate *priv;
g_return_val_if_fail (NM_IS_WIFI_AP (ap), FALSE);
- g_return_val_if_fail (ssid == NULL || len > 0, FALSE);
+
+ if (ssid_len > 32)
+ g_return_val_if_reached (FALSE);
priv = NM_WIFI_AP_GET_PRIVATE (ap);
- /* same SSID */
- if (priv->ssid) {
- const guint8 *p;
- gsize l;
+ if (nm_utils_gbytes_equals (priv->ssid, ssid, ssid_len))
+ return FALSE;
- p = g_bytes_get_data (priv->ssid, &l);
- if ( l == len
- && !memcmp (p, ssid, len))
- return FALSE;
- } else {
- if (len == 0)
- return FALSE;
+ nm_clear_pointer (&priv->ssid, g_bytes_unref);
+ if (ssid_len > 0)
+ priv->ssid = g_bytes_new (ssid, ssid_len);
+
+ _notify (ap, PROP_SSID);
+ return TRUE;
+}
+
+gboolean
+nm_wifi_ap_set_ssid (NMWifiAP *ap, GBytes *ssid)
+{
+ NMWifiAPPrivate *priv;
+ gsize l;
+
+ g_return_val_if_fail (NM_IS_WIFI_AP (ap), FALSE);
+
+ if (ssid) {
+ l = g_bytes_get_size (ssid);
+ if (l == 0 || l > 32)
+ g_return_val_if_reached (FALSE);
}
+ priv = NM_WIFI_AP_GET_PRIVATE (ap);
+
+ if (ssid == priv->ssid)
+ return FALSE;
+ if ( ssid
+ && priv->ssid
+ && g_bytes_equal (ssid, priv->ssid))
+ return FALSE;
+
nm_clear_pointer (&priv->ssid, g_bytes_unref);
- if (len > 0)
- priv->ssid = g_bytes_new (ssid, len);
+ if (ssid)
+ priv->ssid = g_bytes_ref (ssid);
_notify (ap, PROP_SSID);
return TRUE;
@@ -804,10 +828,16 @@ nm_wifi_ap_update_from_properties (NMWifiAP *ap,
len = MIN (32, len);
/* Stupid ieee80211 layer uses <hidden> */
- if ( bytes && len
- && !(((len == 8) || (len == 9)) && !memcmp (bytes, "<hidden>", 8))
- && !nm_utils_is_empty_ssid (bytes, len))
- changed |= nm_wifi_ap_set_ssid (ap, bytes, len);
+ if ( bytes
+ && len
+ && !( NM_IN_SET (len, 8, 9)
+ && memcmp (bytes, "<hidden>", len) == 0)
+ && !nm_utils_is_empty_ssid (bytes, len)) {
+ /* good */
+ } else
+ len = 0;
+
+ changed |= nm_wifi_ap_set_ssid_arr (ap, bytes, len);
g_variant_unref (v);
}
@@ -1189,7 +1219,6 @@ nm_wifi_ap_new_fake_from_connection (NMConnection *connection)
NMWifiAPPrivate *priv;
NMSettingWireless *s_wireless;
NMSettingWirelessSecurity *s_wireless_sec;
- GBytes *ssid;
const char *mode, *band, *key_mgmt;
guint32 channel;
NM80211ApSecurityFlags flags;
@@ -1200,14 +1229,12 @@ nm_wifi_ap_new_fake_from_connection (NMConnection *connection)
s_wireless = nm_connection_get_setting_wireless (connection);
g_return_val_if_fail (s_wireless != NULL, NULL);
- ssid = nm_setting_wireless_get_ssid (s_wireless);
- g_return_val_if_fail (ssid != NULL, NULL);
- g_return_val_if_fail (g_bytes_get_size (ssid) > 0, NULL);
-
ap = (NMWifiAP *) g_object_new (NM_TYPE_WIFI_AP, NULL);
priv = NM_WIFI_AP_GET_PRIVATE (ap);
priv->fake = TRUE;
- nm_wifi_ap_set_ssid (ap, g_bytes_get_data (ssid, NULL), g_bytes_get_size (ssid));
+
+ nm_wifi_ap_set_ssid (ap,
+ nm_setting_wireless_get_ssid (s_wireless));
// FIXME: bssid too?
diff --git a/src/devices/wifi/nm-wifi-ap.h b/src/devices/wifi/nm-wifi-ap.h
index 57db4443a6..7462e9d1c5 100644
--- a/src/devices/wifi/nm-wifi-ap.h
+++ b/src/devices/wifi/nm-wifi-ap.h
@@ -73,9 +73,11 @@ gboolean nm_wifi_ap_complete_connection (NMWifiAP *self,
const char * nm_wifi_ap_get_supplicant_path (NMWifiAP *ap);
GBytes *nm_wifi_ap_get_ssid (const NMWifiAP *ap);
-gboolean nm_wifi_ap_set_ssid (NMWifiAP *ap,
+gboolean nm_wifi_ap_set_ssid_arr (NMWifiAP *ap,
const guint8 *ssid,
- gsize len);
+ gsize ssid_len);
+gboolean nm_wifi_ap_set_ssid (NMWifiAP *ap,
+ GBytes *ssid);
const char * nm_wifi_ap_get_address (const NMWifiAP *ap);
gboolean nm_wifi_ap_set_address (NMWifiAP *ap,
const char *addr);