Error getting diff: tar:

Changes of Revision 9

osmo-hlr_1.8.0.dsc -> osmo-hlr_1.9.0.dsc Changed
x
 
1
@@ -2,13 +2,13 @@
2
 Source: osmo-hlr
3
 Binary: osmo-hlr, osmo-hlr-dbg, libosmo-gsup-client0, libosmo-gsup-client-dev, libosmo-mslookup1, libosmo-mslookup-dev, osmo-mslookup-utils, osmo-hlr-doc
4
 Architecture: any all
5
-Version: 1.8.0
6
+Version: 1.9.0
7
 Maintainer: Osmocom team <openbsc@lists.osmocom.org>
8
 Homepage: https://projects.osmocom.org/projects/osmo-hlr
9
 Standards-Version: 3.9.6
10
 Vcs-Browser: https://gitea.osmocom.org/cellular-infrastructure/osmo-hlr
11
 Vcs-Git: https://gitea.osmocom.org/cellular-infrastructure/osmo-hlr
12
-Build-Depends: debhelper (>= 10), pkg-config, dh-autoreconf, autotools-dev, python3-minimal, libosmocore-dev (>= 1.10.0), libosmo-abis-dev (>= 1.6.0), libosmo-netif-dev (>= 1.5.0), libsqlite3-dev, sqlite3, osmo-gsm-manuals-dev (>= 1.6.0)
13
+Build-Depends: debhelper (>= 10), pkg-config, dh-autoreconf, autotools-dev, python3-minimal, libosmocore-dev (>= 1.11.0), libosmo-abis-dev (>= 2.0.0), libosmo-netif-dev (>= 1.6.0), libsqlite3-dev, sqlite3, osmo-gsm-manuals-dev (>= 1.6.0)
14
 Package-List:
15
  libosmo-gsup-client-dev deb net optional arch=any
16
  libosmo-gsup-client0 deb libs optional arch=any
17
@@ -19,8 +19,8 @@
18
  osmo-hlr-doc deb doc optional arch=all
19
  osmo-mslookup-utils deb utils optional arch=any
20
 Checksums-Sha1:
21
- d860d2a24cb405e333781028a5a4c3ce4a794d9e 176436 osmo-hlr_1.8.0.tar.xz
22
+ 0c08465093e59a66772df776ce31aa14c26de4c7 178248 osmo-hlr_1.9.0.tar.xz
23
 Checksums-Sha256:
24
- a191ca37c5b2ceb89bdbaec580cf93d11d5ca788dbbcec24c53a0b01a627ecc0 176436 osmo-hlr_1.8.0.tar.xz
25
+ 6f38d9f59f81e41b0125daa6d49be461b3a60fcdd4cfd091e70559cf46a82e74 178248 osmo-hlr_1.9.0.tar.xz
26
 Files:
27
- 7adde67ba5cb72d60ff781839ccc26e7 176436 osmo-hlr_1.8.0.tar.xz
28
+ d96574b43521b9c5138b6ce6c0613d91 178248 osmo-hlr_1.9.0.tar.xz
29
osmo-hlr_1.8.0.tar.xz/.tarball-version -> osmo-hlr_1.9.0.tar.xz/.tarball-version Changed
4
 
1
@@ -1 +1 @@
2
-1.8.0
3
+1.9.0
4
osmo-hlr_1.8.0.tar.xz/configure.ac -> osmo-hlr_1.9.0.tar.xz/configure.ac Changed
18
 
1
@@ -41,11 +41,11 @@
2
 
3
 PKG_CHECK_MODULES(TALLOC, talloc >= 2.0.1)
4
 
5
-PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.10.0)
6
-PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.10.0)
7
-PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.10.0)
8
-PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.10.0)
9
-PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 1.6.0)
10
+PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.11.0)
11
+PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.11.0)
12
+PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.11.0)
13
+PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.11.0)
14
+PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 2.0.0)
15
 
16
 PKG_CHECK_MODULES(SQLITE3, sqlite3)
17
 
18
osmo-hlr_1.8.0.tar.xz/contrib/jenkins.sh -> osmo-hlr_1.9.0.tar.xz/contrib/jenkins.sh Changed
11
 
1
@@ -29,7 +29,8 @@
2
 export LD_LIBRARY_PATH="$inst/lib"
3
 export PATH="$inst/bin:$PATH"
4
 
5
-osmo-build-dep.sh libosmocore "" ac_cv_path_DOXYGEN=false
6
+osmo-build-dep.sh libosmocore "" --disable-doxygen
7
+osmo-build-dep.sh libosmo-netif "" --disable-doxygen
8
 osmo-build-dep.sh libosmo-abis
9
 
10
 # Additional configure options and depends
11
osmo-hlr_1.8.0.tar.xz/debian/changelog -> osmo-hlr_1.9.0.tar.xz/debian/changelog Changed
32
 
1
@@ -1,3 +1,30 @@
2
+osmo-hlr (1.9.0) unstable; urgency=medium
3
+
4
+   Vadim Yanitskiy 
5
+  * subscriber-create-on-demand: rework configuration
6
+  * subscriber-create-on-demand: add mode for MSISDN=IMSI
7
+
8
+   Alexander Couzens 
9
+  * gsupclient: Introduce gsup_client_mux
10
+  * gsupclient: add missing SPDX line
11
+  * debian/copyright: add gsup_client under GPLv2+
12
+
13
+   Pau Espin Pedrol 
14
+  * gsup: Replace deprecated ipa_msg_push_header()
15
+  * jenkins.sh: libosmo-netif no longer depends on libosmo-abis
16
+  * Drop use of libosmo-abis osmocom/abis/ipaccess.h
17
+  * gsup_client: Add new APIs to avoid users accessing struct fields
18
+  * gsup_client: Avoid double memset 0
19
+  * Drop unneeded use of abis/ipa.h header
20
+  * jenkins.sh: Use --disable-doxygen configure param
21
+
22
+   Mychaela N. Falconia 
23
+  * vty: always emit reject-cause lines in saved config
24
+  * change default reject cause to plmn-not-allowed
25
+  * change default no-proxy reject cause to net-fail
26
+
27
+ -- Oliver Smith <osmith@sysmocom.de>  Wed, 12 Feb 2025 12:17:52 +0100
28
+
29
 osmo-hlr (1.8.0) unstable; urgency=medium
