blob: 5e3098289c945583662115f041af32d910d34c17 [file] [log] [blame]
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02001/* OpenBSC interface to quagga VTY */
2/* (C) 2009 by Harald Welte <laforge@gnumonks.org>
Holger Hans Peter Freythere33966c2009-10-27 12:47:06 +01003 * (C) 2009 by Holger Hans Peter Freyther
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02004 * All Rights Reserved
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 */
21
22#include <stdlib.h>
23#include <unistd.h>
24#include <sys/types.h>
25
26#include <vty/command.h>
27#include <vty/buffer.h>
28#include <vty/vty.h>
29
30#include <arpa/inet.h>
31
Harald Weltedfe6c7d2010-02-20 16:24:02 +010032#include <osmocore/linuxlist.h>
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020033#include <openbsc/gsm_data.h>
34#include <openbsc/gsm_subscriber.h>
Harald Welteb54d9502009-11-17 06:00:23 +010035#include <openbsc/silent_call.h>
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020036#include <openbsc/gsm_04_11.h>
37#include <openbsc/e1_input.h>
38#include <openbsc/abis_nm.h>
Harald Weltedfe6c7d2010-02-20 16:24:02 +010039#include <osmocore/gsm_utils.h>
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020040#include <openbsc/db.h>
Harald Weltedfe6c7d2010-02-20 16:24:02 +010041#include <osmocore/talloc.h>
Harald Weltea1482332009-11-14 10:08:40 +010042#include <openbsc/signal.h>
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010043#include <openbsc/debug.h>
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +020044#include <openbsc/vty.h>
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020045
46static struct gsm_network *gsmnet;
47
48struct cmd_node subscr_node = {
49 SUBSCR_NODE,
50 "%s(subscriber)#",
51 1,
52};
53
54static int dummy_config_write(struct vty *v)
55{
56 return CMD_SUCCESS;
57}
58
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020059static struct buffer *argv_to_buffer(int argc, const char *argv[], int base)
60{
61 struct buffer *b = buffer_new(1024);
62 int i;
63
64 if (!b)
65 return NULL;
66
67 for (i = base; i < argc; i++) {
68 buffer_putstr(b, argv[i]);
69 buffer_putc(b, ' ');
70 }
71 buffer_putc(b, '\0');
72
73 return b;
74}
75
Sylvain Munaut99792902009-12-27 19:30:46 +010076static int hexparse(const char *str, u_int8_t *b, int max_len)
77
78{
79 int i, l, v;
80
81 l = strlen(str);
82 if ((l&1) || ((l>>1) > max_len))
83 return -1;
84
85 memset(b, 0x00, max_len);
86
87 for (i=0; i<l; i++) {
88 char c = str[i];
89 if (c >= '0' && c <= '9')
90 v = c - '0';
91 else if (c >= 'a' && c <= 'f')
92 v = 10 + (c - 'a');
93 else if (c >= 'A' && c <= 'F')
94 v = 10 + (c - 'a');
95 else
96 return -1;
97 b[i>>1] |= v << (i&1 ? 0 : 4);
98 }
99
100 return i>>1;
101}
102
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200103/* per-subscriber configuration */
104DEFUN(cfg_subscr,
105 cfg_subscr_cmd,
106 "subscriber IMSI",
107 "Select a Subscriber to configure\n")
108{
109 const char *imsi = argv[0];
110 struct gsm_subscriber *subscr;
111
112 subscr = subscr_get_by_imsi(gsmnet, imsi);
113 if (!subscr) {
114 vty_out(vty, "%% No subscriber for IMSI %s%s",
115 imsi, VTY_NEWLINE);
116 return CMD_WARNING;
117 }
118
Holger Hans Peter Freythere33966c2009-10-27 12:47:06 +0100119 /* vty_go_parent should put this subscriber */
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200120 vty->index = subscr;
121 vty->node = SUBSCR_NODE;
122
123 return CMD_SUCCESS;
124}
125
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100126static void subscr_dump_full_vty(struct vty *vty, struct gsm_subscriber *subscr)
127{
128 int rc;
129 struct gsm_auth_info ainfo;
130 struct gsm_auth_tuple atuple;
131
132 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
133 subscr->authorized, VTY_NEWLINE);
134 if (subscr->name)
135 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
136 if (subscr->extension)
137 vty_out(vty, " Extension: %s%s", subscr->extension,
138 VTY_NEWLINE);
139 if (subscr->imsi)
140 vty_out(vty, " IMSI: %s%s", subscr->imsi, VTY_NEWLINE);
141 if (subscr->tmsi != GSM_RESERVED_TMSI)
142 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
143 VTY_NEWLINE);
144
145 rc = get_authinfo_by_subscr(&ainfo, subscr);
146 if (!rc) {
147 vty_out(vty, " A3A8 algorithm id: %d%s",
148 ainfo.auth_algo, VTY_NEWLINE);
149 vty_out(vty, " A3A8 Ki: %s%s",
150 hexdump(ainfo.a3a8_ki, ainfo.a3a8_ki_len),
151 VTY_NEWLINE);
152 }
153
154 rc = get_authtuple_by_subscr(&atuple, subscr);
155 if (!rc) {
156 vty_out(vty, " A3A8 last tuple (used %d times):%s",
157 atuple.use_count, VTY_NEWLINE);
158 vty_out(vty, " seq # : %d%s",
159 atuple.key_seq, VTY_NEWLINE);
160 vty_out(vty, " RAND : %s%s",
161 hexdump(atuple.rand, sizeof(atuple.rand)),
162 VTY_NEWLINE);
163 vty_out(vty, " SRES : %s%s",
164 hexdump(atuple.sres, sizeof(atuple.sres)),
165 VTY_NEWLINE);
166 vty_out(vty, " Kc : %s%s",
167 hexdump(atuple.kc, sizeof(atuple.kc)),
168 VTY_NEWLINE);
169 }
170
171 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
172}
173
174
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200175/* Subscriber */
176DEFUN(show_subscr,
177 show_subscr_cmd,
178 "show subscriber [IMSI]",
179 SHOW_STR "Display information about a subscriber\n")
180{
181 const char *imsi;
182 struct gsm_subscriber *subscr;
183
184 if (argc >= 1) {
185 imsi = argv[0];
186 subscr = subscr_get_by_imsi(gsmnet, imsi);
187 if (!subscr) {
188 vty_out(vty, "%% unknown subscriber%s",
189 VTY_NEWLINE);
190 return CMD_WARNING;
191 }
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100192 subscr_dump_full_vty(vty, subscr);
Holger Hans Peter Freythere33966c2009-10-27 12:47:06 +0100193 subscr_put(subscr);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200194
195 return CMD_SUCCESS;
196 }
197
198 /* FIXME: iterate over all subscribers ? */
199 return CMD_WARNING;
200
201 return CMD_SUCCESS;
202}
203
204DEFUN(show_subscr_cache,
205 show_subscr_cache_cmd,
206 "show subscriber cache",
207 SHOW_STR "Display contents of subscriber cache\n")
208{
209 struct gsm_subscriber *subscr;
210
211 llist_for_each_entry(subscr, &active_subscribers, entry) {
212 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100213 subscr_dump_full_vty(vty, subscr);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200214 }
215
216 return CMD_SUCCESS;
217}
218
219DEFUN(sms_send_pend,
220 sms_send_pend_cmd,
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100221 "sms send pending",
222 "Send all pending SMS")
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200223{
224 struct gsm_sms *sms;
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100225 int id = 0;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200226
227 while (1) {
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100228 sms = db_sms_get_unsent_by_subscr(gsmnet, id);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200229 if (!sms)
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100230 break;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200231
232 gsm411_send_sms_subscr(sms->receiver, sms);
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100233
234 id = sms->receiver->id + 1;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200235 }
236
237 return CMD_SUCCESS;
238}
239
240struct gsm_sms *sms_from_text(struct gsm_subscriber *receiver, const char *text)
241{
242 struct gsm_sms *sms = sms_alloc();
243
244 if (!sms)
245 return NULL;
246
247 if (!receiver->lac) {
248 /* subscriber currently not attached, store in database? */
249 return NULL;
250 }
251
252 sms->receiver = subscr_get(receiver);
253 strncpy(sms->text, text, sizeof(sms->text)-1);
254
255 /* FIXME: don't use ID 1 static */
256 sms->sender = subscr_get_by_id(gsmnet, 1);
257 sms->reply_path_req = 0;
258 sms->status_rep_req = 0;
259 sms->ud_hdr_ind = 0;
260 sms->protocol_id = 0; /* implicit */
261 sms->data_coding_scheme = 0; /* default 7bit */
262 strncpy(sms->dest_addr, receiver->extension, sizeof(sms->dest_addr)-1);
263 /* Generate user_data */
264 sms->user_data_len = gsm_7bit_encode(sms->user_data, sms->text);
265
266 return sms;
267}
268
269static int _send_sms_buffer(struct gsm_subscriber *receiver,
Harald Welte793a1352009-11-05 15:51:17 +0900270 struct buffer *b, u_int8_t tp_pid)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200271{
272 struct gsm_sms *sms;
273
274 sms = sms_from_text(receiver, buffer_getstr(b));
Harald Welte793a1352009-11-05 15:51:17 +0900275 sms->protocol_id = tp_pid;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200276 gsm411_send_sms_subscr(receiver, sms);
277
278 return CMD_SUCCESS;
279}
280
Harald Welte98f9c752009-11-14 08:00:53 +0100281static struct gsm_subscriber *get_subscr_by_argv(const char *type,
282 const char *id)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200283{
Harald Welte98f9c752009-11-14 08:00:53 +0100284 if (!strcmp(type, "extension"))
285 return subscr_get_by_extension(gsmnet, id);
286 else if (!strcmp(type, "imsi"))
287 return subscr_get_by_imsi(gsmnet, id);
288 else if (!strcmp(type, "tmsi"))
289 return subscr_get_by_tmsi(gsmnet, atoi(id));
290 else if (!strcmp(type, "id"))
291 return subscr_get_by_id(gsmnet, atoi(id));
292
293 return NULL;
294}
295#define SUBSCR_TYPES "(extension|imsi|tmsi|id)"
296
297DEFUN(subscriber_send_sms,
298 subscriber_send_sms_cmd,
299 "subscriber " SUBSCR_TYPES " EXTEN sms send .LINE",
300 "Select subscriber based on extension")
301{
302 struct gsm_subscriber *subscr = get_subscr_by_argv(argv[0], argv[1]);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200303 struct buffer *b;
304 int rc;
305
Harald Welte20f98312009-11-14 10:11:45 +0100306 if (!subscr) {
307 vty_out(vty, "%% No subscriber found for %s %s%s",
308 argv[0], argv[1], VTY_NEWLINE);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200309 return CMD_WARNING;
Harald Welte20f98312009-11-14 10:11:45 +0100310 }
Harald Welte98f9c752009-11-14 08:00:53 +0100311 b = argv_to_buffer(argc, argv, 2);
312 rc = _send_sms_buffer(subscr, b, 0);
Harald Welte793a1352009-11-05 15:51:17 +0900313 buffer_free(b);
314
Harald Welteaf8c7b42009-11-14 10:10:54 +0100315 subscr_put(subscr);
316
Harald Welte793a1352009-11-05 15:51:17 +0900317 return rc;
318}
319
Harald Welte98f9c752009-11-14 08:00:53 +0100320DEFUN(subscriber_silent_sms,
321 subscriber_silent_sms_cmd,
322 "subscriber " SUBSCR_TYPES " EXTEN silent sms send .LINE",
323 "Select subscriber based on extension")
Harald Welte793a1352009-11-05 15:51:17 +0900324{
Harald Welte98f9c752009-11-14 08:00:53 +0100325 struct gsm_subscriber *subscr = get_subscr_by_argv(argv[0], argv[1]);
Harald Welte793a1352009-11-05 15:51:17 +0900326 struct buffer *b;
327 int rc;
328
Harald Welte20f98312009-11-14 10:11:45 +0100329 if (!subscr) {
330 vty_out(vty, "%% No subscriber found for %s %s%s",
331 argv[0], argv[1], VTY_NEWLINE);
Harald Welte793a1352009-11-05 15:51:17 +0900332 return CMD_WARNING;
Harald Welte20f98312009-11-14 10:11:45 +0100333 }
Harald Welte793a1352009-11-05 15:51:17 +0900334
Harald Welte98f9c752009-11-14 08:00:53 +0100335 b = argv_to_buffer(argc, argv, 2);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100336 rc = _send_sms_buffer(subscr, b, 64);
Harald Welte793a1352009-11-05 15:51:17 +0900337 buffer_free(b);
338
Harald Welteaf8c7b42009-11-14 10:10:54 +0100339 subscr_put(subscr);
340
Harald Welte793a1352009-11-05 15:51:17 +0900341 return rc;
342}
343
Sylvain Munaut50480702010-01-02 14:29:43 +0100344DEFUN(subscriber_silent_call_start,
345 subscriber_silent_call_start_cmd,
346 "subscriber " SUBSCR_TYPES " EXTEN silent call start (any|tch/f|tch/any|sdcch)",
347 "Start a silent call to a subscriber")
348{
349 struct gsm_subscriber *subscr = get_subscr_by_argv(argv[0], argv[1]);
350 int rc, type;
351
352 if (!subscr) {
353 vty_out(vty, "%% No subscriber found for %s %s%s",
354 argv[0], argv[1], VTY_NEWLINE);
355 return CMD_WARNING;
356 }
357
358 if (!strcmp(argv[2], "tch/f"))
359 type = RSL_CHANNEED_TCH_F;
360 else if (!strcmp(argv[2], "tch/any"))
361 type = RSL_CHANNEED_TCH_ForH;
362 else if (!strcmp(argv[2], "sdcch"))
363 type = RSL_CHANNEED_SDCCH;
364 else
365 type = RSL_CHANNEED_ANY; /* Defaults to ANY */
366
367 rc = gsm_silent_call_start(subscr, vty, type);
368 if (rc <= 0) {
369 vty_out(vty, "%% Subscriber not attached%s",
370 VTY_NEWLINE);
371 subscr_put(subscr);
372 return CMD_WARNING;
373 }
374
375 subscr_put(subscr);
376
377 return CMD_SUCCESS;
378}
379
380DEFUN(subscriber_silent_call_stop,
381 subscriber_silent_call_stop_cmd,
382 "subscriber " SUBSCR_TYPES " EXTEN silent call stop",
383 "Stop a silent call to a subscriber")
Harald Weltea1482332009-11-14 10:08:40 +0100384{
385 struct gsm_subscriber *subscr = get_subscr_by_argv(argv[0], argv[1]);
386 int rc;
387
388 if (!subscr) {
389 vty_out(vty, "%% No subscriber found for %s %s%s",
Harald Welte20f98312009-11-14 10:11:45 +0100390 argv[0], argv[1], VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100391 return CMD_WARNING;
392 }
393
Sylvain Munaut50480702010-01-02 14:29:43 +0100394 rc = gsm_silent_call_stop(subscr);
395 if (rc < 0) {
396 subscr_put(subscr);
397 return CMD_WARNING;
Harald Weltea1482332009-11-14 10:08:40 +0100398 }
399
400 subscr_put(subscr);
401
402 return CMD_SUCCESS;
403}
404
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200405DEFUN(cfg_subscr_name,
406 cfg_subscr_name_cmd,
407 "name NAME",
408 "Set the name of the subscriber")
409{
410 const char *name = argv[0];
411 struct gsm_subscriber *subscr = vty->index;
412
413 strncpy(subscr->name, name, sizeof(subscr->name));
414
415 db_sync_subscriber(subscr);
416
417 return CMD_SUCCESS;
418}
419
420DEFUN(cfg_subscr_extension,
421 cfg_subscr_extension_cmd,
422 "extension EXTENSION",
423 "Set the extension of the subscriber")
424{
425 const char *name = argv[0];
426 struct gsm_subscriber *subscr = vty->index;
427
428 strncpy(subscr->extension, name, sizeof(subscr->extension));
429
430 db_sync_subscriber(subscr);
431
432 return CMD_SUCCESS;
433}
434
435DEFUN(cfg_subscr_authorized,
436 cfg_subscr_authorized_cmd,
437 "auth <0-1>",
438 "Set the authorization status of the subscriber")
439{
440 int auth = atoi(argv[0]);
441 struct gsm_subscriber *subscr = vty->index;
442
443 if (auth)
444 subscr->authorized = 1;
445 else
446 subscr->authorized = 0;
447
448 db_sync_subscriber(subscr);
449
450 return CMD_SUCCESS;
451}
452
Sylvain Munaut99792902009-12-27 19:30:46 +0100453#define A3A8_ALG_TYPES "(none|comp128v1)"
454
455DEFUN(cfg_subscr_a3a8,
456 cfg_subscr_a3a8_cmd,
457 "a3a8 " A3A8_ALG_TYPES " [KI]",
458 "Set a3a8 parameters for the subscriber")
459{
460 struct gsm_subscriber *subscr = vty->index;
461 const char *alg_str = argv[0];
462 const char *ki_str = argv[1];
463 struct gsm_auth_info ainfo;
464 int rc;
465
466 if (!strcasecmp(alg_str, "none")) {
467 /* Just erase */
468 rc = set_authinfo_for_subscr(NULL, subscr);
469 } else if (!strcasecmp(alg_str, "comp128v1")) {
470 /* Parse hex string Ki */
471 rc = hexparse(ki_str, ainfo.a3a8_ki, sizeof(ainfo.a3a8_ki));
472 if (rc != 16)
473 return CMD_WARNING;
474
475 /* Set the infos */
476 ainfo.auth_algo = AUTH_ALGO_COMP128v1;
477 ainfo.a3a8_ki_len = rc;
478 rc = set_authinfo_for_subscr(&ainfo, subscr);
479 } else {
480 /* Unknown method */
481 return CMD_WARNING;
482 }
483
484 return rc ? CMD_WARNING : CMD_SUCCESS;
485}
486
Harald Weltea1482332009-11-14 10:08:40 +0100487static int scall_cbfn(unsigned int subsys, unsigned int signal,
488 void *handler_data, void *signal_data)
489{
490 struct scall_signal_data *sigdata = signal_data;
491 struct vty *vty = sigdata->data;
492
493 switch (signal) {
494 case S_SCALL_SUCCESS:
495 vty_out(vty, "%% silent call on ARFCN %u timeslot %u%s",
496 sigdata->lchan->ts->trx->arfcn, sigdata->lchan->ts->nr,
497 VTY_NEWLINE);
498 break;
499 case S_SCALL_EXPIRED:
500 vty_out(vty, "%% silent call expired paging%s", VTY_NEWLINE);
501 break;
502 }
503 return 0;
504}
505
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200506DEFUN(show_stats,
507 show_stats_cmd,
508 "show statistics",
509 SHOW_STR "Display network statistics\n")
510{
511 struct gsm_network *net = gsmnet;
512
513 openbsc_vty_print_statistics(vty, net);
514 vty_out(vty, "Location Update : %lu attach, %lu normal, %lu periodic%s",
515 counter_get(net->stats.loc_upd_type.attach),
516 counter_get(net->stats.loc_upd_type.normal),
517 counter_get(net->stats.loc_upd_type.periodic), VTY_NEWLINE);
518 vty_out(vty, "IMSI Detach Indications : %lu%s",
519 counter_get(net->stats.loc_upd_type.detach), VTY_NEWLINE);
520 vty_out(vty, "Location Update Response: %lu accept, %lu reject%s",
521 counter_get(net->stats.loc_upd_resp.accept),
522 counter_get(net->stats.loc_upd_resp.reject), VTY_NEWLINE);
523 vty_out(vty, "Handover : %lu attempted, %lu no_channel, %lu timeout, "
524 "%lu completed, %lu failed%s",
525 counter_get(net->stats.handover.attempted),
526 counter_get(net->stats.handover.no_channel),
527 counter_get(net->stats.handover.timeout),
528 counter_get(net->stats.handover.completed),
529 counter_get(net->stats.handover.failed), VTY_NEWLINE);
530 vty_out(vty, "SMS MO : %lu submitted, %lu no receiver%s",
531 counter_get(net->stats.sms.submitted),
532 counter_get(net->stats.sms.no_receiver), VTY_NEWLINE);
533 vty_out(vty, "SMS MT : %lu delivered, %lu no memory, %lu other error%s",
534 counter_get(net->stats.sms.delivered),
535 counter_get(net->stats.sms.rp_err_mem),
536 counter_get(net->stats.sms.rp_err_other), VTY_NEWLINE);
537 return CMD_SUCCESS;
538}
539
540
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200541int bsc_vty_init_extra(struct gsm_network *net)
542{
543 gsmnet = net;
544
Harald Weltea1482332009-11-14 10:08:40 +0100545 register_signal_handler(SS_SCALL, scall_cbfn, NULL);
546
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200547 install_element(VIEW_NODE, &show_subscr_cmd);
548 install_element(VIEW_NODE, &show_subscr_cache_cmd);
549
550 install_element(VIEW_NODE, &sms_send_pend_cmd);
Harald Welte98f9c752009-11-14 08:00:53 +0100551
552 install_element(VIEW_NODE, &subscriber_send_sms_cmd);
553 install_element(VIEW_NODE, &subscriber_silent_sms_cmd);
Sylvain Munaut50480702010-01-02 14:29:43 +0100554 install_element(VIEW_NODE, &subscriber_silent_call_start_cmd);
555 install_element(VIEW_NODE, &subscriber_silent_call_stop_cmd);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200556 install_element(VIEW_NODE, &show_stats_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200557
558 install_element(CONFIG_NODE, &cfg_subscr_cmd);
559 install_node(&subscr_node, dummy_config_write);
560
561 install_default(SUBSCR_NODE);
562 install_element(SUBSCR_NODE, &cfg_subscr_name_cmd);
563 install_element(SUBSCR_NODE, &cfg_subscr_extension_cmd);
564 install_element(SUBSCR_NODE, &cfg_subscr_authorized_cmd);
Sylvain Munaut99792902009-12-27 19:30:46 +0100565 install_element(SUBSCR_NODE, &cfg_subscr_a3a8_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200566
567 return 0;
568}