aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libmsc/gsm_04_08.c
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc/src/libmsc/gsm_04_08.c')
-rw-r--r--openbsc/src/libmsc/gsm_04_08.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c
index d6b2cb4f3..91bd4a3f9 100644
--- a/openbsc/src/libmsc/gsm_04_08.c
+++ b/openbsc/src/libmsc/gsm_04_08.c
@@ -515,9 +515,26 @@ static int mm_rx_id_resp(struct gsm_subscriber_connection *conn, struct msgb *ms
if (!conn->subscr) {
conn->subscr = subscr_get_by_imsi(net->subscr_group,
mi_string);
- if (!conn->subscr && net->create_subscriber)
+
+ if (!conn->subscr && net->create_subscriber
+ && net->create_only_local_subscriber) {
+ char mcc[4];
+ char mnc[3];
+ strncpy(mcc, mi_string, 3);
+ strncpy(mnc, mi_string + 3, 2);
+ if ((atoi(mcc) == net->country_code) &&
+ (atoi(mnc) == net->network_code)) {
+ conn->subscr = subscr_create_subscriber(
+ net->subscr_group, mi_string);
+ }
+ }
+
+ if (!conn->subscr && net->create_subscriber
+ && !net->create_only_local_subscriber) {
conn->subscr = subscr_create_subscriber(
net->subscr_group, mi_string);
+ }
+
}
if (!conn->subscr && conn->loc_operation) {
gsm0408_loc_upd_rej(conn, bts->network->reject_cause);
@@ -633,10 +650,26 @@ static int mm_rx_loc_upd_req(struct gsm_subscriber_connection *conn, struct msgb
/* look up subscriber based on IMSI, create if not found */
subscr = subscr_get_by_imsi(bts->network->subscr_group, mi_string);
- if (!subscr && bts->network->create_subscriber) {
+
+ if (!subscr && bts->network->create_subscriber
+ && bts->network->create_only_local_subscriber) {
+ char mcc[4];
+ char mnc[3];
+ strncpy(mcc, mi_string, 3);
+ strncpy(mnc, mi_string + 3, 2);
+ if ((atoi(mcc) == bts->network->country_code) &&
+ (atoi(mnc) == bts->network->network_code)) {
+ subscr = subscr_create_subscriber(
+ bts->network->subscr_group, mi_string);
+ }
+ }
+
+ if (!subscr && bts->network->create_subscriber
+ && !bts->network->create_only_local_subscriber) {
subscr = subscr_create_subscriber(
bts->network->subscr_group, mi_string);
}
+
if (!subscr) {
gsm0408_loc_upd_rej(conn, bts->network->reject_cause);
release_loc_updating_req(conn, 0);