blob: fb6d32ac4ec7a017eeba0a24807a1c66ba3fce59 [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
Stefan Sperling87cba1f2018-01-22 17:05:37 +0100164
165DEFUN(sms_delete_expired,
166 sms_delete_expired_cmd,
167 "sms delete expired",
168 "SMS related commands\n" "SMS Database related commands\n"
169 "Delete all expired SMS")
170{
171 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
172 struct gsm_sms *sms;
173 unsigned long long sms_id = 0;
174 long long num_deleted = 0;
175
176 while (1) {
177 sms = db_sms_get_next_unsent(gsmnet, sms_id, UINT_MAX);
178 if (!sms)
179 break;
180
181 /* Skip SMS which are currently queued for sending. */
182 if (sms_queue_sms_is_pending(gsmnet->sms_queue, sms->id))
183 continue;
184
185 /* Expiration check is performed by the DB layer. */
186 if (db_sms_delete_expired_message_by_id(sms->id) == 0)
187 num_deleted++;
188
189 sms_id = sms->id + 1;
190 }
191
192 if (num_deleted == 0) {
193 vty_out(vty, "No expired SMS in database%s", VTY_NEWLINE);
194 return CMD_WARNING;
195 }
196
197 vty_out(vty, "Deleted %llu expired SMS from database%s", num_deleted, VTY_NEWLINE);
198 return CMD_SUCCESS;
199}
200
201
Harald Welte2483f1b2016-06-19 18:06:02 +0200202static int _send_sms_str(struct vlr_subscr *receiver,
203 struct vlr_subscr *sender,
204 char *str, uint8_t tp_pid)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200205{
Harald Welte2483f1b2016-06-19 18:06:02 +0200206 struct gsm_network *net = receiver->vlr->user_ctx;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200207 struct gsm_sms *sms;
208
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100209 sms = sms_from_text(receiver, sender, 0, str);
Harald Welte793a1352009-11-05 15:51:17 +0900210 sms->protocol_id = tp_pid;
Nico Golde59502362010-06-29 20:13:06 +0200211
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100212 /* store in database for the queue */
213 if (db_sms_store(sms) != 0) {
Holger Hans Peter Freythereff409492012-11-10 19:46:58 +0100214 LOGP(DLSMS, LOGL_ERROR, "Failed to store SMS in Database\n");
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100215 sms_free(sms);
216 return CMD_WARNING;
Nico Golde59502362010-06-29 20:13:06 +0200217 }
Neels Hofmeyr1e918c32016-05-09 21:48:53 +0200218 LOGP(DLSMS, LOGL_DEBUG, "SMS stored in DB\n");
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200219
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100220 sms_free(sms);
Harald Welte2483f1b2016-06-19 18:06:02 +0200221 sms_queue_trigger(net->sms_queue);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200222 return CMD_SUCCESS;
223}
224
Harald Welte2483f1b2016-06-19 18:06:02 +0200225static struct vlr_subscr *get_vsub_by_argv(struct gsm_network *gsmnet,
226 const char *type,
227 const char *id)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200228{
Harald Welte2483f1b2016-06-19 18:06:02 +0200229 if (!strcmp(type, "extension") || !strcmp(type, "msisdn"))
230 return vlr_subscr_find_by_msisdn(gsmnet->vlr, id);
231 else if (!strcmp(type, "imsi") || !strcmp(type, "id"))
232 return vlr_subscr_find_by_imsi(gsmnet->vlr, id);
Harald Welte98f9c752009-11-14 08:00:53 +0100233 else if (!strcmp(type, "tmsi"))
Harald Welte2483f1b2016-06-19 18:06:02 +0200234 return vlr_subscr_find_by_tmsi(gsmnet->vlr, atoi(id));
Harald Welte98f9c752009-11-14 08:00:53 +0100235
236 return NULL;
237}
238#define SUBSCR_TYPES "(extension|imsi|tmsi|id)"
Harald Welte28326062010-05-14 20:05:17 +0200239#define SUBSCR_HELP "Operations on a Subscriber\n" \
Neels Hofmeyrd1fdefe2016-04-01 02:17:24 +0200240 "Identify subscriber by extension (phone number)\n" \
241 "Identify subscriber by IMSI\n" \
242 "Identify subscriber by TMSI\n" \
243 "Identify subscriber by database ID\n" \
Harald Welte28326062010-05-14 20:05:17 +0200244 "Identifier for the subscriber\n"
Harald Welte98f9c752009-11-14 08:00:53 +0100245
Harald Welteb4a84e12010-05-27 10:44:58 +0200246DEFUN(show_subscr,
247 show_subscr_cmd,
248 "show subscriber " SUBSCR_TYPES " ID",
249 SHOW_STR SUBSCR_HELP)
250{
251 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200252 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],
253 argv[1]);
Harald Welteb4a84e12010-05-27 10:44:58 +0200254
Harald Welte2483f1b2016-06-19 18:06:02 +0200255 if (!vsub) {
Harald Welteb4a84e12010-05-27 10:44:58 +0200256 vty_out(vty, "%% No subscriber found for %s %s%s",
257 argv[0], argv[1], VTY_NEWLINE);
258 return CMD_WARNING;
259 }
260
Harald Welte2483f1b2016-06-19 18:06:02 +0200261 subscr_dump_full_vty(vty, vsub);
Harald Welteb4a84e12010-05-27 10:44:58 +0200262
Harald Welte2483f1b2016-06-19 18:06:02 +0200263 vlr_subscr_put(vsub);
Harald Welteb4a84e12010-05-27 10:44:58 +0200264
265 return CMD_SUCCESS;
266}
267
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200268DEFUN(subscriber_create,
269 subscriber_create_cmd,
270 "subscriber create imsi ID",
271 "Operations on a Subscriber\n" \
272 "Create new subscriber\n" \
273 "Identify the subscriber by his IMSI\n" \
274 "Identifier for the subscriber\n")
275{
Harald Welte2483f1b2016-06-19 18:06:02 +0200276 vty_out(vty, "%% 'subscriber create' now needs to be done at osmo-hlr%s",
277 VTY_NEWLINE);
278 return CMD_WARNING;
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200279}
280
Nico Goldeb62b1232011-02-22 17:54:47 +0100281DEFUN(subscriber_send_pending_sms,
282 subscriber_send_pending_sms_cmd,
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200283 "subscriber " SUBSCR_TYPES " ID sms pending-send",
Nico Goldeb62b1232011-02-22 17:54:47 +0100284 SUBSCR_HELP "SMS Operations\n" "Send pending SMS\n")
285{
286 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200287 struct vlr_subscr *vsub;
Nico Goldeb62b1232011-02-22 17:54:47 +0100288 struct gsm_sms *sms;
289
Harald Welte2483f1b2016-06-19 18:06:02 +0200290 vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
291 if (!vsub) {
Holger Hans Peter Freyther9feef482013-07-04 20:34:46 +0200292 vty_out(vty, "%% No subscriber found for %s %s%s",
293 argv[0], argv[1], VTY_NEWLINE);
294 return CMD_WARNING;
295 }
296
Harald Welte2483f1b2016-06-19 18:06:02 +0200297 sms = db_sms_get_unsent_for_subscr(vsub, UINT_MAX);
Nico Goldeb62b1232011-02-22 17:54:47 +0100298 if (sms)
299 gsm411_send_sms_subscr(sms->receiver, sms);
300
Harald Welte2483f1b2016-06-19 18:06:02 +0200301 vlr_subscr_put(vsub);
Nico Goldeb62b1232011-02-22 17:54:47 +0100302
303 return CMD_SUCCESS;
304}
305
Harald Welte98f9c752009-11-14 08:00:53 +0100306DEFUN(subscriber_send_sms,
307 subscriber_send_sms_cmd,
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100308 "subscriber " SUBSCR_TYPES " ID sms sender " SUBSCR_TYPES " SENDER_ID send .LINE",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100309 SUBSCR_HELP "SMS Operations\n" SUBSCR_HELP "Send SMS\n" "Actual SMS Text\n")
Harald Welte98f9c752009-11-14 08:00:53 +0100310{
Harald Weltedcccb182010-05-16 20:52:23 +0200311 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200312 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
313 struct vlr_subscr *sender = get_vsub_by_argv(gsmnet, argv[2], argv[3]);
Harald Welte20474ad2010-05-16 19:28:32 +0200314 char *str;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200315 int rc;
316
Harald Welte2483f1b2016-06-19 18:06:02 +0200317 if (!vsub) {
Harald Welte20f98312009-11-14 10:11:45 +0100318 vty_out(vty, "%% No subscriber found for %s %s%s",
319 argv[0], argv[1], VTY_NEWLINE);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100320 rc = CMD_WARNING;
321 goto err;
Harald Welte20f98312009-11-14 10:11:45 +0100322 }
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100323
324 if (!sender) {
325 vty_out(vty, "%% No sender found for %s %s%s",
326 argv[2], argv[3], VTY_NEWLINE);
327 rc = CMD_WARNING;
328 goto err;
329 }
330
331 str = argv_concat(argv, argc, 4);
Harald Welte2483f1b2016-06-19 18:06:02 +0200332 rc = _send_sms_str(vsub, sender, str, 0);
Harald Welte20474ad2010-05-16 19:28:32 +0200333 talloc_free(str);
Harald Welte793a1352009-11-05 15:51:17 +0900334
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100335err:
336 if (sender)
Harald Welte2483f1b2016-06-19 18:06:02 +0200337 vlr_subscr_put(sender);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100338
Harald Welte2483f1b2016-06-19 18:06:02 +0200339 if (vsub)
340 vlr_subscr_put(vsub);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100341
Harald Welte793a1352009-11-05 15:51:17 +0900342 return rc;
343}
344
Harald Welte98f9c752009-11-14 08:00:53 +0100345DEFUN(subscriber_silent_sms,
346 subscriber_silent_sms_cmd,
Harald Welte1011d5b2014-07-10 20:19:00 +0200347
348 "subscriber " SUBSCR_TYPES " ID silent-sms sender " SUBSCR_TYPES " SENDER_ID send .LINE",
349 SUBSCR_HELP "Silent SMS Operations\n" SUBSCR_HELP "Send SMS\n" "Actual SMS Text\n")
Harald Welte793a1352009-11-05 15:51:17 +0900350{
Harald Weltedcccb182010-05-16 20:52:23 +0200351 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200352 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
353 struct vlr_subscr *sender = get_vsub_by_argv(gsmnet, argv[2], argv[3]);
Harald Welte20474ad2010-05-16 19:28:32 +0200354 char *str;
Harald Welte793a1352009-11-05 15:51:17 +0900355 int rc;
356
Harald Welte2483f1b2016-06-19 18:06:02 +0200357 if (!vsub) {
Harald Welte20f98312009-11-14 10:11:45 +0100358 vty_out(vty, "%% No subscriber found for %s %s%s",
359 argv[0], argv[1], VTY_NEWLINE);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100360 rc = CMD_WARNING;
361 goto err;
Harald Welte20f98312009-11-14 10:11:45 +0100362 }
Harald Welte793a1352009-11-05 15:51:17 +0900363
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100364 if (!sender) {
365 vty_out(vty, "%% No sender found for %s %s%s",
366 argv[2], argv[3], VTY_NEWLINE);
367 rc = CMD_WARNING;
368 goto err;
369 }
370
371 str = argv_concat(argv, argc, 4);
Harald Welte2483f1b2016-06-19 18:06:02 +0200372 rc = _send_sms_str(vsub, sender, str, 64);
Harald Welte20474ad2010-05-16 19:28:32 +0200373 talloc_free(str);
Harald Welte793a1352009-11-05 15:51:17 +0900374
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100375err:
376 if (sender)
Harald Welte2483f1b2016-06-19 18:06:02 +0200377 vlr_subscr_put(sender);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100378
Harald Welte2483f1b2016-06-19 18:06:02 +0200379 if (vsub)
380 vlr_subscr_put(vsub);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100381
Harald Welte793a1352009-11-05 15:51:17 +0900382 return rc;
383}
384
Harald Welte28326062010-05-14 20:05:17 +0200385#define CHAN_TYPES "(any|tch/f|tch/any|sdcch)"
386#define CHAN_TYPE_HELP \
387 "Any channel\n" \
388 "TCH/F channel\n" \
389 "Any TCH channel\n" \
390 "SDCCH channel\n"
391
Sylvain Munaut50480702010-01-02 14:29:43 +0100392DEFUN(subscriber_silent_call_start,
393 subscriber_silent_call_start_cmd,
Harald Welteb4a84e12010-05-27 10:44:58 +0200394 "subscriber " SUBSCR_TYPES " ID silent-call start (any|tch/f|tch/any|sdcch)",
Harald Welte28326062010-05-14 20:05:17 +0200395 SUBSCR_HELP "Silent call operation\n" "Start silent call\n"
396 CHAN_TYPE_HELP)
Sylvain Munaut50480702010-01-02 14:29:43 +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]);
Sylvain Munaut50480702010-01-02 14:29:43 +0100400 int rc, type;
401
Harald Welte2483f1b2016-06-19 18:06:02 +0200402 if (!vsub) {
Sylvain Munaut50480702010-01-02 14:29:43 +0100403 vty_out(vty, "%% No subscriber found for %s %s%s",
404 argv[0], argv[1], VTY_NEWLINE);
405 return CMD_WARNING;
406 }
407
408 if (!strcmp(argv[2], "tch/f"))
409 type = RSL_CHANNEED_TCH_F;
410 else if (!strcmp(argv[2], "tch/any"))
411 type = RSL_CHANNEED_TCH_ForH;
412 else if (!strcmp(argv[2], "sdcch"))
413 type = RSL_CHANNEED_SDCCH;
414 else
415 type = RSL_CHANNEED_ANY; /* Defaults to ANY */
416
Harald Welte2483f1b2016-06-19 18:06:02 +0200417 rc = gsm_silent_call_start(vsub, vty, type);
Sylvain Munaut50480702010-01-02 14:29:43 +0100418 if (rc <= 0) {
419 vty_out(vty, "%% Subscriber not attached%s",
420 VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200421 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100422 return CMD_WARNING;
423 }
424
Harald Welte2483f1b2016-06-19 18:06:02 +0200425 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100426
427 return CMD_SUCCESS;
428}
429
430DEFUN(subscriber_silent_call_stop,
431 subscriber_silent_call_stop_cmd,
Harald Welteb4a84e12010-05-27 10:44:58 +0200432 "subscriber " SUBSCR_TYPES " ID silent-call stop",
Harald Welte28326062010-05-14 20:05:17 +0200433 SUBSCR_HELP "Silent call operation\n" "Stop silent call\n"
434 CHAN_TYPE_HELP)
Harald Weltea1482332009-11-14 10:08:40 +0100435{
Harald Weltedcccb182010-05-16 20:52:23 +0200436 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200437 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Harald Weltea1482332009-11-14 10:08:40 +0100438 int rc;
439
Harald Welte2483f1b2016-06-19 18:06:02 +0200440 if (!vsub) {
Harald Weltea1482332009-11-14 10:08:40 +0100441 vty_out(vty, "%% No subscriber found for %s %s%s",
Harald Welte20f98312009-11-14 10:11:45 +0100442 argv[0], argv[1], VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100443 return CMD_WARNING;
444 }
445
Harald Welte2483f1b2016-06-19 18:06:02 +0200446 rc = gsm_silent_call_stop(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100447 if (rc < 0) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200448 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100449 return CMD_WARNING;
Harald Weltea1482332009-11-14 10:08:40 +0100450 }
451
Harald Welte2483f1b2016-06-19 18:06:02 +0200452 vlr_subscr_put(vsub);
Harald Weltea1482332009-11-14 10:08:40 +0100453
454 return CMD_SUCCESS;
455}
456
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800457DEFUN(subscriber_ussd_notify,
458 subscriber_ussd_notify_cmd,
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800459 "subscriber " SUBSCR_TYPES " ID ussd-notify (0|1|2) .TEXT",
Harald Weltecfaabbb2012-08-16 23:23:50 +0200460 SUBSCR_HELP "Send a USSD notify to the subscriber\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +0200461 "Alerting Level 0\n"
462 "Alerting Level 1\n"
463 "Alerting Level 2\n"
464 "Text of USSD message to send\n")
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800465{
466 char *text;
467 struct gsm_subscriber_connection *conn;
468 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200469 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800470 int level;
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800471
Harald Welte2483f1b2016-06-19 18:06:02 +0200472 if (!vsub) {
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800473 vty_out(vty, "%% No subscriber found for %s %s%s",
474 argv[0], argv[1], VTY_NEWLINE);
475 return CMD_WARNING;
476 }
477
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800478 level = atoi(argv[2]);
479 text = argv_concat(argv, argc, 3);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800480 if (!text) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200481 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800482 return CMD_WARNING;
483 }
484
Harald Welte2483f1b2016-06-19 18:06:02 +0200485 conn = connection_for_subscr(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800486 if (!conn) {
487 vty_out(vty, "%% An active connection is required for %s %s%s",
488 argv[0], argv[1], VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200489 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800490 talloc_free(text);
491 return CMD_WARNING;
492 }
493
Neels Hofmeyr43273c62016-05-10 12:50:31 +0200494 msc_send_ussd_notify(conn, level, text);
495 msc_send_ussd_release_complete(conn);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800496
Harald Welte2483f1b2016-06-19 18:06:02 +0200497 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800498 talloc_free(text);
499 return CMD_SUCCESS;
500}
501
Harald Welte94307772017-06-12 01:52:27 +0200502static int loop_by_char(uint8_t ch)
503{
504 switch (ch) {
505 case 'a':
506 return GSM414_LOOP_A;
507 case 'b':
508 return GSM414_LOOP_B;
509 case 'c':
510 return GSM414_LOOP_C;
511 case 'd':
512 return GSM414_LOOP_D;
513 case 'e':
514 return GSM414_LOOP_E;
515 case 'f':
516 return GSM414_LOOP_F;
517 case 'i':
518 return GSM414_LOOP_I;
519 }
520 return -1;
521}
522
523DEFUN(subscriber_mstest_close,
524 subscriber_mstest_close_cmd,
525 "subscriber " SUBSCR_TYPES " ID ms-test close-loop (a|b|c|d|e|f|i)",
526 SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
527 "Close a TCH Loop inside the MS\n"
528 "Loop Type A\n"
529 "Loop Type B\n"
530 "Loop Type C\n"
531 "Loop Type D\n"
532 "Loop Type E\n"
533 "Loop Type F\n"
534 "Loop Type I\n")
535{
536 struct gsm_subscriber_connection *conn;
537 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
538 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
539 const char *loop_str;
540 int loop_mode;
541
542 if (!vsub) {
543 vty_out(vty, "%% No subscriber found for %s %s%s",
544 argv[0], argv[1], VTY_NEWLINE);
545 return CMD_WARNING;
546 }
547
548 loop_str = argv[2];
549 loop_mode = loop_by_char(loop_str[0]);
550
551 conn = connection_for_subscr(vsub);
552 if (!conn) {
553 vty_out(vty, "%% An active connection is required for %s %s%s",
554 argv[0], argv[1], VTY_NEWLINE);
555 vlr_subscr_put(vsub);
556 return CMD_WARNING;
557 }
558
559 gsm0414_tx_close_tch_loop_cmd(conn, loop_mode);
560
561 return CMD_SUCCESS;
562}
563
564DEFUN(subscriber_mstest_open,
565 subscriber_mstest_open_cmd,
566 "subscriber " SUBSCR_TYPES " ID ms-test open-loop",
567 SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
568 "Open a TCH Loop inside the MS\n")
569{
570 struct gsm_subscriber_connection *conn;
571 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
572 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
573
574 if (!vsub) {
575 vty_out(vty, "%% No subscriber found for %s %s%s",
576 argv[0], argv[1], VTY_NEWLINE);
577 return CMD_WARNING;
578 }
579
580 conn = connection_for_subscr(vsub);
581 if (!conn) {
582 vty_out(vty, "%% An active connection is required for %s %s%s",
583 argv[0], argv[1], VTY_NEWLINE);
584 vlr_subscr_put(vsub);
585 return CMD_WARNING;
586 }
587
588 gsm0414_tx_open_loop_cmd(conn);
589
590 return CMD_SUCCESS;
591}
592
Keithd32b6d12017-01-18 17:09:33 +0100593DEFUN(ena_subscr_expire,
594 ena_subscr_expire_cmd,
595 "subscriber " SUBSCR_TYPES " ID expire",
596 SUBSCR_HELP "Expire the subscriber Now\n")
597{
Keithd32b6d12017-01-18 17:09:33 +0100598 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200599 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],
600 argv[1]);
Keithd32b6d12017-01-18 17:09:33 +0100601
Harald Welte2483f1b2016-06-19 18:06:02 +0200602 if (!vsub) {
Keithd32b6d12017-01-18 17:09:33 +0100603 vty_out(vty, "%% No subscriber found for %s %s%s",
604 argv[0], argv[1], VTY_NEWLINE);
605 return CMD_WARNING;
606 }
607
Maxdcc193d2017-12-27 19:34:15 +0100608 if (vlr_subscr_expire(vsub))
Harald Welte2483f1b2016-06-19 18:06:02 +0200609 vty_out(vty, "%% VLR released subscriber %s%s",
610 vlr_subscr_name(vsub), VTY_NEWLINE);
Keithd32b6d12017-01-18 17:09:33 +0100611
Harald Welte2483f1b2016-06-19 18:06:02 +0200612 if (vsub->use_count > 1)
613 vty_out(vty, "%% Subscriber %s is still in use,"
614 " should be released soon%s",
615 vlr_subscr_name(vsub), VTY_NEWLINE);
616
617 vlr_subscr_put(vsub);
Keithd32b6d12017-01-18 17:09:33 +0100618 return CMD_SUCCESS;
619}
620
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200621#define A3A8_ALG_TYPES "(none|xor|comp128v1)"
Harald Welte28326062010-05-14 20:05:17 +0200622#define A3A8_ALG_HELP \
623 "Use No A3A8 algorithm\n" \
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200624 "Use XOR algorithm\n" \
Harald Welte28326062010-05-14 20:05:17 +0200625 "Use COMP128v1 algorithm\n"
Sylvain Munaut99792902009-12-27 19:30:46 +0100626
Harald Welteb4a84e12010-05-27 10:44:58 +0200627DEFUN(ena_subscr_a3a8,
628 ena_subscr_a3a8_cmd,
629 "subscriber " SUBSCR_TYPES " ID a3a8 " A3A8_ALG_TYPES " [KI]",
Harald Welted3cf85d2010-05-27 10:48:11 +0200630 SUBSCR_HELP "Set a3a8 parameters for the subscriber\n"
631 A3A8_ALG_HELP "Encryption Key Ki\n")
Sylvain Munaut99792902009-12-27 19:30:46 +0100632{
Harald Welte2483f1b2016-06-19 18:06:02 +0200633 vty_out(vty, "%% 'subscriber a3a8' is no longer supported.%s"
634 "%% This is now up to osmo-hlr.%s",
635 VTY_NEWLINE, VTY_NEWLINE);
636 return CMD_WARNING;
Sylvain Munaut99792902009-12-27 19:30:46 +0100637}
638
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100639DEFUN(subscriber_update,
640 subscriber_update_cmd,
641 "subscriber " SUBSCR_TYPES " ID update",
642 SUBSCR_HELP "Update the subscriber data from the dabase.\n")
643{
Harald Welte2483f1b2016-06-19 18:06:02 +0200644 vty_out(vty, "%% 'subscriber update' is no longer supported.%s",
645 VTY_NEWLINE);
646 return CMD_WARNING;
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100647}
648
Harald Weltea1482332009-11-14 10:08:40 +0100649static int scall_cbfn(unsigned int subsys, unsigned int signal,
650 void *handler_data, void *signal_data)
651{
652 struct scall_signal_data *sigdata = signal_data;
653 struct vty *vty = sigdata->data;
654
655 switch (signal) {
656 case S_SCALL_SUCCESS:
Neels Hofmeyre2f24d52017-05-08 15:12:20 +0200657 vty_out(vty, "%% silent call success%s", VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100658 break;
659 case S_SCALL_EXPIRED:
660 vty_out(vty, "%% silent call expired paging%s", VTY_NEWLINE);
661 break;
662 }
663 return 0;
664}
665
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200666DEFUN(show_stats,
667 show_stats_cmd,
668 "show statistics",
669 SHOW_STR "Display network statistics\n")
670{
Harald Weltedcccb182010-05-16 20:52:23 +0200671 struct gsm_network *net = gsmnet_from_vty(vty);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200672
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200673 vty_out(vty, "Location Update : %lu attach, %lu normal, %lu periodic%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200674 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_ATTACH].current,
675 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_NORMAL].current,
676 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_PERIODIC].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200677 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200678 vty_out(vty, "IMSI Detach Indications : %lu%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200679 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_DETACH].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200680 VTY_NEWLINE);
Neels Hofmeyr36891a72016-05-09 13:18:03 +0200681 vty_out(vty, "Location Updating Results: %lu completed, %lu failed%s",
682 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_COMPLETED].current,
683 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_FAILED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200684 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200685 vty_out(vty, "SMS MO : %lu submitted, %lu no receiver%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200686 net->msc_ctrs->ctr[MSC_CTR_SMS_SUBMITTED].current,
687 net->msc_ctrs->ctr[MSC_CTR_SMS_NO_RECEIVER].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200688 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200689 vty_out(vty, "SMS MT : %lu delivered, %lu no memory, %lu other error%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200690 net->msc_ctrs->ctr[MSC_CTR_SMS_DELIVERED].current,
691 net->msc_ctrs->ctr[MSC_CTR_SMS_RP_ERR_MEM].current,
692 net->msc_ctrs->ctr[MSC_CTR_SMS_RP_ERR_OTHER].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200693 VTY_NEWLINE);
Harald Weltea29e43a2010-12-24 16:06:33 +0100694 vty_out(vty, "MO Calls : %lu setup, %lu connect ack%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200695 net->msc_ctrs->ctr[MSC_CTR_CALL_MO_SETUP].current,
696 net->msc_ctrs->ctr[MSC_CTR_CALL_MO_CONNECT_ACK].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200697 VTY_NEWLINE);
Harald Weltea29e43a2010-12-24 16:06:33 +0100698 vty_out(vty, "MT Calls : %lu setup, %lu connect%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200699 net->msc_ctrs->ctr[MSC_CTR_CALL_MT_SETUP].current,
700 net->msc_ctrs->ctr[MSC_CTR_CALL_MT_CONNECT].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200701 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200702 return CMD_SUCCESS;
703}
704
Holger Hans Peter Freyther81c0e252010-12-25 14:08:00 +0100705DEFUN(show_smsqueue,
706 show_smsqueue_cmd,
707 "show sms-queue",
708 SHOW_STR "Display SMSqueue statistics\n")
709{
710 struct gsm_network *net = gsmnet_from_vty(vty);
711
712 sms_queue_stats(net->sms_queue, vty);
713 return CMD_SUCCESS;
714}
715
Holger Hans Peter Freyther7a0e1662010-12-25 14:15:32 +0100716DEFUN(smsqueue_trigger,
717 smsqueue_trigger_cmd,
718 "sms-queue trigger",
719 "SMS Queue\n" "Trigger sending messages\n")
720{
721 struct gsm_network *net = gsmnet_from_vty(vty);
722
723 sms_queue_trigger(net->sms_queue);
724 return CMD_SUCCESS;
725}
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200726
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100727DEFUN(smsqueue_max,
728 smsqueue_max_cmd,
729 "sms-queue max-pending <1-500>",
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200730 "SMS Queue\n" "SMS to deliver in parallel\n" "Amount\n")
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100731{
732 struct gsm_network *net = gsmnet_from_vty(vty);
733
734 sms_queue_set_max_pending(net->sms_queue, atoi(argv[0]));
735 return CMD_SUCCESS;
736}
737
Holger Hans Peter Freyther4dcc5e52010-12-25 14:38:30 +0100738DEFUN(smsqueue_clear,
739 smsqueue_clear_cmd,
740 "sms-queue clear",
741 "SMS Queue\n" "Clear the queue of pending SMS\n")
742{
743 struct gsm_network *net = gsmnet_from_vty(vty);
744
745 sms_queue_clear(net->sms_queue);
746 return CMD_SUCCESS;
747}
748
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100749DEFUN(smsqueue_fail,
750 smsqueue_fail_cmd,
751 "sms-queue max-failure <1-500>",
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200752 "SMS Queue\n" "Maximum amount of delivery failures\n" "Amount\n")
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100753{
754 struct gsm_network *net = gsmnet_from_vty(vty);
755
756 sms_queue_set_max_failure(net->sms_queue, atoi(argv[0]));
757 return CMD_SUCCESS;
758}
759
Harald Welteab386e62011-09-01 18:18:43 +0200760
761DEFUN(cfg_mncc_int, cfg_mncc_int_cmd,
762 "mncc-int", "Configure internal MNCC handler")
763{
764 vty->node = MNCC_INT_NODE;
765
766 return CMD_SUCCESS;
767}
768
769static struct cmd_node mncc_int_node = {
770 MNCC_INT_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200771 "%s(config-mncc-int)# ",
Harald Welteab386e62011-09-01 18:18:43 +0200772 1,
773};
774
775static const struct value_string tchf_codec_names[] = {
776 { GSM48_CMODE_SPEECH_V1, "fr" },
777 { GSM48_CMODE_SPEECH_EFR, "efr" },
778 { GSM48_CMODE_SPEECH_AMR, "amr" },
779 { 0, NULL }
780};
781
782static const struct value_string tchh_codec_names[] = {
783 { GSM48_CMODE_SPEECH_V1, "hr" },
784 { GSM48_CMODE_SPEECH_AMR, "amr" },
785 { 0, NULL }
786};
787
788static int config_write_mncc_int(struct vty *vty)
789{
790 vty_out(vty, "mncc-int%s", VTY_NEWLINE);
791 vty_out(vty, " default-codec tch-f %s%s",
792 get_value_string(tchf_codec_names, mncc_int.def_codec[0]),
793 VTY_NEWLINE);
794 vty_out(vty, " default-codec tch-h %s%s",
795 get_value_string(tchh_codec_names, mncc_int.def_codec[1]),
796 VTY_NEWLINE);
797
798 return CMD_SUCCESS;
799}
800
801DEFUN(mnccint_def_codec_f,
802 mnccint_def_codec_f_cmd,
803 "default-codec tch-f (fr|efr|amr)",
804 "Set default codec\n" "Codec for TCH/F\n"
805 "Full-Rate\n" "Enhanced Full-Rate\n" "Adaptive Multi-Rate\n")
806{
807 mncc_int.def_codec[0] = get_string_value(tchf_codec_names, argv[0]);
808
809 return CMD_SUCCESS;
810}
811
812DEFUN(mnccint_def_codec_h,
813 mnccint_def_codec_h_cmd,
814 "default-codec tch-h (hr|amr)",
815 "Set default codec\n" "Codec for TCH/H\n"
816 "Half-Rate\n" "Adaptive Multi-Rate\n")
817{
818 mncc_int.def_codec[1] = get_string_value(tchh_codec_names, argv[0]);
819
820 return CMD_SUCCESS;
821}
822
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100823
824DEFUN(logging_fltr_imsi,
825 logging_fltr_imsi_cmd,
826 "logging filter imsi IMSI",
827 LOGGING_STR FILTER_STR
828 "Filter log messages by IMSI\n" "IMSI to be used as filter\n")
829{
Harald Welte2483f1b2016-06-19 18:06:02 +0200830 struct vlr_subscr *vlr_subscr;
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100831 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
832 struct log_target *tgt = osmo_log_vty2tgt(vty);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100833 const char *imsi = argv[0];
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100834
835 if (!tgt)
836 return CMD_WARNING;
837
Harald Welte2483f1b2016-06-19 18:06:02 +0200838 vlr_subscr = vlr_subscr_find_by_imsi(gsmnet->vlr, imsi);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100839
Neels Hofmeyr84da6b12016-05-20 21:59:55 +0200840 if (!vlr_subscr) {
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100841 vty_out(vty, "%%no subscriber with IMSI(%s)%s",
842 argv[0], VTY_NEWLINE);
843 return CMD_WARNING;
844 }
845
Harald Welte2483f1b2016-06-19 18:06:02 +0200846 log_set_filter_vlr_subscr(tgt, vlr_subscr);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100847 return CMD_SUCCESS;
848}
Holger Hans Peter Freyther925c57f2015-01-27 10:58:29 +0100849
Harald Welte2483f1b2016-06-19 18:06:02 +0200850static struct cmd_node hlr_node = {
851 HLR_NODE,
852 "%s(config-hlr)# ",
853 1,
854};
855
856DEFUN(cfg_hlr, cfg_hlr_cmd,
857 "hlr", "Configure connection to the HLR")
858{
859 vty->node = HLR_NODE;
860 return CMD_SUCCESS;
861}
862
863DEFUN(cfg_hlr_remote_ip, cfg_hlr_remote_ip_cmd, "remote-ip A.B.C.D",
864 "Remote GSUP address of the HLR\n"
865 "Remote GSUP address (default: " MSC_HLR_REMOTE_IP_DEFAULT ")")
866{
867 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
868 talloc_free((void*)gsmnet->gsup_server_addr_str);
869 gsmnet->gsup_server_addr_str = talloc_strdup(gsmnet, argv[0]);
870 return CMD_SUCCESS;
871}
872
873DEFUN(cfg_hlr_remote_port, cfg_hlr_remote_port_cmd, "remote-port <1-65535>",
874 "Remote GSUP port of the HLR\n"
875 "Remote GSUP port (default: " OSMO_STRINGIFY(MSC_HLR_REMOTE_PORT_DEFAULT) ")")
876{
877 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
878 gsmnet->gsup_server_port = atoi(argv[0]);
879 return CMD_SUCCESS;
880}
881
882static int config_write_hlr(struct vty *vty)
883{
884 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
885
886 vty_out(vty, "hlr%s", VTY_NEWLINE);
887 vty_out(vty, " remote-ip %s%s",
888 gsmnet->gsup_server_addr_str, VTY_NEWLINE);
889 vty_out(vty, " remote-port %u%s",
890 gsmnet->gsup_server_port, VTY_NEWLINE);
891 return CMD_SUCCESS;
892}
893
Harald Weltedcccb182010-05-16 20:52:23 +0200894int bsc_vty_init_extra(void)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200895{
Pablo Neira Ayusobbc5b992011-05-06 12:12:31 +0200896 osmo_signal_register_handler(SS_SCALL, scall_cbfn, NULL);
Harald Weltea1482332009-11-14 10:08:40 +0100897
Harald Welteb4d5b172010-05-12 16:10:35 +0000898 install_element_ve(&show_subscr_cmd);
899 install_element_ve(&show_subscr_cache_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200900
Harald Welteb4d5b172010-05-12 16:10:35 +0000901 install_element_ve(&sms_send_pend_cmd);
Stefan Sperling87cba1f2018-01-22 17:05:37 +0100902 install_element_ve(&sms_delete_expired_cmd);
Harald Welte98f9c752009-11-14 08:00:53 +0100903
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200904 install_element_ve(&subscriber_create_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +0000905 install_element_ve(&subscriber_send_sms_cmd);
906 install_element_ve(&subscriber_silent_sms_cmd);
907 install_element_ve(&subscriber_silent_call_start_cmd);
908 install_element_ve(&subscriber_silent_call_stop_cmd);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800909 install_element_ve(&subscriber_ussd_notify_cmd);
Harald Welte94307772017-06-12 01:52:27 +0200910 install_element_ve(&subscriber_mstest_close_cmd);
911 install_element_ve(&subscriber_mstest_open_cmd);
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100912 install_element_ve(&subscriber_update_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +0000913 install_element_ve(&show_stats_cmd);
Holger Hans Peter Freyther81c0e252010-12-25 14:08:00 +0100914 install_element_ve(&show_smsqueue_cmd);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100915 install_element_ve(&logging_fltr_imsi_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200916
Keithd32b6d12017-01-18 17:09:33 +0100917 install_element(ENABLE_NODE, &ena_subscr_expire_cmd);
Harald Welteb4a84e12010-05-27 10:44:58 +0200918 install_element(ENABLE_NODE, &ena_subscr_a3a8_cmd);
Holger Hans Peter Freyther7a0e1662010-12-25 14:15:32 +0100919 install_element(ENABLE_NODE, &smsqueue_trigger_cmd);
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100920 install_element(ENABLE_NODE, &smsqueue_max_cmd);
Holger Hans Peter Freyther4dcc5e52010-12-25 14:38:30 +0100921 install_element(ENABLE_NODE, &smsqueue_clear_cmd);
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100922 install_element(ENABLE_NODE, &smsqueue_fail_cmd);
Nico Goldeb62b1232011-02-22 17:54:47 +0100923 install_element(ENABLE_NODE, &subscriber_send_pending_sms_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200924
Harald Welteab386e62011-09-01 18:18:43 +0200925 install_element(CONFIG_NODE, &cfg_mncc_int_cmd);
926 install_node(&mncc_int_node, config_write_mncc_int);
Harald Welteab386e62011-09-01 18:18:43 +0200927 install_element(MNCC_INT_NODE, &mnccint_def_codec_f_cmd);
928 install_element(MNCC_INT_NODE, &mnccint_def_codec_h_cmd);
929
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100930 install_element(CFG_LOG_NODE, &logging_fltr_imsi_cmd);
Harald Welteb02fc1e2013-02-12 11:15:49 +0100931
Harald Welte2483f1b2016-06-19 18:06:02 +0200932 install_element(CONFIG_NODE, &cfg_hlr_cmd);
933 install_node(&hlr_node, config_write_hlr);
934 install_element(HLR_NODE, &cfg_hlr_remote_ip_cmd);
935 install_element(HLR_NODE, &cfg_hlr_remote_port_cmd);
Holger Hans Peter Freyther925c57f2015-01-27 10:58:29 +0100936
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200937 return 0;
938}