blob: 4b91aa94cb455a8ec67bacdaf77449c4533b8fcc [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
Vadim Yanitskiydac855e2020-11-17 04:17:46 +0700177#define INT_CHOICE "(own-msisdn|own-imsi|test-idle)"
Harald Weltedab544e2018-07-29 16:14:48 +0200178#define INT_STR "Internal USSD Handler\n" \
179 "Respond with subscribers' own MSISDN\n" \
Vadim Yanitskiydac855e2020-11-17 04:17:46 +0700180 "Respond with subscribers' own IMSI\n" \
181 "Keep the session idle (useful for testing)\n"
Harald Weltedab544e2018-07-29 16:14:48 +0200182
183#define EXT_STR "External USSD Handler\n" \
184 "Name of External USSD Handler (IPA CCM ID)\n"
185
186DEFUN(cfg_ussd_route_pfx_int, cfg_ussd_route_pfx_int_cmd,
187 "ussd route prefix PREFIX internal " INT_CHOICE,
188 USSD_STR UROUTE_STR PREFIX_STR INT_STR)
189{
190 const struct hlr_iuse *iuse = iuse_find(argv[1]);
191 struct hlr_ussd_route *rt = ussd_route_find_prefix(g_hlr, argv[0]);
Harald Welte4956ae12018-06-15 22:04:28 +0200192 if (rt) {
193 vty_out(vty, "%% Cannot add [another?] route for prefix %s%s", argv[0], VTY_NEWLINE);
194 return CMD_WARNING;
195 }
Harald Weltedab544e2018-07-29 16:14:48 +0200196 ussd_route_prefix_alloc_int(g_hlr, argv[0], iuse);
Harald Welte4956ae12018-06-15 22:04:28 +0200197
198 return CMD_SUCCESS;
199}
200
Harald Weltedab544e2018-07-29 16:14:48 +0200201DEFUN(cfg_ussd_route_pfx_ext, cfg_ussd_route_pfx_ext_cmd,
202 "ussd route prefix PREFIX external EUSE",
203 USSD_STR UROUTE_STR PREFIX_STR EXT_STR)
Harald Welte4956ae12018-06-15 22:04:28 +0200204{
Harald Weltedab544e2018-07-29 16:14:48 +0200205 struct hlr_euse *euse = euse_find(g_hlr, argv[1]);
206 struct hlr_ussd_route *rt = ussd_route_find_prefix(g_hlr, argv[0]);
207 if (rt) {
208 vty_out(vty, "%% Cannot add [another?] route for prefix %s%s", argv[0], VTY_NEWLINE);
209 return CMD_WARNING;
210 }
211 if (!euse) {
212 vty_out(vty, "%% Cannot find euse '%s'%s", argv[1], VTY_NEWLINE);
213 return CMD_WARNING;
214 }
215 ussd_route_prefix_alloc_ext(g_hlr, argv[0], euse);
216
217 return CMD_SUCCESS;
218}
219
220DEFUN(cfg_ussd_no_route_pfx, cfg_ussd_no_route_pfx_cmd,
221 "no ussd route prefix PREFIX",
222 NO_STR USSD_STR UROUTE_STR PREFIX_STR)
223{
224 struct hlr_ussd_route *rt = ussd_route_find_prefix(g_hlr, argv[0]);
Harald Welte4956ae12018-06-15 22:04:28 +0200225 if (!rt) {
226 vty_out(vty, "%% Cannot find route for prefix %s%s", argv[0], VTY_NEWLINE);
227 return CMD_WARNING;
228 }
Harald Weltedab544e2018-07-29 16:14:48 +0200229 ussd_route_del(rt);
Harald Welte4956ae12018-06-15 22:04:28 +0200230
231 return CMD_SUCCESS;
232}
233
Harald Weltedab544e2018-07-29 16:14:48 +0200234DEFUN(cfg_ussd_defaultroute, cfg_ussd_defaultroute_cmd,
235 "ussd default-route external EUSE",
236 USSD_STR "Configure default-route for all USSD to unknown destinations\n"
237 EXT_STR)
Harald Welte4956ae12018-06-15 22:04:28 +0200238{
Vadim Yanitskiyb93c44f2018-08-02 23:37:51 +0700239 struct hlr_euse *euse;
240
241 euse = euse_find(g_hlr, argv[0]);
242 if (!euse) {
243 vty_out(vty, "%% Cannot find EUSE %s%s", argv[0], VTY_NEWLINE);
244 return CMD_WARNING;
245 }
Harald Welte4956ae12018-06-15 22:04:28 +0200246
247 if (g_hlr->euse_default != euse) {
248 vty_out(vty, "Switching default route from %s to %s%s",
Harald Welte55d32a12018-07-30 17:26:35 +0200249 g_hlr->euse_default ? g_hlr->euse_default->name : "<none>",
250 euse->name, VTY_NEWLINE);
Harald Welte4956ae12018-06-15 22:04:28 +0200251 g_hlr->euse_default = euse;
252 }
253
254 return CMD_SUCCESS;
255}
256
Harald Weltedab544e2018-07-29 16:14:48 +0200257DEFUN(cfg_ussd_no_defaultroute, cfg_ussd_no_defaultroute_cmd,
258 "no ussd default-route",
259 NO_STR USSD_STR "Remove the default-route for all USSD to unknown destinations\n")
Harald Welte4956ae12018-06-15 22:04:28 +0200260{
Harald Welte4956ae12018-06-15 22:04:28 +0200261 g_hlr->euse_default = NULL;
262
263 return CMD_SUCCESS;
264}
265
Neels Hofmeyr5857c592019-04-02 04:24:49 +0200266DEFUN(cfg_database, cfg_database_cmd,
267 "database PATH",
268 "Set the path to the HLR database file\n"
269 "Relative or absolute file system path to the database file (default is '" HLR_DEFAULT_DB_FILE_PATH "')\n")
270{
271 osmo_talloc_replace_string(g_hlr, &g_hlr->db_file_path, argv[0]);
272 return CMD_SUCCESS;
273}
274
Harald Welte4956ae12018-06-15 22:04:28 +0200275struct cmd_node euse_node = {
276 EUSE_NODE,
277 "%s(config-hlr-euse)# ",
278 1,
279};
280
281DEFUN(cfg_euse, cfg_euse_cmd,
282 "euse NAME",
283 "Configure a particular External USSD Entity\n"
284 "Alphanumeric name of the External USSD Entity\n")
285{
286 struct hlr_euse *euse;
287 const char *id = argv[0];
288
289 euse = euse_find(g_hlr, id);
290 if (!euse) {
291 euse = euse_alloc(g_hlr, id);
292 if (!euse)
293 return CMD_WARNING;
294 }
295 vty->index = euse;
296 vty->index_sub = &euse->description;
297 vty->node = EUSE_NODE;
298
299 return CMD_SUCCESS;
300}
301
302DEFUN(cfg_no_euse, cfg_no_euse_cmd,
303 "no euse NAME",
304 NO_STR "Remove a particular External USSD Entity\n"
305 "Alphanumeric name of the External USSD Entity\n")
306{
307 struct hlr_euse *euse = euse_find(g_hlr, argv[0]);
308 if (!euse) {
Vadim Yanitskiyc47d5c02020-10-29 18:05:22 +0700309 vty_out(vty, "%% Cannot remove non-existent EUSE %s%s", argv[0], VTY_NEWLINE);
Harald Welte4956ae12018-06-15 22:04:28 +0200310 return CMD_WARNING;
311 }
312 if (g_hlr->euse_default == euse) {
313 vty_out(vty, "%% Cannot remove EUSE %s, it is the default route%s", argv[0], VTY_NEWLINE);
314 return CMD_WARNING;
315 }
316 euse_del(euse);
317 return CMD_SUCCESS;
318}
319
320static void dump_one_euse(struct vty *vty, struct hlr_euse *euse)
321{
Harald Welte4956ae12018-06-15 22:04:28 +0200322 vty_out(vty, " euse %s%s", euse->name, VTY_NEWLINE);
Harald Welte4956ae12018-06-15 22:04:28 +0200323}
324
325static int config_write_euse(struct vty *vty)
326{
327 struct hlr_euse *euse;
Harald Weltedab544e2018-07-29 16:14:48 +0200328 struct hlr_ussd_route *rt;
Harald Welte4956ae12018-06-15 22:04:28 +0200329
330 llist_for_each_entry(euse, &g_hlr->euse_list, list)
331 dump_one_euse(vty, euse);
332
Harald Weltedab544e2018-07-29 16:14:48 +0200333 llist_for_each_entry(rt, &g_hlr->ussd_routes, list) {
334 vty_out(vty, " ussd route prefix %s %s %s%s", rt->prefix,
335 rt->is_external ? "external" : "internal",
336 rt->is_external ? rt->u.euse->name : rt->u.iuse->name,
337 VTY_NEWLINE);
338 }
339
340 if (g_hlr->euse_default)
341 vty_out(vty, " ussd default-route external %s%s", g_hlr->euse_default->name, VTY_NEWLINE);
342
Vadim Yanitskiyd157a562018-12-01 00:03:39 +0700343 if (g_hlr->ncss_guard_timeout != NCSS_GUARD_TIMEOUT_DEFAULT)
344 vty_out(vty, " ncss-guard-timeout %i%s",
345 g_hlr->ncss_guard_timeout, VTY_NEWLINE);
346
Harald Welte4956ae12018-06-15 22:04:28 +0200347 return 0;
348}
349
Vadim Yanitskiyd157a562018-12-01 00:03:39 +0700350DEFUN(cfg_ncss_guard_timeout, cfg_ncss_guard_timeout_cmd,
351 "ncss-guard-timeout <0-255>",
352 "Set guard timer for NCSS (call independent SS) session activity\n"
353 "Guard timer value (sec.), or 0 to disable")
354{
355 g_hlr->ncss_guard_timeout = atoi(argv[0]);
356 return CMD_SUCCESS;
357}
358
Oliver Smith851814a2019-01-11 15:30:21 +0100359DEFUN(cfg_store_imei, cfg_store_imei_cmd,
360 "store-imei",
361 "Save the IMEI in the database when receiving Check IMEI requests. Note that an MSC does not necessarily send"
362 " Check IMEI requests (for OsmoMSC, you may want to set 'check-imei-rqd 1').")
363{
364 g_hlr->store_imei = true;
365 return CMD_SUCCESS;
366}
367
368DEFUN(cfg_no_store_imei, cfg_no_store_imei_cmd,
369 "no store-imei",
370 "Do not save the IMEI in the database, when receiving Check IMEI requests.")
371{
372 g_hlr->store_imei = false;
373 return CMD_SUCCESS;
374}
375
Oliver Smithc7f17872019-03-04 15:10:44 +0100376DEFUN(cfg_subscr_create_on_demand, cfg_subscr_create_on_demand_cmd,
377 "subscriber-create-on-demand (no-msisdn|<3-15>) (none|cs|ps|cs+ps)",
378 "Make a new record when a subscriber is first seen.\n"
379 "Do not automatically assign MSISDN.\n"
380 "Length of an automatically assigned MSISDN.\n"
381 "Do not allow any NAM (Network Access Mode) by default.\n"
382 "Allow access to circuit switched NAM by default.\n"
383 "Allow access to packet switched NAM by default.\n"
384 "Allow access to circuit and packet switched NAM by default.\n")
385{
386 unsigned int rand_msisdn_len = 0;
387 uint8_t flags = 0x00;
388
389 if (strcmp(argv[0], "no-msisdn") != 0)
390 rand_msisdn_len = atoi(argv[0]);
391
392 if (strstr(argv[1], "cs"))
393 flags |= DB_SUBSCR_FLAG_NAM_CS;
394 if (strstr(argv[1], "ps"))
395 flags |= DB_SUBSCR_FLAG_NAM_PS;
396
397 g_hlr->subscr_create_on_demand = true;
398 g_hlr->subscr_create_on_demand_rand_msisdn_len = rand_msisdn_len;
399 g_hlr->subscr_create_on_demand_flags = flags;
400
401 return CMD_SUCCESS;
402}
403
404DEFUN(cfg_no_subscr_create_on_demand, cfg_no_subscr_create_on_demand_cmd,
405 "no subscriber-create-on-demand",
406 "Do not make a new record when a subscriber is first seen.\n")
407{
408 g_hlr->subscr_create_on_demand = false;
409 return CMD_SUCCESS;
410}
411
Harald Welte4956ae12018-06-15 22:04:28 +0200412/***********************************************************************
413 * Common Code
414 ***********************************************************************/
415
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200416int hlr_vty_go_parent(struct vty *vty)
417{
418 switch (vty->node) {
419 case GSUP_NODE:
Harald Welte4956ae12018-06-15 22:04:28 +0200420 case EUSE_NODE:
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200421 vty->node = HLR_NODE;
422 vty->index = NULL;
Harald Welte4956ae12018-06-15 22:04:28 +0200423 vty->index_sub = NULL;
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200424 break;
425 default:
426 case HLR_NODE:
427 vty->node = CONFIG_NODE;
428 vty->index = NULL;
429 break;
430 case CONFIG_NODE:
431 vty->node = ENABLE_NODE;
432 vty->index = NULL;
433 break;
434 }
435
436 return vty->node;
437}
438
Neels Hofmeyr7685a782017-01-30 23:30:26 +0100439int hlr_vty_is_config_node(struct vty *vty, int node)
440{
441 switch (node) {
442 /* add items that are not config */
443 case CONFIG_NODE:
444 return 0;
445
446 default:
447 return 1;
448 }
449}
450
Pau Espin Pedrole49391b2019-08-05 15:57:10 +0200451void hlr_vty_init(void)
Neels Hofmeyr7685a782017-01-30 23:30:26 +0100452{
Pau Espin Pedrole49391b2019-08-05 15:57:10 +0200453 logging_vty_add_cmds();
Harald Welte7ee6e552018-02-14 00:52:05 +0100454 osmo_talloc_vty_add_cmds();
Max20ddfdb2019-02-18 13:12:27 +0100455 osmo_stats_vty_add_cmds();
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200456
Harald Weltefa7ee332018-06-24 13:20:32 +0200457 install_element_ve(&show_gsup_conn_cmd);
458
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200459 install_element(CONFIG_NODE, &cfg_hlr_cmd);
460 install_node(&hlr_node, config_write_hlr);
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200461
462 install_element(HLR_NODE, &cfg_gsup_cmd);
463 install_node(&gsup_node, config_write_hlr_gsup);
Pau Espin Pedrolce9bc402017-05-31 13:19:22 +0200464
465 install_element(GSUP_NODE, &cfg_hlr_gsup_bind_ip_cmd);
Neels Hofmeyr76328bd2019-11-20 03:35:37 +0100466 install_element(GSUP_NODE, &cfg_hlr_gsup_ipa_name_cmd);
Neels Hofmeyr183e7002017-10-06 02:59:54 +0200467
Neels Hofmeyr5857c592019-04-02 04:24:49 +0200468 install_element(HLR_NODE, &cfg_database_cmd);
469
Harald Welte4956ae12018-06-15 22:04:28 +0200470 install_element(HLR_NODE, &cfg_euse_cmd);
471 install_element(HLR_NODE, &cfg_no_euse_cmd);
472 install_node(&euse_node, config_write_euse);
Harald Weltedab544e2018-07-29 16:14:48 +0200473 install_element(HLR_NODE, &cfg_ussd_route_pfx_int_cmd);
474 install_element(HLR_NODE, &cfg_ussd_route_pfx_ext_cmd);
475 install_element(HLR_NODE, &cfg_ussd_no_route_pfx_cmd);
476 install_element(HLR_NODE, &cfg_ussd_defaultroute_cmd);
477 install_element(HLR_NODE, &cfg_ussd_no_defaultroute_cmd);
Vadim Yanitskiyd157a562018-12-01 00:03:39 +0700478 install_element(HLR_NODE, &cfg_ncss_guard_timeout_cmd);
Oliver Smith851814a2019-01-11 15:30:21 +0100479 install_element(HLR_NODE, &cfg_store_imei_cmd);
480 install_element(HLR_NODE, &cfg_no_store_imei_cmd);
Oliver Smithc7f17872019-03-04 15:10:44 +0100481 install_element(HLR_NODE, &cfg_subscr_create_on_demand_cmd);
482 install_element(HLR_NODE, &cfg_no_subscr_create_on_demand_cmd);
Harald Welte4956ae12018-06-15 22:04:28 +0200483
Harald Welted5807b82018-07-29 12:27:41 +0200484 hlr_vty_subscriber_init();
Neels Hofmeyr7685a782017-01-30 23:30:26 +0100485}