diff options
author | Holger Freyther <zecke@selfish.org> | 2009-04-12 05:37:29 +0000 |
---|---|---|
committer | Holger Freyther <zecke@selfish.org> | 2009-04-12 05:37:29 +0000 |
commit | 4a49e77ff43ae0ec152a351603fbe91ec30efe8c (patch) | |
tree | d5801956ecddfae198152083613b571e351dd537 | |
parent | bab9cd9a2715e416664d08a56bdacefd6e921e4f (diff) |
[subscriber] Update the current_bts field on imsi detach and LOC accept
When sending LOCATION UPDATING REQUEST Accept or when getting
a IMSI Detach update the gsm_bts of the gsm_subscriber.
-rw-r--r-- | include/openbsc/gsm_subscriber.h | 8 | ||||
-rw-r--r-- | src/gsm_04_08.c | 8 | ||||
-rw-r--r-- | src/gsm_subscriber.c | 17 |
3 files changed, 28 insertions, 5 deletions
diff --git a/include/openbsc/gsm_subscriber.h b/include/openbsc/gsm_subscriber.h index e0c621bfa..170e5236f 100644 --- a/include/openbsc/gsm_subscriber.h +++ b/include/openbsc/gsm_subscriber.h @@ -23,6 +23,7 @@ struct gsm_subscriber { /* for internal management */ int use_count; struct llist_head entry; + struct gsm_bts *current_bts; }; enum gsm_subscriber_field { @@ -31,12 +32,17 @@ enum gsm_subscriber_field { GSM_SUBSCRIBER_EXTENSION, }; +enum gsm_subscriber_update_reason { + GSM_SUBSCRIBER_UPDATE_ATTACHED, + GSM_SUBSCRIBER_UPDATE_DETACHED, +}; + struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr); struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr); struct gsm_subscriber *subscr_get_by_tmsi(const char *tmsi); struct gsm_subscriber *subscr_get_by_imsi(const char *imsi); struct gsm_subscriber *subscr_get_by_extension(const char *ext); -int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts); +int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason); /* internal */ struct gsm_subscriber *subscr_alloc(void); diff --git a/src/gsm_04_08.c b/src/gsm_04_08.c index 4b2ecdc65..a9183deff 100644 --- a/src/gsm_04_08.c +++ b/src/gsm_04_08.c @@ -584,7 +584,7 @@ static int mm_rx_loc_upd_req(struct msgb *msg) return 0; db_subscriber_alloc_tmsi(subscr); - subscr_update(subscr, bts); + subscr_update(subscr, bts, GSM_SUBSCRIBER_UPDATE_ATTACHED); tmsi = strtoul(subscr->tmsi, NULL, 10); @@ -806,10 +806,12 @@ static int gsm48_rx_mm_imsi_detach_ind(struct msgb *msg) break; } - if (subscr) + if (subscr) { + subscr_update(subscr, msg->trx->bts, + GSM_SUBSCRIBER_UPDATE_DETACHED); DEBUGP(DMM, "Subscriber: %s\n", subscr->name ? subscr->name : subscr->imsi); - else + } else DEBUGP(DMM, "Unknown Subscriber ?!?\n"); put_lchan(msg->lchan); diff --git a/src/gsm_subscriber.c b/src/gsm_subscriber.c index d4dfea49a..e3cd5eb25 100644 --- a/src/gsm_subscriber.c +++ b/src/gsm_subscriber.c @@ -90,8 +90,23 @@ struct gsm_subscriber *subscr_get_by_extension(const char *ext) return db_get_subscriber(GSM_SUBSCRIBER_EXTENSION, ext); } -int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts) +int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason) { + /* FIXME: Migrate pending requests from one BSC to another */ + switch (reason) { + case GSM_SUBSCRIBER_UPDATE_ATTACHED: + s->current_bts = bts; + break; + case GSM_SUBSCRIBER_UPDATE_DETACHED: + /* Only detach if we are currently attached to this bts */ + if (bts == s->current_bts) + s->current_bts = NULL; + break; + default: + fprintf(stderr, "subscr_update with unknown reason: %d\n", + reason); + break; + }; return db_sync_subscriber(s); } |