diff options
Diffstat (limited to 'openbsc/src/gprs')
-rw-r--r-- | openbsc/src/gprs/gprs_subscriber.c | 15 | ||||
-rw-r--r-- | openbsc/src/gprs/sgsn_vty.c | 13 |
2 files changed, 24 insertions, 4 deletions
diff --git a/openbsc/src/gprs/gprs_subscriber.c b/openbsc/src/gprs/gprs_subscriber.c index 54a61611e..e4dda9c46 100644 --- a/openbsc/src/gprs/gprs_subscriber.c +++ b/openbsc/src/gprs/gprs_subscriber.c @@ -439,13 +439,24 @@ 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}; + int is_update_procedure = !gsup_msg->cancel_type || gsup_msg->cancel_type; - LOGGSUBSCRP(LOGL_INFO, subscr, "purging MS subscriber\n"); + LOGGSUBSCRP(LOGL_INFO, subscr, "Cancelling MS subscriber (%s)\n", + is_update_procedure ? + "update procedure" : "subscription withdraw"); gsup_reply.message_type = GPRS_GSUP_MSGT_LOCATION_CANCEL_RESULT; gprs_subscr_tx_gsup_message(subscr, &gsup_reply); - subscr->sgsn_data->error_cause = SGSN_ERROR_CAUSE_NONE; + if (is_update_procedure) + subscr->sgsn_data->error_cause = SGSN_ERROR_CAUSE_NONE; + else + /* Since a withdraw cause is not specified, just abort the + * current attachment. The following re-attachment should then + * be rejected with a proper cause value. + */ + subscr->sgsn_data->error_cause = GMM_CAUSE_IMPL_DETACHED; + gprs_subscr_cancel(subscr); return 0; diff --git a/openbsc/src/gprs/sgsn_vty.c b/openbsc/src/gprs/sgsn_vty.c index 1ecb2eae3..ba71555ec 100644 --- a/openbsc/src/gprs/sgsn_vty.c +++ b/openbsc/src/gprs/sgsn_vty.c @@ -545,11 +545,14 @@ failed: } DEFUN(update_subscr_cancel, update_subscr_cancel_cmd, - UPDATE_SUBSCR_STR "cancel", + UPDATE_SUBSCR_STR "cancel (update-procedure|subscription-withdraw)", UPDATE_SUBSCR_HELP - "Cancel (remove) subscriber record\n") + "Cancel (remove) subscriber record\n" + "The MS moved to another SGSN\n" + "The subscription is no longer valid\n") { const char *imsi = argv[0]; + const char *cancel_type = argv[1]; struct gsm_subscriber *subscr; @@ -560,6 +563,11 @@ DEFUN(update_subscr_cancel, update_subscr_cancel_cmd, return CMD_WARNING; } + if (strcmp(cancel_type, "update-procedure") == 0) + subscr->sgsn_data->error_cause = SGSN_ERROR_CAUSE_NONE; + else + subscr->sgsn_data->error_cause = GMM_CAUSE_IMPL_DETACHED; + gprs_subscr_cancel(subscr); subscr_put(subscr); @@ -606,6 +614,7 @@ DEFUN(update_subscr_destroy, update_subscr_destroy_cmd, } subscr->keep_in_ram = 0; + subscr->sgsn_data->error_cause = SGSN_ERROR_CAUSE_NONE; gprs_subscr_cancel(subscr); if (subscr->use_count > 1) vty_out(vty, "%% subscriber is still in use%s", |