blob: 0b1698e41a37f5f0c79558b85ed4391dceddb8bc [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
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +010027
28#define IPA_STR "IP.ACCESS specific\n"
29
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080030extern struct gsm_network *bsc_gsmnet;
31
32static struct osmo_msc_data *osmo_msc_data(struct vty *vty)
33{
34 return bsc_gsmnet->msc_data;
35}
36
37static struct cmd_node msc_node = {
38 MSC_NODE,
39 "%s(msc)#",
40 1,
41};
42
43DEFUN(cfg_net_msc, cfg_net_msc_cmd,
44 "msc", "Configure MSC details")
45{
46 vty->index = bsc_gsmnet;
47 vty->node = MSC_NODE;
48
49 return CMD_SUCCESS;
50}
51
52static int config_write_msc(struct vty *vty)
53{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +020054 struct bsc_msc_dest *dest;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080055 struct osmo_msc_data *data = osmo_msc_data(vty);
56
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020057 vty_out(vty, "msc%s", VTY_NEWLINE);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080058 if (data->bsc_token)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020059 vty_out(vty, " token %s%s", data->bsc_token, VTY_NEWLINE);
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +010060 if (data->core_ncc != -1)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020061 vty_out(vty, " core-mobile-network-code %d%s",
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +010062 data->core_ncc, VTY_NEWLINE);
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +010063 if (data->core_mcc != -1)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020064 vty_out(vty, " core-mobile-country-code %d%s",
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +010065 data->core_mcc, VTY_NEWLINE);
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020066 vty_out(vty, " ip.access rtp-base %d%s", data->rtp_base, VTY_NEWLINE);
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020067 vty_out(vty, " timeout-ping %d%s", data->ping_timeout, VTY_NEWLINE);
68 vty_out(vty, " timeout-pong %d%s", data->pong_timeout, VTY_NEWLINE);
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +010069 if (data->mid_call_txt)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020070 vty_out(vty, " mid-call-text %s%s", data->mid_call_txt, VTY_NEWLINE);
71 vty_out(vty, " mid-call-timeout %d%s", data->mid_call_timeout, VTY_NEWLINE);
Holger Hans Peter Freytherfbceea42010-11-26 00:11:34 +010072 if (data->ussd_welcome_txt)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020073 vty_out(vty, " bsc-welcome-text %s%s", data->ussd_welcome_txt, VTY_NEWLINE);
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +020074 if (data->rf_ctrl_name)
75 vty_out(vty, " bsc-rf-socket %s%s",
76 data->rf_ctrl_name, VTY_NEWLINE);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080077
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +010078 if (data->audio_length != 0) {
79 int i;
80
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020081 vty_out(vty, " codec-list ");
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +010082 for (i = 0; i < data->audio_length; ++i) {
83 if (i != 0)
84 vty_out(vty, ", ");
85
86 if (data->audio_support[i]->hr)
87 vty_out(vty, "hr%.1u", data->audio_support[i]->ver);
88 else
89 vty_out(vty, "fr%.1u", data->audio_support[i]->ver);
90 }
91 vty_out(vty, "%s", VTY_NEWLINE);
92
93 }
94
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +020095 llist_for_each_entry(dest, &data->dests, list)
96 vty_out(vty, " dest %s %d %d%s", dest->ip, dest->port,
97 dest->dscp, VTY_NEWLINE);
98
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080099 return CMD_SUCCESS;
100}
101
Holger Hans Peter Freyther5b848f32010-11-03 13:11:14 +0100102DEFUN(cfg_net_bsc_token,
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800103 cfg_net_bsc_token_cmd,
104 "token TOKEN",
105 "A token for the BSC to be sent to the MSC")
106{
107 struct osmo_msc_data *data = osmo_msc_data(vty);
108
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200109 bsc_replace_string(data, &data->bsc_token, argv[0]);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800110 return CMD_SUCCESS;
111}
112
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100113DEFUN(cfg_net_bsc_ncc,
114 cfg_net_bsc_ncc_cmd,
Holger Hans Peter Freyther6e1a6762011-02-10 11:37:13 +0100115 "core-mobile-network-code <1-999>",
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100116 "Use this network code for the backbone\n" "NCC value\n")
117{
118 struct osmo_msc_data *data = osmo_msc_data(vty);
119 data->core_ncc = atoi(argv[0]);
120 return CMD_SUCCESS;
121}
122
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100123DEFUN(cfg_net_bsc_mcc,
124 cfg_net_bsc_mcc_cmd,
Holger Hans Peter Freyther6e1a6762011-02-10 11:37:13 +0100125 "core-mobile-country-code <1-999>",
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100126 "Use this country code for the backbone\n" "MCC value\n")
127{
128 struct osmo_msc_data *data = osmo_msc_data(vty);
129 data->core_mcc = atoi(argv[0]);
130 return CMD_SUCCESS;
131}
132
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +0100133DEFUN(cfg_net_bsc_rtp_base,
134 cfg_net_bsc_rtp_base_cmd,
135 "ip.access rtp-base <1-65000>",
136 IPA_STR
137 "Set the rtp-base port for the RTP stream\n"
138 "Port number\n")
139{
140 struct osmo_msc_data *data = osmo_msc_data(vty);
141 data->rtp_base = atoi(argv[0]);
142 return CMD_SUCCESS;
143}
144
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100145DEFUN(cfg_net_bsc_codec_list,
146 cfg_net_bsc_codec_list_cmd,
147 "codec-list .LIST",
148 "Set the allowed audio codecs\n"
149 "List of audio codecs\n")
150{
151 struct osmo_msc_data *data = osmo_msc_data(vty);
152 int saw_fr, saw_hr;
153 int i;
154
155 saw_fr = saw_hr = 0;
156
157 /* free the old list... if it exists */
158 if (data->audio_support) {
159 talloc_free(data->audio_support);
160 data->audio_support = NULL;
161 data->audio_length = 0;
162 }
163
164 /* create a new array */
165 data->audio_support =
166 talloc_zero_array(data, struct gsm_audio_support *, argc);
167 data->audio_length = argc;
168
169 for (i = 0; i < argc; ++i) {
170 /* check for hrX or frX */
171 if (strlen(argv[i]) != 3
172 || argv[i][1] != 'r'
173 || (argv[i][0] != 'h' && argv[i][0] != 'f')
174 || argv[i][2] < 0x30
175 || argv[i][2] > 0x39)
176 goto error;
177
178 data->audio_support[i] = talloc_zero(data->audio_support,
179 struct gsm_audio_support);
180 data->audio_support[i]->ver = atoi(argv[i] + 2);
181
182 if (strncmp("hr", argv[i], 2) == 0) {
183 data->audio_support[i]->hr = 1;
184 saw_hr = 1;
185 } else if (strncmp("fr", argv[i], 2) == 0) {
186 data->audio_support[i]->hr = 0;
187 saw_fr = 1;
188 }
189
190 if (saw_hr && saw_fr) {
191 vty_out(vty, "Can not have full-rate and half-rate codec.%s",
192 VTY_NEWLINE);
193 return CMD_ERR_INCOMPLETE;
194 }
195 }
196
197 return CMD_SUCCESS;
198
199error:
200 vty_out(vty, "Codec name must be hrX or frX. Was '%s'%s",
201 argv[i], VTY_NEWLINE);
202 return CMD_ERR_INCOMPLETE;
203}
204
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200205DEFUN(cfg_net_msc_dest,
206 cfg_net_msc_dest_cmd,
207 "dest A.B.C.D <1-65000> <0-255>",
208 "Add a destination to a MUX/MSC\n"
209 "IP Address\n" "Port\n" "DSCP\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800210{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200211 struct bsc_msc_dest *dest;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800212 struct osmo_msc_data *data = osmo_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800213
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200214 dest = talloc_zero(data, struct bsc_msc_dest);
215 if (!dest) {
216 vty_out(vty, "%%Failed to create structure.%s", VTY_NEWLINE);
217 return CMD_WARNING;
218 }
219
220 dest->ip = talloc_strdup(data, argv[0]);
221 if (!dest->ip) {
222 vty_out(vty, "%%Failed to copy dest ip.%s", VTY_NEWLINE);
223 talloc_free(dest);
224 return CMD_WARNING;
225 }
226
227 dest->port = atoi(argv[1]);
228 dest->dscp = atoi(argv[2]);
229 llist_add_tail(&dest->list, &data->dests);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800230 return CMD_SUCCESS;
231}
232
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200233DEFUN(cfg_net_msc_no_dest,
234 cfg_net_msc_no_dest_cmd,
235 "no dest A.B.C.D <1-65000> <0-255>",
236 NO_STR "Remove a destination to a MUX/MSC\n"
237 "IP Address\n" "Port\n" "DSCP\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800238{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200239 struct bsc_msc_dest *dest, *tmp;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800240 struct osmo_msc_data *data = osmo_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800241
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200242 int port = atoi(argv[1]);
243 int dscp = atoi(argv[2]);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800244
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200245 llist_for_each_entry_safe(dest, tmp, &data->dests, list) {
246 if (port != dest->port || dscp != dest->dscp
247 || strcmp(dest->ip, argv[0]) != 0)
248 continue;
249
250 llist_del(&dest->list);
251 talloc_free(dest);
252 }
253
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800254 return CMD_SUCCESS;
255}
256
257DEFUN(cfg_net_msc_ping_time,
258 cfg_net_msc_ping_time_cmd,
259 "timeout-ping NR",
260 "Set the PING interval, negative for not sending PING")
261{
262 struct osmo_msc_data *data = osmo_msc_data(vty);
263 data->ping_timeout = atoi(argv[0]);
264 return CMD_SUCCESS;
265}
266
267DEFUN(cfg_net_msc_pong_time,
268 cfg_net_msc_pong_time_cmd,
269 "timeout-pong NR",
270 "Set the time to wait for a PONG.")
271{
272 struct osmo_msc_data *data = osmo_msc_data(vty);
273 data->pong_timeout = atoi(argv[0]);
274 return CMD_SUCCESS;
275}
276
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100277DEFUN(cfg_net_msc_mid_call_text,
278 cfg_net_msc_mid_call_text_cmd,
279 "mid-call-text .TEXT",
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800280 "Set the USSD notifcation to be send.\n" "Text to be sent\n")
281{
282 struct osmo_msc_data *data = osmo_msc_data(vty);
Holger Hans Peter Freyther414bc4a2010-11-22 22:27:39 +0100283 char *txt = argv_concat(argv, argc, 0);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800284 if (!txt)
285 return CMD_WARNING;
286
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100287 bsc_replace_string(data, &data->mid_call_txt, txt);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800288 talloc_free(txt);
289 return CMD_SUCCESS;
290}
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800291
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100292DEFUN(cfg_net_msc_mid_call_timeout,
293 cfg_net_msc_mid_call_timeout_cmd,
294 "mid-call-timeout NR",
Holger Hans Peter Freyther625b6e42010-11-22 18:25:02 +0100295 "Switch from Grace to Off in NR seconds.\n" "Timeout in seconds\n")
296{
297 struct osmo_msc_data *data = osmo_msc_data(vty);
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100298 data->mid_call_timeout = atoi(argv[0]);
Holger Hans Peter Freyther625b6e42010-11-22 18:25:02 +0100299 return CMD_SUCCESS;
300}
301
Holger Hans Peter Freytherfbceea42010-11-26 00:11:34 +0100302DEFUN(cfg_net_msc_welcome_ussd,
303 cfg_net_msc_welcome_ussd_cmd,
304 "bsc-welcome-text .TEXT",
305 "Set the USSD notification to be sent.\n" "Text to be sent\n")
306{
307 struct osmo_msc_data *data = osmo_msc_data(vty);
308 char *str = argv_concat(argv, argc, 0);
309 if (!str)
310 return CMD_WARNING;
311
312 bsc_replace_string(data, &data->ussd_welcome_txt, str);
313 talloc_free(str);
314 return CMD_SUCCESS;
315}
Holger Hans Peter Freyther625b6e42010-11-22 18:25:02 +0100316
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +0200317DEFUN(cfg_net_rf_socket,
318 cfg_net_rf_socket_cmd,
319 "bsc-rf-socket PATH",
320 "Set the filename for the RF control interface.\n" "RF Control path\n")
321{
322 struct osmo_msc_data *data = osmo_msc_data(vty);
323
324 bsc_replace_string(data, &data->rf_ctrl_name, argv[0]);
325 return CMD_SUCCESS;
326}
327
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +0200328DEFUN(show_statistics,
329 show_statistics_cmd,
330 "show statistics",
331 SHOW_STR "Statistics about the BSC\n")
332{
333 openbsc_vty_print_statistics(vty, bsc_gsmnet);
334 return CMD_SUCCESS;
335}
336
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800337int bsc_vty_init_extra(void)
338{
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200339 install_element(CONFIG_NODE, &cfg_net_msc_cmd);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800340 install_node(&msc_node, config_write_msc);
341 install_default(MSC_NODE);
342 install_element(MSC_NODE, &cfg_net_bsc_token_cmd);
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100343 install_element(MSC_NODE, &cfg_net_bsc_ncc_cmd);
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100344 install_element(MSC_NODE, &cfg_net_bsc_mcc_cmd);
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +0100345 install_element(MSC_NODE, &cfg_net_bsc_rtp_base_cmd);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100346 install_element(MSC_NODE, &cfg_net_bsc_codec_list_cmd);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200347 install_element(MSC_NODE, &cfg_net_msc_dest_cmd);
348 install_element(MSC_NODE, &cfg_net_msc_no_dest_cmd);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800349 install_element(MSC_NODE, &cfg_net_msc_ping_time_cmd);
350 install_element(MSC_NODE, &cfg_net_msc_pong_time_cmd);
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100351 install_element(MSC_NODE, &cfg_net_msc_mid_call_text_cmd);
352 install_element(MSC_NODE, &cfg_net_msc_mid_call_timeout_cmd);
Holger Hans Peter Freytherfbceea42010-11-26 00:11:34 +0100353 install_element(MSC_NODE, &cfg_net_msc_welcome_ussd_cmd);
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +0200354 install_element(MSC_NODE, &cfg_net_rf_socket_cmd);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800355
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +0200356 install_element_ve(&show_statistics_cmd);
357
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800358 return 0;
359}