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 <[email protected]>
Gerrit-MessageType: newchange

Reply via email to