blob: dbd826db2f91be1dee96d64d86bb86536f0fee1d [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 Ayusoed5cacb2011-08-17 22:44:07 +020038#include <osmocom/abis/e1_input.h>
Neels Hofmeyr90843962017-09-04 15:04:35 +020039#include <osmocom/msc/abis_nm.h>
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010040#include <osmocom/gsm/gsm_utils.h>
41#include <osmocom/core/utils.h>
Neels Hofmeyr90843962017-09-04 15:04:35 +020042#include <osmocom/msc/db.h>
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010043#include <osmocom/core/talloc.h>
Neels Hofmeyr90843962017-09-04 15:04:35 +020044#include <osmocom/msc/signal.h>
45#include <osmocom/msc/debug.h>
46#include <osmocom/msc/vty.h>
47#include <osmocom/msc/gsm_04_80.h>
48#include <osmocom/msc/gsm_04_14.h>
49#include <osmocom/msc/chan_alloc.h>
50#include <osmocom/msc/sms_queue.h>
51#include <osmocom/msc/mncc_int.h>
52#include <osmocom/msc/handover.h>
53#include <osmocom/msc/vlr.h>
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020054
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +010055#include <osmocom/vty/logging.h>
56
Neels Hofmeyr90843962017-09-04 15:04:35 +020057#include <osmocom/msc/osmo_msc.h>
Harald Welte2483f1b2016-06-19 18:06:02 +020058
Harald Weltedcccb182010-05-16 20:52:23 +020059extern struct gsm_network *gsmnet_from_vty(struct vty *v);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020060
Harald Welte2483f1b2016-06-19 18:06:02 +020061static void subscr_dump_full_vty(struct vty *vty, struct vlr_subscr *vsub)
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010062{
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +020063 int reqs;
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +020064 struct llist_head *entry;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010065
Harald Welte2483f1b2016-06-19 18:06:02 +020066 if (strlen(vsub->name))
67 vty_out(vty, " Name: '%s'%s", vsub->name, VTY_NEWLINE);
68 if (strlen(vsub->msisdn))
69 vty_out(vty, " Extension: %s%s", vsub->msisdn,
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010070 VTY_NEWLINE);
Holger Hans Peter Freyther3d76e442010-12-25 16:40:54 +010071 vty_out(vty, " LAC: %d/0x%x%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020072 vsub->lac, vsub->lac, VTY_NEWLINE);
73 vty_out(vty, " IMSI: %s%s", vsub->imsi, VTY_NEWLINE);
74 if (vsub->tmsi != GSM_RESERVED_TMSI)
75 vty_out(vty, " TMSI: %08X%s", vsub->tmsi,
76 VTY_NEWLINE);
77 if (vsub->tmsi_new != GSM_RESERVED_TMSI)
78 vty_out(vty, " new TMSI: %08X%s", vsub->tmsi_new,
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010079 VTY_NEWLINE);
80
Harald Welte2483f1b2016-06-19 18:06:02 +020081#if 0
82 /* TODO: add this to vlr_subscr? */
83 if (vsub->auth_info.auth_algo != AUTH_ALGO_NONE) {
84 struct gsm_auth_info *i = &vsub->auth_info;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010085 vty_out(vty, " A3A8 algorithm id: %d%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020086 i->auth_algo, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010087 vty_out(vty, " A3A8 Ki: %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020088 osmo_hexdump(i->a3a8_ki, i->a3a8_ki_len),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010089 VTY_NEWLINE);
90 }
Harald Welte2483f1b2016-06-19 18:06:02 +020091#endif
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010092
Harald Welte2483f1b2016-06-19 18:06:02 +020093 if (vsub->last_tuple) {
94 struct gsm_auth_tuple *t = vsub->last_tuple;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010095 vty_out(vty, " A3A8 last tuple (used %d times):%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020096 t->use_count, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010097 vty_out(vty, " seq # : %d%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020098 t->key_seq, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010099 vty_out(vty, " RAND : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200100 osmo_hexdump(t->vec.rand, sizeof(t->vec.rand)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100101 VTY_NEWLINE);
102 vty_out(vty, " SRES : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200103 osmo_hexdump(t->vec.sres, sizeof(t->vec.sres)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100104 VTY_NEWLINE);
105 vty_out(vty, " Kc : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200106 osmo_hexdump(t->vec.kc, sizeof(t->vec.kc)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100107 VTY_NEWLINE);
108 }
Holger Hans Peter Freytherb9708942013-07-27 19:42:35 +0200109
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200110 reqs = 0;
Harald Welte2483f1b2016-06-19 18:06:02 +0200111 llist_for_each(entry, &vsub->cs.requests)
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200112 reqs += 1;
Harald Welte2483f1b2016-06-19 18:06:02 +0200113 vty_out(vty, " Paging: %s paging for %d requests%s",
114 vsub->cs.is_paging ? "is" : "not", reqs, VTY_NEWLINE);
115 vty_out(vty, " Use count: %u%s", vsub->use_count, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100116}
117
118
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200119/* Subscriber */
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200120DEFUN(show_subscr_cache,
121 show_subscr_cache_cmd,
122 "show subscriber cache",
Harald Weltecfaabbb2012-08-16 23:23:50 +0200123 SHOW_STR "Show information about subscribers\n"
124 "Display contents of subscriber cache\n")
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200125{
Harald Welte2483f1b2016-06-19 18:06:02 +0200126 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
127 struct vlr_subscr *vsub;
128 int count = 0;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200129
Harald Welte2483f1b2016-06-19 18:06:02 +0200130 llist_for_each_entry(vsub, &gsmnet->vlr->subscribers, list) {
131 if (++count > 100) {
132 vty_out(vty, "%% More than %d subscribers in cache,"
133 " stopping here.%s", count-1, VTY_NEWLINE);
134 break;
135 }
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200136 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200137 subscr_dump_full_vty(vty, vsub);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200138 }
139
140 return CMD_SUCCESS;
141}
142
143DEFUN(sms_send_pend,
144 sms_send_pend_cmd,
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100145 "sms send pending",
Neels Hofmeyrd1fdefe2016-04-01 02:17:24 +0200146 "SMS related commands\n" "SMS Sending related commands\n"
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100147 "Send all pending SMS")
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200148{
Harald Weltedcccb182010-05-16 20:52:23 +0200149 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200150 struct gsm_sms *sms;
Harald Welte2483f1b2016-06-19 18:06:02 +0200151 unsigned long long sms_id = 0;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200152
153 while (1) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200154 sms = db_sms_get_next_unsent(gsmnet, sms_id, UINT_MAX);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200155 if (!sms)
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100156 break;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200157
Harald Welte2483f1b2016-06-19 18:06:02 +0200158 if (sms->receiver)
159 gsm411_send_sms_subscr(sms->receiver, sms);
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100160
Harald Welte2483f1b2016-06-19 18:06:02 +0200161 sms_id = sms->id + 1;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200162 }
163
164 return CMD_SUCCESS;
165}
166
Harald Welte2483f1b2016-06-19 18:06:02 +0200167static int _send_sms_str(struct vlr_subscr *receiver,
168 struct vlr_subscr *sender,
169 char *str, uint8_t tp_pid)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200170{
Harald Welte2483f1b2016-06-19 18:06:02 +0200171 struct gsm_network *net = receiver->vlr->user_ctx;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200172 struct gsm_sms *sms;
173
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100174 sms = sms_from_text(receiver, sender, 0, str);
Harald Welte793a1352009-11-05 15:51:17 +0900175 sms->protocol_id = tp_pid;
Nico Golde59502362010-06-29 20:13:06 +0200176
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100177 /* store in database for the queue */
178 if (db_sms_store(sms) != 0) {
Holger Hans Peter Freythereff409492012-11-10 19:46:58 +0100179 LOGP(DLSMS, LOGL_ERROR, "Failed to store SMS in Database\n");
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100180 sms_free(sms);
181 return CMD_WARNING;
Nico Golde59502362010-06-29 20:13:06 +0200182 }
Neels Hofmeyr1e918c32016-05-09 21:48:53 +0200183 LOGP(DLSMS, LOGL_DEBUG, "SMS stored in DB\n");
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200184
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100185 sms_free(sms);
Harald Welte2483f1b2016-06-19 18:06:02 +0200186 sms_queue_trigger(net->sms_queue);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200187 return CMD_SUCCESS;
188}
189
Harald Welte2483f1b2016-06-19 18:06:02 +0200190static struct vlr_subscr *get_vsub_by_argv(struct gsm_network *gsmnet,
191 const char *type,
192 const char *id)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200193{
Harald Welte2483f1b2016-06-19 18:06:02 +0200194 if (!strcmp(type, "extension") || !strcmp(type, "msisdn"))
195 return vlr_subscr_find_by_msisdn(gsmnet->vlr, id);
196 else if (!strcmp(type, "imsi") || !strcmp(type, "id"))
197 return vlr_subscr_find_by_imsi(gsmnet->vlr, id);
Harald Welte98f9c752009-11-14 08:00:53 +0100198 else if (!strcmp(type, "tmsi"))
Harald Welte2483f1b2016-06-19 18:06:02 +0200199 return vlr_subscr_find_by_tmsi(gsmnet->vlr, atoi(id));
Harald Welte98f9c752009-11-14 08:00:53 +0100200
201 return NULL;
202}
203#define SUBSCR_TYPES "(extension|imsi|tmsi|id)"
Harald Welte28326062010-05-14 20:05:17 +0200204#define SUBSCR_HELP "Operations on a Subscriber\n" \
Neels Hofmeyrd1fdefe2016-04-01 02:17:24 +0200205 "Identify subscriber by extension (phone number)\n" \
206 "Identify subscriber by IMSI\n" \
207 "Identify subscriber by TMSI\n" \
208 "Identify subscriber by database ID\n" \
Harald Welte28326062010-05-14 20:05:17 +0200209 "Identifier for the subscriber\n"
Harald Welte98f9c752009-11-14 08:00:53 +0100210
Harald Welteb4a84e12010-05-27 10:44:58 +0200211DEFUN(show_subscr,
212 show_subscr_cmd,
213 "show subscriber " SUBSCR_TYPES " ID",
214 SHOW_STR SUBSCR_HELP)
215{
216 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200217 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],
218 argv[1]);
Harald Welteb4a84e12010-05-27 10:44:58 +0200219
Harald Welte2483f1b2016-06-19 18:06:02 +0200220 if (!vsub) {
Harald Welteb4a84e12010-05-27 10:44:58 +0200221 vty_out(vty, "%% No subscriber found for %s %s%s",
222 argv[0], argv[1], VTY_NEWLINE);
223 return CMD_WARNING;
224 }
225
Harald Welte2483f1b2016-06-19 18:06:02 +0200226 subscr_dump_full_vty(vty, vsub);
Harald Welteb4a84e12010-05-27 10:44:58 +0200227
Harald Welte2483f1b2016-06-19 18:06:02 +0200228 vlr_subscr_put(vsub);
Harald Welteb4a84e12010-05-27 10:44:58 +0200229
230 return CMD_SUCCESS;
231}
232
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200233DEFUN(subscriber_create,
234 subscriber_create_cmd,
235 "subscriber create imsi ID",
236 "Operations on a Subscriber\n" \
237 "Create new subscriber\n" \
238 "Identify the subscriber by his IMSI\n" \
239 "Identifier for the subscriber\n")
240{
Harald Welte2483f1b2016-06-19 18:06:02 +0200241 vty_out(vty, "%% 'subscriber create' now needs to be done at osmo-hlr%s",
242 VTY_NEWLINE);
243 return CMD_WARNING;
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200244}
245
Nico Goldeb62b1232011-02-22 17:54:47 +0100246DEFUN(subscriber_send_pending_sms,
247 subscriber_send_pending_sms_cmd,
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200248 "subscriber " SUBSCR_TYPES " ID sms pending-send",
Nico Goldeb62b1232011-02-22 17:54:47 +0100249 SUBSCR_HELP "SMS Operations\n" "Send pending SMS\n")
250{
251 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200252 struct vlr_subscr *vsub;
Nico Goldeb62b1232011-02-22 17:54:47 +0100253 struct gsm_sms *sms;
254
Harald Welte2483f1b2016-06-19 18:06:02 +0200255 vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
256 if (!vsub) {
Holger Hans Peter Freyther9feef482013-07-04 20:34:46 +0200257 vty_out(vty, "%% No subscriber found for %s %s%s",
258 argv[0], argv[1], VTY_NEWLINE);
259 return CMD_WARNING;
260 }
261
Harald Welte2483f1b2016-06-19 18:06:02 +0200262 sms = db_sms_get_unsent_for_subscr(vsub, UINT_MAX);
Nico Goldeb62b1232011-02-22 17:54:47 +0100263 if (sms)
264 gsm411_send_sms_subscr(sms->receiver, sms);
265
Harald Welte2483f1b2016-06-19 18:06:02 +0200266 vlr_subscr_put(vsub);
Nico Goldeb62b1232011-02-22 17:54:47 +0100267
268 return CMD_SUCCESS;
269}
270
Harald Welte98f9c752009-11-14 08:00:53 +0100271DEFUN(subscriber_send_sms,
272 subscriber_send_sms_cmd,
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100273 "subscriber " SUBSCR_TYPES " ID sms sender " SUBSCR_TYPES " SENDER_ID send .LINE",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100274 SUBSCR_HELP "SMS Operations\n" SUBSCR_HELP "Send SMS\n" "Actual SMS Text\n")
Harald Welte98f9c752009-11-14 08:00:53 +0100275{
Harald Weltedcccb182010-05-16 20:52:23 +0200276 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200277 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
278 struct vlr_subscr *sender = get_vsub_by_argv(gsmnet, argv[2], argv[3]);
Harald Welte20474ad2010-05-16 19:28:32 +0200279 char *str;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200280 int rc;
281
Harald Welte2483f1b2016-06-19 18:06:02 +0200282 if (!vsub) {
Harald Welte20f98312009-11-14 10:11:45 +0100283 vty_out(vty, "%% No subscriber found for %s %s%s",
284 argv[0], argv[1], VTY_NEWLINE);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100285 rc = CMD_WARNING;
286 goto err;
Harald Welte20f98312009-11-14 10:11:45 +0100287 }
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100288
289 if (!sender) {
290 vty_out(vty, "%% No sender found for %s %s%s",
291 argv[2], argv[3], VTY_NEWLINE);
292 rc = CMD_WARNING;
293 goto err;
294 }
295
296 str = argv_concat(argv, argc, 4);
Harald Welte2483f1b2016-06-19 18:06:02 +0200297 rc = _send_sms_str(vsub, sender, str, 0);
Harald Welte20474ad2010-05-16 19:28:32 +0200298 talloc_free(str);
Harald Welte793a1352009-11-05 15:51:17 +0900299
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100300err:
301 if (sender)
Harald Welte2483f1b2016-06-19 18:06:02 +0200302 vlr_subscr_put(sender);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100303
Harald Welte2483f1b2016-06-19 18:06:02 +0200304 if (vsub)
305 vlr_subscr_put(vsub);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100306
Harald Welte793a1352009-11-05 15:51:17 +0900307 return rc;
308}
309
Harald Welte98f9c752009-11-14 08:00:53 +0100310DEFUN(subscriber_silent_sms,
311 subscriber_silent_sms_cmd,
Harald Welte1011d5b2014-07-10 20:19:00 +0200312
313 "subscriber " SUBSCR_TYPES " ID silent-sms sender " SUBSCR_TYPES " SENDER_ID send .LINE",
314 SUBSCR_HELP "Silent SMS Operations\n" SUBSCR_HELP "Send SMS\n" "Actual SMS Text\n")
Harald Welte793a1352009-11-05 15:51:17 +0900315{
Harald Weltedcccb182010-05-16 20:52:23 +0200316 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200317 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
318 struct vlr_subscr *sender = get_vsub_by_argv(gsmnet, argv[2], argv[3]);
Harald Welte20474ad2010-05-16 19:28:32 +0200319 char *str;
Harald Welte793a1352009-11-05 15:51:17 +0900320 int rc;
321
Harald Welte2483f1b2016-06-19 18:06:02 +0200322 if (!vsub) {
Harald Welte20f98312009-11-14 10:11:45 +0100323 vty_out(vty, "%% No subscriber found for %s %s%s",
324 argv[0], argv[1], VTY_NEWLINE);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100325 rc = CMD_WARNING;
326 goto err;
Harald Welte20f98312009-11-14 10:11:45 +0100327 }
Harald Welte793a1352009-11-05 15:51:17 +0900328
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100329 if (!sender) {
330 vty_out(vty, "%% No sender found for %s %s%s",
331 argv[2], argv[3], VTY_NEWLINE);
332 rc = CMD_WARNING;
333 goto err;
334 }
335
336 str = argv_concat(argv, argc, 4);
Harald Welte2483f1b2016-06-19 18:06:02 +0200337 rc = _send_sms_str(vsub, sender, str, 64);
Harald Welte20474ad2010-05-16 19:28:32 +0200338 talloc_free(str);
Harald Welte793a1352009-11-05 15:51:17 +0900339
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100340err:
341 if (sender)
Harald Welte2483f1b2016-06-19 18:06:02 +0200342 vlr_subscr_put(sender);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100343
Harald Welte2483f1b2016-06-19 18:06:02 +0200344 if (vsub)
345 vlr_subscr_put(vsub);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100346
Harald Welte793a1352009-11-05 15:51:17 +0900347 return rc;
348}
349
Harald Welte28326062010-05-14 20:05:17 +0200350#define CHAN_TYPES "(any|tch/f|tch/any|sdcch)"
351#define CHAN_TYPE_HELP \
352 "Any channel\n" \
353 "TCH/F channel\n" \
354 "Any TCH channel\n" \
355 "SDCCH channel\n"
356
Sylvain Munaut50480702010-01-02 14:29:43 +0100357DEFUN(subscriber_silent_call_start,
358 subscriber_silent_call_start_cmd,
Harald Welteb4a84e12010-05-27 10:44:58 +0200359 "subscriber " SUBSCR_TYPES " ID silent-call start (any|tch/f|tch/any|sdcch)",
Harald Welte28326062010-05-14 20:05:17 +0200360 SUBSCR_HELP "Silent call operation\n" "Start silent call\n"
361 CHAN_TYPE_HELP)
Sylvain Munaut50480702010-01-02 14:29:43 +0100362{
Harald Weltedcccb182010-05-16 20:52:23 +0200363 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200364 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Sylvain Munaut50480702010-01-02 14:29:43 +0100365 int rc, type;
366
Harald Welte2483f1b2016-06-19 18:06:02 +0200367 if (!vsub) {
Sylvain Munaut50480702010-01-02 14:29:43 +0100368 vty_out(vty, "%% No subscriber found for %s %s%s",
369 argv[0], argv[1], VTY_NEWLINE);
370 return CMD_WARNING;
371 }
372
373 if (!strcmp(argv[2], "tch/f"))
374 type = RSL_CHANNEED_TCH_F;
375 else if (!strcmp(argv[2], "tch/any"))
376 type = RSL_CHANNEED_TCH_ForH;
377 else if (!strcmp(argv[2], "sdcch"))
378 type = RSL_CHANNEED_SDCCH;
379 else
380 type = RSL_CHANNEED_ANY; /* Defaults to ANY */
381
Harald Welte2483f1b2016-06-19 18:06:02 +0200382 rc = gsm_silent_call_start(vsub, vty, type);
Sylvain Munaut50480702010-01-02 14:29:43 +0100383 if (rc <= 0) {
384 vty_out(vty, "%% Subscriber not attached%s",
385 VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200386 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100387 return CMD_WARNING;
388 }
389
Harald Welte2483f1b2016-06-19 18:06:02 +0200390 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100391
392 return CMD_SUCCESS;
393}
394
395DEFUN(subscriber_silent_call_stop,
396 subscriber_silent_call_stop_cmd,
Harald Welteb4a84e12010-05-27 10:44:58 +0200397 "subscriber " SUBSCR_TYPES " ID silent-call stop",
Harald Welte28326062010-05-14 20:05:17 +0200398 SUBSCR_HELP "Silent call operation\n" "Stop silent call\n"
399 CHAN_TYPE_HELP)
Harald Weltea1482332009-11-14 10:08:40 +0100400{
Harald Weltedcccb182010-05-16 20:52:23 +0200401 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200402 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Harald Weltea1482332009-11-14 10:08:40 +0100403 int rc;
404
Harald Welte2483f1b2016-06-19 18:06:02 +0200405 if (!vsub) {
Harald Weltea1482332009-11-14 10:08:40 +0100406 vty_out(vty, "%% No subscriber found for %s %s%s",
Harald Welte20f98312009-11-14 10:11:45 +0100407 argv[0], argv[1], VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100408 return CMD_WARNING;
409 }
410
Harald Welte2483f1b2016-06-19 18:06:02 +0200411 rc = gsm_silent_call_stop(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100412 if (rc < 0) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200413 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100414 return CMD_WARNING;
Harald Weltea1482332009-11-14 10:08:40 +0100415 }
416
Harald Welte2483f1b2016-06-19 18:06:02 +0200417 vlr_subscr_put(vsub);
Harald Weltea1482332009-11-14 10:08:40 +0100418
419 return CMD_SUCCESS;
420}
421
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800422DEFUN(subscriber_ussd_notify,
423 subscriber_ussd_notify_cmd,
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800424 "subscriber " SUBSCR_TYPES " ID ussd-notify (0|1|2) .TEXT",
Harald Weltecfaabbb2012-08-16 23:23:50 +0200425 SUBSCR_HELP "Send a USSD notify to the subscriber\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +0200426 "Alerting Level 0\n"
427 "Alerting Level 1\n"
428 "Alerting Level 2\n"
429 "Text of USSD message to send\n")
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800430{
431 char *text;
432 struct gsm_subscriber_connection *conn;
433 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200434 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800435 int level;
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800436
Harald Welte2483f1b2016-06-19 18:06:02 +0200437 if (!vsub) {
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800438 vty_out(vty, "%% No subscriber found for %s %s%s",
439 argv[0], argv[1], VTY_NEWLINE);
440 return CMD_WARNING;
441 }
442
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800443 level = atoi(argv[2]);
444 text = argv_concat(argv, argc, 3);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800445 if (!text) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200446 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800447 return CMD_WARNING;
448 }
449
Harald Welte2483f1b2016-06-19 18:06:02 +0200450 conn = connection_for_subscr(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800451 if (!conn) {
452 vty_out(vty, "%% An active connection is required for %s %s%s",
453 argv[0], argv[1], VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200454 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800455 talloc_free(text);
456 return CMD_WARNING;
457 }
458
Neels Hofmeyr43273c62016-05-10 12:50:31 +0200459 msc_send_ussd_notify(conn, level, text);
460 msc_send_ussd_release_complete(conn);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800461
Harald Welte2483f1b2016-06-19 18:06:02 +0200462 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800463 talloc_free(text);
464 return CMD_SUCCESS;
465}
466
Harald Welte94307772017-06-12 01:52:27 +0200467static int loop_by_char(uint8_t ch)
468{
469 switch (ch) {
470 case 'a':
471 return GSM414_LOOP_A;
472 case 'b':
473 return GSM414_LOOP_B;
474 case 'c':
475 return GSM414_LOOP_C;
476 case 'd':
477 return GSM414_LOOP_D;
478 case 'e':
479 return GSM414_LOOP_E;
480 case 'f':
481 return GSM414_LOOP_F;
482 case 'i':
483 return GSM414_LOOP_I;
484 }
485 return -1;
486}
487
488DEFUN(subscriber_mstest_close,
489 subscriber_mstest_close_cmd,
490 "subscriber " SUBSCR_TYPES " ID ms-test close-loop (a|b|c|d|e|f|i)",
491 SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
492 "Close a TCH Loop inside the MS\n"
493 "Loop Type A\n"
494 "Loop Type B\n"
495 "Loop Type C\n"
496 "Loop Type D\n"
497 "Loop Type E\n"
498 "Loop Type F\n"
499 "Loop Type I\n")
500{
501 struct gsm_subscriber_connection *conn;
502 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
503 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
504 const char *loop_str;
505 int loop_mode;
506
507 if (!vsub) {
508 vty_out(vty, "%% No subscriber found for %s %s%s",
509 argv[0], argv[1], VTY_NEWLINE);
510 return CMD_WARNING;
511 }
512
513 loop_str = argv[2];
514 loop_mode = loop_by_char(loop_str[0]);
515
516 conn = connection_for_subscr(vsub);
517 if (!conn) {
518 vty_out(vty, "%% An active connection is required for %s %s%s",
519 argv[0], argv[1], VTY_NEWLINE);
520 vlr_subscr_put(vsub);
521 return CMD_WARNING;
522 }
523
524 gsm0414_tx_close_tch_loop_cmd(conn, loop_mode);
525
526 return CMD_SUCCESS;
527}
528
529DEFUN(subscriber_mstest_open,
530 subscriber_mstest_open_cmd,
531 "subscriber " SUBSCR_TYPES " ID ms-test open-loop",
532 SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
533 "Open a TCH Loop inside the MS\n")
534{
535 struct gsm_subscriber_connection *conn;
536 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
537 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
538
539 if (!vsub) {
540 vty_out(vty, "%% No subscriber found for %s %s%s",
541 argv[0], argv[1], VTY_NEWLINE);
542 return CMD_WARNING;
543 }
544
545 conn = connection_for_subscr(vsub);
546 if (!conn) {
547 vty_out(vty, "%% An active connection is required for %s %s%s",
548 argv[0], argv[1], VTY_NEWLINE);
549 vlr_subscr_put(vsub);
550 return CMD_WARNING;
551 }
552
553 gsm0414_tx_open_loop_cmd(conn);
554
555 return CMD_SUCCESS;
556}
557
Keithd32b6d12017-01-18 17:09:33 +0100558DEFUN(ena_subscr_expire,
559 ena_subscr_expire_cmd,
560 "subscriber " SUBSCR_TYPES " ID expire",
561 SUBSCR_HELP "Expire the subscriber Now\n")
562{
Keithd32b6d12017-01-18 17:09:33 +0100563 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200564 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],
565 argv[1]);
Keithd32b6d12017-01-18 17:09:33 +0100566
Harald Welte2483f1b2016-06-19 18:06:02 +0200567 if (!vsub) {
Keithd32b6d12017-01-18 17:09:33 +0100568 vty_out(vty, "%% No subscriber found for %s %s%s",
569 argv[0], argv[1], VTY_NEWLINE);
570 return CMD_WARNING;
571 }
572
Maxdcc193d2017-12-27 19:34:15 +0100573 if (vlr_subscr_expire(vsub))
Harald Welte2483f1b2016-06-19 18:06:02 +0200574 vty_out(vty, "%% VLR released subscriber %s%s",
575 vlr_subscr_name(vsub), VTY_NEWLINE);
Keithd32b6d12017-01-18 17:09:33 +0100576
Harald Welte2483f1b2016-06-19 18:06:02 +0200577 if (vsub->use_count > 1)
578 vty_out(vty, "%% Subscriber %s is still in use,"
579 " should be released soon%s",
580 vlr_subscr_name(vsub), VTY_NEWLINE);
581
582 vlr_subscr_put(vsub);
Keithd32b6d12017-01-18 17:09:33 +0100583 return CMD_SUCCESS;
584}
585
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200586#define A3A8_ALG_TYPES "(none|xor|comp128v1)"
Harald Welte28326062010-05-14 20:05:17 +0200587#define A3A8_ALG_HELP \
588 "Use No A3A8 algorithm\n" \
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200589 "Use XOR algorithm\n" \
Harald Welte28326062010-05-14 20:05:17 +0200590 "Use COMP128v1 algorithm\n"
Sylvain Munaut99792902009-12-27 19:30:46 +0100591
Harald Welteb4a84e12010-05-27 10:44:58 +0200592DEFUN(ena_subscr_a3a8,
593 ena_subscr_a3a8_cmd,
594 "subscriber " SUBSCR_TYPES " ID a3a8 " A3A8_ALG_TYPES " [KI]",
Harald Welted3cf85d2010-05-27 10:48:11 +0200595 SUBSCR_HELP "Set a3a8 parameters for the subscriber\n"
596 A3A8_ALG_HELP "Encryption Key Ki\n")
Sylvain Munaut99792902009-12-27 19:30:46 +0100597{
Harald Welte2483f1b2016-06-19 18:06:02 +0200598 vty_out(vty, "%% 'subscriber a3a8' is no longer supported.%s"
599 "%% This is now up to osmo-hlr.%s",
600 VTY_NEWLINE, VTY_NEWLINE);
601 return CMD_WARNING;
Sylvain Munaut99792902009-12-27 19:30:46 +0100602}
603
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100604DEFUN(subscriber_update,
605 subscriber_update_cmd,
606 "subscriber " SUBSCR_TYPES " ID update",
607 SUBSCR_HELP "Update the subscriber data from the dabase.\n")
608{
Harald Welte2483f1b2016-06-19 18:06:02 +0200609 vty_out(vty, "%% 'subscriber update' is no longer supported.%s",
610 VTY_NEWLINE);
611 return CMD_WARNING;
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100612}
613
Harald Weltea1482332009-11-14 10:08:40 +0100614static int scall_cbfn(unsigned int subsys, unsigned int signal,
615 void *handler_data, void *signal_data)
616{
617 struct scall_signal_data *sigdata = signal_data;
618 struct vty *vty = sigdata->data;
619
620 switch (signal) {
621 case S_SCALL_SUCCESS:
Neels Hofmeyre2f24d52017-05-08 15:12:20 +0200622 vty_out(vty, "%% silent call success%s", VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100623 break;
624 case S_SCALL_EXPIRED:
625 vty_out(vty, "%% silent call expired paging%s", VTY_NEWLINE);
626 break;
627 }
628 return 0;
629}
630
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200631DEFUN(show_stats,
632 show_stats_cmd,
633 "show statistics",
634 SHOW_STR "Display network statistics\n")
635{
Harald Weltedcccb182010-05-16 20:52:23 +0200636 struct gsm_network *net = gsmnet_from_vty(vty);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200637
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200638 vty_out(vty, "Location Update : %lu attach, %lu normal, %lu periodic%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200639 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_ATTACH].current,
640 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_NORMAL].current,
641 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_PERIODIC].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200642 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200643 vty_out(vty, "IMSI Detach Indications : %lu%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200644 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_DETACH].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200645 VTY_NEWLINE);
Neels Hofmeyr36891a72016-05-09 13:18:03 +0200646 vty_out(vty, "Location Updating Results: %lu completed, %lu failed%s",
647 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_COMPLETED].current,
648 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_FAILED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200649 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200650 vty_out(vty, "SMS MO : %lu submitted, %lu no receiver%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200651 net->msc_ctrs->ctr[MSC_CTR_SMS_SUBMITTED].current,
652 net->msc_ctrs->ctr[MSC_CTR_SMS_NO_RECEIVER].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200653 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200654 vty_out(vty, "SMS MT : %lu delivered, %lu no memory, %lu other error%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200655 net->msc_ctrs->ctr[MSC_CTR_SMS_DELIVERED].current,
656 net->msc_ctrs->ctr[MSC_CTR_SMS_RP_ERR_MEM].current,
657 net->msc_ctrs->ctr[MSC_CTR_SMS_RP_ERR_OTHER].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200658 VTY_NEWLINE);
Harald Weltea29e43a2010-12-24 16:06:33 +0100659 vty_out(vty, "MO Calls : %lu setup, %lu connect ack%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200660 net->msc_ctrs->ctr[MSC_CTR_CALL_MO_SETUP].current,
661 net->msc_ctrs->ctr[MSC_CTR_CALL_MO_CONNECT_ACK].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200662 VTY_NEWLINE);
Harald Weltea29e43a2010-12-24 16:06:33 +0100663 vty_out(vty, "MT Calls : %lu setup, %lu connect%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200664 net->msc_ctrs->ctr[MSC_CTR_CALL_MT_SETUP].current,
665 net->msc_ctrs->ctr[MSC_CTR_CALL_MT_CONNECT].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200666 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200667 return CMD_SUCCESS;
668}
669
Holger Hans Peter Freyther81c0e252010-12-25 14:08:00 +0100670DEFUN(show_smsqueue,
671 show_smsqueue_cmd,
672 "show sms-queue",
673 SHOW_STR "Display SMSqueue statistics\n")
674{
675 struct gsm_network *net = gsmnet_from_vty(vty);
676
677 sms_queue_stats(net->sms_queue, vty);
678 return CMD_SUCCESS;
679}
680
Holger Hans Peter Freyther7a0e1662010-12-25 14:15:32 +0100681DEFUN(smsqueue_trigger,
682 smsqueue_trigger_cmd,
683 "sms-queue trigger",
684 "SMS Queue\n" "Trigger sending messages\n")
685{
686 struct gsm_network *net = gsmnet_from_vty(vty);
687
688 sms_queue_trigger(net->sms_queue);
689 return CMD_SUCCESS;
690}
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200691
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100692DEFUN(smsqueue_max,
693 smsqueue_max_cmd,
694 "sms-queue max-pending <1-500>",
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200695 "SMS Queue\n" "SMS to deliver in parallel\n" "Amount\n")
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100696{
697 struct gsm_network *net = gsmnet_from_vty(vty);
698
699 sms_queue_set_max_pending(net->sms_queue, atoi(argv[0]));
700 return CMD_SUCCESS;
701}
702
Holger Hans Peter Freyther4dcc5e52010-12-25 14:38:30 +0100703DEFUN(smsqueue_clear,
704 smsqueue_clear_cmd,
705 "sms-queue clear",
706 "SMS Queue\n" "Clear the queue of pending SMS\n")
707{
708 struct gsm_network *net = gsmnet_from_vty(vty);
709
710 sms_queue_clear(net->sms_queue);
711 return CMD_SUCCESS;
712}
713
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100714DEFUN(smsqueue_fail,
715 smsqueue_fail_cmd,
716 "sms-queue max-failure <1-500>",
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200717 "SMS Queue\n" "Maximum amount of delivery failures\n" "Amount\n")
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100718{
719 struct gsm_network *net = gsmnet_from_vty(vty);
720
721 sms_queue_set_max_failure(net->sms_queue, atoi(argv[0]));
722 return CMD_SUCCESS;
723}
724
Harald Welteab386e62011-09-01 18:18:43 +0200725
726DEFUN(cfg_mncc_int, cfg_mncc_int_cmd,
727 "mncc-int", "Configure internal MNCC handler")
728{
729 vty->node = MNCC_INT_NODE;
730
731 return CMD_SUCCESS;
732}
733
734static struct cmd_node mncc_int_node = {
735 MNCC_INT_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200736 "%s(config-mncc-int)# ",
Harald Welteab386e62011-09-01 18:18:43 +0200737 1,
738};
739
740static const struct value_string tchf_codec_names[] = {
741 { GSM48_CMODE_SPEECH_V1, "fr" },
742 { GSM48_CMODE_SPEECH_EFR, "efr" },
743 { GSM48_CMODE_SPEECH_AMR, "amr" },
744 { 0, NULL }
745};
746
747static const struct value_string tchh_codec_names[] = {
748 { GSM48_CMODE_SPEECH_V1, "hr" },
749 { GSM48_CMODE_SPEECH_AMR, "amr" },
750 { 0, NULL }
751};
752
753static int config_write_mncc_int(struct vty *vty)
754{
755 vty_out(vty, "mncc-int%s", VTY_NEWLINE);
756 vty_out(vty, " default-codec tch-f %s%s",
757 get_value_string(tchf_codec_names, mncc_int.def_codec[0]),
758 VTY_NEWLINE);
759 vty_out(vty, " default-codec tch-h %s%s",
760 get_value_string(tchh_codec_names, mncc_int.def_codec[1]),
761 VTY_NEWLINE);
762
763 return CMD_SUCCESS;
764}
765
766DEFUN(mnccint_def_codec_f,
767 mnccint_def_codec_f_cmd,
768 "default-codec tch-f (fr|efr|amr)",
769 "Set default codec\n" "Codec for TCH/F\n"
770 "Full-Rate\n" "Enhanced Full-Rate\n" "Adaptive Multi-Rate\n")
771{
772 mncc_int.def_codec[0] = get_string_value(tchf_codec_names, argv[0]);
773
774 return CMD_SUCCESS;
775}
776
777DEFUN(mnccint_def_codec_h,
778 mnccint_def_codec_h_cmd,
779 "default-codec tch-h (hr|amr)",
780 "Set default codec\n" "Codec for TCH/H\n"
781 "Half-Rate\n" "Adaptive Multi-Rate\n")
782{
783 mncc_int.def_codec[1] = get_string_value(tchh_codec_names, argv[0]);
784
785 return CMD_SUCCESS;
786}
787
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100788
789DEFUN(logging_fltr_imsi,
790 logging_fltr_imsi_cmd,
791 "logging filter imsi IMSI",
792 LOGGING_STR FILTER_STR
793 "Filter log messages by IMSI\n" "IMSI to be used as filter\n")
794{
Harald Welte2483f1b2016-06-19 18:06:02 +0200795 struct vlr_subscr *vlr_subscr;
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100796 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
797 struct log_target *tgt = osmo_log_vty2tgt(vty);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100798 const char *imsi = argv[0];
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100799
800 if (!tgt)
801 return CMD_WARNING;
802
Harald Welte2483f1b2016-06-19 18:06:02 +0200803 vlr_subscr = vlr_subscr_find_by_imsi(gsmnet->vlr, imsi);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100804
Neels Hofmeyr84da6b12016-05-20 21:59:55 +0200805 if (!vlr_subscr) {
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100806 vty_out(vty, "%%no subscriber with IMSI(%s)%s",
807 argv[0], VTY_NEWLINE);
808 return CMD_WARNING;
809 }
810
Harald Welte2483f1b2016-06-19 18:06:02 +0200811 log_set_filter_vlr_subscr(tgt, vlr_subscr);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100812 return CMD_SUCCESS;
813}
Holger Hans Peter Freyther925c57f2015-01-27 10:58:29 +0100814
Harald Welte2483f1b2016-06-19 18:06:02 +0200815static struct cmd_node hlr_node = {
816 HLR_NODE,
817 "%s(config-hlr)# ",
818 1,
819};
820
821DEFUN(cfg_hlr, cfg_hlr_cmd,
822 "hlr", "Configure connection to the HLR")
823{
824 vty->node = HLR_NODE;
825 return CMD_SUCCESS;
826}
827
828DEFUN(cfg_hlr_remote_ip, cfg_hlr_remote_ip_cmd, "remote-ip A.B.C.D",
829 "Remote GSUP address of the HLR\n"
830 "Remote GSUP address (default: " MSC_HLR_REMOTE_IP_DEFAULT ")")
831{
832 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
833 talloc_free((void*)gsmnet->gsup_server_addr_str);
834 gsmnet->gsup_server_addr_str = talloc_strdup(gsmnet, argv[0]);
835 return CMD_SUCCESS;
836}
837
838DEFUN(cfg_hlr_remote_port, cfg_hlr_remote_port_cmd, "remote-port <1-65535>",
839 "Remote GSUP port of the HLR\n"
840 "Remote GSUP port (default: " OSMO_STRINGIFY(MSC_HLR_REMOTE_PORT_DEFAULT) ")")
841{
842 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
843 gsmnet->gsup_server_port = atoi(argv[0]);
844 return CMD_SUCCESS;
845}
846
847static int config_write_hlr(struct vty *vty)
848{
849 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
850
851 vty_out(vty, "hlr%s", VTY_NEWLINE);
852 vty_out(vty, " remote-ip %s%s",
853 gsmnet->gsup_server_addr_str, VTY_NEWLINE);
854 vty_out(vty, " remote-port %u%s",
855 gsmnet->gsup_server_port, VTY_NEWLINE);
856 return CMD_SUCCESS;
857}
858
Harald Weltedcccb182010-05-16 20:52:23 +0200859int bsc_vty_init_extra(void)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200860{
Pablo Neira Ayusobbc5b992011-05-06 12:12:31 +0200861 osmo_signal_register_handler(SS_SCALL, scall_cbfn, NULL);
Harald Weltea1482332009-11-14 10:08:40 +0100862
Harald Welteb4d5b172010-05-12 16:10:35 +0000863 install_element_ve(&show_subscr_cmd);
864 install_element_ve(&show_subscr_cache_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200865
Harald Welteb4d5b172010-05-12 16:10:35 +0000866 install_element_ve(&sms_send_pend_cmd);
Harald Welte98f9c752009-11-14 08:00:53 +0100867
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200868 install_element_ve(&subscriber_create_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +0000869 install_element_ve(&subscriber_send_sms_cmd);
870 install_element_ve(&subscriber_silent_sms_cmd);
871 install_element_ve(&subscriber_silent_call_start_cmd);
872 install_element_ve(&subscriber_silent_call_stop_cmd);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800873 install_element_ve(&subscriber_ussd_notify_cmd);
Harald Welte94307772017-06-12 01:52:27 +0200874 install_element_ve(&subscriber_mstest_close_cmd);
875 install_element_ve(&subscriber_mstest_open_cmd);
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100876 install_element_ve(&subscriber_update_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +0000877 install_element_ve(&show_stats_cmd);
Holger Hans Peter Freyther81c0e252010-12-25 14:08:00 +0100878 install_element_ve(&show_smsqueue_cmd);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100879 install_element_ve(&logging_fltr_imsi_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200880
Keithd32b6d12017-01-18 17:09:33 +0100881 install_element(ENABLE_NODE, &ena_subscr_expire_cmd);
Harald Welteb4a84e12010-05-27 10:44:58 +0200882 install_element(ENABLE_NODE, &ena_subscr_a3a8_cmd);
Holger Hans Peter Freyther7a0e1662010-12-25 14:15:32 +0100883 install_element(ENABLE_NODE, &smsqueue_trigger_cmd);
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100884 install_element(ENABLE_NODE, &smsqueue_max_cmd);
Holger Hans Peter Freyther4dcc5e52010-12-25 14:38:30 +0100885 install_element(ENABLE_NODE, &smsqueue_clear_cmd);
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100886 install_element(ENABLE_NODE, &smsqueue_fail_cmd);
Nico Goldeb62b1232011-02-22 17:54:47 +0100887 install_element(ENABLE_NODE, &subscriber_send_pending_sms_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200888
Harald Welteab386e62011-09-01 18:18:43 +0200889 install_element(CONFIG_NODE, &cfg_mncc_int_cmd);
890 install_node(&mncc_int_node, config_write_mncc_int);
Harald Welteab386e62011-09-01 18:18:43 +0200891 install_element(MNCC_INT_NODE, &mnccint_def_codec_f_cmd);
892 install_element(MNCC_INT_NODE, &mnccint_def_codec_h_cmd);
893
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100894 install_element(CFG_LOG_NODE, &logging_fltr_imsi_cmd);
Harald Welteb02fc1e2013-02-12 11:15:49 +0100895
Harald Welte2483f1b2016-06-19 18:06:02 +0200896 install_element(CONFIG_NODE, &cfg_hlr_cmd);
897 install_node(&hlr_node, config_write_hlr);
898 install_element(HLR_NODE, &cfg_hlr_remote_ip_cmd);
899 install_element(HLR_NODE, &cfg_hlr_remote_port_cmd);
Holger Hans Peter Freyther925c57f2015-01-27 10:58:29 +0100900
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200901 return 0;
902}