blob: fdd7886e5be9d14097c39b43663644e455ef168f [file] [log] [blame]
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +08001/* OpenBSC NAT interface to quagga VTY */
2/* (C) 2010 by Holger Hans Peter Freyther
3 * (C) 2010 by On-Waves
4 * All Rights Reserved
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (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
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 */
21
22#include <vty/command.h>
23#include <vty/buffer.h>
24#include <vty/vty.h>
25
26#include <openbsc/bsc_nat.h>
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +080027#include <openbsc/bsc_msc.h>
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080028#include <openbsc/gsm_04_08.h>
Holger Hans Peter Freytherf7d33352010-06-15 18:50:26 +080029#include <openbsc/mgcp.h>
Holger Hans Peter Freyther5f291d52010-04-06 12:01:15 +020030#include <openbsc/vty.h>
Holger Hans Peter Freyther6c45f2e2010-06-15 19:06:18 +080031
32#include <osmocore/talloc.h>
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080033
34#include <sccp/sccp.h>
35
36#include <stdlib.h>
37
38static struct bsc_nat *_nat;
39
40static struct cmd_node nat_node = {
41 NAT_NODE,
42 "%s(nat)#",
43 1,
44};
45
46static struct cmd_node bsc_node = {
47 BSC_NODE,
48 "%s(bsc)#",
49 1,
50};
51
52static int config_write_nat(struct vty *vty)
53{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +080054 struct bsc_nat_acc_lst *lst;
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +080055
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080056 vty_out(vty, "nat%s", VTY_NEWLINE);
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +080057 vty_out(vty, " msc ip %s%s", _nat->msc_ip, VTY_NEWLINE);
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +020058 vty_out(vty, " msc port %d%s", _nat->msc_port, VTY_NEWLINE);
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +080059 vty_out(vty, " timeout auth %d%s", _nat->auth_timeout, VTY_NEWLINE);
60 vty_out(vty, " timeout ping %d%s", _nat->ping_timeout, VTY_NEWLINE);
61 vty_out(vty, " timeout pong %d%s", _nat->pong_timeout, VTY_NEWLINE);
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +080062 if (_nat->token)
63 vty_out(vty, " token %s%s", _nat->token, VTY_NEWLINE);
Holger Hans Peter Freyther078321a2010-05-31 10:36:35 +080064 vty_out(vty, " ip-tos %d%s", _nat->bsc_ip_tos, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +080065 if (_nat->acc_lst_name)
66 vty_out(vty, " access-list-name %s%s", _nat->acc_lst_name, VTY_NEWLINE);
67
68 llist_for_each_entry(lst, &_nat->access_lists, list) {
69 if (lst->imsi_allow)
70 vty_out(vty, " access-list %s imsi-allow %s%s",
71 lst->name, lst->imsi_allow, VTY_NEWLINE);
72 if (lst->imsi_deny)
73 vty_out(vty, " access-list %s imsi-deny %s%s",
74 lst->name, lst->imsi_deny, VTY_NEWLINE);
75 }
76
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080077 return CMD_SUCCESS;
78}
79
80static void config_write_bsc_single(struct vty *vty, struct bsc_config *bsc)
81{
82 vty_out(vty, " bsc %u%s", bsc->nr, VTY_NEWLINE);
83 vty_out(vty, " token %s%s", bsc->token, VTY_NEWLINE);
Holger Hans Peter Freytherd1278c12010-04-16 16:52:20 +020084 vty_out(vty, " location_area_code %u%s", bsc->lac, VTY_NEWLINE);
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +080085 vty_out(vty, " paging forbidden %d%s", bsc->forbid_paging, VTY_NEWLINE);
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +080086 if (bsc->description)
87 vty_out(vty, " description %s%s", bsc->description, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +080088 if (bsc->acc_lst_name)
89 vty_out(vty, " access-list-name %s%s", bsc->acc_lst_name, VTY_NEWLINE);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080090}
91
92static int config_write_bsc(struct vty *vty)
93{
94 struct bsc_config *bsc;
95
96 llist_for_each_entry(bsc, &_nat->bsc_configs, entry)
97 config_write_bsc_single(vty, bsc);
98 return CMD_SUCCESS;
99}
100
101
Holger Hans Peter Freyther01a0b1b2010-04-19 16:06:43 +0800102DEFUN(show_sccp, show_sccp_cmd, "show sccp connections",
103 SHOW_STR "Display information about current SCCP connections")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800104{
105 struct sccp_connections *con;
Holger Hans Peter Freytherb9af2fa2010-04-27 15:35:14 +0800106 vty_out(vty, "Listing all opening SCCP connections%s", VTY_NEWLINE);
Holger Hans Peter Freyther4bd22942010-04-27 13:11:18 +0800107
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800108 llist_for_each_entry(con, &_nat->sccp_connections, list_entry) {
Holger Hans Peter Freyther234d3122010-05-16 02:06:11 +0800109 vty_out(vty, "For BSC Nr: %d lac: %d; BSC ref: 0x%x; MUX ref: 0x%x; Network has ref: %d ref: 0x%x MSC/BSC mux: 0x%x/0x%x type: %s%s",
Holger Hans Peter Freyther47dd4942010-04-06 15:11:34 +0200110 con->bsc->cfg ? con->bsc->cfg->nr : -1,
111 con->bsc->cfg ? con->bsc->cfg->lac : -1,
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800112 sccp_src_ref_to_int(&con->real_ref),
Holger Hans Peter Freyther32d34362010-04-05 10:10:33 +0200113 sccp_src_ref_to_int(&con->patched_ref),
Holger Hans Peter Freyther4bd22942010-04-27 13:11:18 +0800114 con->has_remote_ref,
115 sccp_src_ref_to_int(&con->remote_ref),
Holger Hans Peter Freyther32d34362010-04-05 10:10:33 +0200116 con->msc_timeslot, con->bsc_timeslot,
Holger Hans Peter Freyther234d3122010-05-16 02:06:11 +0800117 bsc_con_type_to_string(con->con_type),
Holger Hans Peter Freyther32d34362010-04-05 10:10:33 +0200118 VTY_NEWLINE);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800119 }
120
121 return CMD_SUCCESS;
122}
123
Holger Hans Peter Freyther01a0b1b2010-04-19 16:06:43 +0800124DEFUN(show_bsc, show_bsc_cmd, "show bsc connections",
125 SHOW_STR "Display information about current BSCs")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800126{
127 struct bsc_connection *con;
Holger Hans Peter Freyther870663a2010-04-08 10:35:20 +0200128 struct sockaddr_in sock;
129 socklen_t len = sizeof(sock);
130
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800131 llist_for_each_entry(con, &_nat->bsc_connections, list_entry) {
Holger Hans Peter Freyther870663a2010-04-08 10:35:20 +0200132 getpeername(con->write_queue.bfd.fd, (struct sockaddr *) &sock, &len);
Holger Hans Peter Freyther3b879812010-05-01 15:32:32 +0800133 vty_out(vty, "BSC nr: %d lac: %d auth: %d fd: %d peername: %s%s",
Holger Hans Peter Freyther47dd4942010-04-06 15:11:34 +0200134 con->cfg ? con->cfg->nr : -1,
135 con->cfg ? con->cfg->lac : -1,
Holger Hans Peter Freyther870663a2010-04-08 10:35:20 +0200136 con->authenticated, con->write_queue.bfd.fd,
137 inet_ntoa(sock.sin_addr), VTY_NEWLINE);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800138 }
139
140 return CMD_SUCCESS;
141}
142
Holger Hans Peter Freytherab7539c2010-04-22 13:36:46 +0800143DEFUN(show_bsc_cfg, show_bsc_cfg_cmd, "show bsc config",
144 SHOW_STR "Display information about known BSC configs")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800145{
146 struct bsc_config *conf;
147 llist_for_each_entry(conf, &_nat->bsc_configs, entry) {
148 vty_out(vty, "BSC token: '%s' lac: %u nr: %u%s",
149 conf->token, conf->lac, conf->nr, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800150 if (conf->acc_lst_name)
151 vty_out(vty, " access-list: %s%s",
152 conf->acc_lst_name, VTY_NEWLINE);
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800153 vty_out(vty, " paging forbidden: %d%s",
154 conf->forbid_paging, VTY_NEWLINE);
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800155 if (conf->description)
156 vty_out(vty, " description: %s%s", conf->description, VTY_NEWLINE);
157 else
158 vty_out(vty, " No description.%s", VTY_NEWLINE);
159
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800160 }
161
162 return CMD_SUCCESS;
163}
164
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200165DEFUN(show_stats,
166 show_stats_cmd,
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800167 "show statistics [NR]",
Holger Hans Peter Freytherb9af2fa2010-04-27 15:35:14 +0800168 SHOW_STR "Display network statistics")
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200169{
170 struct bsc_config *conf;
171
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800172 int nr = -1;
173
174 if (argc == 1)
175 nr = atoi(argv[0]);
176
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200177 vty_out(vty, "NAT statistics%s", VTY_NEWLINE);
178 vty_out(vty, " SCCP Connections %lu total, %lu calls%s",
179 counter_get(_nat->stats.sccp.conn),
180 counter_get(_nat->stats.sccp.calls), VTY_NEWLINE);
181 vty_out(vty, " MSC Connections %lu%s",
182 counter_get(_nat->stats.msc.reconn), VTY_NEWLINE);
183 vty_out(vty, " BSC Connections %lu total, %lu auth failed.%s",
184 counter_get(_nat->stats.bsc.reconn),
185 counter_get(_nat->stats.bsc.auth_fail), VTY_NEWLINE);
186
187 llist_for_each_entry(conf, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800188 if (argc == 1 && nr != conf->nr)
189 continue;
190
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200191 vty_out(vty, " BSC lac: %d nr: %d%s",
192 conf->lac, conf->nr, VTY_NEWLINE);
193 vty_out(vty, " SCCP Connnections %lu total, %lu calls%s",
194 counter_get(conf->stats.sccp.conn),
195 counter_get(conf->stats.sccp.calls), VTY_NEWLINE);
196 vty_out(vty, " BSC Connections %lu total%s",
197 counter_get(conf->stats.net.reconn), VTY_NEWLINE);
198 }
199
200 return CMD_SUCCESS;
201}
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800202
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +0800203DEFUN(show_msc,
204 show_msc_cmd,
205 "show msc connection",
206 SHOW_STR "Show the status of the MSC connection.")
207{
208 if (!_nat->msc_con) {
209 vty_out(vty, "The MSC is not yet configured.\n");
210 return CMD_WARNING;
211 }
212
213 vty_out(vty, "MSC on %s:%d is connected: %d%s\n",
214 _nat->msc_con->ip, _nat->msc_con->port,
215 _nat->msc_con->is_connected, VTY_NEWLINE);
216 return CMD_SUCCESS;
217}
218
Holger Hans Peter Freyther2f9dcf02010-04-27 13:21:39 +0800219DEFUN(close_bsc,
220 close_bsc_cmd,
221 "close bsc connection BSC_NR",
Holger Hans Peter Freytherb9af2fa2010-04-27 15:35:14 +0800222 "Close the connection with the BSC identified by the config number.")
Holger Hans Peter Freyther2f9dcf02010-04-27 13:21:39 +0800223{
224 struct bsc_connection *bsc;
225 int bsc_nr = atoi(argv[0]);
226
227 llist_for_each_entry(bsc, &_nat->bsc_connections, list_entry) {
228 if (!bsc->cfg || bsc->cfg->nr != bsc_nr)
229 continue;
230 bsc_close_connection(bsc);
231 break;
232 }
233
234 return CMD_SUCCESS;
235}
236
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800237DEFUN(cfg_nat, cfg_nat_cmd, "nat", "Configute the NAT")
238{
239 vty->index = _nat;
240 vty->node = NAT_NODE;
241
242 return CMD_SUCCESS;
243}
244
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800245DEFUN(cfg_nat_msc_ip,
246 cfg_nat_msc_ip_cmd,
Holger Hans Peter Freytherd8b82062010-05-14 02:36:42 +0800247 "msc ip A.B.C.D",
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800248 "Set the IP address of the MSC.")
249{
250 bsc_nat_set_msc_ip(_nat, argv[0]);
251 return CMD_SUCCESS;
252}
253
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +0200254DEFUN(cfg_nat_msc_port,
255 cfg_nat_msc_port_cmd,
256 "msc port <1-65500>",
257 "Set the port of the MSC.")
258{
259 _nat->msc_port = atoi(argv[0]);
260 return CMD_SUCCESS;
261}
262
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800263DEFUN(cfg_nat_auth_time,
264 cfg_nat_auth_time_cmd,
265 "timeout auth <1-256>",
266 "The time to wait for an auth response.")
267{
268 _nat->auth_timeout = atoi(argv[0]);
269 return CMD_SUCCESS;
270}
271
272DEFUN(cfg_nat_ping_time,
273 cfg_nat_ping_time_cmd,
274 "timeout ping NR",
275 "Send a ping every NR seconds. Negative to disable.")
276{
277 _nat->ping_timeout = atoi(argv[0]);
278 return CMD_SUCCESS;
279}
280
281DEFUN(cfg_nat_pong_time,
282 cfg_nat_pong_time_cmd,
283 "timeout pong NR",
284 "Wait NR seconds for the PONG response. Should be smaller than ping.")
285{
286 _nat->pong_timeout = atoi(argv[0]);
287 return CMD_SUCCESS;
288}
289
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800290DEFUN(cfg_nat_token, cfg_nat_token_cmd,
291 "token TOKEN",
292 "Set a token for the NAT")
293{
294 if (_nat->token)
295 talloc_free(_nat->token);
296 _nat->token = talloc_strdup(_nat, argv[0]);
297 return CMD_SUCCESS;
298}
299
Holger Hans Peter Freyther078321a2010-05-31 10:36:35 +0800300DEFUN(cfg_nat_bsc_ip_tos, cfg_nat_bsc_ip_tos_cmd,
301 "ip-tos <0-255>",
302 "Set the IP_TOS for the BSCs to use\n" "Set the IP_TOS attribute")
303{
304 _nat->bsc_ip_tos = atoi(argv[0]);
305 return CMD_SUCCESS;
306}
307
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800308DEFUN(cfg_nat_acc_lst_name,
309 cfg_nat_acc_lst_name_cmd,
310 "access-list-name NAME",
311 "Set the name of the access list to use.\n"
312 "The name of the to be used access list.")
313{
314 if (_nat->acc_lst_name)
315 talloc_free(_nat->acc_lst_name);
316 _nat->acc_lst_name = talloc_strdup(_nat, argv[0]);
317 return CMD_SUCCESS;
318}
319
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800320/* per BSC configuration */
Holger Hans Peter Freytherb9af2fa2010-04-27 15:35:14 +0800321DEFUN(cfg_bsc, cfg_bsc_cmd, "bsc BSC_NR", "Select a BSC to configure")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800322{
323 int bsc_nr = atoi(argv[0]);
324 struct bsc_config *bsc;
325
326 if (bsc_nr > _nat->num_bsc) {
327 vty_out(vty, "%% The next unused BSC number is %u%s",
328 _nat->num_bsc, VTY_NEWLINE);
329 return CMD_WARNING;
330 } else if (bsc_nr == _nat->num_bsc) {
331 /* allocate a new one */
332 bsc = bsc_config_alloc(_nat, "unknown", 0);
333 } else
334 bsc = bsc_config_num(_nat, bsc_nr);
335
336 if (!bsc)
337 return CMD_WARNING;
338
339 vty->index = bsc;
340 vty->node = BSC_NODE;
341
342 return CMD_SUCCESS;
343}
344
345DEFUN(cfg_bsc_token, cfg_bsc_token_cmd, "token TOKEN", "Set the token")
346{
347 struct bsc_config *conf = vty->index;
348
349 if (conf->token)
350 talloc_free(conf->token);
351 conf->token = talloc_strdup(conf, argv[0]);
352 return CMD_SUCCESS;
353}
354
355DEFUN(cfg_bsc_lac, cfg_bsc_lac_cmd, "location_area_code <0-65535>",
Holger Hans Peter Freytherb9af2fa2010-04-27 15:35:14 +0800356 "Set the Location Area Code (LAC) of this BSC")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800357{
Holger Hans Peter Freyther39ee8772010-03-30 06:08:56 +0200358 struct bsc_config *tmp;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800359 struct bsc_config *conf = vty->index;
360
361 int lac = atoi(argv[0]);
362
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800363 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
364 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
365 lac, VTY_NEWLINE);
366 return CMD_WARNING;
367 }
368
Holger Hans Peter Freyther39ee8772010-03-30 06:08:56 +0200369 /* verify that the LACs are unique */
370 llist_for_each_entry(tmp, &_nat->bsc_configs, entry) {
371 if (tmp->lac == lac) {
372 vty_out(vty, "%% LAC %d is already used.%s", lac, VTY_NEWLINE);
373 return CMD_ERR_INCOMPLETE;
374 }
375 }
376
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800377 conf->lac = lac;
378
379 return CMD_SUCCESS;
380}
381
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800382DEFUN(cfg_lst_imsi_allow,
383 cfg_lst_imsi_allow_cmd,
384 "access-list NAME imsi-allow [REGEXP]",
385 "Allow IMSIs matching the REGEXP\n"
386 "The name of the access-list\n"
387 "The regexp of allowed IMSIs\n")
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200388{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800389 struct bsc_nat_acc_lst *acc;
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200390
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800391 acc = bsc_nat_acc_lst_get(_nat, argv[0]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800392 if (!acc)
393 return CMD_WARNING;
394
Holger Hans Peter Freytherf0c3e912010-06-03 01:38:53 +0800395 bsc_parse_reg(acc, &acc->imsi_allow_re, &acc->imsi_allow, argc - 1, &argv[1]);
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200396 return CMD_SUCCESS;
397}
398
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800399DEFUN(cfg_lst_imsi_deny,
400 cfg_lst_imsi_deny_cmd,
401 "access-list NAME imsi-deny [REGEXP]",
402 "Allow IMSIs matching the REGEXP\n"
403 "The name of the access-list\n"
404 "The regexp of to be denied IMSIs\n")
405{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800406 struct bsc_nat_acc_lst *acc;
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800407
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800408 acc = bsc_nat_acc_lst_get(_nat, argv[0]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800409 if (!acc)
410 return CMD_WARNING;
411
Holger Hans Peter Freytherf0c3e912010-06-03 01:38:53 +0800412 bsc_parse_reg(acc, &acc->imsi_deny_re, &acc->imsi_deny, argc - 1, &argv[1]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800413 return CMD_SUCCESS;
414}
415
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800416/* naming to follow Zebra... */
417DEFUN(cfg_lst_no,
418 cfg_lst_no_cmd,
419 "no access-list NAME",
420 NO_STR "Remove an access-list by name\n"
421 "The access-list to remove\n")
422{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800423 struct bsc_nat_acc_lst *acc;
424 acc = bsc_nat_acc_lst_find(_nat, argv[0]);
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800425 if (!acc)
426 return CMD_WARNING;
427
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800428 bsc_nat_acc_lst_delete(acc);
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800429 return CMD_SUCCESS;
430}
431
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800432DEFUN(cfg_bsc_acc_lst_name,
433 cfg_bsc_acc_lst_name_cmd,
434 "access-list-name NAME",
435 "Set the name of the access list to use.\n"
436 "The name of the to be used access list.")
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200437{
438 struct bsc_config *conf = vty->index;
439
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800440 if (conf->acc_lst_name)
441 talloc_free(conf->acc_lst_name);
442 conf->acc_lst_name = talloc_strdup(conf, argv[0]);
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200443 return CMD_SUCCESS;
444}
445
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800446DEFUN(cfg_bsc_paging,
447 cfg_bsc_paging_cmd,
448 "paging forbidden (0|1)",
449 "Forbid sending PAGING REQUESTS to the BSC.")
450{
451 struct bsc_config *conf = vty->index;
452
Holger Hans Peter Freyther834f1df2010-04-21 20:07:07 +0800453 if (strcmp("1", argv[0]) == 0)
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800454 conf->forbid_paging = 1;
455 else
456 conf->forbid_paging = 0;
457
458 return CMD_SUCCESS;
459}
460
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800461DEFUN(cfg_bsc_desc,
462 cfg_bsc_desc_cmd,
463 "description DESC",
464 "Provide a description for the given BSC.")
465{
466 struct bsc_config *conf = vty->index;
467
468 if (conf->description)
469 talloc_free(conf->description);
470 conf->description = talloc_strdup(conf, argv[0]);
471 return CMD_SUCCESS;
472}
473
Holger Hans Peter Freyther52c4ba02010-05-14 23:43:12 +0800474DEFUN(test_regex, test_regex_cmd,
475 "test regex PATTERN STRING",
476 "Check if the string is matching the current pattern.")
477{
478 regex_t reg;
479 char *str = NULL;
480
481 memset(&reg, 0, sizeof(reg));
482 bsc_parse_reg(_nat, &reg, &str, 1, argv);
483
484 vty_out(vty, "String matches allow pattern: %d%s",
485 regexec(&reg, argv[1], 0, NULL, 0) == 0, VTY_NEWLINE);
486
487 talloc_free(str);
488 regfree(&reg);
489 return CMD_SUCCESS;
490}
491
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800492int bsc_nat_vty_init(struct bsc_nat *nat)
493{
494 _nat = nat;
495
496 cmd_init(1);
497 vty_init();
498
499 /* show commands */
500 install_element(VIEW_NODE, &show_sccp_cmd);
501 install_element(VIEW_NODE, &show_bsc_cmd);
502 install_element(VIEW_NODE, &show_bsc_cfg_cmd);
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200503 install_element(VIEW_NODE, &show_stats_cmd);
Holger Hans Peter Freyther2f9dcf02010-04-27 13:21:39 +0800504 install_element(VIEW_NODE, &close_bsc_cmd);
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +0800505 install_element(VIEW_NODE, &show_msc_cmd);
Holger Hans Peter Freyther52c4ba02010-05-14 23:43:12 +0800506 install_element(VIEW_NODE, &test_regex_cmd);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800507
Holger Hans Peter Freyther5f291d52010-04-06 12:01:15 +0200508 openbsc_vty_add_cmds();
509
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800510 /* nat group */
511 install_element(CONFIG_NODE, &cfg_nat_cmd);
512 install_node(&nat_node, config_write_nat);
513 install_default(NAT_NODE);
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800514 install_element(NAT_NODE, &cfg_nat_msc_ip_cmd);
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +0200515 install_element(NAT_NODE, &cfg_nat_msc_port_cmd);
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800516 install_element(NAT_NODE, &cfg_nat_auth_time_cmd);
517 install_element(NAT_NODE, &cfg_nat_ping_time_cmd);
518 install_element(NAT_NODE, &cfg_nat_pong_time_cmd);
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800519 install_element(NAT_NODE, &cfg_nat_token_cmd);
Holger Hans Peter Freyther078321a2010-05-31 10:36:35 +0800520 install_element(NAT_NODE, &cfg_nat_bsc_ip_tos_cmd);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800521 install_element(NAT_NODE, &cfg_nat_acc_lst_name_cmd);
522
523 /* access-list */
524 install_element(NAT_NODE, &cfg_lst_imsi_allow_cmd);
525 install_element(NAT_NODE, &cfg_lst_imsi_deny_cmd);
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800526 install_element(NAT_NODE, &cfg_lst_no_cmd);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800527
528 /* BSC subgroups */
529 install_element(NAT_NODE, &cfg_bsc_cmd);
530 install_node(&bsc_node, config_write_bsc);
531 install_default(BSC_NODE);
532 install_element(BSC_NODE, &cfg_bsc_token_cmd);
533 install_element(BSC_NODE, &cfg_bsc_lac_cmd);
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800534 install_element(BSC_NODE, &cfg_bsc_paging_cmd);
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800535 install_element(BSC_NODE, &cfg_bsc_desc_cmd);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800536 install_element(NAT_NODE, &cfg_bsc_acc_lst_name_cmd);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800537
Holger Hans Peter Freytherf7d33352010-06-15 18:50:26 +0800538 mgcp_vty_init();
539
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800540 return 0;
541}
542
543
544/* called by the telnet interface... we have our own init above */
545void bsc_vty_init()
546{}