mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-14 14:30:36 +01:00
wifi: refactor nm_wifi_ap_set_ssid() to accept GBytes
- 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).
This commit is contained in:
parent
5cd4e6f3e6
commit
f1bc0f0bf2
4 changed files with 73 additions and 35 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -104,32 +104,66 @@ 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;
|
||||
const guint8 *my_data;
|
||||
gsize my_len;
|
||||
|
||||
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;
|
||||
|
||||
p = g_bytes_get_data (priv->ssid, &l);
|
||||
if ( l == len
|
||||
&& !memcmp (p, ssid, len))
|
||||
return FALSE;
|
||||
} else {
|
||||
if (len == 0)
|
||||
return FALSE;
|
||||
if (priv->ssid)
|
||||
my_data = g_bytes_get_data (priv->ssid, &my_len);
|
||||
else {
|
||||
my_data = NULL;
|
||||
my_len = 0;
|
||||
}
|
||||
|
||||
if ( my_len == ssid_len
|
||||
&& memcmp (ssid, my_data, ssid_len) == 0)
|
||||
return FALSE;
|
||||
|
||||
nm_clear_pointer (&priv->ssid, g_bytes_unref);
|
||||
if (len > 0)
|
||||
priv->ssid = g_bytes_new (ssid, len);
|
||||
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 (ssid)
|
||||
priv->ssid = g_bytes_ref (ssid);
|
||||
|
||||
_notify (ap, PROP_SSID);
|
||||
return TRUE;
|
||||
|
|
@ -804,10 +838,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 +1229,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 +1239,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?
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue