Vadim Yanitskiy has uploaded this change for review. ( 
https://gerrit.osmocom.org/13714


Change subject: add lu-ignore-nam-cs
......................................................................

add lu-ignore-nam-cs

Change-Id: I62e750faab92b142b9ca89ad2de5dc63afaeb61c
---
M src/hlr.c
M src/hlr.h
M src/hlr_vty.c
3 files changed, 50 insertions(+), 10 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/14/13714/1

diff --git a/src/hlr.c b/src/hlr.c
index b739e71..882362d 100644
--- a/src/hlr.c
+++ b/src/hlr.c
@@ -320,8 +320,15 @@
        /* Check if subscriber is generally permitted on CS or PS
         * service (as requested) */
        if (!luop->is_ps && !luop->subscr.nam_cs) {
-               lu_op_tx_error(luop, GMM_CAUSE_PLMN_NOTALLOWED);
-               return 0;
+               if (g_hlr->lu_ignore_nam_cs)
+                       /* Subscriber will be kicked later in the IMEI check, 
which the operator must enable together
+                        * with lu-ignore-nam-cs. See rx_check_imei_req() 
below. */
+                       LOGP(DMAIN, LOGL_DEBUG, "LU REQ: subscriber not allowed 
for CS, but allowing anyway"
+                                               " (lu-ignore-nam-cs)");
+               else {
+                       lu_op_tx_error(luop, GMM_CAUSE_PLMN_NOTALLOWED);
+                       return 0;
+               }
        } else if (luop->is_ps && !luop->subscr.nam_ps) {
                lu_op_tx_error(luop, GMM_CAUSE_GPRS_NOTALLOWED);
                return 0;
@@ -413,6 +420,7 @@

 static int rx_check_imei_req(struct osmo_gsup_conn *conn, const struct 
osmo_gsup_message *gsup)
 {
+       struct hlr_subscriber subscr;
        struct osmo_gsup_message gsup_reply = {0};
        struct msgb *msg_out;
        char imei[GSM23003_IMEI_NUM_DIGITS+1] = {0};
@@ -431,6 +439,12 @@
                return -1;
        }

+       /* Get subscriber */
+       if (db_subscr_get_by_imsi(g_hlr->dbc, gsup->imsi, &subscr) < 0) {
+               gsup_send_err_reply(conn, gsup->imsi, gsup->message_type, 
GMM_CAUSE_INV_MAND_INFO);
+               return -1;
+       }
+
        /* Save in DB if desired */
        if (g_hlr->store_imei) {
                LOGP(DAUC, LOGL_DEBUG, "IMSI='%s': storing IMEI = %s\n", 
gsup->imsi, imei);
@@ -438,18 +452,21 @@
                        gsup_send_err_reply(conn, gsup->imsi, 
gsup->message_type, GMM_CAUSE_INV_MAND_INFO);
                        return -1;
                }
-       } else {
-               /* Check if subscriber exists and print IMEI */
+       } else
                LOGP(DMAIN, LOGL_INFO, "IMSI='%s': has IMEI = %s (consider 
setting 'store-imei')\n", gsup->imsi, imei);
-               struct hlr_subscriber subscr;
-               if (db_subscr_get_by_imsi(g_hlr->dbc, gsup->imsi, &subscr) < 0) 
{
-                       gsup_send_err_reply(conn, gsup->imsi, 
gsup->message_type, GMM_CAUSE_INV_MAND_INFO);
-                       return -1;
-               }
-       }

        /* Accept all IMEIs */
        gsup_reply.imei_result = OSMO_GSUP_IMEI_RESULT_ACK;
+
+       /* lu-ignore-nam-cs: use Check IMEI to do a late check for CS/PS 
enabled. This would usually be done in the LU
+        * REQ, but then the ME will immediatelly disconnect without sending 
the IMEI. */
+       if (g_hlr->lu_ignore_nam_cs && !subscr.nam_cs && !subscr.nam_ps) {
+               LOGP(DAUC, LOGL_DEBUG, "IMSI='%s': pretending that the IMEI is 
not allowed, because subscriber"
+                               " has both CS and PS NAM disabled 
(lu-ignore-nam-cs)", gsup->imsi);
+               gsup_reply.imei_result = OSMO_GSUP_IMEI_RESULT_NACK;
+       }
+
+       /* Send response */
        gsup_reply.message_type = OSMO_GSUP_MSGT_CHECK_IMEI_RESULT;
        msg_out = msgb_alloc_headroom(1024+16, 16, "GSUP Check_IMEI response");
        memcpy(gsup_reply.imsi, gsup->imsi, sizeof(gsup_reply.imsi));
diff --git a/src/hlr.h b/src/hlr.h
index dc1c720..ad9ef7e 100644
--- a/src/hlr.h
+++ b/src/hlr.h
@@ -54,6 +54,7 @@

        bool store_imei;
        bool create_subscr_on_demand;
+       bool lu_ignore_nam_cs;
 };

 extern struct hlr *g_hlr;
diff --git a/src/hlr_vty.c b/src/hlr_vty.c
index 7bf27da..2804fd0 100644
--- a/src/hlr_vty.c
+++ b/src/hlr_vty.c
@@ -342,6 +342,26 @@
        return CMD_SUCCESS;
 }

+DEFUN(cfg_lu_ignore_nam_cs, cfg_lu_ignore_nam_cs_cmd,
+       "lu-ignore-nam-cs",
+       "Allow subscribers to do the LU (Location Update) for the CS domain, 
even if they should not have access to it."
+       " OsmoHLR will do the CS domain check again after the LU, during the 
Check IMEI procedure, and pretend that the"
+       " IMEI is not allowed on the network if the CS domain is disabled for 
the subscriber. This is needed to make"
+       " store-imei work with subscriber-create-on-demand. ONLY ENABLE 
TOGETHER WITH ENFORCED IMEI CHECKING IN YOUR"
+       " MSC! (OsmoMSC: 'check-imei-rqd 1')")
+{
+       g_hlr->lu_ignore_nam_cs = true;
+       return CMD_SUCCESS;
+}
+
+DEFUN(cfg_no_lu_ignore_nam_cs, cfg_no_lu_ignore_nam_cs_cmd,
+       "no lu-ignore-nam-cs",
+       "Only allow LU (Location Update) for the CS domain, if the subscriber 
has access to it.")
+{
+       g_hlr->lu_ignore_nam_cs = false;
+       return CMD_SUCCESS;
+}
+
 /***********************************************************************
  * Common Code
  ***********************************************************************/
@@ -410,6 +430,8 @@
        install_element(HLR_NODE, &cfg_no_store_imei_cmd);
        install_element(HLR_NODE, &cfg_subscr_create_on_demand_cmd);
        install_element(HLR_NODE, &cfg_no_subscr_create_on_demand_cmd);
+       install_element(HLR_NODE, &cfg_lu_ignore_nam_cs_cmd);
+       install_element(HLR_NODE, &cfg_no_lu_ignore_nam_cs_cmd);

        hlr_vty_subscriber_init();
 }

--
To view, visit https://gerrit.osmocom.org/13714
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-hlr
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I62e750faab92b142b9ca89ad2de5dc63afaeb61c
Gerrit-Change-Number: 13714
Gerrit-PatchSet: 1
Gerrit-Owner: Vadim Yanitskiy <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>

Reply via email to