Comment 3 for bug 1557026

Revision history for this message
Tony Espy (awe) wrote : Re: Network Manager sets powersave off by default in xenial

So NM 1.1.93-0ubuntu1 includes the patch default_powersave_on.patch, which is pretty simple, it just modifies the NMSettingWireless code to default powersave to 1:

===================================================================
--- a/libnm-util/nm-setting-wireless.c
+++ b/libnm-util/nm-setting-wireless.c
@@ -675,7 +675,7 @@ nm_setting_wireless_get_hidden (NMSettin
 guint32
 nm_setting_wireless_get_powersave (NMSettingWireless *setting)
 {
- g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), 0);
+ g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), 1);

  return NM_SETTING_WIRELESS_GET_PRIVATE (setting)->powersave;
 }
@@ -885,6 +885,9 @@ verify (NMSetting *setting, GSList *all_
 static void
 nm_setting_wireless_init (NMSettingWireless *setting)
 {
+ NMSettingWirelessPrivate *priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting);
+
+ priv->powersave = 1;
 }

 static void
@@ -1283,7 +1286,7 @@ nm_setting_wireless_class_init (NMSettin
  g_object_class_install_property
   (object_class, PROP_POWERSAVE,
    g_param_spec_uint (NM_SETTING_WIRELESS_POWERSAVE, "", "",
- 0, G_MAXUINT32, 0,
+ 0, G_MAXUINT32, 1,
                       G_PARAM_READWRITE |
                       G_PARAM_STATIC_STRINGS));
 }

...unfortunately, the NM1.2 treats powersave=1 as IGNORE:

/**
 * 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;

...and the code in NMDeviceWiFi will only enable powersave if the value returned from NMSettingWireless is 3:

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);