30
 
31
    Vadim Yanitskiy 
32
osmo-hlr_1.8.0.tar.xz/debian/control -> osmo-hlr_1.9.0.tar.xz/debian/control Changed
14
 
1
@@ -7,9 +7,9 @@
2
                dh-autoreconf,
3
                autotools-dev,
4
                python3-minimal,
5
-               libosmocore-dev (>= 1.10.0),
6
-               libosmo-abis-dev (>= 1.6.0),
7
-               libosmo-netif-dev (>= 1.5.0),
8
+               libosmocore-dev (>= 1.11.0),
9
+               libosmo-abis-dev (>= 2.0.0),
10
+               libosmo-netif-dev (>= 1.6.0),
11
                libsqlite3-dev,
12
                sqlite3,
13
                osmo-gsm-manuals-dev (>= 1.6.0)
14
osmo-hlr_1.8.0.tar.xz/debian/copyright -> osmo-hlr_1.9.0.tar.xz/debian/copyright Changed
30
 
1
@@ -6,6 +6,10 @@
2
 Copyright: 2016-2022 Sysmocom s. f. m. c. GmbH <info@sysmocom.de>
3
 License: AGPL-3+
4
 
5
+Files: src/gsupclient/*
6
+Copyright: 2014-2016,2019 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
7
+License: GPL-2+
8
+
9
 License: AGPL-3+
10
  This program is free software: you can redistribute it and/or modify
11
  it under the terms of the GNU Affero General Public License as published by
12
@@ -19,3 +23,17 @@
13
 
14
  You should have received a copy of the GNU Affero General Public License
15
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
+
17
+License: GPL-2+
18
+ This program is free software; you can redistribute it and/or modify
19
+ it under the terms of the GNU General Public License as published by
20
+ the Free Software Foundation; either version 2 of the License, or
21
+ (at your option) any later version.
22
+
23
+ This program is distributed in the hope that it will be useful,
24
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+ GNU General Public License for more details.
27
+
28
+ You should have received a copy of the GNU General Public License
29
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
osmo-hlr_1.8.0.tar.xz/include/Makefile.am -> osmo-hlr_1.9.0.tar.xz/include/Makefile.am Changed
9
 
1
@@ -3,6 +3,7 @@
2
 nobase_include_HEADERS = \
3
    osmocom/gsupclient/cni_peer_id.h \
4
    osmocom/gsupclient/gsup_client.h \
5
+   osmocom/gsupclient/gsup_client_mux.h \
6
    osmocom/gsupclient/gsup_req.h \
7
    osmocom/mslookup/mdns.h \
8
    osmocom/mslookup/mdns_sock.h \
9
osmo-hlr_1.8.0.tar.xz/include/osmocom/gsupclient/gsup_client.h -> osmo-hlr_1.9.0.tar.xz/include/osmocom/gsupclient/gsup_client.h Changed
32
 
1
@@ -20,6 +20,9 @@
2
  */
3
 #pragma once
4
 
5
+#include <stdint.h>
6
+#include <stdbool.h>
7
+
8
 #include <osmocom/core/timer.h>
9
 #include <osmocom/gsm/oap_client.h>
10
 #include <osmocom/gsm/ipa.h>
11
@@ -40,6 +43,7 @@
12
 
13
 typedef bool (*osmo_gsup_client_up_down_cb_t)(struct osmo_gsup_client *gsupc, bool up);
14
 
15
+/* NOTE: THIS STRUCT IS CONSIDERED PRIVATE, AVOID ACCESSING ITS FIELDS! */
16
 struct osmo_gsup_client {
17
    const char *unit_name; /* same as ipa_dev->unit_name, for backwards compat */
18
 
19
@@ -99,3 +103,12 @@
20
                  const struct osmo_gsup_message *gsup_msg);
21
 struct msgb *osmo_gsup_client_msgb_alloc(void);
22
 
23
+void *osmo_gsup_client_get_data(const struct osmo_gsup_client *gsupc);
24
+void osmo_gsup_client_set_data(struct osmo_gsup_client *gsupc, void *data);
25
+
26
+const char *osmo_gsup_client_get_rem_addr(const struct osmo_gsup_client *gsupc);
27
+uint16_t osmo_gsup_client_get_rem_port(const struct osmo_gsup_client *gsupc);
28
+
29
+bool osmo_gsup_client_is_connected(const struct osmo_gsup_client *gsupc);
30
+const struct ipaccess_unit *osmo_gsup_client_get_ipaccess_unit(const struct osmo_gsup_client *gsupc);
31
+
32
osmo-hlr_1.9.0.tar.xz/include/osmocom/gsupclient/gsup_client_mux.h Added
58
 
1
@@ -0,0 +1,56 @@
2
+/*
3
+ * (C) 2019 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
4
+ * All Rights Reserved
5
+ *
6
+ * Author: Neels Hofmeyr
7
+ *
8
+ * SPDX-License-Identifier: GPL-2.0-or-later
9
+ *
10
+ * This program is free software; you can redistribute it and/or modify
11
+ * it under the terms of the GNU General Public License as published by
12
+ * the Free Software Foundation; either version 2 of the License, or
13
+ * (at your option) any later version.
14
+ *
15
+ * This program is distributed in the hope that it will be useful,
16
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
+ * GNU General Public License for more details.
19
+ *
20
+ * You should have received a copy of the GNU General Public License
21
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
+ */
23
+
24
+#pragma once
25
+
26
+#include <osmocom/gsm/gsup.h>
27
+
28
+struct gsup_client_mux;
29
+struct ipaccess_unit;
30
+
31
+struct gsup_client_mux_rx_cb {
32
+   int (*func)(struct gsup_client_mux *gcm, void *data, const struct osmo_gsup_message *gsup_msg);
33
+   void *data;
34
+};
35
+
36
+/* A GSUP client shared between code paths for various GSUP Message Classes.
37
+ * The main task is to dispatch GSUP messages to code paths corresponding to the respective Message Class, i.e.
38
+ * subscriber management, SMS, SS/USSD and inter-MSC messaging.
39
+ * If a GSUP Message Class IE is present in the message, the received message is dispatched directly to the rx_cb entry
40
+ * for that Message Class. Otherwise, the Message Class is determined by a switch() on the Message Type.*/
41
+struct gsup_client_mux {
42
+   struct osmo_gsup_client *gsup_client;
43
+
44
+   /* Target clients by enum osmo_gsup_message_class */
45
+   struct gsup_client_mux_rx_cb rx_cbOSMO_GSUP_MESSAGE_CLASS_ARRAYSIZE;
46
+};
47
+
48
+struct gsup_client_mux *gsup_client_mux_alloc(void *talloc_ctx);
49
+int gsup_client_mux_start(struct gsup_client_mux *gcm, const char *gsup_server_addr_str, uint16_t gsup_server_port,
50
+             struct ipaccess_unit *ipa_dev);
51
+
52
+int gsup_client_mux_tx(struct gsup_client_mux *gcm, const struct osmo_gsup_message *gsup_msg);
53
+void gsup_client_mux_tx_set_source(const struct gsup_client_mux *gcm, struct osmo_gsup_message *gsup_msg);
54
+void gsup_client_mux_tx_error_reply(struct gsup_client_mux *gcm, const struct osmo_gsup_message *gsup_orig,
55
+                   enum gsm48_gmm_cause cause);
56
+
57
+int gsup_client_mux_rx(struct osmo_gsup_client *gsup_client, struct msgb *msg);
58
osmo-hlr_1.8.0.tar.xz/include/osmocom/hlr/gsup_server.h -> osmo-hlr_1.9.0.tar.xz/include/osmocom/hlr/gsup_server.h Changed
13
 
1
@@ -2,9 +2,9 @@
2
 
3
 #include <osmocom/core/linuxlist.h>
4
 #include <osmocom/core/msgb.h>
5
-#include <osmocom/abis/ipa.h>
6
-#include <osmocom/abis/ipaccess.h>
7
 #include <osmocom/gsm/gsup.h>
8
+#include <osmocom/gsm/protocol/ipaccess.h>
9
+#include <osmocom/abis/ipa.h>
10
 #include <osmocom/gsupclient/cni_peer_id.h>
11
 #include <osmocom/gsupclient/gsup_req.h>
12
 
13
osmo-hlr_1.8.0.tar.xz/include/osmocom/hlr/hlr.h -> osmo-hlr_1.9.0.tar.xz/include/osmocom/hlr/hlr.h Changed
32
 
1
@@ -39,6 +39,13 @@
2
 
3
 extern struct osmo_tdef g_hlr_tdefs;
4
 
5
+enum subscr_create_on_demand_mode {
6
+   SUBSCR_COD_MODE_DISABLED = 0,
7
+   SUBSCR_COD_MODE_NO_MSISDN,
8
+   SUBSCR_COD_MODE_RAND_MSISDN,
9
+   SUBSCR_COD_MODE_MSISDN_FROM_IMSI,
10
+};
11
+
12
 struct hlr {
13
    /* GSUP server pointer */
14
    struct osmo_gsup_server *gs;
15
@@ -80,10 +87,12 @@
16
 
17
    bool store_imei;
18
 
19
-   bool subscr_create_on_demand;
20
-   /* Bitmask of DB_SUBSCR_FLAG_* */
21
-   uint8_t subscr_create_on_demand_flags;
22
-   unsigned int subscr_create_on_demand_rand_msisdn_len;
23
+   struct {
24
+       enum subscr_create_on_demand_mode mode;
25
+       unsigned int rand_msisdn_len;
26
+       /* Bitmask of DB_SUBSCR_FLAG_* */
27
+       uint8_t flags;
28
+   } subscr_create_on_demand;
29
 
30
    struct {
31
        bool allow_startup;
32
osmo-hlr_1.8.0.tar.xz/src/gsup_server.c -> osmo-hlr_1.9.0.tar.xz/src/gsup_server.c Changed
25
 
1
@@ -24,11 +24,12 @@
2
 #include <osmocom/core/msgb.h>
3
 #include <osmocom/core/logging.h>
4
 #include <osmocom/core/linuxlist.h>
5
-#include <osmocom/abis/ipa.h>
6
-#include <osmocom/abis/ipaccess.h>
7
 #include <osmocom/gsm/gsm48_ie.h>
8
 #include <osmocom/gsm/apn.h>
9
+#include <osmocom/gsm/protocol/ipaccess.h>
10
+#include <osmocom/gsm/ipa.h>
11
 #include <osmocom/gsm/gsm23003.h>
12
+#include <osmocom/abis/ipa.h>
13
 
14
 #include <osmocom/hlr/gsup_server.h>
15
 #include <osmocom/hlr/gsup_router.h>
16
@@ -49,7 +50,7 @@
17
                 int proto_ext, struct msgb *msg_tx)
18
 {
19
    ipa_prepend_header_ext(msg_tx, proto_ext);
20
-   ipa_msg_push_header(msg_tx, IPAC_PROTO_OSMO);
21
+   ipa_prepend_header(msg_tx, IPAC_PROTO_OSMO);
22
    ipa_server_conn_send(conn->conn, msg_tx);
23
 }
24
 
25
osmo-hlr_1.8.0.tar.xz/src/gsupclient/Makefile.am -> osmo-hlr_1.9.0.tar.xz/src/gsupclient/Makefile.am Changed
18
 
1
@@ -1,7 +1,7 @@
2
 # This is _NOT_ the library release version, it's an API version.
3
 # Please read chapter "Library interface versions" of the libtool documentation
4
 # before making any modifications: https://www.gnu.org/software/libtool/manual/html_node/Versioning.html
5
-LIBVERSION=1:0:1
6
+LIBVERSION=2:0:2
7
 
8
 AM_CFLAGS = -Wall $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)/include \
9
        $(TALLOC_CFLAGS) $(LIBOSMOCORE_CFLAGS) $(LIBOSMOABIS_CFLAGS)
10
@@ -11,6 +11,7 @@
11
 libosmo_gsup_client_la_SOURCES = \
12
    cni_peer_id.c \
13
    gsup_client.c \
14
+   gsup_client_mux.c \
15
    gsup_req.c \
16
    $(NULL)
17
 
18
osmo-hlr_1.8.0.tar.xz/src/gsupclient/cni_peer_id.c -> osmo-hlr_1.9.0.tar.xz/src/gsupclient/cni_peer_id.c Changed
10
 
1
@@ -2,6 +2,8 @@
2
  *
3
  * All Rights Reserved
4
  *
5
+ * SPDX-License-Identifier: GPL-2.0-or-later
6
+ *
7
  * This program is free software; you can redistribute it and/or modify
8
  * it under the terms of the GNU General Public License as published by
9
  * the Free Software Foundation; either version 2 of the License, or
10
osmo-hlr_1.8.0.tar.xz/src/gsupclient/gsup_client.c -> osmo-hlr_1.9.0.tar.xz/src/gsupclient/gsup_client.c Changed
82
 
1
@@ -6,6 +6,8 @@
2
  * Author: Jacob Erlbeck
3
  * Author: Neels Hofmeyr
4
  *
5
+ * SPDX-License-Identifier: GPL-2.0-or-later
6
+ *
7
  * This program is free software; you can redistribute it and/or modify
8
  * it under the terms of the GNU General Public License as published by
9
  * the Free Software Foundation; either version 2 of the License, or
10
@@ -24,6 +26,7 @@
11
 #include <osmocom/gsupclient/gsup_client.h>
12
 
13
 #include <osmocom/abis/ipa.h>
14
+#include <osmocom/gsm/ipa.h>
15
 #include <osmocom/gsm/oap_client.h>
16
 #include <osmocom/gsm/protocol/ipaccess.h>
17
 #include <osmocom/core/msgb.h>
18
@@ -42,7 +45,7 @@
19
 
20
    msg->l2h = msgb_put(msg, 1);
21
    msg->l2h0 = IPAC_MSGT_PING;
22
-   ipa_msg_push_header(msg, IPAC_PROTO_IPACCESS);
23
+   ipa_prepend_header(msg, IPAC_PROTO_IPACCESS);
24
    ipa_client_conn_send(gsupc->link, msg);
25
 }
26
 
27
@@ -112,7 +115,7 @@
28
            struct msgb *msg_tx)
29
 {
30
    ipa_prepend_header_ext(msg_tx, proto_ext);
31
-   ipa_msg_push_header(msg_tx, IPAC_PROTO_OSMO);
32
+   ipa_prepend_header(msg_tx, IPAC_PROTO_OSMO);
33
    ipa_client_conn_send(gsupc->link, msg_tx);
34
    /* msg_tx is now queued and will be freed. */
35
 }
36
@@ -304,7 +307,7 @@
37
 
38
    OSMO_ASSERT(config->ipa_dev->unit_name);
39
 
40
-   gsupc = talloc_zero(talloc_ctx, struct osmo_gsup_client);
41
+   gsupc = talloc(talloc_ctx, struct osmo_gsup_client);
42
    OSMO_ASSERT(gsupc);
43
    *gsupc = (struct osmo_gsup_client){
44
        .unit_name = (const char *)config->ipa_dev->unit_name, /* API backwards compat */
45
@@ -447,3 +450,36 @@
46
 {
47
    return msgb_alloc_headroom(4000, 64, __func__);
48
 }
49
+
50
+void *osmo_gsup_client_get_data(const struct osmo_gsup_client *gsupc)
51
+{
52
+   return gsupc->data;
53
+}
54
+
55
+void osmo_gsup_client_set_data(struct osmo_gsup_client *gsupc, void *data)
56
+{
57
+   gsupc->data = data;
58
+}
59
+
60
+const char *osmo_gsup_client_get_rem_addr(const struct osmo_gsup_client *gsupc)
61
+{
62
+   if (!gsupc->link)
63
+       return NULL;
64
+   return gsupc->link->addr;
65
+}
66
+uint16_t osmo_gsup_client_get_rem_port(const struct osmo_gsup_client *gsupc)
67
+{
68
+   if (!gsupc->link)
69
+       return 0;
70
+   return gsupc->link->port;
71
+}
72
+
73
+bool osmo_gsup_client_is_connected(const struct osmo_gsup_client *gsupc)
74
+{
75
+   return gsupc->is_connected;
76
+}
77
+
78
+const struct ipaccess_unit *osmo_gsup_client_get_ipaccess_unit(const struct osmo_gsup_client *gsupc)
79
+{
80
+   return gsupc->ipa_dev;
81
+}
82
osmo-hlr_1.9.0.tar.xz/src/gsupclient/gsup_client_mux.c Added
198
 
1
@@ -0,0 +1,196 @@
2
+/* Directing individual GSUP messages to their respective handlers. */
3
+/*
4
+ * (C) 2019 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
5
+ * All Rights Reserved
6
+ *
7
+ * Author: Neels Hofmeyr
8
+ *
9
+ * SPDX-License-Identifier: GPL-2.0-or-later
10
+ *
11
+ * This program is free software; you can redistribute it and/or modify
12
+ * it under the terms of the GNU General Public License as published by
13
+ * the Free Software Foundation; either version 2 of the License, or
14
+ * (at your option) any later version.
15
+ *
16
+ * This program is distributed in the hope that it will be useful,
17
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
+ * GNU General Public License for more details.
20
+ *
21
+ * You should have received a copy of the GNU General Public License
22
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
+ */
24
+#include <errno.h>
25
+
26
+#include <osmocom/core/logging.h>
27
+
28
+#include <osmocom/gsupclient/gsup_client.h>
29
+#include <osmocom/gsupclient/gsup_client_mux.h>
30
+
31
+static enum osmo_gsup_message_class gsup_client_mux_classify(struct gsup_client_mux *gcm,
32
+                           const struct osmo_gsup_message *gsup_msg)
33
+{
34
+   if (gsup_msg->message_class)
35
+       return gsup_msg->message_class;
36
+
37
+   LOGP(DLGSUP, LOGL_DEBUG, "No explicit GSUP Message Class, trying to guess from message type %s\n",
38
+        osmo_gsup_message_type_name(gsup_msg->message_type));
39
+
40
+   switch (gsup_msg->message_type) {
41
+   case OSMO_GSUP_MSGT_PROC_SS_REQUEST:
42
+   case OSMO_GSUP_MSGT_PROC_SS_RESULT:
43
+   case OSMO_GSUP_MSGT_PROC_SS_ERROR:
44
+       return OSMO_GSUP_MESSAGE_CLASS_USSD;
45
+
46
+   /* GSM 04.11 code implementing MO SMS */
47
+   case OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR:
48
+   case OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT:
49
+   case OSMO_GSUP_MSGT_READY_FOR_SM_ERROR:
50
+   case OSMO_GSUP_MSGT_READY_FOR_SM_RESULT:
51
+   case OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST:
52
+       return OSMO_GSUP_MESSAGE_CLASS_SMS;
53
+
54
+   default:
55
+       return OSMO_GSUP_MESSAGE_CLASS_SUBSCRIBER_MANAGEMENT;
56
+   }
57
+}
58
+
59
+/* Non-static for unit tests */
60
+int gsup_client_mux_rx(struct osmo_gsup_client *gsup_client, struct msgb *msg)
61
+{
62
+   struct gsup_client_mux *gcm = osmo_gsup_client_get_data(gsup_client);
63
+   struct osmo_gsup_message gsup;
64
+   enum osmo_gsup_message_class message_class;
65
+   int rc;
66
+
67
+   rc = osmo_gsup_decode(msgb_l2(msg), msgb_l2len(msg), &gsup);
68
+   if (rc < 0) {
69
+       LOGP(DLGSUP, LOGL_ERROR, "Failed to decode GSUP message: '%s' (%d)  %s\n",
70
+            get_value_string(gsm48_gmm_cause_names, -rc), -rc, osmo_hexdump(msg->data, msg->len));
71
+       goto msgb_free_and_return;
72
+   }
73
+
74
+   if (!gsup.imsi0) {
75
+       LOGP(DLGSUP, LOGL_ERROR, "Failed to decode GSUP message: missing IMSI\n");
76
+       if (OSMO_GSUP_IS_MSGT_REQUEST(gsup.message_type))
77
+           gsup_client_mux_tx_error_reply(gcm, &gsup, GMM_CAUSE_INV_MAND_INFO);
78
+       rc = -GMM_CAUSE_INV_MAND_INFO;
79
+       goto msgb_free_and_return;
80
+   }
81
+
82
+   message_class = gsup_client_mux_classify(gcm, &gsup);
83
+
84
+   if (message_class <= OSMO_GSUP_MESSAGE_CLASS_UNSET || message_class >= ARRAY_SIZE(gcm->rx_cb)) {
85
+       LOGP(DLGSUP, LOGL_ERROR, "Failed to classify GSUP message target\n");
86
+       rc = -EINVAL;
87
+       goto msgb_free_and_return;
88
+   }
89
+
90
+   if (!gcm->rx_cbmessage_class.func) {
91
+       LOGP(DLGSUP, LOGL_ERROR, "No receiver set up for GSUP Message Class %s\n", osmo_gsup_message_class_name(message_class));
92
+       rc = -ENOTSUP;
93
+       goto msgb_free_and_return;
94
+   }
95
+
96
+   rc = gcm->rx_cbmessage_class.func(gcm, gcm->rx_cbmessage_class.data, &gsup);
97
+
98
+msgb_free_and_return:
99
+   msgb_free(msg);
100
+   return rc;
101
+}
102
+
103
+/* Make it clear that struct gsup_client_mux should be talloc allocated, so that it can be used as talloc parent. */
104
+struct gsup_client_mux *gsup_client_mux_alloc(void *talloc_ctx)
105
+{
106
+   return talloc_zero(talloc_ctx, struct gsup_client_mux);
107
+}
108
+
109
+/* Start a GSUP client to serve this gsup_client_mux. */
110
+int gsup_client_mux_start(struct gsup_client_mux *gcm, const char *gsup_server_addr_str, uint16_t gsup_server_port,
111
+             struct ipaccess_unit *ipa_dev)
112
+{
113
+   gcm->gsup_client = osmo_gsup_client_create2(gcm, ipa_dev,
114
+                           gsup_server_addr_str,
115
+                           gsup_server_port,
116
+                           &gsup_client_mux_rx, NULL);
117
+   if (!gcm->gsup_client)
118
+       return -ENOMEM;
119
+   osmo_gsup_client_set_data(gcm->gsup_client, gcm);
120
+   return 0;
121
+}
122
+
123
+int gsup_client_mux_tx(struct gsup_client_mux *gcm, const struct osmo_gsup_message *gsup_msg)
124
+{
125
+   struct msgb *msg;
126
+   int rc;
127
+
128
+   if (!gcm || !gcm->gsup_client) {
129
+       LOGP(DLGSUP, LOGL_ERROR, "GSUP link is down, cannot send GSUP message\n");
130
+       return -ENOTSUP;
131
+   }
132
+
133
+   msg = osmo_gsup_client_msgb_alloc();
134
+   rc = osmo_gsup_encode(msg, gsup_msg);
135
+   if (rc < 0) {
136
+       LOGP(DLGSUP, LOGL_ERROR, "Failed to encode GSUP message: '%s'\n", strerror(-rc));
137
+       return rc;
138
+   }
139
+
140
+   return osmo_gsup_client_send(gcm->gsup_client, msg);
141
+}
142
+
143
+/* Set GSUP source_name to our local IPA name */
144
+void gsup_client_mux_tx_set_source(const struct gsup_client_mux *gcm,
145
+                  struct osmo_gsup_message *gsup_msg)
146
+{
147
+   const char *local_msc_name;
148
+   const struct ipaccess_unit *ipa_dev;
149
+
150
+   if (!gcm)
151
+       return;
152
+   if (!gcm->gsup_client)
153
+       return;
154
+   ipa_dev = osmo_gsup_client_get_ipaccess_unit(gcm->gsup_client);
155
+   if (!ipa_dev)
156
+       return;
157
+   local_msc_name = ipa_dev->serno;
158
+   if (!local_msc_name)
159
+       return;
160
+   gsup_msg->source_name = (const uint8_t *) local_msc_name;
161
+   gsup_msg->source_name_len = strlen(local_msc_name) + 1;
162
+}
163
+
164
+/* Transmit GSUP error in response to original message */
165
+void gsup_client_mux_tx_error_reply(struct gsup_client_mux *gcm, const struct osmo_gsup_message *gsup_orig,
166
+                   enum gsm48_gmm_cause cause)
167
+{
168
+   struct osmo_gsup_message gsup_reply;
169
+
170
+   /* No need to answer if we couldn't parse an ERROR message type, only REQUESTs need an error reply. */
171
+   if (!OSMO_GSUP_IS_MSGT_REQUEST(gsup_orig->message_type))
172
+       return;
173
+
174
+   gsup_reply = (struct osmo_gsup_message){
175
+       .cause = cause,
176
+       .message_type = OSMO_GSUP_TO_MSGT_ERROR(gsup_orig->message_type),
177
+       .message_class = gsup_orig->message_class,
178
+       .destination_name = gsup_orig->source_name,
179
+       .destination_name_len = gsup_orig->source_name_len,
180
+
181
+       /* RP-Message-Reference is mandatory for SM Service */
182
+       .sm_rp_mr = gsup_orig->sm_rp_mr,
183
+   };
184
+
185
+   OSMO_STRLCPY_ARRAY(gsup_reply.imsi, gsup_orig->imsi);
186
+   gsup_client_mux_tx_set_source(gcm, &gsup_reply);
187
+
188
+   /* For SS/USSD, it's important to keep both session state and ID IEs */
189
+   if (gsup_orig->session_state != OSMO_GSUP_SESSION_STATE_NONE) {
190
+       gsup_reply.session_state = OSMO_GSUP_SESSION_STATE_END;
191
+       gsup_reply.session_id = gsup_orig->session_id;
192
+   }
193
+
194
+   if (osmo_gsup_client_enc_send(gcm->gsup_client, &gsup_reply))
195
+       LOGP(DLGSUP, LOGL_ERROR, "Failed to send Error reply (imsi=%s)\n",
196
+            osmo_quote_str(gsup_orig->imsi, -1));
197
+}
198
osmo-hlr_1.8.0.tar.xz/src/gsupclient/gsup_req.c -> osmo-hlr_1.9.0.tar.xz/src/gsupclient/gsup_req.c Changed
10
 
1
@@ -2,6 +2,8 @@
2
  *
3
  * All Rights Reserved
4
  *
5
+ * SPDX-License-Identifier: GPL-2.0-or-later
6
+ *
7
  * This program is free software; you can redistribute it and/or modify
8
  * it under the terms of the GNU General Public License as published by
9
  * the Free Software Foundation; either version 2 of the License, or
10
osmo-hlr_1.8.0.tar.xz/src/hlr.c -> osmo-hlr_1.9.0.tar.xz/src/hlr.c Changed
53
 
1
@@ -204,23 +204,34 @@
2
 {
3
    char msisdnGSM23003_MSISDN_MAX_DIGITS + 1;
4
    int rc;
5
-   unsigned int rand_msisdn_len = g_hlr->subscr_create_on_demand_rand_msisdn_len;
6
 
7
-   if (!g_hlr->subscr_create_on_demand)
8
-       return -1;
9
    if (db_subscr_exists_by_imsi(g_hlr->dbc, imsi) == 0)
10
        return -1;
11
-   if (rand_msisdn_len && generate_new_msisdn(msisdn, imsi, rand_msisdn_len) != 0)
12
+
13
+   switch (g_hlr->subscr_create_on_demand.mode) {
14
+   case SUBSCR_COD_MODE_MSISDN_FROM_IMSI:
15
+       OSMO_STRLCPY_ARRAY(msisdn, imsi);
16
+       break;
17
+   case SUBSCR_COD_MODE_RAND_MSISDN:
18
+       if (generate_new_msisdn(msisdn, imsi, g_hlr->subscr_create_on_demand.rand_msisdn_len) != 0)
19
+           return -1;
20
+       break;
21
+   case SUBSCR_COD_MODE_NO_MSISDN:
22
+       msisdn0 = '\0';
23
+       break;
24
+   case SUBSCR_COD_MODE_DISABLED:
25
+   default:
26
        return -1;
27
+   }
28
 
29
    LOGP(DMAIN, LOGL_INFO, "IMSI='%s': Creating subscriber on demand\n", imsi);
30
-   rc = db_subscr_create(g_hlr->dbc, imsi, g_hlr->subscr_create_on_demand_flags);
31
+   rc = db_subscr_create(g_hlr->dbc, imsi, g_hlr->subscr_create_on_demand.flags);
32
    if (rc) {
33
        LOGP(DMAIN, LOGL_ERROR, "Failed to create subscriber on demand (rc=%d): IMSI='%s'\n", rc, imsi);
34
        return rc;
35
    }
36
 
37
-   if (!rand_msisdn_len)
38
+   if (msisdn0 == '\0')
39
        return 0;
40
 
41
    /* Update MSISDN of the new (just allocated) subscriber */
42
@@ -768,8 +779,8 @@
43
    g_hlr->db_file_path = talloc_strdup(g_hlr, HLR_DEFAULT_DB_FILE_PATH);
44
    g_hlr->mslookup.server.mdns.domain_suffix = talloc_strdup(g_hlr, OSMO_MDNS_DOMAIN_SUFFIX_DEFAULT);
45
    g_hlr->mslookup.client.mdns.domain_suffix = talloc_strdup(g_hlr, OSMO_MDNS_DOMAIN_SUFFIX_DEFAULT);
46
-   g_hlr->reject_cause = GMM_CAUSE_IMSI_UNKNOWN;
47
-   g_hlr->no_proxy_reject_cause = GMM_CAUSE_IMSI_UNKNOWN;
48
+   g_hlr->reject_cause = GMM_CAUSE_PLMN_NOTALLOWED;
49
+   g_hlr->no_proxy_reject_cause = GMM_CAUSE_NET_FAIL;
50
 
51
    /* Init default (call independent) SS session guard timeout value */
52
    g_hlr->ncss_guard_timeout = NCSS_GUARD_TIMEOUT_DEFAULT;
53
osmo-hlr_1.8.0.tar.xz/src/hlr_vty.c -> osmo-hlr_1.9.0.tar.xz/src/hlr_vty.c Changed
134
 
1
@@ -282,40 +282,55 @@
2
    return CMD_SUCCESS;
3
 }
4
 
5
+static void config_write_subscr_create_on_demand(struct vty *vty)
6
+{
7
+   const uint8_t flags = g_hlr->subscr_create_on_demand.flags;
8
+   const char *flags_str;
9
+
10
+   switch (g_hlr->subscr_create_on_demand.mode) {
11
+   case SUBSCR_COD_MODE_MSISDN_FROM_IMSI:
12
+       vty_out(vty, " subscriber-create-on-demand msisdn-from-imsi");
13
+       break;
14
+   case SUBSCR_COD_MODE_RAND_MSISDN:
15
+       vty_out(vty, " subscriber-create-on-demand %u",
16
+           g_hlr->subscr_create_on_demand.rand_msisdn_len);
17
+       break;
18
+   case SUBSCR_COD_MODE_NO_MSISDN:
19
+       vty_out(vty, " subscriber-create-on-demand no-msisdn");
20
+       break;
21
+   case SUBSCR_COD_MODE_DISABLED:
22
+   default:
23
+       vty_out(vty, " no subscriber-create-on-demand%s", VTY_NEWLINE);
24
+       return;
25
+   }
26
+
27
+   if ((flags & DB_SUBSCR_FLAG_NAM_CS) && (flags & DB_SUBSCR_FLAG_NAM_PS))
28
+       flags_str = "cs+ps";
29
+   else if (flags & DB_SUBSCR_FLAG_NAM_CS)
30
+       flags_str = "cs";
31
+   else if (flags & DB_SUBSCR_FLAG_NAM_PS)
32
+       flags_str = "ps";
33
+   else
34
+       flags_str = "none";
35
+   vty_out(vty, " %s%s", flags_str, VTY_NEWLINE);
36
+}
37
+
38
 
39
 static int config_write_hlr(struct vty *vty)
40
 {
41
    vty_out(vty, "hlr%s", VTY_NEWLINE);
42
 
43
-   if (g_hlr->reject_cause != GMM_CAUSE_IMSI_UNKNOWN)
44
-       vty_out(vty, " reject-cause not-found %s%s",
45
-           get_value_string_or_null(gsm48_gmm_cause_vty_names,
46
-                        (uint32_t) g_hlr->reject_cause), VTY_NEWLINE);
47
-   if (g_hlr->no_proxy_reject_cause != GMM_CAUSE_IMSI_UNKNOWN)
48
-       vty_out(vty, " reject-cause no-proxy %s%s",
49
-           get_value_string_or_null(gsm48_gmm_cause_vty_names,
50
-                        (uint32_t) g_hlr->no_proxy_reject_cause), VTY_NEWLINE);
51
+   vty_out(vty, " reject-cause not-found %s%s",
52
+       get_value_string_or_null(gsm48_gmm_cause_vty_names,
53
+                    (uint32_t) g_hlr->reject_cause), VTY_NEWLINE);
54
+   vty_out(vty, " reject-cause no-proxy %s%s",
55
+       get_value_string_or_null(gsm48_gmm_cause_vty_names,
56
+                    (uint32_t) g_hlr->no_proxy_reject_cause), VTY_NEWLINE);
57
    if (g_hlr->store_imei)
58
        vty_out(vty, " store-imei%s", VTY_NEWLINE);
59
    if (g_hlr->db_file_path && strcmp(g_hlr->db_file_path, HLR_DEFAULT_DB_FILE_PATH))
60
        vty_out(vty, " database %s%s", g_hlr->db_file_path, VTY_NEWLINE);
61
-   if (g_hlr->subscr_create_on_demand) {
62
-       const char *flags_str = "none";
63
-       uint8_t flags = g_hlr->subscr_create_on_demand_flags;
64
-       unsigned int rand_msisdn_len = g_hlr->subscr_create_on_demand_rand_msisdn_len;
65
-
66
-       if ((flags & DB_SUBSCR_FLAG_NAM_CS) && (flags & DB_SUBSCR_FLAG_NAM_PS))
67
-           flags_str = "cs+ps";
68
-       else if (flags & DB_SUBSCR_FLAG_NAM_CS)
69
-           flags_str = "cs";
70
-       else if (flags & DB_SUBSCR_FLAG_NAM_PS)
71
-           flags_str = "ps";
72
-
73
-       if (rand_msisdn_len)
74
-           vty_out(vty, " subscriber-create-on-demand %i %s%s", rand_msisdn_len, flags_str, VTY_NEWLINE);
75
-       else
76
-           vty_out(vty, " subscriber-create-on-demand no-msisdn %s%s", flags_str, VTY_NEWLINE);
77
-   }
78
+   config_write_subscr_create_on_demand(vty);
79
    return CMD_SUCCESS;
80
 }
81
 
82
@@ -796,29 +811,37 @@
83
 }
84
 
85
 DEFUN(cfg_subscr_create_on_demand, cfg_subscr_create_on_demand_cmd,
86
-   "subscriber-create-on-demand (no-msisdn|<3-15>) (none|cs|ps|cs+ps)",
87
+   "subscriber-create-on-demand (no-msisdn|msisdn-from-imsi|<3-15>) (none|cs|ps|cs+ps)",
88
    "Make a new record when a subscriber is first seen.\n"
89
    "Do not automatically assign MSISDN.\n"
90
+   "Assign MSISDN identical to subscriber's IMSI.\n"
91
    "Length of an automatically assigned MSISDN.\n"
92
    "Do not allow any NAM (Network Access Mode) by default.\n"
93
    "Allow access to circuit switched NAM by default.\n"
94
    "Allow access to packet switched NAM by default.\n"
95
    "Allow access to circuit and packet switched NAM by default.\n")
96
 {
97
+   enum subscr_create_on_demand_mode mode;
98
    unsigned int rand_msisdn_len = 0;
99
    uint8_t flags = 0x00;
100
 
101
-   if (strcmp(argv0, "no-msisdn") != 0)
102
+   if (strcmp(argv0, "no-msisdn") == 0) {
103
+       mode = SUBSCR_COD_MODE_NO_MSISDN;
104
+   } else if (strcmp(argv0, "msisdn-from-imsi") == 0) {
105
+       mode = SUBSCR_COD_MODE_MSISDN_FROM_IMSI;
106
+   } else { /* random MSISDN */
107
+       mode = SUBSCR_COD_MODE_RAND_MSISDN;
108
        rand_msisdn_len = atoi(argv0);
109
+   }
110
 
111
    if (strstr(argv1, "cs"))
112
        flags |= DB_SUBSCR_FLAG_NAM_CS;
113
    if (strstr(argv1, "ps"))
114
        flags |= DB_SUBSCR_FLAG_NAM_PS;
115
 
116
-   g_hlr->subscr_create_on_demand = true;
117
-   g_hlr->subscr_create_on_demand_rand_msisdn_len = rand_msisdn_len;
118
-   g_hlr->subscr_create_on_demand_flags = flags;
119
+   g_hlr->subscr_create_on_demand.mode = mode;
120
+   g_hlr->subscr_create_on_demand.rand_msisdn_len = rand_msisdn_len;
121
+   g_hlr->subscr_create_on_demand.flags = flags;
122
 
123
    return CMD_SUCCESS;
124
 }
125
@@ -827,7 +850,7 @@
126
    "no subscriber-create-on-demand",
127
    "Do not make a new record when a subscriber is first seen.\n")
128
 {
129
-   g_hlr->subscr_create_on_demand = false;
130
+   g_hlr->subscr_create_on_demand.mode = SUBSCR_COD_MODE_DISABLED;
131
    return CMD_SUCCESS;
132
 }
133
 
134
osmo-hlr_1.8.0.tar.xz/src/remote_hlr.c -> osmo-hlr_1.9.0.tar.xz/src/remote_hlr.c Changed
46
 
1
@@ -20,7 +20,7 @@
2
 #include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
3
 #include <osmocom/gsm/gsup.h>
4
 #include <osmocom/gsm/gsm23003.h>
5
-#include <osmocom/abis/ipa.h>
6
+#include <osmocom/gsm/ipa.h>
7
 #include <osmocom/gsupclient/gsup_client.h>
8
 #include <osmocom/hlr/logging.h>
9
 #include <osmocom/hlr/hlr.h>
10
@@ -66,7 +66,7 @@
11
  * The local MSC shall be indicated by gsup.destination_name. */
12
 static int remote_hlr_rx(struct osmo_gsup_client *gsupc, struct msgb *msg)
13
 {
14
-   struct remote_hlr *rh = gsupc->data;
15
+   struct remote_hlr *rh = osmo_gsup_client_get_data(gsupc);
16
    struct proxy_subscr proxy_subscr;
17
    struct osmo_gsup_message gsup;
18
    int rc;
19
@@ -108,7 +108,7 @@
20
 
21
 static bool remote_hlr_up_down(struct osmo_gsup_client *gsupc, bool up)
22
 {
23
-   struct remote_hlr *remote_hlr = gsupc->data;
24
+   struct remote_hlr *remote_hlr = osmo_gsup_client_get_data(gsupc);
25
    struct remote_hlr_pending_up *p, *n;
26
    if (!up) {
27
        LOG_REMOTE_HLR(remote_hlr, LOGL_NOTICE, "link to remote HLR is down, removing GSUP client\n");
28
@@ -127,7 +127,7 @@
29
 
30
 bool remote_hlr_is_up(struct remote_hlr *remote_hlr)
31
 {
32
-   return remote_hlr && remote_hlr->gsupc && remote_hlr->gsupc->is_connected;
33
+   return remote_hlr && remote_hlr->gsupc && osmo_gsup_client_is_connected(remote_hlr->gsupc);
34
 }
35
 
36
 struct remote_hlr *remote_hlr_get_or_connect(const struct osmo_sockaddr_str *addr, bool connect,
37
@@ -180,7 +180,7 @@
38
        return NULL;
39
    }
40
 
41
-   rh->gsupc->data = rh;
42
+   osmo_gsup_client_set_data(rh->gsupc, rh);
43
    llist_add(&rh->entry, &remote_hlrs);
44
 
45
 add_result_cb:
46
osmo-hlr_1.8.0.tar.xz/tests/test_nodes.vty -> osmo-hlr_1.9.0.tar.xz/tests/test_nodes.vty Changed
22
 
1
@@ -73,7 +73,7 @@
2
   reject-cause (not-found|no-proxy) (imsi-unknown|illegal-ms|plmn-not-allowed|la-not-allowed|roaming-not-allowed|no-suitable-cell-in-la|net-fail|congestion|auth-unacceptable|proto-error-unspec)
3
   store-imei
4
   no store-imei
5
-  subscriber-create-on-demand (no-msisdn|<3-15>) (none|cs|ps|cs+ps)
6
+  subscriber-create-on-demand (no-msisdn|msisdn-from-imsi|<3-15>) (none|cs|ps|cs+ps)
7
   no subscriber-create-on-demand
8
 
9
 OsmoHLR(config-hlr)# gsup
10
@@ -113,8 +113,11 @@
11
  logging level dgsm notice
12
 ...
13
 hlr
14
+ reject-cause not-found plmn-not-allowed
15
+ reject-cause no-proxy net-fail
16
  store-imei
17
  database hlr_vty_test.db
18
+ no subscriber-create-on-demand
19
  gsup
20
   bind ip 127.0.0.1
21
   ipa-name unnamed-HLR
22
osmo-hlr_1.8.0.tar.xz/tests/test_subscr_create_on_demand.vty -> osmo-hlr_1.9.0.tar.xz/tests/test_subscr_create_on_demand.vty Changed
16
 
1
@@ -10,6 +10,14 @@
2
  subscriber-create-on-demand no-msisdn none
3
 ...
4
 
5
+OsmoHLR(config-hlr)# subscriber-create-on-demand msisdn-from-imsi cs+ps
6
+OsmoHLR(config-hlr)# show running-config
7
+...
8
+hlr
9
+...
10
+ subscriber-create-on-demand msisdn-from-imsi cs+ps
11
+...
12
+
13
 OsmoHLR(config-hlr)# subscriber-create-on-demand 3 none
14
 OsmoHLR(config-hlr)# show running-config
15
 ...
16