[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:
parent
bab9cd9a27
commit
4a49e77ff4
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue