pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bsc/+/30843 )
Change subject: bsc_subscriber: Allow creating subscribers identified by IMEI ......................................................................
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 --- M include/osmocom/bsc/bsc_subscriber.h M src/osmo-bsc/bsc_subscriber.c 2 files changed, 55 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/43/30843/1
diff --git a/include/osmocom/bsc/bsc_subscriber.h b/include/osmocom/bsc/bsc_subscriber.h index 30b33dc..2beb998 100644 --- a/include/osmocom/bsc/bsc_subscriber.h +++ b/include/osmocom/bsc/bsc_subscriber.h @@ -17,6 +17,7 @@ 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 @@ 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_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 @@ 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) diff --git a/src/osmo-bsc/bsc_subscriber.c b/src/osmo-bsc/bsc_subscriber.c index 15dc14f..db86144 100644 --- a/src/osmo-bsc/bsc_subscriber.c +++ b/src/osmo-bsc/bsc_subscriber.c @@ -103,6 +103,24 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ } 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;