From: Mika Liljeberg Date: Mon, 29 Nov 2010 14:15:38 +0000 (+0200) Subject: isimodem: prevent gprs autodetach X-Git-Tag: 0.37~56 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1199b3fc54871d610069f42caffb2257b2d32c39;p=platform%2Fupstream%2Fofono.git isimodem: prevent gprs autodetach --- diff --git a/drivers/isimodem/gpds.h b/drivers/isimodem/gpds.h index 8ebe685..abe458a 100644 --- a/drivers/isimodem/gpds.h +++ b/drivers/isimodem/gpds.h @@ -253,6 +253,32 @@ enum gpds_attach_status { GPDS_ATTACHED = 0x01 }; +enum gpds_attach_mode { + GPDS_ATTACH_MODE_MANUAL = 0x00, + GPDS_ATTACH_MODE_AUTOMATIC = 0x01, + GPDS_ATTACH_MODE_DEFAULT = 0xFF +}; + +enum gpds_mt_act_mode { + GPDS_MT_ACT_MODE_REJECT = 0x00, + GPDS_MT_ACT_MODE_ACCEPT = 0x01, + GPDS_MT_ACT_MODE_DEFAULT = 0xFF +}; + +enum gpds_classc_mode { + GPDS_CLASSC_MODE_GPRS = 0x00, + GPDS_CLASSC_MODE_GSM = 0x01, + GPDS_CLASSC_MODE_DEFAULT = 0xFF +}; + +enum gpds_aol_context { + GPDS_AOL_CTX_NOT_ACTIVE = 0x00, + GPDS_AOL_CTX_HPLMN_ACTIVE = 0x01, + GPDS_AOL_CTX_VPLMN_ACTIVE = 0x02, + GPDS_AOL_CTX_ACTIVE = 0x03, + GPDS_AOL_CTX_DEFAULT = 0xFF +}; + #ifdef __cplusplus }; #endif diff --git a/drivers/isimodem/gprs.c b/drivers/isimodem/gprs.c index 609f5db..58eff0a 100644 --- a/drivers/isimodem/gprs.c +++ b/drivers/isimodem/gprs.c @@ -60,6 +60,45 @@ struct gprs_data { GIsiClient *info_client; }; +static void configure_resp_cb(const GIsiMessage *msg, void *opaque) +{ + const uint8_t *data = g_isi_msg_data(msg); + + if (g_isi_msg_error(msg) < 0) { + DBG("ISI message error: %d", g_isi_msg_error(msg)); + return; + } + + if (g_isi_msg_id(msg) != GPDS_CONFIGURE_RESP) + return; + + if (g_isi_msg_data_len(msg) < 1) + return; + + if (data[0] != GPDS_OK) + DBG("GPDS configure failed: %s", gpds_status_name(data[0])); +} + +static void set_attach_mode(struct ofono_gprs *gprs, int attached) +{ + struct gprs_data *gd = ofono_gprs_get_data(gprs); + + const unsigned char msg[] = { + GPDS_CONFIGURE_REQ, + attached ? GPDS_ATTACH_MODE_AUTOMATIC : GPDS_ATTACH_MODE_MANUAL, + GPDS_MT_ACT_MODE_REJECT, + GPDS_CLASSC_MODE_DEFAULT, + GPDS_AOL_CTX_DEFAULT, + 0x00, + 0x00 + }; + + if (g_isi_client_send(gd->client, msg, sizeof(msg), + GPDS_TIMEOUT, configure_resp_cb, + gprs, NULL)) + return; +} + static void detach_ind_cb(const GIsiMessage *msg, void *opaque) { struct ofono_gprs *gprs = opaque; @@ -77,6 +116,8 @@ static void detach_ind_cb(const GIsiMessage *msg, void *opaque) DBG("detached: %s (0x%02"PRIx8")", gpds_isi_cause_name(data[0]), data[0]); + set_attach_mode(gprs, FALSE); + ofono_gprs_detached_notify(gprs); } @@ -305,6 +346,8 @@ static void attach_resp_cb(const GIsiMessage *msg, void *opaque) goto error; } + set_attach_mode(cbd->user, TRUE); + CALLBACK_WITH_SUCCESS(cb, cbd->data); return; @@ -334,6 +377,8 @@ static void detach_resp_cb(const GIsiMessage *msg, void *opaque) goto error; } + set_attach_mode(cbd->user, FALSE); + CALLBACK_WITH_SUCCESS(cb, cbd->data); return; @@ -345,7 +390,7 @@ static void isi_gprs_set_attached(struct ofono_gprs *gprs, int attached, ofono_gprs_cb_t cb, void *data) { struct gprs_data *gd = ofono_gprs_get_data(gprs); - struct isi_cb_data *cbd = isi_cb_data_new(NULL, cb, data); + struct isi_cb_data *cbd = isi_cb_data_new(gprs, cb, data); if (cbd == NULL || gd == NULL) goto error;