aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorIvan Kluchnikov <kluchnikovi@gmail.com>2016-12-15 13:02:10 +0300
committerIvan Kluchnikov <kluchnikovi@gmail.com>2017-02-07 18:59:56 +0300
commit362a757f5604213abde8e6ce75875dde8428e632 (patch)
tree236c8ee6fc87edb000aae204f56b9ebb9f55038f /openbsc
parent444a9b93045dd29a3521005cfa862170930e04c9 (diff)
osmo-nitb: Send purge ms to reg-proxy and handle response
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/include/openbsc/gsm_sup.h1
-rw-r--r--openbsc/src/libmsc/gsm_04_08.c7
-rw-r--r--openbsc/src/libmsc/gsm_subscriber.c2
-rw-r--r--openbsc/src/libmsc/gsm_sup.c17
-rw-r--r--openbsc/tests/channel/channel_test.c1
5 files changed, 28 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/gsm_sup.h b/openbsc/include/openbsc/gsm_sup.h
index 07357af49..52b132f70 100644
--- a/openbsc/include/openbsc/gsm_sup.h
+++ b/openbsc/include/openbsc/gsm_sup.h
@@ -16,6 +16,7 @@ int sup_read_cb(struct gprs_gsup_client *sup_client, struct msgb *msg);
int subscr_query_auth_info(struct gsm_subscriber *subscr);
int subscr_location_update(struct gsm_subscriber *subscr);
+int subscr_purge_ms(struct gsm_subscriber *subscr);
int subscr_tx_sms_message(struct gsm_subscriber *subscr,
struct gsm411_rp_hdr *rph);
diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c
index 79a094c29..a6baf4eea 100644
--- a/openbsc/src/libmsc/gsm_04_08.c
+++ b/openbsc/src/libmsc/gsm_04_08.c
@@ -1081,6 +1081,12 @@ static int gsm48_rx_mm_serv_req(struct gsm_subscriber_connection *conn, struct m
_gsm48_rx_mm_serv_req_sec_cb, NULL);
}
+void gsm0408_purge_ms(struct gsm_subscriber *subscr) {
+ if (subscr->group->net->auth_policy == GSM_AUTH_POLICY_REMOTE) {
+ subscr_purge_ms(subscr);
+ }
+}
+
static int gsm48_rx_mm_imsi_detach_ind(struct gsm_subscriber_connection *conn, struct msgb *msg)
{
struct gsm_network *network = conn->network;
@@ -1119,6 +1125,7 @@ static int gsm48_rx_mm_imsi_detach_ind(struct gsm_subscriber_connection *conn, s
}
if (subscr) {
+ gsm0408_purge_ms(subscr);
subscr_update(subscr, conn->bts,
GSM_SUBSCRIBER_UPDATE_DETACHED);
DEBUGP(DMM, "Subscriber: %s\n", subscr_name(subscr));
diff --git a/openbsc/src/libmsc/gsm_subscriber.c b/openbsc/src/libmsc/gsm_subscriber.c
index 4ec0eadf9..4a429b192 100644
--- a/openbsc/src/libmsc/gsm_subscriber.c
+++ b/openbsc/src/libmsc/gsm_subscriber.c
@@ -47,6 +47,7 @@ extern struct llist_head *subscr_bsc_active_subscribers(void);
int gsm48_secure_channel(struct gsm_subscriber_connection *conn, int key_seq,
gsm_cbfn *cb, void *cb_data);
+void gsm0408_purge_ms(struct gsm_subscriber *subscr);
/*
* Struct for pending channel requests. This is managed in the
@@ -364,6 +365,7 @@ static void subscr_expire_callback(void *data, long long unsigned int id)
LOGP(DMM, LOGL_NOTICE, "Expiring inactive subscriber %s (ID %llu)\n",
subscr_name(s), id);
+ gsm0408_purge_ms(s);
s->lac = GSM_LAC_RESERVED_DETACHED;
db_sync_subscriber(s);
diff --git a/openbsc/src/libmsc/gsm_sup.c b/openbsc/src/libmsc/gsm_sup.c
index b72b700b9..5eddd2e5a 100644
--- a/openbsc/src/libmsc/gsm_sup.c
+++ b/openbsc/src/libmsc/gsm_sup.c
@@ -290,6 +290,13 @@ int subscr_location_update(struct gsm_subscriber *subscr)
return subscr_tx_sup_message(subscr->group->net->hlr_sup_client, subscr, &gsup_msg);
}
+int subscr_purge_ms(struct gsm_subscriber *subscr)
+{
+ struct gprs_gsup_message gsup_msg = {0};
+ gsup_msg.message_type = GPRS_GSUP_MSGT_PURGE_MS_REQUEST;
+ return subscr_tx_sup_message(subscr->group->net->hlr_sup_client, subscr, &gsup_msg);
+}
+
static int subscr_tx_sup_error_reply(struct gprs_gsup_client *sup_client,
struct gsm_subscriber *subscr,
struct gprs_gsup_message *gsup_orig,
@@ -364,6 +371,13 @@ static int subscr_handle_sup_upd_loc_res(struct gsm_subscriber *subscr,
return 0;
}
+static int subscr_handle_sup_purge_ms_res(struct gsm_subscriber *subscr,
+ struct gprs_gsup_message *gsup_msg)
+{
+ LOGP(DSUP, LOGL_INFO, "SUP PURGE MS result OK for IMSI:%s\n", subscr->imsi);
+ return 0;
+}
+
static int check_cause(int cause)
{
switch (cause) {
@@ -565,6 +579,9 @@ static int subscr_rx_sup_message(struct gprs_gsup_client *sup_client, struct msg
case GPRS_GSUP_MSGT_LOCATION_CANCEL_REQUEST:
case GPRS_GSUP_MSGT_PURGE_MS_ERROR:
case GPRS_GSUP_MSGT_PURGE_MS_RESULT:
+ rc = subscr_handle_sup_purge_ms_res(subscr, &gsup_msg);
+ break;
+
case GPRS_GSUP_MSGT_INSERT_DATA_REQUEST:
case GPRS_GSUP_MSGT_DELETE_DATA_REQUEST:
LOGGSUBSCRP(LOGL_ERROR, subscr,
diff --git a/openbsc/tests/channel/channel_test.c b/openbsc/tests/channel/channel_test.c
index c69c70139..eb045adc9 100644
--- a/openbsc/tests/channel/channel_test.c
+++ b/openbsc/tests/channel/channel_test.c
@@ -136,6 +136,7 @@ void sms_alloc() {}
void sms_free() {}
void gsm_net_update_ctype(struct gsm_network *network) {}
void gsm48_secure_channel() {}
+void gsm0408_purge_ms() {}
void paging_request_stop() {}
void vty_out() {}