summaryrefslogtreecommitdiffstats
path: root/src/host/layer23
diff options
context:
space:
mode:
authorAndreas.Eversberg2010-07-14 16:13:56 +0200
committerAndreas.Eversberg2010-07-14 16:13:56 +0200
commitd6acbbc093e47d074f84103b088035643c285c76 (patch)
tree90764bc9eae8446d1d931488cc94739fe5d4d79e /src/host/layer23
parent[layer23] Fix: T3240 (wait network command) is stopped after RR release. (diff)
downloadosmocom-d6acbbc093e47d074f84103b088035643c285c76.tar.gz
osmocom-d6acbbc093e47d074f84103b088035643c285c76.tar.xz
osmocom-d6acbbc093e47d074f84103b088035643c285c76.zip
[layer23] Fix: IMSI detach in "IMSI detach initiated" state.
Diffstat (limited to 'src/host/layer23')
-rw-r--r--src/host/layer23/src/gsm48_mm.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/host/layer23/src/gsm48_mm.c b/src/host/layer23/src/gsm48_mm.c
index c30d22f..59262bc 100644
--- a/src/host/layer23/src/gsm48_mm.c
+++ b/src/host/layer23/src/gsm48_mm.c
@@ -1756,6 +1756,10 @@ static int gsm48_mm_imsi_detach_end(struct osmocom_ms *ms, struct msgb *msg)
/* wait for RR idle and then power off when IMSI is detached */
if (mm->power_off) {
+ if (mm->state == GSM48_MM_ST_MM_IDLE) {
+ l23_app_exit(ms);
+ exit(0);
+ }
mm->power_off_idle = 1;
return 0;
@@ -3568,10 +3572,17 @@ static struct rrdatastate {
{SBIT(GSM48_MM_ST_WAIT_RR_CONN_IMSI_D), /* 4.3.4.4 (unsuc.) */
GSM48_RR_REL_IND, gsm48_mm_imsi_detach_end},
+ /* also this may happen if SABM is ackwnowledged with DISC */
{SBIT(GSM48_MM_ST_WAIT_RR_CONN_IMSI_D), /* 4.3.4.4 (lost) */
GSM48_RR_ABORT_IND, gsm48_mm_imsi_detach_end},
+ {SBIT(GSM48_MM_ST_IMSI_DETACH_INIT), /* 4.3.4.4 (unsuc.) */
+ GSM48_RR_REL_IND, gsm48_mm_imsi_detach_end},
+
+ {SBIT(GSM48_MM_ST_IMSI_DETACH_INIT), /* 4.3.4.4 (lost) */
+ GSM48_RR_ABORT_IND, gsm48_mm_imsi_detach_end},
+
/* location update */
{SBIT(GSM48_MM_ST_WAIT_RR_CONN_LUPD), /* 4.4.4.1 */
GSM48_RR_EST_CNF, gsm48_mm_est_loc_upd},
@@ -3722,6 +3733,11 @@ static int gsm48_mm_data_ind(struct osmocom_ms *ms, struct msgb *msg)
if (msg_type == GSM48_MT_MM_NULL)
return 0;
+ if (mm->state == GSM48_MM_ST_IMSI_DETACH_INIT) {
+ LOGP(DMM, LOGL_NOTICE, "DATA IND ignored during IMSI "
+ "detach.\n");
+ return 0;
+ }
/* pull the RR header */
msgb_pull(msg, sizeof(struct gsm48_rr_hdr));