[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.
This commit is contained in:
Holger Freyther 2009-04-12 05:37:29 +00:00
parent bab9cd9a27
commit 4a49e77ff4
3 changed files with 28 additions and 5 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);
}