blob: 4d5a55d88902f92c4143fa30dd24976632cc44c8 [file] [log] [blame]
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +08001/* Osmo BSC VTY Configuration */
Holger Hans Peter Freyther98258db2014-02-22 10:30:32 +01002/* (C) 2009-2014 by Holger Hans Peter Freyther
3 * (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>
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080023#include <openbsc/osmo_msc_data.h>
24#include <openbsc/vty.h>
25
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010026#include <osmocom/core/talloc.h>
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080027
Daniel Willmann7d109832012-05-14 18:43:23 +020028#include <time.h>
29
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +010030
31#define IPA_STR "IP.ACCESS specific\n"
32
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080033extern struct gsm_network *bsc_gsmnet;
34
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020035static struct osmo_bsc_data *osmo_bsc_data(struct vty *vty)
36{
37 return bsc_gsmnet->bsc_data;
38}
39
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080040static struct osmo_msc_data *osmo_msc_data(struct vty *vty)
41{
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +020042 return osmo_msc_data_find(bsc_gsmnet, (int) vty->index);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080043}
44
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020045static struct cmd_node bsc_node = {
46 BSC_NODE,
Jacob Erlbeck0b4f1b92013-08-30 18:33:58 +020047 "%s(config-bsc)# ",
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020048 1,
49};
50
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080051static struct cmd_node msc_node = {
52 MSC_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020053 "%s(config-msc)# ",
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080054 1,
55};
56
57DEFUN(cfg_net_msc, cfg_net_msc_cmd,
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020058 "msc [<0-1000>]", "Configure MSC details\n" "MSC connection to configure\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080059{
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020060 int index = argc == 1 ? atoi(argv[0]) : 0;
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +020061 struct osmo_msc_data *msc;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080062
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +020063 msc = osmo_msc_data_alloc(bsc_gsmnet, index);
64 if (!msc) {
65 vty_out(vty, "%%Failed to allocate MSC data.%s", VTY_NEWLINE);
66 return CMD_WARNING;
67 }
68
69 vty->index = (void *) index;
70 vty->node = MSC_NODE;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080071 return CMD_SUCCESS;
72}
73
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020074DEFUN(cfg_net_bsc, cfg_net_bsc_cmd,
75 "bsc", "Configure BSC\n")
76{
77 vty->node = BSC_NODE;
78 return CMD_SUCCESS;
79}
80
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +020081static void write_msc_amr_options(struct vty *vty, struct osmo_msc_data *msc)
82{
83#define WRITE_AMR(vty, msc, name, var) \
84 vty_out(vty, " amr-config %s %s%s", \
85 name, msc->amr_conf.var ? "allowed" : "forbidden", \
86 VTY_NEWLINE);
87
88 WRITE_AMR(vty, msc, "12_2k", m12_2);
89 WRITE_AMR(vty, msc, "10_2k", m10_2);
90 WRITE_AMR(vty, msc, "7_95k", m7_95);
91 WRITE_AMR(vty, msc, "7_40k", m7_40);
92 WRITE_AMR(vty, msc, "6_70k", m6_70);
93 WRITE_AMR(vty, msc, "5_90k", m5_90);
94 WRITE_AMR(vty, msc, "5_15k", m5_15);
95 WRITE_AMR(vty, msc, "4_75k", m4_75);
96#undef WRITE_AMR
97}
98
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +020099static void write_msc(struct vty *vty, struct osmo_msc_data *msc)
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800100{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200101 struct bsc_msc_dest *dest;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800102
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200103 vty_out(vty, "msc %d%s", msc->nr, VTY_NEWLINE);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200104 if (msc->bsc_token)
105 vty_out(vty, " token %s%s", msc->bsc_token, VTY_NEWLINE);
106 if (msc->core_ncc != -1)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200107 vty_out(vty, " core-mobile-network-code %d%s",
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200108 msc->core_ncc, VTY_NEWLINE);
109 if (msc->core_mcc != -1)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200110 vty_out(vty, " core-mobile-country-code %d%s",
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200111 msc->core_mcc, VTY_NEWLINE);
112 vty_out(vty, " ip.access rtp-base %d%s", msc->rtp_base, VTY_NEWLINE);
Holger Hans Peter Freytherdb64f2e2014-10-29 10:06:15 +0100113
114 if (msc->ping_timeout == -1)
115 vty_out(vty, " no timeout-ping%s", VTY_NEWLINE);
116 else {
117 vty_out(vty, " timeout-ping %d%s", msc->ping_timeout, VTY_NEWLINE);
118 vty_out(vty, " timeout-pong %d%s", msc->pong_timeout, VTY_NEWLINE);
119 if (msc->advanced_ping)
120 vty_out(vty, " timeout-ping advanced%s", VTY_NEWLINE);
121 else
122 vty_out(vty, " no timeout-ping advanced%s", VTY_NEWLINE);
123 }
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200124
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200125 if (msc->ussd_welcome_txt)
126 vty_out(vty, " bsc-welcome-text %s%s", msc->ussd_welcome_txt, VTY_NEWLINE);
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200127 else
128 vty_out(vty, " no bsc-welcome-text%s", VTY_NEWLINE);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800129
Jacob Erlbeck1b894022013-08-28 10:16:54 +0200130 if (msc->ussd_msc_lost_txt && msc->ussd_msc_lost_txt[0])
131 vty_out(vty, " bsc-msc-lost-text %s%s", msc->ussd_msc_lost_txt, VTY_NEWLINE);
132 else
133 vty_out(vty, " no bsc-msc-lost-text%s", VTY_NEWLINE);
134
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200135 if (msc->ussd_grace_txt && msc->ussd_grace_txt[0])
136 vty_out(vty, " bsc-grace-text %s%s", msc->ussd_grace_txt, VTY_NEWLINE);
137 else
138 vty_out(vty, " no bsc-grace-text%s", VTY_NEWLINE);
139
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200140 if (msc->audio_length != 0) {
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100141 int i;
142
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200143 vty_out(vty, " codec-list ");
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200144 for (i = 0; i < msc->audio_length; ++i) {
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100145 if (i != 0)
Harald Welte22ce5982013-06-19 15:32:27 +0200146 vty_out(vty, " ");
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100147
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200148 if (msc->audio_support[i]->hr)
149 vty_out(vty, "hr%.1u", msc->audio_support[i]->ver);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100150 else
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200151 vty_out(vty, "fr%.1u", msc->audio_support[i]->ver);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100152 }
153 vty_out(vty, "%s", VTY_NEWLINE);
154
155 }
156
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200157 llist_for_each_entry(dest, &msc->dests, list)
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200158 vty_out(vty, " dest %s %d %d%s", dest->ip, dest->port,
159 dest->dscp, VTY_NEWLINE);
Holger Hans Peter Freythercbaa8802011-06-08 16:28:04 +0200160
161 vty_out(vty, " type %s%s", msc->type == MSC_CON_TYPE_NORMAL ?
162 "normal" : "local", VTY_NEWLINE);
Holger Hans Peter Freyther31b245b2011-06-08 19:27:15 +0200163 vty_out(vty, " allow-emergency %s%s", msc->allow_emerg ?
164 "allow" : "deny", VTY_NEWLINE);
Holger Hans Peter Freytherd5edc4f2011-06-09 21:54:08 +0200165
166 if (msc->local_pref)
167 vty_out(vty, " local-prefix %s%s", msc->local_pref, VTY_NEWLINE);
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +0200168
169 /* write amr options */
170 write_msc_amr_options(vty, msc);
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +0200171}
172
173static int config_write_msc(struct vty *vty)
174{
175 struct osmo_msc_data *msc;
176 struct osmo_bsc_data *bsc = osmo_bsc_data(vty);
177
178 llist_for_each_entry(msc, &bsc->mscs, entry)
179 write_msc(vty, msc);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200180
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200181 return CMD_SUCCESS;
182}
183
184static int config_write_bsc(struct vty *vty)
185{
186 struct osmo_bsc_data *bsc = osmo_bsc_data(vty);
187
188 vty_out(vty, "bsc%s", VTY_NEWLINE);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200189 if (bsc->mid_call_txt)
190 vty_out(vty, " mid-call-text %s%s", bsc->mid_call_txt, VTY_NEWLINE);
191 vty_out(vty, " mid-call-timeout %d%s", bsc->mid_call_timeout, VTY_NEWLINE);
192 if (bsc->rf_ctrl_name)
193 vty_out(vty, " bsc-rf-socket %s%s",
194 bsc->rf_ctrl_name, VTY_NEWLINE);
195
Holger Hans Peter Freyther2a896072011-08-16 19:47:39 +0200196 if (bsc->auto_off_timeout != -1)
197 vty_out(vty, " bsc-auto-rf-off %d%s",
198 bsc->auto_off_timeout, VTY_NEWLINE);
199
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200200 if (bsc->ussd_no_msc_txt && bsc->ussd_no_msc_txt[0])
201 vty_out(vty, " missing-msc-text %s%s", bsc->ussd_no_msc_txt, VTY_NEWLINE);
202 else
203 vty_out(vty, " no missing-msc-text%s", VTY_NEWLINE);
204
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800205 return CMD_SUCCESS;
206}
207
Holger Hans Peter Freyther5b848f32010-11-03 13:11:14 +0100208DEFUN(cfg_net_bsc_token,
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800209 cfg_net_bsc_token_cmd,
210 "token TOKEN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100211 "A token for the BSC to be sent to the MSC\n" "A token\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800212{
213 struct osmo_msc_data *data = osmo_msc_data(vty);
214
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200215 bsc_replace_string(osmo_bsc_data(vty), &data->bsc_token, argv[0]);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800216 return CMD_SUCCESS;
217}
218
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100219DEFUN(cfg_net_bsc_ncc,
220 cfg_net_bsc_ncc_cmd,
Holger Hans Peter Freyther6e1a6762011-02-10 11:37:13 +0100221 "core-mobile-network-code <1-999>",
Holger Hans Peter Freyther768580b2014-07-08 12:48:49 +0200222 "Use this network code for the core network\n" "NCC value\n")
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100223{
224 struct osmo_msc_data *data = osmo_msc_data(vty);
225 data->core_ncc = atoi(argv[0]);
226 return CMD_SUCCESS;
227}
228
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100229DEFUN(cfg_net_bsc_mcc,
230 cfg_net_bsc_mcc_cmd,
Holger Hans Peter Freyther6e1a6762011-02-10 11:37:13 +0100231 "core-mobile-country-code <1-999>",
Holger Hans Peter Freyther768580b2014-07-08 12:48:49 +0200232 "Use this country code for the core network\n" "MCC value\n")
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100233{
234 struct osmo_msc_data *data = osmo_msc_data(vty);
235 data->core_mcc = atoi(argv[0]);
236 return CMD_SUCCESS;
237}
238
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +0100239DEFUN(cfg_net_bsc_rtp_base,
240 cfg_net_bsc_rtp_base_cmd,
241 "ip.access rtp-base <1-65000>",
242 IPA_STR
243 "Set the rtp-base port for the RTP stream\n"
244 "Port number\n")
245{
246 struct osmo_msc_data *data = osmo_msc_data(vty);
247 data->rtp_base = atoi(argv[0]);
248 return CMD_SUCCESS;
249}
250
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100251DEFUN(cfg_net_bsc_codec_list,
252 cfg_net_bsc_codec_list_cmd,
253 "codec-list .LIST",
254 "Set the allowed audio codecs\n"
255 "List of audio codecs\n")
256{
257 struct osmo_msc_data *data = osmo_msc_data(vty);
258 int saw_fr, saw_hr;
259 int i;
260
261 saw_fr = saw_hr = 0;
262
263 /* free the old list... if it exists */
264 if (data->audio_support) {
265 talloc_free(data->audio_support);
266 data->audio_support = NULL;
267 data->audio_length = 0;
268 }
269
270 /* create a new array */
271 data->audio_support =
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200272 talloc_zero_array(osmo_bsc_data(vty), struct gsm_audio_support *, argc);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100273 data->audio_length = argc;
274
275 for (i = 0; i < argc; ++i) {
276 /* check for hrX or frX */
277 if (strlen(argv[i]) != 3
278 || argv[i][1] != 'r'
279 || (argv[i][0] != 'h' && argv[i][0] != 'f')
280 || argv[i][2] < 0x30
281 || argv[i][2] > 0x39)
282 goto error;
283
284 data->audio_support[i] = talloc_zero(data->audio_support,
285 struct gsm_audio_support);
286 data->audio_support[i]->ver = atoi(argv[i] + 2);
287
288 if (strncmp("hr", argv[i], 2) == 0) {
289 data->audio_support[i]->hr = 1;
290 saw_hr = 1;
291 } else if (strncmp("fr", argv[i], 2) == 0) {
292 data->audio_support[i]->hr = 0;
293 saw_fr = 1;
294 }
295
296 if (saw_hr && saw_fr) {
297 vty_out(vty, "Can not have full-rate and half-rate codec.%s",
298 VTY_NEWLINE);
299 return CMD_ERR_INCOMPLETE;
300 }
301 }
302
303 return CMD_SUCCESS;
304
305error:
306 vty_out(vty, "Codec name must be hrX or frX. Was '%s'%s",
307 argv[i], VTY_NEWLINE);
308 return CMD_ERR_INCOMPLETE;
309}
310
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200311DEFUN(cfg_net_msc_dest,
312 cfg_net_msc_dest_cmd,
313 "dest A.B.C.D <1-65000> <0-255>",
314 "Add a destination to a MUX/MSC\n"
315 "IP Address\n" "Port\n" "DSCP\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800316{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200317 struct bsc_msc_dest *dest;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800318 struct osmo_msc_data *data = osmo_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800319
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200320 dest = talloc_zero(osmo_bsc_data(vty), struct bsc_msc_dest);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200321 if (!dest) {
322 vty_out(vty, "%%Failed to create structure.%s", VTY_NEWLINE);
323 return CMD_WARNING;
324 }
325
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200326 dest->ip = talloc_strdup(dest, argv[0]);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200327 if (!dest->ip) {
328 vty_out(vty, "%%Failed to copy dest ip.%s", VTY_NEWLINE);
329 talloc_free(dest);
330 return CMD_WARNING;
331 }
332
333 dest->port = atoi(argv[1]);
334 dest->dscp = atoi(argv[2]);
335 llist_add_tail(&dest->list, &data->dests);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800336 return CMD_SUCCESS;
337}
338
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200339DEFUN(cfg_net_msc_no_dest,
340 cfg_net_msc_no_dest_cmd,
341 "no dest A.B.C.D <1-65000> <0-255>",
342 NO_STR "Remove a destination to a MUX/MSC\n"
343 "IP Address\n" "Port\n" "DSCP\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800344{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200345 struct bsc_msc_dest *dest, *tmp;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800346 struct osmo_msc_data *data = osmo_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800347
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200348 int port = atoi(argv[1]);
349 int dscp = atoi(argv[2]);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800350
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200351 llist_for_each_entry_safe(dest, tmp, &data->dests, list) {
352 if (port != dest->port || dscp != dest->dscp
353 || strcmp(dest->ip, argv[0]) != 0)
354 continue;
355
356 llist_del(&dest->list);
357 talloc_free(dest);
358 }
359
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800360 return CMD_SUCCESS;
361}
362
Holger Hans Peter Freytherdb64f2e2014-10-29 10:06:15 +0100363DEFUN(cfg_net_msc_no_ping_time,
364 cfg_net_msc_no_ping_time_cmd,
365 "no timeout-ping",
366 NO_STR "Disable the ping/pong handling on A-link\n")
367{
368 struct osmo_msc_data *data = osmo_msc_data(vty);
369 data->ping_timeout = -1;
370 return CMD_SUCCESS;
371}
372
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800373DEFUN(cfg_net_msc_ping_time,
374 cfg_net_msc_ping_time_cmd,
Holger Hans Peter Freyther47c624b2014-09-30 16:43:30 +0200375 "timeout-ping <1-2147483647>",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100376 "Set the PING interval, negative for not sending PING\n"
377 "Timeout in seconds\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800378{
379 struct osmo_msc_data *data = osmo_msc_data(vty);
380 data->ping_timeout = atoi(argv[0]);
381 return CMD_SUCCESS;
382}
383
384DEFUN(cfg_net_msc_pong_time,
385 cfg_net_msc_pong_time_cmd,
Holger Hans Peter Freyther47c624b2014-09-30 16:43:30 +0200386 "timeout-pong <1-2147483647>",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100387 "Set the time to wait for a PONG\n" "Timeout in seconds\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800388{
389 struct osmo_msc_data *data = osmo_msc_data(vty);
390 data->pong_timeout = atoi(argv[0]);
391 return CMD_SUCCESS;
392}
393
Holger Hans Peter Freyther56cb7292014-09-02 17:28:40 +0200394DEFUN(cfg_net_msc_advanced_ping,
395 cfg_net_msc_advanced_ping_cmd,
396 "timeout-ping advanced",
397 "Ping timeout handling\nEnable advanced mode during SCCP\n")
398{
399 struct osmo_msc_data *data = osmo_msc_data(vty);
Holger Hans Peter Freytherdb64f2e2014-10-29 10:06:15 +0100400
401 if (data->ping_timeout == -1) {
402 vty_out(vty, "%%ping handling is disabled. Enable it first.%s",
403 VTY_NEWLINE);
404 return CMD_WARNING;
405 }
406
Holger Hans Peter Freyther56cb7292014-09-02 17:28:40 +0200407 data->advanced_ping = 1;
408 return CMD_SUCCESS;
409}
410
411DEFUN(cfg_no_net_msc_advanced_ping,
412 cfg_no_net_msc_advanced_ping_cmd,
413 "no timeout-ping advanced",
414 NO_STR "Ping timeout handling\nEnable advanced mode during SCCP\n")
415{
416 struct osmo_msc_data *data = osmo_msc_data(vty);
417 data->advanced_ping = 0;
418 return CMD_SUCCESS;
419}
420
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200421DEFUN(cfg_net_msc_welcome_ussd,
422 cfg_net_msc_welcome_ussd_cmd,
423 "bsc-welcome-text .TEXT",
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200424 "Set the USSD notification to be sent\n" "Text to be sent\n")
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200425{
426 struct osmo_msc_data *data = osmo_msc_data(vty);
427 char *str = argv_concat(argv, argc, 0);
428 if (!str)
429 return CMD_WARNING;
430
431 bsc_replace_string(osmo_bsc_data(vty), &data->ussd_welcome_txt, str);
432 talloc_free(str);
433 return CMD_SUCCESS;
434}
435
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200436DEFUN(cfg_net_msc_no_welcome_ussd,
437 cfg_net_msc_no_welcome_ussd_cmd,
438 "no bsc-welcome-text",
439 NO_STR "Clear the USSD notification to be sent\n")
440{
441 struct osmo_msc_data *data = osmo_msc_data(vty);
442
443 talloc_free(data->ussd_welcome_txt);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200444 data->ussd_welcome_txt = NULL;
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200445
446 return CMD_SUCCESS;
447}
448
Jacob Erlbeck1b894022013-08-28 10:16:54 +0200449DEFUN(cfg_net_msc_lost_ussd,
450 cfg_net_msc_lost_ussd_cmd,
451 "bsc-msc-lost-text .TEXT",
452 "Set the USSD notification to be sent on MSC connection loss\n" "Text to be sent\n")
453{
454 struct osmo_msc_data *data = osmo_msc_data(vty);
455 char *str = argv_concat(argv, argc, 0);
456 if (!str)
457 return CMD_WARNING;
458
459 bsc_replace_string(osmo_bsc_data(vty), &data->ussd_msc_lost_txt, str);
460 talloc_free(str);
461 return CMD_SUCCESS;
462}
463
464DEFUN(cfg_net_msc_no_lost_ussd,
465 cfg_net_msc_no_lost_ussd_cmd,
466 "no bsc-msc-lost-text",
467 NO_STR "Clear the USSD notification to be sent on MSC connection loss\n")
468{
469 struct osmo_msc_data *data = osmo_msc_data(vty);
470
471 talloc_free(data->ussd_msc_lost_txt);
472 data->ussd_msc_lost_txt = 0;
473
474 return CMD_SUCCESS;
475}
476
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200477DEFUN(cfg_net_msc_grace_ussd,
478 cfg_net_msc_grace_ussd_cmd,
479 "bsc-grace-text .TEXT",
480 "Set the USSD notification to be sent when the MSC has entered the grace period\n" "Text to be sent\n")
481{
482 struct osmo_msc_data *data = osmo_msc_data(vty);
483 char *str = argv_concat(argv, argc, 0);
484 if (!str)
485 return CMD_WARNING;
486
487 bsc_replace_string(osmo_bsc_data(vty), &data->ussd_grace_txt, str);
488 talloc_free(str);
489 return CMD_SUCCESS;
490}
491
492DEFUN(cfg_net_msc_no_grace_ussd,
493 cfg_net_msc_no_grace_ussd_cmd,
494 "no bsc-grace-text",
495 NO_STR "Clear the USSD notification to be sent when the MSC has entered the grace period\n")
496{
497 struct osmo_msc_data *data = osmo_msc_data(vty);
498
499 talloc_free(data->ussd_grace_txt);
500 data->ussd_grace_txt = NULL;
501
502 return CMD_SUCCESS;
503}
504
505DEFUN(cfg_net_bsc_missing_msc_ussd,
506 cfg_net_bsc_missing_msc_ussd_cmd,
507 "missing-msc-text .TEXT",
508 "Set the USSD notification to be send when a MSC has not been found.\n" "Text to be sent\n")
509{
510 struct osmo_bsc_data *data = osmo_bsc_data(vty);
511 char *txt = argv_concat(argv, argc, 0);
512 if (!txt)
513 return CMD_WARNING;
514
515 bsc_replace_string(data, &data->ussd_no_msc_txt, txt);
516 talloc_free(txt);
517 return CMD_SUCCESS;
518}
519
520DEFUN(cfg_net_bsc_no_missing_msc_text,
521 cfg_net_bsc_no_missing_msc_text_cmd,
522 "no missing-msc-text",
523 NO_STR "Clear the USSD notification to be send when a MSC has not been found.\n")
524{
525 struct osmo_bsc_data *data = osmo_bsc_data(vty);
526
527 talloc_free(data->ussd_no_msc_txt);
528 data->ussd_no_msc_txt = 0;
529
530 return CMD_SUCCESS;
531}
532
533
Holger Hans Peter Freythercbaa8802011-06-08 16:28:04 +0200534DEFUN(cfg_net_msc_type,
535 cfg_net_msc_type_cmd,
536 "type (normal|local)",
537 "Select the MSC type\n"
538 "Plain GSM MSC\n" "Special MSC for local call routing\n")
539{
540 struct osmo_msc_data *data = osmo_msc_data(vty);
541
542 if (strcmp(argv[0], "normal") == 0)
543 data->type = MSC_CON_TYPE_NORMAL;
544 else if (strcmp(argv[0], "local") == 0)
545 data->type = MSC_CON_TYPE_LOCAL;
546
547 return CMD_SUCCESS;
548}
549
Holger Hans Peter Freyther31b245b2011-06-08 19:27:15 +0200550DEFUN(cfg_net_msc_emerg,
551 cfg_net_msc_emerg_cmd,
552 "allow-emergency (allow|deny)",
553 "Allow CM ServiceRequests with type emergency\n"
554 "Allow\n" "Deny\n")
555{
556 struct osmo_msc_data *data = osmo_msc_data(vty);
557 data->allow_emerg = strcmp("allow", argv[0]) == 0;
558 return CMD_SUCCESS;
559}
560
Holger Hans Peter Freytherd5edc4f2011-06-09 21:54:08 +0200561DEFUN(cfg_net_msc_local_prefix,
562 cfg_net_msc_local_prefix_cmd,
563 "local-prefix REGEXP",
564 "Prefix for local numbers\n" "REGEXP used\n")
565{
566 struct osmo_msc_data *msc = osmo_msc_data(vty);
567
568 if (gsm_parse_reg(msc, &msc->local_pref_reg, &msc->local_pref, argc, argv) != 0) {
569 vty_out(vty, "%%Failed to parse the regexp: '%s'%s",
570 argv[0], VTY_NEWLINE);
571 return CMD_WARNING;
572 }
573
574 return CMD_SUCCESS;
575}
576
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +0200577#define AMR_CONF_STR "AMR Multirate Configuration\n"
578#define AMR_COMMAND(name) \
579 DEFUN(cfg_net_msc_amr_##name, \
580 cfg_net_msc_amr_##name##_cmd, \
581 "amr-config " #name "k (allowed|forbidden)", \
582 AMR_CONF_STR "Bitrate\n" "Allowed\n" "Forbidden\n") \
583{ \
584 struct osmo_msc_data *msc = osmo_msc_data(vty); \
585 \
586 msc->amr_conf.m##name = strcmp(argv[0], "allowed") == 0; \
587 return CMD_SUCCESS; \
588}
589
590AMR_COMMAND(12_2)
591AMR_COMMAND(10_2)
592AMR_COMMAND(7_95)
593AMR_COMMAND(7_40)
594AMR_COMMAND(6_70)
595AMR_COMMAND(5_90)
596AMR_COMMAND(5_15)
597AMR_COMMAND(4_75)
598
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200599DEFUN(cfg_net_bsc_mid_call_text,
600 cfg_net_bsc_mid_call_text_cmd,
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100601 "mid-call-text .TEXT",
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800602 "Set the USSD notifcation to be send.\n" "Text to be sent\n")
603{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200604 struct osmo_bsc_data *data = osmo_bsc_data(vty);
Holger Hans Peter Freyther414bc4a2010-11-22 22:27:39 +0100605 char *txt = argv_concat(argv, argc, 0);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800606 if (!txt)
607 return CMD_WARNING;
608
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100609 bsc_replace_string(data, &data->mid_call_txt, txt);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800610 talloc_free(txt);
611 return CMD_SUCCESS;
612}
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800613
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200614DEFUN(cfg_net_bsc_mid_call_timeout,
615 cfg_net_bsc_mid_call_timeout_cmd,
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100616 "mid-call-timeout NR",
Holger Hans Peter Freyther625b6e42010-11-22 18:25:02 +0100617 "Switch from Grace to Off in NR seconds.\n" "Timeout in seconds\n")
618{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200619 struct osmo_bsc_data *data = osmo_bsc_data(vty);
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100620 data->mid_call_timeout = atoi(argv[0]);
Holger Hans Peter Freyther625b6e42010-11-22 18:25:02 +0100621 return CMD_SUCCESS;
622}
623
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +0200624DEFUN(cfg_net_rf_socket,
625 cfg_net_rf_socket_cmd,
626 "bsc-rf-socket PATH",
627 "Set the filename for the RF control interface.\n" "RF Control path\n")
628{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200629 struct osmo_bsc_data *data = osmo_bsc_data(vty);
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +0200630
631 bsc_replace_string(data, &data->rf_ctrl_name, argv[0]);
632 return CMD_SUCCESS;
633}
634
Holger Hans Peter Freyther2a896072011-08-16 19:47:39 +0200635DEFUN(cfg_net_rf_off_time,
636 cfg_net_rf_off_time_cmd,
637 "bsc-auto-rf-off <1-65000>",
638 "Disable RF on MSC Connection\n" "Timeout\n")
639{
640 struct osmo_bsc_data *data = osmo_bsc_data(vty);
641 data->auto_off_timeout = atoi(argv[0]);
642 return CMD_SUCCESS;
643}
644
645DEFUN(cfg_net_no_rf_off_time,
646 cfg_net_no_rf_off_time_cmd,
647 "no bsc-auto-rf-off",
648 NO_STR "Disable RF on MSC Connection\n")
649{
650 struct osmo_bsc_data *data = osmo_bsc_data(vty);
651 data->auto_off_timeout = -1;
652 return CMD_SUCCESS;
653}
654
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +0200655DEFUN(show_statistics,
656 show_statistics_cmd,
657 "show statistics",
658 SHOW_STR "Statistics about the BSC\n")
659{
660 openbsc_vty_print_statistics(vty, bsc_gsmnet);
661 return CMD_SUCCESS;
662}
663
Holger Hans Peter Freytherc50e04a2011-10-20 11:06:31 +0200664DEFUN(show_mscs,
665 show_mscs_cmd,
666 "show mscs",
667 SHOW_STR "MSC Connections and State\n")
668{
669 struct osmo_msc_data *msc;
670 llist_for_each_entry(msc, &bsc_gsmnet->bsc_data->mscs, entry) {
671 vty_out(vty, "MSC Nr: %d is connected: %d auth: %d.%s",
672 msc->nr,
673 msc->msc_con ? msc->msc_con->is_connected : -1,
674 msc->msc_con ? msc->msc_con->is_authenticated : -1,
675 VTY_NEWLINE);
676 }
677
678 return CMD_SUCCESS;
679}
680
Daniel Willmann7d109832012-05-14 18:43:23 +0200681DEFUN(show_pos,
682 show_pos_cmd,
683 "show position",
684 SHOW_STR "Position information of the BTS\n")
685{
686 struct gsm_bts *bts;
687 struct bts_location *curloc;
688 struct tm time;
689 char timestr[50];
690
691 llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {
692 if (llist_empty(&bts->loc_list)) {
693 vty_out(vty, "BTS Nr: %d position invalid%s", bts->nr,
694 VTY_NEWLINE);
695 continue;
696 }
697 curloc = llist_entry(bts->loc_list.next, struct bts_location, list);
698 if (gmtime_r(&curloc->tstamp, &time) == NULL) {
699 vty_out(vty, "Time conversion failed for BTS %d%s", bts->nr,
700 VTY_NEWLINE);
701 continue;
702 }
703 if (asctime_r(&time, timestr) == NULL) {
704 vty_out(vty, "Time conversion failed for BTS %d%s", bts->nr,
705 VTY_NEWLINE);
706 continue;
707 }
708 /* Last character in asctime is \n */
709 timestr[strlen(timestr)-1] = 0;
710
711 vty_out(vty, "BTS Nr: %d position: %s time: %s%s", bts->nr,
712 get_value_string(bts_loc_fix_names, curloc->valid), timestr,
713 VTY_NEWLINE);
714 vty_out(vty, " lat: %f lon: %f height: %f%s", curloc->lat, curloc->lon,
715 curloc->height, VTY_NEWLINE);
716 }
717 return CMD_SUCCESS;
718}
719
Holger Hans Peter Freyther98258db2014-02-22 10:30:32 +0100720DEFUN(gen_position_trap,
721 gen_position_trap_cmd,
722 "generate-location-state-trap <0-255>",
723 "Generate location state report\n"
724 "BTS to report\n")
725{
726 int bts_nr;
727 struct gsm_bts *bts;
728 struct gsm_network *net = bsc_gsmnet;
729
730 bts_nr = atoi(argv[0]);
731 if (bts_nr >= net->num_bts) {
732 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
733 VTY_NEWLINE);
734 return CMD_WARNING;
735 }
736
737 bts = gsm_bts_num(net, bts_nr);
738 bsc_gen_location_state_trap(bts);
739 return CMD_SUCCESS;
740}
741
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800742int bsc_vty_init_extra(void)
743{
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200744 install_element(CONFIG_NODE, &cfg_net_msc_cmd);
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200745 install_element(CONFIG_NODE, &cfg_net_bsc_cmd);
746
747 install_node(&bsc_node, config_write_bsc);
Jacob Erlbeck36722e12013-10-29 09:30:30 +0100748 vty_install_default(BSC_NODE);
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200749 install_element(BSC_NODE, &cfg_net_bsc_mid_call_text_cmd);
750 install_element(BSC_NODE, &cfg_net_bsc_mid_call_timeout_cmd);
751 install_element(BSC_NODE, &cfg_net_rf_socket_cmd);
Holger Hans Peter Freyther2a896072011-08-16 19:47:39 +0200752 install_element(BSC_NODE, &cfg_net_rf_off_time_cmd);
753 install_element(BSC_NODE, &cfg_net_no_rf_off_time_cmd);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200754 install_element(BSC_NODE, &cfg_net_bsc_missing_msc_ussd_cmd);
755 install_element(BSC_NODE, &cfg_net_bsc_no_missing_msc_text_cmd);
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200756
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800757 install_node(&msc_node, config_write_msc);
Jacob Erlbeck36722e12013-10-29 09:30:30 +0100758 vty_install_default(MSC_NODE);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800759 install_element(MSC_NODE, &cfg_net_bsc_token_cmd);
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100760 install_element(MSC_NODE, &cfg_net_bsc_ncc_cmd);
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100761 install_element(MSC_NODE, &cfg_net_bsc_mcc_cmd);
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +0100762 install_element(MSC_NODE, &cfg_net_bsc_rtp_base_cmd);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100763 install_element(MSC_NODE, &cfg_net_bsc_codec_list_cmd);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200764 install_element(MSC_NODE, &cfg_net_msc_dest_cmd);
765 install_element(MSC_NODE, &cfg_net_msc_no_dest_cmd);
Holger Hans Peter Freytherdb64f2e2014-10-29 10:06:15 +0100766 install_element(MSC_NODE, &cfg_net_msc_no_ping_time_cmd);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800767 install_element(MSC_NODE, &cfg_net_msc_ping_time_cmd);
768 install_element(MSC_NODE, &cfg_net_msc_pong_time_cmd);
Holger Hans Peter Freyther56cb7292014-09-02 17:28:40 +0200769 install_element(MSC_NODE, &cfg_net_msc_advanced_ping_cmd);
770 install_element(MSC_NODE, &cfg_no_net_msc_advanced_ping_cmd);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200771 install_element(MSC_NODE, &cfg_net_msc_welcome_ussd_cmd);
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200772 install_element(MSC_NODE, &cfg_net_msc_no_welcome_ussd_cmd);
Jacob Erlbeck1b894022013-08-28 10:16:54 +0200773 install_element(MSC_NODE, &cfg_net_msc_lost_ussd_cmd);
774 install_element(MSC_NODE, &cfg_net_msc_no_lost_ussd_cmd);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200775 install_element(MSC_NODE, &cfg_net_msc_grace_ussd_cmd);
776 install_element(MSC_NODE, &cfg_net_msc_no_grace_ussd_cmd);
Holger Hans Peter Freythercbaa8802011-06-08 16:28:04 +0200777 install_element(MSC_NODE, &cfg_net_msc_type_cmd);
Holger Hans Peter Freyther31b245b2011-06-08 19:27:15 +0200778 install_element(MSC_NODE, &cfg_net_msc_emerg_cmd);
Holger Hans Peter Freytherd5edc4f2011-06-09 21:54:08 +0200779 install_element(MSC_NODE, &cfg_net_msc_local_prefix_cmd);
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +0200780 install_element(MSC_NODE, &cfg_net_msc_amr_12_2_cmd);
781 install_element(MSC_NODE, &cfg_net_msc_amr_10_2_cmd);
782 install_element(MSC_NODE, &cfg_net_msc_amr_7_95_cmd);
783 install_element(MSC_NODE, &cfg_net_msc_amr_7_40_cmd);
784 install_element(MSC_NODE, &cfg_net_msc_amr_6_70_cmd);
785 install_element(MSC_NODE, &cfg_net_msc_amr_5_90_cmd);
786 install_element(MSC_NODE, &cfg_net_msc_amr_5_15_cmd);
787 install_element(MSC_NODE, &cfg_net_msc_amr_4_75_cmd);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200788
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +0200789 install_element_ve(&show_statistics_cmd);
Holger Hans Peter Freytherc50e04a2011-10-20 11:06:31 +0200790 install_element_ve(&show_mscs_cmd);
Daniel Willmann7d109832012-05-14 18:43:23 +0200791 install_element_ve(&show_pos_cmd);
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +0200792
Holger Hans Peter Freyther98258db2014-02-22 10:30:32 +0100793 install_element(ENABLE_NODE, &gen_position_trap_cmd);
794
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800795 return 0;
796}