blob: e959be89f1f815a422b31028cb638b7667d1ad56 [file] [log] [blame]
Neels Hofmeyr7685a782017-01-30 23:30:26 +01001/* OsmoHLR VTY implementation */
2
3/* (C) 2016 sysmocom s.f.m.c. GmbH <info@sysmocom.de>
Neels Hofmeyr7685a782017-01-30 23:30:26 +01004 * Author: Neels Hofmeyr <nhofmeyr@sysmocom.de>
Harald Weltefa7ee332018-06-24 13:20:32 +02005 * (C) 2018 Harald Welte <laforge@gnumonks.org>
6 *
7 * All Rights Reserved
Neels Hofmeyr7685a782017-01-30 23:30:26 +01008 *
Harald Welte4956ae12018-06-15 22:04:28 +02009 * (C) 2018 Harald Welte <laforge@gnumonks.org>
10 *
11 * All Rights Reserved
12 *
Neels Hofmeyr7685a782017-01-30 23:30:26 +010013 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU Affero General Public License as published by
15 * the Free Software Foundation; either version 3 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Affero General Public License for more details.
22 *
23 * You should have received a copy of the GNU Affero General Public License
24 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 *
26 */
27
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +020028#include <osmocom/core/talloc.h>
Neels Hofmeyr7685a782017-01-30 23:30:26 +010029#include <osmocom/vty/vty.h>
Max20ddfdb2019-02-18 13:12:27 +010030#include <osmocom/vty/stats.h>
Neels Hofmeyr7685a782017-01-30 23:30:26 +010031#include <osmocom/vty/command.h>
32#include <osmocom/vty/logging.h>
Harald Welte7ee6e552018-02-14 00:52:05 +010033#include <osmocom/vty/misc.h>
Harald Weltefa7ee332018-06-24 13:20:32 +020034#include <osmocom/abis/ipa.h>
Neels Hofmeyr7685a782017-01-30 23:30:26 +010035
Neels Hofmeyr2f758032019-11-20 00:37:07 +010036#include <osmocom/hlr/db.h>
37#include <osmocom/hlr/hlr.h>
38#include <osmocom/hlr/hlr_vty.h>
39#include <osmocom/hlr/hlr_vty_subscr.h>
40#include <osmocom/hlr/hlr_ussd.h>
41#include <osmocom/hlr/gsup_server.h>
Neels Hofmeyr7685a782017-01-30 23:30:26 +010042
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +020043struct cmd_node hlr_node = {
44 HLR_NODE,
45 "%s(config-hlr)# ",
46 1,
47};
48
49DEFUN(cfg_hlr,
50 cfg_hlr_cmd,
51 "hlr",
52 "Configure the HLR")
53{
54 vty->node = HLR_NODE;
55 return CMD_SUCCESS;
56}
57
58struct cmd_node gsup_node = {
59 GSUP_NODE,
60 "%s(config-hlr-gsup)# ",
61 1,
62};
63
64DEFUN(cfg_gsup,
65 cfg_gsup_cmd,
66 "gsup",
67 "Configure GSUP options")
68{
69 vty->node = GSUP_NODE;
70 return CMD_SUCCESS;
71}
72
73static int config_write_hlr(struct vty *vty)
74{
75 vty_out(vty, "hlr%s", VTY_NEWLINE);
Oliver Smith851814a2019-01-11 15:30:21 +010076 if (g_hlr->store_imei)
77 vty_out(vty, " store-imei%s", VTY_NEWLINE);
Neels Hofmeyr5857c592019-04-02 04:24:49 +020078 if (g_hlr->db_file_path && strcmp(g_hlr->db_file_path, HLR_DEFAULT_DB_FILE_PATH))
79 vty_out(vty, " database %s%s", g_hlr->db_file_path, VTY_NEWLINE);
Oliver Smithc7f17872019-03-04 15:10:44 +010080 if (g_hlr->subscr_create_on_demand) {
81 const char *flags_str = "none";
82 uint8_t flags = g_hlr->subscr_create_on_demand_flags;
83 unsigned int rand_msisdn_len = g_hlr->subscr_create_on_demand_rand_msisdn_len;
84
85 if ((flags & DB_SUBSCR_FLAG_NAM_CS) && (flags & DB_SUBSCR_FLAG_NAM_PS))
86 flags_str = "cs+ps";
87 else if (flags & DB_SUBSCR_FLAG_NAM_CS)
88 flags_str = "cs";
89 else if (flags & DB_SUBSCR_FLAG_NAM_PS)
90 flags_str = "ps";
91
92 if (rand_msisdn_len)
93 vty_out(vty, " subscriber-create-on-demand %i %s%s", rand_msisdn_len, flags_str, VTY_NEWLINE);
94 else
95 vty_out(vty, " subscriber-create-on-demand no-msisdn %s%s", flags_str, VTY_NEWLINE);
96 }
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +020097 return CMD_SUCCESS;
98}
99
100static int config_write_hlr_gsup(struct vty *vty)
101{
102 vty_out(vty, " gsup%s", VTY_NEWLINE);
103 if (g_hlr->gsup_bind_addr)
104 vty_out(vty, " bind ip %s%s", g_hlr->gsup_bind_addr, VTY_NEWLINE);
105 return CMD_SUCCESS;
106}
107
Harald Weltefa7ee332018-06-24 13:20:32 +0200108static void show_one_conn(struct vty *vty, const struct osmo_gsup_conn *conn)
109{
110 const struct ipa_server_conn *isc = conn->conn;
111 char *name;
112 int rc;
113
114 rc = osmo_gsup_conn_ccm_get(conn, (uint8_t **) &name, IPAC_IDTAG_SERNR);
115 OSMO_ASSERT(rc);
116
117 vty_out(vty, " '%s' from %s:%5u, CS=%u, PS=%u, 3G_IND=%u%s",
118 name, isc->addr, isc->port, conn->supports_cs, conn->supports_ps, conn->auc_3g_ind,
119 VTY_NEWLINE);
120}
121
122DEFUN(show_gsup_conn, show_gsup_conn_cmd,
123 "show gsup-connections",
124 SHOW_STR "GSUP Connections from VLRs, SGSNs, EUSEs\n")
125{
126 struct osmo_gsup_server *gs = g_hlr->gs;
127 struct osmo_gsup_conn *conn;
128
129 llist_for_each_entry(conn, &gs->clients, list)
130 show_one_conn(vty, conn);
131
132 return CMD_SUCCESS;
133}
134
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200135DEFUN(cfg_hlr_gsup_bind_ip,
136 cfg_hlr_gsup_bind_ip_cmd,
137 "bind ip A.B.C.D",
138 "Listen/Bind related socket option\n"
139 IP_STR
140 "IPv4 Address to bind the GSUP interface to\n")
141{
142 if(g_hlr->gsup_bind_addr)
143 talloc_free(g_hlr->gsup_bind_addr);
144 g_hlr->gsup_bind_addr = talloc_strdup(g_hlr, argv[0]);
145
146 return CMD_SUCCESS;
147}
148
Neels Hofmeyr76328bd2019-11-20 03:35:37 +0100149DEFUN(cfg_hlr_gsup_ipa_name,
150 cfg_hlr_gsup_ipa_name_cmd,
151 "ipa-name NAME",
152 "Set the IPA name of this HLR, for proxying to remote HLRs\n"
153 "A globally unique name for this HLR. For example: PLMN + redundancy server number: HLR-901-70-0. "
154 "This name is used for GSUP routing and must be set if multiple HLRs interconnect (e.g. mslookup "
155 "for Distributed GSM).\n")
156{
157 if (vty->type != VTY_FILE) {
158 vty_out(vty, "gsup/ipa-name: The GSUP IPA name cannot be changed at run-time; "
159 "It can only be set in the configuraton file.%s", VTY_NEWLINE);
160 return CMD_WARNING;
161 }
162
163 g_hlr->gsup_unit_name.serno = talloc_strdup(g_hlr, argv[0]);
164 return CMD_SUCCESS;
165}
166
Harald Welte4956ae12018-06-15 22:04:28 +0200167/***********************************************************************
Harald Weltedab544e2018-07-29 16:14:48 +0200168 * USSD Entity
Harald Welte4956ae12018-06-15 22:04:28 +0200169 ***********************************************************************/
170
Neels Hofmeyr2f758032019-11-20 00:37:07 +0100171#include <osmocom/hlr/hlr_ussd.h>
Harald Welte4956ae12018-06-15 22:04:28 +0200172
Harald Weltedab544e2018-07-29 16:14:48 +0200173#define USSD_STR "USSD Configuration\n"
174#define UROUTE_STR "Routing Configuration\n"
175#define PREFIX_STR "Prefix-Matching Route\n" "USSD Prefix\n"
Harald Welte4956ae12018-06-15 22:04:28 +0200176
Harald Weltedab544e2018-07-29 16:14:48 +0200177#define INT_CHOICE "(own-msisdn|own-imsi)"
178#define INT_STR "Internal USSD Handler\n" \
179 "Respond with subscribers' own MSISDN\n" \
180 "Respond with subscribers' own IMSI\n"
181
182#define EXT_STR "External USSD Handler\n" \
183 "Name of External USSD Handler (IPA CCM ID)\n"
184
185DEFUN(cfg_ussd_route_pfx_int, cfg_ussd_route_pfx_int_cmd,
186 "ussd route prefix PREFIX internal " INT_CHOICE,
187 USSD_STR UROUTE_STR PREFIX_STR INT_STR)
188{
189 const struct hlr_iuse *iuse = iuse_find(argv[1]);
190 struct hlr_ussd_route *rt = ussd_route_find_prefix(g_hlr, argv[0]);
Harald Welte4956ae12018-06-15 22:04:28 +0200191 if (rt) {
192 vty_out(vty, "%% Cannot add [another?] route for prefix %s%s", argv[0], VTY_NEWLINE);
193 return CMD_WARNING;
194 }
Harald Weltedab544e2018-07-29 16:14:48 +0200195 ussd_route_prefix_alloc_int(g_hlr, argv[0], iuse);
Harald Welte4956ae12018-06-15 22:04:28 +0200196
197 return CMD_SUCCESS;
198}
199
Harald Weltedab544e2018-07-29 16:14:48 +0200200DEFUN(cfg_ussd_route_pfx_ext, cfg_ussd_route_pfx_ext_cmd,
201 "ussd route prefix PREFIX external EUSE",
202 USSD_STR UROUTE_STR PREFIX_STR EXT_STR)
Harald Welte4956ae12018-06-15 22:04:28 +0200203{
Harald Weltedab544e2018-07-29 16:14:48 +0200204 struct hlr_euse *euse = euse_find(g_hlr, argv[1]);
205 struct hlr_ussd_route *rt = ussd_route_find_prefix(g_hlr, argv[0]);
206 if (rt) {
207 vty_out(vty, "%% Cannot add [another?] route for prefix %s%s", argv[0], VTY_NEWLINE);
208 return CMD_WARNING;
209 }
210 if (!euse) {
211 vty_out(vty, "%% Cannot find euse '%s'%s", argv[1], VTY_NEWLINE);
212 return CMD_WARNING;
213 }
214 ussd_route_prefix_alloc_ext(g_hlr, argv[0], euse);
215
216 return CMD_SUCCESS;
217}
218
219DEFUN(cfg_ussd_no_route_pfx, cfg_ussd_no_route_pfx_cmd,
220 "no ussd route prefix PREFIX",
221 NO_STR USSD_STR UROUTE_STR PREFIX_STR)
222{
223 struct hlr_ussd_route *rt = ussd_route_find_prefix(g_hlr, argv[0]);
Harald Welte4956ae12018-06-15 22:04:28 +0200224 if (!rt) {
225 vty_out(vty, "%% Cannot find route for prefix %s%s", argv[0], VTY_NEWLINE);
226 return CMD_WARNING;
227 }
Harald Weltedab544e2018-07-29 16:14:48 +0200228 ussd_route_del(rt);
Harald Welte4956ae12018-06-15 22:04:28 +0200229
230 return CMD_SUCCESS;
231}
232
Harald Weltedab544e2018-07-29 16:14:48 +0200233DEFUN(cfg_ussd_defaultroute, cfg_ussd_defaultroute_cmd,
234 "ussd default-route external EUSE",
235 USSD_STR "Configure default-route for all USSD to unknown destinations\n"
236 EXT_STR)
Harald Welte4956ae12018-06-15 22:04:28 +0200237{
Vadim Yanitskiyb93c44f2018-08-02 23:37:51 +0700238 struct hlr_euse *euse;
239
240 euse = euse_find(g_hlr, argv[0]);
241 if (!euse) {
242 vty_out(vty, "%% Cannot find EUSE %s%s", argv[0], VTY_NEWLINE);
243 return CMD_WARNING;
244 }
Harald Welte4956ae12018-06-15 22:04:28 +0200245
246 if (g_hlr->euse_default != euse) {
247 vty_out(vty, "Switching default route from %s to %s%s",
Harald Welte55d32a12018-07-30 17:26:35 +0200248 g_hlr->euse_default ? g_hlr->euse_default->name : "<none>",
249 euse->name, VTY_NEWLINE);
Harald Welte4956ae12018-06-15 22:04:28 +0200250 g_hlr->euse_default = euse;
251 }
252
253 return CMD_SUCCESS;
254}
255
Harald Weltedab544e2018-07-29 16:14:48 +0200256DEFUN(cfg_ussd_no_defaultroute, cfg_ussd_no_defaultroute_cmd,
257 "no ussd default-route",
258 NO_STR USSD_STR "Remove the default-route for all USSD to unknown destinations\n")
Harald Welte4956ae12018-06-15 22:04:28 +0200259{
Harald Welte4956ae12018-06-15 22:04:28 +0200260 g_hlr->euse_default = NULL;
261
262 return CMD_SUCCESS;
263}
264
Neels Hofmeyr5857c592019-04-02 04:24:49 +0200265DEFUN(cfg_database, cfg_database_cmd,
266 "database PATH",
267 "Set the path to the HLR database file\n"
268 "Relative or absolute file system path to the database file (default is '" HLR_DEFAULT_DB_FILE_PATH "')\n")
269{
270 osmo_talloc_replace_string(g_hlr, &g_hlr->db_file_path, argv[0]);
271 return CMD_SUCCESS;
272}
273
Harald Welte4956ae12018-06-15 22:04:28 +0200274struct cmd_node euse_node = {
275 EUSE_NODE,
276 "%s(config-hlr-euse)# ",
277 1,
278};
279
280DEFUN(cfg_euse, cfg_euse_cmd,
281 "euse NAME",
282 "Configure a particular External USSD Entity\n"
283 "Alphanumeric name of the External USSD Entity\n")
284{
285 struct hlr_euse *euse;
286 const char *id = argv[0];
287
288 euse = euse_find(g_hlr, id);
289 if (!euse) {
290 euse = euse_alloc(g_hlr, id);
291 if (!euse)
292 return CMD_WARNING;
293 }
294 vty->index = euse;
295 vty->index_sub = &euse->description;
296 vty->node = EUSE_NODE;
297
298 return CMD_SUCCESS;
299}
300
301DEFUN(cfg_no_euse, cfg_no_euse_cmd,
302 "no euse NAME",
303 NO_STR "Remove a particular External USSD Entity\n"
304 "Alphanumeric name of the External USSD Entity\n")
305{
306 struct hlr_euse *euse = euse_find(g_hlr, argv[0]);
307 if (!euse) {
308 vty_out(vty, "%% Cannot remove non-existant EUSE %s%s", argv[0], VTY_NEWLINE);
309 return CMD_WARNING;
310 }
311 if (g_hlr->euse_default == euse) {
312 vty_out(vty, "%% Cannot remove EUSE %s, it is the default route%s", argv[0], VTY_NEWLINE);
313 return CMD_WARNING;
314 }
315 euse_del(euse);
316 return CMD_SUCCESS;
317}
318
319static void dump_one_euse(struct vty *vty, struct hlr_euse *euse)
320{
Harald Welte4956ae12018-06-15 22:04:28 +0200321 vty_out(vty, " euse %s%s", euse->name, VTY_NEWLINE);
Harald Welte4956ae12018-06-15 22:04:28 +0200322}
323
324static int config_write_euse(struct vty *vty)
325{
326 struct hlr_euse *euse;
Harald Weltedab544e2018-07-29 16:14:48 +0200327 struct hlr_ussd_route *rt;
Harald Welte4956ae12018-06-15 22:04:28 +0200328
329 llist_for_each_entry(euse, &g_hlr->euse_list, list)
330 dump_one_euse(vty, euse);
331
Harald Weltedab544e2018-07-29 16:14:48 +0200332 llist_for_each_entry(rt, &g_hlr->ussd_routes, list) {
333 vty_out(vty, " ussd route prefix %s %s %s%s", rt->prefix,
334 rt->is_external ? "external" : "internal",
335 rt->is_external ? rt->u.euse->name : rt->u.iuse->name,
336 VTY_NEWLINE);
337 }
338
339 if (g_hlr->euse_default)
340 vty_out(vty, " ussd default-route external %s%s", g_hlr->euse_default->name, VTY_NEWLINE);
341
Vadim Yanitskiyd157a562018-12-01 00:03:39 +0700342 if (g_hlr->ncss_guard_timeout != NCSS_GUARD_TIMEOUT_DEFAULT)
343 vty_out(vty, " ncss-guard-timeout %i%s",
344 g_hlr->ncss_guard_timeout, VTY_NEWLINE);
345
Harald Welte4956ae12018-06-15 22:04:28 +0200346 return 0;
347}
348
Vadim Yanitskiyd157a562018-12-01 00:03:39 +0700349DEFUN(cfg_ncss_guard_timeout, cfg_ncss_guard_timeout_cmd,
350 "ncss-guard-timeout <0-255>",
351 "Set guard timer for NCSS (call independent SS) session activity\n"
352 "Guard timer value (sec.), or 0 to disable")
353{
354 g_hlr->ncss_guard_timeout = atoi(argv[0]);
355 return CMD_SUCCESS;
356}
357
Oliver Smith851814a2019-01-11 15:30:21 +0100358DEFUN(cfg_store_imei, cfg_store_imei_cmd,
359 "store-imei",
360 "Save the IMEI in the database when receiving Check IMEI requests. Note that an MSC does not necessarily send"
361 " Check IMEI requests (for OsmoMSC, you may want to set 'check-imei-rqd 1').")
362{
363 g_hlr->store_imei = true;
364 return CMD_SUCCESS;
365}
366
367DEFUN(cfg_no_store_imei, cfg_no_store_imei_cmd,
368 "no store-imei",
369 "Do not save the IMEI in the database, when receiving Check IMEI requests.")
370{
371 g_hlr->store_imei = false;
372 return CMD_SUCCESS;
373}
374
Oliver Smithc7f17872019-03-04 15:10:44 +0100375DEFUN(cfg_subscr_create_on_demand, cfg_subscr_create_on_demand_cmd,
376 "subscriber-create-on-demand (no-msisdn|<3-15>) (none|cs|ps|cs+ps)",
377 "Make a new record when a subscriber is first seen.\n"
378 "Do not automatically assign MSISDN.\n"
379 "Length of an automatically assigned MSISDN.\n"
380 "Do not allow any NAM (Network Access Mode) by default.\n"
381 "Allow access to circuit switched NAM by default.\n"
382 "Allow access to packet switched NAM by default.\n"
383 "Allow access to circuit and packet switched NAM by default.\n")
384{
385 unsigned int rand_msisdn_len = 0;
386 uint8_t flags = 0x00;
387
388 if (strcmp(argv[0], "no-msisdn") != 0)
389 rand_msisdn_len = atoi(argv[0]);
390
391 if (strstr(argv[1], "cs"))
392 flags |= DB_SUBSCR_FLAG_NAM_CS;
393 if (strstr(argv[1], "ps"))
394 flags |= DB_SUBSCR_FLAG_NAM_PS;
395
396 g_hlr->subscr_create_on_demand = true;
397 g_hlr->subscr_create_on_demand_rand_msisdn_len = rand_msisdn_len;
398 g_hlr->subscr_create_on_demand_flags = flags;
399
400 return CMD_SUCCESS;
401}
402
403DEFUN(cfg_no_subscr_create_on_demand, cfg_no_subscr_create_on_demand_cmd,
404 "no subscriber-create-on-demand",
405 "Do not make a new record when a subscriber is first seen.\n")
406{
407 g_hlr->subscr_create_on_demand = false;
408 return CMD_SUCCESS;
409}
410
Harald Welte4956ae12018-06-15 22:04:28 +0200411/***********************************************************************
412 * Common Code
413 ***********************************************************************/
414
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200415int hlr_vty_go_parent(struct vty *vty)
416{
417 switch (vty->node) {
418 case GSUP_NODE:
Harald Welte4956ae12018-06-15 22:04:28 +0200419 case EUSE_NODE:
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200420 vty->node = HLR_NODE;
421 vty->index = NULL;
Harald Welte4956ae12018-06-15 22:04:28 +0200422 vty->index_sub = NULL;
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200423 break;
424 default:
425 case HLR_NODE:
426 vty->node = CONFIG_NODE;
427 vty->index = NULL;
428 break;
429 case CONFIG_NODE:
430 vty->node = ENABLE_NODE;
431 vty->index = NULL;
432 break;
433 }
434
435 return vty->node;
436}
437
Neels Hofmeyr7685a782017-01-30 23:30:26 +0100438int hlr_vty_is_config_node(struct vty *vty, int node)
439{
440 switch (node) {
441 /* add items that are not config */
442 case CONFIG_NODE:
443 return 0;
444
445 default:
446 return 1;
447 }
448}
449
Pau Espin Pedrole49391b2019-08-05 15:57:10 +0200450void hlr_vty_init(void)
Neels Hofmeyr7685a782017-01-30 23:30:26 +0100451{
Pau Espin Pedrole49391b2019-08-05 15:57:10 +0200452 logging_vty_add_cmds();
Harald Welte7ee6e552018-02-14 00:52:05 +0100453 osmo_talloc_vty_add_cmds();
Max20ddfdb2019-02-18 13:12:27 +0100454 osmo_stats_vty_add_cmds();
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200455
Harald Weltefa7ee332018-06-24 13:20:32 +0200456 install_element_ve(&show_gsup_conn_cmd);
457
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200458 install_element(CONFIG_NODE, &cfg_hlr_cmd);
459 install_node(&hlr_node, config_write_hlr);
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200460
461 install_element(HLR_NODE, &cfg_gsup_cmd);
462 install_node(&gsup_node, config_write_hlr_gsup);
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200463
464 install_element(GSUP_NODE, &cfg_hlr_gsup_bind_ip_cmd);
Neels Hofmeyr76328bd2019-11-20 03:35:37 +0100465 install_element(GSUP_NODE, &cfg_hlr_gsup_ipa_name_cmd);
Neels Hofmeyr183e7002017-10-06 02:59:54 +0200466
Neels Hofmeyr5857c592019-04-02 04:24:49 +0200467 install_element(HLR_NODE, &cfg_database_cmd);
468
Harald Welte4956ae12018-06-15 22:04:28 +0200469 install_element(HLR_NODE, &cfg_euse_cmd);
470 install_element(HLR_NODE, &cfg_no_euse_cmd);
471 install_node(&euse_node, config_write_euse);
Harald Weltedab544e2018-07-29 16:14:48 +0200472 install_element(HLR_NODE, &cfg_ussd_route_pfx_int_cmd);
473 install_element(HLR_NODE, &cfg_ussd_route_pfx_ext_cmd);
474 install_element(HLR_NODE, &cfg_ussd_no_route_pfx_cmd);
475 install_element(HLR_NODE, &cfg_ussd_defaultroute_cmd);
476 install_element(HLR_NODE, &cfg_ussd_no_defaultroute_cmd);
Vadim Yanitskiyd157a562018-12-01 00:03:39 +0700477 install_element(HLR_NODE, &cfg_ncss_guard_timeout_cmd);
Oliver Smith851814a2019-01-11 15:30:21 +0100478 install_element(HLR_NODE, &cfg_store_imei_cmd);
479 install_element(HLR_NODE, &cfg_no_store_imei_cmd);
Oliver Smithc7f17872019-03-04 15:10:44 +0100480 install_element(HLR_NODE, &cfg_subscr_create_on_demand_cmd);
481 install_element(HLR_NODE, &cfg_no_subscr_create_on_demand_cmd);
Harald Welte4956ae12018-06-15 22:04:28 +0200482
Harald Welted5807b82018-07-29 12:27:41 +0200483 hlr_vty_subscriber_init();
Neels Hofmeyr7685a782017-01-30 23:30:26 +0100484}