Hi Guillaume, On 05/04/2011 10:39 AM, Guillaume Zajac wrote: > --- > gatchat/gatppp.c | 35 +++++++++++++++++++++++++++++++++++ > gatchat/gatppp.h | 1 + > 2 files changed, 36 insertions(+), 0 deletions(-) > > diff --git a/gatchat/gatppp.c b/gatchat/gatppp.c > index c776811..67f0a28 100644 > --- a/gatchat/gatppp.c > +++ b/gatchat/gatppp.c > @@ -46,6 +46,9 @@ > #define PPP_ADDR_FIELD 0xff > #define PPP_CTRL 0x03 > > +/* Time to wait before and after +++ sequence */ > +#define GUARD_TIMEOUTS 1500 > + > enum ppp_phase { > PPP_PHASE_DEAD = 0, /* Link dead */ > PPP_PHASE_ESTABLISHMENT, /* LCP started */ > @@ -500,6 +503,38 @@ void g_at_ppp_shutdown(GAtPPP *ppp) > pppcp_signal_close(ppp->lcp); > } > > +static gboolean call_suspend_cb(gpointer user_data) > +{ > + GAtPPP *ppp = user_data; > + > + if (ppp->suspend_func) > + ppp->suspend_func(ppp->suspend_data); > + > + return FALSE; > +} > + > +static gboolean send_escape_sequence(gpointer user_data) > +{ > + GAtPPP *ppp = user_data; > + GAtIO *io = g_at_hdlc_get_io(ppp->hdlc); > + > + g_at_io_write(io, "+++", 3); > + > + g_timeout_add(GUARD_TIMEOUTS, call_suspend_cb, ppp); Please make sure to track this GSource and remove it in case ppp is ever forcefully removed. Remember, we're writing a library and you must make sure to clean up after yourself. > + > + return FALSE; > +} > + > +void g_at_ppp_suspend(GAtPPP *ppp) > +{ > + if (ppp == NULL) > + return; > + > + ppp_net_suspend_interface(ppp->net); > + g_at_hdlc_suspend(ppp->hdlc); > + g_timeout_add(GUARD_TIMEOUTS, send_escape_sequence, ppp); > +} > + > void g_at_ppp_ref(GAtPPP *ppp) > { > g_atomic_int_inc(&ppp->ref_count); > diff --git a/gatchat/gatppp.h b/gatchat/gatppp.h > index 9464ffd..66e0ade 100644 > --- a/gatchat/gatppp.h > +++ b/gatchat/gatppp.h > @@ -64,6 +64,7 @@ void g_at_ppp_set_suspend_function(GAtPPP *ppp, GAtSuspendFunc func, > gpointer user_data); > void g_at_ppp_set_debug(GAtPPP *ppp, GAtDebugFunc func, gpointer user_data); > void g_at_ppp_shutdown(GAtPPP *ppp); > +void g_at_ppp_suspend(GAtPPP *ppp); > void g_at_ppp_ref(GAtPPP *ppp); > void g_at_ppp_unref(GAtPPP *ppp); > Is a _resume version of this patch forthcoming? Regards, -Denis