From ec2e57686345e31c854323f022b25887c5d025d5 Mon Sep 17 00:00:00 2001 From: Pekka Pessi Date: Wed, 20 Oct 2010 19:44:54 +0300 Subject: [PATCH] isi: fix SMS Read absence/presence flags from correct field. Try to avoid overwriting other SMS parameters but SCA address. Use g_isi_(v)send(). --- drivers/isimodem/sms.c | 93 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 56 insertions(+), 37 deletions(-) diff --git a/drivers/isimodem/sms.c b/drivers/isimodem/sms.c index d8c617f..89cd7d9 100644 --- a/drivers/isimodem/sms.c +++ b/drivers/isimodem/sms.c @@ -49,6 +49,18 @@ struct sms_data { GIsiClient *client; GIsiClient *sim; + /* This is a straightforward copy of the EF_smsp structure */ + struct sim_parameters { + uint8_t absent; + uint8_t tp_pid; + uint8_t tp_dcs; + uint8_t tp_vp; + uint8_t dst[12]; + uint8_t sca[12]; + uint8_t alphalen; + uint8_t filler[3]; + uint16_t alpha[17]; + } params; }; static gboolean sca_query_resp_cb(GIsiClient *client, @@ -57,6 +69,8 @@ static gboolean sca_query_resp_cb(GIsiClient *client, { const uint8_t *msg = data; struct isi_cb_data *cbd = opaque; + struct ofono_sms *sms = cbd->user; + struct sms_data *sd = ofono_sms_get_data(sms); ofono_sms_sca_query_cb_t cb = cbd->cb; struct ofono_phone_number sca; @@ -74,12 +88,24 @@ static gboolean sca_query_resp_cb(GIsiClient *client, if (msg[3] != SIM_SERV_OK) goto error; - /* Bitmask indicating presence of parameters -- second flag - * set is an indicator that the SCA is absent */ - if (msg[4] & 0x2) + if (len > 3 + sizeof(sd->params)) + len = 3 + sizeof(sd->params); + memcpy(&sd->params, msg + 3, len - 3); + + if (sd->params.alphalen > 17) + sd->params.alphalen = 17; + else if (sd->params.alphalen < 1) + sd->params.alphalen = 1; + sd->params.alpha[sd->params.alphalen - 1] = '\0'; + + /* + * Bitmask indicating absense of parameters -- + * If second bit is set it indicates that the SCA is absent + */ + if (sd->params.absent & 0x2) goto error; - bcd = msg + 19; + bcd = sd->params.sca; bcd_len = bcd[0]; if (bcd_len <= 1 || bcd_len > 12) @@ -89,13 +115,10 @@ static gboolean sca_query_resp_cb(GIsiClient *client, sca.type = bcd[1]; CALLBACK_WITH_SUCCESS(cb, &sca, cbd->data); - goto out; + return TRUE; error: CALLBACK_WITH_FAILURE(cb, NULL, cbd->data); - -out: - g_free(cbd); return TRUE; } @@ -114,8 +137,8 @@ static void isi_sca_query(struct ofono_sms *sms, if (!cbd || !sd) goto error; - if (g_isi_request_make(sd->sim, msg, sizeof(msg), SIM_TIMEOUT, - sca_query_resp_cb, cbd)) + if (g_isi_send(sd->sim, msg, sizeof(msg), SIM_TIMEOUT, + sca_query_resp_cb, cbd, g_free)) return; error: @@ -143,13 +166,10 @@ static gboolean sca_set_resp_cb(GIsiClient *client, goto error; CALLBACK_WITH_SUCCESS(cb, cbd->data); - goto out; + return TRUE; error: CALLBACK_WITH_FAILURE(cb, cbd->data); - -out: - g_free(cbd); return TRUE; } @@ -159,33 +179,31 @@ static void isi_sca_set(struct ofono_sms *sms, { struct sms_data *sd = ofono_sms_get_data(sms); struct isi_cb_data *cbd = isi_cb_data_new(sms, cb, data); + uint8_t *bcd; uint8_t msg[] = { SIM_SMS_REQ, UPDATE_PARAMETER, 1, /* Location, default is 1 */ - 0xFD, /* Params present, only SCA */ }; - uint8_t filler[40] = { 0 }; - uint8_t bcd[12]; - - struct iovec iov[4] = { + struct iovec iov[] = { { msg, sizeof(msg) }, - { filler, 15 }, - { bcd, sizeof(bcd) }, - { filler, 38 }, + { &sd->params, sizeof(sd->params) }, }; if (!cbd || !sd) goto error; + bcd = sd->params.sca; + sd->params.absent &= ~0x02; + encode_bcd_number(sca->number, bcd + 2); bcd[0] = 1 + (strlen(sca->number) + 1) / 2; bcd[1] = sca->type & 0xFF; - if (g_isi_request_vmake(sd->sim, iov, 4, SIM_TIMEOUT, - sca_set_resp_cb, cbd)) + if (g_isi_vsend(sd->sim, iov, G_N_ELEMENTS(iov), SIM_TIMEOUT, + sca_set_resp_cb, cbd, g_free)) return; error: @@ -253,13 +271,10 @@ static gboolean submit_resp_cb(GIsiClient *client, goto error; CALLBACK_WITH_SUCCESS(cb, mr, cbd->data); - goto out; + return TRUE; error: CALLBACK_WITH_FAILURE(cb, -1, cbd->data); - -out: - g_free(cbd); return TRUE; } @@ -316,8 +331,8 @@ static void isi_submit(struct ofono_sms *sms, unsigned char *pdu, if (!cbd || !sd) goto error; - if (g_isi_request_vmake(sd->client, iov, use_default ? 2 : 4, SMS_TIMEOUT, - submit_resp_cb, cbd)) + if (g_isi_vsend(sd->client, iov, use_default ? 2 : 4, SMS_TIMEOUT, + submit_resp_cb, cbd, g_free)) return; error: @@ -356,6 +371,7 @@ static gboolean report_resp_cb(GIsiClient *client, return FALSE; DBG("Report resp cause=0x%"PRIx8, msg[1]); + return TRUE; } @@ -378,8 +394,8 @@ static gboolean send_deliver_report(GIsiClient *client, gboolean success) 0, /* Sub blocks */ }; - return g_isi_request_make(client, msg, sizeof(msg), SMS_TIMEOUT, - report_resp_cb, NULL) != NULL; + return g_isi_send(client, msg, sizeof(msg), SMS_TIMEOUT, + report_resp_cb, NULL, NULL) != NULL; } static void routing_ntf_cb(GIsiClient *client, @@ -518,13 +534,16 @@ static int isi_sms_probe(struct ofono_sms *sms, unsigned int vendor, if (!data) return -ENOMEM; + data->params.absent = 0xff; + data->params.alphalen = 1; /* Includes final UCS2-coded NUL */ + data->client = g_isi_client_create(idx, PN_SMS); if (!data->client) return -ENOMEM; data->sim = g_isi_client_create(idx, PN_SIM); if (!data->sim) { - g_free(data->client); + g_isi_client_destroy(data->client); return -ENOMEM; } @@ -538,8 +557,8 @@ static int isi_sms_probe(struct ofono_sms *sms, unsigned int vendor, g_isi_subscribe(data->client, SMS_MESSAGE_SEND_STATUS_IND, send_status_ind_cb, sms); - if (!g_isi_request_make(data->client, msg, sizeof(msg), SMS_TIMEOUT, - routing_resp_cb, sms)) + if (!g_isi_send(data->client, msg, sizeof(msg), SMS_TIMEOUT, + routing_resp_cb, sms, NULL)) DBG("Failed to set SMS routing."); return 0; @@ -570,8 +589,8 @@ static void isi_sms_remove(struct ofono_sms *sms) * Send a promiscuous routing release, so as not to * hog resources unnecessarily after being removed */ - g_isi_request_make(data->client, msg, sizeof(msg), - SMS_TIMEOUT, NULL, NULL); + g_isi_send(data->client, msg, sizeof(msg), + SMS_TIMEOUT, NULL, NULL, NULL); g_isi_client_destroy(data->client); g_isi_client_destroy(data->sim); g_free(data); -- 2.7.4