aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc/src')
-rw-r--r--openbsc/src/gprs/gprs_sgsn.c6
-rw-r--r--openbsc/src/gprs/gprs_subscriber.c28
2 files changed, 23 insertions, 11 deletions
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);
}