From 87c7ffccea5fb8a579ade220e6e4754f857e4ecc Mon Sep 17 00:00:00 2001 From: Jacob Erlbeck Date: Thu, 8 Jan 2015 15:29:01 +0100 Subject: gprs: Support the full cancellation procedure Currently no GSUP LocationCancellationResult message is sent back to the peer (HLR), if the procedure succeeded at the SGSN's side. This patch adds the missing message and put the whole request handling of this procedure into a separate function. Ticket: OW#1338 Sponsored-by: On-Waves ehf --- openbsc/src/gprs/gprs_subscriber.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'openbsc/src/gprs/gprs_subscriber.c') diff --git a/openbsc/src/gprs/gprs_subscriber.c b/openbsc/src/gprs/gprs_subscriber.c index 271cc7832..a30729d4d 100644 --- a/openbsc/src/gprs/gprs_subscriber.c +++ b/openbsc/src/gprs/gprs_subscriber.c @@ -490,6 +490,22 @@ static int gprs_subscr_handle_gsup_purge_err(struct gsm_subscriber *subscr, return -gsup_msg->cause; } +static int gprs_subscr_handle_loc_cancel_req(struct gsm_subscriber *subscr, + struct gprs_gsup_message *gsup_msg) +{ + struct gprs_gsup_message gsup_reply = {0}; + + LOGGSUBSCRP(LOGL_INFO, subscr, "purging MS subscriber\n"); + + gsup_reply.message_type = GPRS_GSUP_MSGT_LOCATION_CANCEL_RESULT; + gprs_subscr_tx_gsup_message(subscr, &gsup_reply); + + subscr->sgsn_data->error_cause = 0; + gprs_subscr_put_and_cancel(subscr_get(subscr)); + + return 0; +} + static int gprs_subscr_handle_unknown_imsi(struct gprs_gsup_message *gsup_msg) { if (GPRS_GSUP_IS_MSGT_REQUEST(gsup_msg->message_type)) { @@ -546,9 +562,7 @@ int gprs_subscr_rx_gsup_message(struct msgb *msg) switch (gsup_msg.message_type) { case GPRS_GSUP_MSGT_LOCATION_CANCEL_REQUEST: - subscr->sgsn_data->error_cause = 0; - gprs_subscr_put_and_cancel(subscr); - subscr = NULL; + rc = gprs_subscr_handle_loc_cancel_req(subscr, &gsup_msg); break; case GPRS_GSUP_MSGT_SEND_AUTH_INFO_RESULT: @@ -596,8 +610,7 @@ int gprs_subscr_rx_gsup_message(struct msgb *msg) break; }; - if (subscr) - subscr_put(subscr); + subscr_put(subscr); return rc; } -- cgit v1.2.3