diff options
-rw-r--r-- | openbsc/include/openbsc/gprs_sgsn.h | 1 | ||||
-rw-r--r-- | openbsc/include/openbsc/gsm_subscriber.h | 3 | ||||
-rw-r--r-- | openbsc/src/gprs/gprs_sgsn.c | 6 | ||||
-rw-r--r-- | openbsc/src/gprs/gprs_subscriber.c | 28 |
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); } |