diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2012-12-29 15:32:45 +0100 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2012-12-29 15:37:31 +0100 |
commit | 97eb0c701d004069de9569fc7f19691ffa7f56a6 (patch) | |
tree | d45b4de933d42767682bc30ec130a2ebb12978ef /src/host/layer23/src/mobile/gsm48_mm.c | |
parent | d72cb4401e9229da9306fd49dc0d541eb002de9a (diff) |
Fix: Check if cell is barred, before performing location updating
If not checked, the MM process will crash, due to an endless loop
of trying to do location updating to barred cell.
Diffstat (limited to 'src/host/layer23/src/mobile/gsm48_mm.c')
-rw-r--r-- | src/host/layer23/src/mobile/gsm48_mm.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/host/layer23/src/mobile/gsm48_mm.c b/src/host/layer23/src/mobile/gsm48_mm.c index 331cfe3b..8ac9ddc1 100644 --- a/src/host/layer23/src/mobile/gsm48_mm.c +++ b/src/host/layer23/src/mobile/gsm48_mm.c @@ -1081,6 +1081,7 @@ static int gsm48_mm_return_idle(struct osmocom_ms *ms, struct msgb *msg) struct gsm_subscriber *subscr = &ms->subscr; struct gsm48_mmlayer *mm = &ms->mmlayer; struct gsm322_cellsel *cs = &ms->cellsel; + struct gsm48_sysinfo *s = &cs->sel_si; if (cs->state != GSM322_C3_CAMPED_NORMALLY && cs->state != GSM322_C7_CAMPED_ANY_CELL) { @@ -1154,6 +1155,14 @@ static int gsm48_mm_return_idle(struct osmocom_ms *ms, struct msgb *msg) LOGP(DMM, LOGL_INFO, "Loc. upd. not allowed LA.\n"); new_mm_state(mm, GSM48_MM_ST_MM_IDLE, GSM48_MM_SST_LIMITED_SERVICE); + } else + /* 4.4.4.9 if cell is barred, don't start */ + if ((!subscr->acc_barr && s->cell_barr) + || (!subscr->acc_barr && !((subscr->acc_class & 0xfbff) & + (s->class_barr ^ 0xffff)))) { + LOGP(DMM, LOGL_INFO, "Loc. upd. no access.\n"); + new_mm_state(mm, GSM48_MM_ST_MM_IDLE, + GSM48_MM_SST_LIMITED_SERVICE); } else { /* location update allowed */ LOGP(DMM, LOGL_INFO, "Loc. upd. allowed.\n"); |