blob: 4cb3537539830661b40a44598d4ec3fc145324d8 [file] [log] [blame]
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +08001/* OpenBSC NAT interface to quagga VTY */
Holger Hans Peter Freythera18b1162011-04-01 17:32:21 +02002/* (C) 2010-2011 by Holger Hans Peter Freyther
3 * (C) 2010-2011 by On-Waves
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +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 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 Freyther06c9da62011-06-09 21:48:49 +020022#include <openbsc/gsm_data.h>
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080023#include <openbsc/bsc_nat.h>
Holger Hans Peter Freytherc2b31ed2010-07-31 05:17:17 +080024#include <openbsc/bsc_nat_sccp.h>
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +080025#include <openbsc/bsc_msc.h>
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080026#include <openbsc/gsm_04_08.h>
Holger Hans Peter Freytherf7d33352010-06-15 18:50:26 +080027#include <openbsc/mgcp.h>
Holger Hans Peter Freyther5f291d52010-04-06 12:01:15 +020028#include <openbsc/vty.h>
Holger Hans Peter Freyther6c45f2e2010-06-15 19:06:18 +080029
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010030#include <osmocom/core/talloc.h>
31#include <osmocom/core/rate_ctr.h>
32#include <osmocom/core/utils.h>
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +010033#include <osmocom/vty/logging.h>
Pablo Neira Ayuso6110a3f2011-03-28 19:35:00 +020034#include <osmocom/vty/misc.h>
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080035
Harald Welted5db12c2010-08-03 15:11:51 +020036#include <osmocom/sccp/sccp.h>
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080037
38#include <stdlib.h>
39
40static struct bsc_nat *_nat;
41
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +020042
43#define PAGING_STR "Paging\n"
Holger Hans Peter Freythere36b4872011-05-31 00:35:46 +020044#define SMSC_REWRITE "SMSC Rewriting\n"
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +020045
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080046static struct cmd_node nat_node = {
47 NAT_NODE,
48 "%s(nat)#",
49 1,
50};
51
52static struct cmd_node bsc_node = {
Holger Hans Peter Freyther7b4a53d2010-06-17 14:42:20 +080053 NAT_BSC_NODE,
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080054 "%s(bsc)#",
55 1,
56};
57
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +020058static struct cmd_node pgroup_node = {
59 PGROUP_NODE,
60 "%s(paging-group)#",
61 1,
62};
63
64static int config_write_pgroup(struct vty *vty)
65{
66 return CMD_SUCCESS;
67}
68
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +080069static void write_acc_lst(struct vty *vty, struct bsc_nat_acc_lst *lst)
70{
71 struct bsc_nat_acc_lst_entry *entry;
72
73 llist_for_each_entry(entry, &lst->fltr_list, list) {
74 if (entry->imsi_allow)
75 vty_out(vty, " access-list %s imsi-allow %s%s",
76 lst->name, entry->imsi_allow, VTY_NEWLINE);
77 if (entry->imsi_deny)
78 vty_out(vty, " access-list %s imsi-deny %s%s",
79 lst->name, entry->imsi_deny, VTY_NEWLINE);
80 }
81}
82
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +020083static void dump_lac(struct vty *vty, struct llist_head *head)
84{
85 struct bsc_lac_entry *lac;
86 llist_for_each_entry(lac, head, entry)
87 vty_out(vty, " location_area_code %u%s", lac->lac, VTY_NEWLINE);
88}
89
90
91static void write_pgroup_lst(struct vty *vty, struct bsc_nat_paging_group *pgroup)
92{
93 vty_out(vty, " paging-group %d%s", pgroup->nr, VTY_NEWLINE);
94 dump_lac(vty, &pgroup->lists);
95}
96
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080097static int config_write_nat(struct vty *vty)
98{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +080099 struct bsc_nat_acc_lst *lst;
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200100 struct bsc_nat_paging_group *pgroup;
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800101
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800102 vty_out(vty, "nat%s", VTY_NEWLINE);
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200103 vty_out(vty, " msc ip %s%s", _nat->main_dest->ip, VTY_NEWLINE);
104 vty_out(vty, " msc port %d%s", _nat->main_dest->port, VTY_NEWLINE);
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800105 vty_out(vty, " timeout auth %d%s", _nat->auth_timeout, VTY_NEWLINE);
106 vty_out(vty, " timeout ping %d%s", _nat->ping_timeout, VTY_NEWLINE);
107 vty_out(vty, " timeout pong %d%s", _nat->pong_timeout, VTY_NEWLINE);
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800108 if (_nat->token)
109 vty_out(vty, " token %s%s", _nat->token, VTY_NEWLINE);
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800110 vty_out(vty, " ip-dscp %d%s", _nat->bsc_ip_dscp, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800111 if (_nat->acc_lst_name)
112 vty_out(vty, " access-list-name %s%s", _nat->acc_lst_name, VTY_NEWLINE);
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200113 if (_nat->ussd_lst_name)
114 vty_out(vty, " ussd-list-name %s%s", _nat->ussd_lst_name, VTY_NEWLINE);
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200115 if (_nat->ussd_query)
116 vty_out(vty, " ussd-query %s%s", _nat->ussd_query, VTY_NEWLINE);
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200117 if (_nat->ussd_token)
118 vty_out(vty, " ussd-token %s%s", _nat->ussd_token, VTY_NEWLINE);
119 if (_nat->ussd_local)
120 vty_out(vty, " ussd-local-ip %s%s", _nat->ussd_local, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800121
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200122 if (_nat->num_rewr_name)
123 vty_out(vty, " number-rewrite %s%s", _nat->num_rewr_name, VTY_NEWLINE);
Holger Hans Peter Freythere36b4872011-05-31 00:35:46 +0200124 if (_nat->smsc_rewr_name)
125 vty_out(vty, " rewrite-smsc addr %s%s",
126 _nat->smsc_rewr_name, VTY_NEWLINE);
127 if (_nat->tpdest_match_name)
128 vty_out(vty, " rewrite-smsc tp-dest-match %s%s",
129 _nat->tpdest_match_name, VTY_NEWLINE);
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +0100130 if (_nat->sms_clear_tp_srr_name)
131 vty_out(vty, " sms-clear-tp-srr %s%s",
132 _nat->sms_clear_tp_srr_name, VTY_NEWLINE);
Holger Hans Peter Freyther7d60bdb2012-01-18 20:40:01 +0100133 if (_nat->sms_num_rewr_name)
134 vty_out(vty, " sms-number-rewrite %s%s",
135 _nat->sms_num_rewr_name, VTY_NEWLINE);
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200136
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200137 llist_for_each_entry(lst, &_nat->access_lists, list)
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800138 write_acc_lst(vty, lst);
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200139 llist_for_each_entry(pgroup, &_nat->paging_groups, entry)
140 write_pgroup_lst(vty, pgroup);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800141
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800142 return CMD_SUCCESS;
143}
144
145static void config_write_bsc_single(struct vty *vty, struct bsc_config *bsc)
146{
147 vty_out(vty, " bsc %u%s", bsc->nr, VTY_NEWLINE);
148 vty_out(vty, " token %s%s", bsc->token, VTY_NEWLINE);
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200149 dump_lac(vty, &bsc->lac_list);
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800150 if (bsc->description)
151 vty_out(vty, " description %s%s", bsc->description, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800152 if (bsc->acc_lst_name)
Holger Hans Peter Freyther27d36de2010-06-08 11:18:26 +0800153 vty_out(vty, " access-list-name %s%s", bsc->acc_lst_name, VTY_NEWLINE);
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100154 vty_out(vty, " max-endpoints %d%s", bsc->max_endpoints, VTY_NEWLINE);
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200155 if (bsc->paging_group != -1)
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +0200156 vty_out(vty, " paging group %d%s", bsc->paging_group, VTY_NEWLINE);
157 vty_out(vty, " paging forbidden %d%s", bsc->forbid_paging, VTY_NEWLINE);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800158}
159
160static int config_write_bsc(struct vty *vty)
161{
162 struct bsc_config *bsc;
163
164 llist_for_each_entry(bsc, &_nat->bsc_configs, entry)
165 config_write_bsc_single(vty, bsc);
166 return CMD_SUCCESS;
167}
168
169
Holger Hans Peter Freyther01a0b1b2010-04-19 16:06:43 +0800170DEFUN(show_sccp, show_sccp_cmd, "show sccp connections",
171 SHOW_STR "Display information about current SCCP connections")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800172{
173 struct sccp_connections *con;
Holger Hans Peter Freyther85804a82010-09-15 19:01:31 +0800174 vty_out(vty, "Listing all open SCCP connections%s", VTY_NEWLINE);
Holger Hans Peter Freyther4bd22942010-04-27 13:11:18 +0800175
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800176 llist_for_each_entry(con, &_nat->sccp_connections, list_entry) {
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800177 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 +0200178 con->bsc->cfg ? con->bsc->cfg->nr : -1,
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800179 sccp_src_ref_to_int(&con->real_ref),
Holger Hans Peter Freyther32d34362010-04-05 10:10:33 +0200180 sccp_src_ref_to_int(&con->patched_ref),
Holger Hans Peter Freyther4bd22942010-04-27 13:11:18 +0800181 con->has_remote_ref,
182 sccp_src_ref_to_int(&con->remote_ref),
Holger Hans Peter Freytherf4b34392010-08-28 16:08:39 +0800183 con->msc_endp, con->bsc_endp,
Holger Hans Peter Freyther234d3122010-05-16 02:06:11 +0800184 bsc_con_type_to_string(con->con_type),
Holger Hans Peter Freyther32d34362010-04-05 10:10:33 +0200185 VTY_NEWLINE);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800186 }
187
188 return CMD_SUCCESS;
189}
190
Holger Hans Peter Freyther01a0b1b2010-04-19 16:06:43 +0800191DEFUN(show_bsc, show_bsc_cmd, "show bsc connections",
192 SHOW_STR "Display information about current BSCs")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800193{
194 struct bsc_connection *con;
Holger Hans Peter Freyther870663a2010-04-08 10:35:20 +0200195 struct sockaddr_in sock;
196 socklen_t len = sizeof(sock);
197
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800198 llist_for_each_entry(con, &_nat->bsc_connections, list_entry) {
Holger Hans Peter Freyther870663a2010-04-08 10:35:20 +0200199 getpeername(con->write_queue.bfd.fd, (struct sockaddr *) &sock, &len);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800200 vty_out(vty, "BSC nr: %d auth: %d fd: %d peername: %s%s",
Holger Hans Peter Freyther47dd4942010-04-06 15:11:34 +0200201 con->cfg ? con->cfg->nr : -1,
Holger Hans Peter Freyther870663a2010-04-08 10:35:20 +0200202 con->authenticated, con->write_queue.bfd.fd,
203 inet_ntoa(sock.sin_addr), VTY_NEWLINE);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800204 }
205
206 return CMD_SUCCESS;
207}
208
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800209DEFUN(show_bsc_mgcp, show_bsc_mgcp_cmd, "show bsc mgcp NR",
210 SHOW_STR "Display the MGCP status for a given BSC")
211{
212 struct bsc_connection *con;
213 int nr = atoi(argv[0]);
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100214 int i, j, endp;
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800215
216 llist_for_each_entry(con, &_nat->bsc_connections, list_entry) {
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100217 int max;
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800218 if (!con->cfg)
219 continue;
220 if (con->cfg->nr != nr)
221 continue;
222
Holger Hans Peter Freythered500e32011-02-25 17:09:07 +0100223 /* this bsc has no audio endpoints yet */
224 if (!con->_endpoint_status)
225 continue;
226
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800227 vty_out(vty, "MGCP Status for %d%s", con->cfg->nr, VTY_NEWLINE);
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100228 max = bsc_mgcp_nr_multiplexes(con->max_endpoints);
229 for (i = 0; i < max; ++i) {
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100230 for (j = 0; j < 32; ++j) {
231 endp = mgcp_timeslot_to_endpoint(i, j);
232 vty_out(vty, " Endpoint 0x%x %s%s", endp,
233 con->_endpoint_status[endp] == 0
234 ? "free" : "allocated",
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800235 VTY_NEWLINE);
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100236 }
237 }
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800238 break;
239 }
240
241 return CMD_SUCCESS;
242}
243
Holger Hans Peter Freytherab7539c2010-04-22 13:36:46 +0800244DEFUN(show_bsc_cfg, show_bsc_cfg_cmd, "show bsc config",
245 SHOW_STR "Display information about known BSC configs")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800246{
247 struct bsc_config *conf;
248 llist_for_each_entry(conf, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800249 vty_out(vty, "BSC token: '%s' nr: %u%s",
250 conf->token, conf->nr, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800251 if (conf->acc_lst_name)
252 vty_out(vty, " access-list: %s%s",
253 conf->acc_lst_name, VTY_NEWLINE);
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800254 vty_out(vty, " paging forbidden: %d%s",
255 conf->forbid_paging, VTY_NEWLINE);
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800256 if (conf->description)
257 vty_out(vty, " description: %s%s", conf->description, VTY_NEWLINE);
258 else
259 vty_out(vty, " No description.%s", VTY_NEWLINE);
260
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800261 }
262
263 return CMD_SUCCESS;
264}
265
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800266static void dump_stat_total(struct vty *vty, struct bsc_nat *nat)
267{
268 vty_out(vty, "NAT statistics%s", VTY_NEWLINE);
269 vty_out(vty, " SCCP Connections %lu total, %lu calls%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +0200270 osmo_counter_get(nat->stats.sccp.conn),
271 osmo_counter_get(nat->stats.sccp.calls), VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800272 vty_out(vty, " MSC Connections %lu%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +0200273 osmo_counter_get(nat->stats.msc.reconn), VTY_NEWLINE);
Holger Hans Peter Freythercbfd0982010-08-04 02:34:10 +0800274 vty_out(vty, " MSC Connected: %d%s",
275 nat->msc_con->is_connected, VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800276 vty_out(vty, " BSC Connections %lu total, %lu auth failed.%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +0200277 osmo_counter_get(nat->stats.bsc.reconn),
278 osmo_counter_get(nat->stats.bsc.auth_fail), VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800279}
280
281static void dump_stat_bsc(struct vty *vty, struct bsc_config *conf)
282{
Holger Hans Peter Freytherf21e4532010-07-22 20:37:35 +0800283 int connected = 0;
284 struct bsc_connection *con;
285
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800286 vty_out(vty, " BSC nr: %d%s",
287 conf->nr, VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800288 vty_out_rate_ctr_group(vty, " ", conf->stats.ctrg);
Holger Hans Peter Freytherf21e4532010-07-22 20:37:35 +0800289
290 llist_for_each_entry(con, &conf->nat->bsc_connections, list_entry) {
291 if (con->cfg != conf)
292 continue;
293 connected = 1;
294 break;
295 }
296
Holger Hans Peter Freyther03a0ad02010-08-04 02:29:03 +0800297 vty_out(vty, " Connected: %d%s", connected, VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800298}
299
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200300DEFUN(show_stats,
301 show_stats_cmd,
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800302 "show statistics [NR]",
Holger Hans Peter Freytherb9af2fa2010-04-27 15:35:14 +0800303 SHOW_STR "Display network statistics")
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200304{
305 struct bsc_config *conf;
306
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800307 int nr = -1;
308
309 if (argc == 1)
310 nr = atoi(argv[0]);
311
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800312 dump_stat_total(vty, _nat);
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200313 llist_for_each_entry(conf, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800314 if (argc == 1 && nr != conf->nr)
315 continue;
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800316 dump_stat_bsc(vty, conf);
317 }
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800318
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800319 return CMD_SUCCESS;
320}
321
322DEFUN(show_stats_lac,
323 show_stats_lac_cmd,
324 "show statistics-by-lac <0-65535>",
325 SHOW_STR "Display network statistics by lac\n"
326 "The lac of the BSC\n")
327{
328 int lac;
329 struct bsc_config *conf;
330
331 lac = atoi(argv[0]);
332
333 dump_stat_total(vty, _nat);
334 llist_for_each_entry(conf, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800335 if (!bsc_config_handles_lac(conf, lac))
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800336 continue;
337 dump_stat_bsc(vty, conf);
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200338 }
339
340 return CMD_SUCCESS;
341}
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800342
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +0800343DEFUN(show_msc,
344 show_msc_cmd,
345 "show msc connection",
346 SHOW_STR "Show the status of the MSC connection.")
347{
348 if (!_nat->msc_con) {
349 vty_out(vty, "The MSC is not yet configured.\n");
350 return CMD_WARNING;
351 }
352
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200353 vty_out(vty, "MSC is connected: %d%s\n",
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +0800354 _nat->msc_con->is_connected, VTY_NEWLINE);
355 return CMD_SUCCESS;
356}
357
Holger Hans Peter Freyther2f9dcf02010-04-27 13:21:39 +0800358DEFUN(close_bsc,
359 close_bsc_cmd,
360 "close bsc connection BSC_NR",
Holger Hans Peter Freytherb9af2fa2010-04-27 15:35:14 +0800361 "Close the connection with the BSC identified by the config number.")
Holger Hans Peter Freyther2f9dcf02010-04-27 13:21:39 +0800362{
363 struct bsc_connection *bsc;
364 int bsc_nr = atoi(argv[0]);
365
366 llist_for_each_entry(bsc, &_nat->bsc_connections, list_entry) {
367 if (!bsc->cfg || bsc->cfg->nr != bsc_nr)
368 continue;
369 bsc_close_connection(bsc);
370 break;
371 }
372
373 return CMD_SUCCESS;
374}
375
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800376DEFUN(cfg_nat, cfg_nat_cmd, "nat", "Configute the NAT")
377{
378 vty->index = _nat;
379 vty->node = NAT_NODE;
380
381 return CMD_SUCCESS;
382}
383
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800384DEFUN(cfg_nat_msc_ip,
385 cfg_nat_msc_ip_cmd,
Holger Hans Peter Freytherd8b82062010-05-14 02:36:42 +0800386 "msc ip A.B.C.D",
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800387 "Set the IP address of the MSC.")
388{
389 bsc_nat_set_msc_ip(_nat, argv[0]);
390 return CMD_SUCCESS;
391}
392
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +0200393DEFUN(cfg_nat_msc_port,
394 cfg_nat_msc_port_cmd,
395 "msc port <1-65500>",
396 "Set the port of the MSC.")
397{
Holger Hans Peter Freythere1880102011-04-23 23:31:31 +0200398 _nat->main_dest->port = atoi(argv[0]);
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +0200399 return CMD_SUCCESS;
400}
401
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800402DEFUN(cfg_nat_auth_time,
403 cfg_nat_auth_time_cmd,
404 "timeout auth <1-256>",
405 "The time to wait for an auth response.")
406{
407 _nat->auth_timeout = atoi(argv[0]);
408 return CMD_SUCCESS;
409}
410
411DEFUN(cfg_nat_ping_time,
412 cfg_nat_ping_time_cmd,
413 "timeout ping NR",
414 "Send a ping every NR seconds. Negative to disable.")
415{
416 _nat->ping_timeout = atoi(argv[0]);
417 return CMD_SUCCESS;
418}
419
420DEFUN(cfg_nat_pong_time,
421 cfg_nat_pong_time_cmd,
422 "timeout pong NR",
423 "Wait NR seconds for the PONG response. Should be smaller than ping.")
424{
425 _nat->pong_timeout = atoi(argv[0]);
426 return CMD_SUCCESS;
427}
428
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800429DEFUN(cfg_nat_token, cfg_nat_token_cmd,
430 "token TOKEN",
431 "Set a token for the NAT")
432{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200433 bsc_replace_string(_nat, &_nat->token, argv[0]);
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800434 return CMD_SUCCESS;
435}
436
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800437DEFUN(cfg_nat_bsc_ip_dscp, cfg_nat_bsc_ip_dscp_cmd,
438 "ip-dscp <0-255>",
439 "Set the IP DSCP for the BSCs to use\n" "Set the IP_TOS attribute")
Holger Hans Peter Freyther078321a2010-05-31 10:36:35 +0800440{
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800441 _nat->bsc_ip_dscp = atoi(argv[0]);
Holger Hans Peter Freyther078321a2010-05-31 10:36:35 +0800442 return CMD_SUCCESS;
443}
444
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800445ALIAS_DEPRECATED(cfg_nat_bsc_ip_dscp, cfg_nat_bsc_ip_tos_cmd,
446 "ip-tos <0-255>",
447 "Use ip-dscp in the future.\n" "Set the DSCP\n")
448
449
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800450DEFUN(cfg_nat_acc_lst_name,
451 cfg_nat_acc_lst_name_cmd,
452 "access-list-name NAME",
453 "Set the name of the access list to use.\n"
454 "The name of the to be used access list.")
455{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200456 bsc_replace_string(_nat, &_nat->acc_lst_name, argv[0]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800457 return CMD_SUCCESS;
458}
459
Holger Hans Peter Freyther6a7babd2011-03-29 17:14:34 +0200460DEFUN(cfg_nat_no_acc_lst_name,
461 cfg_nat_no_acc_lst_name_cmd,
462 "no access-list-name",
463 NO_STR "Remove the access list from the NAT.\n")
464{
465 if (_nat->acc_lst_name) {
466 talloc_free(_nat->acc_lst_name);
467 _nat->acc_lst_name = NULL;
468 }
469
Holger Hans Peter Freyther9e7e55f2011-04-01 16:22:51 +0200470 return CMD_SUCCESS;
Holger Hans Peter Freyther6a7babd2011-03-29 17:14:34 +0200471}
472
Holger Hans Peter Freythere36b4872011-05-31 00:35:46 +0200473static int replace_rules(struct bsc_nat *nat, char **name,
474 struct llist_head *head, const char *file)
475{
476 struct osmo_config_list *rewr = NULL;
477
478 bsc_replace_string(nat, name, file);
479 if (*name) {
480 rewr = osmo_config_list_parse(nat, *name);
481 bsc_nat_num_rewr_entry_adapt(nat, head, rewr);
482 talloc_free(rewr);
483 return CMD_SUCCESS;
484 } else {
485 bsc_nat_num_rewr_entry_adapt(nat, head, NULL);
486 return CMD_SUCCESS;
487 }
488}
489
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200490DEFUN(cfg_nat_number_rewrite,
491 cfg_nat_number_rewrite_cmd,
492 "number-rewrite FILENAME",
493 "Set the file with rewriting rules.\n" "Filename")
494{
Holger Hans Peter Freythere36b4872011-05-31 00:35:46 +0200495 return replace_rules(_nat, &_nat->num_rewr_name,
496 &_nat->num_rewr, argv[0]);
497}
Holger Hans Peter Freytherad75eab2011-05-27 12:38:58 +0200498
Holger Hans Peter Freythere36b4872011-05-31 00:35:46 +0200499DEFUN(cfg_nat_smsc_addr,
500 cfg_nat_smsc_addr_cmd,
501 "rewrite-smsc addr FILENAME",
502 SMSC_REWRITE
503 "The SMSC Address to match and replace in RP-DATA\n"
504 "File with rules for the SMSC Address replacing\n")
505{
506 return replace_rules(_nat, &_nat->smsc_rewr_name,
507 &_nat->smsc_rewr, argv[0]);
508}
509
510DEFUN(cfg_nat_smsc_tpdest,
511 cfg_nat_smsc_tpdest_cmd,
512 "rewrite-smsc tp-dest-match FILENAME",
513 SMSC_REWRITE
514 "Match TP-Destination of a SMS.\n"
515 "File with rules for matching MSISDN and TP-DEST\n")
516{
517 return replace_rules(_nat, &_nat->tpdest_match_name,
518 &_nat->tpdest_match, argv[0]);
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200519}
520
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +0100521DEFUN(cfg_nat_sms_clear_tpsrr,
522 cfg_nat_sms_clear_tpsrr_cmd,
523 "sms-clear-tp-srr FILENAME",
524 "SMS TPDU Sender Report Request clearing\n"
525 "Files with rules for matching MSISDN\n")
526{
527 return replace_rules(_nat, &_nat->sms_clear_tp_srr_name,
528 &_nat->sms_clear_tp_srr, argv[0]);
529}
530
531DEFUN(cfg_nat_no_sms_clear_tpsrr,
532 cfg_nat_no_sms_clear_tpsrr_cmd,
Holger Hans Peter Freyther27188452012-01-18 20:34:08 +0100533 "no sms-clear-tp-srr",
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +0100534 NO_STR
535 "SMS TPDU Sender Report Request clearing\n")
536{
537 talloc_free(_nat->sms_clear_tp_srr_name);
538 _nat->sms_clear_tp_srr_name = NULL;
539
540 bsc_nat_num_rewr_entry_adapt(NULL, &_nat->sms_clear_tp_srr, NULL);
541 return CMD_SUCCESS;
542}
543
Holger Hans Peter Freyther7d60bdb2012-01-18 20:40:01 +0100544DEFUN(cfg_nat_sms_number_rewrite,
545 cfg_nat_sms_number_rewrite_cmd,
546 "sms-number-rewrite FILENAME",
547 "SMS TP-DA Number rewriting\n"
548 "Files with rules for matching MSISDN\n")
549{
550 return replace_rules(_nat, &_nat->sms_num_rewr_name,
551 &_nat->sms_num_rewr, argv[0]);
552}
553
554DEFUN(cfg_nat_no_sms_number_rewrite,
555 cfg_nat_no_sms_number_rewrite_cmd,
556 "no sms-number-rewrite",
557 NO_STR "Disable SMS TP-DA rewriting\n")
558{
559 talloc_free(_nat->sms_num_rewr_name);
560 _nat->sms_num_rewr_name = NULL;
561
562 bsc_nat_num_rewr_entry_adapt(NULL, &_nat->sms_num_rewr, NULL);
563 return CMD_SUCCESS;
564}
565
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200566DEFUN(cfg_nat_ussd_lst_name,
567 cfg_nat_ussd_lst_name_cmd,
568 "ussd-list-name NAME",
569 "Set the name of the access list to check for IMSIs for USSD message\n"
570 "The name of the access list for HLR USSD handling")
571{
Holger Hans Peter Freyther64b12922010-10-12 21:31:02 +0200572 bsc_replace_string(_nat, &_nat->ussd_lst_name, argv[0]);
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200573 return CMD_SUCCESS;
574}
575
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200576DEFUN(cfg_nat_ussd_query,
577 cfg_nat_ussd_query_cmd,
Holger Hans Peter Freythera18b1162011-04-01 17:32:21 +0200578 "ussd-query REGEXP",
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200579 "Set the USSD query to match with the ussd-list-name\n"
580 "The query to match")
581{
Holger Hans Peter Freyther06c9da62011-06-09 21:48:49 +0200582 if (gsm_parse_reg(_nat, &_nat->ussd_query_re, &_nat->ussd_query, argc, argv) != 0)
Holger Hans Peter Freyther4c9557e2011-04-04 19:19:26 +0200583 return CMD_WARNING;
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200584 return CMD_SUCCESS;
585}
586
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200587DEFUN(cfg_nat_ussd_token,
588 cfg_nat_ussd_token_cmd,
589 "ussd-token TOKEN",
590 "Set the token used to identify the USSD module\n" "Secret key\n")
591{
Holger Hans Peter Freyther64b12922010-10-12 21:31:02 +0200592 bsc_replace_string(_nat, &_nat->ussd_token, argv[0]);
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200593 return CMD_SUCCESS;
594}
595
596DEFUN(cfg_nat_ussd_local,
597 cfg_nat_ussd_local_cmd,
598 "ussd-local-ip A.B.C.D",
599 "Set the IP to listen for the USSD Provider\n" "IP Address\n")
600{
Holger Hans Peter Freyther64b12922010-10-12 21:31:02 +0200601 bsc_replace_string(_nat, &_nat->ussd_local, argv[0]);
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200602 return CMD_SUCCESS;
603}
604
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800605/* per BSC configuration */
Holger Hans Peter Freytherb9af2fa2010-04-27 15:35:14 +0800606DEFUN(cfg_bsc, cfg_bsc_cmd, "bsc BSC_NR", "Select a BSC to configure")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800607{
608 int bsc_nr = atoi(argv[0]);
609 struct bsc_config *bsc;
610
611 if (bsc_nr > _nat->num_bsc) {
612 vty_out(vty, "%% The next unused BSC number is %u%s",
613 _nat->num_bsc, VTY_NEWLINE);
614 return CMD_WARNING;
615 } else if (bsc_nr == _nat->num_bsc) {
616 /* allocate a new one */
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800617 bsc = bsc_config_alloc(_nat, "unknown");
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800618 } else
619 bsc = bsc_config_num(_nat, bsc_nr);
620
621 if (!bsc)
622 return CMD_WARNING;
623
624 vty->index = bsc;
Holger Hans Peter Freyther7b4a53d2010-06-17 14:42:20 +0800625 vty->node = NAT_BSC_NODE;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800626
627 return CMD_SUCCESS;
628}
629
630DEFUN(cfg_bsc_token, cfg_bsc_token_cmd, "token TOKEN", "Set the token")
631{
632 struct bsc_config *conf = vty->index;
633
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200634 bsc_replace_string(conf, &conf->token, argv[0]);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800635 return CMD_SUCCESS;
636}
637
638DEFUN(cfg_bsc_lac, cfg_bsc_lac_cmd, "location_area_code <0-65535>",
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200639 "Add the Location Area Code (LAC) of this BSC\n" "LAC\n")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800640{
Holger Hans Peter Freyther39ee8772010-03-30 06:08:56 +0200641 struct bsc_config *tmp;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800642 struct bsc_config *conf = vty->index;
643
644 int lac = atoi(argv[0]);
645
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800646 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
647 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
648 lac, VTY_NEWLINE);
649 return CMD_WARNING;
650 }
651
Holger Hans Peter Freyther39ee8772010-03-30 06:08:56 +0200652 /* verify that the LACs are unique */
653 llist_for_each_entry(tmp, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800654 if (bsc_config_handles_lac(tmp, lac)) {
Holger Hans Peter Freyther39ee8772010-03-30 06:08:56 +0200655 vty_out(vty, "%% LAC %d is already used.%s", lac, VTY_NEWLINE);
656 return CMD_ERR_INCOMPLETE;
657 }
658 }
659
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800660 bsc_config_add_lac(conf, lac);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800661
662 return CMD_SUCCESS;
663}
664
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800665DEFUN(cfg_bsc_no_lac, cfg_bsc_no_lac_cmd,
666 "no location_area_code <0-65535>",
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200667 NO_STR "Remove the Location Area Code (LAC) of this BSC\n" "LAC\n")
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800668{
669 int lac = atoi(argv[0]);
670 struct bsc_config *conf = vty->index;
671
672 bsc_config_del_lac(conf, lac);
673 return CMD_SUCCESS;
674}
675
676
677
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800678DEFUN(cfg_lst_imsi_allow,
679 cfg_lst_imsi_allow_cmd,
680 "access-list NAME imsi-allow [REGEXP]",
Holger Hans Peter Freythera64037c2011-04-13 20:58:14 +0200681 "Add the regexp to the allowed list\n"
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800682 "The name of the access-list\n"
683 "The regexp of allowed IMSIs\n")
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200684{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800685 struct bsc_nat_acc_lst *acc;
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800686 struct bsc_nat_acc_lst_entry *entry;
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200687
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800688 acc = bsc_nat_acc_lst_get(_nat, argv[0]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800689 if (!acc)
690 return CMD_WARNING;
691
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800692 entry = bsc_nat_acc_lst_entry_create(acc);
693 if (!entry)
694 return CMD_WARNING;
695
Holger Hans Peter Freyther06c9da62011-06-09 21:48:49 +0200696 if (gsm_parse_reg(acc, &entry->imsi_allow_re, &entry->imsi_allow, argc - 1, &argv[1]) != 0)
Holger Hans Peter Freyther4c9557e2011-04-04 19:19:26 +0200697 return CMD_WARNING;
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200698 return CMD_SUCCESS;
699}
700
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800701DEFUN(cfg_lst_imsi_deny,
702 cfg_lst_imsi_deny_cmd,
703 "access-list NAME imsi-deny [REGEXP]",
Holger Hans Peter Freythera64037c2011-04-13 20:58:14 +0200704 "Add the regexp to the deny list\n"
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800705 "The name of the access-list\n"
706 "The regexp of to be denied IMSIs\n")
707{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800708 struct bsc_nat_acc_lst *acc;
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800709 struct bsc_nat_acc_lst_entry *entry;
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800710
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800711 acc = bsc_nat_acc_lst_get(_nat, argv[0]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800712 if (!acc)
713 return CMD_WARNING;
714
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800715 entry = bsc_nat_acc_lst_entry_create(acc);
716 if (!entry)
717 return CMD_WARNING;
718
Holger Hans Peter Freyther06c9da62011-06-09 21:48:49 +0200719 if (gsm_parse_reg(acc, &entry->imsi_deny_re, &entry->imsi_deny, argc - 1, &argv[1]) != 0)
Holger Hans Peter Freyther4c9557e2011-04-04 19:19:26 +0200720 return CMD_WARNING;
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800721 return CMD_SUCCESS;
722}
723
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800724/* naming to follow Zebra... */
725DEFUN(cfg_lst_no,
726 cfg_lst_no_cmd,
727 "no access-list NAME",
728 NO_STR "Remove an access-list by name\n"
729 "The access-list to remove\n")
730{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800731 struct bsc_nat_acc_lst *acc;
732 acc = bsc_nat_acc_lst_find(_nat, argv[0]);
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800733 if (!acc)
734 return CMD_WARNING;
735
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800736 bsc_nat_acc_lst_delete(acc);
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800737 return CMD_SUCCESS;
738}
739
Holger Hans Peter Freyther520c1f12010-09-25 16:25:47 +0800740DEFUN(show_acc_lst,
741 show_acc_lst_cmd,
742 "show access-list NAME",
743 SHOW_STR "The name of the access list\n")
744{
745 struct bsc_nat_acc_lst *acc;
746 acc = bsc_nat_acc_lst_find(_nat, argv[0]);
747 if (!acc)
748 return CMD_WARNING;
749
750 vty_out(vty, "access-list %s%s", acc->name, VTY_NEWLINE);
751 vty_out_rate_ctr_group(vty, " ", acc->stats);
752
753 return CMD_SUCCESS;
754}
755
756
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800757DEFUN(cfg_bsc_acc_lst_name,
758 cfg_bsc_acc_lst_name_cmd,
759 "access-list-name NAME",
760 "Set the name of the access list to use.\n"
761 "The name of the to be used access list.")
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200762{
763 struct bsc_config *conf = vty->index;
764
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200765 bsc_replace_string(conf, &conf->acc_lst_name, argv[0]);
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200766 return CMD_SUCCESS;
767}
768
Holger Hans Peter Freyther6a7babd2011-03-29 17:14:34 +0200769DEFUN(cfg_bsc_no_acc_lst_name,
770 cfg_bsc_no_acc_lst_name_cmd,
771 "no access-list-name",
Holger Hans Peter Freythera64037c2011-04-13 20:58:14 +0200772 NO_STR "Do not use an access-list for the BSC.\n")
Holger Hans Peter Freyther6a7babd2011-03-29 17:14:34 +0200773{
774 struct bsc_config *conf = vty->index;
775
776 if (conf->acc_lst_name) {
777 talloc_free(conf->acc_lst_name);
778 conf->acc_lst_name = NULL;
779 }
780
781 return CMD_SUCCESS;
782}
783
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100784DEFUN(cfg_bsc_max_endps, cfg_bsc_max_endps_cmd,
785 "max-endpoints <1-1024>",
786 "Highest endpoint to use (exclusively)\n" "Number of ports\n")
Holger Hans Peter Freyther7b07b2d2011-02-25 20:38:15 +0100787{
788 struct bsc_config *conf = vty->index;
789
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100790 conf->max_endpoints = atoi(argv[0]);
Holger Hans Peter Freyther7b07b2d2011-02-25 20:38:15 +0100791 return CMD_SUCCESS;
792}
793
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800794DEFUN(cfg_bsc_paging,
795 cfg_bsc_paging_cmd,
796 "paging forbidden (0|1)",
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +0200797 PAGING_STR "Forbid sending PAGING REQUESTS to the BSC.")
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800798{
799 struct bsc_config *conf = vty->index;
800
Holger Hans Peter Freyther834f1df2010-04-21 20:07:07 +0800801 if (strcmp("1", argv[0]) == 0)
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800802 conf->forbid_paging = 1;
803 else
804 conf->forbid_paging = 0;
805
806 return CMD_SUCCESS;
807}
808
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800809DEFUN(cfg_bsc_desc,
810 cfg_bsc_desc_cmd,
811 "description DESC",
812 "Provide a description for the given BSC.")
813{
814 struct bsc_config *conf = vty->index;
815
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200816 bsc_replace_string(conf, &conf->description, argv[0]);
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800817 return CMD_SUCCESS;
818}
819
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200820DEFUN(cfg_bsc_paging_grp,
821 cfg_bsc_paging_grp_cmd,
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +0200822 "paging group <0-1000>",
823 PAGING_STR "Use a paging group\n" "Paging Group to use\n")
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200824{
825 struct bsc_config *conf = vty->index;
826 conf->paging_group = atoi(argv[0]);
827 return CMD_SUCCESS;
828}
829
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +0200830ALIAS_DEPRECATED(cfg_bsc_paging_grp, cfg_bsc_old_grp_cmd,
831 "paging-group <0-1000>",
832 "Use a paging group\n" "Paging Group to use\n")
833
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200834DEFUN(cfg_bsc_no_paging_grp,
835 cfg_bsc_no_paging_grp_cmd,
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +0200836 "no paging group",
837 NO_STR PAGING_STR "Disable the usage of a paging group.\n")
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200838{
839 struct bsc_config *conf = vty->index;
840 conf->paging_group = PAGIN_GROUP_UNASSIGNED;
841 return CMD_SUCCESS;
842}
843
Holger Hans Peter Freyther52c4ba02010-05-14 23:43:12 +0800844DEFUN(test_regex, test_regex_cmd,
845 "test regex PATTERN STRING",
846 "Check if the string is matching the current pattern.")
847{
848 regex_t reg;
849 char *str = NULL;
850
851 memset(&reg, 0, sizeof(reg));
Holger Hans Peter Freyther06c9da62011-06-09 21:48:49 +0200852 if (gsm_parse_reg(_nat, &reg, &str, 1, argv) != 0)
Holger Hans Peter Freyther4c9557e2011-04-04 19:19:26 +0200853 return CMD_WARNING;
Holger Hans Peter Freyther52c4ba02010-05-14 23:43:12 +0800854
855 vty_out(vty, "String matches allow pattern: %d%s",
856 regexec(&reg, argv[1], 0, NULL, 0) == 0, VTY_NEWLINE);
857
858 talloc_free(str);
859 regfree(&reg);
860 return CMD_SUCCESS;
861}
862
Holger Hans Peter Freytherdfdf8d92011-02-28 01:07:13 +0100863DEFUN(set_last_endp, set_last_endp_cmd,
864 "set bsc last-used-endpoint <0-9999999999> <0-1024>",
865 "Set a value\n" "Operate on a BSC\n"
866 "Last used endpoint for an assignment\n" "BSC configuration number\n"
867 "Endpoint number used\n")
868{
869 struct bsc_connection *con;
870 int nr = atoi(argv[0]);
871 int endp = atoi(argv[1]);
872
873
874 llist_for_each_entry(con, &_nat->bsc_connections, list_entry) {
875 if (!con->cfg)
876 continue;
877 if (con->cfg->nr != nr)
878 continue;
879
880 con->last_endpoint = endp;
881 vty_out(vty, "Updated the last endpoint for %d to %d.%s",
882 con->cfg->nr, con->last_endpoint, VTY_NEWLINE);
883 }
884
885 return CMD_SUCCESS;
886}
887
Holger Hans Peter Freytherde2b8602011-04-23 23:55:14 +0200888DEFUN(block_new_conn, block_new_conn_cmd,
889 "nat-block (block|unblock)",
890 "Block the NAT for new connections\n"
891 "Block\n" "Unblock\n")
892{
893 _nat->blocked = argv[0][0] == 'b';
894 vty_out(vty, "%%Going to %s the NAT.%s",
895 _nat->blocked ? "block" : "unblock", VTY_NEWLINE);
896 return CMD_SUCCESS;
897}
898
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200899/* paging group */
900DEFUN(cfg_nat_pgroup, cfg_nat_pgroup_cmd,
901 "paging-group <0-1000>",
902 "Create a Paging Group\n" "Number of the Group\n")
903{
904 int group = atoi(argv[0]);
905 struct bsc_nat_paging_group *pgroup;
906 pgroup = bsc_nat_paging_group_num(_nat, group);
907 if (!pgroup)
908 pgroup = bsc_nat_paging_group_create(_nat, group);
909 if (!pgroup) {
910 vty_out(vty, "Failed to create the group.%s", VTY_NEWLINE);
911 return CMD_WARNING;
912 }
913
914 vty->index = pgroup;
915 vty->node = PGROUP_NODE;
916 return CMD_SUCCESS;
917}
918
919DEFUN(cfg_nat_no_pgroup, cfg_nat_no_pgroup_cmd,
920 "no paging-group <0-1000>",
921 NO_STR "Delete paging-group\n")
922{
923 int group = atoi(argv[0]);
924 struct bsc_nat_paging_group *pgroup;
925 pgroup = bsc_nat_paging_group_num(_nat, group);
926 if (!pgroup) {
927 vty_out(vty, "No such paging group %d.%s", group, VTY_NEWLINE);
928 return CMD_WARNING;
929 }
930
931 bsc_nat_paging_group_delete(pgroup);
932 return CMD_SUCCESS;
933}
934
935DEFUN(cfg_pgroup_lac, cfg_pgroup_lac_cmd,
936 "location_area_code <0-65535>",
937 "Add the Location Area Code (LAC)\n" "LAC\n")
938{
939 struct bsc_nat_paging_group *pgroup = vty->index;
940
941 int lac = atoi(argv[0]);
942 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
943 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
944 lac, VTY_NEWLINE);
945 return CMD_WARNING;
946 }
947
948 bsc_nat_paging_group_add_lac(pgroup, lac);
949 return CMD_SUCCESS;
950}
951
952DEFUN(cfg_pgroup_no_lac, cfg_pgroup_no_lac_cmd,
953 "no location_area_code <0-65535>",
954 NO_STR "Remove the Location Area Code (LAC)\n" "LAC\n")
955{
956 int lac = atoi(argv[0]);
957 struct bsc_nat_paging_group *pgroup = vty->index;
958
959 bsc_nat_paging_group_del_lac(pgroup, lac);
960 return CMD_SUCCESS;
961}
962
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800963int bsc_nat_vty_init(struct bsc_nat *nat)
964{
965 _nat = nat;
966
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800967 /* show commands */
Holger Hans Peter Freyther1398f132010-06-15 20:14:08 +0800968 install_element_ve(&show_sccp_cmd);
969 install_element_ve(&show_bsc_cmd);
970 install_element_ve(&show_bsc_cfg_cmd);
971 install_element_ve(&show_stats_cmd);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800972 install_element_ve(&show_stats_lac_cmd);
Holger Hans Peter Freyther1398f132010-06-15 20:14:08 +0800973 install_element_ve(&close_bsc_cmd);
974 install_element_ve(&show_msc_cmd);
975 install_element_ve(&test_regex_cmd);
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800976 install_element_ve(&show_bsc_mgcp_cmd);
Holger Hans Peter Freyther520c1f12010-09-25 16:25:47 +0800977 install_element_ve(&show_acc_lst_cmd);
Holger Hans Peter Freyther5f291d52010-04-06 12:01:15 +0200978
Holger Hans Peter Freytherdfdf8d92011-02-28 01:07:13 +0100979 install_element(ENABLE_NODE, &set_last_endp_cmd);
Holger Hans Peter Freytherde2b8602011-04-23 23:55:14 +0200980 install_element(ENABLE_NODE, &block_new_conn_cmd);
Holger Hans Peter Freytherdfdf8d92011-02-28 01:07:13 +0100981
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800982 /* nat group */
983 install_element(CONFIG_NODE, &cfg_nat_cmd);
984 install_node(&nat_node, config_write_nat);
985 install_default(NAT_NODE);
Holger Hans Peter Freyther9c786972010-06-17 14:39:15 +0800986 install_element(NAT_NODE, &ournode_exit_cmd);
987 install_element(NAT_NODE, &ournode_end_cmd);
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800988 install_element(NAT_NODE, &cfg_nat_msc_ip_cmd);
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +0200989 install_element(NAT_NODE, &cfg_nat_msc_port_cmd);
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800990 install_element(NAT_NODE, &cfg_nat_auth_time_cmd);
991 install_element(NAT_NODE, &cfg_nat_ping_time_cmd);
992 install_element(NAT_NODE, &cfg_nat_pong_time_cmd);
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800993 install_element(NAT_NODE, &cfg_nat_token_cmd);
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800994 install_element(NAT_NODE, &cfg_nat_bsc_ip_dscp_cmd);
Holger Hans Peter Freyther078321a2010-05-31 10:36:35 +0800995 install_element(NAT_NODE, &cfg_nat_bsc_ip_tos_cmd);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800996 install_element(NAT_NODE, &cfg_nat_acc_lst_name_cmd);
Holger Hans Peter Freyther6a7babd2011-03-29 17:14:34 +0200997 install_element(NAT_NODE, &cfg_nat_no_acc_lst_name_cmd);
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200998 install_element(NAT_NODE, &cfg_nat_ussd_lst_name_cmd);
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200999 install_element(NAT_NODE, &cfg_nat_ussd_query_cmd);
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +02001000 install_element(NAT_NODE, &cfg_nat_ussd_token_cmd);
1001 install_element(NAT_NODE, &cfg_nat_ussd_local_cmd);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +08001002
1003 /* access-list */
1004 install_element(NAT_NODE, &cfg_lst_imsi_allow_cmd);
1005 install_element(NAT_NODE, &cfg_lst_imsi_deny_cmd);
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +08001006 install_element(NAT_NODE, &cfg_lst_no_cmd);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +08001007
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +02001008 /* number rewriting */
1009 install_element(NAT_NODE, &cfg_nat_number_rewrite_cmd);
Holger Hans Peter Freythere36b4872011-05-31 00:35:46 +02001010 install_element(NAT_NODE, &cfg_nat_smsc_addr_cmd);
1011 install_element(NAT_NODE, &cfg_nat_smsc_tpdest_cmd);
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +01001012 install_element(NAT_NODE, &cfg_nat_sms_clear_tpsrr_cmd);
1013 install_element(NAT_NODE, &cfg_nat_no_sms_clear_tpsrr_cmd);
Holger Hans Peter Freyther7d60bdb2012-01-18 20:40:01 +01001014 install_element(NAT_NODE, &cfg_nat_sms_number_rewrite_cmd);
1015 install_element(NAT_NODE, &cfg_nat_no_sms_number_rewrite_cmd);
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +02001016
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +02001017 install_element(NAT_NODE, &cfg_nat_pgroup_cmd);
1018 install_element(NAT_NODE, &cfg_nat_no_pgroup_cmd);
1019 install_node(&pgroup_node, config_write_pgroup);
1020 install_default(PGROUP_NODE);
1021 install_element(PGROUP_NODE, &cfg_pgroup_lac_cmd);
1022 install_element(PGROUP_NODE, &cfg_pgroup_no_lac_cmd);
1023
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +08001024 /* BSC subgroups */
1025 install_element(NAT_NODE, &cfg_bsc_cmd);
1026 install_node(&bsc_node, config_write_bsc);
Holger Hans Peter Freyther7b4a53d2010-06-17 14:42:20 +08001027 install_default(NAT_BSC_NODE);
1028 install_element(NAT_BSC_NODE, &ournode_exit_cmd);
1029 install_element(NAT_BSC_NODE, &ournode_end_cmd);
1030 install_element(NAT_BSC_NODE, &cfg_bsc_token_cmd);
1031 install_element(NAT_BSC_NODE, &cfg_bsc_lac_cmd);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +08001032 install_element(NAT_BSC_NODE, &cfg_bsc_no_lac_cmd);
Holger Hans Peter Freyther7b4a53d2010-06-17 14:42:20 +08001033 install_element(NAT_BSC_NODE, &cfg_bsc_paging_cmd);
1034 install_element(NAT_BSC_NODE, &cfg_bsc_desc_cmd);
1035 install_element(NAT_BSC_NODE, &cfg_bsc_acc_lst_name_cmd);
Holger Hans Peter Freyther6a7babd2011-03-29 17:14:34 +02001036 install_element(NAT_BSC_NODE, &cfg_bsc_no_acc_lst_name_cmd);
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +01001037 install_element(NAT_BSC_NODE, &cfg_bsc_max_endps_cmd);
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +02001038 install_element(NAT_BSC_NODE, &cfg_bsc_old_grp_cmd);
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +02001039 install_element(NAT_BSC_NODE, &cfg_bsc_paging_grp_cmd);
1040 install_element(NAT_BSC_NODE, &cfg_bsc_no_paging_grp_cmd);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +08001041
Holger Hans Peter Freytherf7d33352010-06-15 18:50:26 +08001042 mgcp_vty_init();
1043
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +08001044 return 0;
1045}
1046
1047
1048/* called by the telnet interface... we have our own init above */
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01001049int bsc_vty_init(const struct log_info *cat)
Holger Hans Peter Freyther6c79a682011-02-24 14:33:09 +01001050{
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01001051 logging_vty_add_cmds(cat);
Holger Hans Peter Freyther6c79a682011-02-24 14:33:09 +01001052 return 0;
1053}