lynxis lazus has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-msc/+/38493?usp=email )
Change subject: vlr: vlr_subscr_handle_cancel_req(): rework function ......................................................................
vlr: vlr_subscr_handle_cancel_req(): rework function
Invalid the subscriber towards the MSC/SGSN when receiving a Cancel Request from the HLR. FIXME: canceling a fsm is still problematic if the VLR is in the middle of a LU, because it still want to send back a failure when asked via HLR.
So when the HLR is doing a Cancel Location with reason Update Location (instead of withdrawn), the VLR shouldn't allowed to transmit a Location Update Reject message..
Change-Id: Idf24d49cc6af53043da7ffaf7dda2993f2e812a5 --- M src/libvlr/vlr.c 1 file changed, 12 insertions(+), 8 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/93/38493/1
diff --git a/src/libvlr/vlr.c b/src/libvlr/vlr.c index b8650c7..4b6c05b 100644 --- a/src/libvlr/vlr.c +++ b/src/libvlr/vlr.c @@ -1288,27 +1288,31 @@ static int vlr_subscr_handle_cancel_req(struct vlr_subscr *vsub, const struct osmo_gsup_message *gsup_msg) { + enum gsm48_reject_value gsm48_rej; enum osmo_fsm_term_cause fsm_cause = OSMO_FSM_TERM_ERROR; + struct vlr_instance *vlr = vsub->vlr; struct osmo_gsup_message gsup_reply = {0}; - int rc, is_update_procedure = !gsup_msg->cancel_type || + int is_update_procedure = !gsup_msg->cancel_type || gsup_msg->cancel_type == OSMO_GSUP_CANCEL_TYPE_UPDATE;
- vlr_rate_ctr_inc(vsub->vlr, VLR_CTR_GSUP_TX_CANCEL_RES); + vlr_rate_ctr_inc(vlr, VLR_CTR_GSUP_TX_CANCEL_RES);
LOGVSUBP(LOGL_INFO, vsub, "Cancelling MS subscriber (%s)\n", is_update_procedure ? "update procedure" : "subscription withdraw");
- gsup_reply.message_type = OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT; - gsup_reply.cn_domain = vlr_is_cs(vsub->vlr) ? OSMO_GSUP_CN_DOMAIN_CS : OSMO_GSUP_CN_DOMAIN_PS; - rc = vlr_subscr_tx_gsup_message(vsub, &gsup_reply); + gsm48_rej = vlr_gmm_cause_to_reject_cause_domain(gsup_msg->cause, vlr_is_cs(vlr)); + vlr_subscr_cancel_attach_fsm(vsub, fsm_cause, gsm48_rej);
- vlr_subscr_cancel_attach_fsm(vsub, fsm_cause, vlr_gmm_cause_to_reject_cause_domain(gsup_msg->cause, true)); + if (vlr->ops.subscr_inval) + vlr->ops.subscr_inval(vsub->msc_conn_ref, vsub, gsm48_rej, is_update_procedure);
- vlr_rate_ctr_inc(vsub->vlr, VLR_CTR_DETACH_BY_CANCEL); + vlr_rate_ctr_inc(vlr, VLR_CTR_DETACH_BY_CANCEL); vlr_subscr_detach(vsub);
- return rc; + gsup_reply.message_type = OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT; + gsup_reply.cn_domain = vlr_is_cs(vlr) ? OSMO_GSUP_CN_DOMAIN_CS : OSMO_GSUP_CN_DOMAIN_PS; + return vlr_subscr_tx_gsup_message(vsub, &gsup_reply); }
/* Handle Check_IMEI_VLR result and error from HLR */