aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2014-12-02 11:28:38 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-12-09 10:01:08 +0100
commita1e0373224e02784f85eb47306a689fce45fb9e3 (patch)
treede1601fd704b93e9b747afc1c6f854896e8345d2
parent207f4a5deba610b34d5e140f512e538e34a7115f (diff)
sgsn: Put SGSN related subscriber data into separate struct
There will be an increasing number of SGSN related fields per subscriber. Instead of extending gsm_subscriber accordingly, a single struct sgsn_subscriber_data object is assigned to it. The talloc context used to allocated that object is the subscr object itself. Therefore it will be freed automatically along with the subscr object. Sponsored-by: On-Waves ehf
-rw-r--r--openbsc/include/openbsc/gprs_sgsn.h1
-rw-r--r--openbsc/include/openbsc/gsm_subscriber.h3
-rw-r--r--openbsc/src/gprs/gprs_sgsn.c6
-rw-r--r--openbsc/src/gprs/gprs_subscriber.c28
4 files changed, 26 insertions, 12 deletions
diff --git a/openbsc/include/openbsc/gprs_sgsn.h b/openbsc/include/openbsc/gprs_sgsn.h
index b1358131a..464982e2b 100644
--- a/openbsc/include/openbsc/gprs_sgsn.h
+++ b/openbsc/include/openbsc/gprs_sgsn.h
@@ -271,6 +271,7 @@ struct imsi_acl_entry {
};
struct sgsn_subscriber_data {
+ struct sgsn_mm_ctx *mm;
enum sgsn_auth_state auth_state;
};
diff --git a/openbsc/include/openbsc/gsm_subscriber.h b/openbsc/include/openbsc/gsm_subscriber.h
index 195fa0fd0..290cc44dc 100644
--- a/openbsc/include/openbsc/gsm_subscriber.h
+++ b/openbsc/include/openbsc/gsm_subscriber.h
@@ -20,6 +20,7 @@
struct vty;
struct sgsn_mm_ctx;
+struct sgsn_subscriber_data;
struct gsm_subscriber_group {
struct gsm_network *net;
@@ -69,7 +70,7 @@ struct gsm_subscriber {
struct llist_head requests;
/* GPRS/SGSN related fields */
- struct sgsn_mm_ctx *mm;
+ struct sgsn_subscriber_data *sgsn_data;
};
enum gsm_subscriber_field {
diff --git a/openbsc/src/gprs/gprs_sgsn.c b/openbsc/src/gprs/gprs_sgsn.c
index 525bfab11..d5c02fd7c 100644
--- a/openbsc/src/gprs/gprs_sgsn.c
+++ b/openbsc/src/gprs/gprs_sgsn.c
@@ -191,7 +191,7 @@ void sgsn_mm_ctx_free(struct sgsn_mm_ctx *mm)
if (mm->subscr) {
struct gsm_subscriber *subscr = mm->subscr;
mm->subscr = NULL;
- subscr->mm = NULL;
+ subscr->sgsn_data->mm = NULL;
gprs_subscr_delete(subscr);
}
@@ -477,9 +477,9 @@ void sgsn_update_subscriber_data(struct sgsn_mm_ctx *mmctx,
LOGMMCTXP(LOGL_INFO, mmctx, "Subscriber data update");
- if (!subscr->mm && !mmctx->subscr) {
+ if (!subscr->sgsn_data->mm && !mmctx->subscr) {
mmctx->subscr = subscr_get(subscr);
- mmctx->subscr->mm = mmctx;
+ mmctx->subscr->sgsn_data->mm = mmctx;
}
sgsn_auth_update(mmctx);
diff --git a/openbsc/src/gprs/gprs_subscriber.c b/openbsc/src/gprs/gprs_subscriber.c
index 78fa3e1e8..cf0af9083 100644
--- a/openbsc/src/gprs/gprs_subscriber.c
+++ b/openbsc/src/gprs/gprs_subscriber.c
@@ -33,6 +33,15 @@ void gprs_subscr_init(struct sgsn_instance *sgi)
{
}
+static struct sgsn_subscriber_data *sgsn_subscriber_data_alloc(void *ctx)
+{
+ struct sgsn_subscriber_data *sdata;
+
+ sdata = talloc_zero(ctx, struct sgsn_subscriber_data);
+
+ return sdata;
+}
+
struct gsm_subscriber *gprs_subscr_get_or_create(const char *imsi)
{
struct gsm_subscriber *subscr;
@@ -41,6 +50,9 @@ struct gsm_subscriber *gprs_subscr_get_or_create(const char *imsi)
if (!subscr)
return NULL;
+ if (!subscr->sgsn_data)
+ subscr->sgsn_data = sgsn_subscriber_data_alloc(subscr);
+
subscr->keep_in_ram = 1;
return subscr;
@@ -53,10 +65,10 @@ struct gsm_subscriber *gprs_subscr_get_by_imsi(const char *imsi)
void gprs_subscr_delete(struct gsm_subscriber *subscr)
{
- if (subscr->mm) {
- subscr_put(subscr->mm->subscr);
- subscr->mm->subscr = NULL;
- subscr->mm = NULL;
+ if (subscr->sgsn_data->mm) {
+ subscr_put(subscr->sgsn_data->mm->subscr);
+ subscr->sgsn_data->mm->subscr = NULL;
+ subscr->sgsn_data->mm = NULL;
}
if ((subscr->flags & GPRS_SUBSCRIBER_CANCELLED) ||
@@ -80,19 +92,19 @@ int gprs_subscr_query(struct gsm_subscriber *subscr)
{
/* TODO: Implement remote query to MSC, ... */
- LOGMMCTXP(LOGL_INFO, subscr->mm,
+ LOGMMCTXP(LOGL_INFO, subscr->sgsn_data->mm,
"subscriber data is not available (remote query NYI)\n");
return -ENOTSUP;
}
void gprs_subscr_update(struct gsm_subscriber *subscr)
{
- LOGMMCTXP(LOGL_DEBUG, subscr->mm, "Updating subscriber data\n");
+ LOGMMCTXP(LOGL_DEBUG, subscr->sgsn_data->mm, "Updating subscriber data\n");
subscr->flags &= ~GPRS_SUBSCRIBER_UPDATE_PENDING;
subscr->flags &= ~GSM_SUBSCRIBER_FIRST_CONTACT;
- sgsn_update_subscriber_data(subscr->mm, subscr);
+ sgsn_update_subscriber_data(subscr->sgsn_data->mm, subscr);
}
int gprs_subscr_request_update(struct sgsn_mm_ctx *mmctx)
@@ -130,7 +142,7 @@ int gprs_subscr_request_update(struct sgsn_mm_ctx *mmctx)
if (need_update) {
subscr->flags |= GPRS_SUBSCRIBER_UPDATE_PENDING;
if (!mmctx->subscr) {
- subscr->mm = mmctx;
+ subscr->sgsn_data->mm = mmctx;
mmctx->subscr = subscr_get(subscr);
}