@@ -19,6 +19,11 @@
#define OBSC_LINKID_CB(__msgb) (__msgb)->cb[3]
+enum gsm_subscr_creation_mode {
+ GSM_SUBSCR_DONT_CREATE = 0,
+ GSM_SUBSCR_CREAT_W_RAND_EXT = 1,
+};
+
enum gsm_security_event {
GSM_SECURITY_NOAVAIL,
GSM_SECURITY_AUTH_FAILED,
@@ -278,7 +283,7 @@
struct osmo_bsc_data *bsc_data;
/* subscriber related features */
- int create_subscriber;
+ int subscr_creation_mode;
struct gsm_subscriber_group *subscr_group;
struct gsm_sms_queue *sms_queue;
@@ -48,7 +48,7 @@
INIT_LLIST_HEAD(&net->bsc_data->mscs);
net->subscr_group->net = net;
- net->create_subscriber = 1;
+ net->subscr_creation_mode = GSM_SUBSCR_CREAT_W_RAND_EXT;
net->country_code = country_code;
net->network_code = network_code;
@@ -507,6 +507,14 @@
return gsm48_conn_sendmsg(msg, conn, NULL);
}
+static struct gsm_subscriber *subscr_create(const struct gsm_network *net,
+ const char *imsi)
+{
+ if (net->subscr_creation_mode != GSM_SUBSCR_DONT_CREATE)
+ return subscr_create_subscriber(net->subscr_group, imsi);
+
+ return NULL;
+}
/* Parse Chapter 9.2.11 Identity Response */
static int mm_rx_id_resp(struct gsm_subscriber_connection *conn, struct msgb *msg)
@@ -530,9 +538,8 @@
if (!conn->subscr) {
conn->subscr = subscr_get_by_imsi(net->subscr_group,
mi_string);
- if (!conn->subscr && net->create_subscriber)
- conn->subscr = subscr_create_subscriber(
- net->subscr_group, mi_string);
+ if (!conn->subscr)
+ conn->subscr = subscr_create(net, mi_string);
}
if (!conn->subscr && conn->loc_operation) {
gsm0408_loc_upd_rej(conn, bts->network->reject_cause);
@@ -641,10 +648,9 @@
/* 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) {
- subscr = subscr_create_subscriber(
- bts->network->subscr_group, mi_string);
- }
+ if (!subscr)
+ subscr = subscr_create(bts->network, mi_string);
+
if (!subscr) {
gsm0408_loc_upd_rej(conn, bts->network->reject_cause);
release_loc_updating_req(conn, 0);
@@ -1036,7 +1036,7 @@
"Make a new record when a subscriber is first seen.\n")
{
struct gsm_network *gsmnet = gsmnet_from_vty(vty);
- gsmnet->create_subscriber = 1;
+ gsmnet->subscr_creation_mode = GSM_SUBSCR_CREAT_W_RAND_EXT;
return CMD_SUCCESS;
}
@@ -1045,7 +1045,7 @@
NO_STR "Make a new record when a subscriber is first seen.\n")
{
struct gsm_network *gsmnet = gsmnet_from_vty(vty);
- gsmnet->create_subscriber = 0;
+ gsmnet->subscr_creation_mode = GSM_SUBSCR_DONT_CREATE;
return CMD_SUCCESS;
}
@@ -1072,7 +1072,7 @@
struct gsm_network *gsmnet = gsmnet_from_vty(vty);
vty_out(vty, "nitb%s", VTY_NEWLINE);
vty_out(vty, " %ssubscriber-create-on-demand%s",
- gsmnet->create_subscriber ? "" : "no ", VTY_NEWLINE);
+ gsmnet->subscr_creation_mode ? "" : "no ", VTY_NEWLINE);
vty_out(vty, " %sassign-tmsi%s",
gsmnet->avoid_tmsi ? "no " : "", VTY_NEWLINE);
return CMD_SUCCESS;