diff options
author | Aki Niemi <aki.niemi@nokia.com> | 2010-04-27 15:11:53 +0300 |
---|---|---|
committer | Aki Niemi <aki.niemi@nokia.com> | 2010-04-27 23:21:48 +0300 |
commit | b0222a79c3a61ad1dbf1438bd9fe927c75cb7ddd (patch) | |
tree | f03f3b0fffb0ea2805ba034f8be8a4b67c38ed5e /drivers | |
parent | c123a9b5ba691755dcd054c1990a585190ee3af8 (diff) | |
download | ofono-b0222a79c3a61ad1dbf1438bd9fe927c75cb7ddd.tar.bz2 |
Fix faulty logic in netreg driver
Also add missing tech param.
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/isimodem/network-registration.c | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/drivers/isimodem/network-registration.c b/drivers/isimodem/network-registration.c index dfd7acc5..eddf6fd4 100644 --- a/drivers/isimodem/network-registration.c +++ b/drivers/isimodem/network-registration.c @@ -222,7 +222,7 @@ static bool reg_status_resp_cb(GIsiClient *client, const void *restrict data, } if (len < 3 || msg[0] != NET_REG_STATUS_GET_RESP) - goto error; + return false; if (msg[1] != NET_CAUSE_OK) { DBG("Request failed: %s", net_isi_cause_name(msg[1])); @@ -403,25 +403,23 @@ static bool available_resp_cb(GIsiClient *client, const void *restrict data, total = msg[2] / 2; list = alloca(total * sizeof(struct ofono_network_operator)); - g_isi_sb_iter_init(&iter, msg, len, 3); + for (g_isi_sb_iter_init(&iter, msg, len, 3); + g_isi_sb_iter_is_valid(&iter); + g_isi_sb_iter_next(&iter)) { - while (g_isi_sb_iter_is_valid(&iter)) { + struct ofono_network_operator *op; + char *tag = NULL; + guint8 taglen = 0; + guint8 status = 0; + guint8 umts = 0; switch (g_isi_sb_iter_get_id(&iter)) { - case NET_AVAIL_NETWORK_INFO_COMMON: { - struct ofono_network_operator *op; - char *tag = NULL; - guint8 taglen = 0; - guint8 status = 0; + case NET_AVAIL_NETWORK_INFO_COMMON: - if (!g_isi_sb_iter_get_byte(&iter, &status, 2)) - goto error; - - if (!g_isi_sb_iter_get_byte(&iter, &taglen, 5)) - goto error; - - if (!g_isi_sb_iter_get_alpha_tag(&iter, &tag, + if (!g_isi_sb_iter_get_byte(&iter, &status, 2) + || !g_isi_sb_iter_get_byte(&iter, &taglen, 5) + || !g_isi_sb_iter_get_alpha_tag(&iter, &tag, taglen * 2, 6)) goto error; @@ -432,17 +430,17 @@ static bool available_resp_cb(GIsiClient *client, const void *restrict data, op->name[OFONO_MAX_OPERATOR_NAME_LENGTH] = '\0'; g_free(tag); break; - } - - case NET_DETAILED_NETWORK_INFO: { - struct ofono_network_operator *op; + case NET_DETAILED_NETWORK_INFO: op = list + detail++; + if (!g_isi_sb_iter_get_oper_code(&iter, op->mcc, - op->mnc, 2)) + op->mnc, 2) + || !g_isi_sb_iter_get_byte(&iter, &umts, 7)) goto error; + + op->tech = umts ? 2 : 3; break; - } default: DBG("Skipping sub-block: %s (%zu bytes)", @@ -450,7 +448,6 @@ static bool available_resp_cb(GIsiClient *client, const void *restrict data, g_isi_sb_iter_get_len(&iter)); break; } - g_isi_sb_iter_next(&iter); } if (common == detail && detail == total) { @@ -510,7 +507,7 @@ static bool set_auto_resp_cb(GIsiClient *client, const void *restrict data, } if (!msg || len < 3 || msg[0] != NET_SET_RESP) - goto error; + return false; if (msg[1] != NET_CAUSE_OK) { DBG("Request failed: %s", net_isi_cause_name(msg[1])); @@ -576,7 +573,7 @@ static bool set_manual_resp_cb(GIsiClient *client, const void *restrict data, } if (len < 3 || msg[0] != NET_SET_RESP) - goto error; + return false; if (msg[1] != NET_CAUSE_OK) { DBG("Request failed: %s", net_isi_cause_name(msg[1])); |