aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Freyther <zecke@selfish.org>2009-04-12 05:37:29 +0000
committerHolger Freyther <zecke@selfish.org>2009-04-12 05:37:29 +0000
commit4a49e77ff43ae0ec152a351603fbe91ec30efe8c (patch)
treed5801956ecddfae198152083613b571e351dd537
parentbab9cd9a2715e416664d08a56bdacefd6e921e4f (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.h8
-rw-r--r--src/gsm_04_08.c8
-rw-r--r--src/gsm_subscriber.c17
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);
}