From 0803d88d9aa6ff36896fbde218018db3bea61dc7 Mon Sep 17 00:00:00 2001 From: Philipp Maier Date: Tue, 2 Apr 2019 16:07:13 +0200 Subject: [PATCH] vlr_sgs: fix SGs IMSI detech from non EPS services When the subscriber is detached from non EPS services while the SGs-association is not SGs-NULL, it needs to be removed from the VLR database. Change-Id: I575cf6036ad39468f590b2d57a06cd3512a4c31c Related: OS#3614 --- src/libvlr/vlr_sgs.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/libvlr/vlr_sgs.c b/src/libvlr/vlr_sgs.c index 861489227..538c9f28f 100644 --- a/src/libvlr/vlr_sgs.c +++ b/src/libvlr/vlr_sgs.c @@ -131,10 +131,17 @@ void vlr_sgs_imsi_detach(struct vlr_instance *vlr, const char *imsi, enum sgsap_ { struct vlr_subscr *vsub; enum sgs_ue_fsm_event evt; + vsub = vlr_subscr_find_by_imsi(vlr, imsi); if (!vsub) return; + /* See also: 3GPP TS 29.118, 5.6.3 Procedures in the VLR: In case of + * an implicit detach, we are supposed to check if the state of the + * SGs-association, and only when it is not SGs-NULL, we may proceed. */ + if (vsub->sgs_fsm->state == SGS_UE_ST_NULL && type == SGSAP_ID_NONEPS_T_IMPLICIT_UE_EPS_NONEPS) + return; + switch (type) { case SGSAP_ID_NONEPS_T_EXPLICIT_UE_NONEPS: evt = SGS_UE_E_RX_DETACH_IND_FROM_UE; @@ -153,6 +160,11 @@ void vlr_sgs_imsi_detach(struct vlr_instance *vlr, const char *imsi, enum sgsap_ osmo_fsm_inst_dispatch(vsub->sgs_fsm, evt, NULL); vlr_subscr_put(vsub); + + /* Detaching from non EPS services essentially means that the + * subscriber is detached from 2G. In any case the VLR will + * get rid of the subscriber. */ + vlr_subscr_expire(vsub); } /*! Perform an SGs EPS detach.