blob: fceaa4ad66fcde970aaa938cbe8e6131f1b67aa9 [file] [log] [blame]
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +08001/* Osmo BSC VTY Configuration */
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +02002/* (C) 2009-2011 by Holger Hans Peter Freyther
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +02003 * (C) 2009-2011 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>
22#include <openbsc/osmo_msc_data.h>
23#include <openbsc/vty.h>
24
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010025#include <osmocom/core/talloc.h>
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080026
Daniel Willmann7d109832012-05-14 18:43:23 +020027#include <time.h>
28
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +010029
30#define IPA_STR "IP.ACCESS specific\n"
31
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080032extern struct gsm_network *bsc_gsmnet;
33
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020034static struct osmo_bsc_data *osmo_bsc_data(struct vty *vty)
35{
36 return bsc_gsmnet->bsc_data;
37}
38
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080039static struct osmo_msc_data *osmo_msc_data(struct vty *vty)
40{
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +020041 return osmo_msc_data_find(bsc_gsmnet, (int) vty->index);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080042}
43
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020044static struct cmd_node bsc_node = {
45 BSC_NODE,
Jacob Erlbeck0b4f1b92013-08-30 18:33:58 +020046 "%s(config-bsc)# ",
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020047 1,
48};
49
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080050static struct cmd_node msc_node = {
51 MSC_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020052 "%s(config-msc)# ",
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080053 1,
54};
55
56DEFUN(cfg_net_msc, cfg_net_msc_cmd,
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020057 "msc [<0-1000>]", "Configure MSC details\n" "MSC connection to configure\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080058{
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020059 int index = argc == 1 ? atoi(argv[0]) : 0;
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +020060 struct osmo_msc_data *msc;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080061
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +020062 msc = osmo_msc_data_alloc(bsc_gsmnet, index);
63 if (!msc) {
64 vty_out(vty, "%%Failed to allocate MSC data.%s", VTY_NEWLINE);
65 return CMD_WARNING;
66 }
67
68 vty->index = (void *) index;
69 vty->node = MSC_NODE;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080070 return CMD_SUCCESS;
71}
72
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +020073DEFUN(cfg_net_bsc, cfg_net_bsc_cmd,
74 "bsc", "Configure BSC\n")
75{
76 vty->node = BSC_NODE;
77 return CMD_SUCCESS;
78}
79
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +020080static void write_msc_amr_options(struct vty *vty, struct osmo_msc_data *msc)
81{
82#define WRITE_AMR(vty, msc, name, var) \
83 vty_out(vty, " amr-config %s %s%s", \
84 name, msc->amr_conf.var ? "allowed" : "forbidden", \
85 VTY_NEWLINE);
86
87 WRITE_AMR(vty, msc, "12_2k", m12_2);
88 WRITE_AMR(vty, msc, "10_2k", m10_2);
89 WRITE_AMR(vty, msc, "7_95k", m7_95);
90 WRITE_AMR(vty, msc, "7_40k", m7_40);
91 WRITE_AMR(vty, msc, "6_70k", m6_70);
92 WRITE_AMR(vty, msc, "5_90k", m5_90);
93 WRITE_AMR(vty, msc, "5_15k", m5_15);
94 WRITE_AMR(vty, msc, "4_75k", m4_75);
95#undef WRITE_AMR
96}
97
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +020098static void write_msc(struct vty *vty, struct osmo_msc_data *msc)
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080099{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200100 struct bsc_msc_dest *dest;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800101
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200102 vty_out(vty, "msc %d%s", msc->nr, VTY_NEWLINE);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200103 if (msc->bsc_token)
104 vty_out(vty, " token %s%s", msc->bsc_token, VTY_NEWLINE);
105 if (msc->core_ncc != -1)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200106 vty_out(vty, " core-mobile-network-code %d%s",
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200107 msc->core_ncc, VTY_NEWLINE);
108 if (msc->core_mcc != -1)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200109 vty_out(vty, " core-mobile-country-code %d%s",
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200110 msc->core_mcc, VTY_NEWLINE);
111 vty_out(vty, " ip.access rtp-base %d%s", msc->rtp_base, VTY_NEWLINE);
112 vty_out(vty, " timeout-ping %d%s", msc->ping_timeout, VTY_NEWLINE);
113 vty_out(vty, " timeout-pong %d%s", msc->pong_timeout, VTY_NEWLINE);
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200114
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200115 if (msc->ussd_welcome_txt)
116 vty_out(vty, " bsc-welcome-text %s%s", msc->ussd_welcome_txt, VTY_NEWLINE);
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200117 else
118 vty_out(vty, " no bsc-welcome-text%s", VTY_NEWLINE);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800119
Jacob Erlbeck1b894022013-08-28 10:16:54 +0200120 if (msc->ussd_msc_lost_txt && msc->ussd_msc_lost_txt[0])
121 vty_out(vty, " bsc-msc-lost-text %s%s", msc->ussd_msc_lost_txt, VTY_NEWLINE);
122 else
123 vty_out(vty, " no bsc-msc-lost-text%s", VTY_NEWLINE);
124
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200125 if (msc->ussd_grace_txt && msc->ussd_grace_txt[0])
126 vty_out(vty, " bsc-grace-text %s%s", msc->ussd_grace_txt, VTY_NEWLINE);
127 else
128 vty_out(vty, " no bsc-grace-text%s", VTY_NEWLINE);
129
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200130 if (msc->audio_length != 0) {
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100131 int i;
132
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200133 vty_out(vty, " codec-list ");
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200134 for (i = 0; i < msc->audio_length; ++i) {
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100135 if (i != 0)
Harald Welte22ce5982013-06-19 15:32:27 +0200136 vty_out(vty, " ");
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100137
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200138 if (msc->audio_support[i]->hr)
139 vty_out(vty, "hr%.1u", msc->audio_support[i]->ver);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100140 else
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200141 vty_out(vty, "fr%.1u", msc->audio_support[i]->ver);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100142 }
143 vty_out(vty, "%s", VTY_NEWLINE);
144
145 }
146
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200147 llist_for_each_entry(dest, &msc->dests, list)
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200148 vty_out(vty, " dest %s %d %d%s", dest->ip, dest->port,
149 dest->dscp, VTY_NEWLINE);
Holger Hans Peter Freythercbaa8802011-06-08 16:28:04 +0200150
151 vty_out(vty, " type %s%s", msc->type == MSC_CON_TYPE_NORMAL ?
152 "normal" : "local", VTY_NEWLINE);
Holger Hans Peter Freyther31b245b2011-06-08 19:27:15 +0200153 vty_out(vty, " allow-emergency %s%s", msc->allow_emerg ?
154 "allow" : "deny", VTY_NEWLINE);
Holger Hans Peter Freytherd5edc4f2011-06-09 21:54:08 +0200155
156 if (msc->local_pref)
157 vty_out(vty, " local-prefix %s%s", msc->local_pref, VTY_NEWLINE);
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +0200158
159 /* write amr options */
160 write_msc_amr_options(vty, msc);
Holger Hans Peter Freyther20fea242011-06-04 19:58:26 +0200161}
162
163static int config_write_msc(struct vty *vty)
164{
165 struct osmo_msc_data *msc;
166 struct osmo_bsc_data *bsc = osmo_bsc_data(vty);
167
168 llist_for_each_entry(msc, &bsc->mscs, entry)
169 write_msc(vty, msc);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200170
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200171 return CMD_SUCCESS;
172}
173
174static int config_write_bsc(struct vty *vty)
175{
176 struct osmo_bsc_data *bsc = osmo_bsc_data(vty);
177
178 vty_out(vty, "bsc%s", VTY_NEWLINE);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200179 if (bsc->mid_call_txt)
180 vty_out(vty, " mid-call-text %s%s", bsc->mid_call_txt, VTY_NEWLINE);
181 vty_out(vty, " mid-call-timeout %d%s", bsc->mid_call_timeout, VTY_NEWLINE);
182 if (bsc->rf_ctrl_name)
183 vty_out(vty, " bsc-rf-socket %s%s",
184 bsc->rf_ctrl_name, VTY_NEWLINE);
185
Holger Hans Peter Freyther2a896072011-08-16 19:47:39 +0200186 if (bsc->auto_off_timeout != -1)
187 vty_out(vty, " bsc-auto-rf-off %d%s",
188 bsc->auto_off_timeout, VTY_NEWLINE);
189
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200190 if (bsc->ussd_no_msc_txt && bsc->ussd_no_msc_txt[0])
191 vty_out(vty, " missing-msc-text %s%s", bsc->ussd_no_msc_txt, VTY_NEWLINE);
192 else
193 vty_out(vty, " no missing-msc-text%s", VTY_NEWLINE);
194
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800195 return CMD_SUCCESS;
196}
197
Holger Hans Peter Freyther5b848f32010-11-03 13:11:14 +0100198DEFUN(cfg_net_bsc_token,
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800199 cfg_net_bsc_token_cmd,
200 "token TOKEN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100201 "A token for the BSC to be sent to the MSC\n" "A token\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800202{
203 struct osmo_msc_data *data = osmo_msc_data(vty);
204
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200205 bsc_replace_string(osmo_bsc_data(vty), &data->bsc_token, argv[0]);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800206 return CMD_SUCCESS;
207}
208
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100209DEFUN(cfg_net_bsc_ncc,
210 cfg_net_bsc_ncc_cmd,
Holger Hans Peter Freyther6e1a6762011-02-10 11:37:13 +0100211 "core-mobile-network-code <1-999>",
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100212 "Use this network code for the backbone\n" "NCC value\n")
213{
214 struct osmo_msc_data *data = osmo_msc_data(vty);
215 data->core_ncc = atoi(argv[0]);
216 return CMD_SUCCESS;
217}
218
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100219DEFUN(cfg_net_bsc_mcc,
220 cfg_net_bsc_mcc_cmd,
Holger Hans Peter Freyther6e1a6762011-02-10 11:37:13 +0100221 "core-mobile-country-code <1-999>",
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100222 "Use this country code for the backbone\n" "MCC value\n")
223{
224 struct osmo_msc_data *data = osmo_msc_data(vty);
225 data->core_mcc = atoi(argv[0]);
226 return CMD_SUCCESS;
227}
228
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +0100229DEFUN(cfg_net_bsc_rtp_base,
230 cfg_net_bsc_rtp_base_cmd,
231 "ip.access rtp-base <1-65000>",
232 IPA_STR
233 "Set the rtp-base port for the RTP stream\n"
234 "Port number\n")
235{
236 struct osmo_msc_data *data = osmo_msc_data(vty);
237 data->rtp_base = atoi(argv[0]);
238 return CMD_SUCCESS;
239}
240
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100241DEFUN(cfg_net_bsc_codec_list,
242 cfg_net_bsc_codec_list_cmd,
243 "codec-list .LIST",
244 "Set the allowed audio codecs\n"
245 "List of audio codecs\n")
246{
247 struct osmo_msc_data *data = osmo_msc_data(vty);
248 int saw_fr, saw_hr;
249 int i;
250
251 saw_fr = saw_hr = 0;
252
253 /* free the old list... if it exists */
254 if (data->audio_support) {
255 talloc_free(data->audio_support);
256 data->audio_support = NULL;
257 data->audio_length = 0;
258 }
259
260 /* create a new array */
261 data->audio_support =
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200262 talloc_zero_array(osmo_bsc_data(vty), struct gsm_audio_support *, argc);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100263 data->audio_length = argc;
264
265 for (i = 0; i < argc; ++i) {
266 /* check for hrX or frX */
267 if (strlen(argv[i]) != 3
268 || argv[i][1] != 'r'
269 || (argv[i][0] != 'h' && argv[i][0] != 'f')
270 || argv[i][2] < 0x30
271 || argv[i][2] > 0x39)
272 goto error;
273
274 data->audio_support[i] = talloc_zero(data->audio_support,
275 struct gsm_audio_support);
276 data->audio_support[i]->ver = atoi(argv[i] + 2);
277
278 if (strncmp("hr", argv[i], 2) == 0) {
279 data->audio_support[i]->hr = 1;
280 saw_hr = 1;
281 } else if (strncmp("fr", argv[i], 2) == 0) {
282 data->audio_support[i]->hr = 0;
283 saw_fr = 1;
284 }
285
286 if (saw_hr && saw_fr) {
287 vty_out(vty, "Can not have full-rate and half-rate codec.%s",
288 VTY_NEWLINE);
289 return CMD_ERR_INCOMPLETE;
290 }
291 }
292
293 return CMD_SUCCESS;
294
295error:
296 vty_out(vty, "Codec name must be hrX or frX. Was '%s'%s",
297 argv[i], VTY_NEWLINE);
298 return CMD_ERR_INCOMPLETE;
299}
300
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200301DEFUN(cfg_net_msc_dest,
302 cfg_net_msc_dest_cmd,
303 "dest A.B.C.D <1-65000> <0-255>",
304 "Add a destination to a MUX/MSC\n"
305 "IP Address\n" "Port\n" "DSCP\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800306{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200307 struct bsc_msc_dest *dest;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800308 struct osmo_msc_data *data = osmo_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800309
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200310 dest = talloc_zero(osmo_bsc_data(vty), struct bsc_msc_dest);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200311 if (!dest) {
312 vty_out(vty, "%%Failed to create structure.%s", VTY_NEWLINE);
313 return CMD_WARNING;
314 }
315
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200316 dest->ip = talloc_strdup(dest, argv[0]);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200317 if (!dest->ip) {
318 vty_out(vty, "%%Failed to copy dest ip.%s", VTY_NEWLINE);
319 talloc_free(dest);
320 return CMD_WARNING;
321 }
322
323 dest->port = atoi(argv[1]);
324 dest->dscp = atoi(argv[2]);
325 llist_add_tail(&dest->list, &data->dests);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800326 return CMD_SUCCESS;
327}
328
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200329DEFUN(cfg_net_msc_no_dest,
330 cfg_net_msc_no_dest_cmd,
331 "no dest A.B.C.D <1-65000> <0-255>",
332 NO_STR "Remove a destination to a MUX/MSC\n"
333 "IP Address\n" "Port\n" "DSCP\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800334{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200335 struct bsc_msc_dest *dest, *tmp;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800336 struct osmo_msc_data *data = osmo_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800337
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200338 int port = atoi(argv[1]);
339 int dscp = atoi(argv[2]);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800340
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200341 llist_for_each_entry_safe(dest, tmp, &data->dests, list) {
342 if (port != dest->port || dscp != dest->dscp
343 || strcmp(dest->ip, argv[0]) != 0)
344 continue;
345
346 llist_del(&dest->list);
347 talloc_free(dest);
348 }
349
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800350 return CMD_SUCCESS;
351}
352
353DEFUN(cfg_net_msc_ping_time,
354 cfg_net_msc_ping_time_cmd,
355 "timeout-ping NR",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100356 "Set the PING interval, negative for not sending PING\n"
357 "Timeout in seconds\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800358{
359 struct osmo_msc_data *data = osmo_msc_data(vty);
360 data->ping_timeout = atoi(argv[0]);
361 return CMD_SUCCESS;
362}
363
364DEFUN(cfg_net_msc_pong_time,
365 cfg_net_msc_pong_time_cmd,
366 "timeout-pong NR",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100367 "Set the time to wait for a PONG\n" "Timeout in seconds\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800368{
369 struct osmo_msc_data *data = osmo_msc_data(vty);
370 data->pong_timeout = atoi(argv[0]);
371 return CMD_SUCCESS;
372}
373
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200374DEFUN(cfg_net_msc_welcome_ussd,
375 cfg_net_msc_welcome_ussd_cmd,
376 "bsc-welcome-text .TEXT",
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200377 "Set the USSD notification to be sent\n" "Text to be sent\n")
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200378{
379 struct osmo_msc_data *data = osmo_msc_data(vty);
380 char *str = argv_concat(argv, argc, 0);
381 if (!str)
382 return CMD_WARNING;
383
384 bsc_replace_string(osmo_bsc_data(vty), &data->ussd_welcome_txt, str);
385 talloc_free(str);
386 return CMD_SUCCESS;
387}
388
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200389DEFUN(cfg_net_msc_no_welcome_ussd,
390 cfg_net_msc_no_welcome_ussd_cmd,
391 "no bsc-welcome-text",
392 NO_STR "Clear the USSD notification to be sent\n")
393{
394 struct osmo_msc_data *data = osmo_msc_data(vty);
395
396 talloc_free(data->ussd_welcome_txt);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200397 data->ussd_welcome_txt = NULL;
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200398
399 return CMD_SUCCESS;
400}
401
Jacob Erlbeck1b894022013-08-28 10:16:54 +0200402DEFUN(cfg_net_msc_lost_ussd,
403 cfg_net_msc_lost_ussd_cmd,
404 "bsc-msc-lost-text .TEXT",
405 "Set the USSD notification to be sent on MSC connection loss\n" "Text to be sent\n")
406{
407 struct osmo_msc_data *data = osmo_msc_data(vty);
408 char *str = argv_concat(argv, argc, 0);
409 if (!str)
410 return CMD_WARNING;
411
412 bsc_replace_string(osmo_bsc_data(vty), &data->ussd_msc_lost_txt, str);
413 talloc_free(str);
414 return CMD_SUCCESS;
415}
416
417DEFUN(cfg_net_msc_no_lost_ussd,
418 cfg_net_msc_no_lost_ussd_cmd,
419 "no bsc-msc-lost-text",
420 NO_STR "Clear the USSD notification to be sent on MSC connection loss\n")
421{
422 struct osmo_msc_data *data = osmo_msc_data(vty);
423
424 talloc_free(data->ussd_msc_lost_txt);
425 data->ussd_msc_lost_txt = 0;
426
427 return CMD_SUCCESS;
428}
429
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200430DEFUN(cfg_net_msc_grace_ussd,
431 cfg_net_msc_grace_ussd_cmd,
432 "bsc-grace-text .TEXT",
433 "Set the USSD notification to be sent when the MSC has entered the grace period\n" "Text to be sent\n")
434{
435 struct osmo_msc_data *data = osmo_msc_data(vty);
436 char *str = argv_concat(argv, argc, 0);
437 if (!str)
438 return CMD_WARNING;
439
440 bsc_replace_string(osmo_bsc_data(vty), &data->ussd_grace_txt, str);
441 talloc_free(str);
442 return CMD_SUCCESS;
443}
444
445DEFUN(cfg_net_msc_no_grace_ussd,
446 cfg_net_msc_no_grace_ussd_cmd,
447 "no bsc-grace-text",
448 NO_STR "Clear the USSD notification to be sent when the MSC has entered the grace period\n")
449{
450 struct osmo_msc_data *data = osmo_msc_data(vty);
451
452 talloc_free(data->ussd_grace_txt);
453 data->ussd_grace_txt = NULL;
454
455 return CMD_SUCCESS;
456}
457
458DEFUN(cfg_net_bsc_missing_msc_ussd,
459 cfg_net_bsc_missing_msc_ussd_cmd,
460 "missing-msc-text .TEXT",
461 "Set the USSD notification to be send when a MSC has not been found.\n" "Text to be sent\n")
462{
463 struct osmo_bsc_data *data = osmo_bsc_data(vty);
464 char *txt = argv_concat(argv, argc, 0);
465 if (!txt)
466 return CMD_WARNING;
467
468 bsc_replace_string(data, &data->ussd_no_msc_txt, txt);
469 talloc_free(txt);
470 return CMD_SUCCESS;
471}
472
473DEFUN(cfg_net_bsc_no_missing_msc_text,
474 cfg_net_bsc_no_missing_msc_text_cmd,
475 "no missing-msc-text",
476 NO_STR "Clear the USSD notification to be send when a MSC has not been found.\n")
477{
478 struct osmo_bsc_data *data = osmo_bsc_data(vty);
479
480 talloc_free(data->ussd_no_msc_txt);
481 data->ussd_no_msc_txt = 0;
482
483 return CMD_SUCCESS;
484}
485
486
Holger Hans Peter Freythercbaa8802011-06-08 16:28:04 +0200487DEFUN(cfg_net_msc_type,
488 cfg_net_msc_type_cmd,
489 "type (normal|local)",
490 "Select the MSC type\n"
491 "Plain GSM MSC\n" "Special MSC for local call routing\n")
492{
493 struct osmo_msc_data *data = osmo_msc_data(vty);
494
495 if (strcmp(argv[0], "normal") == 0)
496 data->type = MSC_CON_TYPE_NORMAL;
497 else if (strcmp(argv[0], "local") == 0)
498 data->type = MSC_CON_TYPE_LOCAL;
499
500 return CMD_SUCCESS;
501}
502
Holger Hans Peter Freyther31b245b2011-06-08 19:27:15 +0200503DEFUN(cfg_net_msc_emerg,
504 cfg_net_msc_emerg_cmd,
505 "allow-emergency (allow|deny)",
506 "Allow CM ServiceRequests with type emergency\n"
507 "Allow\n" "Deny\n")
508{
509 struct osmo_msc_data *data = osmo_msc_data(vty);
510 data->allow_emerg = strcmp("allow", argv[0]) == 0;
511 return CMD_SUCCESS;
512}
513
Holger Hans Peter Freytherd5edc4f2011-06-09 21:54:08 +0200514DEFUN(cfg_net_msc_local_prefix,
515 cfg_net_msc_local_prefix_cmd,
516 "local-prefix REGEXP",
517 "Prefix for local numbers\n" "REGEXP used\n")
518{
519 struct osmo_msc_data *msc = osmo_msc_data(vty);
520
521 if (gsm_parse_reg(msc, &msc->local_pref_reg, &msc->local_pref, argc, argv) != 0) {
522 vty_out(vty, "%%Failed to parse the regexp: '%s'%s",
523 argv[0], VTY_NEWLINE);
524 return CMD_WARNING;
525 }
526
527 return CMD_SUCCESS;
528}
529
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +0200530#define AMR_CONF_STR "AMR Multirate Configuration\n"
531#define AMR_COMMAND(name) \
532 DEFUN(cfg_net_msc_amr_##name, \
533 cfg_net_msc_amr_##name##_cmd, \
534 "amr-config " #name "k (allowed|forbidden)", \
535 AMR_CONF_STR "Bitrate\n" "Allowed\n" "Forbidden\n") \
536{ \
537 struct osmo_msc_data *msc = osmo_msc_data(vty); \
538 \
539 msc->amr_conf.m##name = strcmp(argv[0], "allowed") == 0; \
540 return CMD_SUCCESS; \
541}
542
543AMR_COMMAND(12_2)
544AMR_COMMAND(10_2)
545AMR_COMMAND(7_95)
546AMR_COMMAND(7_40)
547AMR_COMMAND(6_70)
548AMR_COMMAND(5_90)
549AMR_COMMAND(5_15)
550AMR_COMMAND(4_75)
551
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200552DEFUN(cfg_net_bsc_mid_call_text,
553 cfg_net_bsc_mid_call_text_cmd,
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100554 "mid-call-text .TEXT",
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800555 "Set the USSD notifcation to be send.\n" "Text to be sent\n")
556{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200557 struct osmo_bsc_data *data = osmo_bsc_data(vty);
Holger Hans Peter Freyther414bc4a2010-11-22 22:27:39 +0100558 char *txt = argv_concat(argv, argc, 0);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800559 if (!txt)
560 return CMD_WARNING;
561
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100562 bsc_replace_string(data, &data->mid_call_txt, txt);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800563 talloc_free(txt);
564 return CMD_SUCCESS;
565}
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800566
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200567DEFUN(cfg_net_bsc_mid_call_timeout,
568 cfg_net_bsc_mid_call_timeout_cmd,
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100569 "mid-call-timeout NR",
Holger Hans Peter Freyther625b6e42010-11-22 18:25:02 +0100570 "Switch from Grace to Off in NR seconds.\n" "Timeout in seconds\n")
571{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200572 struct osmo_bsc_data *data = osmo_bsc_data(vty);
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100573 data->mid_call_timeout = atoi(argv[0]);
Holger Hans Peter Freyther625b6e42010-11-22 18:25:02 +0100574 return CMD_SUCCESS;
575}
576
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +0200577DEFUN(cfg_net_rf_socket,
578 cfg_net_rf_socket_cmd,
579 "bsc-rf-socket PATH",
580 "Set the filename for the RF control interface.\n" "RF Control path\n")
581{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200582 struct osmo_bsc_data *data = osmo_bsc_data(vty);
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +0200583
584 bsc_replace_string(data, &data->rf_ctrl_name, argv[0]);
585 return CMD_SUCCESS;
586}
587
Holger Hans Peter Freyther2a896072011-08-16 19:47:39 +0200588DEFUN(cfg_net_rf_off_time,
589 cfg_net_rf_off_time_cmd,
590 "bsc-auto-rf-off <1-65000>",
591 "Disable RF on MSC Connection\n" "Timeout\n")
592{
593 struct osmo_bsc_data *data = osmo_bsc_data(vty);
594 data->auto_off_timeout = atoi(argv[0]);
595 return CMD_SUCCESS;
596}
597
598DEFUN(cfg_net_no_rf_off_time,
599 cfg_net_no_rf_off_time_cmd,
600 "no bsc-auto-rf-off",
601 NO_STR "Disable RF on MSC Connection\n")
602{
603 struct osmo_bsc_data *data = osmo_bsc_data(vty);
604 data->auto_off_timeout = -1;
605 return CMD_SUCCESS;
606}
607
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +0200608DEFUN(show_statistics,
609 show_statistics_cmd,
610 "show statistics",
611 SHOW_STR "Statistics about the BSC\n")
612{
613 openbsc_vty_print_statistics(vty, bsc_gsmnet);
614 return CMD_SUCCESS;
615}
616
Holger Hans Peter Freytherc50e04a2011-10-20 11:06:31 +0200617DEFUN(show_mscs,
618 show_mscs_cmd,
619 "show mscs",
620 SHOW_STR "MSC Connections and State\n")
621{
622 struct osmo_msc_data *msc;
623 llist_for_each_entry(msc, &bsc_gsmnet->bsc_data->mscs, entry) {
624 vty_out(vty, "MSC Nr: %d is connected: %d auth: %d.%s",
625 msc->nr,
626 msc->msc_con ? msc->msc_con->is_connected : -1,
627 msc->msc_con ? msc->msc_con->is_authenticated : -1,
628 VTY_NEWLINE);
629 }
630
631 return CMD_SUCCESS;
632}
633
Daniel Willmann7d109832012-05-14 18:43:23 +0200634DEFUN(show_pos,
635 show_pos_cmd,
636 "show position",
637 SHOW_STR "Position information of the BTS\n")
638{
639 struct gsm_bts *bts;
640 struct bts_location *curloc;
641 struct tm time;
642 char timestr[50];
643
644 llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {
645 if (llist_empty(&bts->loc_list)) {
646 vty_out(vty, "BTS Nr: %d position invalid%s", bts->nr,
647 VTY_NEWLINE);
648 continue;
649 }
650 curloc = llist_entry(bts->loc_list.next, struct bts_location, list);
651 if (gmtime_r(&curloc->tstamp, &time) == NULL) {
652 vty_out(vty, "Time conversion failed for BTS %d%s", bts->nr,
653 VTY_NEWLINE);
654 continue;
655 }
656 if (asctime_r(&time, timestr) == NULL) {
657 vty_out(vty, "Time conversion failed for BTS %d%s", bts->nr,
658 VTY_NEWLINE);
659 continue;
660 }
661 /* Last character in asctime is \n */
662 timestr[strlen(timestr)-1] = 0;
663
664 vty_out(vty, "BTS Nr: %d position: %s time: %s%s", bts->nr,
665 get_value_string(bts_loc_fix_names, curloc->valid), timestr,
666 VTY_NEWLINE);
667 vty_out(vty, " lat: %f lon: %f height: %f%s", curloc->lat, curloc->lon,
668 curloc->height, VTY_NEWLINE);
669 }
670 return CMD_SUCCESS;
671}
672
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800673int bsc_vty_init_extra(void)
674{
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200675 install_element(CONFIG_NODE, &cfg_net_msc_cmd);
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200676 install_element(CONFIG_NODE, &cfg_net_bsc_cmd);
677
678 install_node(&bsc_node, config_write_bsc);
Jacob Erlbeck0ae92a92013-09-02 13:17:16 +0200679 bsc_install_default(BSC_NODE);
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200680 install_element(BSC_NODE, &cfg_net_bsc_mid_call_text_cmd);
681 install_element(BSC_NODE, &cfg_net_bsc_mid_call_timeout_cmd);
682 install_element(BSC_NODE, &cfg_net_rf_socket_cmd);
Holger Hans Peter Freyther2a896072011-08-16 19:47:39 +0200683 install_element(BSC_NODE, &cfg_net_rf_off_time_cmd);
684 install_element(BSC_NODE, &cfg_net_no_rf_off_time_cmd);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200685 install_element(BSC_NODE, &cfg_net_bsc_missing_msc_ussd_cmd);
686 install_element(BSC_NODE, &cfg_net_bsc_no_missing_msc_text_cmd);
Holger Hans Peter Freyther8b902d72011-06-04 20:22:49 +0200687
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800688 install_node(&msc_node, config_write_msc);
Jacob Erlbeck0ae92a92013-09-02 13:17:16 +0200689 bsc_install_default(MSC_NODE);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800690 install_element(MSC_NODE, &cfg_net_bsc_token_cmd);
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100691 install_element(MSC_NODE, &cfg_net_bsc_ncc_cmd);
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100692 install_element(MSC_NODE, &cfg_net_bsc_mcc_cmd);
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +0100693 install_element(MSC_NODE, &cfg_net_bsc_rtp_base_cmd);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100694 install_element(MSC_NODE, &cfg_net_bsc_codec_list_cmd);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200695 install_element(MSC_NODE, &cfg_net_msc_dest_cmd);
696 install_element(MSC_NODE, &cfg_net_msc_no_dest_cmd);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800697 install_element(MSC_NODE, &cfg_net_msc_ping_time_cmd);
698 install_element(MSC_NODE, &cfg_net_msc_pong_time_cmd);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200699 install_element(MSC_NODE, &cfg_net_msc_welcome_ussd_cmd);
Jacob Erlbeck97e139f2013-08-28 10:16:55 +0200700 install_element(MSC_NODE, &cfg_net_msc_no_welcome_ussd_cmd);
Jacob Erlbeck1b894022013-08-28 10:16:54 +0200701 install_element(MSC_NODE, &cfg_net_msc_lost_ussd_cmd);
702 install_element(MSC_NODE, &cfg_net_msc_no_lost_ussd_cmd);
Jacob Erlbeck56595f82013-09-11 10:46:55 +0200703 install_element(MSC_NODE, &cfg_net_msc_grace_ussd_cmd);
704 install_element(MSC_NODE, &cfg_net_msc_no_grace_ussd_cmd);
Holger Hans Peter Freythercbaa8802011-06-08 16:28:04 +0200705 install_element(MSC_NODE, &cfg_net_msc_type_cmd);
Holger Hans Peter Freyther31b245b2011-06-08 19:27:15 +0200706 install_element(MSC_NODE, &cfg_net_msc_emerg_cmd);
Holger Hans Peter Freytherd5edc4f2011-06-09 21:54:08 +0200707 install_element(MSC_NODE, &cfg_net_msc_local_prefix_cmd);
Holger Hans Peter Freyther75077952011-08-06 08:31:51 +0200708 install_element(MSC_NODE, &cfg_net_msc_amr_12_2_cmd);
709 install_element(MSC_NODE, &cfg_net_msc_amr_10_2_cmd);
710 install_element(MSC_NODE, &cfg_net_msc_amr_7_95_cmd);
711 install_element(MSC_NODE, &cfg_net_msc_amr_7_40_cmd);
712 install_element(MSC_NODE, &cfg_net_msc_amr_6_70_cmd);
713 install_element(MSC_NODE, &cfg_net_msc_amr_5_90_cmd);
714 install_element(MSC_NODE, &cfg_net_msc_amr_5_15_cmd);
715 install_element(MSC_NODE, &cfg_net_msc_amr_4_75_cmd);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200716
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +0200717 install_element_ve(&show_statistics_cmd);
Holger Hans Peter Freytherc50e04a2011-10-20 11:06:31 +0200718 install_element_ve(&show_mscs_cmd);
Daniel Willmann7d109832012-05-14 18:43:23 +0200719 install_element_ve(&show_pos_cmd);
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +0200720
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800721 return 0;
722}