db: Remove the struct gsm_network from the database layer
The database code should not know about the network. Move the
setting of the network pointer into the subscriber layer.
diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c
index 9a8cd88..d179c4e 100644
--- a/openbsc/src/libmsc/db.c
+++ b/openbsc/src/libmsc/db.c
@@ -315,13 +315,13 @@
return 0;
}
-struct gsm_subscriber *db_create_subscriber(struct gsm_network *net, char *imsi)
+struct gsm_subscriber *db_create_subscriber(const char *imsi)
{
dbi_result result;
struct gsm_subscriber *subscr;
/* Is this subscriber known in the db? */
- subscr = db_get_subscriber(net, GSM_SUBSCRIBER_IMSI, imsi);
+ subscr = db_get_subscriber(GSM_SUBSCRIBER_IMSI, imsi);
if (subscr) {
result = dbi_conn_queryf(conn,
"UPDATE Subscriber set updated = datetime('now') "
@@ -346,7 +346,6 @@
);
if (!result)
LOGP(DDB, LOGL_ERROR, "Failed to create Subscriber by IMSI.\n");
- subscr->net = net;
subscr->id = dbi_conn_sequence_last(conn, NULL);
strncpy(subscr->imsi, imsi, GSM_IMSI_LENGTH-1);
dbi_result_free(result);
@@ -645,8 +644,7 @@
}
#define BASE_QUERY "SELECT * FROM Subscriber "
-struct gsm_subscriber *db_get_subscriber(struct gsm_network *net,
- enum gsm_subscriber_field field,
+struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field,
const char *id)
{
dbi_result result;
@@ -704,7 +702,6 @@
}
subscr = subscr_alloc();
- subscr->net = net;
subscr->id = dbi_result_get_ulonglong(result, "id");
db_set_from_query(subscr, result);
diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c
index a299590..c41443e 100644
--- a/openbsc/src/libmsc/gsm_04_08.c
+++ b/openbsc/src/libmsc/gsm_04_08.c
@@ -474,7 +474,7 @@
if (!conn->subscr) {
conn->subscr = subscr_get_by_imsi(net, mi_string);
if (!conn->subscr)
- conn->subscr = db_create_subscriber(net, mi_string);
+ conn->subscr = subscr_create_subscriber(net, mi_string);
}
if (conn->loc_operation)
conn->loc_operation->waiting_for_imsi = 0;
@@ -586,7 +586,7 @@
/* look up subscriber based on IMSI, create if not found */
subscr = subscr_get_by_imsi(bts->network, mi_string);
if (!subscr) {
- subscr = db_create_subscriber(bts->network, mi_string);
+ subscr = subscr_create_subscriber(bts->network, mi_string);
}
break;
case GSM_MI_TYPE_TMSI:
diff --git a/openbsc/src/libmsc/gsm_subscriber.c b/openbsc/src/libmsc/gsm_subscriber.c
index 5ace8f6..bc6f3cf 100644
--- a/openbsc/src/libmsc/gsm_subscriber.c
+++ b/openbsc/src/libmsc/gsm_subscriber.c
@@ -78,6 +78,15 @@
REQ_STATE_DISPATCHED,
};
+static struct gsm_subscriber *get_subscriber(struct gsm_network *net,
+ int type, const char *ident)
+{
+ struct gsm_subscriber *subscr = db_get_subscriber(type, ident);
+ if (subscr)
+ subscr->net = net;
+ return subscr;
+}
+
/*
* We got the channel assigned and can now hand this channel
* over to one of our callbacks.
@@ -266,6 +275,14 @@
subscr_send_paging_request(subscr);
}
+struct gsm_subscriber *subscr_create_subscriber(struct gsm_network *net,
+ const char *imsi)
+{
+ struct gsm_subscriber *subscr = db_create_subscriber(imsi);
+ if (subscr)
+ subscr->net = net;
+ return subscr;
+}
struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
uint32_t tmsi)
@@ -280,7 +297,7 @@
}
sprintf(tmsi_string, "%u", tmsi);
- return db_get_subscriber(net, GSM_SUBSCRIBER_TMSI, tmsi_string);
+ return get_subscriber(net, GSM_SUBSCRIBER_TMSI, tmsi_string);
}
struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
@@ -293,7 +310,7 @@
return subscr_get(subscr);
}
- return db_get_subscriber(net, GSM_SUBSCRIBER_IMSI, imsi);
+ return get_subscriber(net, GSM_SUBSCRIBER_IMSI, imsi);
}
struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
@@ -306,7 +323,7 @@
return subscr_get(subscr);
}
- return db_get_subscriber(net, GSM_SUBSCRIBER_EXTENSION, ext);
+ return get_subscriber(net, GSM_SUBSCRIBER_EXTENSION, ext);
}
struct gsm_subscriber *subscr_get_by_id(struct gsm_network *net,
@@ -321,7 +338,7 @@
return subscr_get(subscr);
}
- return db_get_subscriber(net, GSM_SUBSCRIBER_ID, buf);
+ return get_subscriber(net, GSM_SUBSCRIBER_ID, buf);
}
int subscr_update_expire_lu(struct gsm_subscriber *s, struct gsm_bts *bts)
diff --git a/openbsc/src/libmsc/vty_interface_layer3.c b/openbsc/src/libmsc/vty_interface_layer3.c
index acb4af7..e0324d6 100644
--- a/openbsc/src/libmsc/vty_interface_layer3.c
+++ b/openbsc/src/libmsc/vty_interface_layer3.c
@@ -229,7 +229,7 @@
struct gsm_network *gsmnet = gsmnet_from_vty(vty);
struct gsm_subscriber *subscr;
- subscr = db_create_subscriber(gsmnet, argv[0]);
+ subscr = subscr_create_subscriber(gsmnet, argv[0]);
if (!subscr) {
vty_out(vty, "%% No subscriber created for IMSI %s%s",
argv[0], VTY_NEWLINE);