Hi Daniel,<br><br>Not sure if powerd makes use of it at all already (for things like watching videos in totem) but why not use the kernel/upower inhibit functionally just like totem and the like does. Then powerd just needs to listen/check/whatever for the inhibit and it would then also work (if it doesn't already) for those apps like totem in the gnome desktop.<br>
<br>Peter<br><br><div class="gmail_quote">On Wed, Aug 3, 2011 at 7:07 PM, Daniel Drake <span dir="ltr"><<a href="mailto:dsd@laptop.org">dsd@laptop.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hi Paul,<br>
<br>
For 11.3.0 I'd like to implement a solution for the issue where powerd<br>
idle-suspends while wifi connections are being established, causing<br>
connection failures and other undesirable activity.<br>
<br>
The solution I'm thinking of isn't ideal in that it adds a mini-daemon<br>
alongside powerd. But hey, you just got rid of HAL, we have breathing<br>
space ;) and I can't think of a better way.<br>
<br>
Here is what I've thought up:<br>
<br>
<br>
Instead of being on-demand and short lived, powerd-dbus will be<br>
launched by powerd and will become a full-time daemon.<br>
In addition to the functionality that it already has, it will connect<br>
to the dbus system bus and monitor NetworkManager's StateChanged<br>
signals.<br>
<br>
The NM states are:<br>
DEVICE_STATE_UNKNOWN = 0<br>
DEVICE_STATE_UNMANAGED = 1<br>
DEVICE_STATE_UNAVAILABLE = 2<br>
DEVICE_STATE_DISCONNECTED = 3<br>
DEVICE_STATE_PREPARE = 4<br>
DEVICE_STATE_CONFIG = 5<br>
DEVICE_STATE_NEED_AUTH = 6<br>
DEVICE_STATE_IP_CONFIG = 7<br>
DEVICE_STATE_ACTIVATED = 8<br>
DEVICE_STATE_FAILED = 9<br>
<br>
Lets assign a variable:<br>
  nm_suspend_ok = state <= 3 && state >= 8<br>
(i.e. suspend is only OK if we aren't establishing a connection)<br>
<br>
It will also monitor the wpa_supplicant signals for the same device,<br>
watching for the Scanning signal.<br>
  wpas_suspend_ok = !Scanning<br>
<br>
Finally:<br>
  suspend_ok = wpas_suspend_ok && nm_suspend_ok<br>
<br>
When the suspend_ok flag changes, it would be communicated to powerd<br>
through the powerevents socket, as "network_suspend_ok" or<br>
"network_suspend_not_ok".<br>
<br>
There would be a 2 second settle period after a not-OK to OK<br>
transition before sending the powerd event (and the event would be<br>
aborted if the situation changes within those 2 seconds). This<br>
captures the case where NM says the device is disconnected, and<br>
wpa_supplicant has finished a scan (suspend_ok == TRUE), but NM will<br>
initiate a connection immediately after (once it has processed the<br>
scan results).<br>
<br>
When powerd has been told network_suspend_not_ok, it would not suspend<br>
until told otherwise. (I'll probably ask you to implement this bit, I<br>
guess you could do it rather quickly?)<br>
<br>
<br>
<br>
<br>
The above is the main functionality I want to implement. But, to kill<br>
2 birds in 1 stone, having this full-time daemon around lets me solve<br>
another issue: rfkill.<br>
<br>
You probably recall that sugar-0.84 executed "rfkill block olpc" when<br>
the "disable wifi" checkbox was ticked. Unfortunately this was never<br>
upstreamed (boo), so 11.2.0 doesn't have that functionality. In<br>
11.2.0, the NM WirelessEnabled property is manipulated, and the<br>
interface is brought down, but we don't actually cut power.<br>
<br>
We do have the option of reimplementing it in Sugar, but (for now) I<br>
think powerd would be a nicer place to do this. (Ultimately, we want<br>
NM to do it).<br>
<br>
So, in addition to the above, powerd-dbus would monitor for<br>
NetworkManager's PropertiesChanged signal, and apply this simple<br>
logic.<br>
<br>
  if WirelessEnabled == true:<br>
    rfkill unblock olpc<br>
  else:<br>
    rfkill block olpc<br>
<br>
<br>
How does this sound to you?<br>
<br>
Thanks,<br>
Daniel<br>
_______________________________________________<br>
Devel mailing list<br>
<a href="mailto:Devel@lists.laptop.org">Devel@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/devel" target="_blank">http://lists.laptop.org/listinfo/devel</a><br>
</blockquote></div><br>