blob: c32bfdfb5edc3e4e3a38a792da76ad8180c54b90 [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
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 Freyther9a85ef32010-06-15 18:46:11 +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 Freyther9a85ef32010-06-15 18:46:11 +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 Freyther9a85ef32010-06-15 18:46:11 +080018 *
19 */
20
Holger Hans Peter Freyther1398f132010-06-15 20:14:08 +080021#include <openbsc/vty.h>
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080022#include <openbsc/bsc_nat.h>
Holger Hans Peter Freytherc2b31ed2010-07-31 05:17:17 +080023#include <openbsc/bsc_nat_sccp.h>
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +080024#include <openbsc/bsc_msc.h>
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080025#include <openbsc/gsm_04_08.h>
Holger Hans Peter Freytherf7d33352010-06-15 18:50:26 +080026#include <openbsc/mgcp.h>
Holger Hans Peter Freyther5f291d52010-04-06 12:01:15 +020027#include <openbsc/vty.h>
Holger Hans Peter Freyther6c45f2e2010-06-15 19:06:18 +080028
29#include <osmocore/talloc.h>
Holger Hans Peter Freytherb2c38eb2010-06-17 18:16:00 +080030#include <osmocore/rate_ctr.h>
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +080031#include <osmocore/utils.h>
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080032
Harald Welted5db12c2010-08-03 15:11:51 +020033#include <osmocom/sccp/sccp.h>
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080034
35#include <stdlib.h>
36
37static struct bsc_nat *_nat;
38
39static struct cmd_node nat_node = {
40 NAT_NODE,
41 "%s(nat)#",
42 1,
43};
44
45static struct cmd_node bsc_node = {
Holger Hans Peter Freyther7b4a53d2010-06-17 14:42:20 +080046 NAT_BSC_NODE,
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080047 "%s(bsc)#",
48 1,
49};
50
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +080051static void write_acc_lst(struct vty *vty, struct bsc_nat_acc_lst *lst)
52{
53 struct bsc_nat_acc_lst_entry *entry;
54
55 llist_for_each_entry(entry, &lst->fltr_list, list) {
56 if (entry->imsi_allow)
57 vty_out(vty, " access-list %s imsi-allow %s%s",
58 lst->name, entry->imsi_allow, VTY_NEWLINE);
59 if (entry->imsi_deny)
60 vty_out(vty, " access-list %s imsi-deny %s%s",
61 lst->name, entry->imsi_deny, VTY_NEWLINE);
62 }
63}
64
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080065static int config_write_nat(struct vty *vty)
66{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +080067 struct bsc_nat_acc_lst *lst;
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +080068
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080069 vty_out(vty, "nat%s", VTY_NEWLINE);
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +080070 vty_out(vty, " msc ip %s%s", _nat->msc_ip, VTY_NEWLINE);
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +020071 vty_out(vty, " msc port %d%s", _nat->msc_port, VTY_NEWLINE);
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +080072 vty_out(vty, " timeout auth %d%s", _nat->auth_timeout, VTY_NEWLINE);
73 vty_out(vty, " timeout ping %d%s", _nat->ping_timeout, VTY_NEWLINE);
74 vty_out(vty, " timeout pong %d%s", _nat->pong_timeout, VTY_NEWLINE);
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +080075 if (_nat->token)
76 vty_out(vty, " token %s%s", _nat->token, VTY_NEWLINE);
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +080077 vty_out(vty, " ip-dscp %d%s", _nat->bsc_ip_dscp, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +080078 if (_nat->acc_lst_name)
79 vty_out(vty, " access-list-name %s%s", _nat->acc_lst_name, VTY_NEWLINE);
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +020080 if (_nat->ussd_lst_name)
81 vty_out(vty, " ussd-list-name %s%s", _nat->ussd_lst_name, VTY_NEWLINE);
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +020082 if (_nat->ussd_query)
83 vty_out(vty, " ussd-query %s%s", _nat->ussd_query, VTY_NEWLINE);
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +020084 if (_nat->ussd_token)
85 vty_out(vty, " ussd-token %s%s", _nat->ussd_token, VTY_NEWLINE);
86 if (_nat->ussd_local)
87 vty_out(vty, " ussd-local-ip %s%s", _nat->ussd_local, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +080088
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +020089 if (_nat->num_rewr_name)
90 vty_out(vty, " number-rewrite %s%s", _nat->num_rewr_name, VTY_NEWLINE);
91
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +080092 llist_for_each_entry(lst, &_nat->access_lists, list) {
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +080093 write_acc_lst(vty, lst);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +080094 }
95
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080096 return CMD_SUCCESS;
97}
98
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +080099static void dump_lac(struct vty *vty, struct bsc_config *cfg)
100{
101 struct bsc_lac_entry *lac;
102 llist_for_each_entry(lac, &cfg->lac_list, entry)
103 vty_out(vty, " location_area_code %u%s", lac->lac, VTY_NEWLINE);
104}
105
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800106static void config_write_bsc_single(struct vty *vty, struct bsc_config *bsc)
107{
108 vty_out(vty, " bsc %u%s", bsc->nr, VTY_NEWLINE);
109 vty_out(vty, " token %s%s", bsc->token, VTY_NEWLINE);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800110 dump_lac(vty, bsc);
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800111 vty_out(vty, " paging forbidden %d%s", bsc->forbid_paging, VTY_NEWLINE);
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800112 if (bsc->description)
113 vty_out(vty, " description %s%s", bsc->description, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800114 if (bsc->acc_lst_name)
Holger Hans Peter Freyther27d36de2010-06-08 11:18:26 +0800115 vty_out(vty, " access-list-name %s%s", bsc->acc_lst_name, VTY_NEWLINE);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800116}
117
118static int config_write_bsc(struct vty *vty)
119{
120 struct bsc_config *bsc;
121
122 llist_for_each_entry(bsc, &_nat->bsc_configs, entry)
123 config_write_bsc_single(vty, bsc);
124 return CMD_SUCCESS;
125}
126
127
Holger Hans Peter Freyther01a0b1b2010-04-19 16:06:43 +0800128DEFUN(show_sccp, show_sccp_cmd, "show sccp connections",
129 SHOW_STR "Display information about current SCCP connections")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800130{
131 struct sccp_connections *con;
Holger Hans Peter Freyther85804a82010-09-15 19:01:31 +0800132 vty_out(vty, "Listing all open SCCP connections%s", VTY_NEWLINE);
Holger Hans Peter Freyther4bd22942010-04-27 13:11:18 +0800133
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800134 llist_for_each_entry(con, &_nat->sccp_connections, list_entry) {
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800135 vty_out(vty, "For BSC Nr: %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 +0200136 con->bsc->cfg ? con->bsc->cfg->nr : -1,
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800137 sccp_src_ref_to_int(&con->real_ref),
Holger Hans Peter Freyther32d34362010-04-05 10:10:33 +0200138 sccp_src_ref_to_int(&con->patched_ref),
Holger Hans Peter Freyther4bd22942010-04-27 13:11:18 +0800139 con->has_remote_ref,
140 sccp_src_ref_to_int(&con->remote_ref),
Holger Hans Peter Freytherf4b34392010-08-28 16:08:39 +0800141 con->msc_endp, con->bsc_endp,
Holger Hans Peter Freyther234d3122010-05-16 02:06:11 +0800142 bsc_con_type_to_string(con->con_type),
Holger Hans Peter Freyther32d34362010-04-05 10:10:33 +0200143 VTY_NEWLINE);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800144 }
145
146 return CMD_SUCCESS;
147}
148
Holger Hans Peter Freyther01a0b1b2010-04-19 16:06:43 +0800149DEFUN(show_bsc, show_bsc_cmd, "show bsc connections",
150 SHOW_STR "Display information about current BSCs")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800151{
152 struct bsc_connection *con;
Holger Hans Peter Freyther870663a2010-04-08 10:35:20 +0200153 struct sockaddr_in sock;
154 socklen_t len = sizeof(sock);
155
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800156 llist_for_each_entry(con, &_nat->bsc_connections, list_entry) {
Holger Hans Peter Freyther870663a2010-04-08 10:35:20 +0200157 getpeername(con->write_queue.bfd.fd, (struct sockaddr *) &sock, &len);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800158 vty_out(vty, "BSC nr: %d auth: %d fd: %d peername: %s%s",
Holger Hans Peter Freyther47dd4942010-04-06 15:11:34 +0200159 con->cfg ? con->cfg->nr : -1,
Holger Hans Peter Freyther870663a2010-04-08 10:35:20 +0200160 con->authenticated, con->write_queue.bfd.fd,
161 inet_ntoa(sock.sin_addr), VTY_NEWLINE);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800162 }
163
164 return CMD_SUCCESS;
165}
166
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800167DEFUN(show_bsc_mgcp, show_bsc_mgcp_cmd, "show bsc mgcp NR",
168 SHOW_STR "Display the MGCP status for a given BSC")
169{
170 struct bsc_connection *con;
171 int nr = atoi(argv[0]);
172 int i;
173
174 llist_for_each_entry(con, &_nat->bsc_connections, list_entry) {
175 if (!con->cfg)
176 continue;
177 if (con->cfg->nr != nr)
178 continue;
179
180 vty_out(vty, "MGCP Status for %d%s", con->cfg->nr, VTY_NEWLINE);
181 for (i = 1; i < ARRAY_SIZE(con->endpoint_status); ++i)
182 vty_out(vty, " Endpoint 0x%x %s%s", i,
183 con->endpoint_status[i] == 0 ? "free" : "allocated",
184 VTY_NEWLINE);
185 break;
186 }
187
188 return CMD_SUCCESS;
189}
190
Holger Hans Peter Freytherab7539c2010-04-22 13:36:46 +0800191DEFUN(show_bsc_cfg, show_bsc_cfg_cmd, "show bsc config",
192 SHOW_STR "Display information about known BSC configs")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800193{
194 struct bsc_config *conf;
195 llist_for_each_entry(conf, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800196 vty_out(vty, "BSC token: '%s' nr: %u%s",
197 conf->token, conf->nr, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800198 if (conf->acc_lst_name)
199 vty_out(vty, " access-list: %s%s",
200 conf->acc_lst_name, VTY_NEWLINE);
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800201 vty_out(vty, " paging forbidden: %d%s",
202 conf->forbid_paging, VTY_NEWLINE);
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800203 if (conf->description)
204 vty_out(vty, " description: %s%s", conf->description, VTY_NEWLINE);
205 else
206 vty_out(vty, " No description.%s", VTY_NEWLINE);
207
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800208 }
209
210 return CMD_SUCCESS;
211}
212
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800213static void dump_stat_total(struct vty *vty, struct bsc_nat *nat)
214{
215 vty_out(vty, "NAT statistics%s", VTY_NEWLINE);
216 vty_out(vty, " SCCP Connections %lu total, %lu calls%s",
217 counter_get(nat->stats.sccp.conn),
218 counter_get(nat->stats.sccp.calls), VTY_NEWLINE);
219 vty_out(vty, " MSC Connections %lu%s",
220 counter_get(nat->stats.msc.reconn), VTY_NEWLINE);
Holger Hans Peter Freythercbfd0982010-08-04 02:34:10 +0800221 vty_out(vty, " MSC Connected: %d%s",
222 nat->msc_con->is_connected, VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800223 vty_out(vty, " BSC Connections %lu total, %lu auth failed.%s",
224 counter_get(nat->stats.bsc.reconn),
225 counter_get(nat->stats.bsc.auth_fail), VTY_NEWLINE);
226}
227
228static void dump_stat_bsc(struct vty *vty, struct bsc_config *conf)
229{
Holger Hans Peter Freytherf21e4532010-07-22 20:37:35 +0800230 int connected = 0;
231 struct bsc_connection *con;
232
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800233 vty_out(vty, " BSC nr: %d%s",
234 conf->nr, VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800235 vty_out_rate_ctr_group(vty, " ", conf->stats.ctrg);
Holger Hans Peter Freytherf21e4532010-07-22 20:37:35 +0800236
237 llist_for_each_entry(con, &conf->nat->bsc_connections, list_entry) {
238 if (con->cfg != conf)
239 continue;
240 connected = 1;
241 break;
242 }
243
Holger Hans Peter Freyther03a0ad02010-08-04 02:29:03 +0800244 vty_out(vty, " Connected: %d%s", connected, VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800245}
246
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200247DEFUN(show_stats,
248 show_stats_cmd,
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800249 "show statistics [NR]",
Holger Hans Peter Freytherb9af2fa2010-04-27 15:35:14 +0800250 SHOW_STR "Display network statistics")
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200251{
252 struct bsc_config *conf;
253
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800254 int nr = -1;
255
256 if (argc == 1)
257 nr = atoi(argv[0]);
258
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800259 dump_stat_total(vty, _nat);
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200260 llist_for_each_entry(conf, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800261 if (argc == 1 && nr != conf->nr)
262 continue;
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800263 dump_stat_bsc(vty, conf);
264 }
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800265
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800266 return CMD_SUCCESS;
267}
268
269DEFUN(show_stats_lac,
270 show_stats_lac_cmd,
271 "show statistics-by-lac <0-65535>",
272 SHOW_STR "Display network statistics by lac\n"
273 "The lac of the BSC\n")
274{
275 int lac;
276 struct bsc_config *conf;
277
278 lac = atoi(argv[0]);
279
280 dump_stat_total(vty, _nat);
281 llist_for_each_entry(conf, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800282 if (!bsc_config_handles_lac(conf, lac))
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800283 continue;
284 dump_stat_bsc(vty, conf);
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200285 }
286
287 return CMD_SUCCESS;
288}
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800289
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +0800290DEFUN(show_msc,
291 show_msc_cmd,
292 "show msc connection",
293 SHOW_STR "Show the status of the MSC connection.")
294{
295 if (!_nat->msc_con) {
296 vty_out(vty, "The MSC is not yet configured.\n");
297 return CMD_WARNING;
298 }
299
300 vty_out(vty, "MSC on %s:%d is connected: %d%s\n",
301 _nat->msc_con->ip, _nat->msc_con->port,
302 _nat->msc_con->is_connected, VTY_NEWLINE);
303 return CMD_SUCCESS;
304}
305
Holger Hans Peter Freyther2f9dcf02010-04-27 13:21:39 +0800306DEFUN(close_bsc,
307 close_bsc_cmd,
308 "close bsc connection BSC_NR",
Holger Hans Peter Freytherb9af2fa2010-04-27 15:35:14 +0800309 "Close the connection with the BSC identified by the config number.")
Holger Hans Peter Freyther2f9dcf02010-04-27 13:21:39 +0800310{
311 struct bsc_connection *bsc;
312 int bsc_nr = atoi(argv[0]);
313
314 llist_for_each_entry(bsc, &_nat->bsc_connections, list_entry) {
315 if (!bsc->cfg || bsc->cfg->nr != bsc_nr)
316 continue;
317 bsc_close_connection(bsc);
318 break;
319 }
320
321 return CMD_SUCCESS;
322}
323
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800324DEFUN(cfg_nat, cfg_nat_cmd, "nat", "Configute the NAT")
325{
326 vty->index = _nat;
327 vty->node = NAT_NODE;
328
329 return CMD_SUCCESS;
330}
331
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800332DEFUN(cfg_nat_msc_ip,
333 cfg_nat_msc_ip_cmd,
Holger Hans Peter Freytherd8b82062010-05-14 02:36:42 +0800334 "msc ip A.B.C.D",
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800335 "Set the IP address of the MSC.")
336{
337 bsc_nat_set_msc_ip(_nat, argv[0]);
338 return CMD_SUCCESS;
339}
340
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +0200341DEFUN(cfg_nat_msc_port,
342 cfg_nat_msc_port_cmd,
343 "msc port <1-65500>",
344 "Set the port of the MSC.")
345{
346 _nat->msc_port = atoi(argv[0]);
347 return CMD_SUCCESS;
348}
349
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800350DEFUN(cfg_nat_auth_time,
351 cfg_nat_auth_time_cmd,
352 "timeout auth <1-256>",
353 "The time to wait for an auth response.")
354{
355 _nat->auth_timeout = atoi(argv[0]);
356 return CMD_SUCCESS;
357}
358
359DEFUN(cfg_nat_ping_time,
360 cfg_nat_ping_time_cmd,
361 "timeout ping NR",
362 "Send a ping every NR seconds. Negative to disable.")
363{
364 _nat->ping_timeout = atoi(argv[0]);
365 return CMD_SUCCESS;
366}
367
368DEFUN(cfg_nat_pong_time,
369 cfg_nat_pong_time_cmd,
370 "timeout pong NR",
371 "Wait NR seconds for the PONG response. Should be smaller than ping.")
372{
373 _nat->pong_timeout = atoi(argv[0]);
374 return CMD_SUCCESS;
375}
376
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800377DEFUN(cfg_nat_token, cfg_nat_token_cmd,
378 "token TOKEN",
379 "Set a token for the NAT")
380{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200381 bsc_replace_string(_nat, &_nat->token, argv[0]);
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800382 return CMD_SUCCESS;
383}
384
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800385DEFUN(cfg_nat_bsc_ip_dscp, cfg_nat_bsc_ip_dscp_cmd,
386 "ip-dscp <0-255>",
387 "Set the IP DSCP for the BSCs to use\n" "Set the IP_TOS attribute")
Holger Hans Peter Freyther078321a2010-05-31 10:36:35 +0800388{
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800389 _nat->bsc_ip_dscp = atoi(argv[0]);
Holger Hans Peter Freyther078321a2010-05-31 10:36:35 +0800390 return CMD_SUCCESS;
391}
392
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800393ALIAS_DEPRECATED(cfg_nat_bsc_ip_dscp, cfg_nat_bsc_ip_tos_cmd,
394 "ip-tos <0-255>",
395 "Use ip-dscp in the future.\n" "Set the DSCP\n")
396
397
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800398DEFUN(cfg_nat_acc_lst_name,
399 cfg_nat_acc_lst_name_cmd,
400 "access-list-name NAME",
401 "Set the name of the access list to use.\n"
402 "The name of the to be used access list.")
403{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200404 bsc_replace_string(_nat, &_nat->acc_lst_name, argv[0]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800405 return CMD_SUCCESS;
406}
407
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200408DEFUN(cfg_nat_number_rewrite,
409 cfg_nat_number_rewrite_cmd,
410 "number-rewrite FILENAME",
411 "Set the file with rewriting rules.\n" "Filename")
412{
413 bsc_replace_string(_nat, &_nat->num_rewr_name, argv[0]);
414 if (_nat->num_rewr_name) {
415 if (_nat->num_rewr)
416 talloc_free(_nat->num_rewr);
417 _nat->num_rewr = msg_entry_parse(_nat, _nat->num_rewr_name);
418 return _nat->num_rewr == NULL ? CMD_WARNING : CMD_SUCCESS;
419 } else {
420 if (_nat->num_rewr)
421 talloc_free(_nat->num_rewr);
422 _nat->num_rewr = NULL;
423 return CMD_SUCCESS;
424 }
425}
426
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200427DEFUN(cfg_nat_ussd_lst_name,
428 cfg_nat_ussd_lst_name_cmd,
429 "ussd-list-name NAME",
430 "Set the name of the access list to check for IMSIs for USSD message\n"
431 "The name of the access list for HLR USSD handling")
432{
Holger Hans Peter Freyther64b12922010-10-12 21:31:02 +0200433 bsc_replace_string(_nat, &_nat->ussd_lst_name, argv[0]);
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200434 return CMD_SUCCESS;
435}
436
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200437DEFUN(cfg_nat_ussd_query,
438 cfg_nat_ussd_query_cmd,
439 "ussd-query QUERY",
440 "Set the USSD query to match with the ussd-list-name\n"
441 "The query to match")
442{
Holger Hans Peter Freyther64b12922010-10-12 21:31:02 +0200443 bsc_replace_string(_nat, &_nat->ussd_query, argv[0]);
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200444 return CMD_SUCCESS;
445}
446
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200447DEFUN(cfg_nat_ussd_token,
448 cfg_nat_ussd_token_cmd,
449 "ussd-token TOKEN",
450 "Set the token used to identify the USSD module\n" "Secret key\n")
451{
Holger Hans Peter Freyther64b12922010-10-12 21:31:02 +0200452 bsc_replace_string(_nat, &_nat->ussd_token, argv[0]);
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200453 return CMD_SUCCESS;
454}
455
456DEFUN(cfg_nat_ussd_local,
457 cfg_nat_ussd_local_cmd,
458 "ussd-local-ip A.B.C.D",
459 "Set the IP to listen for the USSD Provider\n" "IP Address\n")
460{
Holger Hans Peter Freyther64b12922010-10-12 21:31:02 +0200461 bsc_replace_string(_nat, &_nat->ussd_local, argv[0]);
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200462 return CMD_SUCCESS;
463}
464
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800465/* per BSC configuration */
Holger Hans Peter Freytherb9af2fa2010-04-27 15:35:14 +0800466DEFUN(cfg_bsc, cfg_bsc_cmd, "bsc BSC_NR", "Select a BSC to configure")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800467{
468 int bsc_nr = atoi(argv[0]);
469 struct bsc_config *bsc;
470
471 if (bsc_nr > _nat->num_bsc) {
472 vty_out(vty, "%% The next unused BSC number is %u%s",
473 _nat->num_bsc, VTY_NEWLINE);
474 return CMD_WARNING;
475 } else if (bsc_nr == _nat->num_bsc) {
476 /* allocate a new one */
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800477 bsc = bsc_config_alloc(_nat, "unknown");
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800478 } else
479 bsc = bsc_config_num(_nat, bsc_nr);
480
481 if (!bsc)
482 return CMD_WARNING;
483
484 vty->index = bsc;
Holger Hans Peter Freyther7b4a53d2010-06-17 14:42:20 +0800485 vty->node = NAT_BSC_NODE;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800486
487 return CMD_SUCCESS;
488}
489
490DEFUN(cfg_bsc_token, cfg_bsc_token_cmd, "token TOKEN", "Set the token")
491{
492 struct bsc_config *conf = vty->index;
493
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200494 bsc_replace_string(conf, &conf->token, argv[0]);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800495 return CMD_SUCCESS;
496}
497
498DEFUN(cfg_bsc_lac, cfg_bsc_lac_cmd, "location_area_code <0-65535>",
Holger Hans Peter Freytherb9af2fa2010-04-27 15:35:14 +0800499 "Set the Location Area Code (LAC) of this BSC")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800500{
Holger Hans Peter Freyther39ee8772010-03-30 06:08:56 +0200501 struct bsc_config *tmp;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800502 struct bsc_config *conf = vty->index;
503
504 int lac = atoi(argv[0]);
505
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800506 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
507 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
508 lac, VTY_NEWLINE);
509 return CMD_WARNING;
510 }
511
Holger Hans Peter Freyther39ee8772010-03-30 06:08:56 +0200512 /* verify that the LACs are unique */
513 llist_for_each_entry(tmp, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800514 if (bsc_config_handles_lac(tmp, lac)) {
Holger Hans Peter Freyther39ee8772010-03-30 06:08:56 +0200515 vty_out(vty, "%% LAC %d is already used.%s", lac, VTY_NEWLINE);
516 return CMD_ERR_INCOMPLETE;
517 }
518 }
519
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800520 bsc_config_add_lac(conf, lac);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800521
522 return CMD_SUCCESS;
523}
524
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800525DEFUN(cfg_bsc_no_lac, cfg_bsc_no_lac_cmd,
526 "no location_area_code <0-65535>",
527 NO_STR "Set the Location Area Code (LAC) of this BSC")
528{
529 int lac = atoi(argv[0]);
530 struct bsc_config *conf = vty->index;
531
532 bsc_config_del_lac(conf, lac);
533 return CMD_SUCCESS;
534}
535
536
537
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800538DEFUN(cfg_lst_imsi_allow,
539 cfg_lst_imsi_allow_cmd,
540 "access-list NAME imsi-allow [REGEXP]",
541 "Allow IMSIs matching the REGEXP\n"
542 "The name of the access-list\n"
543 "The regexp of allowed IMSIs\n")
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200544{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800545 struct bsc_nat_acc_lst *acc;
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800546 struct bsc_nat_acc_lst_entry *entry;
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200547
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800548 acc = bsc_nat_acc_lst_get(_nat, argv[0]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800549 if (!acc)
550 return CMD_WARNING;
551
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800552 entry = bsc_nat_acc_lst_entry_create(acc);
553 if (!entry)
554 return CMD_WARNING;
555
556 bsc_parse_reg(acc, &entry->imsi_allow_re, &entry->imsi_allow, argc - 1, &argv[1]);
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200557 return CMD_SUCCESS;
558}
559
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800560DEFUN(cfg_lst_imsi_deny,
561 cfg_lst_imsi_deny_cmd,
562 "access-list NAME imsi-deny [REGEXP]",
563 "Allow IMSIs matching the REGEXP\n"
564 "The name of the access-list\n"
565 "The regexp of to be denied IMSIs\n")
566{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800567 struct bsc_nat_acc_lst *acc;
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800568 struct bsc_nat_acc_lst_entry *entry;
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800569
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800570 acc = bsc_nat_acc_lst_get(_nat, argv[0]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800571 if (!acc)
572 return CMD_WARNING;
573
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800574 entry = bsc_nat_acc_lst_entry_create(acc);
575 if (!entry)
576 return CMD_WARNING;
577
578 bsc_parse_reg(acc, &entry->imsi_deny_re, &entry->imsi_deny, argc - 1, &argv[1]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800579 return CMD_SUCCESS;
580}
581
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800582/* naming to follow Zebra... */
583DEFUN(cfg_lst_no,
584 cfg_lst_no_cmd,
585 "no access-list NAME",
586 NO_STR "Remove an access-list by name\n"
587 "The access-list to remove\n")
588{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800589 struct bsc_nat_acc_lst *acc;
590 acc = bsc_nat_acc_lst_find(_nat, argv[0]);
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800591 if (!acc)
592 return CMD_WARNING;
593
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800594 bsc_nat_acc_lst_delete(acc);
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800595 return CMD_SUCCESS;
596}
597
Holger Hans Peter Freyther520c1f12010-09-25 16:25:47 +0800598DEFUN(show_acc_lst,
599 show_acc_lst_cmd,
600 "show access-list NAME",
601 SHOW_STR "The name of the access list\n")
602{
603 struct bsc_nat_acc_lst *acc;
604 acc = bsc_nat_acc_lst_find(_nat, argv[0]);
605 if (!acc)
606 return CMD_WARNING;
607
608 vty_out(vty, "access-list %s%s", acc->name, VTY_NEWLINE);
609 vty_out_rate_ctr_group(vty, " ", acc->stats);
610
611 return CMD_SUCCESS;
612}
613
614
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800615DEFUN(cfg_bsc_acc_lst_name,
616 cfg_bsc_acc_lst_name_cmd,
617 "access-list-name NAME",
618 "Set the name of the access list to use.\n"
619 "The name of the to be used access list.")
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200620{
621 struct bsc_config *conf = vty->index;
622
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200623 bsc_replace_string(conf, &conf->acc_lst_name, argv[0]);
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200624 return CMD_SUCCESS;
625}
626
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800627DEFUN(cfg_bsc_paging,
628 cfg_bsc_paging_cmd,
629 "paging forbidden (0|1)",
630 "Forbid sending PAGING REQUESTS to the BSC.")
631{
632 struct bsc_config *conf = vty->index;
633
Holger Hans Peter Freyther834f1df2010-04-21 20:07:07 +0800634 if (strcmp("1", argv[0]) == 0)
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800635 conf->forbid_paging = 1;
636 else
637 conf->forbid_paging = 0;
638
639 return CMD_SUCCESS;
640}
641
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800642DEFUN(cfg_bsc_desc,
643 cfg_bsc_desc_cmd,
644 "description DESC",
645 "Provide a description for the given BSC.")
646{
647 struct bsc_config *conf = vty->index;
648
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200649 bsc_replace_string(conf, &conf->description, argv[0]);
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800650 return CMD_SUCCESS;
651}
652
Holger Hans Peter Freyther52c4ba02010-05-14 23:43:12 +0800653DEFUN(test_regex, test_regex_cmd,
654 "test regex PATTERN STRING",
655 "Check if the string is matching the current pattern.")
656{
657 regex_t reg;
658 char *str = NULL;
659
660 memset(&reg, 0, sizeof(reg));
661 bsc_parse_reg(_nat, &reg, &str, 1, argv);
662
663 vty_out(vty, "String matches allow pattern: %d%s",
664 regexec(&reg, argv[1], 0, NULL, 0) == 0, VTY_NEWLINE);
665
666 talloc_free(str);
667 regfree(&reg);
668 return CMD_SUCCESS;
669}
670
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800671int bsc_nat_vty_init(struct bsc_nat *nat)
672{
673 _nat = nat;
674
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800675 /* show commands */
Holger Hans Peter Freyther1398f132010-06-15 20:14:08 +0800676 install_element_ve(&show_sccp_cmd);
677 install_element_ve(&show_bsc_cmd);
678 install_element_ve(&show_bsc_cfg_cmd);
679 install_element_ve(&show_stats_cmd);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800680 install_element_ve(&show_stats_lac_cmd);
Holger Hans Peter Freyther1398f132010-06-15 20:14:08 +0800681 install_element_ve(&close_bsc_cmd);
682 install_element_ve(&show_msc_cmd);
683 install_element_ve(&test_regex_cmd);
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800684 install_element_ve(&show_bsc_mgcp_cmd);
Holger Hans Peter Freyther520c1f12010-09-25 16:25:47 +0800685 install_element_ve(&show_acc_lst_cmd);
Holger Hans Peter Freyther5f291d52010-04-06 12:01:15 +0200686
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800687 /* nat group */
688 install_element(CONFIG_NODE, &cfg_nat_cmd);
689 install_node(&nat_node, config_write_nat);
690 install_default(NAT_NODE);
Holger Hans Peter Freyther9c786972010-06-17 14:39:15 +0800691 install_element(NAT_NODE, &ournode_exit_cmd);
692 install_element(NAT_NODE, &ournode_end_cmd);
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800693 install_element(NAT_NODE, &cfg_nat_msc_ip_cmd);
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +0200694 install_element(NAT_NODE, &cfg_nat_msc_port_cmd);
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800695 install_element(NAT_NODE, &cfg_nat_auth_time_cmd);
696 install_element(NAT_NODE, &cfg_nat_ping_time_cmd);
697 install_element(NAT_NODE, &cfg_nat_pong_time_cmd);
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800698 install_element(NAT_NODE, &cfg_nat_token_cmd);
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800699 install_element(NAT_NODE, &cfg_nat_bsc_ip_dscp_cmd);
Holger Hans Peter Freyther078321a2010-05-31 10:36:35 +0800700 install_element(NAT_NODE, &cfg_nat_bsc_ip_tos_cmd);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800701 install_element(NAT_NODE, &cfg_nat_acc_lst_name_cmd);
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200702 install_element(NAT_NODE, &cfg_nat_ussd_lst_name_cmd);
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200703 install_element(NAT_NODE, &cfg_nat_ussd_query_cmd);
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200704 install_element(NAT_NODE, &cfg_nat_ussd_token_cmd);
705 install_element(NAT_NODE, &cfg_nat_ussd_local_cmd);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800706
707 /* access-list */
708 install_element(NAT_NODE, &cfg_lst_imsi_allow_cmd);
709 install_element(NAT_NODE, &cfg_lst_imsi_deny_cmd);
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800710 install_element(NAT_NODE, &cfg_lst_no_cmd);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800711
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200712 /* number rewriting */
713 install_element(NAT_NODE, &cfg_nat_number_rewrite_cmd);
714
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800715 /* BSC subgroups */
716 install_element(NAT_NODE, &cfg_bsc_cmd);
717 install_node(&bsc_node, config_write_bsc);
Holger Hans Peter Freyther7b4a53d2010-06-17 14:42:20 +0800718 install_default(NAT_BSC_NODE);
719 install_element(NAT_BSC_NODE, &ournode_exit_cmd);
720 install_element(NAT_BSC_NODE, &ournode_end_cmd);
721 install_element(NAT_BSC_NODE, &cfg_bsc_token_cmd);
722 install_element(NAT_BSC_NODE, &cfg_bsc_lac_cmd);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800723 install_element(NAT_BSC_NODE, &cfg_bsc_no_lac_cmd);
Holger Hans Peter Freyther7b4a53d2010-06-17 14:42:20 +0800724 install_element(NAT_BSC_NODE, &cfg_bsc_paging_cmd);
725 install_element(NAT_BSC_NODE, &cfg_bsc_desc_cmd);
726 install_element(NAT_BSC_NODE, &cfg_bsc_acc_lst_name_cmd);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800727
Holger Hans Peter Freytherf7d33352010-06-15 18:50:26 +0800728 mgcp_vty_init();
729
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800730 return 0;
731}
732
733
734/* called by the telnet interface... we have our own init above */
735void bsc_vty_init()
736{}