From: Holger Hans Peter Freyther <[email protected]>

The database code should not know about the network. Move the
setting of the network pointer into the subscriber layer.
---
 openbsc/include/openbsc/db.h              |  6 ++----
 openbsc/include/openbsc/gsm_subscriber.h  |  2 ++
 openbsc/src/libmsc/db.c                   |  9 +++------
 openbsc/src/libmsc/gsm_04_08.c            |  4 ++--
 openbsc/src/libmsc/gsm_subscriber.c       | 25 +++++++++++++++++++++----
 openbsc/src/libmsc/vty_interface_layer3.c |  2 +-
 openbsc/tests/db/db_test.c                | 12 ++++++------
 7 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/openbsc/include/openbsc/db.h b/openbsc/include/openbsc/db.h
index 25c2aea..a89c22d 100644
--- a/openbsc/include/openbsc/db.h
+++ b/openbsc/include/openbsc/db.h
@@ -35,10 +35,8 @@ int db_prepare(void);
 int db_fini(void);
 
 /* subscriber management */
-struct gsm_subscriber *db_create_subscriber(struct gsm_network *net,
-                                           char *imsi);
-struct gsm_subscriber *db_get_subscriber(struct gsm_network *net,
-                                        enum gsm_subscriber_field field,
+struct gsm_subscriber *db_create_subscriber(const char *imsi);
+struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field,
                                         const char *subscr);
 int db_sync_subscriber(struct gsm_subscriber *subscriber);
 int db_subscriber_expire(void *priv, void (*callback)(void *priv, long long 
unsigned int id));
diff --git a/openbsc/include/openbsc/gsm_subscriber.h 
b/openbsc/include/openbsc/gsm_subscriber.h
index 6b577b0..7aae4c3 100644
--- a/openbsc/include/openbsc/gsm_subscriber.h
+++ b/openbsc/include/openbsc/gsm_subscriber.h
@@ -73,6 +73,8 @@ enum gsm_subscriber_update_reason {
 
 struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr);
 struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr);
+struct gsm_subscriber *subscr_create_subscriber(struct gsm_network *net,
+                                               const char *imsi);
 struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
                                          uint32_t tmsi);
 struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
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 @@ int db_fini(void)
        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 @@ struct gsm_subscriber *db_create_subscriber(struct 
gsm_network *net, char *imsi)
        );
        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 @@ static void db_set_from_query(struct gsm_subscriber 
*subscr, dbi_conn result)
 }
 
 #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 @@ struct gsm_subscriber *db_get_subscriber(struct gsm_network 
*net,
        }
 
        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 @@ static int mm_rx_id_resp(struct gsm_subscriber_connection 
*conn, struct msgb *ms
                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 @@ 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, 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 @@ enum {
        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 @@ void subscr_put_channel(struct gsm_subscriber *subscr)
                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 @@ struct gsm_subscriber *subscr_get_by_tmsi(struct 
gsm_network *net,
        }
 
        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 @@ struct gsm_subscriber *subscr_get_by_imsi(struct 
gsm_network *net,
                        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 @@ struct gsm_subscriber *subscr_get_by_extension(struct 
gsm_network *net,
                        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 @@ struct gsm_subscriber *subscr_get_by_id(struct gsm_network 
*net,
                        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 @@ DEFUN(subscriber_create,
        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);
diff --git a/openbsc/tests/db/db_test.c b/openbsc/tests/db/db_test.c
index c3beee2..3c5de90 100644
--- a/openbsc/tests/db/db_test.c
+++ b/openbsc/tests/db/db_test.c
@@ -78,32 +78,32 @@ int main()
        struct gsm_subscriber *alice_db;
 
        char *alice_imsi = "3243245432345";
-       alice = db_create_subscriber(NULL, alice_imsi);
+       alice = db_create_subscriber(alice_imsi);
        db_sync_subscriber(alice);
-       alice_db = db_get_subscriber(NULL, GSM_SUBSCRIBER_IMSI, alice->imsi);
+       alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice->imsi);
        COMPARE(alice, alice_db);
        SUBSCR_PUT(alice_db);
        SUBSCR_PUT(alice);
 
        alice_imsi = "3693245423445";
-       alice = db_create_subscriber(NULL, alice_imsi);
+       alice = db_create_subscriber(alice_imsi);
        db_subscriber_assoc_imei(alice, "1234567890");
        db_subscriber_alloc_tmsi(alice);
        alice->lac=42;
        db_sync_subscriber(alice);
-       alice_db = db_get_subscriber(NULL, GSM_SUBSCRIBER_IMSI, alice_imsi);
+       alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice_imsi);
        COMPARE(alice, alice_db);
        SUBSCR_PUT(alice);
        SUBSCR_PUT(alice_db);
 
        alice_imsi = "9993245423445";
-       alice = db_create_subscriber(NULL, alice_imsi);
+       alice = db_create_subscriber(alice_imsi);
        db_subscriber_alloc_tmsi(alice);
        alice->lac=42;
        db_sync_subscriber(alice);
        db_subscriber_assoc_imei(alice, "1234567890");
        db_subscriber_assoc_imei(alice, "6543560920");
-       alice_db = db_get_subscriber(NULL, GSM_SUBSCRIBER_IMSI, alice_imsi);
+       alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice_imsi);
        COMPARE(alice, alice_db);
        SUBSCR_PUT(alice);
        SUBSCR_PUT(alice_db);
-- 
1.8.4.rc3


Reply via email to