blob: 8edcbf39090158809fbd53718c81c01b72909dee [file] [log] [blame]
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +08001/* Osmo BSC VTY Configuration */
Holger Hans Peter Freytherd6332802015-04-05 19:46:20 +02002/* (C) 2009-2015 by Holger Hans Peter Freyther
Holger Hans Peter Freyther98258db2014-02-22 10:30:32 +01003 * (C) 2009-2014 by On-Waves
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +08004 * 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 Freythercacbc732010-06-30 14:59:23 +08009 * (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 Freythercacbc732010-06-30 14:59:23 +080015 *
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 Freythercacbc732010-06-30 14:59:23 +080018 *
19 */
20
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080021#include <openbsc/gsm_data.h>
Holger Hans Peter Freyther98258db2014-02-22 10:30:32 +010022#include <openbsc/osmo_bsc.h>
Neels Hofmeyra42855f2017-02-23 21:49:55 +010023#include <openbsc/bsc_msc_data.h>
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080024#include <openbsc/vty.h>
Neels Hofmeyr6d804b12017-02-18 22:20:46 +010025#include <openbsc/bsc_subscriber.h>
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +010026#include <openbsc/debug.h>
Holger Hans Peter Freytherd6332802015-04-05 19:46:20 +020027#include <openbsc/bsc_msg_filter.h>
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080028
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010029#include <osmocom/core/talloc.h>
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +010030#include <osmocom/vty/logging.h>
Philipp Maierfbf66102017-04-09 12:32:51 +020031#include <osmocom/sccp/sccp_types.h>
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080032
Daniel Willmann7d109832012-05-14 18:43:23 +020033#include <time.h>
34
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +010035
36#define IPA_STR "IP.ACCESS specific\n"
37
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080038extern struct gsm_network *bsc_gsmnet;
39
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020040static struct osmo_bsc_data *osmo_bsc_data(struct vty *vty)
41{
42 return bsc_gsmnet->bsc_data;
43}
44
Neels Hofmeyra369e242017-02-23 21:57:23 +010045static struct bsc_msc_data *bsc_msc_data(struct vty *vty)
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080046{
Neels Hofmeyr56ea30f2016-03-26 21:35:11 +010047 return vty->index;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080048}
49
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020050static struct cmd_node bsc_node = {
51 BSC_NODE,
Jacob Erlbeck0b4f1b92013-08-30 18:33:58 +020052 "%s(config-bsc)# ",
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020053 1,
54};
55
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080056static struct cmd_node msc_node = {
57 MSC_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020058 "%s(config-msc)# ",
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080059 1,
60};
61
62DEFUN(cfg_net_msc, cfg_net_msc_cmd,
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020063 "msc [<0-1000>]", "Configure MSC details\n" "MSC connection to configure\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080064{
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020065 int index = argc == 1 ? atoi(argv[0]) : 0;
Neels Hofmeyra369e242017-02-23 21:57:23 +010066 struct bsc_msc_data *msc;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080067
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +020068 msc = osmo_msc_data_alloc(bsc_gsmnet, index);
69 if (!msc) {
70 vty_out(vty, "%%Failed to allocate MSC data.%s", VTY_NEWLINE);
71 return CMD_WARNING;
72 }
73
Neels Hofmeyr56ea30f2016-03-26 21:35:11 +010074 vty->index = msc;
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +020075 vty->node = MSC_NODE;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080076 return CMD_SUCCESS;
77}
78
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020079DEFUN(cfg_net_bsc, cfg_net_bsc_cmd,
80 "bsc", "Configure BSC\n")
81{
82 vty->node = BSC_NODE;
83 return CMD_SUCCESS;
84}
85
Neels Hofmeyra369e242017-02-23 21:57:23 +010086static void write_msc_amr_options(struct vty *vty, struct bsc_msc_data *msc)
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +020087{
88#define WRITE_AMR(vty, msc, name, var) \
89 vty_out(vty, " amr-config %s %s%s", \
90 name, msc->amr_conf.var ? "allowed" : "forbidden", \
91 VTY_NEWLINE);
92
93 WRITE_AMR(vty, msc, "12_2k", m12_2);
94 WRITE_AMR(vty, msc, "10_2k", m10_2);
95 WRITE_AMR(vty, msc, "7_95k", m7_95);
96 WRITE_AMR(vty, msc, "7_40k", m7_40);
97 WRITE_AMR(vty, msc, "6_70k", m6_70);
98 WRITE_AMR(vty, msc, "5_90k", m5_90);
99 WRITE_AMR(vty, msc, "5_15k", m5_15);
100 WRITE_AMR(vty, msc, "4_75k", m4_75);
101#undef WRITE_AMR
102}
103
Neels Hofmeyra369e242017-02-23 21:57:23 +0100104static void write_msc(struct vty *vty, struct bsc_msc_data *msc)
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800105{
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200106 struct bsc_msc_dest *dest;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800107
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200108 vty_out(vty, "msc %d%s", msc->nr, VTY_NEWLINE);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200109 if (msc->bsc_token)
110 vty_out(vty, " token %s%s", msc->bsc_token, VTY_NEWLINE);
Holger Hans Peter Freythere2ac6b72015-06-08 18:02:10 +0200111 if (msc->bsc_key_present)
112 vty_out(vty, " auth-key %s%s",
113 osmo_hexdump(msc->bsc_key, sizeof(msc->bsc_key)), VTY_NEWLINE);
Holger Hans Peter Freyther1e365472015-07-13 11:06:10 +0200114 if (msc->core_mnc != -1)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200115 vty_out(vty, " core-mobile-network-code %d%s",
Holger Hans Peter Freyther1e365472015-07-13 11:06:10 +0200116 msc->core_mnc, VTY_NEWLINE);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200117 if (msc->core_mcc != -1)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200118 vty_out(vty, " core-mobile-country-code %d%s",
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200119 msc->core_mcc, VTY_NEWLINE);
Holger Hans Peter Freyther32dd2f32015-04-01 18:15:48 +0200120 if (msc->core_lac != -1)
121 vty_out(vty, " core-location-area-code %d%s",
122 msc->core_lac, VTY_NEWLINE);
123 if (msc->core_ci != -1)
124 vty_out(vty, " core-cell-identity %d%s",
125 msc->core_ci, VTY_NEWLINE);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200126 vty_out(vty, " ip.access rtp-base %d%s", msc->rtp_base, VTY_NEWLINE);
Holger Hans Peter Freytherdb64f2e2014-10-29 10:06:15 +0100127
128 if (msc->ping_timeout == -1)
129 vty_out(vty, " no timeout-ping%s", VTY_NEWLINE);
130 else {
131 vty_out(vty, " timeout-ping %d%s", msc->ping_timeout, VTY_NEWLINE);
132 vty_out(vty, " timeout-pong %d%s", msc->pong_timeout, VTY_NEWLINE);
133 if (msc->advanced_ping)
134 vty_out(vty, " timeout-ping advanced%s", VTY_NEWLINE);
135 else
136 vty_out(vty, " no timeout-ping advanced%s", VTY_NEWLINE);
137 }
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200138
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200139 if (msc->ussd_welcome_txt)
140 vty_out(vty, " bsc-welcome-text %s%s", msc->ussd_welcome_txt, VTY_NEWLINE);
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200141 else
142 vty_out(vty, " no bsc-welcome-text%s", VTY_NEWLINE);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800143
Jacob Erlbeck1b894022013-08-28 10:16:54 +0200144 if (msc->ussd_msc_lost_txt && msc->ussd_msc_lost_txt[0])
145 vty_out(vty, " bsc-msc-lost-text %s%s", msc->ussd_msc_lost_txt, VTY_NEWLINE);
146 else
147 vty_out(vty, " no bsc-msc-lost-text%s", VTY_NEWLINE);
148
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200149 if (msc->ussd_grace_txt && msc->ussd_grace_txt[0])
150 vty_out(vty, " bsc-grace-text %s%s", msc->ussd_grace_txt, VTY_NEWLINE);
151 else
152 vty_out(vty, " no bsc-grace-text%s", VTY_NEWLINE);
153
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200154 if (msc->audio_length != 0) {
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100155 int i;
156
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200157 vty_out(vty, " codec-list ");
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200158 for (i = 0; i < msc->audio_length; ++i) {
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100159 if (i != 0)
Harald Welte22ce5982013-06-19 15:32:27 +0200160 vty_out(vty, " ");
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100161
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200162 if (msc->audio_support[i]->hr)
163 vty_out(vty, "hr%.1u", msc->audio_support[i]->ver);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100164 else
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200165 vty_out(vty, "fr%.1u", msc->audio_support[i]->ver);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100166 }
167 vty_out(vty, "%s", VTY_NEWLINE);
168
169 }
170
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200171 llist_for_each_entry(dest, &msc->dests, list)
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200172 vty_out(vty, " dest %s %d %d%s", dest->ip, dest->port,
173 dest->dscp, VTY_NEWLINE);
Holger Hans Peter Freythercbaa8802011-06-08 16:28:04 +0200174
175 vty_out(vty, " type %s%s", msc->type == MSC_CON_TYPE_NORMAL ?
176 "normal" : "local", VTY_NEWLINE);
Holger Hans Peter Freyther31b245b2011-06-08 19:27:15 +0200177 vty_out(vty, " allow-emergency %s%s", msc->allow_emerg ?
178 "allow" : "deny", VTY_NEWLINE);
Holger Hans Peter Freytherd5edc4f2011-06-09 21:54:08 +0200179
180 if (msc->local_pref)
181 vty_out(vty, " local-prefix %s%s", msc->local_pref, VTY_NEWLINE);
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +0200182
Holger Hans Peter Freytherd6332802015-04-05 19:46:20 +0200183 if (msc->acc_lst_name)
184 vty_out(vty, " access-list-name %s%s", msc->acc_lst_name, VTY_NEWLINE);
185
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +0200186 /* write amr options */
187 write_msc_amr_options(vty, msc);
Philipp Maierfbf66102017-04-09 12:32:51 +0200188
189 /* write sccp connection configuration */
190 if (msc->a.bsc_addr_name) {
191 vty_out(vty, " bsc-addr %s%s",
192 msc->a.bsc_addr_name, VTY_NEWLINE);
193 }
194 if (msc->a.msc_addr_name) {
195 vty_out(vty, " msc-addr %s%s",
196 msc->a.msc_addr_name, VTY_NEWLINE);
197 }
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +0200198}
199
200static int config_write_msc(struct vty *vty)
201{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100202 struct bsc_msc_data *msc;
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +0200203 struct osmo_bsc_data *bsc = osmo_bsc_data(vty);
204
205 llist_for_each_entry(msc, &bsc->mscs, entry)
206 write_msc(vty, msc);
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200207
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200208 return CMD_SUCCESS;
209}
210
211static int config_write_bsc(struct vty *vty)
212{
213 struct osmo_bsc_data *bsc = osmo_bsc_data(vty);
214
215 vty_out(vty, "bsc%s", VTY_NEWLINE);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200216 if (bsc->mid_call_txt)
217 vty_out(vty, " mid-call-text %s%s", bsc->mid_call_txt, VTY_NEWLINE);
218 vty_out(vty, " mid-call-timeout %d%s", bsc->mid_call_timeout, VTY_NEWLINE);
219 if (bsc->rf_ctrl_name)
220 vty_out(vty, " bsc-rf-socket %s%s",
221 bsc->rf_ctrl_name, VTY_NEWLINE);
222
Holger Hans Peter Freyther2a896072011-08-16 19:47:39 +0200223 if (bsc->auto_off_timeout != -1)
224 vty_out(vty, " bsc-auto-rf-off %d%s",
225 bsc->auto_off_timeout, VTY_NEWLINE);
226
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200227 if (bsc->ussd_no_msc_txt && bsc->ussd_no_msc_txt[0])
228 vty_out(vty, " missing-msc-text %s%s", bsc->ussd_no_msc_txt, VTY_NEWLINE);
229 else
230 vty_out(vty, " no missing-msc-text%s", VTY_NEWLINE);
Holger Hans Peter Freytherd6332802015-04-05 19:46:20 +0200231 if (bsc->acc_lst_name)
232 vty_out(vty, " access-list-name %s%s", bsc->acc_lst_name, VTY_NEWLINE);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200233
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800234 return CMD_SUCCESS;
235}
236
Holger Hans Peter Freyther5b848f32010-11-03 13:11:14 +0100237DEFUN(cfg_net_bsc_token,
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800238 cfg_net_bsc_token_cmd,
239 "token TOKEN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100240 "A token for the BSC to be sent to the MSC\n" "A token\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800241{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100242 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800243
Harald Welte4a824ca2017-05-29 13:54:27 +0200244 osmo_talloc_replace_string(osmo_bsc_data(vty), &data->bsc_token, argv[0]);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800245 return CMD_SUCCESS;
246}
247
Holger Hans Peter Freythere2ac6b72015-06-08 18:02:10 +0200248DEFUN(cfg_net_bsc_key,
249 cfg_net_bsc_key_cmd,
250 "auth-key KEY",
251 "Authentication (secret) key configuration\n"
252 "Security key\n")
253{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100254 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freythere2ac6b72015-06-08 18:02:10 +0200255
256 osmo_hexparse(argv[0], data->bsc_key, sizeof(data->bsc_key));
257 data->bsc_key_present = 1;
258 return CMD_SUCCESS;
259}
260
261DEFUN(cfg_net_no_bsc_key, cfg_net_bsc_no_key_cmd,
262 "no auth-key",
263 NO_STR "Authentication (secret) key configuration\n")
264{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100265 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freythere2ac6b72015-06-08 18:02:10 +0200266
267 memset(data->bsc_key, 0, sizeof(data->bsc_key));
268 data->bsc_key_present = 0;
269 return CMD_SUCCESS;
270}
271
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100272DEFUN(cfg_net_bsc_ncc,
273 cfg_net_bsc_ncc_cmd,
Holger Hans Peter Freyther6e1a6762011-02-10 11:37:13 +0100274 "core-mobile-network-code <1-999>",
Holger Hans Peter Freyther1e365472015-07-13 11:06:10 +0200275 "Use this network code for the core network\n" "MNC value\n")
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100276{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100277 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther1e365472015-07-13 11:06:10 +0200278 data->core_mnc = atoi(argv[0]);
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100279 return CMD_SUCCESS;
280}
281
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100282DEFUN(cfg_net_bsc_mcc,
283 cfg_net_bsc_mcc_cmd,
Holger Hans Peter Freyther6e1a6762011-02-10 11:37:13 +0100284 "core-mobile-country-code <1-999>",
Holger Hans Peter Freyther768580b2014-07-08 12:48:49 +0200285 "Use this country code for the core network\n" "MCC value\n")
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100286{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100287 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100288 data->core_mcc = atoi(argv[0]);
289 return CMD_SUCCESS;
290}
291
Holger Hans Peter Freyther32dd2f32015-04-01 18:15:48 +0200292DEFUN(cfg_net_bsc_lac,
293 cfg_net_bsc_lac_cmd,
294 "core-location-area-code <0-65535>",
295 "Use this location area code for the core network\n" "LAC value\n")
296{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100297 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther32dd2f32015-04-01 18:15:48 +0200298 data->core_lac = atoi(argv[0]);
299 return CMD_SUCCESS;
300}
301
302DEFUN(cfg_net_bsc_ci,
303 cfg_net_bsc_ci_cmd,
304 "core-cell-identity <0-65535>",
305 "Use this cell identity for the core network\n" "CI value\n")
306{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100307 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther32dd2f32015-04-01 18:15:48 +0200308 data->core_ci = atoi(argv[0]);
309 return CMD_SUCCESS;
310}
311
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +0100312DEFUN(cfg_net_bsc_rtp_base,
313 cfg_net_bsc_rtp_base_cmd,
314 "ip.access rtp-base <1-65000>",
315 IPA_STR
316 "Set the rtp-base port for the RTP stream\n"
317 "Port number\n")
318{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100319 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +0100320 data->rtp_base = atoi(argv[0]);
321 return CMD_SUCCESS;
322}
323
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100324DEFUN(cfg_net_bsc_codec_list,
325 cfg_net_bsc_codec_list_cmd,
326 "codec-list .LIST",
327 "Set the allowed audio codecs\n"
Holger Hans Peter Freyther5cb480a2016-01-15 15:05:42 +0100328 "List of audio codecs, e.g. fr3 fr1 hr3\n")
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100329{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100330 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100331 int saw_fr, saw_hr;
332 int i;
333
334 saw_fr = saw_hr = 0;
335
336 /* free the old list... if it exists */
337 if (data->audio_support) {
338 talloc_free(data->audio_support);
339 data->audio_support = NULL;
340 data->audio_length = 0;
341 }
342
343 /* create a new array */
344 data->audio_support =
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200345 talloc_zero_array(osmo_bsc_data(vty), struct gsm_audio_support *, argc);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100346 data->audio_length = argc;
347
348 for (i = 0; i < argc; ++i) {
349 /* check for hrX or frX */
350 if (strlen(argv[i]) != 3
351 || argv[i][1] != 'r'
352 || (argv[i][0] != 'h' && argv[i][0] != 'f')
353 || argv[i][2] < 0x30
354 || argv[i][2] > 0x39)
355 goto error;
356
357 data->audio_support[i] = talloc_zero(data->audio_support,
358 struct gsm_audio_support);
359 data->audio_support[i]->ver = atoi(argv[i] + 2);
360
361 if (strncmp("hr", argv[i], 2) == 0) {
362 data->audio_support[i]->hr = 1;
363 saw_hr = 1;
364 } else if (strncmp("fr", argv[i], 2) == 0) {
365 data->audio_support[i]->hr = 0;
366 saw_fr = 1;
367 }
368
369 if (saw_hr && saw_fr) {
370 vty_out(vty, "Can not have full-rate and half-rate codec.%s",
371 VTY_NEWLINE);
372 return CMD_ERR_INCOMPLETE;
373 }
374 }
375
376 return CMD_SUCCESS;
377
378error:
379 vty_out(vty, "Codec name must be hrX or frX. Was '%s'%s",
380 argv[i], VTY_NEWLINE);
381 return CMD_ERR_INCOMPLETE;
382}
383
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200384DEFUN(cfg_net_msc_dest,
385 cfg_net_msc_dest_cmd,
386 "dest A.B.C.D <1-65000> <0-255>",
387 "Add a destination to a MUX/MSC\n"
388 "IP Address\n" "Port\n" "DSCP\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800389{
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200390 struct bsc_msc_dest *dest;
Neels Hofmeyra369e242017-02-23 21:57:23 +0100391 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800392
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200393 dest = talloc_zero(osmo_bsc_data(vty), struct bsc_msc_dest);
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200394 if (!dest) {
395 vty_out(vty, "%%Failed to create structure.%s", VTY_NEWLINE);
396 return CMD_WARNING;
397 }
398
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200399 dest->ip = talloc_strdup(dest, argv[0]);
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200400 if (!dest->ip) {
401 vty_out(vty, "%%Failed to copy dest ip.%s", VTY_NEWLINE);
402 talloc_free(dest);
403 return CMD_WARNING;
404 }
405
406 dest->port = atoi(argv[1]);
407 dest->dscp = atoi(argv[2]);
408 llist_add_tail(&dest->list, &data->dests);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800409 return CMD_SUCCESS;
410}
411
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200412DEFUN(cfg_net_msc_no_dest,
413 cfg_net_msc_no_dest_cmd,
414 "no dest A.B.C.D <1-65000> <0-255>",
415 NO_STR "Remove a destination to a MUX/MSC\n"
416 "IP Address\n" "Port\n" "DSCP\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800417{
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200418 struct bsc_msc_dest *dest, *tmp;
Neels Hofmeyra369e242017-02-23 21:57:23 +0100419 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800420
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200421 int port = atoi(argv[1]);
422 int dscp = atoi(argv[2]);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800423
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200424 llist_for_each_entry_safe(dest, tmp, &data->dests, list) {
425 if (port != dest->port || dscp != dest->dscp
426 || strcmp(dest->ip, argv[0]) != 0)
427 continue;
428
429 llist_del(&dest->list);
430 talloc_free(dest);
431 }
432
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800433 return CMD_SUCCESS;
434}
435
Holger Hans Peter Freytherdb64f2e2014-10-29 10:06:15 +0100436DEFUN(cfg_net_msc_no_ping_time,
437 cfg_net_msc_no_ping_time_cmd,
438 "no timeout-ping",
439 NO_STR "Disable the ping/pong handling on A-link\n")
440{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100441 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freytherdb64f2e2014-10-29 10:06:15 +0100442 data->ping_timeout = -1;
443 return CMD_SUCCESS;
444}
445
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800446DEFUN(cfg_net_msc_ping_time,
447 cfg_net_msc_ping_time_cmd,
Holger Hans Peter Freyther47c624b2014-09-30 16:43:30 +0200448 "timeout-ping <1-2147483647>",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100449 "Set the PING interval, negative for not sending PING\n"
450 "Timeout in seconds\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800451{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100452 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800453 data->ping_timeout = atoi(argv[0]);
454 return CMD_SUCCESS;
455}
456
457DEFUN(cfg_net_msc_pong_time,
458 cfg_net_msc_pong_time_cmd,
Holger Hans Peter Freyther47c624b2014-09-30 16:43:30 +0200459 "timeout-pong <1-2147483647>",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100460 "Set the time to wait for a PONG\n" "Timeout in seconds\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800461{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100462 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800463 data->pong_timeout = atoi(argv[0]);
464 return CMD_SUCCESS;
465}
466
Holger Hans Peter Freyther56cb7292014-09-02 17:28:40 +0200467DEFUN(cfg_net_msc_advanced_ping,
468 cfg_net_msc_advanced_ping_cmd,
469 "timeout-ping advanced",
470 "Ping timeout handling\nEnable advanced mode during SCCP\n")
471{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100472 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freytherdb64f2e2014-10-29 10:06:15 +0100473
474 if (data->ping_timeout == -1) {
475 vty_out(vty, "%%ping handling is disabled. Enable it first.%s",
476 VTY_NEWLINE);
477 return CMD_WARNING;
478 }
479
Holger Hans Peter Freyther56cb7292014-09-02 17:28:40 +0200480 data->advanced_ping = 1;
481 return CMD_SUCCESS;
482}
483
484DEFUN(cfg_no_net_msc_advanced_ping,
485 cfg_no_net_msc_advanced_ping_cmd,
486 "no timeout-ping advanced",
487 NO_STR "Ping timeout handling\nEnable advanced mode during SCCP\n")
488{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100489 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther56cb7292014-09-02 17:28:40 +0200490 data->advanced_ping = 0;
491 return CMD_SUCCESS;
492}
493
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200494DEFUN(cfg_net_msc_welcome_ussd,
495 cfg_net_msc_welcome_ussd_cmd,
496 "bsc-welcome-text .TEXT",
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200497 "Set the USSD notification to be sent\n" "Text to be sent\n")
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200498{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100499 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200500 char *str = argv_concat(argv, argc, 0);
501 if (!str)
502 return CMD_WARNING;
503
Harald Welte4a824ca2017-05-29 13:54:27 +0200504 osmo_talloc_replace_string(osmo_bsc_data(vty), &data->ussd_welcome_txt, str);
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200505 talloc_free(str);
506 return CMD_SUCCESS;
507}
508
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200509DEFUN(cfg_net_msc_no_welcome_ussd,
510 cfg_net_msc_no_welcome_ussd_cmd,
511 "no bsc-welcome-text",
512 NO_STR "Clear the USSD notification to be sent\n")
513{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100514 struct bsc_msc_data *data = bsc_msc_data(vty);
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200515
516 talloc_free(data->ussd_welcome_txt);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200517 data->ussd_welcome_txt = NULL;
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200518
519 return CMD_SUCCESS;
520}
521
Jacob Erlbeck1b894022013-08-28 10:16:54 +0200522DEFUN(cfg_net_msc_lost_ussd,
523 cfg_net_msc_lost_ussd_cmd,
524 "bsc-msc-lost-text .TEXT",
525 "Set the USSD notification to be sent on MSC connection loss\n" "Text to be sent\n")
526{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100527 struct bsc_msc_data *data = bsc_msc_data(vty);
Jacob Erlbeck1b894022013-08-28 10:16:54 +0200528 char *str = argv_concat(argv, argc, 0);
529 if (!str)
530 return CMD_WARNING;
531
Harald Welte4a824ca2017-05-29 13:54:27 +0200532 osmo_talloc_replace_string(osmo_bsc_data(vty), &data->ussd_msc_lost_txt, str);
Jacob Erlbeck1b894022013-08-28 10:16:54 +0200533 talloc_free(str);
534 return CMD_SUCCESS;
535}
536
537DEFUN(cfg_net_msc_no_lost_ussd,
538 cfg_net_msc_no_lost_ussd_cmd,
539 "no bsc-msc-lost-text",
540 NO_STR "Clear the USSD notification to be sent on MSC connection loss\n")
541{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100542 struct bsc_msc_data *data = bsc_msc_data(vty);
Jacob Erlbeck1b894022013-08-28 10:16:54 +0200543
544 talloc_free(data->ussd_msc_lost_txt);
545 data->ussd_msc_lost_txt = 0;
546
547 return CMD_SUCCESS;
548}
549
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200550DEFUN(cfg_net_msc_grace_ussd,
551 cfg_net_msc_grace_ussd_cmd,
552 "bsc-grace-text .TEXT",
553 "Set the USSD notification to be sent when the MSC has entered the grace period\n" "Text to be sent\n")
554{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100555 struct bsc_msc_data *data = bsc_msc_data(vty);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200556 char *str = argv_concat(argv, argc, 0);
557 if (!str)
558 return CMD_WARNING;
559
Harald Welte4a824ca2017-05-29 13:54:27 +0200560 osmo_talloc_replace_string(osmo_bsc_data(vty), &data->ussd_grace_txt, str);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200561 talloc_free(str);
562 return CMD_SUCCESS;
563}
564
565DEFUN(cfg_net_msc_no_grace_ussd,
566 cfg_net_msc_no_grace_ussd_cmd,
567 "no bsc-grace-text",
568 NO_STR "Clear the USSD notification to be sent when the MSC has entered the grace period\n")
569{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100570 struct bsc_msc_data *data = bsc_msc_data(vty);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200571
572 talloc_free(data->ussd_grace_txt);
573 data->ussd_grace_txt = NULL;
574
575 return CMD_SUCCESS;
576}
577
578DEFUN(cfg_net_bsc_missing_msc_ussd,
579 cfg_net_bsc_missing_msc_ussd_cmd,
580 "missing-msc-text .TEXT",
581 "Set the USSD notification to be send when a MSC has not been found.\n" "Text to be sent\n")
582{
583 struct osmo_bsc_data *data = osmo_bsc_data(vty);
584 char *txt = argv_concat(argv, argc, 0);
585 if (!txt)
586 return CMD_WARNING;
587
Harald Welte4a824ca2017-05-29 13:54:27 +0200588 osmo_talloc_replace_string(data, &data->ussd_no_msc_txt, txt);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200589 talloc_free(txt);
590 return CMD_SUCCESS;
591}
592
593DEFUN(cfg_net_bsc_no_missing_msc_text,
594 cfg_net_bsc_no_missing_msc_text_cmd,
595 "no missing-msc-text",
596 NO_STR "Clear the USSD notification to be send when a MSC has not been found.\n")
597{
598 struct osmo_bsc_data *data = osmo_bsc_data(vty);
599
600 talloc_free(data->ussd_no_msc_txt);
601 data->ussd_no_msc_txt = 0;
602
603 return CMD_SUCCESS;
604}
605
606
Holger Hans Peter Freythercbaa8802011-06-08 16:28:04 +0200607DEFUN(cfg_net_msc_type,
608 cfg_net_msc_type_cmd,
609 "type (normal|local)",
610 "Select the MSC type\n"
611 "Plain GSM MSC\n" "Special MSC for local call routing\n")
612{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100613 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freythercbaa8802011-06-08 16:28:04 +0200614
615 if (strcmp(argv[0], "normal") == 0)
616 data->type = MSC_CON_TYPE_NORMAL;
617 else if (strcmp(argv[0], "local") == 0)
618 data->type = MSC_CON_TYPE_LOCAL;
619
620 return CMD_SUCCESS;
621}
622
Holger Hans Peter Freyther31b245b2011-06-08 19:27:15 +0200623DEFUN(cfg_net_msc_emerg,
624 cfg_net_msc_emerg_cmd,
625 "allow-emergency (allow|deny)",
626 "Allow CM ServiceRequests with type emergency\n"
627 "Allow\n" "Deny\n")
628{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100629 struct bsc_msc_data *data = bsc_msc_data(vty);
Holger Hans Peter Freyther31b245b2011-06-08 19:27:15 +0200630 data->allow_emerg = strcmp("allow", argv[0]) == 0;
631 return CMD_SUCCESS;
632}
633
Holger Hans Peter Freytherd5edc4f2011-06-09 21:54:08 +0200634DEFUN(cfg_net_msc_local_prefix,
635 cfg_net_msc_local_prefix_cmd,
636 "local-prefix REGEXP",
637 "Prefix for local numbers\n" "REGEXP used\n")
638{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100639 struct bsc_msc_data *msc = bsc_msc_data(vty);
Holger Hans Peter Freytherd5edc4f2011-06-09 21:54:08 +0200640
641 if (gsm_parse_reg(msc, &msc->local_pref_reg, &msc->local_pref, argc, argv) != 0) {
642 vty_out(vty, "%%Failed to parse the regexp: '%s'%s",
643 argv[0], VTY_NEWLINE);
644 return CMD_WARNING;
645 }
646
647 return CMD_SUCCESS;
648}
649
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +0200650#define AMR_CONF_STR "AMR Multirate Configuration\n"
651#define AMR_COMMAND(name) \
652 DEFUN(cfg_net_msc_amr_##name, \
653 cfg_net_msc_amr_##name##_cmd, \
654 "amr-config " #name "k (allowed|forbidden)", \
655 AMR_CONF_STR "Bitrate\n" "Allowed\n" "Forbidden\n") \
656{ \
Neels Hofmeyra369e242017-02-23 21:57:23 +0100657 struct bsc_msc_data *msc = bsc_msc_data(vty); \
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +0200658 \
659 msc->amr_conf.m##name = strcmp(argv[0], "allowed") == 0; \
660 return CMD_SUCCESS; \
661}
662
663AMR_COMMAND(12_2)
664AMR_COMMAND(10_2)
665AMR_COMMAND(7_95)
666AMR_COMMAND(7_40)
667AMR_COMMAND(6_70)
668AMR_COMMAND(5_90)
669AMR_COMMAND(5_15)
670AMR_COMMAND(4_75)
671
Holger Hans Peter Freytherd6332802015-04-05 19:46:20 +0200672DEFUN(cfg_msc_acc_lst_name,
673 cfg_msc_acc_lst_name_cmd,
674 "access-list-name NAME",
675 "Set the name of the access list to use.\n"
676 "The name of the to be used access list.")
677{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100678 struct bsc_msc_data *msc = bsc_msc_data(vty);
Holger Hans Peter Freytherd6332802015-04-05 19:46:20 +0200679
Harald Welte4a824ca2017-05-29 13:54:27 +0200680 osmo_talloc_replace_string(msc, &msc->acc_lst_name, argv[0]);
Holger Hans Peter Freytherd6332802015-04-05 19:46:20 +0200681 return CMD_SUCCESS;
682}
683
684DEFUN(cfg_msc_no_acc_lst_name,
685 cfg_msc_no_acc_lst_name_cmd,
686 "no access-list-name",
687 NO_STR "Remove the access list from the NAT.\n")
688{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100689 struct bsc_msc_data *msc = bsc_msc_data(vty);
Holger Hans Peter Freytherd6332802015-04-05 19:46:20 +0200690
691 if (msc->acc_lst_name) {
692 talloc_free(msc->acc_lst_name);
693 msc->acc_lst_name = NULL;
694 }
695
696 return CMD_SUCCESS;
697}
698
Philipp Maierfbf66102017-04-09 12:32:51 +0200699/* Make sure only standard SSN numbers are used. If no ssn number is
700 * configured, silently apply the default SSN */
701static void enforce_standard_ssn(struct vty *vty, struct osmo_sccp_addr *addr)
702{
703 if (addr->presence & OSMO_SCCP_ADDR_T_SSN) {
704 if (addr->ssn != SCCP_SSN_BSSAP)
705 vty_out(vty,
706 "setting an SSN (%u) different from the standard (%u) is not allowd, will use standard SSN for address: %s%s",
707 addr->ssn, SCCP_SSN_BSSAP, osmo_sccp_addr_dump(addr), VTY_NEWLINE);
708 }
709
710 addr->presence |= OSMO_SCCP_ADDR_T_SSN;
711 addr->ssn = SCCP_SSN_BSSAP;
712}
713
714DEFUN(cfg_msc_cs7_bsc_addr,
715 cfg_msc_cs7_bsc_addr_cmd,
716 "bsc-addr NAME",
717 "Calling Address (local address of this BSC)\n" "SCCP address name\n")
718{
719 struct bsc_msc_data *msc = bsc_msc_data(vty);
720 const char *bsc_addr_name = argv[0];
721 struct osmo_ss7_instance *ss7;
722
723 ss7 = osmo_sccp_addr_by_name(&msc->a.bsc_addr, bsc_addr_name);
724 if (!ss7) {
725 vty_out(vty, "No sccp address %s found%s", bsc_addr_name,
726 VTY_NEWLINE);
727 return CMD_WARNING;
728 }
729
730 /* Prevent mixing addresses from different CS7/SS7 instances */
731 if (msc->a.cs7_instance_valid) {
732 if (msc->a.cs7_instance != ss7->cfg.id) {
733 vty_out(vty,
734 "SCCP address %s from different CS7 instance%s",
735 bsc_addr_name, VTY_NEWLINE);
736 return CMD_WARNING;
737 }
738 }
739
740 msc->a.cs7_instance = ss7->cfg.id;
741 msc->a.cs7_instance_valid = true;
742 enforce_standard_ssn(vty, &msc->a.bsc_addr);
743 msc->a.bsc_addr_name = talloc_strdup(msc, bsc_addr_name);
744 return CMD_SUCCESS;
745}
746
747DEFUN(cfg_msc_cs7_msc_addr,
748 cfg_msc_cs7_msc_addr_cmd,
749 "msc-addr NAME",
750 "Called Address (remote address of the MSC)\n" "SCCP address name\n")
751{
752 struct bsc_msc_data *msc = bsc_msc_data(vty);
753 const char *msc_addr_name = argv[0];
754 struct osmo_ss7_instance *ss7;
755
756 ss7 = osmo_sccp_addr_by_name(&msc->a.msc_addr, msc_addr_name);
757 if (!ss7) {
758 vty_out(vty, "No sccp address %s found%s", msc_addr_name,
759 VTY_NEWLINE);
760 return CMD_WARNING;
761 }
762
763 /* Prevent mixing addresses from different CS7/SS7 instances */
764 if (msc->a.cs7_instance_valid) {
765 if (msc->a.cs7_instance != ss7->cfg.id) {
766 vty_out(vty,
767 "SCCP address %s from different CS7 instance%s",
768 msc_addr_name, VTY_NEWLINE);
769 return CMD_WARNING;
770 }
771 }
772
773 msc->a.cs7_instance = ss7->cfg.id;
774 msc->a.cs7_instance_valid = true;
775 enforce_standard_ssn(vty, &msc->a.msc_addr);
776 msc->a.msc_addr_name = talloc_strdup(msc, msc_addr_name);
777 return CMD_SUCCESS;
778}
779
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200780DEFUN(cfg_net_bsc_mid_call_text,
781 cfg_net_bsc_mid_call_text_cmd,
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100782 "mid-call-text .TEXT",
Ruben Undheim59d57da2016-12-20 17:38:31 +0100783 "Set the USSD notification to be send.\n" "Text to be sent\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800784{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200785 struct osmo_bsc_data *data = osmo_bsc_data(vty);
Holger Hans Peter Freyther414bc4a2010-11-22 22:27:39 +0100786 char *txt = argv_concat(argv, argc, 0);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800787 if (!txt)
788 return CMD_WARNING;
789
Harald Welte4a824ca2017-05-29 13:54:27 +0200790 osmo_talloc_replace_string(data, &data->mid_call_txt, txt);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800791 talloc_free(txt);
792 return CMD_SUCCESS;
793}
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800794
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200795DEFUN(cfg_net_bsc_mid_call_timeout,
796 cfg_net_bsc_mid_call_timeout_cmd,
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100797 "mid-call-timeout NR",
Holger Hans Peter Freyther625b6e42010-11-22 18:25:02 +0100798 "Switch from Grace to Off in NR seconds.\n" "Timeout in seconds\n")
799{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200800 struct osmo_bsc_data *data = osmo_bsc_data(vty);
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100801 data->mid_call_timeout = atoi(argv[0]);
Holger Hans Peter Freyther625b6e42010-11-22 18:25:02 +0100802 return CMD_SUCCESS;
803}
804
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +0200805DEFUN(cfg_net_rf_socket,
806 cfg_net_rf_socket_cmd,
807 "bsc-rf-socket PATH",
808 "Set the filename for the RF control interface.\n" "RF Control path\n")
809{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200810 struct osmo_bsc_data *data = osmo_bsc_data(vty);
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +0200811
Harald Welte4a824ca2017-05-29 13:54:27 +0200812 osmo_talloc_replace_string(data, &data->rf_ctrl_name, argv[0]);
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +0200813 return CMD_SUCCESS;
814}
815
Holger Hans Peter Freyther2a896072011-08-16 19:47:39 +0200816DEFUN(cfg_net_rf_off_time,
817 cfg_net_rf_off_time_cmd,
818 "bsc-auto-rf-off <1-65000>",
819 "Disable RF on MSC Connection\n" "Timeout\n")
820{
821 struct osmo_bsc_data *data = osmo_bsc_data(vty);
822 data->auto_off_timeout = atoi(argv[0]);
823 return CMD_SUCCESS;
824}
825
826DEFUN(cfg_net_no_rf_off_time,
827 cfg_net_no_rf_off_time_cmd,
828 "no bsc-auto-rf-off",
829 NO_STR "Disable RF on MSC Connection\n")
830{
831 struct osmo_bsc_data *data = osmo_bsc_data(vty);
832 data->auto_off_timeout = -1;
833 return CMD_SUCCESS;
834}
835
Holger Hans Peter Freytherd6332802015-04-05 19:46:20 +0200836DEFUN(cfg_bsc_acc_lst_name,
837 cfg_bsc_acc_lst_name_cmd,
838 "access-list-name NAME",
839 "Set the name of the access list to use.\n"
840 "The name of the to be used access list.")
841{
842 struct osmo_bsc_data *bsc = osmo_bsc_data(vty);
843
Harald Welte4a824ca2017-05-29 13:54:27 +0200844 osmo_talloc_replace_string(bsc, &bsc->acc_lst_name, argv[0]);
Holger Hans Peter Freytherd6332802015-04-05 19:46:20 +0200845 return CMD_SUCCESS;
846}
847
848DEFUN(cfg_bsc_no_acc_lst_name,
849 cfg_bsc_no_acc_lst_name_cmd,
850 "no access-list-name",
851 NO_STR "Remove the access list from the BSC\n")
852{
853 struct osmo_bsc_data *bsc = osmo_bsc_data(vty);
854
855 if (bsc->acc_lst_name) {
856 talloc_free(bsc->acc_lst_name);
857 bsc->acc_lst_name = NULL;
858 }
859
860 return CMD_SUCCESS;
861}
862
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +0200863DEFUN(show_statistics,
864 show_statistics_cmd,
865 "show statistics",
866 SHOW_STR "Statistics about the BSC\n")
867{
868 openbsc_vty_print_statistics(vty, bsc_gsmnet);
869 return CMD_SUCCESS;
870}
871
Holger Hans Peter Freytherc50e04a2011-10-20 11:06:31 +0200872DEFUN(show_mscs,
873 show_mscs_cmd,
874 "show mscs",
875 SHOW_STR "MSC Connections and State\n")
876{
Neels Hofmeyra369e242017-02-23 21:57:23 +0100877 struct bsc_msc_data *msc;
Holger Hans Peter Freytherc50e04a2011-10-20 11:06:31 +0200878 llist_for_each_entry(msc, &bsc_gsmnet->bsc_data->mscs, entry) {
879 vty_out(vty, "MSC Nr: %d is connected: %d auth: %d.%s",
880 msc->nr,
881 msc->msc_con ? msc->msc_con->is_connected : -1,
882 msc->msc_con ? msc->msc_con->is_authenticated : -1,
883 VTY_NEWLINE);
884 }
885
886 return CMD_SUCCESS;
887}
888
Daniel Willmann7d109832012-05-14 18:43:23 +0200889DEFUN(show_pos,
890 show_pos_cmd,
891 "show position",
892 SHOW_STR "Position information of the BTS\n")
893{
894 struct gsm_bts *bts;
895 struct bts_location *curloc;
896 struct tm time;
897 char timestr[50];
898
899 llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {
900 if (llist_empty(&bts->loc_list)) {
901 vty_out(vty, "BTS Nr: %d position invalid%s", bts->nr,
902 VTY_NEWLINE);
903 continue;
904 }
905 curloc = llist_entry(bts->loc_list.next, struct bts_location, list);
906 if (gmtime_r(&curloc->tstamp, &time) == NULL) {
907 vty_out(vty, "Time conversion failed for BTS %d%s", bts->nr,
908 VTY_NEWLINE);
909 continue;
910 }
911 if (asctime_r(&time, timestr) == NULL) {
912 vty_out(vty, "Time conversion failed for BTS %d%s", bts->nr,
913 VTY_NEWLINE);
914 continue;
915 }
916 /* Last character in asctime is \n */
917 timestr[strlen(timestr)-1] = 0;
918
919 vty_out(vty, "BTS Nr: %d position: %s time: %s%s", bts->nr,
920 get_value_string(bts_loc_fix_names, curloc->valid), timestr,
921 VTY_NEWLINE);
922 vty_out(vty, " lat: %f lon: %f height: %f%s", curloc->lat, curloc->lon,
923 curloc->height, VTY_NEWLINE);
924 }
925 return CMD_SUCCESS;
926}
927
Holger Hans Peter Freyther98258db2014-02-22 10:30:32 +0100928DEFUN(gen_position_trap,
929 gen_position_trap_cmd,
930 "generate-location-state-trap <0-255>",
931 "Generate location state report\n"
932 "BTS to report\n")
933{
934 int bts_nr;
935 struct gsm_bts *bts;
936 struct gsm_network *net = bsc_gsmnet;
937
938 bts_nr = atoi(argv[0]);
939 if (bts_nr >= net->num_bts) {
940 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
941 VTY_NEWLINE);
942 return CMD_WARNING;
943 }
944
945 bts = gsm_bts_num(net, bts_nr);
946 bsc_gen_location_state_trap(bts);
947 return CMD_SUCCESS;
948}
949
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100950DEFUN(logging_fltr_imsi,
951 logging_fltr_imsi_cmd,
952 "logging filter imsi IMSI",
953 LOGGING_STR FILTER_STR
954 "Filter log messages by IMSI\n" "IMSI to be used as filter\n")
955{
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100956 struct bsc_subscr *bsc_subscr;
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100957 struct log_target *tgt = osmo_log_vty2tgt(vty);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100958 const char *imsi = argv[0];
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100959
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100960 bsc_subscr = bsc_subscr_find_by_imsi(bsc_gsmnet->bsc_subscribers, imsi);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100961
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100962 if (!bsc_subscr) {
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100963 vty_out(vty, "%%no subscriber with IMSI(%s)%s",
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100964 imsi, VTY_NEWLINE);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100965 return CMD_WARNING;
966 }
967
Neels Hofmeyr6d804b12017-02-18 22:20:46 +0100968 log_set_filter_bsc_subscr(tgt, bsc_subscr);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +0100969 return CMD_SUCCESS;
970}
971
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800972int bsc_vty_init_extra(void)
973{
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200974 install_element(CONFIG_NODE, &cfg_net_msc_cmd);
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200975 install_element(CONFIG_NODE, &cfg_net_bsc_cmd);
976
977 install_node(&bsc_node, config_write_bsc);
Jacob Erlbeck36722e12013-10-29 09:30:30 +0100978 vty_install_default(BSC_NODE);
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200979 install_element(BSC_NODE, &cfg_net_bsc_mid_call_text_cmd);
980 install_element(BSC_NODE, &cfg_net_bsc_mid_call_timeout_cmd);
981 install_element(BSC_NODE, &cfg_net_rf_socket_cmd);
Holger Hans Peter Freyther2a896072011-08-16 19:47:39 +0200982 install_element(BSC_NODE, &cfg_net_rf_off_time_cmd);
983 install_element(BSC_NODE, &cfg_net_no_rf_off_time_cmd);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200984 install_element(BSC_NODE, &cfg_net_bsc_missing_msc_ussd_cmd);
985 install_element(BSC_NODE, &cfg_net_bsc_no_missing_msc_text_cmd);
Holger Hans Peter Freytherd6332802015-04-05 19:46:20 +0200986 install_element(BSC_NODE, &cfg_bsc_acc_lst_name_cmd);
987 install_element(BSC_NODE, &cfg_bsc_no_acc_lst_name_cmd);
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200988
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800989 install_node(&msc_node, config_write_msc);
Jacob Erlbeck36722e12013-10-29 09:30:30 +0100990 vty_install_default(MSC_NODE);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800991 install_element(MSC_NODE, &cfg_net_bsc_token_cmd);
Holger Hans Peter Freythere2ac6b72015-06-08 18:02:10 +0200992 install_element(MSC_NODE, &cfg_net_bsc_key_cmd);
993 install_element(MSC_NODE, &cfg_net_bsc_no_key_cmd);
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100994 install_element(MSC_NODE, &cfg_net_bsc_ncc_cmd);
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100995 install_element(MSC_NODE, &cfg_net_bsc_mcc_cmd);
Holger Hans Peter Freyther32dd2f32015-04-01 18:15:48 +0200996 install_element(MSC_NODE, &cfg_net_bsc_lac_cmd);
997 install_element(MSC_NODE, &cfg_net_bsc_ci_cmd);
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +0100998 install_element(MSC_NODE, &cfg_net_bsc_rtp_base_cmd);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100999 install_element(MSC_NODE, &cfg_net_bsc_codec_list_cmd);
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +02001000 install_element(MSC_NODE, &cfg_net_msc_dest_cmd);
1001 install_element(MSC_NODE, &cfg_net_msc_no_dest_cmd);
Holger Hans Peter Freytherdb64f2e2014-10-29 10:06:15 +01001002 install_element(MSC_NODE, &cfg_net_msc_no_ping_time_cmd);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +08001003 install_element(MSC_NODE, &cfg_net_msc_ping_time_cmd);
1004 install_element(MSC_NODE, &cfg_net_msc_pong_time_cmd);
Holger Hans Peter Freyther56cb7292014-09-02 17:28:40 +02001005 install_element(MSC_NODE, &cfg_net_msc_advanced_ping_cmd);
1006 install_element(MSC_NODE, &cfg_no_net_msc_advanced_ping_cmd);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +02001007 install_element(MSC_NODE, &cfg_net_msc_welcome_ussd_cmd);
Jacob Erlbeck97e139f2013-08-28 10:16:55 +02001008 install_element(MSC_NODE, &cfg_net_msc_no_welcome_ussd_cmd);
Jacob Erlbeck1b894022013-08-28 10:16:54 +02001009 install_element(MSC_NODE, &cfg_net_msc_lost_ussd_cmd);
1010 install_element(MSC_NODE, &cfg_net_msc_no_lost_ussd_cmd);
Jacob Erlbeck56595f82013-09-11 10:46:55 +02001011 install_element(MSC_NODE, &cfg_net_msc_grace_ussd_cmd);
1012 install_element(MSC_NODE, &cfg_net_msc_no_grace_ussd_cmd);
Holger Hans Peter Freythercbaa8802011-06-08 16:28:04 +02001013 install_element(MSC_NODE, &cfg_net_msc_type_cmd);
Holger Hans Peter Freyther31b245b2011-06-08 19:27:15 +02001014 install_element(MSC_NODE, &cfg_net_msc_emerg_cmd);
Holger Hans Peter Freytherd5edc4f2011-06-09 21:54:08 +02001015 install_element(MSC_NODE, &cfg_net_msc_local_prefix_cmd);
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +02001016 install_element(MSC_NODE, &cfg_net_msc_amr_12_2_cmd);
1017 install_element(MSC_NODE, &cfg_net_msc_amr_10_2_cmd);
1018 install_element(MSC_NODE, &cfg_net_msc_amr_7_95_cmd);
1019 install_element(MSC_NODE, &cfg_net_msc_amr_7_40_cmd);
1020 install_element(MSC_NODE, &cfg_net_msc_amr_6_70_cmd);
1021 install_element(MSC_NODE, &cfg_net_msc_amr_5_90_cmd);
1022 install_element(MSC_NODE, &cfg_net_msc_amr_5_15_cmd);
1023 install_element(MSC_NODE, &cfg_net_msc_amr_4_75_cmd);
Holger Hans Peter Freytherd6332802015-04-05 19:46:20 +02001024 install_element(MSC_NODE, &cfg_msc_acc_lst_name_cmd);
1025 install_element(MSC_NODE, &cfg_msc_no_acc_lst_name_cmd);
Philipp Maierfbf66102017-04-09 12:32:51 +02001026 install_element(MSC_NODE, &cfg_msc_cs7_bsc_addr_cmd);
1027 install_element(MSC_NODE, &cfg_msc_cs7_msc_addr_cmd);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +02001028
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +02001029 install_element_ve(&show_statistics_cmd);
Holger Hans Peter Freytherc50e04a2011-10-20 11:06:31 +02001030 install_element_ve(&show_mscs_cmd);
Daniel Willmann7d109832012-05-14 18:43:23 +02001031 install_element_ve(&show_pos_cmd);
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +01001032 install_element_ve(&logging_fltr_imsi_cmd);
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +02001033
Holger Hans Peter Freyther98258db2014-02-22 10:30:32 +01001034 install_element(ENABLE_NODE, &gen_position_trap_cmd);
1035
Holger Hans Peter Freyther6995f242014-12-28 18:54:32 +01001036 install_element(CFG_LOG_NODE, &logging_fltr_imsi_cmd);
1037
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +08001038 return 0;
1039}