X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/4f6b41b9fafa19b941298abd7c19f5757b461a2a..f53935552469894ef696b6f01fc19a70845bea91:/svc/conntrack.in diff --git a/svc/conntrack.in b/svc/conntrack.in index 1ccbae66..79b47d88 100644 --- a/svc/conntrack.in +++ b/svc/conntrack.in @@ -237,6 +237,14 @@ def localaddr(peer): sk.close() _kick = T.Queue() +_delay = None + +def cancel_delay(): + global _delay + if _delay is not None: + if T._debug: print '# cancel delayed kick' + G.source_remove(_delay) + _delay = None def netupdown(upness, reason): """ @@ -247,11 +255,24 @@ def netupdown(upness, reason): _kick.put((upness, reason)) +def delay_netupdown(upness, reason): + global _delay + cancel_delay() + def _func(): + global _delay + if T._debug: print '# delayed %s: %s' % (upness, reason) + _delay = None + netupdown(upness, reason) + return False + if T._debug: print '# delaying %s: %s' % (upness, reason) + _delay = G.timeout_add(2000, _func) + def kickpeers(): while True: upness, reason = _kick.get() if T._debug: print '# kickpeers %s: %s' % (upness, reason) select = [] + cancel_delay() ## Make sure the configuration file is up-to-date. Don't worry if we ## can't do anything useful. @@ -392,13 +413,13 @@ class NetworkManagerMonitor (object): def _nm_state(me, state): if state in NM_CONNSTATES: - netupdown(True, ['nm', 'connected']) + delay_netupdown(True, ['nm', 'connected']) else: - netupdown(False, ['nm', 'disconnected']) + delay_netupdown(False, ['nm', 'disconnected']) def _nm_connchange(me, props): - if props.get('Default', False): - netupdown(True, ['nm', 'default-connection-change']) + if props.get('Default', False) or props.get('Default6', False): + delay_netupdown(True, ['nm', 'default-connection-change']) ##-------------------------------------------------------------------------- ### Connman monitor. @@ -430,7 +451,7 @@ class ConnManMonitor (object): def _cm_state(me, prop, value): if prop != 'State': return - netupdown(value == 'online', ['connman', value]) + delay_netupdown(value == 'online', ['connman', value]) ###-------------------------------------------------------------------------- ### Maemo monitor. @@ -471,10 +492,10 @@ class MaemoICdMonitor (object): def _icd_state(me, iap, ty, state, hunoz): if state == 'CONNECTED': me._iap = iap - netupdown(True, ['icd', 'connected', iap]) + delay_netupdown(True, ['icd', 'connected', iap]) elif state == 'IDLE' and iap == me._iap: me._iap = None - netupdown(False, ['icd', 'idle']) + delay_netupdown(False, ['icd', 'idle']) ###-------------------------------------------------------------------------- ### D-Bus connection tracking. @@ -586,8 +607,9 @@ def init(): DBM.addmon(NetworkManagerMonitor()) DBM.addmon(ConnManMonitor()) DBM.addmon(MaemoICdMonitor()) - G.timeout_add_seconds(30, lambda: (netupdown(True, ['interval-timer']) - or True)) + G.timeout_add_seconds(30, lambda: (_delay is not None or + netupdown(True, ['interval-timer']) or + True)) def parse_options(): """