How to issue an "ifup broadband" when this is logged
Russ Westrem
lspwaterproofing at gmail.com
Wed Feb 15 20:00:11 UTC 2017
On Feb 14, 2017 11:20 PM, "Dan Williams" <dcbw at redhat.com> wrote:
On Tue, 2017-02-14 at 15:46 -0600, Russ Westrem wrote:
> You mean you can still use the WWAN even if MM says it's
> disconnected?
> Not sure I understood, otherwise.
>
>
> --
> Aleksander
> https://aleksander.es
>
>
>
> No, nothing is usable untill i ifup.
Here's what's probably going on... When the network tells the modem to
disconnect the PDP context (eg, bearer), MM sees the message and sets
the status on the bearer and does some other cleanup. But that doesn't
actually trigger a bearer disconnect, because ModemManager is waiting
for a connection manager to notice the bearer/modem state change and to
delete the bearer, which in your case actually clears the WDS client
and tells the modem to release the bearer resources.
But MM should probably call the bearer disconnect sequence when the
bearer is disconnected unexpectedly, and ignore errors since the bearer
is already dead. But this doesn't help your actual problem, which is
that nothing is telling ModemManager to activate another bearer when
the first one drops...
So to circle back to your original question, which was "how do I
automatically reconnect a bearer when the network disconnects me",
you'd have a small script that watches the modem state, and if the
modem state moves from connected -> registered just runs 'ifup
broadband'.
Dan
Here's how to do that in Python, for example:
---------------------------------------------
import sys, signal, gi, os
gi.require_version('ModemManager', '1.0')
from gi.repository import GLib, GObject, Gio, ModemManager
def modem_state_changed(modem, old_state, new_state, reason):
print "Modem state changed: %d -> %d (reason %d)" % (old_state,
new_state, reason)
if old_state == getattr(ModemManager,"ModemState").CONNECTED and
new_state == getattr(ModemManager,"ModemState").REGISTERED:
os.system("ifup broadband")
sigids = {}
def watch_modem(manager, obj):
modem = obj.get_modem()
sigids[modem] = modem.connect('state-changed', modem_state_changed)
def unwatch_modem(manager, obj):
modem = obj.get_modem()
modem.disconnect(sigids[modem])
del sigids[modem]
def signal_handler(data):
main_loop.quit()
if __name__ == "__main__":
main_loop = GLib.MainLoop()
GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGHUP, signal_handler,
None)
GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGTERM,
signal_handler, None)
# Connection to ModemManager
connection = Gio.bus_get_sync (Gio.BusType.SYSTEM, None)
manager = ModemManager.Manager.new_sync (connection, Gio.
DBusObjectManagerClientFlags.DO_NOT_AUTO_START, None)
# watch the manager for new modems
manager.connect('object-added', watch_modem)
manager.connect('object-removed', unwatch_modem)
# Watch existing modems
if manager.get_name_owner() != None:
for obj in manager.get_objects():
watch_modem(manager, obj)
# Main loop
try:
main_loop.run()
except KeyboardInterrupt:
pass
Is there anything in the modemmanager scripts that I could change to have
it ignore the deregistered modem and stop it from removing it from the
bearer. I have a feeling these deregistrations happen often but very
quickly and maybe if ignored, everything might work.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/modemmanager-devel/attachments/20170215/e658f635/attachment-0001.html>
More information about the ModemManager-devel
mailing list