blob: 9a3ff019a88265189697f64561b424ac0774aad0 [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{
61 vty_out(vty, "--ConnId ------------Subscriber RAN --LAC Use --Tokens CSA A5 State%s",
62 VTY_NEWLINE);
63}
64
65static void vty_dump_one_conn(struct vty *vty, const struct gsm_subscriber_connection *conn)
66{
67 vty_out(vty, "%08x %22s %3s %5u %3u %08x %c%c%c /%1u %27s %s",
68 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' : '-',
75 conn->sec_operation ? 'S' : '-',
76 conn->anch_operation ? 'A' : '-',
77 conn->encr.alg_id,
78 conn->conn_fsm ? osmo_fsm_inst_state_name(conn->conn_fsm) : "-",
79 VTY_NEWLINE);
80}
81
82DEFUN(show_msc_conn, show_msc_conn_cmd,
83 "show connection", SHOW_STR "Subscriber Connections\n")
84{
85 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
86 struct gsm_subscriber_connection *conn;
87
88 vty_conn_hdr(vty);
89 llist_for_each_entry(conn, &gsmnet->subscr_conns, entry)
90 vty_dump_one_conn(vty, conn);
91
92 return CMD_SUCCESS;
93}
94
95static void vty_trans_hdr(struct vty *vty)
96{
97 vty_out(vty, "------------Subscriber --ConnId -P TI -CallRef Proto%s",
98 VTY_NEWLINE);
99}
100
101static const char *get_trans_proto_str(const struct gsm_trans *trans)
102{
103 static char buf[256];
104
105 switch (trans->protocol) {
106 case GSM48_PDISC_CC:
107 snprintf(buf, sizeof(buf), "%s %4u %4u",
108 gsm48_cc_state_name(trans->cc.state),
109 trans->cc.Tcurrent,
110 trans->cc.T308_second);
111 break;
112 case GSM48_PDISC_SMS:
113 snprintf(buf, sizeof(buf), "%s %s",
114 gsm411_cp_state_name(trans->sms.smc_inst.cp_state),
115 gsm411_rp_state_name(trans->sms.smr_inst.rp_state));
116 break;
117 default:
118 buf[0] = '\0';
119 break;
120 }
121
122 return buf;
123}
124
125static void vty_dump_one_trans(struct vty *vty, const struct gsm_trans *trans)
126{
127 vty_out(vty, "%22s %08x %s %02u %08x %s%s",
128 trans->vsub ? vlr_subscr_name(trans->vsub) : "-",
129 trans->conn ? trans->conn->a.conn_id : 0,
130 gsm48_pdisc_name(trans->protocol),
131 trans->transaction_id,
132 trans->callref,
133 get_trans_proto_str(trans), VTY_NEWLINE);
134}
135
136DEFUN(show_msc_transaction, show_msc_transaction_cmd,
137 "show transaction", SHOW_STR "Transactions\n")
138{
139 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
140 struct gsm_trans *trans;
141
142 vty_trans_hdr(vty);
143 llist_for_each_entry(trans, &gsmnet->trans_list, entry)
144 vty_dump_one_trans(vty, trans);
145
146 return CMD_SUCCESS;
147}
148
149
150
Harald Welte2483f1b2016-06-19 18:06:02 +0200151static void subscr_dump_full_vty(struct vty *vty, struct vlr_subscr *vsub)
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100152{
Harald Welte66a301e2018-01-24 16:48:17 +0100153 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
154 struct gsm_trans *trans;
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200155 int reqs;
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200156 struct llist_head *entry;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100157
Harald Welte2483f1b2016-06-19 18:06:02 +0200158 if (strlen(vsub->name))
159 vty_out(vty, " Name: '%s'%s", vsub->name, VTY_NEWLINE);
160 if (strlen(vsub->msisdn))
161 vty_out(vty, " Extension: %s%s", vsub->msisdn,
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100162 VTY_NEWLINE);
Holger Hans Peter Freyther3d76e442010-12-25 16:40:54 +0100163 vty_out(vty, " LAC: %d/0x%x%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200164 vsub->lac, vsub->lac, VTY_NEWLINE);
165 vty_out(vty, " IMSI: %s%s", vsub->imsi, VTY_NEWLINE);
166 if (vsub->tmsi != GSM_RESERVED_TMSI)
167 vty_out(vty, " TMSI: %08X%s", vsub->tmsi,
168 VTY_NEWLINE);
169 if (vsub->tmsi_new != GSM_RESERVED_TMSI)
170 vty_out(vty, " new TMSI: %08X%s", vsub->tmsi_new,
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100171 VTY_NEWLINE);
172
Harald Welte2483f1b2016-06-19 18:06:02 +0200173#if 0
174 /* TODO: add this to vlr_subscr? */
175 if (vsub->auth_info.auth_algo != AUTH_ALGO_NONE) {
176 struct gsm_auth_info *i = &vsub->auth_info;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100177 vty_out(vty, " A3A8 algorithm id: %d%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200178 i->auth_algo, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100179 vty_out(vty, " A3A8 Ki: %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200180 osmo_hexdump(i->a3a8_ki, i->a3a8_ki_len),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100181 VTY_NEWLINE);
182 }
Harald Welte2483f1b2016-06-19 18:06:02 +0200183#endif
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100184
Harald Welte2483f1b2016-06-19 18:06:02 +0200185 if (vsub->last_tuple) {
186 struct gsm_auth_tuple *t = vsub->last_tuple;
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100187 vty_out(vty, " A3A8 last tuple (used %d times):%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200188 t->use_count, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100189 vty_out(vty, " seq # : %d%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200190 t->key_seq, VTY_NEWLINE);
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100191 vty_out(vty, " RAND : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200192 osmo_hexdump(t->vec.rand, sizeof(t->vec.rand)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100193 VTY_NEWLINE);
194 vty_out(vty, " SRES : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200195 osmo_hexdump(t->vec.sres, sizeof(t->vec.sres)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100196 VTY_NEWLINE);
197 vty_out(vty, " Kc : %s%s",
Harald Welte2483f1b2016-06-19 18:06:02 +0200198 osmo_hexdump(t->vec.kc, sizeof(t->vec.kc)),
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100199 VTY_NEWLINE);
200 }
Holger Hans Peter Freytherb9708942013-07-27 19:42:35 +0200201
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200202 reqs = 0;
Harald Welte2483f1b2016-06-19 18:06:02 +0200203 llist_for_each(entry, &vsub->cs.requests)
Holger Hans Peter Freytherc9dbe3c2015-08-04 13:18:47 +0200204 reqs += 1;
Harald Welte2483f1b2016-06-19 18:06:02 +0200205 vty_out(vty, " Paging: %s paging for %d requests%s",
206 vsub->cs.is_paging ? "is" : "not", reqs, VTY_NEWLINE);
207 vty_out(vty, " Use count: %u%s", vsub->use_count, VTY_NEWLINE);
Harald Welte66a301e2018-01-24 16:48:17 +0100208
209 /* Connection */
210 if (vsub->msc_conn_ref) {
211 struct gsm_subscriber_connection *conn = vsub->msc_conn_ref;
212 vty_conn_hdr(vty);
213 vty_dump_one_conn(vty, conn);
214 }
215
216 /* Transactions */
217 vty_trans_hdr(vty);
218 llist_for_each_entry(trans, &gsmnet->trans_list, entry) {
219 if (trans->vsub != vsub)
220 continue;
221 vty_dump_one_trans(vty, trans);
222 }
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100223}
224
225
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200226/* Subscriber */
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200227DEFUN(show_subscr_cache,
228 show_subscr_cache_cmd,
229 "show subscriber cache",
Harald Weltecfaabbb2012-08-16 23:23:50 +0200230 SHOW_STR "Show information about subscribers\n"
231 "Display contents of subscriber cache\n")
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200232{
Harald Welte2483f1b2016-06-19 18:06:02 +0200233 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
234 struct vlr_subscr *vsub;
235 int count = 0;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200236
Harald Welte2483f1b2016-06-19 18:06:02 +0200237 llist_for_each_entry(vsub, &gsmnet->vlr->subscribers, list) {
238 if (++count > 100) {
239 vty_out(vty, "%% More than %d subscribers in cache,"
240 " stopping here.%s", count-1, VTY_NEWLINE);
241 break;
242 }
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200243 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200244 subscr_dump_full_vty(vty, vsub);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200245 }
246
247 return CMD_SUCCESS;
248}
249
250DEFUN(sms_send_pend,
251 sms_send_pend_cmd,
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100252 "sms send pending",
Neels Hofmeyrd1fdefe2016-04-01 02:17:24 +0200253 "SMS related commands\n" "SMS Sending related commands\n"
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100254 "Send all pending SMS")
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200255{
Harald Weltedcccb182010-05-16 20:52:23 +0200256 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200257 struct gsm_sms *sms;
Harald Welte2483f1b2016-06-19 18:06:02 +0200258 unsigned long long sms_id = 0;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200259
260 while (1) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200261 sms = db_sms_get_next_unsent(gsmnet, sms_id, UINT_MAX);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200262 if (!sms)
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100263 break;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200264
Harald Welte2483f1b2016-06-19 18:06:02 +0200265 if (sms->receiver)
266 gsm411_send_sms_subscr(sms->receiver, sms);
Sylvain Munautff1f19e2009-12-22 13:22:29 +0100267
Harald Welte2483f1b2016-06-19 18:06:02 +0200268 sms_id = sms->id + 1;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200269 }
270
271 return CMD_SUCCESS;
272}
273
Stefan Sperling87cba1f2018-01-22 17:05:37 +0100274
275DEFUN(sms_delete_expired,
276 sms_delete_expired_cmd,
277 "sms delete expired",
278 "SMS related commands\n" "SMS Database related commands\n"
279 "Delete all expired SMS")
280{
281 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
282 struct gsm_sms *sms;
283 unsigned long long sms_id = 0;
284 long long num_deleted = 0;
285
286 while (1) {
287 sms = db_sms_get_next_unsent(gsmnet, sms_id, UINT_MAX);
288 if (!sms)
289 break;
290
291 /* Skip SMS which are currently queued for sending. */
292 if (sms_queue_sms_is_pending(gsmnet->sms_queue, sms->id))
293 continue;
294
295 /* Expiration check is performed by the DB layer. */
296 if (db_sms_delete_expired_message_by_id(sms->id) == 0)
297 num_deleted++;
298
299 sms_id = sms->id + 1;
300 }
301
302 if (num_deleted == 0) {
303 vty_out(vty, "No expired SMS in database%s", VTY_NEWLINE);
304 return CMD_WARNING;
305 }
306
307 vty_out(vty, "Deleted %llu expired SMS from database%s", num_deleted, VTY_NEWLINE);
308 return CMD_SUCCESS;
309}
310
311
Harald Welte2483f1b2016-06-19 18:06:02 +0200312static int _send_sms_str(struct vlr_subscr *receiver,
313 struct vlr_subscr *sender,
314 char *str, uint8_t tp_pid)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200315{
Harald Welte2483f1b2016-06-19 18:06:02 +0200316 struct gsm_network *net = receiver->vlr->user_ctx;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200317 struct gsm_sms *sms;
318
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100319 sms = sms_from_text(receiver, sender, 0, str);
Harald Welte793a1352009-11-05 15:51:17 +0900320 sms->protocol_id = tp_pid;
Nico Golde59502362010-06-29 20:13:06 +0200321
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100322 /* store in database for the queue */
323 if (db_sms_store(sms) != 0) {
Holger Hans Peter Freythereff409492012-11-10 19:46:58 +0100324 LOGP(DLSMS, LOGL_ERROR, "Failed to store SMS in Database\n");
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100325 sms_free(sms);
326 return CMD_WARNING;
Nico Golde59502362010-06-29 20:13:06 +0200327 }
Neels Hofmeyr1e918c32016-05-09 21:48:53 +0200328 LOGP(DLSMS, LOGL_DEBUG, "SMS stored in DB\n");
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200329
Holger Hans Peter Freyther445e6152010-12-25 15:57:34 +0100330 sms_free(sms);
Harald Welte2483f1b2016-06-19 18:06:02 +0200331 sms_queue_trigger(net->sms_queue);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200332 return CMD_SUCCESS;
333}
334
Harald Welte2483f1b2016-06-19 18:06:02 +0200335static struct vlr_subscr *get_vsub_by_argv(struct gsm_network *gsmnet,
336 const char *type,
337 const char *id)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200338{
Harald Welte2483f1b2016-06-19 18:06:02 +0200339 if (!strcmp(type, "extension") || !strcmp(type, "msisdn"))
340 return vlr_subscr_find_by_msisdn(gsmnet->vlr, id);
341 else if (!strcmp(type, "imsi") || !strcmp(type, "id"))
342 return vlr_subscr_find_by_imsi(gsmnet->vlr, id);
Harald Welte98f9c752009-11-14 08:00:53 +0100343 else if (!strcmp(type, "tmsi"))
Harald Welte2483f1b2016-06-19 18:06:02 +0200344 return vlr_subscr_find_by_tmsi(gsmnet->vlr, atoi(id));
Harald Welte98f9c752009-11-14 08:00:53 +0100345
346 return NULL;
347}
348#define SUBSCR_TYPES "(extension|imsi|tmsi|id)"
Harald Welte28326062010-05-14 20:05:17 +0200349#define SUBSCR_HELP "Operations on a Subscriber\n" \
Neels Hofmeyrd1fdefe2016-04-01 02:17:24 +0200350 "Identify subscriber by extension (phone number)\n" \
351 "Identify subscriber by IMSI\n" \
352 "Identify subscriber by TMSI\n" \
353 "Identify subscriber by database ID\n" \
Harald Welte28326062010-05-14 20:05:17 +0200354 "Identifier for the subscriber\n"
Harald Welte98f9c752009-11-14 08:00:53 +0100355
Harald Welteb4a84e12010-05-27 10:44:58 +0200356DEFUN(show_subscr,
357 show_subscr_cmd,
358 "show subscriber " SUBSCR_TYPES " ID",
359 SHOW_STR SUBSCR_HELP)
360{
361 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200362 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],
363 argv[1]);
Harald Welteb4a84e12010-05-27 10:44:58 +0200364
Harald Welte2483f1b2016-06-19 18:06:02 +0200365 if (!vsub) {
Harald Welteb4a84e12010-05-27 10:44:58 +0200366 vty_out(vty, "%% No subscriber found for %s %s%s",
367 argv[0], argv[1], VTY_NEWLINE);
368 return CMD_WARNING;
369 }
370
Harald Welte2483f1b2016-06-19 18:06:02 +0200371 subscr_dump_full_vty(vty, vsub);
Harald Welteb4a84e12010-05-27 10:44:58 +0200372
Harald Welte2483f1b2016-06-19 18:06:02 +0200373 vlr_subscr_put(vsub);
Harald Welteb4a84e12010-05-27 10:44:58 +0200374
375 return CMD_SUCCESS;
376}
377
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200378DEFUN(subscriber_create,
379 subscriber_create_cmd,
380 "subscriber create imsi ID",
381 "Operations on a Subscriber\n" \
382 "Create new subscriber\n" \
383 "Identify the subscriber by his IMSI\n" \
384 "Identifier for the subscriber\n")
385{
Harald Welte2483f1b2016-06-19 18:06:02 +0200386 vty_out(vty, "%% 'subscriber create' now needs to be done at osmo-hlr%s",
387 VTY_NEWLINE);
388 return CMD_WARNING;
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +0200389}
390
Nico Goldeb62b1232011-02-22 17:54:47 +0100391DEFUN(subscriber_send_pending_sms,
392 subscriber_send_pending_sms_cmd,
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200393 "subscriber " SUBSCR_TYPES " ID sms pending-send",
Nico Goldeb62b1232011-02-22 17:54:47 +0100394 SUBSCR_HELP "SMS Operations\n" "Send pending SMS\n")
395{
396 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200397 struct vlr_subscr *vsub;
Nico Goldeb62b1232011-02-22 17:54:47 +0100398 struct gsm_sms *sms;
399
Harald Welte2483f1b2016-06-19 18:06:02 +0200400 vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
401 if (!vsub) {
Holger Hans Peter Freyther9feef482013-07-04 20:34:46 +0200402 vty_out(vty, "%% No subscriber found for %s %s%s",
403 argv[0], argv[1], VTY_NEWLINE);
404 return CMD_WARNING;
405 }
406
Harald Welte2483f1b2016-06-19 18:06:02 +0200407 sms = db_sms_get_unsent_for_subscr(vsub, UINT_MAX);
Nico Goldeb62b1232011-02-22 17:54:47 +0100408 if (sms)
409 gsm411_send_sms_subscr(sms->receiver, sms);
410
Harald Welte2483f1b2016-06-19 18:06:02 +0200411 vlr_subscr_put(vsub);
Nico Goldeb62b1232011-02-22 17:54:47 +0100412
413 return CMD_SUCCESS;
414}
415
Harald Welte98f9c752009-11-14 08:00:53 +0100416DEFUN(subscriber_send_sms,
417 subscriber_send_sms_cmd,
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100418 "subscriber " SUBSCR_TYPES " ID sms sender " SUBSCR_TYPES " SENDER_ID send .LINE",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100419 SUBSCR_HELP "SMS Operations\n" SUBSCR_HELP "Send SMS\n" "Actual SMS Text\n")
Harald Welte98f9c752009-11-14 08:00:53 +0100420{
Harald Weltedcccb182010-05-16 20:52:23 +0200421 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200422 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
423 struct vlr_subscr *sender = get_vsub_by_argv(gsmnet, argv[2], argv[3]);
Harald Welte20474ad2010-05-16 19:28:32 +0200424 char *str;
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +0200425 int rc;
426
Harald Welte2483f1b2016-06-19 18:06:02 +0200427 if (!vsub) {
Harald Welte20f98312009-11-14 10:11:45 +0100428 vty_out(vty, "%% No subscriber found for %s %s%s",
429 argv[0], argv[1], VTY_NEWLINE);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100430 rc = CMD_WARNING;
431 goto err;
Harald Welte20f98312009-11-14 10:11:45 +0100432 }
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100433
434 if (!sender) {
435 vty_out(vty, "%% No sender found for %s %s%s",
436 argv[2], argv[3], VTY_NEWLINE);
437 rc = CMD_WARNING;
438 goto err;
439 }
440
441 str = argv_concat(argv, argc, 4);
Harald Welte2483f1b2016-06-19 18:06:02 +0200442 rc = _send_sms_str(vsub, sender, str, 0);
Harald Welte20474ad2010-05-16 19:28:32 +0200443 talloc_free(str);
Harald Welte793a1352009-11-05 15:51:17 +0900444
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100445err:
446 if (sender)
Harald Welte2483f1b2016-06-19 18:06:02 +0200447 vlr_subscr_put(sender);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100448
Harald Welte2483f1b2016-06-19 18:06:02 +0200449 if (vsub)
450 vlr_subscr_put(vsub);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100451
Harald Welte793a1352009-11-05 15:51:17 +0900452 return rc;
453}
454
Harald Welte98f9c752009-11-14 08:00:53 +0100455DEFUN(subscriber_silent_sms,
456 subscriber_silent_sms_cmd,
Harald Welte1011d5b2014-07-10 20:19:00 +0200457
458 "subscriber " SUBSCR_TYPES " ID silent-sms sender " SUBSCR_TYPES " SENDER_ID send .LINE",
459 SUBSCR_HELP "Silent SMS Operations\n" SUBSCR_HELP "Send SMS\n" "Actual SMS Text\n")
Harald Welte793a1352009-11-05 15:51:17 +0900460{
Harald Weltedcccb182010-05-16 20:52:23 +0200461 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200462 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
463 struct vlr_subscr *sender = get_vsub_by_argv(gsmnet, argv[2], argv[3]);
Harald Welte20474ad2010-05-16 19:28:32 +0200464 char *str;
Harald Welte793a1352009-11-05 15:51:17 +0900465 int rc;
466
Harald Welte2483f1b2016-06-19 18:06:02 +0200467 if (!vsub) {
Harald Welte20f98312009-11-14 10:11:45 +0100468 vty_out(vty, "%% No subscriber found for %s %s%s",
469 argv[0], argv[1], VTY_NEWLINE);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100470 rc = CMD_WARNING;
471 goto err;
Harald Welte20f98312009-11-14 10:11:45 +0100472 }
Harald Welte793a1352009-11-05 15:51:17 +0900473
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100474 if (!sender) {
475 vty_out(vty, "%% No sender found for %s %s%s",
476 argv[2], argv[3], VTY_NEWLINE);
477 rc = CMD_WARNING;
478 goto err;
479 }
480
481 str = argv_concat(argv, argc, 4);
Harald Welte2483f1b2016-06-19 18:06:02 +0200482 rc = _send_sms_str(vsub, sender, str, 64);
Harald Welte20474ad2010-05-16 19:28:32 +0200483 talloc_free(str);
Harald Welte793a1352009-11-05 15:51:17 +0900484
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100485err:
486 if (sender)
Harald Welte2483f1b2016-06-19 18:06:02 +0200487 vlr_subscr_put(sender);
Sylvain Munaut01c13a32012-12-28 00:49:01 +0100488
Harald Welte2483f1b2016-06-19 18:06:02 +0200489 if (vsub)
490 vlr_subscr_put(vsub);
Harald Welteaf8c7b42009-11-14 10:10:54 +0100491
Harald Welte793a1352009-11-05 15:51:17 +0900492 return rc;
493}
494
Harald Welte28326062010-05-14 20:05:17 +0200495#define CHAN_TYPES "(any|tch/f|tch/any|sdcch)"
496#define CHAN_TYPE_HELP \
497 "Any channel\n" \
498 "TCH/F channel\n" \
499 "Any TCH channel\n" \
500 "SDCCH channel\n"
501
Sylvain Munaut50480702010-01-02 14:29:43 +0100502DEFUN(subscriber_silent_call_start,
503 subscriber_silent_call_start_cmd,
Harald Welteb4a84e12010-05-27 10:44:58 +0200504 "subscriber " SUBSCR_TYPES " ID silent-call start (any|tch/f|tch/any|sdcch)",
Harald Welte28326062010-05-14 20:05:17 +0200505 SUBSCR_HELP "Silent call operation\n" "Start silent call\n"
506 CHAN_TYPE_HELP)
Sylvain Munaut50480702010-01-02 14:29:43 +0100507{
Harald Weltedcccb182010-05-16 20:52:23 +0200508 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200509 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Sylvain Munaut50480702010-01-02 14:29:43 +0100510 int rc, type;
511
Harald Welte2483f1b2016-06-19 18:06:02 +0200512 if (!vsub) {
Sylvain Munaut50480702010-01-02 14:29:43 +0100513 vty_out(vty, "%% No subscriber found for %s %s%s",
514 argv[0], argv[1], VTY_NEWLINE);
515 return CMD_WARNING;
516 }
517
518 if (!strcmp(argv[2], "tch/f"))
519 type = RSL_CHANNEED_TCH_F;
520 else if (!strcmp(argv[2], "tch/any"))
521 type = RSL_CHANNEED_TCH_ForH;
522 else if (!strcmp(argv[2], "sdcch"))
523 type = RSL_CHANNEED_SDCCH;
524 else
525 type = RSL_CHANNEED_ANY; /* Defaults to ANY */
526
Harald Welte2483f1b2016-06-19 18:06:02 +0200527 rc = gsm_silent_call_start(vsub, vty, type);
Sylvain Munaut50480702010-01-02 14:29:43 +0100528 if (rc <= 0) {
529 vty_out(vty, "%% Subscriber not attached%s",
530 VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200531 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100532 return CMD_WARNING;
533 }
534
Harald Welte2483f1b2016-06-19 18:06:02 +0200535 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100536
537 return CMD_SUCCESS;
538}
539
540DEFUN(subscriber_silent_call_stop,
541 subscriber_silent_call_stop_cmd,
Harald Welteb4a84e12010-05-27 10:44:58 +0200542 "subscriber " SUBSCR_TYPES " ID silent-call stop",
Harald Welte28326062010-05-14 20:05:17 +0200543 SUBSCR_HELP "Silent call operation\n" "Stop silent call\n"
544 CHAN_TYPE_HELP)
Harald Weltea1482332009-11-14 10:08:40 +0100545{
Harald Weltedcccb182010-05-16 20:52:23 +0200546 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200547 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Harald Weltea1482332009-11-14 10:08:40 +0100548 int rc;
549
Harald Welte2483f1b2016-06-19 18:06:02 +0200550 if (!vsub) {
Harald Weltea1482332009-11-14 10:08:40 +0100551 vty_out(vty, "%% No subscriber found for %s %s%s",
Harald Welte20f98312009-11-14 10:11:45 +0100552 argv[0], argv[1], VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100553 return CMD_WARNING;
554 }
555
Harald Welte2483f1b2016-06-19 18:06:02 +0200556 rc = gsm_silent_call_stop(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100557 if (rc < 0) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200558 vlr_subscr_put(vsub);
Sylvain Munaut50480702010-01-02 14:29:43 +0100559 return CMD_WARNING;
Harald Weltea1482332009-11-14 10:08:40 +0100560 }
561
Harald Welte2483f1b2016-06-19 18:06:02 +0200562 vlr_subscr_put(vsub);
Harald Weltea1482332009-11-14 10:08:40 +0100563
564 return CMD_SUCCESS;
565}
566
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800567DEFUN(subscriber_ussd_notify,
568 subscriber_ussd_notify_cmd,
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800569 "subscriber " SUBSCR_TYPES " ID ussd-notify (0|1|2) .TEXT",
Harald Weltecfaabbb2012-08-16 23:23:50 +0200570 SUBSCR_HELP "Send a USSD notify to the subscriber\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +0200571 "Alerting Level 0\n"
572 "Alerting Level 1\n"
573 "Alerting Level 2\n"
574 "Text of USSD message to send\n")
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800575{
576 char *text;
577 struct gsm_subscriber_connection *conn;
578 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200579 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800580 int level;
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800581
Harald Welte2483f1b2016-06-19 18:06:02 +0200582 if (!vsub) {
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800583 vty_out(vty, "%% No subscriber found for %s %s%s",
584 argv[0], argv[1], VTY_NEWLINE);
585 return CMD_WARNING;
586 }
587
Holger Hans Peter Freythere731e1d2010-07-27 18:27:46 +0800588 level = atoi(argv[2]);
589 text = argv_concat(argv, argc, 3);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800590 if (!text) {
Harald Welte2483f1b2016-06-19 18:06:02 +0200591 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800592 return CMD_WARNING;
593 }
594
Harald Welte2483f1b2016-06-19 18:06:02 +0200595 conn = connection_for_subscr(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800596 if (!conn) {
597 vty_out(vty, "%% An active connection is required for %s %s%s",
598 argv[0], argv[1], VTY_NEWLINE);
Harald Welte2483f1b2016-06-19 18:06:02 +0200599 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800600 talloc_free(text);
601 return CMD_WARNING;
602 }
603
Neels Hofmeyr43273c62016-05-10 12:50:31 +0200604 msc_send_ussd_notify(conn, level, text);
605 msc_send_ussd_release_complete(conn);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800606
Harald Welte2483f1b2016-06-19 18:06:02 +0200607 vlr_subscr_put(vsub);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +0800608 talloc_free(text);
609 return CMD_SUCCESS;
610}
611
Harald Welte94307772017-06-12 01:52:27 +0200612static int loop_by_char(uint8_t ch)
613{
614 switch (ch) {
615 case 'a':
616 return GSM414_LOOP_A;
617 case 'b':
618 return GSM414_LOOP_B;
619 case 'c':
620 return GSM414_LOOP_C;
621 case 'd':
622 return GSM414_LOOP_D;
623 case 'e':
624 return GSM414_LOOP_E;
625 case 'f':
626 return GSM414_LOOP_F;
627 case 'i':
628 return GSM414_LOOP_I;
629 }
630 return -1;
631}
632
633DEFUN(subscriber_mstest_close,
634 subscriber_mstest_close_cmd,
635 "subscriber " SUBSCR_TYPES " ID ms-test close-loop (a|b|c|d|e|f|i)",
636 SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
637 "Close a TCH Loop inside the MS\n"
638 "Loop Type A\n"
639 "Loop Type B\n"
640 "Loop Type C\n"
641 "Loop Type D\n"
642 "Loop Type E\n"
643 "Loop Type F\n"
644 "Loop Type I\n")
645{
646 struct gsm_subscriber_connection *conn;
647 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
648 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
649 const char *loop_str;
650 int loop_mode;
651
652 if (!vsub) {
653 vty_out(vty, "%% No subscriber found for %s %s%s",
654 argv[0], argv[1], VTY_NEWLINE);
655 return CMD_WARNING;
656 }
657
658 loop_str = argv[2];
659 loop_mode = loop_by_char(loop_str[0]);
660
661 conn = connection_for_subscr(vsub);
662 if (!conn) {
663 vty_out(vty, "%% An active connection is required for %s %s%s",
664 argv[0], argv[1], VTY_NEWLINE);
665 vlr_subscr_put(vsub);
666 return CMD_WARNING;
667 }
668
669 gsm0414_tx_close_tch_loop_cmd(conn, loop_mode);
670
671 return CMD_SUCCESS;
672}
673
674DEFUN(subscriber_mstest_open,
675 subscriber_mstest_open_cmd,
676 "subscriber " SUBSCR_TYPES " ID ms-test open-loop",
677 SUBSCR_HELP "Send a TS 04.14 MS Test Command to subscriber\n"
678 "Open a TCH Loop inside the MS\n")
679{
680 struct gsm_subscriber_connection *conn;
681 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
682 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);
683
684 if (!vsub) {
685 vty_out(vty, "%% No subscriber found for %s %s%s",
686 argv[0], argv[1], VTY_NEWLINE);
687 return CMD_WARNING;
688 }
689
690 conn = connection_for_subscr(vsub);
691 if (!conn) {
692 vty_out(vty, "%% An active connection is required for %s %s%s",
693 argv[0], argv[1], VTY_NEWLINE);
694 vlr_subscr_put(vsub);
695 return CMD_WARNING;
696 }
697
698 gsm0414_tx_open_loop_cmd(conn);
699
700 return CMD_SUCCESS;
701}
702
Keithd32b6d12017-01-18 17:09:33 +0100703DEFUN(ena_subscr_expire,
704 ena_subscr_expire_cmd,
705 "subscriber " SUBSCR_TYPES " ID expire",
706 SUBSCR_HELP "Expire the subscriber Now\n")
707{
Keithd32b6d12017-01-18 17:09:33 +0100708 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte2483f1b2016-06-19 18:06:02 +0200709 struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],
710 argv[1]);
Keithd32b6d12017-01-18 17:09:33 +0100711
Harald Welte2483f1b2016-06-19 18:06:02 +0200712 if (!vsub) {
Keithd32b6d12017-01-18 17:09:33 +0100713 vty_out(vty, "%% No subscriber found for %s %s%s",
714 argv[0], argv[1], VTY_NEWLINE);
715 return CMD_WARNING;
716 }
717
Maxdcc193d2017-12-27 19:34:15 +0100718 if (vlr_subscr_expire(vsub))
Harald Welte2483f1b2016-06-19 18:06:02 +0200719 vty_out(vty, "%% VLR released subscriber %s%s",
720 vlr_subscr_name(vsub), VTY_NEWLINE);
Keithd32b6d12017-01-18 17:09:33 +0100721
Harald Welte2483f1b2016-06-19 18:06:02 +0200722 if (vsub->use_count > 1)
723 vty_out(vty, "%% Subscriber %s is still in use,"
724 " should be released soon%s",
725 vlr_subscr_name(vsub), VTY_NEWLINE);
726
727 vlr_subscr_put(vsub);
Keithd32b6d12017-01-18 17:09:33 +0100728 return CMD_SUCCESS;
729}
730
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200731#define A3A8_ALG_TYPES "(none|xor|comp128v1)"
Harald Welte28326062010-05-14 20:05:17 +0200732#define A3A8_ALG_HELP \
733 "Use No A3A8 algorithm\n" \
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200734 "Use XOR algorithm\n" \
Harald Welte28326062010-05-14 20:05:17 +0200735 "Use COMP128v1 algorithm\n"
Sylvain Munaut99792902009-12-27 19:30:46 +0100736
Harald Welteb4a84e12010-05-27 10:44:58 +0200737DEFUN(ena_subscr_a3a8,
738 ena_subscr_a3a8_cmd,
739 "subscriber " SUBSCR_TYPES " ID a3a8 " A3A8_ALG_TYPES " [KI]",
Harald Welted3cf85d2010-05-27 10:48:11 +0200740 SUBSCR_HELP "Set a3a8 parameters for the subscriber\n"
741 A3A8_ALG_HELP "Encryption Key Ki\n")
Sylvain Munaut99792902009-12-27 19:30:46 +0100742{
Harald Welte2483f1b2016-06-19 18:06:02 +0200743 vty_out(vty, "%% 'subscriber a3a8' is no longer supported.%s"
744 "%% This is now up to osmo-hlr.%s",
745 VTY_NEWLINE, VTY_NEWLINE);
746 return CMD_WARNING;
Sylvain Munaut99792902009-12-27 19:30:46 +0100747}
748
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100749DEFUN(subscriber_update,
750 subscriber_update_cmd,
751 "subscriber " SUBSCR_TYPES " ID update",
752 SUBSCR_HELP "Update the subscriber data from the dabase.\n")
753{
Harald Welte2483f1b2016-06-19 18:06:02 +0200754 vty_out(vty, "%% 'subscriber update' is no longer supported.%s",
755 VTY_NEWLINE);
756 return CMD_WARNING;
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +0100757}
758
Harald Weltea1482332009-11-14 10:08:40 +0100759static int scall_cbfn(unsigned int subsys, unsigned int signal,
760 void *handler_data, void *signal_data)
761{
762 struct scall_signal_data *sigdata = signal_data;
763 struct vty *vty = sigdata->data;
764
765 switch (signal) {
766 case S_SCALL_SUCCESS:
Neels Hofmeyre2f24d52017-05-08 15:12:20 +0200767 vty_out(vty, "%% silent call success%s", VTY_NEWLINE);
Harald Weltea1482332009-11-14 10:08:40 +0100768 break;
769 case S_SCALL_EXPIRED:
770 vty_out(vty, "%% silent call expired paging%s", VTY_NEWLINE);
771 break;
772 }
773 return 0;
774}
775
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200776DEFUN(show_stats,
777 show_stats_cmd,
778 "show statistics",
779 SHOW_STR "Display network statistics\n")
780{
Harald Weltedcccb182010-05-16 20:52:23 +0200781 struct gsm_network *net = gsmnet_from_vty(vty);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200782
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200783 vty_out(vty, "Location Update : %lu attach, %lu normal, %lu periodic%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200784 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_ATTACH].current,
785 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_NORMAL].current,
786 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_PERIODIC].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200787 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200788 vty_out(vty, "IMSI Detach Indications : %lu%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200789 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_DETACH].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200790 VTY_NEWLINE);
Neels Hofmeyr36891a72016-05-09 13:18:03 +0200791 vty_out(vty, "Location Updating Results: %lu completed, %lu failed%s",
792 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_COMPLETED].current,
793 net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_FAILED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200794 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200795 vty_out(vty, "SMS MO : %lu submitted, %lu no receiver%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200796 net->msc_ctrs->ctr[MSC_CTR_SMS_SUBMITTED].current,
797 net->msc_ctrs->ctr[MSC_CTR_SMS_NO_RECEIVER].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200798 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200799 vty_out(vty, "SMS MT : %lu delivered, %lu no memory, %lu other error%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200800 net->msc_ctrs->ctr[MSC_CTR_SMS_DELIVERED].current,
801 net->msc_ctrs->ctr[MSC_CTR_SMS_RP_ERR_MEM].current,
802 net->msc_ctrs->ctr[MSC_CTR_SMS_RP_ERR_OTHER].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200803 VTY_NEWLINE);
Harald Weltea29e43a2010-12-24 16:06:33 +0100804 vty_out(vty, "MO Calls : %lu setup, %lu connect ack%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200805 net->msc_ctrs->ctr[MSC_CTR_CALL_MO_SETUP].current,
806 net->msc_ctrs->ctr[MSC_CTR_CALL_MO_CONNECT_ACK].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200807 VTY_NEWLINE);
Harald Weltea29e43a2010-12-24 16:06:33 +0100808 vty_out(vty, "MT Calls : %lu setup, %lu connect%s",
Alexander Couzensb847a212016-08-02 11:34:11 +0200809 net->msc_ctrs->ctr[MSC_CTR_CALL_MT_SETUP].current,
810 net->msc_ctrs->ctr[MSC_CTR_CALL_MT_CONNECT].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +0200811 VTY_NEWLINE);
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200812 return CMD_SUCCESS;
813}
814
Holger Hans Peter Freyther81c0e252010-12-25 14:08:00 +0100815DEFUN(show_smsqueue,
816 show_smsqueue_cmd,
817 "show sms-queue",
818 SHOW_STR "Display SMSqueue statistics\n")
819{
820 struct gsm_network *net = gsmnet_from_vty(vty);
821
822 sms_queue_stats(net->sms_queue, vty);
823 return CMD_SUCCESS;
824}
825
Holger Hans Peter Freyther7a0e1662010-12-25 14:15:32 +0100826DEFUN(smsqueue_trigger,
827 smsqueue_trigger_cmd,
828 "sms-queue trigger",
829 "SMS Queue\n" "Trigger sending messages\n")
830{
831 struct gsm_network *net = gsmnet_from_vty(vty);
832
833 sms_queue_trigger(net->sms_queue);
834 return CMD_SUCCESS;
835}
Holger Hans Peter Freythere0ec3262010-04-15 11:28:14 +0200836
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100837DEFUN(smsqueue_max,
838 smsqueue_max_cmd,
839 "sms-queue max-pending <1-500>",
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200840 "SMS Queue\n" "SMS to deliver in parallel\n" "Amount\n")
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +0100841{
842 struct gsm_network *net = gsmnet_from_vty(vty);
843
844 sms_queue_set_max_pending(net->sms_queue, atoi(argv[0]));
845 return CMD_SUCCESS;
846}
847
Holger Hans Peter Freyther4dcc5e52010-12-25 14:38:30 +0100848DEFUN(smsqueue_clear,
849 smsqueue_clear_cmd,
850 "sms-queue clear",
851 "SMS Queue\n" "Clear the queue of pending SMS\n")
852{
853 struct gsm_network *net = gsmnet_from_vty(vty);
854
855 sms_queue_clear(net->sms_queue);
856 return CMD_SUCCESS;
857}
858
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100859DEFUN(smsqueue_fail,
860 smsqueue_fail_cmd,
861 "sms-queue max-failure <1-500>",
Holger Hans Peter Freyther3217fa22012-07-20 23:55:08 +0200862 "SMS Queue\n" "Maximum amount of delivery failures\n" "Amount\n")
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +0100863{
864 struct gsm_network *net = gsmnet_from_vty(vty);
865
866 sms_queue_set_max_failure(net->sms_queue, atoi(argv[0]));
867 return CMD_SUCCESS;
868}
869
Harald Welteab386e62011-09-01 18:18:43 +0200870
871DEFUN(cfg_mncc_int, cfg_mncc_int_cmd,
872 "mncc-int", "Configure internal MNCC handler")
873{
874 vty->node = MNCC_INT_NODE;
875
876 return CMD_SUCCESS;
877}
878
879static struct cmd_node mncc_int_node = {
880 MNCC_INT_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200881 "%s(config-mncc-int)# ",
Harald Welteab386e62011-09-01 18:18:43 +0200882 1,
883};
884
885static const struct value_string tchf_codec_names[] = {
886 { GSM48_CMODE_SPEECH_V1, "fr" },
887 { GSM48_CMODE_SPEECH_EFR, "efr" },
888 { GSM48_CMODE_SPEECH_AMR, "amr" },
889 { 0, NULL }
890};
891
892static const struct value_string tchh_codec_names[] = {
893 { GSM48_CMODE_SPEECH_V1, "hr" },
894 { GSM48_CMODE_SPEECH_AMR, "amr" },
895 { 0, NULL }
896};
897
898static int config_write_mncc_int(struct vty *vty)
899{
900 vty_out(vty, "mncc-int%s", VTY_NEWLINE);
901 vty_out(vty, " default-codec tch-f %s%s",
902 get_value_string(tchf_codec_names, mncc_int.def_codec[0]),
903 VTY_NEWLINE);
904 vty_out(vty, " default-codec tch-h %s%s",
905 get_value_string(tchh_codec_names, mncc_int.def_codec[1]),
906 VTY_NEWLINE);
907
908 return CMD_SUCCESS;
909}
910
911DEFUN(mnccint_def_codec_f,
912 mnccint_def_codec_f_cmd,
913 "default-codec tch-f (fr|efr|amr)",
914 "Set default codec\n" "Codec for TCH/F\n"
915 "Full-Rate\n" "Enhanced Full-Rate\n" "Adaptive Multi-Rate\n")
916{
917 mncc_int.def_codec[0] = get_string_value(tchf_codec_names, argv[0]);
918
919 return CMD_SUCCESS;
920}
921
922DEFUN(mnccint_def_codec_h,
923 mnccint_def_codec_h_cmd,
924 "default-codec tch-h (hr|amr)",
925 "Set default codec\n" "Codec for TCH/H\n"
926 "Half-Rate\n" "Adaptive Multi-Rate\n")
927{
928 mncc_int.def_codec[1] = get_string_value(tchh_codec_names, argv[0]);
929
930 return CMD_SUCCESS;
931}
932
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100933
934DEFUN(logging_fltr_imsi,
935 logging_fltr_imsi_cmd,
936 "logging filter imsi IMSI",
937 LOGGING_STR FILTER_STR
938 "Filter log messages by IMSI\n" "IMSI to be used as filter\n")
939{
Harald Welte2483f1b2016-06-19 18:06:02 +0200940 struct vlr_subscr *vlr_subscr;
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100941 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
942 struct log_target *tgt = osmo_log_vty2tgt(vty);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100943 const char *imsi = argv[0];
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100944
945 if (!tgt)
946 return CMD_WARNING;
947
Harald Welte2483f1b2016-06-19 18:06:02 +0200948 vlr_subscr = vlr_subscr_find_by_imsi(gsmnet->vlr, imsi);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100949
Neels Hofmeyr84da6b12016-05-20 21:59:55 +0200950 if (!vlr_subscr) {
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100951 vty_out(vty, "%%no subscriber with IMSI(%s)%s",
952 argv[0], VTY_NEWLINE);
953 return CMD_WARNING;
954 }
955
Harald Welte2483f1b2016-06-19 18:06:02 +0200956 log_set_filter_vlr_subscr(tgt, vlr_subscr);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100957 return CMD_SUCCESS;
958}
Holger Hans Peter Freyther925c57f2015-01-27 10:58:29 +0100959
Harald Welte2483f1b2016-06-19 18:06:02 +0200960static struct cmd_node hlr_node = {
961 HLR_NODE,
962 "%s(config-hlr)# ",
963 1,
964};
965
966DEFUN(cfg_hlr, cfg_hlr_cmd,
967 "hlr", "Configure connection to the HLR")
968{
969 vty->node = HLR_NODE;
970 return CMD_SUCCESS;
971}
972
973DEFUN(cfg_hlr_remote_ip, cfg_hlr_remote_ip_cmd, "remote-ip A.B.C.D",
974 "Remote GSUP address of the HLR\n"
975 "Remote GSUP address (default: " MSC_HLR_REMOTE_IP_DEFAULT ")")
976{
977 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
978 talloc_free((void*)gsmnet->gsup_server_addr_str);
979 gsmnet->gsup_server_addr_str = talloc_strdup(gsmnet, argv[0]);
980 return CMD_SUCCESS;
981}
982
983DEFUN(cfg_hlr_remote_port, cfg_hlr_remote_port_cmd, "remote-port <1-65535>",
984 "Remote GSUP port of the HLR\n"
985 "Remote GSUP port (default: " OSMO_STRINGIFY(MSC_HLR_REMOTE_PORT_DEFAULT) ")")
986{
987 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
988 gsmnet->gsup_server_port = atoi(argv[0]);
989 return CMD_SUCCESS;
990}
991
992static int config_write_hlr(struct vty *vty)
993{
994 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
995
996 vty_out(vty, "hlr%s", VTY_NEWLINE);
997 vty_out(vty, " remote-ip %s%s",
998 gsmnet->gsup_server_addr_str, VTY_NEWLINE);
999 vty_out(vty, " remote-port %u%s",
1000 gsmnet->gsup_server_port, VTY_NEWLINE);
1001 return CMD_SUCCESS;
1002}
1003
Harald Weltedcccb182010-05-16 20:52:23 +02001004int bsc_vty_init_extra(void)
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02001005{
Pablo Neira Ayusobbc5b992011-05-06 12:12:31 +02001006 osmo_signal_register_handler(SS_SCALL, scall_cbfn, NULL);
Harald Weltea1482332009-11-14 10:08:40 +01001007
Harald Welteb4d5b172010-05-12 16:10:35 +00001008 install_element_ve(&show_subscr_cmd);
1009 install_element_ve(&show_subscr_cache_cmd);
Harald Welte66a301e2018-01-24 16:48:17 +01001010 install_element_ve(&show_msc_conn_cmd);
1011 install_element_ve(&show_msc_transaction_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02001012
Harald Welteb4d5b172010-05-12 16:10:35 +00001013 install_element_ve(&sms_send_pend_cmd);
Stefan Sperling87cba1f2018-01-22 17:05:37 +01001014 install_element_ve(&sms_delete_expired_cmd);
Harald Welte98f9c752009-11-14 08:00:53 +01001015
Alexander Chemerisbd6d40f2013-10-04 23:54:17 +02001016 install_element_ve(&subscriber_create_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +00001017 install_element_ve(&subscriber_send_sms_cmd);
1018 install_element_ve(&subscriber_silent_sms_cmd);
1019 install_element_ve(&subscriber_silent_call_start_cmd);
1020 install_element_ve(&subscriber_silent_call_stop_cmd);
Holger Hans Peter Freytherdaf75342010-07-26 20:01:07 +08001021 install_element_ve(&subscriber_ussd_notify_cmd);
Harald Welte94307772017-06-12 01:52:27 +02001022 install_element_ve(&subscriber_mstest_close_cmd);
1023 install_element_ve(&subscriber_mstest_open_cmd);
Holger Hans Peter Freytherabd0cac2010-12-22 18:12:11 +01001024 install_element_ve(&subscriber_update_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +00001025 install_element_ve(&show_stats_cmd);
Holger Hans Peter Freyther81c0e252010-12-25 14:08:00 +01001026 install_element_ve(&show_smsqueue_cmd);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +01001027 install_element_ve(&logging_fltr_imsi_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02001028
Keithd32b6d12017-01-18 17:09:33 +01001029 install_element(ENABLE_NODE, &ena_subscr_expire_cmd);
Harald Welteb4a84e12010-05-27 10:44:58 +02001030 install_element(ENABLE_NODE, &ena_subscr_a3a8_cmd);
Holger Hans Peter Freyther7a0e1662010-12-25 14:15:32 +01001031 install_element(ENABLE_NODE, &smsqueue_trigger_cmd);
Holger Hans Peter Freyther3c6f6c22010-12-25 14:25:12 +01001032 install_element(ENABLE_NODE, &smsqueue_max_cmd);
Holger Hans Peter Freyther4dcc5e52010-12-25 14:38:30 +01001033 install_element(ENABLE_NODE, &smsqueue_clear_cmd);
Holger Hans Peter Freyther994dcbb2010-12-25 14:50:50 +01001034 install_element(ENABLE_NODE, &smsqueue_fail_cmd);
Nico Goldeb62b1232011-02-22 17:54:47 +01001035 install_element(ENABLE_NODE, &subscriber_send_pending_sms_cmd);
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02001036
Harald Welteab386e62011-09-01 18:18:43 +02001037 install_element(CONFIG_NODE, &cfg_mncc_int_cmd);
1038 install_node(&mncc_int_node, config_write_mncc_int);
Harald Welteab386e62011-09-01 18:18:43 +02001039 install_element(MNCC_INT_NODE, &mnccint_def_codec_f_cmd);
1040 install_element(MNCC_INT_NODE, &mnccint_def_codec_h_cmd);
1041
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +01001042 install_element(CFG_LOG_NODE, &logging_fltr_imsi_cmd);
Harald Welteb02fc1e2013-02-12 11:15:49 +01001043
Harald Welte2483f1b2016-06-19 18:06:02 +02001044 install_element(CONFIG_NODE, &cfg_hlr_cmd);
1045 install_node(&hlr_node, config_write_hlr);
1046 install_element(HLR_NODE, &cfg_hlr_remote_ip_cmd);
1047 install_element(HLR_NODE, &cfg_hlr_remote_port_cmd);
Holger Hans Peter Freyther925c57f2015-01-27 10:58:29 +01001048
Holger Hans Peter Freythercfa90d42009-08-10 10:17:50 +02001049 return 0;
1050}