nmc_property_wireless_get_powersave (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingWireless *s_wireless = NM_SETTING_WIRELESS (setting);
- guint powersave = nm_setting_wireless_get_powersave (s_wireless);
+ NMSettingWirelessPowersave powersave;
+ gs_free char *str = NULL;
+ char *ret;
- if (powersave == 0)
- return g_strdup (_("no"));
- else if (powersave == 1)
- return g_strdup (_("yes"));
- else
- return g_strdup_printf (_("yes (%u)"), powersave);
+ powersave = nm_setting_wireless_get_powersave (s_wireless);
+ str = nm_utils_enum_to_str (nm_setting_wireless_powersave_get_type (), powersave);
+
+ if (get_type == NMC_PROPERTY_GET_PARSABLE) {
+ ret = str;
+ str = NULL;
+ return ret;
+ } else
+ return g_strdup_printf ("%s (%u)", str, powersave);
}
static char *
static gboolean
nmc_property_wireless_set_powersave (NMSetting *setting, const char *prop, const char *val, GError **error)
{
- unsigned long powersave_int;
- gboolean val_bool = FALSE;
-
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+ NMSettingWirelessPowersave powersave;
+ gs_free const char **options = NULL;
+ gs_free char *options_str = NULL;
+ long int t;
+ gboolean ret;
- if (!nmc_string_to_uint (val, TRUE, 0, G_MAXUINT32, &powersave_int)) {
- if (!nmc_string_to_bool (val, &val_bool, NULL)) {
- g_set_error (error, 1, 0, _("'%s' is not a valid powersave value"), val);
+ if (nmc_string_to_int_base (val, 0, TRUE,
+ NM_SETTING_WIRELESS_POWERSAVE_DEFAULT,
+ NM_SETTING_WIRELESS_POWERSAVE_LAST,
+ &t))
+ powersave = (NMSettingWirelessPowersave) t;
+ else {
+ ret = nm_utils_enum_from_str (nm_setting_wireless_powersave_get_type (),
+ val,
+ (int *) &powersave,
+ NULL);
+ if (!ret) {
+ options = nm_utils_enum_get_values (nm_setting_wireless_powersave_get_type (),
+ NM_SETTING_WIRELESS_POWERSAVE_DEFAULT,
+ NM_SETTING_WIRELESS_POWERSAVE_LAST);
+ options_str = g_strjoinv (",", (char **) options);
+ g_set_error (error, 1, 0, _("invalid option '%s', use one of [%s]"), val, options_str);
return FALSE;
}
- powersave_int = val_bool ? 1 : 0;
}
- g_object_set (setting, prop, (guint32) powersave_int, NULL);
+ g_object_set (setting, prop, (guint) powersave, NULL);
return TRUE;
}
/**
* NMSettingWireless:powersave:
*
- * If set to %FALSE, Wi-Fi power saving behavior is disabled. If set to
- * %TRUE, Wi-Fi power saving behavior is enabled. All other values are
- * reserved. Note that even though only boolean values are allowed, the
- * property type is an unsigned integer to allow for future expansion.
+ * One of %NM_SETTING_WIRELESS_POWERSAVE_DISABLE (disable Wi-Fi power
+ * saving), %NM_SETTING_WIRELESS_POWERSAVE_ENABLE (enable Wi-Fi power
+ * saving), %NM_SETTING_WIRELESS_POWERSAVE_IGNORE (don't touch currently
+ * configure setting) or %NM_SETTING_WIRELESS_POWERSAVE_DEFAULT (use the
+ * globally configured value). All other values are reserved.
*
* Since: 1.2
**/
/* ---ifcfg-rh---
* property: powersave
* variable: POWERSAVE(+)
- * default: no
+ * values: default, ignore, enable, disable
* description: Enables or disables Wi-Fi power saving.
- * example: POWERSAVE=yes
+ * example: POWERSAVE=enable
* ---end---
*/
g_object_class_install_property
(object_class, PROP_POWERSAVE,
g_param_spec_uint (NM_SETTING_WIRELESS_POWERSAVE, "", "",
- 0, G_MAXUINT32, 0,
+ 0, G_MAXUINT32, NM_SETTING_WIRELESS_POWERSAVE_DEFAULT,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
*/
#define NM_SETTING_WIRELESS_MODE_INFRA "infrastructure"
+/**
+ * NMSettingWirelessPowersave:
+ * @NM_SETTING_WIRELESS_POWERSAVE_DEFAULT: use the default value
+ * @NM_SETTING_WIRELESS_POWERSAVE_IGNORE: don't touch existing setting
+ * @NM_SETTING_WIRELESS_POWERSAVE_DISABLE: disable powersave
+ * @NM_SETTING_WIRELESS_POWERSAVE_ENABLE: enable powersave
+ *
+ * These flags indicate whether wireless powersave must be enabled.
+ **/
+typedef enum {
+ NM_SETTING_WIRELESS_POWERSAVE_DEFAULT = 0,
+ NM_SETTING_WIRELESS_POWERSAVE_IGNORE = 1,
+ NM_SETTING_WIRELESS_POWERSAVE_DISABLE = 2,
+ NM_SETTING_WIRELESS_POWERSAVE_ENABLE = 3,
+ _NM_SETTING_WIRELESS_POWERSAVE_NUM, /*< skip >*/
+ NM_SETTING_WIRELESS_POWERSAVE_LAST = _NM_SETTING_WIRELESS_POWERSAVE_NUM - 1, /*< skip >*/
+} NMSettingWirelessPowersave;
+
+
struct _NMSettingWireless {
NMSetting parent;
};
nm_setting_wired_wake_on_lan_get_type;
nm_setting_wireless_get_powersave;
nm_setting_wireless_get_mac_address_randomization;
+ nm_setting_wireless_powersave_get_type;
nm_utils_bond_mode_int_to_string;
nm_utils_bond_mode_string_to_int;
nm_utils_enum_from_str;
<term><varname>wifi.mac-address-randomization</varname></term>
<listitem><para>If left unspecified, MAC address randomization is disabled.</para></listitem>
</varlistentry>
+ <varlistentry>
+ <term><varname>wifi.powersave</varname></term>
+ <listitem><para>If left unspecified, the default value
+ "<literal>ignore</literal>" will be used.</para></listitem>
+ </varlistentry>
</variablelist>
</para>
</refsect2>
if (nm_device_get_initial_hw_address (device))
nm_device_set_hw_addr (device, nm_device_get_initial_hw_address (device), "reset", LOGD_WIFI);
- nm_platform_wifi_set_powersave (NM_PLATFORM_GET, ifindex, 0);
-
/* Ensure we're in infrastructure mode after deactivation; some devices
* (usually older ones) don't scan well in adhoc mode.
*/
nm_ap_set_freq (ap, freq);
}
+static void
+set_powersave (NMDevice *device)
+{
+ NMDeviceWifi *self = NM_DEVICE_WIFI (device);
+ NMSettingWireless *s_wireless;
+ NMSettingWirelessPowersave powersave;
+ gs_free char *value = NULL;
+
+ s_wireless = (NMSettingWireless *) nm_device_get_applied_setting (device, NM_TYPE_SETTING_WIRELESS);
+ g_return_if_fail (s_wireless);
+
+ powersave = nm_setting_wireless_get_powersave (s_wireless);
+ if (powersave == NM_SETTING_WIRELESS_POWERSAVE_DEFAULT) {
+ value = nm_config_data_get_connection_default (NM_CONFIG_GET_DATA,
+ "wifi.powersave",
+ device);
+ powersave = _nm_utils_ascii_str_to_int64 (value, 10,
+ NM_SETTING_WIRELESS_POWERSAVE_IGNORE,
+ NM_SETTING_WIRELESS_POWERSAVE_ENABLE,
+ NM_SETTING_WIRELESS_POWERSAVE_IGNORE);
+ }
+
+ _LOGT (LOGD_WIFI, "powersave is set to %u", (unsigned int) powersave);
+
+ if (powersave == NM_SETTING_WIRELESS_POWERSAVE_IGNORE)
+ return;
+
+ nm_platform_wifi_set_powersave (NM_PLATFORM_GET,
+ nm_device_get_ifindex (device),
+ powersave == NM_SETTING_WIRELESS_POWERSAVE_ENABLE);
+}
+
static NMActStageReturn
act_stage2_config (NMDevice *device, NMDeviceStateReason *reason)
{
if ((nm_ap_get_mode (ap) == NM_802_11_MODE_ADHOC) || nm_ap_is_hotspot (ap))
ensure_hotspot_frequency (self, s_wireless, ap);
- if (nm_ap_get_mode (ap) == NM_802_11_MODE_INFRA) {
- nm_platform_wifi_set_powersave (NM_PLATFORM_GET,
- nm_device_get_ifindex (device),
- nm_setting_wireless_get_powersave (s_wireless));
- }
+ if (nm_ap_get_mode (ap) == NM_802_11_MODE_INFRA)
+ set_powersave (device);
/* Build up the supplicant configuration */
config = build_supplicant_config (self, connection, nm_ap_get_freq (ap), &error);
char *value = NULL;
gint64 chan = 0;
NMSettingMacRandomization mac_randomization = NM_SETTING_MAC_RANDOMIZATION_NEVER;
+ NMSettingWirelessPowersave powersave = NM_SETTING_WIRELESS_POWERSAVE_DEFAULT;
s_wireless = NM_SETTING_WIRELESS (nm_setting_wireless_new ());
svGetValueBoolean (ifcfg, "SSID_HIDDEN", FALSE),
NULL);
+ value = svGetValueFull (ifcfg, "POWERSAVE", FALSE);
+ if (value) {
+ if (!strcmp (value, "default"))
+ powersave = NM_SETTING_WIRELESS_POWERSAVE_DEFAULT;
+ else if (!strcmp (value, "ignore"))
+ powersave = NM_SETTING_WIRELESS_POWERSAVE_IGNORE;
+ else if (!strcmp (value, "disable") || !strcmp (value, "no"))
+ powersave = NM_SETTING_WIRELESS_POWERSAVE_DISABLE;
+ else if (!strcmp (value, "enable") || !strcmp (value, "yes"))
+ powersave = NM_SETTING_WIRELESS_POWERSAVE_ENABLE;
+ else {
+ g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
+ "Invalid POWERSAVE value '%s'", value);
+ g_free (value);
+ goto error;
+ }
+ g_free (value);
+ }
+
g_object_set (s_wireless,
NM_SETTING_WIRELESS_POWERSAVE,
- svGetValueBoolean (ifcfg, "POWERSAVE", FALSE) ? 1 : 0,
+ powersave,
NULL);
value = svGetValueFull (ifcfg, "MAC_ADDRESS_RANDOMIZATION", FALSE);
else {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Invalid MAC_ADDRESS_RANDOMIZATION value '%s'", value);
+ g_free (value);
goto error;
}
g_free (value);
}
svSetValue (ifcfg, "SSID_HIDDEN", nm_setting_wireless_get_hidden (s_wireless) ? "yes" : NULL, TRUE);
- svSetValue (ifcfg, "POWERSAVE", nm_setting_wireless_get_powersave (s_wireless) ? "yes" : NULL, TRUE);
+
+ switch (nm_setting_wireless_get_powersave (s_wireless)) {
+ case NM_SETTING_WIRELESS_POWERSAVE_IGNORE:
+ svSetValue (ifcfg, "POWERSAVE", "ignore", TRUE);
+ break;
+ case NM_SETTING_WIRELESS_POWERSAVE_DISABLE:
+ svSetValue (ifcfg, "POWERSAVE", "disable", TRUE);
+ break;
+ case NM_SETTING_WIRELESS_POWERSAVE_ENABLE:
+ svSetValue (ifcfg, "POWERSAVE", "enable", TRUE);
+ break;
+ default:
+ case NM_SETTING_WIRELESS_POWERSAVE_DEFAULT:
+ svSetValue (ifcfg, "POWERSAVE", NULL, TRUE);
+ break;
+ }
svSetValue (ifcfg, "MAC_ADDRESS_RANDOMIZATION", NULL, TRUE);
switch (nm_setting_wireless_get_mac_address_randomization (s_wireless)) {