aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/include
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2015-01-08 16:23:25 +0100
committerJacob Erlbeck <jerlbeck@sysmocom.de>2015-01-19 08:30:01 +0100
commita688976f10bfb0c14954a066aa133f28bce3a541 (patch)
tree4cc0642f3b953433a5064d4992dbdad51a67c4ac /openbsc/include
parent743dec4c0c80383556efac60f03d307287ecf024 (diff)
gprs: Block other GSUP procedures during PURGE_MS
GSM 09.02, 19.4.1.4 mandates that no other MAP procedures shall be started until the PURGE_MS procedure has been completed. This patch implements this by adding corresponding state and checks to gprs_subscr_purge, gprs_subscr_location_update, and gprs_subscr_update_auth_info. If an Update Location or a Send Auth Info Req procedure is not started because of blocking, the retry mechanism is aborted to shorten the blocking time. The outstanding Purge MS procedure itself is not aborted. Sponsored-by: On-Waves ehf
Diffstat (limited to 'openbsc/include')
-rw-r--r--openbsc/include/openbsc/gprs_sgsn.h12
1 files changed, 12 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/gprs_sgsn.h b/openbsc/include/openbsc/gprs_sgsn.h
index 2b94096f6..d6a9bdada 100644
--- a/openbsc/include/openbsc/gprs_sgsn.h
+++ b/openbsc/include/openbsc/gprs_sgsn.h
@@ -271,6 +271,13 @@ struct imsi_acl_entry {
char imsi[16+1];
};
+enum sgsn_subscriber_proc {
+ SGSN_SUBSCR_PROC_NONE = 0,
+ SGSN_SUBSCR_PROC_PURGE,
+ SGSN_SUBSCR_PROC_UPD_LOC,
+ SGSN_SUBSCR_PROC_UPD_AUTH,
+};
+
struct sgsn_subscriber_data {
struct sgsn_mm_ctx *mm;
struct gsm_auth_tuple auth_triplets[5];
@@ -278,6 +285,7 @@ struct sgsn_subscriber_data {
int error_cause;
struct osmo_timer_list timer;
int retries;
+ enum sgsn_subscriber_proc blocked_by;
};
#define LOGGSUBSCRP(level, subscr, fmt, args...) \
@@ -324,6 +332,10 @@ void gprs_subscr_update(struct gsm_subscriber *subscr);
void gprs_subscr_update_auth_info(struct gsm_subscriber *subscr);
int gprs_subscr_rx_gsup_message(struct msgb *msg);
+int gprs_subscr_purge(struct gsm_subscriber *subscr);
+int gprs_subscr_query_auth_info(struct gsm_subscriber *subscr);
+int gprs_subscr_location_update(struct gsm_subscriber *subscr);
+
/* Called on subscriber data updates */
void sgsn_update_subscriber_data(struct sgsn_mm_ctx *mmctx,
struct gsm_subscriber *subscr);