summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorRichard Röjfors <richard@puffinpack.se>2020-02-14 11:20:04 -0600
committerDenis Kenzior <denkenz@gmail.com>2020-02-14 11:24:14 -0600
commit952f1d00be4e0a9dd71b7b8e5b6ef2f967e2f7c2 (patch)
tree874ac8ad8fcc30c437178e6b741ef16123729fcf /drivers
parent8e78d4dba5d54b4b1175a53973ceb6f829c22bfa (diff)
downloadofono-952f1d00be4e0a9dd71b7b8e5b6ef2f967e2f7c2.tar.gz
ublox: network-registration: Handle UREG unsolicited during poll
In the case a unsolicited indication for UREG was received while the status was polled. The poll response failed to parse. This since the unsolicited indication only carries one parameter, while the poll response is expected to carry two. Update the code to loop until the response is found. The log below shows a case where this happened. 10:07:55 ofonod[520]: Aux: > AT+UREG?\r 10:07:55 ofonod[520]: Aux: < \r\n+CGREG: 4\r\n\r\n+UREG: 0\r\n\r\n+CIEV: 9,1\r\n 10:07:55 ofonod[520]: src/gprs.c:ofono_gprs_status_notify() /ublox_0 status unknown (4) 10:07:55 ofonod[520]: src/gprs.c:ofono_gprs_detached_notify() /ublox_0 10:07:55 ofonod[520]: Aux: < \r\n+UREG: 1,0\r\n 10:07:55 ofonod[520]: Aux: < \r\nOK\r\n
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ubloxmodem/network-registration.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/drivers/ubloxmodem/network-registration.c b/drivers/ubloxmodem/network-registration.c
index 6a524f47..7c16e574 100644
--- a/drivers/ubloxmodem/network-registration.c
+++ b/drivers/ubloxmodem/network-registration.c
@@ -279,7 +279,7 @@ static void ublox_ureg_cb(gboolean ok, GAtResult *result,
struct netreg_data *nd = ofono_netreg_get_data(tq->netreg);
GAtResultIter iter;
gint enabled, state;
- int tech = tq->tech;
+ int tech = -1;
nd->updating_status = false;
@@ -288,21 +288,23 @@ static void ublox_ureg_cb(gboolean ok, GAtResult *result,
g_at_result_iter_init(&iter, result);
- if (!g_at_result_iter_next(&iter, "+UREG:"))
- return;
+ while (g_at_result_iter_next(&iter, "+UREG:")) {
+ if (!g_at_result_iter_next_number(&iter, &enabled))
+ return;
- if (!g_at_result_iter_next_number(&iter, &enabled))
- return;
+ /* Sometimes we get an unsolicited UREG here, skip it */
+ if (!g_at_result_iter_next_number(&iter, &state))
+ continue;
- if (!g_at_result_iter_next_number(&iter, &state))
- return;
+ tech = ublox_ureg_state_to_tech(state);
+ break;
+ }
- tech = ublox_ureg_state_to_tech(state);
+error:
if (tech < 0)
/* No valid UREG status, we have to trust CREG... */
tech = tq->tech;
-error:
ofono_netreg_status_notify(tq->netreg,
tq->status, tq->lac, tq->ci, tech);
}