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
This commit is contained in:
parent
207f4a5deb
commit
a1e0373224
|
@ -271,6 +271,7 @@ struct imsi_acl_entry {
|
|||
};
|
||||
|
||||
struct sgsn_subscriber_data {
|
||||
struct sgsn_mm_ctx *mm;
|
||||
enum sgsn_auth_state auth_state;
|
||||
};
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue