blob: c7ec586a4027330eed9df8caa182870283064168 [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 Welteb4771a62012-11-11 10:58:51 +010059#include "meas_feed.h"
60
Harald Weltedcccb182010-05-16 20:52:23 +020061extern struct gsm_network *gsmnet_from_vty(struct vty *v);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020062
Harald Welte2483f1b2016-06-19 18:06:02 +020063static void subscr_dump_full_vty(struct vty *vty, struct vlr_subscr *vsub)
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010064{
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +020065 int reqs;
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +020066 struct llist_head *entry;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010067
Harald Welte2483f1b2016-06-19 18:06:02 +020068 if (strlen(vsub->name))
69 vty_out(vty, " Name: '%s'%s", vsub->name, VTY_NEWLINE);
70 if (strlen(vsub->msisdn))
71 vty_out(vty, " Extension: %s%s", vsub->msisdn,
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010072 VTY_NEWLINE);
Holger Hans Peter Freyther3d76e442010-12-25 16:40:54 +010073 vty_out(vty, " LAC: %d/0x%x%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020074 vsub->lac, vsub->lac, VTY_NEWLINE);
75 vty_out(vty, " IMSI: %s%s", vsub->imsi, VTY_NEWLINE);
76 if (vsub->tmsi != GSM_RESERVED_TMSI)
77 vty_out(vty, " TMSI: %08X%s", vsub->tmsi,
78 VTY_NEWLINE);
79 if (vsub->tmsi_new != GSM_RESERVED_TMSI)
80 vty_out(vty, " new TMSI: %08X%s", vsub->tmsi_new,
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010081 VTY_NEWLINE);
82
Harald Welte2483f1b2016-06-19 18:06:02 +020083#if 0
84 /* TODO: add this to vlr_subscr? */
85 if (vsub->auth_info.auth_algo != AUTH_ALGO_NONE) {
86 struct gsm_auth_info *i = &vsub->auth_info;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010087 vty_out(vty, " A3A8 algorithm id: %d%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020088 i->auth_algo, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010089 vty_out(vty, " A3A8 Ki: %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020090 osmo_hexdump(i->a3a8_ki, i->a3a8_ki_len),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010091 VTY_NEWLINE);
92 }
Harald Welte2483f1b2016-06-19 18:06:02 +020093#endif
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010094
Harald Welte2483f1b2016-06-19 18:06:02 +020095 if (vsub->last_tuple) {
96 struct gsm_auth_tuple *t = vsub->last_tuple;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010097 vty_out(vty, " A3A8 last tuple (used %d times):%s",
Harald Welte2483f1b2016-06-19 18:06:02 +020098 t->use_count, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +010099 vty_out(vty, " seq # : %d%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200100 t->key_seq, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100101 vty_out(vty, " RAND : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200102 osmo_hexdump(t->vec.rand, sizeof(t->vec.rand)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100103 VTY_NEWLINE);
104 vty_out(vty, " SRES : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200105 osmo_hexdump(t->vec.sres, sizeof(t->vec.sres)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100106 VTY_NEWLINE);
107 vty_out(vty, " Kc : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200108 osmo_hexdump(t->vec.kc, sizeof(t->vec.kc)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100109 VTY_NEWLINE);
110 }
Holger Hans Peter Freytherb9708942013-07-27 19:42:35 +0200111
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200112 reqs = 0;
Harald Welte2483f1b2016-06-19 18:06:02 +0200113 llist_for_each(entry, &vsub->cs.requests)
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200114 reqs += 1;
Harald Welte2483f1b2016-06-19 18:06:02 +0200115 vty_out(vty, " Paging: %s paging for %d requests%s",
116 vsub->cs.is_paging ? "is" : "not", reqs, VTY_NEWLINE);
117 vty_out(vty, " Use count: %u%s", vsub->use_count, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100118}
119
120
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200121/* Subscriber */
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200122DEFUN(show_subscr_cache,
123 show_subscr_cache_cmd,
124 "show subscriber cache",
Harald Weltecfaabbb2012-08-16 23:23:50 +0200125 SHOW_STR "Show information about subscribers\n"
126 "Display contents of subscriber cache\n")
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200127{
Harald Welte2483f1b2016-06-19 18:06:02 +0200128 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
129 struct vlr_subscr *vsub;
130 int count = 0;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200131
Harald Welte2483f1b2016-06-19 18:06:02 +0200132 llist_for_each_entry(vsub, &gsmnet->vlr->subscribers, list) {
133 if (++count > 100) {
134 vty_out(vty, "%% More than %d subscribers in cache,"
135 " stopping here.%s", count-1, VTY_NEWLINE);
136 break;
137 }
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200138 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200139 subscr_dump_full_vty(vty, vsub);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200140 }
141
142 return CMD_SUCCESS;
143}
144
145DEFUN(sms_send_pend,
146 sms_send_pend_cmd,
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100147 "sms send pending",
Neels Hofmeyrd1fdefe2016-04-01 02:17:24 +0200148 "SMS related commands\n" "SMS Sending related commands\n"
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100149 "Send all pending SMS")
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200150{
Harald Weltedcccb182010-05-16 20:52:23 +0200151 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200152 struct gsm_sms *sms;
Harald Welte2483f1b2016-06-19 18:06:02 +0200153 unsigned long long sms_id = 0;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200154
155 while (1) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200156 sms = db_sms_get_next_unsent(gsmnet, sms_id, UINT_MAX);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200157 if (!sms)
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100158 break;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200159
Harald Welte2483f1b2016-06-19 18:06:02 +0200160 if (sms->receiver)
161 gsm411_send_sms_subscr(sms->receiver, sms);
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100162
Harald Welte2483f1b2016-06-19 18:06:02 +0200163 sms_id = sms->id + 1;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200164 }
165
166 return CMD_SUCCESS;
167}
168
Harald Welte2483f1b2016-06-19 18:06:02 +0200169static int _send_sms_str(struct vlr_subscr *receiver,
170 struct vlr_subscr *sender,
171 char *str, uint8_t tp_pid)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200172{
Harald Welte2483f1b2016-06-19 18:06:02 +0200173 struct gsm_network *net = receiver->vlr->user_ctx;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200174 struct gsm_sms *sms;
175
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100176 sms = sms_from_text(receiver, sender, 0, str);
Harald Welte793a1352009-11-05 15:51:17 +0900177 sms->protocol_id = tp_pid;
Nico Golde59502362010-06-29 20:13:06 +0200178
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100179 /* store in database for the queue */
180 if (db_sms_store(sms) != 0) {
Holger Hans Peter Freythereff409492012-11-10 19:46:58 +0100181 LOGP(DLSMS, LOGL_ERROR, "Failed to store SMS in Database\n");
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100182 sms_free(sms);
183 return CMD_WARNING;
Nico Golde59502362010-06-29 20:13:06 +0200184 }
Neels Hofmeyr1e918c32016-05-09 21:48:53 +0200185 LOGP(DLSMS, LOGL_DEBUG, "SMS stored in DB\n");
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200186
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100187 sms_free(sms);
Harald Welte2483f1b2016-06-19 18:06:02 +0200188 sms_queue_trigger(net->sms_queue);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200189 return CMD_SUCCESS;
190}
191
Harald Welte2483f1b2016-06-19 18:06:02 +0200192static struct vlr_subscr *get_vsub_by_argv(struct gsm_network *gsmnet,
193 const char *type,
194 const char *id)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200195{
Harald Welte2483f1b2016-06-19 18:06:02 +0200196 if (!strcmp(type, "extension") || !strcmp(type, "msisdn"))
197 return vlr_subscr_find_by_msisdn(gsmnet->vlr, id);
198 else if (!strcmp(type, "imsi") || !strcmp(type, "id"))
199 return vlr_subscr_find_by_imsi(gsmnet->vlr, id);
Harald Welte98f9c752009-11-14 08:00:53 +0100200 else if (!strcmp(type, "tmsi"))
Harald Welte2483f1b2016-06-19 18:06:02 +0200201 return vlr_subscr_find_by_tmsi(gsmnet->vlr, atoi(id));
Harald Welte98f9c752009-11-14 08:00:53 +0100202
203 return NULL;
204}
205#define SUBSCR_TYPES "(extension|imsi|tmsi|id)"
Harald Welte28326062010-05-14 20:05:17 +0200206#define SUBSCR_HELP "Operations on a Subscriber\n" \
Neels Hofmeyrd1fdefe2016-04-01 02:17:24 +0200207 "Identify subscriber by extension (phone number)\n" \
208 "Identify subscriber by IMSI\n" \
209 "Identify subscriber by TMSI\n" \
210 "Identify subscriber by database ID\n" \
Harald Welte28326062010-05-14 20:05:17 +0200211 "Identifier for the subscriber\n"
Harald Welte98f9c752009-11-14 08:00:53 +0100212
Harald Welteb4a84e12010-05-27 10:44:58 +0200213DEFUN(show_subscr,
214 show_subscr_cmd,
215 "show subscriber " SUBSCR_TYPES " ID",
216 SHOW_STR SUBSCR_HELP)
217{
218 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200219 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],
220 argv[1]);
Harald Welteb4a84e12010-05-27 10:44:58 +0200221
Harald Welte2483f1b2016-06-19 18:06:02 +0200222 if (!vsub) {
Harald Welteb4a84e12010-05-27 10:44:58 +0200223 vty_out(vty, "%% No subscriber found for %s %s%s",
224 argv[0], argv[1], VTY_NEWLINE);
225 return CMD_WARNING;
226 }
227
Harald Welte2483f1b2016-06-19 18:06:02 +0200228 subscr_dump_full_vty(vty, vsub);
Harald Welteb4a84e12010-05-27 10:44:58 +0200229
Harald Welte2483f1b2016-06-19 18:06:02 +0200230 vlr_subscr_put(vsub);
Harald Welteb4a84e12010-05-27 10:44:58 +0200231
232 return CMD_SUCCESS;
233}
234
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200235DEFUN(subscriber_create,
236 subscriber_create_cmd,
237 "subscriber create imsi ID",
238 "Operations on a Subscriber\n" \
239 "Create new subscriber\n" \
240 "Identify the subscriber by his IMSI\n" \
241 "Identifier for the subscriber\n")
242{
Harald Welte2483f1b2016-06-19 18:06:02 +0200243 vty_out(vty, "%% 'subscriber create' now needs to be done at osmo-hlr%s",
244 VTY_NEWLINE);
245 return CMD_WARNING;
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200246}
247
Nico Goldeb62b1232011-02-22 17:54:47 +0100248DEFUN(subscriber_send_pending_sms,
249 subscriber_send_pending_sms_cmd,
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200250 "subscriber " SUBSCR_TYPES " ID sms pending-send",
Nico Goldeb62b1232011-02-22 17:54:47 +0100251 SUBSCR_HELP "SMS Operations\n" "Send pending SMS\n")
252{
253 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200254 struct vlr_subscr *vsub;
Nico Goldeb62b1232011-02-22 17:54:47 +0100255 struct gsm_sms *sms;
256
Harald Welte2483f1b2016-06-19 18:06:02 +0200257 vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
258 if (!vsub) {
Holger Hans Peter Freyther9feef482013-07-04 20:34:46 +0200259 vty_out(vty, "%% No subscriber found for %s %s%s",
260 argv[0], argv[1], VTY_NEWLINE);
261 return CMD_WARNING;
262 }
263
Harald Welte2483f1b2016-06-19 18:06:02 +0200264 sms = db_sms_get_unsent_for_subscr(vsub, UINT_MAX);
Nico Goldeb62b1232011-02-22 17:54:47 +0100265 if (sms)
266 gsm411_send_sms_subscr(sms->receiver, sms);
267
Harald Welte2483f1b2016-06-19 18:06:02 +0200268 vlr_subscr_put(vsub);
Nico Goldeb62b1232011-02-22 17:54:47 +0100269
270 return CMD_SUCCESS;
271}
272
Harald Welte98f9c752009-11-14 08:00:53 +0100273DEFUN(subscriber_send_sms,
274 subscriber_send_sms_cmd,
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100275 "subscriber " SUBSCR_TYPES " ID sms sender " SUBSCR_TYPES " SENDER_ID send .LINE",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100276 SUBSCR_HELP "SMS Operations\n" SUBSCR_HELP "Send SMS\n" "Actual SMS Text\n")
Harald Welte98f9c752009-11-14 08:00:53 +0100277{
Harald Weltedcccb182010-05-16 20:52:23 +0200278 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200279 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
280 struct vlr_subscr *sender = get_vsub_by_argv(gsmnet, argv[2], argv[3]);
Harald Welte20474ad2010-05-16 19:28:32 +0200281 char *str;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200282 int rc;
283
Harald Welte2483f1b2016-06-19 18:06:02 +0200284 if (!vsub) {
Harald Welte20f98312009-11-14 10:11:45 +0100285 vty_out(vty, "%% No subscriber found for %s %s%s",
286 argv[0], argv[1], VTY_NEWLINE);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100287 rc = CMD_WARNING;
288 goto err;
Harald Welte20f98312009-11-14 10:11:45 +0100289 }
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100290
291 if (!sender) {
292 vty_out(vty, "%% No sender found for %s %s%s",
293 argv[2], argv[3], VTY_NEWLINE);
294 rc = CMD_WARNING;
295 goto err;
296 }
297
298 str = argv_concat(argv, argc, 4);
Harald Welte2483f1b2016-06-19 18:06:02 +0200299 rc = _send_sms_str(vsub, sender, str, 0);
Harald Welte20474ad2010-05-16 19:28:32 +0200300 talloc_free(str);
Harald Welte793a1352009-11-05 15:51:17 +0900301
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100302err:
303 if (sender)
Harald Welte2483f1b2016-06-19 18:06:02 +0200304 vlr_subscr_put(sender);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100305
Harald Welte2483f1b2016-06-19 18:06:02 +0200306 if (vsub)
307 vlr_subscr_put(vsub);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100308
Harald Welte793a1352009-11-05 15:51:17 +0900309 return rc;
310}
311
Harald Welte98f9c752009-11-14 08:00:53 +0100312DEFUN(subscriber_silent_sms,
313 subscriber_silent_sms_cmd,
Harald Welte1011d5b2014-07-10 20:19:00 +0200314
315 "subscriber " SUBSCR_TYPES " ID silent-sms sender " SUBSCR_TYPES " SENDER_ID send .LINE",
316 SUBSCR_HELP "Silent SMS Operations\n" SUBSCR_HELP "Send SMS\n" "Actual SMS Text\n")
Harald Welte793a1352009-11-05 15:51:17 +0900317{
Harald Weltedcccb182010-05-16 20:52:23 +0200318 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200319 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
320 struct vlr_subscr *sender = get_vsub_by_argv(gsmnet, argv[2], argv[3]);
Harald Welte20474ad2010-05-16 19:28:32 +0200321 char *str;
Harald Welte793a1352009-11-05 15:51:17 +0900322 int rc;
323
Harald Welte2483f1b2016-06-19 18:06:02 +0200324 if (!vsub) {
Harald Welte20f98312009-11-14 10:11:45 +0100325 vty_out(vty, "%% No subscriber found for %s %s%s",
326 argv[0], argv[1], VTY_NEWLINE);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100327 rc = CMD_WARNING;
328 goto err;
Harald Welte20f98312009-11-14 10:11:45 +0100329 }
Harald Welte793a1352009-11-05 15:51:17 +0900330
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100331 if (!sender) {
332 vty_out(vty, "%% No sender found for %s %s%s",
333 argv[2], argv[3], VTY_NEWLINE);
334 rc = CMD_WARNING;
335 goto err;
336 }
337
338 str = argv_concat(argv, argc, 4);
Harald Welte2483f1b2016-06-19 18:06:02 +0200339 rc = _send_sms_str(vsub, sender, str, 64);
Harald Welte20474ad2010-05-16 19:28:32 +0200340 talloc_free(str);
Harald Welte793a1352009-11-05 15:51:17 +0900341
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100342err:
343 if (sender)
Harald Welte2483f1b2016-06-19 18:06:02 +0200344 vlr_subscr_put(sender);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100345
Harald Welte2483f1b2016-06-19 18:06:02 +0200346 if (vsub)
347 vlr_subscr_put(vsub);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100348
Harald Welte793a1352009-11-05 15:51:17 +0900349 return rc;
350}
351
Harald Welte28326062010-05-14 20:05:17 +0200352#define CHAN_TYPES "(any|tch/f|tch/any|sdcch)"
353#define CHAN_TYPE_HELP \
354 "Any channel\n" \
355 "TCH/F channel\n" \
356 "Any TCH channel\n" \
357 "SDCCH channel\n"
358
Sylvain Munaut50480702010-01-02 14:29:43 +0100359DEFUN(subscriber_silent_call_start,
360 subscriber_silent_call_start_cmd,
Harald Welteb4a84e12010-05-27 10:44:58 +0200361 "subscriber " SUBSCR_TYPES " ID silent-call start (any|tch/f|tch/any|sdcch)",
Harald Welte28326062010-05-14 20:05:17 +0200362 SUBSCR_HELP "Silent call operation\n" "Start silent call\n"
363 CHAN_TYPE_HELP)
Sylvain Munaut50480702010-01-02 14:29:43 +0100364{
Harald Weltedcccb182010-05-16 20:52:23 +0200365 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200366 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Sylvain Munaut50480702010-01-02 14:29:43 +0100367 int rc, type;
368
Harald Welte2483f1b2016-06-19 18:06:02 +0200369 if (!vsub) {
Sylvain Munaut50480702010-01-02 14:29:43 +0100370 vty_out(vty, "%% No subscriber found for %s %s%s",
371 argv[0], argv[1], VTY_NEWLINE);
372 return CMD_WARNING;
373 }
374
375 if (!strcmp(argv[2], "tch/f"))
376 type = RSL_CHANNEED_TCH_F;
377 else if (!strcmp(argv[2], "tch/any"))
378 type = RSL_CHANNEED_TCH_ForH;
379 else if (!strcmp(argv[2], "sdcch"))
380 type = RSL_CHANNEED_SDCCH;
381 else
382 type = RSL_CHANNEED_ANY; /* Defaults to ANY */
383
Harald Welte2483f1b2016-06-19 18:06:02 +0200384 rc = gsm_silent_call_start(vsub, vty, type);
Sylvain Munaut50480702010-01-02 14:29:43 +0100385 if (rc <= 0) {
386 vty_out(vty, "%% Subscriber not attached%s",
387 VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200388 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100389 return CMD_WARNING;
390 }
391
Harald Welte2483f1b2016-06-19 18:06:02 +0200392 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100393
394 return CMD_SUCCESS;
395}
396
397DEFUN(subscriber_silent_call_stop,
398 subscriber_silent_call_stop_cmd,
Harald Welteb4a84e12010-05-27 10:44:58 +0200399 "subscriber " SUBSCR_TYPES " ID silent-call stop",
Harald Welte28326062010-05-14 20:05:17 +0200400 SUBSCR_HELP "Silent call operation\n" "Stop silent call\n"
401 CHAN_TYPE_HELP)
Harald Weltea1482332009-11-14 10:08:40 +0100402{
Harald Weltedcccb182010-05-16 20:52:23 +0200403 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200404 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Harald Weltea1482332009-11-14 10:08:40 +0100405 int rc;
406
Harald Welte2483f1b2016-06-19 18:06:02 +0200407 if (!vsub) {
Harald Weltea1482332009-11-14 10:08:40 +0100408 vty_out(vty, "%% No subscriber found for %s %s%s",
Harald Welte20f98312009-11-14 10:11:45 +0100409 argv[0], argv[1], VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100410 return CMD_WARNING;
411 }
412
Harald Welte2483f1b2016-06-19 18:06:02 +0200413 rc = gsm_silent_call_stop(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100414 if (rc < 0) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200415 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100416 return CMD_WARNING;
Harald Weltea1482332009-11-14 10:08:40 +0100417 }
418
Harald Welte2483f1b2016-06-19 18:06:02 +0200419 vlr_subscr_put(vsub);
Harald Weltea1482332009-11-14 10:08:40 +0100420
421 return CMD_SUCCESS;
422}
423
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800424DEFUN(subscriber_ussd_notify,
425 subscriber_ussd_notify_cmd,
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800426 "subscriber " SUBSCR_TYPES " ID ussd-notify (0|1|2) .TEXT",
Harald Weltecfaabbb2012-08-16 23:23:50 +0200427 SUBSCR_HELP "Send a USSD notify to the subscriber\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +0200428 "Alerting Level 0\n"
429 "Alerting Level 1\n"
430 "Alerting Level 2\n"
431 "Text of USSD message to send\n")
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800432{
433 char *text;
434 struct gsm_subscriber_connection *conn;
435 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200436 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800437 int level;
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800438
Harald Welte2483f1b2016-06-19 18:06:02 +0200439 if (!vsub) {
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800440 vty_out(vty, "%% No subscriber found for %s %s%s",
441 argv[0], argv[1], VTY_NEWLINE);
442 return CMD_WARNING;
443 }
444
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800445 level = atoi(argv[2]);
446 text = argv_concat(argv, argc, 3);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800447 if (!text) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200448 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800449 return CMD_WARNING;
450 }
451
Harald Welte2483f1b2016-06-19 18:06:02 +0200452 conn = connection_for_subscr(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800453 if (!conn) {
454 vty_out(vty, "%% An active connection is required for %s %s%s",
455 argv[0], argv[1], VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200456 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800457 talloc_free(text);
458 return CMD_WARNING;
459 }
460
Neels Hofmeyr43273c62016-05-10 12:50:31 +0200461 msc_send_ussd_notify(conn, level, text);
462 msc_send_ussd_release_complete(conn);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800463
Harald Welte2483f1b2016-06-19 18:06:02 +0200464 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800465 talloc_free(text);
466 return CMD_SUCCESS;
467}
468
Harald Welte94307772017-06-12 01:52:27 +0200469static int loop_by_char(uint8_t ch)
470{
471 switch (ch) {
472 case 'a':
473 return GSM414_LOOP_A;
474 case 'b':
475 return GSM414_LOOP_B;
476 case 'c':
477 return GSM414_LOOP_C;
478 case 'd':
479 return GSM414_LOOP_D;
480 case 'e':
481 return GSM414_LOOP_E;
482 case 'f':
483 return GSM414_LOOP_F;
484 case 'i':
485 return GSM414_LOOP_I;
486 }
487 return -1;
488}
489
490DEFUN(subscriber_mstest_close,
491 subscriber_mstest_close_cmd,
492 "subscriber " SUBSCR_TYPES " ID ms-test close-loop (a|b|c|d|e|f|i)",
493 SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
494 "Close a TCH Loop inside the MS\n"
495 "Loop Type A\n"
496 "Loop Type B\n"
497 "Loop Type C\n"
498 "Loop Type D\n"
499 "Loop Type E\n"
500 "Loop Type F\n"
501 "Loop Type I\n")
502{
503 struct gsm_subscriber_connection *conn;
504 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
505 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
506 const char *loop_str;
507 int loop_mode;
508
509 if (!vsub) {
510 vty_out(vty, "%% No subscriber found for %s %s%s",
511 argv[0], argv[1], VTY_NEWLINE);
512 return CMD_WARNING;
513 }
514
515 loop_str = argv[2];
516 loop_mode = loop_by_char(loop_str[0]);
517
518 conn = connection_for_subscr(vsub);
519 if (!conn) {
520 vty_out(vty, "%% An active connection is required for %s %s%s",
521 argv[0], argv[1], VTY_NEWLINE);
522 vlr_subscr_put(vsub);
523 return CMD_WARNING;
524 }
525
526 gsm0414_tx_close_tch_loop_cmd(conn, loop_mode);
527
528 return CMD_SUCCESS;
529}
530
531DEFUN(subscriber_mstest_open,
532 subscriber_mstest_open_cmd,
533 "subscriber " SUBSCR_TYPES " ID ms-test open-loop",
534 SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
535 "Open a TCH Loop inside the MS\n")
536{
537 struct gsm_subscriber_connection *conn;
538 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
539 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
540
541 if (!vsub) {
542 vty_out(vty, "%% No subscriber found for %s %s%s",
543 argv[0], argv[1], VTY_NEWLINE);
544 return CMD_WARNING;
545 }
546
547 conn = connection_for_subscr(vsub);
548 if (!conn) {
549 vty_out(vty, "%% An active connection is required for %s %s%s",
550 argv[0], argv[1], VTY_NEWLINE);
551 vlr_subscr_put(vsub);
552 return CMD_WARNING;
553 }
554
555 gsm0414_tx_open_loop_cmd(conn);
556
557 return CMD_SUCCESS;
558}
559
Keithd32b6d12017-01-18 17:09:33 +0100560DEFUN(ena_subscr_expire,
561 ena_subscr_expire_cmd,
562 "subscriber " SUBSCR_TYPES " ID expire",
563 SUBSCR_HELP "Expire the subscriber Now\n")
564{
Keithd32b6d12017-01-18 17:09:33 +0100565 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200566 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],
567 argv[1]);
Keithd32b6d12017-01-18 17:09:33 +0100568
Harald Welte2483f1b2016-06-19 18:06:02 +0200569 if (!vsub) {
Keithd32b6d12017-01-18 17:09:33 +0100570 vty_out(vty, "%% No subscriber found for %s %s%s",
571 argv[0], argv[1], VTY_NEWLINE);
572 return CMD_WARNING;
573 }
574
Maxdcc193d2017-12-27 19:34:15 +0100575 if (vlr_subscr_expire(vsub))
Harald Welte2483f1b2016-06-19 18:06:02 +0200576 vty_out(vty, "%% VLR released subscriber %s%s",
577 vlr_subscr_name(vsub), VTY_NEWLINE);
Keithd32b6d12017-01-18 17:09:33 +0100578
Harald Welte2483f1b2016-06-19 18:06:02 +0200579 if (vsub->use_count > 1)
580 vty_out(vty, "%% Subscriber %s is still in use,"
581 " should be released soon%s",
582 vlr_subscr_name(vsub), VTY_NEWLINE);
583
584 vlr_subscr_put(vsub);
Keithd32b6d12017-01-18 17:09:33 +0100585 return CMD_SUCCESS;
586}
587
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200588#define A3A8_ALG_TYPES "(none|xor|comp128v1)"
Harald Welte28326062010-05-14 20:05:17 +0200589#define A3A8_ALG_HELP \
590 "Use No A3A8 algorithm\n" \
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200591 "Use XOR algorithm\n" \
Harald Welte28326062010-05-14 20:05:17 +0200592 "Use COMP128v1 algorithm\n"
Sylvain Munaut99792902009-12-27 19:30:46 +0100593
Harald Welteb4a84e12010-05-27 10:44:58 +0200594DEFUN(ena_subscr_a3a8,
595 ena_subscr_a3a8_cmd,
596 "subscriber " SUBSCR_TYPES " ID a3a8 " A3A8_ALG_TYPES " [KI]",
Harald Welted3cf85d2010-05-27 10:48:11 +0200597 SUBSCR_HELP "Set a3a8 parameters for the subscriber\n"
598 A3A8_ALG_HELP "Encryption Key Ki\n")
Sylvain Munaut99792902009-12-27 19:30:46 +0100599{
Harald Welte2483f1b2016-06-19 18:06:02 +0200600 vty_out(vty, "%% 'subscriber a3a8' is no longer supported.%s"
601 "%% This is now up to osmo-hlr.%s",
602 VTY_NEWLINE, VTY_NEWLINE);
603 return CMD_WARNING;
Sylvain Munaut99792902009-12-27 19:30:46 +0100604}
605
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100606DEFUN(subscriber_update,
607 subscriber_update_cmd,
608 "subscriber " SUBSCR_TYPES " ID update",
609 SUBSCR_HELP "Update the subscriber data from the dabase.\n")
610{
Harald Welte2483f1b2016-06-19 18:06:02 +0200611 vty_out(vty, "%% 'subscriber update' is no longer supported.%s",
612 VTY_NEWLINE);
613 return CMD_WARNING;
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100614}
615
Harald Weltea1482332009-11-14 10:08:40 +0100616static int scall_cbfn(unsigned int subsys, unsigned int signal,
617 void *handler_data, void *signal_data)
618{
619 struct scall_signal_data *sigdata = signal_data;
620 struct vty *vty = sigdata->data;
621
622 switch (signal) {
623 case S_SCALL_SUCCESS:
Neels Hofmeyre2f24d52017-05-08 15:12:20 +0200624 vty_out(vty, "%% silent call success%s", VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100625 break;
626 case S_SCALL_EXPIRED:
627 vty_out(vty, "%% silent call expired paging%s", VTY_NEWLINE);
628 break;
629 }
630 return 0;
631}
632
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200633DEFUN(show_stats,
634 show_stats_cmd,
635 "show statistics",
636 SHOW_STR "Display network statistics\n")
637{
Harald Weltedcccb182010-05-16 20:52:23 +0200638 struct gsm_network *net = gsmnet_from_vty(vty);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200639
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200640 vty_out(vty, "Location Update : %lu attach, %lu normal, %lu periodic%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200641 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_ATTACH].current,
642 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_NORMAL].current,
643 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_PERIODIC].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200644 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200645 vty_out(vty, "IMSI Detach Indications : %lu%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200646 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_DETACH].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200647 VTY_NEWLINE);
Neels Hofmeyr36891a72016-05-09 13:18:03 +0200648 vty_out(vty, "Location Updating Results: %lu completed, %lu failed%s",
649 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_COMPLETED].current,
650 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_FAILED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200651 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200652 vty_out(vty, "SMS MO : %lu submitted, %lu no receiver%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200653 net->msc_ctrs->ctr[MSC_CTR_SMS_SUBMITTED].current,
654 net->msc_ctrs->ctr[MSC_CTR_SMS_NO_RECEIVER].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200655 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200656 vty_out(vty, "SMS MT : %lu delivered, %lu no memory, %lu other error%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200657 net->msc_ctrs->ctr[MSC_CTR_SMS_DELIVERED].current,
658 net->msc_ctrs->ctr[MSC_CTR_SMS_RP_ERR_MEM].current,
659 net->msc_ctrs->ctr[MSC_CTR_SMS_RP_ERR_OTHER].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200660 VTY_NEWLINE);
Harald Weltea29e43a2010-12-24 16:06:33 +0100661 vty_out(vty, "MO Calls : %lu setup, %lu connect ack%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200662 net->msc_ctrs->ctr[MSC_CTR_CALL_MO_SETUP].current,
663 net->msc_ctrs->ctr[MSC_CTR_CALL_MO_CONNECT_ACK].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200664 VTY_NEWLINE);
Harald Weltea29e43a2010-12-24 16:06:33 +0100665 vty_out(vty, "MT Calls : %lu setup, %lu connect%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200666 net->msc_ctrs->ctr[MSC_CTR_CALL_MT_SETUP].current,
667 net->msc_ctrs->ctr[MSC_CTR_CALL_MT_CONNECT].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200668 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200669 return CMD_SUCCESS;
670}
671
Holger Hans Peter Freyther81c0e252010-12-25 14:08:00 +0100672DEFUN(show_smsqueue,
673 show_smsqueue_cmd,
674 "show sms-queue",
675 SHOW_STR "Display SMSqueue statistics\n")
676{
677 struct gsm_network *net = gsmnet_from_vty(vty);
678
679 sms_queue_stats(net->sms_queue, vty);
680 return CMD_SUCCESS;
681}
682
Holger Hans Peter Freyther7a0e1662010-12-25 14:15:32 +0100683DEFUN(smsqueue_trigger,
684 smsqueue_trigger_cmd,
685 "sms-queue trigger",
686 "SMS Queue\n" "Trigger sending messages\n")
687{
688 struct gsm_network *net = gsmnet_from_vty(vty);
689
690 sms_queue_trigger(net->sms_queue);
691 return CMD_SUCCESS;
692}
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200693
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100694DEFUN(smsqueue_max,
695 smsqueue_max_cmd,
696 "sms-queue max-pending <1-500>",
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200697 "SMS Queue\n" "SMS to deliver in parallel\n" "Amount\n")
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100698{
699 struct gsm_network *net = gsmnet_from_vty(vty);
700
701 sms_queue_set_max_pending(net->sms_queue, atoi(argv[0]));
702 return CMD_SUCCESS;
703}
704
Holger Hans Peter Freyther4dcc5e52010-12-25 14:38:30 +0100705DEFUN(smsqueue_clear,
706 smsqueue_clear_cmd,
707 "sms-queue clear",
708 "SMS Queue\n" "Clear the queue of pending SMS\n")
709{
710 struct gsm_network *net = gsmnet_from_vty(vty);
711
712 sms_queue_clear(net->sms_queue);
713 return CMD_SUCCESS;
714}
715
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100716DEFUN(smsqueue_fail,
717 smsqueue_fail_cmd,
718 "sms-queue max-failure <1-500>",
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200719 "SMS Queue\n" "Maximum amount of delivery failures\n" "Amount\n")
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100720{
721 struct gsm_network *net = gsmnet_from_vty(vty);
722
723 sms_queue_set_max_failure(net->sms_queue, atoi(argv[0]));
724 return CMD_SUCCESS;
725}
726
Harald Welteab386e62011-09-01 18:18:43 +0200727
728DEFUN(cfg_mncc_int, cfg_mncc_int_cmd,
729 "mncc-int", "Configure internal MNCC handler")
730{
731 vty->node = MNCC_INT_NODE;
732
733 return CMD_SUCCESS;
734}
735
736static struct cmd_node mncc_int_node = {
737 MNCC_INT_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200738 "%s(config-mncc-int)# ",
Harald Welteab386e62011-09-01 18:18:43 +0200739 1,
740};
741
742static const struct value_string tchf_codec_names[] = {
743 { GSM48_CMODE_SPEECH_V1, "fr" },
744 { GSM48_CMODE_SPEECH_EFR, "efr" },
745 { GSM48_CMODE_SPEECH_AMR, "amr" },
746 { 0, NULL }
747};
748
749static const struct value_string tchh_codec_names[] = {
750 { GSM48_CMODE_SPEECH_V1, "hr" },
751 { GSM48_CMODE_SPEECH_AMR, "amr" },
752 { 0, NULL }
753};
754
755static int config_write_mncc_int(struct vty *vty)
756{
Harald Welteb4771a62012-11-11 10:58:51 +0100757 uint16_t meas_port;
758 char *meas_host;
Holger Hans Peter Freyther86573262015-01-31 09:47:37 +0100759 const char *meas_scenario;
Harald Welteb4771a62012-11-11 10:58:51 +0100760
761 meas_feed_cfg_get(&meas_host, &meas_port);
Holger Hans Peter Freyther86573262015-01-31 09:47:37 +0100762 meas_scenario = meas_feed_scenario_get();
Harald Welteb4771a62012-11-11 10:58:51 +0100763
Harald Welteab386e62011-09-01 18:18:43 +0200764 vty_out(vty, "mncc-int%s", VTY_NEWLINE);
765 vty_out(vty, " default-codec tch-f %s%s",
766 get_value_string(tchf_codec_names, mncc_int.def_codec[0]),
767 VTY_NEWLINE);
768 vty_out(vty, " default-codec tch-h %s%s",
769 get_value_string(tchh_codec_names, mncc_int.def_codec[1]),
770 VTY_NEWLINE);
Harald Welteb4771a62012-11-11 10:58:51 +0100771 if (meas_port)
772 vty_out(vty, " meas-feed destination %s %u%s",
773 meas_host, meas_port, VTY_NEWLINE);
Holger Hans Peter Freyther86573262015-01-31 09:47:37 +0100774 if (strlen(meas_scenario) > 0)
775 vty_out(vty, " meas-feed scenario %s%s",
776 meas_scenario, VTY_NEWLINE);
Harald Welteb4771a62012-11-11 10:58:51 +0100777
Harald Welteab386e62011-09-01 18:18:43 +0200778
779 return CMD_SUCCESS;
780}
781
782DEFUN(mnccint_def_codec_f,
783 mnccint_def_codec_f_cmd,
784 "default-codec tch-f (fr|efr|amr)",
785 "Set default codec\n" "Codec for TCH/F\n"
786 "Full-Rate\n" "Enhanced Full-Rate\n" "Adaptive Multi-Rate\n")
787{
788 mncc_int.def_codec[0] = get_string_value(tchf_codec_names, argv[0]);
789
790 return CMD_SUCCESS;
791}
792
793DEFUN(mnccint_def_codec_h,
794 mnccint_def_codec_h_cmd,
795 "default-codec tch-h (hr|amr)",
796 "Set default codec\n" "Codec for TCH/H\n"
797 "Half-Rate\n" "Adaptive Multi-Rate\n")
798{
799 mncc_int.def_codec[1] = get_string_value(tchh_codec_names, argv[0]);
800
801 return CMD_SUCCESS;
802}
803
Holger Hans Peter Freythera07e38d2015-01-31 09:26:20 +0100804#define MEAS_STR "Measurement export related\n"
Harald Welteb4771a62012-11-11 10:58:51 +0100805DEFUN(mnccint_meas_feed, mnccint_meas_feed_cmd,
806 "meas-feed destination ADDR <0-65535>",
Holger Hans Peter Freythera07e38d2015-01-31 09:26:20 +0100807 MEAS_STR "destination\n" "address or hostname\n" "port number\n")
Harald Welteb4771a62012-11-11 10:58:51 +0100808{
809 int rc;
810
811 rc = meas_feed_cfg_set(argv[0], atoi(argv[1]));
812 if (rc < 0)
813 return CMD_WARNING;
814
815 return CMD_SUCCESS;
816}
817
818DEFUN(meas_feed_scenario, meas_feed_scenario_cmd,
819 "meas-feed scenario NAME",
Holger Hans Peter Freythera07e38d2015-01-31 09:26:20 +0100820 MEAS_STR "scenario\n" "Name up to 31 characters included in report\n")
Harald Welteb4771a62012-11-11 10:58:51 +0100821{
822 meas_feed_scenario_set(argv[0]);
823
824 return CMD_SUCCESS;
825}
826
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100827
828DEFUN(logging_fltr_imsi,
829 logging_fltr_imsi_cmd,
830 "logging filter imsi IMSI",
831 LOGGING_STR FILTER_STR
832 "Filter log messages by IMSI\n" "IMSI to be used as filter\n")
833{
Harald Welte2483f1b2016-06-19 18:06:02 +0200834 struct vlr_subscr *vlr_subscr;
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100835 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
836 struct log_target *tgt = osmo_log_vty2tgt(vty);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100837 const char *imsi = argv[0];
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100838
839 if (!tgt)
840 return CMD_WARNING;
841
Harald Welte2483f1b2016-06-19 18:06:02 +0200842 vlr_subscr = vlr_subscr_find_by_imsi(gsmnet->vlr, imsi);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100843
Neels Hofmeyr84da6b12016-05-20 21:59:55 +0200844 if (!vlr_subscr) {
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100845 vty_out(vty, "%%no subscriber with IMSI(%s)%s",
846 argv[0], VTY_NEWLINE);
847 return CMD_WARNING;
848 }
849
Harald Welte2483f1b2016-06-19 18:06:02 +0200850 log_set_filter_vlr_subscr(tgt, vlr_subscr);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100851 return CMD_SUCCESS;
852}
Holger Hans Peter Freyther925c57f2015-01-27 10:58:29 +0100853
Harald Welte2483f1b2016-06-19 18:06:02 +0200854static struct cmd_node hlr_node = {
855 HLR_NODE,
856 "%s(config-hlr)# ",
857 1,
858};
859
860DEFUN(cfg_hlr, cfg_hlr_cmd,
861 "hlr", "Configure connection to the HLR")
862{
863 vty->node = HLR_NODE;
864 return CMD_SUCCESS;
865}
866
867DEFUN(cfg_hlr_remote_ip, cfg_hlr_remote_ip_cmd, "remote-ip A.B.C.D",
868 "Remote GSUP address of the HLR\n"
869 "Remote GSUP address (default: " MSC_HLR_REMOTE_IP_DEFAULT ")")
870{
871 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
872 talloc_free((void*)gsmnet->gsup_server_addr_str);
873 gsmnet->gsup_server_addr_str = talloc_strdup(gsmnet, argv[0]);
874 return CMD_SUCCESS;
875}
876
877DEFUN(cfg_hlr_remote_port, cfg_hlr_remote_port_cmd, "remote-port <1-65535>",
878 "Remote GSUP port of the HLR\n"
879 "Remote GSUP port (default: " OSMO_STRINGIFY(MSC_HLR_REMOTE_PORT_DEFAULT) ")")
880{
881 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
882 gsmnet->gsup_server_port = atoi(argv[0]);
883 return CMD_SUCCESS;
884}
885
886static int config_write_hlr(struct vty *vty)
887{
888 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
889
890 vty_out(vty, "hlr%s", VTY_NEWLINE);
891 vty_out(vty, " remote-ip %s%s",
892 gsmnet->gsup_server_addr_str, VTY_NEWLINE);
893 vty_out(vty, " remote-port %u%s",
894 gsmnet->gsup_server_port, VTY_NEWLINE);
895 return CMD_SUCCESS;
896}
897
Harald Weltedcccb182010-05-16 20:52:23 +0200898int bsc_vty_init_extra(void)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200899{
Pablo Neira Ayusobbc5b992011-05-06 12:12:31 +0200900 osmo_signal_register_handler(SS_SCALL, scall_cbfn, NULL);
Harald Weltea1482332009-11-14 10:08:40 +0100901
Harald Welteb4d5b172010-05-12 16:10:35 +0000902 install_element_ve(&show_subscr_cmd);
903 install_element_ve(&show_subscr_cache_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200904
Harald Welteb4d5b172010-05-12 16:10:35 +0000905 install_element_ve(&sms_send_pend_cmd);
Harald Welte98f9c752009-11-14 08:00:53 +0100906
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200907 install_element_ve(&subscriber_create_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +0000908 install_element_ve(&subscriber_send_sms_cmd);
909 install_element_ve(&subscriber_silent_sms_cmd);
910 install_element_ve(&subscriber_silent_call_start_cmd);
911 install_element_ve(&subscriber_silent_call_stop_cmd);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800912 install_element_ve(&subscriber_ussd_notify_cmd);
Harald Welte94307772017-06-12 01:52:27 +0200913 install_element_ve(&subscriber_mstest_close_cmd);
914 install_element_ve(&subscriber_mstest_open_cmd);
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100915 install_element_ve(&subscriber_update_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +0000916 install_element_ve(&show_stats_cmd);
Holger Hans Peter Freyther81c0e252010-12-25 14:08:00 +0100917 install_element_ve(&show_smsqueue_cmd);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100918 install_element_ve(&logging_fltr_imsi_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200919
Keithd32b6d12017-01-18 17:09:33 +0100920 install_element(ENABLE_NODE, &ena_subscr_expire_cmd);
Harald Welteb4a84e12010-05-27 10:44:58 +0200921 install_element(ENABLE_NODE, &ena_subscr_a3a8_cmd);
Holger Hans Peter Freyther7a0e1662010-12-25 14:15:32 +0100922 install_element(ENABLE_NODE, &smsqueue_trigger_cmd);
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100923 install_element(ENABLE_NODE, &smsqueue_max_cmd);
Holger Hans Peter Freyther4dcc5e52010-12-25 14:38:30 +0100924 install_element(ENABLE_NODE, &smsqueue_clear_cmd);
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100925 install_element(ENABLE_NODE, &smsqueue_fail_cmd);
Nico Goldeb62b1232011-02-22 17:54:47 +0100926 install_element(ENABLE_NODE, &subscriber_send_pending_sms_cmd);
Harald Welteb4771a62012-11-11 10:58:51 +0100927 install_element(ENABLE_NODE, &meas_feed_scenario_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200928
Harald Welteab386e62011-09-01 18:18:43 +0200929 install_element(CONFIG_NODE, &cfg_mncc_int_cmd);
930 install_node(&mncc_int_node, config_write_mncc_int);
Harald Welteab386e62011-09-01 18:18:43 +0200931 install_element(MNCC_INT_NODE, &mnccint_def_codec_f_cmd);
932 install_element(MNCC_INT_NODE, &mnccint_def_codec_h_cmd);
Harald Welteb4771a62012-11-11 10:58:51 +0100933 install_element(MNCC_INT_NODE, &mnccint_meas_feed_cmd);
Holger Hans Peter Freyther86573262015-01-31 09:47:37 +0100934 install_element(MNCC_INT_NODE, &meas_feed_scenario_cmd);
Harald Welteab386e62011-09-01 18:18:43 +0200935
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100936 install_element(CFG_LOG_NODE, &logging_fltr_imsi_cmd);
Harald Welteb02fc1e2013-02-12 11:15:49 +0100937
Harald Welte2483f1b2016-06-19 18:06:02 +0200938 install_element(CONFIG_NODE, &cfg_hlr_cmd);
939 install_node(&hlr_node, config_write_hlr);
940 install_element(HLR_NODE, &cfg_hlr_remote_ip_cmd);
941 install_element(HLR_NODE, &cfg_hlr_remote_port_cmd);
Holger Hans Peter Freyther925c57f2015-01-27 10:58:29 +0100942
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200943 return 0;
944}