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;
--
To view, visit
https://gerrit.osmocom.org/c/osmo-bsc/+/30843
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: I586b1ee30cbb26ddf58788168d56c962e03ccd5c
Gerrit-Change-Number: 30843
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: newchange