blob: 6ed2ade8d15b0f2a4b71a25cf5dff4c009d815f8 [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>
Harald Welte66a301e2018-01-24 16:48:17 +010051#include <osmocom/msc/transaction.h>
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020052
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +010053#include <osmocom/vty/logging.h>
54
Neels Hofmeyr90843962017-09-04 15:04:35 +020055#include <osmocom/msc/osmo_msc.h>
Harald Welte2483f1b2016-06-19 18:06:02 +020056
Harald Weltedcccb182010-05-16 20:52:23 +020057extern struct gsm_network *gsmnet_from_vty(struct vty *v);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +020058
Harald Welte66a301e2018-01-24 16:48:17 +010059static void vty_conn_hdr(struct vty *vty)
60{
Harald Welte9199f8b2018-02-14 00:13:47 +010061 vty_out(vty, "--ConnId ------------Subscriber RAN --LAC Use --Tokens C A5 State%s",
Harald Welte66a301e2018-01-24 16:48:17 +010062 VTY_NEWLINE);
63}
64
65static void vty_dump_one_conn(struct vty *vty, const struct gsm_subscriber_connection *conn)
66{
Harald Welte9199f8b2018-02-14 00:13:47 +010067 vty_out(vty, "%08x %22s %3s %5u %3u %08x %c /%1u %27s %s",
Harald Welte66a301e2018-01-24 16:48:17 +010068 conn->a.conn_id,
69 conn->vsub ? vlr_subscr_name(conn->vsub) : "-",
70 conn->via_ran == RAN_UTRAN_IU ? "Iu" : "A",
71 conn->lac,
72 conn->use_count,
73 conn->use_tokens,
74 conn->received_cm_service_request ? 'C' : '-',
Harald Welte66a301e2018-01-24 16:48:17 +010075 conn->encr.alg_id,
76 conn->conn_fsm ? osmo_fsm_inst_state_name(conn->conn_fsm) : "-",
77 VTY_NEWLINE);
78}
79
80DEFUN(show_msc_conn, show_msc_conn_cmd,
81 "show connection", SHOW_STR "Subscriber Connections\n")
82{
83 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
84 struct gsm_subscriber_connection *conn;
85
86 vty_conn_hdr(vty);
87 llist_for_each_entry(conn, &gsmnet->subscr_conns, entry)
88 vty_dump_one_conn(vty, conn);
89
90 return CMD_SUCCESS;
91}
92
93static void vty_trans_hdr(struct vty *vty)
94{
95 vty_out(vty, "------------Subscriber --ConnId -P TI -CallRef Proto%s",
96 VTY_NEWLINE);
97}
98
99static const char *get_trans_proto_str(const struct gsm_trans *trans)
100{
101 static char buf[256];
102
103 switch (trans->protocol) {
104 case GSM48_PDISC_CC:
105 snprintf(buf, sizeof(buf), "%s %4u %4u",
106 gsm48_cc_state_name(trans->cc.state),
107 trans->cc.Tcurrent,
108 trans->cc.T308_second);
109 break;
110 case GSM48_PDISC_SMS:
111 snprintf(buf, sizeof(buf), "%s %s",
112 gsm411_cp_state_name(trans->sms.smc_inst.cp_state),
113 gsm411_rp_state_name(trans->sms.smr_inst.rp_state));
114 break;
115 default:
116 buf[0] = '\0';
117 break;
118 }
119
120 return buf;
121}
122
123static void vty_dump_one_trans(struct vty *vty, const struct gsm_trans *trans)
124{
125 vty_out(vty, "%22s %08x %s %02u %08x %s%s",
126 trans->vsub ? vlr_subscr_name(trans->vsub) : "-",
127 trans->conn ? trans->conn->a.conn_id : 0,
128 gsm48_pdisc_name(trans->protocol),
129 trans->transaction_id,
130 trans->callref,
131 get_trans_proto_str(trans), VTY_NEWLINE);
132}
133
134DEFUN(show_msc_transaction, show_msc_transaction_cmd,
135 "show transaction", SHOW_STR "Transactions\n")
136{
137 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
138 struct gsm_trans *trans;
139
140 vty_trans_hdr(vty);
141 llist_for_each_entry(trans, &gsmnet->trans_list, entry)
142 vty_dump_one_trans(vty, trans);
143
144 return CMD_SUCCESS;
145}
146
147
148
Harald Welte2483f1b2016-06-19 18:06:02 +0200149static void subscr_dump_full_vty(struct vty *vty, struct vlr_subscr *vsub)
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100150{
Harald Welte66a301e2018-01-24 16:48:17 +0100151 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
152 struct gsm_trans *trans;
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200153 int reqs;
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200154 struct llist_head *entry;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100155
Harald Welte2483f1b2016-06-19 18:06:02 +0200156 if (strlen(vsub->name))
157 vty_out(vty, " Name: '%s'%s", vsub->name, VTY_NEWLINE);
158 if (strlen(vsub->msisdn))
159 vty_out(vty, " Extension: %s%s", vsub->msisdn,
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100160 VTY_NEWLINE);
Holger Hans Peter Freyther3d76e442010-12-25 16:40:54 +0100161 vty_out(vty, " LAC: %d/0x%x%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200162 vsub->lac, vsub->lac, VTY_NEWLINE);
163 vty_out(vty, " IMSI: %s%s", vsub->imsi, VTY_NEWLINE);
164 if (vsub->tmsi != GSM_RESERVED_TMSI)
165 vty_out(vty, " TMSI: %08X%s", vsub->tmsi,
166 VTY_NEWLINE);
167 if (vsub->tmsi_new != GSM_RESERVED_TMSI)
168 vty_out(vty, " new TMSI: %08X%s", vsub->tmsi_new,
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100169 VTY_NEWLINE);
170
Harald Welte2483f1b2016-06-19 18:06:02 +0200171#if 0
172 /* TODO: add this to vlr_subscr? */
173 if (vsub->auth_info.auth_algo != AUTH_ALGO_NONE) {
174 struct gsm_auth_info *i = &vsub->auth_info;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100175 vty_out(vty, " A3A8 algorithm id: %d%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200176 i->auth_algo, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100177 vty_out(vty, " A3A8 Ki: %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200178 osmo_hexdump(i->a3a8_ki, i->a3a8_ki_len),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100179 VTY_NEWLINE);
180 }
Harald Welte2483f1b2016-06-19 18:06:02 +0200181#endif
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100182
Harald Welte2483f1b2016-06-19 18:06:02 +0200183 if (vsub->last_tuple) {
184 struct gsm_auth_tuple *t = vsub->last_tuple;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100185 vty_out(vty, " A3A8 last tuple (used %d times):%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200186 t->use_count, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100187 vty_out(vty, " seq # : %d%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200188 t->key_seq, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100189 vty_out(vty, " RAND : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200190 osmo_hexdump(t->vec.rand, sizeof(t->vec.rand)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100191 VTY_NEWLINE);
192 vty_out(vty, " SRES : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200193 osmo_hexdump(t->vec.sres, sizeof(t->vec.sres)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100194 VTY_NEWLINE);
195 vty_out(vty, " Kc : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200196 osmo_hexdump(t->vec.kc, sizeof(t->vec.kc)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100197 VTY_NEWLINE);
198 }
Holger Hans Peter Freytherb9708942013-07-27 19:42:35 +0200199
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200200 reqs = 0;
Harald Welte2483f1b2016-06-19 18:06:02 +0200201 llist_for_each(entry, &vsub->cs.requests)
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200202 reqs += 1;
Harald Welte2483f1b2016-06-19 18:06:02 +0200203 vty_out(vty, " Paging: %s paging for %d requests%s",
204 vsub->cs.is_paging ? "is" : "not", reqs, VTY_NEWLINE);
205 vty_out(vty, " Use count: %u%s", vsub->use_count, VTY_NEWLINE);
Harald Welte66a301e2018-01-24 16:48:17 +0100206
207 /* Connection */
208 if (vsub->msc_conn_ref) {
209 struct gsm_subscriber_connection *conn = vsub->msc_conn_ref;
210 vty_conn_hdr(vty);
211 vty_dump_one_conn(vty, conn);
212 }
213
214 /* Transactions */
215 vty_trans_hdr(vty);
216 llist_for_each_entry(trans, &gsmnet->trans_list, entry) {
217 if (trans->vsub != vsub)
218 continue;
219 vty_dump_one_trans(vty, trans);
220 }
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100221}
222
223
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200224/* Subscriber */
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200225DEFUN(show_subscr_cache,
226 show_subscr_cache_cmd,
227 "show subscriber cache",
Harald Weltecfaabbb2012-08-16 23:23:50 +0200228 SHOW_STR "Show information about subscribers\n"
229 "Display contents of subscriber cache\n")
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200230{
Harald Welte2483f1b2016-06-19 18:06:02 +0200231 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
232 struct vlr_subscr *vsub;
233 int count = 0;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200234
Harald Welte2483f1b2016-06-19 18:06:02 +0200235 llist_for_each_entry(vsub, &gsmnet->vlr->subscribers, list) {
236 if (++count > 100) {
237 vty_out(vty, "%% More than %d subscribers in cache,"
238 " stopping here.%s", count-1, VTY_NEWLINE);
239 break;
240 }
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200241 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200242 subscr_dump_full_vty(vty, vsub);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200243 }
244
245 return CMD_SUCCESS;
246}
247
248DEFUN(sms_send_pend,
249 sms_send_pend_cmd,
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100250 "sms send pending",
Neels Hofmeyrd1fdefe2016-04-01 02:17:24 +0200251 "SMS related commands\n" "SMS Sending related commands\n"
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100252 "Send all pending SMS")
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200253{
Harald Weltedcccb182010-05-16 20:52:23 +0200254 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200255 struct gsm_sms *sms;
Harald Welte2483f1b2016-06-19 18:06:02 +0200256 unsigned long long sms_id = 0;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200257
258 while (1) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200259 sms = db_sms_get_next_unsent(gsmnet, sms_id, UINT_MAX);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200260 if (!sms)
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100261 break;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200262
Harald Welte2483f1b2016-06-19 18:06:02 +0200263 if (sms->receiver)
264 gsm411_send_sms_subscr(sms->receiver, sms);
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100265
Harald Welte2483f1b2016-06-19 18:06:02 +0200266 sms_id = sms->id + 1;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200267 }
268
269 return CMD_SUCCESS;
270}
271
Stefan Sperling87cba1f2018-01-22 17:05:37 +0100272
273DEFUN(sms_delete_expired,
274 sms_delete_expired_cmd,
275 "sms delete expired",
276 "SMS related commands\n" "SMS Database related commands\n"
277 "Delete all expired SMS")
278{
279 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
280 struct gsm_sms *sms;
281 unsigned long long sms_id = 0;
282 long long num_deleted = 0;
283
284 while (1) {
285 sms = db_sms_get_next_unsent(gsmnet, sms_id, UINT_MAX);
286 if (!sms)
287 break;
288
289 /* Skip SMS which are currently queued for sending. */
290 if (sms_queue_sms_is_pending(gsmnet->sms_queue, sms->id))
291 continue;
292
293 /* Expiration check is performed by the DB layer. */
294 if (db_sms_delete_expired_message_by_id(sms->id) == 0)
295 num_deleted++;
296
297 sms_id = sms->id + 1;
298 }
299
300 if (num_deleted == 0) {
301 vty_out(vty, "No expired SMS in database%s", VTY_NEWLINE);
302 return CMD_WARNING;
303 }
304
305 vty_out(vty, "Deleted %llu expired SMS from database%s", num_deleted, VTY_NEWLINE);
306 return CMD_SUCCESS;
307}
308
309
Harald Welte2483f1b2016-06-19 18:06:02 +0200310static int _send_sms_str(struct vlr_subscr *receiver,
311 struct vlr_subscr *sender,
312 char *str, uint8_t tp_pid)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200313{
Harald Welte2483f1b2016-06-19 18:06:02 +0200314 struct gsm_network *net = receiver->vlr->user_ctx;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200315 struct gsm_sms *sms;
316
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100317 sms = sms_from_text(receiver, sender, 0, str);
Harald Welte793a1352009-11-05 15:51:17 +0900318 sms->protocol_id = tp_pid;
Nico Golde59502362010-06-29 20:13:06 +0200319
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100320 /* store in database for the queue */
321 if (db_sms_store(sms) != 0) {
Holger Hans Peter Freythereff409492012-11-10 19:46:58 +0100322 LOGP(DLSMS, LOGL_ERROR, "Failed to store SMS in Database\n");
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100323 sms_free(sms);
324 return CMD_WARNING;
Nico Golde59502362010-06-29 20:13:06 +0200325 }
Neels Hofmeyr1e918c32016-05-09 21:48:53 +0200326 LOGP(DLSMS, LOGL_DEBUG, "SMS stored in DB\n");
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200327
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100328 sms_free(sms);
Harald Welte2483f1b2016-06-19 18:06:02 +0200329 sms_queue_trigger(net->sms_queue);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200330 return CMD_SUCCESS;
331}
332
Harald Welte2483f1b2016-06-19 18:06:02 +0200333static struct vlr_subscr *get_vsub_by_argv(struct gsm_network *gsmnet,
334 const char *type,
335 const char *id)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200336{
Harald Welte2483f1b2016-06-19 18:06:02 +0200337 if (!strcmp(type, "extension") || !strcmp(type, "msisdn"))
338 return vlr_subscr_find_by_msisdn(gsmnet->vlr, id);
339 else if (!strcmp(type, "imsi") || !strcmp(type, "id"))
340 return vlr_subscr_find_by_imsi(gsmnet->vlr, id);
Harald Welte98f9c752009-11-14 08:00:53 +0100341 else if (!strcmp(type, "tmsi"))
Harald Welte2483f1b2016-06-19 18:06:02 +0200342 return vlr_subscr_find_by_tmsi(gsmnet->vlr, atoi(id));
Harald Welte98f9c752009-11-14 08:00:53 +0100343
344 return NULL;
345}
346#define SUBSCR_TYPES "(extension|imsi|tmsi|id)"
Harald Welte28326062010-05-14 20:05:17 +0200347#define SUBSCR_HELP "Operations on a Subscriber\n" \
Neels Hofmeyrd1fdefe2016-04-01 02:17:24 +0200348 "Identify subscriber by extension (phone number)\n" \
349 "Identify subscriber by IMSI\n" \
350 "Identify subscriber by TMSI\n" \
351 "Identify subscriber by database ID\n" \
Harald Welte28326062010-05-14 20:05:17 +0200352 "Identifier for the subscriber\n"
Harald Welte98f9c752009-11-14 08:00:53 +0100353
Harald Welteb4a84e12010-05-27 10:44:58 +0200354DEFUN(show_subscr,
355 show_subscr_cmd,
356 "show subscriber " SUBSCR_TYPES " ID",
357 SHOW_STR SUBSCR_HELP)
358{
359 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200360 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],
361 argv[1]);
Harald Welteb4a84e12010-05-27 10:44:58 +0200362
Harald Welte2483f1b2016-06-19 18:06:02 +0200363 if (!vsub) {
Harald Welteb4a84e12010-05-27 10:44:58 +0200364 vty_out(vty, "%% No subscriber found for %s %s%s",
365 argv[0], argv[1], VTY_NEWLINE);
366 return CMD_WARNING;
367 }
368
Harald Welte2483f1b2016-06-19 18:06:02 +0200369 subscr_dump_full_vty(vty, vsub);
Harald Welteb4a84e12010-05-27 10:44:58 +0200370
Harald Welte2483f1b2016-06-19 18:06:02 +0200371 vlr_subscr_put(vsub);
Harald Welteb4a84e12010-05-27 10:44:58 +0200372
373 return CMD_SUCCESS;
374}
375
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200376DEFUN(subscriber_create,
377 subscriber_create_cmd,
378 "subscriber create imsi ID",
379 "Operations on a Subscriber\n" \
380 "Create new subscriber\n" \
381 "Identify the subscriber by his IMSI\n" \
382 "Identifier for the subscriber\n")
383{
Harald Welte2483f1b2016-06-19 18:06:02 +0200384 vty_out(vty, "%% 'subscriber create' now needs to be done at osmo-hlr%s",
385 VTY_NEWLINE);
386 return CMD_WARNING;
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200387}
388
Nico Goldeb62b1232011-02-22 17:54:47 +0100389DEFUN(subscriber_send_pending_sms,
390 subscriber_send_pending_sms_cmd,
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200391 "subscriber " SUBSCR_TYPES " ID sms pending-send",
Nico Goldeb62b1232011-02-22 17:54:47 +0100392 SUBSCR_HELP "SMS Operations\n" "Send pending SMS\n")
393{
394 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200395 struct vlr_subscr *vsub;
Nico Goldeb62b1232011-02-22 17:54:47 +0100396 struct gsm_sms *sms;
397
Harald Welte2483f1b2016-06-19 18:06:02 +0200398 vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
399 if (!vsub) {
Holger Hans Peter Freyther9feef482013-07-04 20:34:46 +0200400 vty_out(vty, "%% No subscriber found for %s %s%s",
401 argv[0], argv[1], VTY_NEWLINE);
402 return CMD_WARNING;
403 }
404
Harald Welte2483f1b2016-06-19 18:06:02 +0200405 sms = db_sms_get_unsent_for_subscr(vsub, UINT_MAX);
Nico Goldeb62b1232011-02-22 17:54:47 +0100406 if (sms)
407 gsm411_send_sms_subscr(sms->receiver, sms);
408
Harald Welte2483f1b2016-06-19 18:06:02 +0200409 vlr_subscr_put(vsub);
Nico Goldeb62b1232011-02-22 17:54:47 +0100410
411 return CMD_SUCCESS;
412}
413
Harald Welte98f9c752009-11-14 08:00:53 +0100414DEFUN(subscriber_send_sms,
415 subscriber_send_sms_cmd,
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100416 "subscriber " SUBSCR_TYPES " ID sms sender " SUBSCR_TYPES " SENDER_ID send .LINE",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100417 SUBSCR_HELP "SMS Operations\n" SUBSCR_HELP "Send SMS\n" "Actual SMS Text\n")
Harald Welte98f9c752009-11-14 08:00:53 +0100418{
Harald Weltedcccb182010-05-16 20:52:23 +0200419 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200420 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
421 struct vlr_subscr *sender = get_vsub_by_argv(gsmnet, argv[2], argv[3]);
Harald Welte20474ad2010-05-16 19:28:32 +0200422 char *str;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200423 int rc;
424
Harald Welte2483f1b2016-06-19 18:06:02 +0200425 if (!vsub) {
Harald Welte20f98312009-11-14 10:11:45 +0100426 vty_out(vty, "%% No subscriber found for %s %s%s",
427 argv[0], argv[1], VTY_NEWLINE);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100428 rc = CMD_WARNING;
429 goto err;
Harald Welte20f98312009-11-14 10:11:45 +0100430 }
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100431
432 if (!sender) {
433 vty_out(vty, "%% No sender found for %s %s%s",
434 argv[2], argv[3], VTY_NEWLINE);
435 rc = CMD_WARNING;
436 goto err;
437 }
438
439 str = argv_concat(argv, argc, 4);
Harald Welte2483f1b2016-06-19 18:06:02 +0200440 rc = _send_sms_str(vsub, sender, str, 0);
Harald Welte20474ad2010-05-16 19:28:32 +0200441 talloc_free(str);
Harald Welte793a1352009-11-05 15:51:17 +0900442
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100443err:
444 if (sender)
Harald Welte2483f1b2016-06-19 18:06:02 +0200445 vlr_subscr_put(sender);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100446
Harald Welte2483f1b2016-06-19 18:06:02 +0200447 if (vsub)
448 vlr_subscr_put(vsub);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100449
Harald Welte793a1352009-11-05 15:51:17 +0900450 return rc;
451}
452
Harald Welte98f9c752009-11-14 08:00:53 +0100453DEFUN(subscriber_silent_sms,
454 subscriber_silent_sms_cmd,
Harald Welte1011d5b2014-07-10 20:19:00 +0200455
456 "subscriber " SUBSCR_TYPES " ID silent-sms sender " SUBSCR_TYPES " SENDER_ID send .LINE",
457 SUBSCR_HELP "Silent SMS Operations\n" SUBSCR_HELP "Send SMS\n" "Actual SMS Text\n")
Harald Welte793a1352009-11-05 15:51:17 +0900458{
Harald Weltedcccb182010-05-16 20:52:23 +0200459 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200460 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
461 struct vlr_subscr *sender = get_vsub_by_argv(gsmnet, argv[2], argv[3]);
Harald Welte20474ad2010-05-16 19:28:32 +0200462 char *str;
Harald Welte793a1352009-11-05 15:51:17 +0900463 int rc;
464
Harald Welte2483f1b2016-06-19 18:06:02 +0200465 if (!vsub) {
Harald Welte20f98312009-11-14 10:11:45 +0100466 vty_out(vty, "%% No subscriber found for %s %s%s",
467 argv[0], argv[1], VTY_NEWLINE);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100468 rc = CMD_WARNING;
469 goto err;
Harald Welte20f98312009-11-14 10:11:45 +0100470 }
Harald Welte793a1352009-11-05 15:51:17 +0900471
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100472 if (!sender) {
473 vty_out(vty, "%% No sender found for %s %s%s",
474 argv[2], argv[3], VTY_NEWLINE);
475 rc = CMD_WARNING;
476 goto err;
477 }
478
479 str = argv_concat(argv, argc, 4);
Harald Welte2483f1b2016-06-19 18:06:02 +0200480 rc = _send_sms_str(vsub, sender, str, 64);
Harald Welte20474ad2010-05-16 19:28:32 +0200481 talloc_free(str);
Harald Welte793a1352009-11-05 15:51:17 +0900482
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100483err:
484 if (sender)
Harald Welte2483f1b2016-06-19 18:06:02 +0200485 vlr_subscr_put(sender);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100486
Harald Welte2483f1b2016-06-19 18:06:02 +0200487 if (vsub)
488 vlr_subscr_put(vsub);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100489
Harald Welte793a1352009-11-05 15:51:17 +0900490 return rc;
491}
492
Harald Welte28326062010-05-14 20:05:17 +0200493#define CHAN_TYPES "(any|tch/f|tch/any|sdcch)"
494#define CHAN_TYPE_HELP \
495 "Any channel\n" \
496 "TCH/F channel\n" \
497 "Any TCH channel\n" \
498 "SDCCH channel\n"
499
Sylvain Munaut50480702010-01-02 14:29:43 +0100500DEFUN(subscriber_silent_call_start,
501 subscriber_silent_call_start_cmd,
Harald Welteb4a84e12010-05-27 10:44:58 +0200502 "subscriber " SUBSCR_TYPES " ID silent-call start (any|tch/f|tch/any|sdcch)",
Harald Welte28326062010-05-14 20:05:17 +0200503 SUBSCR_HELP "Silent call operation\n" "Start silent call\n"
504 CHAN_TYPE_HELP)
Sylvain Munaut50480702010-01-02 14:29:43 +0100505{
Harald Weltedcccb182010-05-16 20:52:23 +0200506 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200507 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Sylvain Munaut50480702010-01-02 14:29:43 +0100508 int rc, type;
509
Harald Welte2483f1b2016-06-19 18:06:02 +0200510 if (!vsub) {
Sylvain Munaut50480702010-01-02 14:29:43 +0100511 vty_out(vty, "%% No subscriber found for %s %s%s",
512 argv[0], argv[1], VTY_NEWLINE);
513 return CMD_WARNING;
514 }
515
516 if (!strcmp(argv[2], "tch/f"))
517 type = RSL_CHANNEED_TCH_F;
518 else if (!strcmp(argv[2], "tch/any"))
519 type = RSL_CHANNEED_TCH_ForH;
520 else if (!strcmp(argv[2], "sdcch"))
521 type = RSL_CHANNEED_SDCCH;
522 else
523 type = RSL_CHANNEED_ANY; /* Defaults to ANY */
524
Harald Welte2483f1b2016-06-19 18:06:02 +0200525 rc = gsm_silent_call_start(vsub, vty, type);
Sylvain Munaut50480702010-01-02 14:29:43 +0100526 if (rc <= 0) {
527 vty_out(vty, "%% Subscriber not attached%s",
528 VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200529 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100530 return CMD_WARNING;
531 }
532
Harald Welte2483f1b2016-06-19 18:06:02 +0200533 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100534
535 return CMD_SUCCESS;
536}
537
538DEFUN(subscriber_silent_call_stop,
539 subscriber_silent_call_stop_cmd,
Harald Welteb4a84e12010-05-27 10:44:58 +0200540 "subscriber " SUBSCR_TYPES " ID silent-call stop",
Harald Welte28326062010-05-14 20:05:17 +0200541 SUBSCR_HELP "Silent call operation\n" "Stop silent call\n"
542 CHAN_TYPE_HELP)
Harald Weltea1482332009-11-14 10:08:40 +0100543{
Harald Weltedcccb182010-05-16 20:52:23 +0200544 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200545 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Harald Weltea1482332009-11-14 10:08:40 +0100546 int rc;
547
Harald Welte2483f1b2016-06-19 18:06:02 +0200548 if (!vsub) {
Harald Weltea1482332009-11-14 10:08:40 +0100549 vty_out(vty, "%% No subscriber found for %s %s%s",
Harald Welte20f98312009-11-14 10:11:45 +0100550 argv[0], argv[1], VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100551 return CMD_WARNING;
552 }
553
Harald Welte2483f1b2016-06-19 18:06:02 +0200554 rc = gsm_silent_call_stop(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100555 if (rc < 0) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200556 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100557 return CMD_WARNING;
Harald Weltea1482332009-11-14 10:08:40 +0100558 }
559
Harald Welte2483f1b2016-06-19 18:06:02 +0200560 vlr_subscr_put(vsub);
Harald Weltea1482332009-11-14 10:08:40 +0100561
562 return CMD_SUCCESS;
563}
564
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800565DEFUN(subscriber_ussd_notify,
566 subscriber_ussd_notify_cmd,
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800567 "subscriber " SUBSCR_TYPES " ID ussd-notify (0|1|2) .TEXT",
Harald Weltecfaabbb2012-08-16 23:23:50 +0200568 SUBSCR_HELP "Send a USSD notify to the subscriber\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +0200569 "Alerting Level 0\n"
570 "Alerting Level 1\n"
571 "Alerting Level 2\n"
572 "Text of USSD message to send\n")
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800573{
574 char *text;
575 struct gsm_subscriber_connection *conn;
576 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200577 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800578 int level;
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800579
Harald Welte2483f1b2016-06-19 18:06:02 +0200580 if (!vsub) {
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800581 vty_out(vty, "%% No subscriber found for %s %s%s",
582 argv[0], argv[1], VTY_NEWLINE);
583 return CMD_WARNING;
584 }
585
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800586 level = atoi(argv[2]);
587 text = argv_concat(argv, argc, 3);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800588 if (!text) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200589 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800590 return CMD_WARNING;
591 }
592
Harald Welte2483f1b2016-06-19 18:06:02 +0200593 conn = connection_for_subscr(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800594 if (!conn) {
595 vty_out(vty, "%% An active connection is required for %s %s%s",
596 argv[0], argv[1], VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200597 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800598 talloc_free(text);
599 return CMD_WARNING;
600 }
601
Neels Hofmeyr43273c62016-05-10 12:50:31 +0200602 msc_send_ussd_notify(conn, level, text);
603 msc_send_ussd_release_complete(conn);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800604
Harald Welte2483f1b2016-06-19 18:06:02 +0200605 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800606 talloc_free(text);
607 return CMD_SUCCESS;
608}
609
Harald Welte94307772017-06-12 01:52:27 +0200610static int loop_by_char(uint8_t ch)
611{
612 switch (ch) {
613 case 'a':
614 return GSM414_LOOP_A;
615 case 'b':
616 return GSM414_LOOP_B;
617 case 'c':
618 return GSM414_LOOP_C;
619 case 'd':
620 return GSM414_LOOP_D;
621 case 'e':
622 return GSM414_LOOP_E;
623 case 'f':
624 return GSM414_LOOP_F;
625 case 'i':
626 return GSM414_LOOP_I;
627 }
628 return -1;
629}
630
631DEFUN(subscriber_mstest_close,
632 subscriber_mstest_close_cmd,
633 "subscriber " SUBSCR_TYPES " ID ms-test close-loop (a|b|c|d|e|f|i)",
634 SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
635 "Close a TCH Loop inside the MS\n"
636 "Loop Type A\n"
637 "Loop Type B\n"
638 "Loop Type C\n"
639 "Loop Type D\n"
640 "Loop Type E\n"
641 "Loop Type F\n"
642 "Loop Type I\n")
643{
644 struct gsm_subscriber_connection *conn;
645 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
646 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
647 const char *loop_str;
648 int loop_mode;
649
650 if (!vsub) {
651 vty_out(vty, "%% No subscriber found for %s %s%s",
652 argv[0], argv[1], VTY_NEWLINE);
653 return CMD_WARNING;
654 }
655
656 loop_str = argv[2];
657 loop_mode = loop_by_char(loop_str[0]);
658
659 conn = connection_for_subscr(vsub);
660 if (!conn) {
661 vty_out(vty, "%% An active connection is required for %s %s%s",
662 argv[0], argv[1], VTY_NEWLINE);
663 vlr_subscr_put(vsub);
664 return CMD_WARNING;
665 }
666
667 gsm0414_tx_close_tch_loop_cmd(conn, loop_mode);
668
669 return CMD_SUCCESS;
670}
671
672DEFUN(subscriber_mstest_open,
673 subscriber_mstest_open_cmd,
674 "subscriber " SUBSCR_TYPES " ID ms-test open-loop",
675 SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
676 "Open a TCH Loop inside the MS\n")
677{
678 struct gsm_subscriber_connection *conn;
679 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
680 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
681
682 if (!vsub) {
683 vty_out(vty, "%% No subscriber found for %s %s%s",
684 argv[0], argv[1], VTY_NEWLINE);
685 return CMD_WARNING;
686 }
687
688 conn = connection_for_subscr(vsub);
689 if (!conn) {
690 vty_out(vty, "%% An active connection is required for %s %s%s",
691 argv[0], argv[1], VTY_NEWLINE);
692 vlr_subscr_put(vsub);
693 return CMD_WARNING;
694 }
695
696 gsm0414_tx_open_loop_cmd(conn);
697
698 return CMD_SUCCESS;
699}
700
Keithd32b6d12017-01-18 17:09:33 +0100701DEFUN(ena_subscr_expire,
702 ena_subscr_expire_cmd,
703 "subscriber " SUBSCR_TYPES " ID expire",
704 SUBSCR_HELP "Expire the subscriber Now\n")
705{
Keithd32b6d12017-01-18 17:09:33 +0100706 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200707 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],
708 argv[1]);
Keithd32b6d12017-01-18 17:09:33 +0100709
Harald Welte2483f1b2016-06-19 18:06:02 +0200710 if (!vsub) {
Keithd32b6d12017-01-18 17:09:33 +0100711 vty_out(vty, "%% No subscriber found for %s %s%s",
712 argv[0], argv[1], VTY_NEWLINE);
713 return CMD_WARNING;
714 }
715
Maxdcc193d2017-12-27 19:34:15 +0100716 if (vlr_subscr_expire(vsub))
Harald Welte2483f1b2016-06-19 18:06:02 +0200717 vty_out(vty, "%% VLR released subscriber %s%s",
718 vlr_subscr_name(vsub), VTY_NEWLINE);
Keithd32b6d12017-01-18 17:09:33 +0100719
Harald Welte2483f1b2016-06-19 18:06:02 +0200720 if (vsub->use_count > 1)
721 vty_out(vty, "%% Subscriber %s is still in use,"
722 " should be released soon%s",
723 vlr_subscr_name(vsub), VTY_NEWLINE);
724
725 vlr_subscr_put(vsub);
Keithd32b6d12017-01-18 17:09:33 +0100726 return CMD_SUCCESS;
727}
728
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200729#define A3A8_ALG_TYPES "(none|xor|comp128v1)"
Harald Welte28326062010-05-14 20:05:17 +0200730#define A3A8_ALG_HELP \
731 "Use No A3A8 algorithm\n" \
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200732 "Use XOR algorithm\n" \
Harald Welte28326062010-05-14 20:05:17 +0200733 "Use COMP128v1 algorithm\n"
Sylvain Munaut99792902009-12-27 19:30:46 +0100734
Harald Welteb4a84e12010-05-27 10:44:58 +0200735DEFUN(ena_subscr_a3a8,
736 ena_subscr_a3a8_cmd,
737 "subscriber " SUBSCR_TYPES " ID a3a8 " A3A8_ALG_TYPES " [KI]",
Harald Welted3cf85d2010-05-27 10:48:11 +0200738 SUBSCR_HELP "Set a3a8 parameters for the subscriber\n"
739 A3A8_ALG_HELP "Encryption Key Ki\n")
Sylvain Munaut99792902009-12-27 19:30:46 +0100740{
Harald Welte2483f1b2016-06-19 18:06:02 +0200741 vty_out(vty, "%% 'subscriber a3a8' is no longer supported.%s"
742 "%% This is now up to osmo-hlr.%s",
743 VTY_NEWLINE, VTY_NEWLINE);
744 return CMD_WARNING;
Sylvain Munaut99792902009-12-27 19:30:46 +0100745}
746
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100747DEFUN(subscriber_update,
748 subscriber_update_cmd,
749 "subscriber " SUBSCR_TYPES " ID update",
750 SUBSCR_HELP "Update the subscriber data from the dabase.\n")
751{
Harald Welte2483f1b2016-06-19 18:06:02 +0200752 vty_out(vty, "%% 'subscriber update' is no longer supported.%s",
753 VTY_NEWLINE);
754 return CMD_WARNING;
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100755}
756
Harald Weltea1482332009-11-14 10:08:40 +0100757static int scall_cbfn(unsigned int subsys, unsigned int signal,
758 void *handler_data, void *signal_data)
759{
760 struct scall_signal_data *sigdata = signal_data;
761 struct vty *vty = sigdata->data;
762
763 switch (signal) {
764 case S_SCALL_SUCCESS:
Neels Hofmeyre2f24d52017-05-08 15:12:20 +0200765 vty_out(vty, "%% silent call success%s", VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100766 break;
767 case S_SCALL_EXPIRED:
768 vty_out(vty, "%% silent call expired paging%s", VTY_NEWLINE);
769 break;
770 }
771 return 0;
772}
773
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200774DEFUN(show_stats,
775 show_stats_cmd,
776 "show statistics",
777 SHOW_STR "Display network statistics\n")
778{
Harald Weltedcccb182010-05-16 20:52:23 +0200779 struct gsm_network *net = gsmnet_from_vty(vty);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200780
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200781 vty_out(vty, "Location Update : %lu attach, %lu normal, %lu periodic%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200782 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_ATTACH].current,
783 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_NORMAL].current,
784 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_PERIODIC].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200785 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200786 vty_out(vty, "IMSI Detach Indications : %lu%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200787 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_DETACH].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200788 VTY_NEWLINE);
Neels Hofmeyr36891a72016-05-09 13:18:03 +0200789 vty_out(vty, "Location Updating Results: %lu completed, %lu failed%s",
790 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_COMPLETED].current,
791 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_FAILED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200792 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200793 vty_out(vty, "SMS MO : %lu submitted, %lu no receiver%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200794 net->msc_ctrs->ctr[MSC_CTR_SMS_SUBMITTED].current,
795 net->msc_ctrs->ctr[MSC_CTR_SMS_NO_RECEIVER].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200796 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200797 vty_out(vty, "SMS MT : %lu delivered, %lu no memory, %lu other error%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200798 net->msc_ctrs->ctr[MSC_CTR_SMS_DELIVERED].current,
799 net->msc_ctrs->ctr[MSC_CTR_SMS_RP_ERR_MEM].current,
800 net->msc_ctrs->ctr[MSC_CTR_SMS_RP_ERR_OTHER].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200801 VTY_NEWLINE);
Harald Weltea29e43a2010-12-24 16:06:33 +0100802 vty_out(vty, "MO Calls : %lu setup, %lu connect ack%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200803 net->msc_ctrs->ctr[MSC_CTR_CALL_MO_SETUP].current,
804 net->msc_ctrs->ctr[MSC_CTR_CALL_MO_CONNECT_ACK].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200805 VTY_NEWLINE);
Harald Weltea29e43a2010-12-24 16:06:33 +0100806 vty_out(vty, "MT Calls : %lu setup, %lu connect%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200807 net->msc_ctrs->ctr[MSC_CTR_CALL_MT_SETUP].current,
808 net->msc_ctrs->ctr[MSC_CTR_CALL_MT_CONNECT].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200809 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200810 return CMD_SUCCESS;
811}
812
Holger Hans Peter Freyther81c0e252010-12-25 14:08:00 +0100813DEFUN(show_smsqueue,
814 show_smsqueue_cmd,
815 "show sms-queue",
816 SHOW_STR "Display SMSqueue statistics\n")
817{
818 struct gsm_network *net = gsmnet_from_vty(vty);
819
820 sms_queue_stats(net->sms_queue, vty);
821 return CMD_SUCCESS;
822}
823
Holger Hans Peter Freyther7a0e1662010-12-25 14:15:32 +0100824DEFUN(smsqueue_trigger,
825 smsqueue_trigger_cmd,
826 "sms-queue trigger",
827 "SMS Queue\n" "Trigger sending messages\n")
828{
829 struct gsm_network *net = gsmnet_from_vty(vty);
830
831 sms_queue_trigger(net->sms_queue);
832 return CMD_SUCCESS;
833}
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200834
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100835DEFUN(smsqueue_max,
836 smsqueue_max_cmd,
837 "sms-queue max-pending <1-500>",
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200838 "SMS Queue\n" "SMS to deliver in parallel\n" "Amount\n")
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100839{
840 struct gsm_network *net = gsmnet_from_vty(vty);
841
842 sms_queue_set_max_pending(net->sms_queue, atoi(argv[0]));
843 return CMD_SUCCESS;
844}
845
Holger Hans Peter Freyther4dcc5e52010-12-25 14:38:30 +0100846DEFUN(smsqueue_clear,
847 smsqueue_clear_cmd,
848 "sms-queue clear",
849 "SMS Queue\n" "Clear the queue of pending SMS\n")
850{
851 struct gsm_network *net = gsmnet_from_vty(vty);
852
853 sms_queue_clear(net->sms_queue);
854 return CMD_SUCCESS;
855}
856
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100857DEFUN(smsqueue_fail,
858 smsqueue_fail_cmd,
859 "sms-queue max-failure <1-500>",
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200860 "SMS Queue\n" "Maximum amount of delivery failures\n" "Amount\n")
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100861{
862 struct gsm_network *net = gsmnet_from_vty(vty);
863
864 sms_queue_set_max_failure(net->sms_queue, atoi(argv[0]));
865 return CMD_SUCCESS;
866}
867
Harald Welteab386e62011-09-01 18:18:43 +0200868
869DEFUN(cfg_mncc_int, cfg_mncc_int_cmd,
870 "mncc-int", "Configure internal MNCC handler")
871{
872 vty->node = MNCC_INT_NODE;
873
874 return CMD_SUCCESS;
875}
876
877static struct cmd_node mncc_int_node = {
878 MNCC_INT_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200879 "%s(config-mncc-int)# ",
Harald Welteab386e62011-09-01 18:18:43 +0200880 1,
881};
882
883static const struct value_string tchf_codec_names[] = {
884 { GSM48_CMODE_SPEECH_V1, "fr" },
885 { GSM48_CMODE_SPEECH_EFR, "efr" },
886 { GSM48_CMODE_SPEECH_AMR, "amr" },
887 { 0, NULL }
888};
889
890static const struct value_string tchh_codec_names[] = {
891 { GSM48_CMODE_SPEECH_V1, "hr" },
892 { GSM48_CMODE_SPEECH_AMR, "amr" },
893 { 0, NULL }
894};
895
896static int config_write_mncc_int(struct vty *vty)
897{
898 vty_out(vty, "mncc-int%s", VTY_NEWLINE);
899 vty_out(vty, " default-codec tch-f %s%s",
900 get_value_string(tchf_codec_names, mncc_int.def_codec[0]),
901 VTY_NEWLINE);
902 vty_out(vty, " default-codec tch-h %s%s",
903 get_value_string(tchh_codec_names, mncc_int.def_codec[1]),
904 VTY_NEWLINE);
905
906 return CMD_SUCCESS;
907}
908
909DEFUN(mnccint_def_codec_f,
910 mnccint_def_codec_f_cmd,
911 "default-codec tch-f (fr|efr|amr)",
912 "Set default codec\n" "Codec for TCH/F\n"
913 "Full-Rate\n" "Enhanced Full-Rate\n" "Adaptive Multi-Rate\n")
914{
915 mncc_int.def_codec[0] = get_string_value(tchf_codec_names, argv[0]);
916
917 return CMD_SUCCESS;
918}
919
920DEFUN(mnccint_def_codec_h,
921 mnccint_def_codec_h_cmd,
922 "default-codec tch-h (hr|amr)",
923 "Set default codec\n" "Codec for TCH/H\n"
924 "Half-Rate\n" "Adaptive Multi-Rate\n")
925{
926 mncc_int.def_codec[1] = get_string_value(tchh_codec_names, argv[0]);
927
928 return CMD_SUCCESS;
929}
930
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100931
932DEFUN(logging_fltr_imsi,
933 logging_fltr_imsi_cmd,
934 "logging filter imsi IMSI",
935 LOGGING_STR FILTER_STR
936 "Filter log messages by IMSI\n" "IMSI to be used as filter\n")
937{
Harald Welte2483f1b2016-06-19 18:06:02 +0200938 struct vlr_subscr *vlr_subscr;
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100939 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
940 struct log_target *tgt = osmo_log_vty2tgt(vty);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100941 const char *imsi = argv[0];
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100942
943 if (!tgt)
944 return CMD_WARNING;
945
Harald Welte2483f1b2016-06-19 18:06:02 +0200946 vlr_subscr = vlr_subscr_find_by_imsi(gsmnet->vlr, imsi);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100947
Neels Hofmeyr84da6b12016-05-20 21:59:55 +0200948 if (!vlr_subscr) {
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100949 vty_out(vty, "%%no subscriber with IMSI(%s)%s",
950 argv[0], VTY_NEWLINE);
951 return CMD_WARNING;
952 }
953
Harald Welte2483f1b2016-06-19 18:06:02 +0200954 log_set_filter_vlr_subscr(tgt, vlr_subscr);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100955 return CMD_SUCCESS;
956}
Holger Hans Peter Freyther925c57f2015-01-27 10:58:29 +0100957
Harald Welte2483f1b2016-06-19 18:06:02 +0200958static struct cmd_node hlr_node = {
959 HLR_NODE,
960 "%s(config-hlr)# ",
961 1,
962};
963
964DEFUN(cfg_hlr, cfg_hlr_cmd,
965 "hlr", "Configure connection to the HLR")
966{
967 vty->node = HLR_NODE;
968 return CMD_SUCCESS;
969}
970
971DEFUN(cfg_hlr_remote_ip, cfg_hlr_remote_ip_cmd, "remote-ip A.B.C.D",
972 "Remote GSUP address of the HLR\n"
973 "Remote GSUP address (default: " MSC_HLR_REMOTE_IP_DEFAULT ")")
974{
975 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
976 talloc_free((void*)gsmnet->gsup_server_addr_str);
977 gsmnet->gsup_server_addr_str = talloc_strdup(gsmnet, argv[0]);
978 return CMD_SUCCESS;
979}
980
981DEFUN(cfg_hlr_remote_port, cfg_hlr_remote_port_cmd, "remote-port <1-65535>",
982 "Remote GSUP port of the HLR\n"
983 "Remote GSUP port (default: " OSMO_STRINGIFY(MSC_HLR_REMOTE_PORT_DEFAULT) ")")
984{
985 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
986 gsmnet->gsup_server_port = atoi(argv[0]);
987 return CMD_SUCCESS;
988}
989
990static int config_write_hlr(struct vty *vty)
991{
992 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
993
994 vty_out(vty, "hlr%s", VTY_NEWLINE);
995 vty_out(vty, " remote-ip %s%s",
996 gsmnet->gsup_server_addr_str, VTY_NEWLINE);
997 vty_out(vty, " remote-port %u%s",
998 gsmnet->gsup_server_port, VTY_NEWLINE);
999 return CMD_SUCCESS;
1000}
1001
Harald Weltedcccb182010-05-16 20:52:23 +02001002int bsc_vty_init_extra(void)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02001003{
Pablo Neira Ayusobbc5b992011-05-06 12:12:31 +02001004 osmo_signal_register_handler(SS_SCALL, scall_cbfn, NULL);
Harald Weltea1482332009-11-14 10:08:40 +01001005
Harald Welteb4d5b172010-05-12 16:10:35 +00001006 install_element_ve(&show_subscr_cmd);
1007 install_element_ve(&show_subscr_cache_cmd);
Harald Welte66a301e2018-01-24 16:48:17 +01001008 install_element_ve(&show_msc_conn_cmd);
1009 install_element_ve(&show_msc_transaction_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02001010
Harald Welteb4d5b172010-05-12 16:10:35 +00001011 install_element_ve(&sms_send_pend_cmd);
Stefan Sperling87cba1f2018-01-22 17:05:37 +01001012 install_element_ve(&sms_delete_expired_cmd);
Harald Welte98f9c752009-11-14 08:00:53 +01001013
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +02001014 install_element_ve(&subscriber_create_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +00001015 install_element_ve(&subscriber_send_sms_cmd);
1016 install_element_ve(&subscriber_silent_sms_cmd);
1017 install_element_ve(&subscriber_silent_call_start_cmd);
1018 install_element_ve(&subscriber_silent_call_stop_cmd);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +08001019 install_element_ve(&subscriber_ussd_notify_cmd);
Harald Welte94307772017-06-12 01:52:27 +02001020 install_element_ve(&subscriber_mstest_close_cmd);
1021 install_element_ve(&subscriber_mstest_open_cmd);
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +01001022 install_element_ve(&subscriber_update_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +00001023 install_element_ve(&show_stats_cmd);
Holger Hans Peter Freyther81c0e252010-12-25 14:08:00 +01001024 install_element_ve(&show_smsqueue_cmd);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +01001025 install_element_ve(&logging_fltr_imsi_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02001026
Keithd32b6d12017-01-18 17:09:33 +01001027 install_element(ENABLE_NODE, &ena_subscr_expire_cmd);
Harald Welteb4a84e12010-05-27 10:44:58 +02001028 install_element(ENABLE_NODE, &ena_subscr_a3a8_cmd);
Holger Hans Peter Freyther7a0e1662010-12-25 14:15:32 +01001029 install_element(ENABLE_NODE, &smsqueue_trigger_cmd);
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +01001030 install_element(ENABLE_NODE, &smsqueue_max_cmd);
Holger Hans Peter Freyther4dcc5e52010-12-25 14:38:30 +01001031 install_element(ENABLE_NODE, &smsqueue_clear_cmd);
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +01001032 install_element(ENABLE_NODE, &smsqueue_fail_cmd);
Nico Goldeb62b1232011-02-22 17:54:47 +01001033 install_element(ENABLE_NODE, &subscriber_send_pending_sms_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02001034
Harald Welteab386e62011-09-01 18:18:43 +02001035 install_element(CONFIG_NODE, &cfg_mncc_int_cmd);
1036 install_node(&mncc_int_node, config_write_mncc_int);
Harald Welteab386e62011-09-01 18:18:43 +02001037 install_element(MNCC_INT_NODE, &mnccint_def_codec_f_cmd);
1038 install_element(MNCC_INT_NODE, &mnccint_def_codec_h_cmd);
1039
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +01001040 install_element(CFG_LOG_NODE, &logging_fltr_imsi_cmd);
Harald Welteb02fc1e2013-02-12 11:15:49 +01001041
Harald Welte2483f1b2016-06-19 18:06:02 +02001042 install_element(CONFIG_NODE, &cfg_hlr_cmd);
1043 install_node(&hlr_node, config_write_hlr);
1044 install_element(HLR_NODE, &cfg_hlr_remote_ip_cmd);
1045 install_element(HLR_NODE, &cfg_hlr_remote_port_cmd);
Holger Hans Peter Freyther925c57f2015-01-27 10:58:29 +01001046
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02001047 return 0;
1048}