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
This commit is contained in:
Richard Röjfors 2020-02-14 11:20:04 -06:00 committed by Denis Kenzior
parent 8e78d4dba5
commit 952f1d00be
1 changed files with 11 additions and 9 deletions

View File

@ -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);
}