blob: f8fc098827f511ed59e40220a512c0aac7999e8f [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 Freyther0e7d0712011-04-18 17:15:53 +02003 * (C) 2009-2011 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
Harald Welte9af6ddf2011-01-01 15:25:50 +01007 * it under the terms of the GNU Affero General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02009 * (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
Harald Welte9af6ddf2011-01-01 15:25:50 +010014 * GNU Affero General Public License for more details.
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020015 *
Harald Welte9af6ddf2011-01-01 15:25:50 +010016 * You should have received a copy of the GNU Affero General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020018 *
19 */
20
21#include <stdlib.h>
Holger Hans Peter Freyther73b878a2010-12-25 00:33:40 +010022#include <limits.h>
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020023#include <unistd.h>
Holger Hans Peter Freytherb9708942013-07-27 19:42:35 +020024#include <time.h>
Neels Hofmeyr84da6b12016-05-20 21:59:55 +020025#include <inttypes.h>
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020026
Harald Welte4b037e42010-05-19 19:45:32 +020027#include <osmocom/vty/command.h>
28#include <osmocom/vty/buffer.h>
29#include <osmocom/vty/vty.h>
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020030
31#include <arpa/inet.h>
32
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010033#include <osmocom/core/linuxlist.h>
Neels Hofmeyr90843962017-09-04 15:04:35 +020034#include <osmocom/msc/gsm_data.h>
35#include <osmocom/msc/gsm_subscriber.h>
36#include <osmocom/msc/silent_call.h>
37#include <osmocom/msc/gsm_04_11.h>
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010038#include <osmocom/gsm/gsm_utils.h>
39#include <osmocom/core/utils.h>
Neels Hofmeyr90843962017-09-04 15:04:35 +020040#include <osmocom/msc/db.h>
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010041#include <osmocom/core/talloc.h>
Neels Hofmeyr90843962017-09-04 15:04:35 +020042#include <osmocom/msc/signal.h>
43#include <osmocom/msc/debug.h>
44#include <osmocom/msc/vty.h>
45#include <osmocom/msc/gsm_04_80.h>
46#include <osmocom/msc/gsm_04_14.h>
Harald Welted35038d2018-01-25 00:07:33 +010047#include <osmocom/gsm/protocol/gsm_08_58.h>
Neels Hofmeyr90843962017-09-04 15:04:35 +020048#include <osmocom/msc/sms_queue.h>
49#include <osmocom/msc/mncc_int.h>
Neels Hofmeyr90843962017-09-04 15:04:35 +020050#include <osmocom/msc/vlr.h>
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020051
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +010052#include <osmocom/vty/logging.h>
53
Neels Hofmeyr90843962017-09-04 15:04:35 +020054#include <osmocom/msc/osmo_msc.h>
Harald Welte2483f1b2016-06-19 18:06:02 +020055
Harald Weltedcccb182010-05-16 20:52:23 +020056extern struct gsm_network *gsmnet_from_vty(struct vty *v);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020057
Harald Welte2483f1b2016-06-19 18:06:02 +020058static void subscr_dump_full_vty(struct vty *vty, struct vlr_subscr *vsub)
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010059{
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +020060 int reqs;
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +020061 struct llist_head *entry;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010062
Harald Welte2483f1b2016-06-19 18:06:02 +020063 if (strlen(vsub->name))
64 vty_out(vty, " Name: '%s'%s", vsub->name, VTY_NEWLINE);
65 if (strlen(vsub->msisdn))
66 vty_out(vty, " Extension: %s%s", vsub->msisdn,
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010067 VTY_NEWLINE);
Holger Hans Peter Freyther3d76e442010-12-25 16:40:54 +010068 vty_out(vty, " LAC: %d/0x%x%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020069 vsub->lac, vsub->lac, VTY_NEWLINE);
70 vty_out(vty, " IMSI: %s%s", vsub->imsi, VTY_NEWLINE);
71 if (vsub->tmsi != GSM_RESERVED_TMSI)
72 vty_out(vty, " TMSI: %08X%s", vsub->tmsi,
73 VTY_NEWLINE);
74 if (vsub->tmsi_new != GSM_RESERVED_TMSI)
75 vty_out(vty, " new TMSI: %08X%s", vsub->tmsi_new,
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010076 VTY_NEWLINE);
77
Harald Welte2483f1b2016-06-19 18:06:02 +020078#if 0
79 /* TODO: add this to vlr_subscr? */
80 if (vsub->auth_info.auth_algo != AUTH_ALGO_NONE) {
81 struct gsm_auth_info *i = &vsub->auth_info;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010082 vty_out(vty, " A3A8 algorithm id: %d%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020083 i->auth_algo, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010084 vty_out(vty, " A3A8 Ki: %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020085 osmo_hexdump(i->a3a8_ki, i->a3a8_ki_len),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010086 VTY_NEWLINE);
87 }
Harald Welte2483f1b2016-06-19 18:06:02 +020088#endif
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010089
Harald Welte2483f1b2016-06-19 18:06:02 +020090 if (vsub->last_tuple) {
91 struct gsm_auth_tuple *t = vsub->last_tuple;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010092 vty_out(vty, " A3A8 last tuple (used %d times):%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020093 t->use_count, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010094 vty_out(vty, " seq # : %d%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020095 t->key_seq, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010096 vty_out(vty, " RAND : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020097 osmo_hexdump(t->vec.rand, sizeof(t->vec.rand)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010098 VTY_NEWLINE);
99 vty_out(vty, " SRES : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200100 osmo_hexdump(t->vec.sres, sizeof(t->vec.sres)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100101 VTY_NEWLINE);
102 vty_out(vty, " Kc : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200103 osmo_hexdump(t->vec.kc, sizeof(t->vec.kc)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100104 VTY_NEWLINE);
105 }
Holger Hans Peter Freytherb9708942013-07-27 19:42:35 +0200106
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200107 reqs = 0;
Harald Welte2483f1b2016-06-19 18:06:02 +0200108 llist_for_each(entry, &vsub->cs.requests)
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200109 reqs += 1;
Harald Welte2483f1b2016-06-19 18:06:02 +0200110 vty_out(vty, " Paging: %s paging for %d requests%s",
111 vsub->cs.is_paging ? "is" : "not", reqs, VTY_NEWLINE);
112 vty_out(vty, " Use count: %u%s", vsub->use_count, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100113}
114
115
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200116/* Subscriber */
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200117DEFUN(show_subscr_cache,
118 show_subscr_cache_cmd,
119 "show subscriber cache",
Harald Weltecfaabbb2012-08-16 23:23:50 +0200120 SHOW_STR "Show information about subscribers\n"
121 "Display contents of subscriber cache\n")
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200122{
Harald Welte2483f1b2016-06-19 18:06:02 +0200123 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
124 struct vlr_subscr *vsub;
125 int count = 0;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200126
Harald Welte2483f1b2016-06-19 18:06:02 +0200127 llist_for_each_entry(vsub, &gsmnet->vlr->subscribers, list) {
128 if (++count > 100) {
129 vty_out(vty, "%% More than %d subscribers in cache,"
130 " stopping here.%s", count-1, VTY_NEWLINE);
131 break;
132 }
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200133 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200134 subscr_dump_full_vty(vty, vsub);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200135 }
136
137 return CMD_SUCCESS;
138}
139
140DEFUN(sms_send_pend,
141 sms_send_pend_cmd,
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100142 "sms send pending",
Neels Hofmeyrd1fdefe2016-04-01 02:17:24 +0200143 "SMS related commands\n" "SMS Sending related commands\n"
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100144 "Send all pending SMS")
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200145{
Harald Weltedcccb182010-05-16 20:52:23 +0200146 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200147 struct gsm_sms *sms;
Harald Welte2483f1b2016-06-19 18:06:02 +0200148 unsigned long long sms_id = 0;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200149
150 while (1) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200151 sms = db_sms_get_next_unsent(gsmnet, sms_id, UINT_MAX);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200152 if (!sms)
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100153 break;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200154
Harald Welte2483f1b2016-06-19 18:06:02 +0200155 if (sms->receiver)
156 gsm411_send_sms_subscr(sms->receiver, sms);
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100157
Harald Welte2483f1b2016-06-19 18:06:02 +0200158 sms_id = sms->id + 1;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200159 }
160
161 return CMD_SUCCESS;
162}
163
Harald Welte2483f1b2016-06-19 18:06:02 +0200164static int _send_sms_str(struct vlr_subscr *receiver,
165 struct vlr_subscr *sender,
166 char *str, uint8_t tp_pid)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200167{
Harald Welte2483f1b2016-06-19 18:06:02 +0200168 struct gsm_network *net = receiver->vlr->user_ctx;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200169 struct gsm_sms *sms;
170
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100171 sms = sms_from_text(receiver, sender, 0, str);
Harald Welte793a1352009-11-05 15:51:17 +0900172 sms->protocol_id = tp_pid;
Nico Golde59502362010-06-29 20:13:06 +0200173
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100174 /* store in database for the queue */
175 if (db_sms_store(sms) != 0) {
Holger Hans Peter Freythereff409492012-11-10 19:46:58 +0100176 LOGP(DLSMS, LOGL_ERROR, "Failed to store SMS in Database\n");
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100177 sms_free(sms);
178 return CMD_WARNING;
Nico Golde59502362010-06-29 20:13:06 +0200179 }
Neels Hofmeyr1e918c32016-05-09 21:48:53 +0200180 LOGP(DLSMS, LOGL_DEBUG, "SMS stored in DB\n");
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200181
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100182 sms_free(sms);
Harald Welte2483f1b2016-06-19 18:06:02 +0200183 sms_queue_trigger(net->sms_queue);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200184 return CMD_SUCCESS;
185}
186
Harald Welte2483f1b2016-06-19 18:06:02 +0200187static struct vlr_subscr *get_vsub_by_argv(struct gsm_network *gsmnet,
188 const char *type,
189 const char *id)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200190{
Harald Welte2483f1b2016-06-19 18:06:02 +0200191 if (!strcmp(type, "extension") || !strcmp(type, "msisdn"))
192 return vlr_subscr_find_by_msisdn(gsmnet->vlr, id);
193 else if (!strcmp(type, "imsi") || !strcmp(type, "id"))
194 return vlr_subscr_find_by_imsi(gsmnet->vlr, id);
Harald Welte98f9c752009-11-14 08:00:53 +0100195 else if (!strcmp(type, "tmsi"))
Harald Welte2483f1b2016-06-19 18:06:02 +0200196 return vlr_subscr_find_by_tmsi(gsmnet->vlr, atoi(id));
Harald Welte98f9c752009-11-14 08:00:53 +0100197
198 return NULL;
199}
200#define SUBSCR_TYPES "(extension|imsi|tmsi|id)"
Harald Welte28326062010-05-14 20:05:17 +0200201#define SUBSCR_HELP "Operations on a Subscriber\n" \
Neels Hofmeyrd1fdefe2016-04-01 02:17:24 +0200202 "Identify subscriber by extension (phone number)\n" \
203 "Identify subscriber by IMSI\n" \
204 "Identify subscriber by TMSI\n" \
205 "Identify subscriber by database ID\n" \
Harald Welte28326062010-05-14 20:05:17 +0200206 "Identifier for the subscriber\n"
Harald Welte98f9c752009-11-14 08:00:53 +0100207
Harald Welteb4a84e12010-05-27 10:44:58 +0200208DEFUN(show_subscr,
209 show_subscr_cmd,
210 "show subscriber " SUBSCR_TYPES " ID",
211 SHOW_STR SUBSCR_HELP)
212{
213 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200214 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],
215 argv[1]);
Harald Welteb4a84e12010-05-27 10:44:58 +0200216
Harald Welte2483f1b2016-06-19 18:06:02 +0200217 if (!vsub) {
Harald Welteb4a84e12010-05-27 10:44:58 +0200218 vty_out(vty, "%% No subscriber found for %s %s%s",
219 argv[0], argv[1], VTY_NEWLINE);
220 return CMD_WARNING;
221 }
222
Harald Welte2483f1b2016-06-19 18:06:02 +0200223 subscr_dump_full_vty(vty, vsub);
Harald Welteb4a84e12010-05-27 10:44:58 +0200224
Harald Welte2483f1b2016-06-19 18:06:02 +0200225 vlr_subscr_put(vsub);
Harald Welteb4a84e12010-05-27 10:44:58 +0200226
227 return CMD_SUCCESS;
228}
229
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200230DEFUN(subscriber_create,
231 subscriber_create_cmd,
232 "subscriber create imsi ID",
233 "Operations on a Subscriber\n" \
234 "Create new subscriber\n" \
235 "Identify the subscriber by his IMSI\n" \
236 "Identifier for the subscriber\n")
237{
Harald Welte2483f1b2016-06-19 18:06:02 +0200238 vty_out(vty, "%% 'subscriber create' now needs to be done at osmo-hlr%s",
239 VTY_NEWLINE);
240 return CMD_WARNING;
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200241}
242
Nico Goldeb62b1232011-02-22 17:54:47 +0100243DEFUN(subscriber_send_pending_sms,
244 subscriber_send_pending_sms_cmd,
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200245 "subscriber " SUBSCR_TYPES " ID sms pending-send",
Nico Goldeb62b1232011-02-22 17:54:47 +0100246 SUBSCR_HELP "SMS Operations\n" "Send pending SMS\n")
247{
248 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200249 struct vlr_subscr *vsub;
Nico Goldeb62b1232011-02-22 17:54:47 +0100250 struct gsm_sms *sms;
251
Harald Welte2483f1b2016-06-19 18:06:02 +0200252 vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
253 if (!vsub) {
Holger Hans Peter Freyther9feef482013-07-04 20:34:46 +0200254 vty_out(vty, "%% No subscriber found for %s %s%s",
255 argv[0], argv[1], VTY_NEWLINE);
256 return CMD_WARNING;
257 }
258
Harald Welte2483f1b2016-06-19 18:06:02 +0200259 sms = db_sms_get_unsent_for_subscr(vsub, UINT_MAX);
Nico Goldeb62b1232011-02-22 17:54:47 +0100260 if (sms)
261 gsm411_send_sms_subscr(sms->receiver, sms);
262
Harald Welte2483f1b2016-06-19 18:06:02 +0200263 vlr_subscr_put(vsub);
Nico Goldeb62b1232011-02-22 17:54:47 +0100264
265 return CMD_SUCCESS;
266}
267
Harald Welte98f9c752009-11-14 08:00:53 +0100268DEFUN(subscriber_send_sms,
269 subscriber_send_sms_cmd,
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100270 "subscriber " SUBSCR_TYPES " ID sms sender " SUBSCR_TYPES " SENDER_ID send .LINE",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100271 SUBSCR_HELP "SMS Operations\n" SUBSCR_HELP "Send SMS\n" "Actual SMS Text\n")
Harald Welte98f9c752009-11-14 08:00:53 +0100272{
Harald Weltedcccb182010-05-16 20:52:23 +0200273 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200274 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
275 struct vlr_subscr *sender = get_vsub_by_argv(gsmnet, argv[2], argv[3]);
Harald Welte20474ad2010-05-16 19:28:32 +0200276 char *str;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200277 int rc;
278
Harald Welte2483f1b2016-06-19 18:06:02 +0200279 if (!vsub) {
Harald Welte20f98312009-11-14 10:11:45 +0100280 vty_out(vty, "%% No subscriber found for %s %s%s",
281 argv[0], argv[1], VTY_NEWLINE);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100282 rc = CMD_WARNING;
283 goto err;
Harald Welte20f98312009-11-14 10:11:45 +0100284 }
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100285
286 if (!sender) {
287 vty_out(vty, "%% No sender found for %s %s%s",
288 argv[2], argv[3], VTY_NEWLINE);
289 rc = CMD_WARNING;
290 goto err;
291 }
292
293 str = argv_concat(argv, argc, 4);
Harald Welte2483f1b2016-06-19 18:06:02 +0200294 rc = _send_sms_str(vsub, sender, str, 0);
Harald Welte20474ad2010-05-16 19:28:32 +0200295 talloc_free(str);
Harald Welte793a1352009-11-05 15:51:17 +0900296
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100297err:
298 if (sender)
Harald Welte2483f1b2016-06-19 18:06:02 +0200299 vlr_subscr_put(sender);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100300
Harald Welte2483f1b2016-06-19 18:06:02 +0200301 if (vsub)
302 vlr_subscr_put(vsub);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100303
Harald Welte793a1352009-11-05 15:51:17 +0900304 return rc;
305}
306
Harald Welte98f9c752009-11-14 08:00:53 +0100307DEFUN(subscriber_silent_sms,
308 subscriber_silent_sms_cmd,
Harald Welte1011d5b2014-07-10 20:19:00 +0200309
310 "subscriber " SUBSCR_TYPES " ID silent-sms sender " SUBSCR_TYPES " SENDER_ID send .LINE",
311 SUBSCR_HELP "Silent SMS Operations\n" SUBSCR_HELP "Send SMS\n" "Actual SMS Text\n")
Harald Welte793a1352009-11-05 15:51:17 +0900312{
Harald Weltedcccb182010-05-16 20:52:23 +0200313 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200314 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
315 struct vlr_subscr *sender = get_vsub_by_argv(gsmnet, argv[2], argv[3]);
Harald Welte20474ad2010-05-16 19:28:32 +0200316 char *str;
Harald Welte793a1352009-11-05 15:51:17 +0900317 int rc;
318
Harald Welte2483f1b2016-06-19 18:06:02 +0200319 if (!vsub) {
Harald Welte20f98312009-11-14 10:11:45 +0100320 vty_out(vty, "%% No subscriber found for %s %s%s",
321 argv[0], argv[1], VTY_NEWLINE);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100322 rc = CMD_WARNING;
323 goto err;
Harald Welte20f98312009-11-14 10:11:45 +0100324 }
Harald Welte793a1352009-11-05 15:51:17 +0900325
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100326 if (!sender) {
327 vty_out(vty, "%% No sender found for %s %s%s",
328 argv[2], argv[3], VTY_NEWLINE);
329 rc = CMD_WARNING;
330 goto err;
331 }
332
333 str = argv_concat(argv, argc, 4);
Harald Welte2483f1b2016-06-19 18:06:02 +0200334 rc = _send_sms_str(vsub, sender, str, 64);
Harald Welte20474ad2010-05-16 19:28:32 +0200335 talloc_free(str);
Harald Welte793a1352009-11-05 15:51:17 +0900336
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100337err:
338 if (sender)
Harald Welte2483f1b2016-06-19 18:06:02 +0200339 vlr_subscr_put(sender);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100340
Harald Welte2483f1b2016-06-19 18:06:02 +0200341 if (vsub)
342 vlr_subscr_put(vsub);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100343
Harald Welte793a1352009-11-05 15:51:17 +0900344 return rc;
345}
346
Harald Welte28326062010-05-14 20:05:17 +0200347#define CHAN_TYPES "(any|tch/f|tch/any|sdcch)"
348#define CHAN_TYPE_HELP \
349 "Any channel\n" \
350 "TCH/F channel\n" \
351 "Any TCH channel\n" \
352 "SDCCH channel\n"
353
Sylvain Munaut50480702010-01-02 14:29:43 +0100354DEFUN(subscriber_silent_call_start,
355 subscriber_silent_call_start_cmd,
Harald Welteb4a84e12010-05-27 10:44:58 +0200356 "subscriber " SUBSCR_TYPES " ID silent-call start (any|tch/f|tch/any|sdcch)",
Harald Welte28326062010-05-14 20:05:17 +0200357 SUBSCR_HELP "Silent call operation\n" "Start silent call\n"
358 CHAN_TYPE_HELP)
Sylvain Munaut50480702010-01-02 14:29:43 +0100359{
Harald Weltedcccb182010-05-16 20:52:23 +0200360 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200361 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Sylvain Munaut50480702010-01-02 14:29:43 +0100362 int rc, type;
363
Harald Welte2483f1b2016-06-19 18:06:02 +0200364 if (!vsub) {
Sylvain Munaut50480702010-01-02 14:29:43 +0100365 vty_out(vty, "%% No subscriber found for %s %s%s",
366 argv[0], argv[1], VTY_NEWLINE);
367 return CMD_WARNING;
368 }
369
370 if (!strcmp(argv[2], "tch/f"))
371 type = RSL_CHANNEED_TCH_F;
372 else if (!strcmp(argv[2], "tch/any"))
373 type = RSL_CHANNEED_TCH_ForH;
374 else if (!strcmp(argv[2], "sdcch"))
375 type = RSL_CHANNEED_SDCCH;
376 else
377 type = RSL_CHANNEED_ANY; /* Defaults to ANY */
378
Harald Welte2483f1b2016-06-19 18:06:02 +0200379 rc = gsm_silent_call_start(vsub, vty, type);
Sylvain Munaut50480702010-01-02 14:29:43 +0100380 if (rc <= 0) {
381 vty_out(vty, "%% Subscriber not attached%s",
382 VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200383 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100384 return CMD_WARNING;
385 }
386
Harald Welte2483f1b2016-06-19 18:06:02 +0200387 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100388
389 return CMD_SUCCESS;
390}
391
392DEFUN(subscriber_silent_call_stop,
393 subscriber_silent_call_stop_cmd,
Harald Welteb4a84e12010-05-27 10:44:58 +0200394 "subscriber " SUBSCR_TYPES " ID silent-call stop",
Harald Welte28326062010-05-14 20:05:17 +0200395 SUBSCR_HELP "Silent call operation\n" "Stop silent call\n"
396 CHAN_TYPE_HELP)
Harald Weltea1482332009-11-14 10:08:40 +0100397{
Harald Weltedcccb182010-05-16 20:52:23 +0200398 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200399 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Harald Weltea1482332009-11-14 10:08:40 +0100400 int rc;
401
Harald Welte2483f1b2016-06-19 18:06:02 +0200402 if (!vsub) {
Harald Weltea1482332009-11-14 10:08:40 +0100403 vty_out(vty, "%% No subscriber found for %s %s%s",
Harald Welte20f98312009-11-14 10:11:45 +0100404 argv[0], argv[1], VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100405 return CMD_WARNING;
406 }
407
Harald Welte2483f1b2016-06-19 18:06:02 +0200408 rc = gsm_silent_call_stop(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100409 if (rc < 0) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200410 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100411 return CMD_WARNING;
Harald Weltea1482332009-11-14 10:08:40 +0100412 }
413
Harald Welte2483f1b2016-06-19 18:06:02 +0200414 vlr_subscr_put(vsub);
Harald Weltea1482332009-11-14 10:08:40 +0100415
416 return CMD_SUCCESS;
417}
418
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800419DEFUN(subscriber_ussd_notify,
420 subscriber_ussd_notify_cmd,
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800421 "subscriber " SUBSCR_TYPES " ID ussd-notify (0|1|2) .TEXT",
Harald Weltecfaabbb2012-08-16 23:23:50 +0200422 SUBSCR_HELP "Send a USSD notify to the subscriber\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +0200423 "Alerting Level 0\n"
424 "Alerting Level 1\n"
425 "Alerting Level 2\n"
426 "Text of USSD message to send\n")
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800427{
428 char *text;
429 struct gsm_subscriber_connection *conn;
430 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200431 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800432 int level;
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800433
Harald Welte2483f1b2016-06-19 18:06:02 +0200434 if (!vsub) {
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800435 vty_out(vty, "%% No subscriber found for %s %s%s",
436 argv[0], argv[1], VTY_NEWLINE);
437 return CMD_WARNING;
438 }
439
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800440 level = atoi(argv[2]);
441 text = argv_concat(argv, argc, 3);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800442 if (!text) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200443 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800444 return CMD_WARNING;
445 }
446
Harald Welte2483f1b2016-06-19 18:06:02 +0200447 conn = connection_for_subscr(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800448 if (!conn) {
449 vty_out(vty, "%% An active connection is required for %s %s%s",
450 argv[0], argv[1], VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200451 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800452 talloc_free(text);
453 return CMD_WARNING;
454 }
455
Neels Hofmeyr43273c62016-05-10 12:50:31 +0200456 msc_send_ussd_notify(conn, level, text);
457 msc_send_ussd_release_complete(conn);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800458
Harald Welte2483f1b2016-06-19 18:06:02 +0200459 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800460 talloc_free(text);
461 return CMD_SUCCESS;
462}
463
Harald Welte94307772017-06-12 01:52:27 +0200464static int loop_by_char(uint8_t ch)
465{
466 switch (ch) {
467 case 'a':
468 return GSM414_LOOP_A;
469 case 'b':
470 return GSM414_LOOP_B;
471 case 'c':
472 return GSM414_LOOP_C;
473 case 'd':
474 return GSM414_LOOP_D;
475 case 'e':
476 return GSM414_LOOP_E;
477 case 'f':
478 return GSM414_LOOP_F;
479 case 'i':
480 return GSM414_LOOP_I;
481 }
482 return -1;
483}
484
485DEFUN(subscriber_mstest_close,
486 subscriber_mstest_close_cmd,
487 "subscriber " SUBSCR_TYPES " ID ms-test close-loop (a|b|c|d|e|f|i)",
488 SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
489 "Close a TCH Loop inside the MS\n"
490 "Loop Type A\n"
491 "Loop Type B\n"
492 "Loop Type C\n"
493 "Loop Type D\n"
494 "Loop Type E\n"
495 "Loop Type F\n"
496 "Loop Type I\n")
497{
498 struct gsm_subscriber_connection *conn;
499 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
500 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
501 const char *loop_str;
502 int loop_mode;
503
504 if (!vsub) {
505 vty_out(vty, "%% No subscriber found for %s %s%s",
506 argv[0], argv[1], VTY_NEWLINE);
507 return CMD_WARNING;
508 }
509
510 loop_str = argv[2];
511 loop_mode = loop_by_char(loop_str[0]);
512
513 conn = connection_for_subscr(vsub);
514 if (!conn) {
515 vty_out(vty, "%% An active connection is required for %s %s%s",
516 argv[0], argv[1], VTY_NEWLINE);
517 vlr_subscr_put(vsub);
518 return CMD_WARNING;
519 }
520
521 gsm0414_tx_close_tch_loop_cmd(conn, loop_mode);
522
523 return CMD_SUCCESS;
524}
525
526DEFUN(subscriber_mstest_open,
527 subscriber_mstest_open_cmd,
528 "subscriber " SUBSCR_TYPES " ID ms-test open-loop",
529 SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
530 "Open a TCH Loop inside the MS\n")
531{
532 struct gsm_subscriber_connection *conn;
533 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
534 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
535
536 if (!vsub) {
537 vty_out(vty, "%% No subscriber found for %s %s%s",
538 argv[0], argv[1], VTY_NEWLINE);
539 return CMD_WARNING;
540 }
541
542 conn = connection_for_subscr(vsub);
543 if (!conn) {
544 vty_out(vty, "%% An active connection is required for %s %s%s",
545 argv[0], argv[1], VTY_NEWLINE);
546 vlr_subscr_put(vsub);
547 return CMD_WARNING;
548 }
549
550 gsm0414_tx_open_loop_cmd(conn);
551
552 return CMD_SUCCESS;
553}
554
Keithd32b6d12017-01-18 17:09:33 +0100555DEFUN(ena_subscr_expire,
556 ena_subscr_expire_cmd,
557 "subscriber " SUBSCR_TYPES " ID expire",
558 SUBSCR_HELP "Expire the subscriber Now\n")
559{
Keithd32b6d12017-01-18 17:09:33 +0100560 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200561 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],
562 argv[1]);
Keithd32b6d12017-01-18 17:09:33 +0100563
Harald Welte2483f1b2016-06-19 18:06:02 +0200564 if (!vsub) {
Keithd32b6d12017-01-18 17:09:33 +0100565 vty_out(vty, "%% No subscriber found for %s %s%s",
566 argv[0], argv[1], VTY_NEWLINE);
567 return CMD_WARNING;
568 }
569
Maxdcc193d2017-12-27 19:34:15 +0100570 if (vlr_subscr_expire(vsub))
Harald Welte2483f1b2016-06-19 18:06:02 +0200571 vty_out(vty, "%% VLR released subscriber %s%s",
572 vlr_subscr_name(vsub), VTY_NEWLINE);
Keithd32b6d12017-01-18 17:09:33 +0100573
Harald Welte2483f1b2016-06-19 18:06:02 +0200574 if (vsub->use_count > 1)
575 vty_out(vty, "%% Subscriber %s is still in use,"
576 " should be released soon%s",
577 vlr_subscr_name(vsub), VTY_NEWLINE);
578
579 vlr_subscr_put(vsub);
Keithd32b6d12017-01-18 17:09:33 +0100580 return CMD_SUCCESS;
581}
582
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200583#define A3A8_ALG_TYPES "(none|xor|comp128v1)"
Harald Welte28326062010-05-14 20:05:17 +0200584#define A3A8_ALG_HELP \
585 "Use No A3A8 algorithm\n" \
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200586 "Use XOR algorithm\n" \
Harald Welte28326062010-05-14 20:05:17 +0200587 "Use COMP128v1 algorithm\n"
Sylvain Munaut99792902009-12-27 19:30:46 +0100588
Harald Welteb4a84e12010-05-27 10:44:58 +0200589DEFUN(ena_subscr_a3a8,
590 ena_subscr_a3a8_cmd,
591 "subscriber " SUBSCR_TYPES " ID a3a8 " A3A8_ALG_TYPES " [KI]",
Harald Welted3cf85d2010-05-27 10:48:11 +0200592 SUBSCR_HELP "Set a3a8 parameters for the subscriber\n"
593 A3A8_ALG_HELP "Encryption Key Ki\n")
Sylvain Munaut99792902009-12-27 19:30:46 +0100594{
Harald Welte2483f1b2016-06-19 18:06:02 +0200595 vty_out(vty, "%% 'subscriber a3a8' is no longer supported.%s"
596 "%% This is now up to osmo-hlr.%s",
597 VTY_NEWLINE, VTY_NEWLINE);
598 return CMD_WARNING;
Sylvain Munaut99792902009-12-27 19:30:46 +0100599}
600
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100601DEFUN(subscriber_update,
602 subscriber_update_cmd,
603 "subscriber " SUBSCR_TYPES " ID update",
604 SUBSCR_HELP "Update the subscriber data from the dabase.\n")
605{
Harald Welte2483f1b2016-06-19 18:06:02 +0200606 vty_out(vty, "%% 'subscriber update' is no longer supported.%s",
607 VTY_NEWLINE);
608 return CMD_WARNING;
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100609}
610
Harald Weltea1482332009-11-14 10:08:40 +0100611static int scall_cbfn(unsigned int subsys, unsigned int signal,
612 void *handler_data, void *signal_data)
613{
614 struct scall_signal_data *sigdata = signal_data;
615 struct vty *vty = sigdata->data;
616
617 switch (signal) {
618 case S_SCALL_SUCCESS:
Neels Hofmeyre2f24d52017-05-08 15:12:20 +0200619 vty_out(vty, "%% silent call success%s", VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100620 break;
621 case S_SCALL_EXPIRED:
622 vty_out(vty, "%% silent call expired paging%s", VTY_NEWLINE);
623 break;
624 }
625 return 0;
626}
627
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200628DEFUN(show_stats,
629 show_stats_cmd,
630 "show statistics",
631 SHOW_STR "Display network statistics\n")
632{
Harald Weltedcccb182010-05-16 20:52:23 +0200633 struct gsm_network *net = gsmnet_from_vty(vty);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200634
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200635 vty_out(vty, "Location Update : %lu attach, %lu normal, %lu periodic%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200636 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_ATTACH].current,
637 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_NORMAL].current,
638 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_PERIODIC].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200639 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200640 vty_out(vty, "IMSI Detach Indications : %lu%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200641 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_DETACH].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200642 VTY_NEWLINE);
Neels Hofmeyr36891a72016-05-09 13:18:03 +0200643 vty_out(vty, "Location Updating Results: %lu completed, %lu failed%s",
644 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_COMPLETED].current,
645 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_FAILED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200646 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200647 vty_out(vty, "SMS MO : %lu submitted, %lu no receiver%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200648 net->msc_ctrs->ctr[MSC_CTR_SMS_SUBMITTED].current,
649 net->msc_ctrs->ctr[MSC_CTR_SMS_NO_RECEIVER].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200650 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200651 vty_out(vty, "SMS MT : %lu delivered, %lu no memory, %lu other error%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200652 net->msc_ctrs->ctr[MSC_CTR_SMS_DELIVERED].current,
653 net->msc_ctrs->ctr[MSC_CTR_SMS_RP_ERR_MEM].current,
654 net->msc_ctrs->ctr[MSC_CTR_SMS_RP_ERR_OTHER].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200655 VTY_NEWLINE);
Harald Weltea29e43a2010-12-24 16:06:33 +0100656 vty_out(vty, "MO Calls : %lu setup, %lu connect ack%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200657 net->msc_ctrs->ctr[MSC_CTR_CALL_MO_SETUP].current,
658 net->msc_ctrs->ctr[MSC_CTR_CALL_MO_CONNECT_ACK].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200659 VTY_NEWLINE);
Harald Weltea29e43a2010-12-24 16:06:33 +0100660 vty_out(vty, "MT Calls : %lu setup, %lu connect%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200661 net->msc_ctrs->ctr[MSC_CTR_CALL_MT_SETUP].current,
662 net->msc_ctrs->ctr[MSC_CTR_CALL_MT_CONNECT].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200663 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200664 return CMD_SUCCESS;
665}
666
Holger Hans Peter Freyther81c0e252010-12-25 14:08:00 +0100667DEFUN(show_smsqueue,
668 show_smsqueue_cmd,
669 "show sms-queue",
670 SHOW_STR "Display SMSqueue statistics\n")
671{
672 struct gsm_network *net = gsmnet_from_vty(vty);
673
674 sms_queue_stats(net->sms_queue, vty);
675 return CMD_SUCCESS;
676}
677
Holger Hans Peter Freyther7a0e1662010-12-25 14:15:32 +0100678DEFUN(smsqueue_trigger,
679 smsqueue_trigger_cmd,
680 "sms-queue trigger",
681 "SMS Queue\n" "Trigger sending messages\n")
682{
683 struct gsm_network *net = gsmnet_from_vty(vty);
684
685 sms_queue_trigger(net->sms_queue);
686 return CMD_SUCCESS;
687}
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200688
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100689DEFUN(smsqueue_max,
690 smsqueue_max_cmd,
691 "sms-queue max-pending <1-500>",
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200692 "SMS Queue\n" "SMS to deliver in parallel\n" "Amount\n")
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100693{
694 struct gsm_network *net = gsmnet_from_vty(vty);
695
696 sms_queue_set_max_pending(net->sms_queue, atoi(argv[0]));
697 return CMD_SUCCESS;
698}
699
Holger Hans Peter Freyther4dcc5e52010-12-25 14:38:30 +0100700DEFUN(smsqueue_clear,
701 smsqueue_clear_cmd,
702 "sms-queue clear",
703 "SMS Queue\n" "Clear the queue of pending SMS\n")
704{
705 struct gsm_network *net = gsmnet_from_vty(vty);
706
707 sms_queue_clear(net->sms_queue);
708 return CMD_SUCCESS;
709}
710
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100711DEFUN(smsqueue_fail,
712 smsqueue_fail_cmd,
713 "sms-queue max-failure <1-500>",
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200714 "SMS Queue\n" "Maximum amount of delivery failures\n" "Amount\n")
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100715{
716 struct gsm_network *net = gsmnet_from_vty(vty);
717
718 sms_queue_set_max_failure(net->sms_queue, atoi(argv[0]));
719 return CMD_SUCCESS;
720}
721
Harald Welteab386e62011-09-01 18:18:43 +0200722
723DEFUN(cfg_mncc_int, cfg_mncc_int_cmd,
724 "mncc-int", "Configure internal MNCC handler")
725{
726 vty->node = MNCC_INT_NODE;
727
728 return CMD_SUCCESS;
729}
730
731static struct cmd_node mncc_int_node = {
732 MNCC_INT_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200733 "%s(config-mncc-int)# ",
Harald Welteab386e62011-09-01 18:18:43 +0200734 1,
735};
736
737static const struct value_string tchf_codec_names[] = {
738 { GSM48_CMODE_SPEECH_V1, "fr" },
739 { GSM48_CMODE_SPEECH_EFR, "efr" },
740 { GSM48_CMODE_SPEECH_AMR, "amr" },
741 { 0, NULL }
742};
743
744static const struct value_string tchh_codec_names[] = {
745 { GSM48_CMODE_SPEECH_V1, "hr" },
746 { GSM48_CMODE_SPEECH_AMR, "amr" },
747 { 0, NULL }
748};
749
750static int config_write_mncc_int(struct vty *vty)
751{
752 vty_out(vty, "mncc-int%s", VTY_NEWLINE);
753 vty_out(vty, " default-codec tch-f %s%s",
754 get_value_string(tchf_codec_names, mncc_int.def_codec[0]),
755 VTY_NEWLINE);
756 vty_out(vty, " default-codec tch-h %s%s",
757 get_value_string(tchh_codec_names, mncc_int.def_codec[1]),
758 VTY_NEWLINE);
759
760 return CMD_SUCCESS;
761}
762
763DEFUN(mnccint_def_codec_f,
764 mnccint_def_codec_f_cmd,
765 "default-codec tch-f (fr|efr|amr)",
766 "Set default codec\n" "Codec for TCH/F\n"
767 "Full-Rate\n" "Enhanced Full-Rate\n" "Adaptive Multi-Rate\n")
768{
769 mncc_int.def_codec[0] = get_string_value(tchf_codec_names, argv[0]);
770
771 return CMD_SUCCESS;
772}
773
774DEFUN(mnccint_def_codec_h,
775 mnccint_def_codec_h_cmd,
776 "default-codec tch-h (hr|amr)",
777 "Set default codec\n" "Codec for TCH/H\n"
778 "Half-Rate\n" "Adaptive Multi-Rate\n")
779{
780 mncc_int.def_codec[1] = get_string_value(tchh_codec_names, argv[0]);
781
782 return CMD_SUCCESS;
783}
784
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100785
786DEFUN(logging_fltr_imsi,
787 logging_fltr_imsi_cmd,
788 "logging filter imsi IMSI",
789 LOGGING_STR FILTER_STR
790 "Filter log messages by IMSI\n" "IMSI to be used as filter\n")
791{
Harald Welte2483f1b2016-06-19 18:06:02 +0200792 struct vlr_subscr *vlr_subscr;
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100793 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
794 struct log_target *tgt = osmo_log_vty2tgt(vty);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100795 const char *imsi = argv[0];
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100796
797 if (!tgt)
798 return CMD_WARNING;
799
Harald Welte2483f1b2016-06-19 18:06:02 +0200800 vlr_subscr = vlr_subscr_find_by_imsi(gsmnet->vlr, imsi);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100801
Neels Hofmeyr84da6b12016-05-20 21:59:55 +0200802 if (!vlr_subscr) {
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100803 vty_out(vty, "%%no subscriber with IMSI(%s)%s",
804 argv[0], VTY_NEWLINE);
805 return CMD_WARNING;
806 }
807
Harald Welte2483f1b2016-06-19 18:06:02 +0200808 log_set_filter_vlr_subscr(tgt, vlr_subscr);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100809 return CMD_SUCCESS;
810}
Holger Hans Peter Freyther925c57f2015-01-27 10:58:29 +0100811
Harald Welte2483f1b2016-06-19 18:06:02 +0200812static struct cmd_node hlr_node = {
813 HLR_NODE,
814 "%s(config-hlr)# ",
815 1,
816};
817
818DEFUN(cfg_hlr, cfg_hlr_cmd,
819 "hlr", "Configure connection to the HLR")
820{
821 vty->node = HLR_NODE;
822 return CMD_SUCCESS;
823}
824
825DEFUN(cfg_hlr_remote_ip, cfg_hlr_remote_ip_cmd, "remote-ip A.B.C.D",
826 "Remote GSUP address of the HLR\n"
827 "Remote GSUP address (default: " MSC_HLR_REMOTE_IP_DEFAULT ")")
828{
829 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
830 talloc_free((void*)gsmnet->gsup_server_addr_str);
831 gsmnet->gsup_server_addr_str = talloc_strdup(gsmnet, argv[0]);
832 return CMD_SUCCESS;
833}
834
835DEFUN(cfg_hlr_remote_port, cfg_hlr_remote_port_cmd, "remote-port <1-65535>",
836 "Remote GSUP port of the HLR\n"
837 "Remote GSUP port (default: " OSMO_STRINGIFY(MSC_HLR_REMOTE_PORT_DEFAULT) ")")
838{
839 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
840 gsmnet->gsup_server_port = atoi(argv[0]);
841 return CMD_SUCCESS;
842}
843
844static int config_write_hlr(struct vty *vty)
845{
846 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
847
848 vty_out(vty, "hlr%s", VTY_NEWLINE);
849 vty_out(vty, " remote-ip %s%s",
850 gsmnet->gsup_server_addr_str, VTY_NEWLINE);
851 vty_out(vty, " remote-port %u%s",
852 gsmnet->gsup_server_port, VTY_NEWLINE);
853 return CMD_SUCCESS;
854}
855
Harald Weltedcccb182010-05-16 20:52:23 +0200856int bsc_vty_init_extra(void)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200857{
Pablo Neira Ayusobbc5b992011-05-06 12:12:31 +0200858 osmo_signal_register_handler(SS_SCALL, scall_cbfn, NULL);
Harald Weltea1482332009-11-14 10:08:40 +0100859
Harald Welteb4d5b172010-05-12 16:10:35 +0000860 install_element_ve(&show_subscr_cmd);
861 install_element_ve(&show_subscr_cache_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200862
Harald Welteb4d5b172010-05-12 16:10:35 +0000863 install_element_ve(&sms_send_pend_cmd);
Harald Welte98f9c752009-11-14 08:00:53 +0100864
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200865 install_element_ve(&subscriber_create_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +0000866 install_element_ve(&subscriber_send_sms_cmd);
867 install_element_ve(&subscriber_silent_sms_cmd);
868 install_element_ve(&subscriber_silent_call_start_cmd);
869 install_element_ve(&subscriber_silent_call_stop_cmd);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800870 install_element_ve(&subscriber_ussd_notify_cmd);
Harald Welte94307772017-06-12 01:52:27 +0200871 install_element_ve(&subscriber_mstest_close_cmd);
872 install_element_ve(&subscriber_mstest_open_cmd);
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100873 install_element_ve(&subscriber_update_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +0000874 install_element_ve(&show_stats_cmd);
Holger Hans Peter Freyther81c0e252010-12-25 14:08:00 +0100875 install_element_ve(&show_smsqueue_cmd);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100876 install_element_ve(&logging_fltr_imsi_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200877
Keithd32b6d12017-01-18 17:09:33 +0100878 install_element(ENABLE_NODE, &ena_subscr_expire_cmd);
Harald Welteb4a84e12010-05-27 10:44:58 +0200879 install_element(ENABLE_NODE, &ena_subscr_a3a8_cmd);
Holger Hans Peter Freyther7a0e1662010-12-25 14:15:32 +0100880 install_element(ENABLE_NODE, &smsqueue_trigger_cmd);
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100881 install_element(ENABLE_NODE, &smsqueue_max_cmd);
Holger Hans Peter Freyther4dcc5e52010-12-25 14:38:30 +0100882 install_element(ENABLE_NODE, &smsqueue_clear_cmd);
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100883 install_element(ENABLE_NODE, &smsqueue_fail_cmd);
Nico Goldeb62b1232011-02-22 17:54:47 +0100884 install_element(ENABLE_NODE, &subscriber_send_pending_sms_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200885
Harald Welteab386e62011-09-01 18:18:43 +0200886 install_element(CONFIG_NODE, &cfg_mncc_int_cmd);
887 install_node(&mncc_int_node, config_write_mncc_int);
Harald Welteab386e62011-09-01 18:18:43 +0200888 install_element(MNCC_INT_NODE, &mnccint_def_codec_f_cmd);
889 install_element(MNCC_INT_NODE, &mnccint_def_codec_h_cmd);
890
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100891 install_element(CFG_LOG_NODE, &logging_fltr_imsi_cmd);
Harald Welteb02fc1e2013-02-12 11:15:49 +0100892
Harald Welte2483f1b2016-06-19 18:06:02 +0200893 install_element(CONFIG_NODE, &cfg_hlr_cmd);
894 install_node(&hlr_node, config_write_hlr);
895 install_element(HLR_NODE, &cfg_hlr_remote_ip_cmd);
896 install_element(HLR_NODE, &cfg_hlr_remote_port_cmd);
Holger Hans Peter Freyther925c57f2015-01-27 10:58:29 +0100897
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200898 return 0;
899}