This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.
Alexander Chemeris alexander.chemeris at gmail.comI looked at the patch and it looks sane to me.
On Tue, Oct 8, 2013 at 1:44 PM, Holger Hans Peter Freyther
<holger at freyther.de> wrote:
> From: Holger Hans Peter Freyther <holger at moiji-mobile.com>
>
> 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
>
>
--
Regards,
Alexander Chemeris.
CEO, Fairwaves LLC / ООО УмРадио
http://fairwaves.ru