blob: 8e687e308e7a3822b24edd902a68010550402ec7 [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
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020032static struct osmo_bsc_data *osmo_bsc_data(struct vty *vty)
33{
34 return bsc_gsmnet->bsc_data;
35}
36
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080037static struct osmo_msc_data *osmo_msc_data(struct vty *vty)
38{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020039 return &bsc_gsmnet->bsc_data->msc;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080040}
41
42static struct cmd_node msc_node = {
43 MSC_NODE,
44 "%s(msc)#",
45 1,
46};
47
48DEFUN(cfg_net_msc, cfg_net_msc_cmd,
49 "msc", "Configure MSC details")
50{
51 vty->index = bsc_gsmnet;
52 vty->node = MSC_NODE;
53
54 return CMD_SUCCESS;
55}
56
57static int config_write_msc(struct vty *vty)
58{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +020059 struct bsc_msc_dest *dest;
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020060 struct osmo_bsc_data *bsc = osmo_bsc_data(vty);
61 struct osmo_msc_data *msc = &bsc->msc;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080062
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020063 vty_out(vty, "msc%s", VTY_NEWLINE);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020064 if (msc->bsc_token)
65 vty_out(vty, " token %s%s", msc->bsc_token, VTY_NEWLINE);
66 if (msc->core_ncc != -1)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020067 vty_out(vty, " core-mobile-network-code %d%s",
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020068 msc->core_ncc, VTY_NEWLINE);
69 if (msc->core_mcc != -1)
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020070 vty_out(vty, " core-mobile-country-code %d%s",
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020071 msc->core_mcc, VTY_NEWLINE);
72 vty_out(vty, " ip.access rtp-base %d%s", msc->rtp_base, VTY_NEWLINE);
73 vty_out(vty, " timeout-ping %d%s", msc->ping_timeout, VTY_NEWLINE);
74 vty_out(vty, " timeout-pong %d%s", msc->pong_timeout, VTY_NEWLINE);
75 if (msc->ussd_welcome_txt)
76 vty_out(vty, " bsc-welcome-text %s%s", msc->ussd_welcome_txt, VTY_NEWLINE);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +080077
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020078 if (msc->audio_length != 0) {
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +010079 int i;
80
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +020081 vty_out(vty, " codec-list ");
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020082 for (i = 0; i < msc->audio_length; ++i) {
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +010083 if (i != 0)
84 vty_out(vty, ", ");
85
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020086 if (msc->audio_support[i]->hr)
87 vty_out(vty, "hr%.1u", msc->audio_support[i]->ver);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +010088 else
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020089 vty_out(vty, "fr%.1u", msc->audio_support[i]->ver);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +010090 }
91 vty_out(vty, "%s", VTY_NEWLINE);
92
93 }
94
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020095 llist_for_each_entry(dest, &msc->dests, list)
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +020096 vty_out(vty, " dest %s %d %d%s", dest->ip, dest->port,
97 dest->dscp, VTY_NEWLINE);
98
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +020099 if (bsc->mid_call_txt)
100 vty_out(vty, " mid-call-text %s%s", bsc->mid_call_txt, VTY_NEWLINE);
101 vty_out(vty, " mid-call-timeout %d%s", bsc->mid_call_timeout, VTY_NEWLINE);
102 if (bsc->rf_ctrl_name)
103 vty_out(vty, " bsc-rf-socket %s%s",
104 bsc->rf_ctrl_name, VTY_NEWLINE);
105
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800106 return CMD_SUCCESS;
107}
108
Holger Hans Peter Freyther5b848f32010-11-03 13:11:14 +0100109DEFUN(cfg_net_bsc_token,
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800110 cfg_net_bsc_token_cmd,
111 "token TOKEN",
112 "A token for the BSC to be sent to the MSC")
113{
114 struct osmo_msc_data *data = osmo_msc_data(vty);
115
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200116 bsc_replace_string(osmo_bsc_data(vty), &data->bsc_token, argv[0]);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800117 return CMD_SUCCESS;
118}
119
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100120DEFUN(cfg_net_bsc_ncc,
121 cfg_net_bsc_ncc_cmd,
Holger Hans Peter Freyther6e1a6762011-02-10 11:37:13 +0100122 "core-mobile-network-code <1-999>",
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100123 "Use this network code for the backbone\n" "NCC value\n")
124{
125 struct osmo_msc_data *data = osmo_msc_data(vty);
126 data->core_ncc = atoi(argv[0]);
127 return CMD_SUCCESS;
128}
129
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100130DEFUN(cfg_net_bsc_mcc,
131 cfg_net_bsc_mcc_cmd,
Holger Hans Peter Freyther6e1a6762011-02-10 11:37:13 +0100132 "core-mobile-country-code <1-999>",
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100133 "Use this country code for the backbone\n" "MCC value\n")
134{
135 struct osmo_msc_data *data = osmo_msc_data(vty);
136 data->core_mcc = atoi(argv[0]);
137 return CMD_SUCCESS;
138}
139
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +0100140DEFUN(cfg_net_bsc_rtp_base,
141 cfg_net_bsc_rtp_base_cmd,
142 "ip.access rtp-base <1-65000>",
143 IPA_STR
144 "Set the rtp-base port for the RTP stream\n"
145 "Port number\n")
146{
147 struct osmo_msc_data *data = osmo_msc_data(vty);
148 data->rtp_base = atoi(argv[0]);
149 return CMD_SUCCESS;
150}
151
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100152DEFUN(cfg_net_bsc_codec_list,
153 cfg_net_bsc_codec_list_cmd,
154 "codec-list .LIST",
155 "Set the allowed audio codecs\n"
156 "List of audio codecs\n")
157{
158 struct osmo_msc_data *data = osmo_msc_data(vty);
159 int saw_fr, saw_hr;
160 int i;
161
162 saw_fr = saw_hr = 0;
163
164 /* free the old list... if it exists */
165 if (data->audio_support) {
166 talloc_free(data->audio_support);
167 data->audio_support = NULL;
168 data->audio_length = 0;
169 }
170
171 /* create a new array */
172 data->audio_support =
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200173 talloc_zero_array(osmo_bsc_data(vty), struct gsm_audio_support *, argc);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100174 data->audio_length = argc;
175
176 for (i = 0; i < argc; ++i) {
177 /* check for hrX or frX */
178 if (strlen(argv[i]) != 3
179 || argv[i][1] != 'r'
180 || (argv[i][0] != 'h' && argv[i][0] != 'f')
181 || argv[i][2] < 0x30
182 || argv[i][2] > 0x39)
183 goto error;
184
185 data->audio_support[i] = talloc_zero(data->audio_support,
186 struct gsm_audio_support);
187 data->audio_support[i]->ver = atoi(argv[i] + 2);
188
189 if (strncmp("hr", argv[i], 2) == 0) {
190 data->audio_support[i]->hr = 1;
191 saw_hr = 1;
192 } else if (strncmp("fr", argv[i], 2) == 0) {
193 data->audio_support[i]->hr = 0;
194 saw_fr = 1;
195 }
196
197 if (saw_hr && saw_fr) {
198 vty_out(vty, "Can not have full-rate and half-rate codec.%s",
199 VTY_NEWLINE);
200 return CMD_ERR_INCOMPLETE;
201 }
202 }
203
204 return CMD_SUCCESS;
205
206error:
207 vty_out(vty, "Codec name must be hrX or frX. Was '%s'%s",
208 argv[i], VTY_NEWLINE);
209 return CMD_ERR_INCOMPLETE;
210}
211
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200212DEFUN(cfg_net_msc_dest,
213 cfg_net_msc_dest_cmd,
214 "dest A.B.C.D <1-65000> <0-255>",
215 "Add a destination to a MUX/MSC\n"
216 "IP Address\n" "Port\n" "DSCP\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800217{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200218 struct bsc_msc_dest *dest;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800219 struct osmo_msc_data *data = osmo_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800220
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200221 dest = talloc_zero(osmo_bsc_data(vty), struct bsc_msc_dest);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200222 if (!dest) {
223 vty_out(vty, "%%Failed to create structure.%s", VTY_NEWLINE);
224 return CMD_WARNING;
225 }
226
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200227 dest->ip = talloc_strdup(dest, argv[0]);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200228 if (!dest->ip) {
229 vty_out(vty, "%%Failed to copy dest ip.%s", VTY_NEWLINE);
230 talloc_free(dest);
231 return CMD_WARNING;
232 }
233
234 dest->port = atoi(argv[1]);
235 dest->dscp = atoi(argv[2]);
236 llist_add_tail(&dest->list, &data->dests);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800237 return CMD_SUCCESS;
238}
239
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200240DEFUN(cfg_net_msc_no_dest,
241 cfg_net_msc_no_dest_cmd,
242 "no dest A.B.C.D <1-65000> <0-255>",
243 NO_STR "Remove a destination to a MUX/MSC\n"
244 "IP Address\n" "Port\n" "DSCP\n")
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800245{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200246 struct bsc_msc_dest *dest, *tmp;
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800247 struct osmo_msc_data *data = osmo_msc_data(vty);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800248
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200249 int port = atoi(argv[1]);
250 int dscp = atoi(argv[2]);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800251
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200252 llist_for_each_entry_safe(dest, tmp, &data->dests, list) {
253 if (port != dest->port || dscp != dest->dscp
254 || strcmp(dest->ip, argv[0]) != 0)
255 continue;
256
257 llist_del(&dest->list);
258 talloc_free(dest);
259 }
260
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800261 return CMD_SUCCESS;
262}
263
264DEFUN(cfg_net_msc_ping_time,
265 cfg_net_msc_ping_time_cmd,
266 "timeout-ping NR",
267 "Set the PING interval, negative for not sending PING")
268{
269 struct osmo_msc_data *data = osmo_msc_data(vty);
270 data->ping_timeout = atoi(argv[0]);
271 return CMD_SUCCESS;
272}
273
274DEFUN(cfg_net_msc_pong_time,
275 cfg_net_msc_pong_time_cmd,
276 "timeout-pong NR",
277 "Set the time to wait for a PONG.")
278{
279 struct osmo_msc_data *data = osmo_msc_data(vty);
280 data->pong_timeout = atoi(argv[0]);
281 return CMD_SUCCESS;
282}
283
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100284DEFUN(cfg_net_msc_mid_call_text,
285 cfg_net_msc_mid_call_text_cmd,
286 "mid-call-text .TEXT",
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800287 "Set the USSD notifcation to be send.\n" "Text to be sent\n")
288{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200289 struct osmo_bsc_data *data = osmo_bsc_data(vty);
Holger Hans Peter Freyther414bc4a2010-11-22 22:27:39 +0100290 char *txt = argv_concat(argv, argc, 0);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800291 if (!txt)
292 return CMD_WARNING;
293
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100294 bsc_replace_string(data, &data->mid_call_txt, txt);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800295 talloc_free(txt);
296 return CMD_SUCCESS;
297}
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800298
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100299DEFUN(cfg_net_msc_mid_call_timeout,
300 cfg_net_msc_mid_call_timeout_cmd,
301 "mid-call-timeout NR",
Holger Hans Peter Freyther625b6e42010-11-22 18:25:02 +0100302 "Switch from Grace to Off in NR seconds.\n" "Timeout in seconds\n")
303{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200304 struct osmo_bsc_data *data = osmo_bsc_data(vty);
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100305 data->mid_call_timeout = atoi(argv[0]);
Holger Hans Peter Freyther625b6e42010-11-22 18:25:02 +0100306 return CMD_SUCCESS;
307}
308
Holger Hans Peter Freytherfbceea42010-11-26 00:11:34 +0100309DEFUN(cfg_net_msc_welcome_ussd,
310 cfg_net_msc_welcome_ussd_cmd,
311 "bsc-welcome-text .TEXT",
312 "Set the USSD notification to be sent.\n" "Text to be sent\n")
313{
314 struct osmo_msc_data *data = osmo_msc_data(vty);
315 char *str = argv_concat(argv, argc, 0);
316 if (!str)
317 return CMD_WARNING;
318
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200319 bsc_replace_string(osmo_bsc_data(vty), &data->ussd_welcome_txt, str);
Holger Hans Peter Freytherfbceea42010-11-26 00:11:34 +0100320 talloc_free(str);
321 return CMD_SUCCESS;
322}
Holger Hans Peter Freyther625b6e42010-11-22 18:25:02 +0100323
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +0200324DEFUN(cfg_net_rf_socket,
325 cfg_net_rf_socket_cmd,
326 "bsc-rf-socket PATH",
327 "Set the filename for the RF control interface.\n" "RF Control path\n")
328{
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200329 struct osmo_bsc_data *data = osmo_bsc_data(vty);
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +0200330
331 bsc_replace_string(data, &data->rf_ctrl_name, argv[0]);
332 return CMD_SUCCESS;
333}
334
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +0200335DEFUN(show_statistics,
336 show_statistics_cmd,
337 "show statistics",
338 SHOW_STR "Statistics about the BSC\n")
339{
340 openbsc_vty_print_statistics(vty, bsc_gsmnet);
341 return CMD_SUCCESS;
342}
343
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800344int bsc_vty_init_extra(void)
345{
Holger Hans Peter Freyther06f4fc72011-03-29 17:46:14 +0200346 install_element(CONFIG_NODE, &cfg_net_msc_cmd);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800347 install_node(&msc_node, config_write_msc);
348 install_default(MSC_NODE);
349 install_element(MSC_NODE, &cfg_net_bsc_token_cmd);
Holger Hans Peter Freyther4de11162010-11-03 13:12:18 +0100350 install_element(MSC_NODE, &cfg_net_bsc_ncc_cmd);
Holger Hans Peter Freyther2a8675e2010-11-05 19:43:07 +0100351 install_element(MSC_NODE, &cfg_net_bsc_mcc_cmd);
Holger Hans Peter Freytherfe166222010-11-03 13:32:48 +0100352 install_element(MSC_NODE, &cfg_net_bsc_rtp_base_cmd);
Holger Hans Peter Freyther7bf66c52010-11-03 13:55:49 +0100353 install_element(MSC_NODE, &cfg_net_bsc_codec_list_cmd);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200354 install_element(MSC_NODE, &cfg_net_msc_dest_cmd);
355 install_element(MSC_NODE, &cfg_net_msc_no_dest_cmd);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800356 install_element(MSC_NODE, &cfg_net_msc_ping_time_cmd);
357 install_element(MSC_NODE, &cfg_net_msc_pong_time_cmd);
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200358 install_element(MSC_NODE, &cfg_net_msc_welcome_ussd_cmd);
359
Holger Hans Peter Freytherbb62b3f2010-11-22 18:30:21 +0100360 install_element(MSC_NODE, &cfg_net_msc_mid_call_text_cmd);
361 install_element(MSC_NODE, &cfg_net_msc_mid_call_timeout_cmd);
Holger Hans Peter Freyther55ef5fb2011-04-07 23:23:27 +0200362 install_element(MSC_NODE, &cfg_net_rf_socket_cmd);
Holger Hans Peter Freyther47b26012010-09-15 23:28:49 +0800363
Holger Hans Peter Freyther286ba0e2011-05-03 18:12:39 +0200364 install_element_ve(&show_statistics_cmd);
365
Holger Hans Peter Freythercacbc732010-06-30 14:59:23 +0800366 return 0;
367}