diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2011-07-24 14:48:39 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2011-07-24 14:48:39 +0200 |
commit | 476fab4ea192aa9db2e0ead9d99df72a6a28d0e9 (patch) | |
tree | 6f4d47ca53625399b32535616f01276ac2a44665 /drivers | |
parent | 7ed56d6844f8131cbf981e482b7bded8b20db7ab (diff) | |
download | ofono-476fab4ea192aa9db2e0ead9d99df72a6a28d0e9.tar.bz2 |
atmodem: Add support for NW DEACT notifications on slave channel
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/atmodem/gprs-context.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/atmodem/gprs-context.c b/drivers/atmodem/gprs-context.c index 9e3f9cbc..ae6f06ad 100644 --- a/drivers/atmodem/gprs-context.c +++ b/drivers/atmodem/gprs-context.c @@ -268,6 +268,40 @@ static void at_gprs_deactivate_primary(struct ofono_gprs_context *gc, g_at_ppp_shutdown(gcd->ppp); } +static void cgev_notify(GAtResult *result, gpointer user_data) +{ + struct ofono_gprs_context *gc = user_data; + struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); + const char *event; + int cid; + GAtResultIter iter; + + g_at_result_iter_init(&iter, result); + + if (!g_at_result_iter_next(&iter, "+CGEV:")) + return; + + if (!g_at_result_iter_next_unquoted_string(&iter, &event)) + return; + + if (g_str_has_prefix(event, "NW DEACT") == FALSE) + return; + + if (!g_at_result_iter_skip_next(&iter)) + return; + + if (!g_at_result_iter_next_number(&iter, &cid)) + return; + + DBG("cid %d", cid); + + if ((unsigned int) cid != gcd->active_context) + return; + + if (gcd->state != STATE_IDLE && gcd->ppp) + g_at_ppp_shutdown(gcd->ppp); +} + static int at_gprs_context_probe(struct ofono_gprs_context *gc, unsigned int vendor, void *data) { @@ -290,6 +324,12 @@ static int at_gprs_context_probe(struct ofono_gprs_context *gc, ofono_gprs_context_set_data(gc, gcd); + chat = g_at_chat_get_slave(gcd->chat); + if (chat == NULL) + return 0; + + g_at_chat_register(chat, "+CGEV:", cgev_notify, FALSE, gc, NULL); + return 0; } |