bsc_subscriber: Allow creating subscribers identified by IMEI
IMEI may be used as MobileIdentity during MO emergency call establishment if the MS has no valid IMSI assigned. Related: OS#5849 Change-Id: I586b1ee30cbb26ddf58788168d56c962e03ccd5c
This commit is contained in:
parent
315af2f9ea
commit
c409977031
|
@ -17,6 +17,7 @@ struct bsc_subscr {
|
|||
struct osmo_use_count use_count;
|
||||
|
||||
char imsi[GSM23003_IMSI_MAX_DIGITS+1];
|
||||
char imei[GSM23003_IMEI_NUM_DIGITS_NO_CHK+1];
|
||||
uint32_t tmsi;
|
||||
|
||||
/* List head of (struct gsm_paging_request).bsub_entry */
|
||||
|
@ -30,6 +31,9 @@ const char *bsc_subscr_id(struct bsc_subscr *bsub);
|
|||
struct bsc_subscr *bsc_subscr_find_or_create_by_imsi(struct llist_head *list,
|
||||
const char *imsi,
|
||||
const char *use_token);
|
||||
struct bsc_subscr *bsc_subscr_find_or_create_by_imei(struct llist_head *list,
|
||||
const char *imei,
|
||||
const char *use_token);
|
||||
struct bsc_subscr *bsc_subscr_find_or_create_by_tmsi(struct llist_head *list,
|
||||
uint32_t tmsi,
|
||||
const char *use_token);
|
||||
|
@ -39,6 +43,9 @@ struct bsc_subscr *bsc_subscr_find_or_create_by_mi(struct llist_head *list, cons
|
|||
struct bsc_subscr *bsc_subscr_find_by_imsi(struct llist_head *list,
|
||||
const char *imsi,
|
||||
const char *use_token);
|
||||
struct bsc_subscr *bsc_subscr_find_by_imei(struct llist_head *list,
|
||||
const char *imei,
|
||||
const char *use_token);
|
||||
struct bsc_subscr *bsc_subscr_find_by_tmsi(struct llist_head *list,
|
||||
uint32_t tmsi,
|
||||
const char *use_token);
|
||||
|
@ -46,6 +53,7 @@ struct bsc_subscr *bsc_subscr_find_by_mi(struct llist_head *list, const struct o
|
|||
const char *use_token);
|
||||
|
||||
void bsc_subscr_set_imsi(struct bsc_subscr *bsub, const char *imsi);
|
||||
void bsc_subscr_set_imei(struct bsc_subscr *bsub, const char *imei);
|
||||
|
||||
#define bsc_subscr_get(bsc_subscr, use) \
|
||||
OSMO_ASSERT(osmo_use_count_get_put(&(bsc_subscr)->use_count, use, 1) == 0)
|
||||
|
|
|
@ -103,6 +103,24 @@ struct bsc_subscr *bsc_subscr_find_by_imsi(struct llist_head *list,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
struct bsc_subscr *bsc_subscr_find_by_imei(struct llist_head *list,
|
||||
const char *imei,
|
||||
const char *use_token)
|
||||
{
|
||||
struct bsc_subscr *bsub;
|
||||
|
||||
if (!imei || !*imei)
|
||||
return NULL;
|
||||
|
||||
llist_for_each_entry(bsub, list, entry) {
|
||||
if (!strcmp(bsub->imei, imei)) {
|
||||
bsc_subscr_get(bsub, use_token);
|
||||
return bsub;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct bsc_subscr *bsc_subscr_find_by_tmsi(struct llist_head *list,
|
||||
uint32_t tmsi,
|
||||
const char *use_token)
|
||||
|
@ -129,6 +147,8 @@ struct bsc_subscr *bsc_subscr_find_by_mi(struct llist_head *list, const struct o
|
|||
switch (mi->type) {
|
||||
case GSM_MI_TYPE_IMSI:
|
||||
return bsc_subscr_find_by_imsi(list, mi->imsi, use_token);
|
||||
case GSM_MI_TYPE_IMEI:
|
||||
return bsc_subscr_find_by_imei(list, mi->imei, use_token);
|
||||
case GSM_MI_TYPE_TMSI:
|
||||
return bsc_subscr_find_by_tmsi(list, mi->tmsi, use_token);
|
||||
default:
|
||||
|
@ -143,6 +163,13 @@ void bsc_subscr_set_imsi(struct bsc_subscr *bsub, const char *imsi)
|
|||
osmo_strlcpy(bsub->imsi, imsi, sizeof(bsub->imsi));
|
||||
}
|
||||
|
||||
void bsc_subscr_set_imei(struct bsc_subscr *bsub, const char *imei)
|
||||
{
|
||||
if (!bsub)
|
||||
return;
|
||||
osmo_strlcpy(bsub->imei, imei, sizeof(bsub->imei));
|
||||
}
|
||||
|
||||
struct bsc_subscr *bsc_subscr_find_or_create_by_imsi(struct llist_head *list,
|
||||
const char *imsi,
|
||||
const char *use_token)
|
||||
|
@ -159,6 +186,22 @@ struct bsc_subscr *bsc_subscr_find_or_create_by_imsi(struct llist_head *list,
|
|||
return bsub;
|
||||
}
|
||||
|
||||
struct bsc_subscr *bsc_subscr_find_or_create_by_imei(struct llist_head *list,
|
||||
const char *imei,
|
||||
const char *use_token)
|
||||
{
|
||||
struct bsc_subscr *bsub;
|
||||
bsub = bsc_subscr_find_by_imei(list, imei, use_token);
|
||||
if (bsub)
|
||||
return bsub;
|
||||
bsub = bsc_subscr_alloc(list);
|
||||
if (!bsub)
|
||||
return NULL;
|
||||
bsc_subscr_set_imei(bsub, imei);
|
||||
bsc_subscr_get(bsub, use_token);
|
||||
return bsub;
|
||||
}
|
||||
|
||||
struct bsc_subscr *bsc_subscr_find_or_create_by_tmsi(struct llist_head *list,
|
||||
uint32_t tmsi,
|
||||
const char *use_token)
|
||||
|
@ -183,6 +226,8 @@ struct bsc_subscr *bsc_subscr_find_or_create_by_mi(struct llist_head *list, cons
|
|||
switch (mi->type) {
|
||||
case GSM_MI_TYPE_IMSI:
|
||||
return bsc_subscr_find_or_create_by_imsi(list, mi->imsi, use_token);
|
||||
case GSM_MI_TYPE_IMEI:
|
||||
return bsc_subscr_find_or_create_by_imei(list, mi->imei, use_token);
|
||||
case GSM_MI_TYPE_TMSI:
|
||||
return bsc_subscr_find_or_create_by_tmsi(list, mi->tmsi, use_token);
|
||||
default:
|
||||
|
@ -200,6 +245,8 @@ static int bsc_subscr_name_buf(char *buf, size_t buflen, struct bsc_subscr *bsub
|
|||
}
|
||||
if (bsub->imsi[0])
|
||||
OSMO_STRBUF_PRINTF(sb, "-IMSI-%s", bsub->imsi);
|
||||
else if (bsub->imei[0])
|
||||
OSMO_STRBUF_PRINTF(sb, "-IMEI-%s", bsub->imei);
|
||||
if (bsub->tmsi != GSM_RESERVED_TMSI)
|
||||
OSMO_STRBUF_PRINTF(sb, "-TMSI-0x%08x", bsub->tmsi);
|
||||
return sb.chars_needed;
|
||||
|
|
Loading…
Reference in New Issue