blob: 220e9606cdd5b4d60f41d367e02c54fb20a33938 [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
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +020043#define BSC_STR "Information about BSCs\n"
44#define MGCP_STR "MGCP related status\n"
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +020045#define PAGING_STR "Paging\n"
Holger Hans Peter Freythere36b4872011-05-31 00:35:46 +020046#define SMSC_REWRITE "SMSC Rewriting\n"
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +020047
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080048static struct cmd_node nat_node = {
49 NAT_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020050 "%s(config-nat)# ",
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080051 1,
52};
53
54static struct cmd_node bsc_node = {
Holger Hans Peter Freyther7b4a53d2010-06-17 14:42:20 +080055 NAT_BSC_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020056 "%s(config-nat-bsc)# ",
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080057 1,
58};
59
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +020060static struct cmd_node pgroup_node = {
61 PGROUP_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020062 "%s(config-nat-paging-group)# ",
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +020063 1,
64};
65
66static int config_write_pgroup(struct vty *vty)
67{
68 return CMD_SUCCESS;
69}
70
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +080071static void write_acc_lst(struct vty *vty, struct bsc_nat_acc_lst *lst)
72{
73 struct bsc_nat_acc_lst_entry *entry;
74
75 llist_for_each_entry(entry, &lst->fltr_list, list) {
76 if (entry->imsi_allow)
77 vty_out(vty, " access-list %s imsi-allow %s%s",
78 lst->name, entry->imsi_allow, VTY_NEWLINE);
79 if (entry->imsi_deny)
80 vty_out(vty, " access-list %s imsi-deny %s%s",
81 lst->name, entry->imsi_deny, VTY_NEWLINE);
82 }
83}
84
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +020085static void dump_lac(struct vty *vty, struct llist_head *head)
86{
87 struct bsc_lac_entry *lac;
88 llist_for_each_entry(lac, head, entry)
89 vty_out(vty, " location_area_code %u%s", lac->lac, VTY_NEWLINE);
90}
91
92
93static void write_pgroup_lst(struct vty *vty, struct bsc_nat_paging_group *pgroup)
94{
95 vty_out(vty, " paging-group %d%s", pgroup->nr, VTY_NEWLINE);
96 dump_lac(vty, &pgroup->lists);
97}
98
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +080099static int config_write_nat(struct vty *vty)
100{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800101 struct bsc_nat_acc_lst *lst;
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200102 struct bsc_nat_paging_group *pgroup;
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800103
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800104 vty_out(vty, "nat%s", VTY_NEWLINE);
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200105 vty_out(vty, " msc ip %s%s", _nat->main_dest->ip, VTY_NEWLINE);
106 vty_out(vty, " msc port %d%s", _nat->main_dest->port, VTY_NEWLINE);
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800107 vty_out(vty, " timeout auth %d%s", _nat->auth_timeout, VTY_NEWLINE);
108 vty_out(vty, " timeout ping %d%s", _nat->ping_timeout, VTY_NEWLINE);
109 vty_out(vty, " timeout pong %d%s", _nat->pong_timeout, VTY_NEWLINE);
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800110 if (_nat->token)
111 vty_out(vty, " token %s%s", _nat->token, VTY_NEWLINE);
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800112 vty_out(vty, " ip-dscp %d%s", _nat->bsc_ip_dscp, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800113 if (_nat->acc_lst_name)
114 vty_out(vty, " access-list-name %s%s", _nat->acc_lst_name, VTY_NEWLINE);
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200115 if (_nat->ussd_lst_name)
116 vty_out(vty, " ussd-list-name %s%s", _nat->ussd_lst_name, VTY_NEWLINE);
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200117 if (_nat->ussd_query)
118 vty_out(vty, " ussd-query %s%s", _nat->ussd_query, VTY_NEWLINE);
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200119 if (_nat->ussd_token)
120 vty_out(vty, " ussd-token %s%s", _nat->ussd_token, VTY_NEWLINE);
121 if (_nat->ussd_local)
122 vty_out(vty, " ussd-local-ip %s%s", _nat->ussd_local, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800123
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200124 if (_nat->num_rewr_name)
125 vty_out(vty, " number-rewrite %s%s", _nat->num_rewr_name, VTY_NEWLINE);
Holger Hans Peter Freythere36b4872011-05-31 00:35:46 +0200126 if (_nat->smsc_rewr_name)
127 vty_out(vty, " rewrite-smsc addr %s%s",
128 _nat->smsc_rewr_name, VTY_NEWLINE);
129 if (_nat->tpdest_match_name)
130 vty_out(vty, " rewrite-smsc tp-dest-match %s%s",
131 _nat->tpdest_match_name, VTY_NEWLINE);
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +0100132 if (_nat->sms_clear_tp_srr_name)
133 vty_out(vty, " sms-clear-tp-srr %s%s",
134 _nat->sms_clear_tp_srr_name, VTY_NEWLINE);
Holger Hans Peter Freyther7d60bdb2012-01-18 20:40:01 +0100135 if (_nat->sms_num_rewr_name)
136 vty_out(vty, " sms-number-rewrite %s%s",
137 _nat->sms_num_rewr_name, VTY_NEWLINE);
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200138
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200139 llist_for_each_entry(lst, &_nat->access_lists, list)
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800140 write_acc_lst(vty, lst);
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200141 llist_for_each_entry(pgroup, &_nat->paging_groups, entry)
142 write_pgroup_lst(vty, pgroup);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800143
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800144 return CMD_SUCCESS;
145}
146
147static void config_write_bsc_single(struct vty *vty, struct bsc_config *bsc)
148{
149 vty_out(vty, " bsc %u%s", bsc->nr, VTY_NEWLINE);
150 vty_out(vty, " token %s%s", bsc->token, VTY_NEWLINE);
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200151 dump_lac(vty, &bsc->lac_list);
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800152 if (bsc->description)
153 vty_out(vty, " description %s%s", bsc->description, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800154 if (bsc->acc_lst_name)
Holger Hans Peter Freyther27d36de2010-06-08 11:18:26 +0800155 vty_out(vty, " access-list-name %s%s", bsc->acc_lst_name, VTY_NEWLINE);
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100156 vty_out(vty, " max-endpoints %d%s", bsc->max_endpoints, VTY_NEWLINE);
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200157 if (bsc->paging_group != -1)
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +0200158 vty_out(vty, " paging group %d%s", bsc->paging_group, VTY_NEWLINE);
159 vty_out(vty, " paging forbidden %d%s", bsc->forbid_paging, VTY_NEWLINE);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800160}
161
162static int config_write_bsc(struct vty *vty)
163{
164 struct bsc_config *bsc;
165
166 llist_for_each_entry(bsc, &_nat->bsc_configs, entry)
167 config_write_bsc_single(vty, bsc);
168 return CMD_SUCCESS;
169}
170
171
Holger Hans Peter Freyther01a0b1b2010-04-19 16:06:43 +0800172DEFUN(show_sccp, show_sccp_cmd, "show sccp connections",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200173 SHOW_STR "Display information about SCCP\n"
174 "All active connections\n")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800175{
176 struct sccp_connections *con;
Holger Hans Peter Freyther85804a82010-09-15 19:01:31 +0800177 vty_out(vty, "Listing all open SCCP connections%s", VTY_NEWLINE);
Holger Hans Peter Freyther4bd22942010-04-27 13:11:18 +0800178
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800179 llist_for_each_entry(con, &_nat->sccp_connections, list_entry) {
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800180 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 +0200181 con->bsc->cfg ? con->bsc->cfg->nr : -1,
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800182 sccp_src_ref_to_int(&con->real_ref),
Holger Hans Peter Freyther32d34362010-04-05 10:10:33 +0200183 sccp_src_ref_to_int(&con->patched_ref),
Holger Hans Peter Freyther4bd22942010-04-27 13:11:18 +0800184 con->has_remote_ref,
185 sccp_src_ref_to_int(&con->remote_ref),
Holger Hans Peter Freytherf4b34392010-08-28 16:08:39 +0800186 con->msc_endp, con->bsc_endp,
Holger Hans Peter Freyther234d3122010-05-16 02:06:11 +0800187 bsc_con_type_to_string(con->con_type),
Holger Hans Peter Freyther32d34362010-04-05 10:10:33 +0200188 VTY_NEWLINE);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800189 }
190
191 return CMD_SUCCESS;
192}
193
Holger Hans Peter Freyther01a0b1b2010-04-19 16:06:43 +0800194DEFUN(show_bsc, show_bsc_cmd, "show bsc connections",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200195 SHOW_STR BSC_STR
196 "All active connections\n")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800197{
198 struct bsc_connection *con;
Holger Hans Peter Freyther870663a2010-04-08 10:35:20 +0200199 struct sockaddr_in sock;
200 socklen_t len = sizeof(sock);
201
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800202 llist_for_each_entry(con, &_nat->bsc_connections, list_entry) {
Holger Hans Peter Freyther870663a2010-04-08 10:35:20 +0200203 getpeername(con->write_queue.bfd.fd, (struct sockaddr *) &sock, &len);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800204 vty_out(vty, "BSC nr: %d auth: %d fd: %d peername: %s%s",
Holger Hans Peter Freyther47dd4942010-04-06 15:11:34 +0200205 con->cfg ? con->cfg->nr : -1,
Holger Hans Peter Freyther870663a2010-04-08 10:35:20 +0200206 con->authenticated, con->write_queue.bfd.fd,
207 inet_ntoa(sock.sin_addr), VTY_NEWLINE);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800208 }
209
210 return CMD_SUCCESS;
211}
212
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800213DEFUN(show_bsc_mgcp, show_bsc_mgcp_cmd, "show bsc mgcp NR",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200214 SHOW_STR BSC_STR MGCP_STR "Identifier of the BSC\n")
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800215{
216 struct bsc_connection *con;
217 int nr = atoi(argv[0]);
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100218 int i, j, endp;
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800219
220 llist_for_each_entry(con, &_nat->bsc_connections, list_entry) {
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100221 int max;
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800222 if (!con->cfg)
223 continue;
224 if (con->cfg->nr != nr)
225 continue;
226
Holger Hans Peter Freythered500e32011-02-25 17:09:07 +0100227 /* this bsc has no audio endpoints yet */
228 if (!con->_endpoint_status)
229 continue;
230
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800231 vty_out(vty, "MGCP Status for %d%s", con->cfg->nr, VTY_NEWLINE);
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100232 max = bsc_mgcp_nr_multiplexes(con->max_endpoints);
233 for (i = 0; i < max; ++i) {
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100234 for (j = 0; j < 32; ++j) {
235 endp = mgcp_timeslot_to_endpoint(i, j);
236 vty_out(vty, " Endpoint 0x%x %s%s", endp,
237 con->_endpoint_status[endp] == 0
238 ? "free" : "allocated",
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800239 VTY_NEWLINE);
Holger Hans Peter Freythera9e93312011-02-26 11:38:00 +0100240 }
241 }
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +0800242 break;
243 }
244
245 return CMD_SUCCESS;
246}
247
Holger Hans Peter Freytherab7539c2010-04-22 13:36:46 +0800248DEFUN(show_bsc_cfg, show_bsc_cfg_cmd, "show bsc config",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200249 SHOW_STR BSC_STR "Configuration of BSCs\n")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800250{
251 struct bsc_config *conf;
252 llist_for_each_entry(conf, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800253 vty_out(vty, "BSC token: '%s' nr: %u%s",
254 conf->token, conf->nr, VTY_NEWLINE);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800255 if (conf->acc_lst_name)
256 vty_out(vty, " access-list: %s%s",
257 conf->acc_lst_name, VTY_NEWLINE);
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800258 vty_out(vty, " paging forbidden: %d%s",
259 conf->forbid_paging, VTY_NEWLINE);
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800260 if (conf->description)
261 vty_out(vty, " description: %s%s", conf->description, VTY_NEWLINE);
262 else
263 vty_out(vty, " No description.%s", VTY_NEWLINE);
264
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800265 }
266
267 return CMD_SUCCESS;
268}
269
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800270static void dump_stat_total(struct vty *vty, struct bsc_nat *nat)
271{
272 vty_out(vty, "NAT statistics%s", VTY_NEWLINE);
273 vty_out(vty, " SCCP Connections %lu total, %lu calls%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +0200274 osmo_counter_get(nat->stats.sccp.conn),
275 osmo_counter_get(nat->stats.sccp.calls), VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800276 vty_out(vty, " MSC Connections %lu%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +0200277 osmo_counter_get(nat->stats.msc.reconn), VTY_NEWLINE);
Holger Hans Peter Freythercbfd0982010-08-04 02:34:10 +0800278 vty_out(vty, " MSC Connected: %d%s",
279 nat->msc_con->is_connected, VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800280 vty_out(vty, " BSC Connections %lu total, %lu auth failed.%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +0200281 osmo_counter_get(nat->stats.bsc.reconn),
282 osmo_counter_get(nat->stats.bsc.auth_fail), VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800283}
284
285static void dump_stat_bsc(struct vty *vty, struct bsc_config *conf)
286{
Holger Hans Peter Freytherf21e4532010-07-22 20:37:35 +0800287 int connected = 0;
288 struct bsc_connection *con;
289
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800290 vty_out(vty, " BSC nr: %d%s",
291 conf->nr, VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800292 vty_out_rate_ctr_group(vty, " ", conf->stats.ctrg);
Holger Hans Peter Freytherf21e4532010-07-22 20:37:35 +0800293
294 llist_for_each_entry(con, &conf->nat->bsc_connections, list_entry) {
295 if (con->cfg != conf)
296 continue;
297 connected = 1;
298 break;
299 }
300
Holger Hans Peter Freyther03a0ad02010-08-04 02:29:03 +0800301 vty_out(vty, " Connected: %d%s", connected, VTY_NEWLINE);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800302}
303
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200304DEFUN(show_stats,
305 show_stats_cmd,
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800306 "show statistics [NR]",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200307 SHOW_STR "Display network statistics\n"
308 "Number of the BSC\n")
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200309{
310 struct bsc_config *conf;
311
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800312 int nr = -1;
313
314 if (argc == 1)
315 nr = atoi(argv[0]);
316
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800317 dump_stat_total(vty, _nat);
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200318 llist_for_each_entry(conf, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800319 if (argc == 1 && nr != conf->nr)
320 continue;
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800321 dump_stat_bsc(vty, conf);
322 }
Holger Hans Peter Freyther314191d2010-05-02 18:59:24 +0800323
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800324 return CMD_SUCCESS;
325}
326
327DEFUN(show_stats_lac,
328 show_stats_lac_cmd,
329 "show statistics-by-lac <0-65535>",
330 SHOW_STR "Display network statistics by lac\n"
331 "The lac of the BSC\n")
332{
333 int lac;
334 struct bsc_config *conf;
335
336 lac = atoi(argv[0]);
337
338 dump_stat_total(vty, _nat);
339 llist_for_each_entry(conf, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800340 if (!bsc_config_handles_lac(conf, lac))
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800341 continue;
342 dump_stat_bsc(vty, conf);
Holger Hans Peter Freytherbcfebb22010-04-12 12:33:27 +0200343 }
344
345 return CMD_SUCCESS;
346}
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800347
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +0800348DEFUN(show_msc,
349 show_msc_cmd,
350 "show msc connection",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200351 SHOW_STR "MSC related information\n"
352 "Status of the A-link connection\n")
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +0800353{
354 if (!_nat->msc_con) {
355 vty_out(vty, "The MSC is not yet configured.\n");
356 return CMD_WARNING;
357 }
358
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200359 vty_out(vty, "MSC is connected: %d%s\n",
Holger Hans Peter Freytheraad82ce2010-05-11 19:07:39 +0800360 _nat->msc_con->is_connected, VTY_NEWLINE);
361 return CMD_SUCCESS;
362}
363
Holger Hans Peter Freyther2f9dcf02010-04-27 13:21:39 +0800364DEFUN(close_bsc,
365 close_bsc_cmd,
366 "close bsc connection BSC_NR",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200367 "Close\n" "A-link\n" "Connection\n" "Identifier of the BSC\n")
Holger Hans Peter Freyther2f9dcf02010-04-27 13:21:39 +0800368{
369 struct bsc_connection *bsc;
370 int bsc_nr = atoi(argv[0]);
371
372 llist_for_each_entry(bsc, &_nat->bsc_connections, list_entry) {
373 if (!bsc->cfg || bsc->cfg->nr != bsc_nr)
374 continue;
375 bsc_close_connection(bsc);
376 break;
377 }
378
379 return CMD_SUCCESS;
380}
381
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800382DEFUN(cfg_nat, cfg_nat_cmd, "nat", "Configute the NAT")
383{
384 vty->index = _nat;
385 vty->node = NAT_NODE;
386
387 return CMD_SUCCESS;
388}
389
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800390DEFUN(cfg_nat_msc_ip,
391 cfg_nat_msc_ip_cmd,
Holger Hans Peter Freytherd8b82062010-05-14 02:36:42 +0800392 "msc ip A.B.C.D",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200393 "MSC related configuration\n"
394 "Configure the IP address\n" IP_STR)
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +0800395{
396 bsc_nat_set_msc_ip(_nat, argv[0]);
397 return CMD_SUCCESS;
398}
399
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +0200400DEFUN(cfg_nat_msc_port,
401 cfg_nat_msc_port_cmd,
402 "msc port <1-65500>",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200403 "MSC related configuration\n"
404 "Configure the port\n"
405 "Port number\n")
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +0200406{
Holger Hans Peter Freythere18801052011-04-23 23:31:31 +0200407 _nat->main_dest->port = atoi(argv[0]);
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +0200408 return CMD_SUCCESS;
409}
410
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800411DEFUN(cfg_nat_auth_time,
412 cfg_nat_auth_time_cmd,
413 "timeout auth <1-256>",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200414 "Timeout configuration\n"
415 "Authentication timeout\n"
416 "Timeout in seconds\n")
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800417{
418 _nat->auth_timeout = atoi(argv[0]);
419 return CMD_SUCCESS;
420}
421
422DEFUN(cfg_nat_ping_time,
423 cfg_nat_ping_time_cmd,
424 "timeout ping NR",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200425 "Timeout configuration\n"
426 "Time between two pings\n"
427 "Timeout in seconds\n")
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800428{
429 _nat->ping_timeout = atoi(argv[0]);
430 return CMD_SUCCESS;
431}
432
433DEFUN(cfg_nat_pong_time,
434 cfg_nat_pong_time_cmd,
435 "timeout pong NR",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200436 "Timeout configuration\n"
437 "Waiting for pong timeout\n"
438 "Timeout in seconds\n")
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +0800439{
440 _nat->pong_timeout = atoi(argv[0]);
441 return CMD_SUCCESS;
442}
443
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800444DEFUN(cfg_nat_token, cfg_nat_token_cmd,
445 "token TOKEN",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200446 "Authentication token configuration\n"
447 "Token of the BSC, currently transferred in cleartext\n")
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800448{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200449 bsc_replace_string(_nat, &_nat->token, argv[0]);
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +0800450 return CMD_SUCCESS;
451}
452
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800453DEFUN(cfg_nat_bsc_ip_dscp, cfg_nat_bsc_ip_dscp_cmd,
454 "ip-dscp <0-255>",
455 "Set the IP DSCP for the BSCs to use\n" "Set the IP_TOS attribute")
Holger Hans Peter Freyther078321a2010-05-31 10:36:35 +0800456{
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800457 _nat->bsc_ip_dscp = atoi(argv[0]);
Holger Hans Peter Freyther078321a2010-05-31 10:36:35 +0800458 return CMD_SUCCESS;
459}
460
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +0800461ALIAS_DEPRECATED(cfg_nat_bsc_ip_dscp, cfg_nat_bsc_ip_tos_cmd,
462 "ip-tos <0-255>",
463 "Use ip-dscp in the future.\n" "Set the DSCP\n")
464
465
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800466DEFUN(cfg_nat_acc_lst_name,
467 cfg_nat_acc_lst_name_cmd,
468 "access-list-name NAME",
469 "Set the name of the access list to use.\n"
470 "The name of the to be used access list.")
471{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200472 bsc_replace_string(_nat, &_nat->acc_lst_name, argv[0]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800473 return CMD_SUCCESS;
474}
475
Holger Hans Peter Freyther6a7babd2011-03-29 17:14:34 +0200476DEFUN(cfg_nat_no_acc_lst_name,
477 cfg_nat_no_acc_lst_name_cmd,
478 "no access-list-name",
479 NO_STR "Remove the access list from the NAT.\n")
480{
481 if (_nat->acc_lst_name) {
482 talloc_free(_nat->acc_lst_name);
483 _nat->acc_lst_name = NULL;
484 }
485
Holger Hans Peter Freyther9e7e55f2011-04-01 16:22:51 +0200486 return CMD_SUCCESS;
Holger Hans Peter Freyther6a7babd2011-03-29 17:14:34 +0200487}
488
Holger Hans Peter Freythere36b4872011-05-31 00:35:46 +0200489static int replace_rules(struct bsc_nat *nat, char **name,
490 struct llist_head *head, const char *file)
491{
492 struct osmo_config_list *rewr = NULL;
493
494 bsc_replace_string(nat, name, file);
495 if (*name) {
496 rewr = osmo_config_list_parse(nat, *name);
497 bsc_nat_num_rewr_entry_adapt(nat, head, rewr);
498 talloc_free(rewr);
499 return CMD_SUCCESS;
500 } else {
501 bsc_nat_num_rewr_entry_adapt(nat, head, NULL);
502 return CMD_SUCCESS;
503 }
504}
505
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200506DEFUN(cfg_nat_number_rewrite,
507 cfg_nat_number_rewrite_cmd,
508 "number-rewrite FILENAME",
509 "Set the file with rewriting rules.\n" "Filename")
510{
Holger Hans Peter Freythere36b4872011-05-31 00:35:46 +0200511 return replace_rules(_nat, &_nat->num_rewr_name,
512 &_nat->num_rewr, argv[0]);
513}
Holger Hans Peter Freytherad75eab2011-05-27 12:38:58 +0200514
Holger Hans Peter Freythere36b4872011-05-31 00:35:46 +0200515DEFUN(cfg_nat_smsc_addr,
516 cfg_nat_smsc_addr_cmd,
517 "rewrite-smsc addr FILENAME",
518 SMSC_REWRITE
519 "The SMSC Address to match and replace in RP-DATA\n"
520 "File with rules for the SMSC Address replacing\n")
521{
522 return replace_rules(_nat, &_nat->smsc_rewr_name,
523 &_nat->smsc_rewr, argv[0]);
524}
525
526DEFUN(cfg_nat_smsc_tpdest,
527 cfg_nat_smsc_tpdest_cmd,
528 "rewrite-smsc tp-dest-match FILENAME",
529 SMSC_REWRITE
530 "Match TP-Destination of a SMS.\n"
531 "File with rules for matching MSISDN and TP-DEST\n")
532{
533 return replace_rules(_nat, &_nat->tpdest_match_name,
534 &_nat->tpdest_match, argv[0]);
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +0200535}
536
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +0100537DEFUN(cfg_nat_sms_clear_tpsrr,
538 cfg_nat_sms_clear_tpsrr_cmd,
539 "sms-clear-tp-srr FILENAME",
540 "SMS TPDU Sender Report Request clearing\n"
541 "Files with rules for matching MSISDN\n")
542{
543 return replace_rules(_nat, &_nat->sms_clear_tp_srr_name,
544 &_nat->sms_clear_tp_srr, argv[0]);
545}
546
547DEFUN(cfg_nat_no_sms_clear_tpsrr,
548 cfg_nat_no_sms_clear_tpsrr_cmd,
Holger Hans Peter Freyther27188452012-01-18 20:34:08 +0100549 "no sms-clear-tp-srr",
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +0100550 NO_STR
551 "SMS TPDU Sender Report Request clearing\n")
552{
553 talloc_free(_nat->sms_clear_tp_srr_name);
554 _nat->sms_clear_tp_srr_name = NULL;
555
556 bsc_nat_num_rewr_entry_adapt(NULL, &_nat->sms_clear_tp_srr, NULL);
557 return CMD_SUCCESS;
558}
559
Holger Hans Peter Freyther7d60bdb2012-01-18 20:40:01 +0100560DEFUN(cfg_nat_sms_number_rewrite,
561 cfg_nat_sms_number_rewrite_cmd,
562 "sms-number-rewrite FILENAME",
563 "SMS TP-DA Number rewriting\n"
564 "Files with rules for matching MSISDN\n")
565{
566 return replace_rules(_nat, &_nat->sms_num_rewr_name,
567 &_nat->sms_num_rewr, argv[0]);
568}
569
570DEFUN(cfg_nat_no_sms_number_rewrite,
571 cfg_nat_no_sms_number_rewrite_cmd,
572 "no sms-number-rewrite",
573 NO_STR "Disable SMS TP-DA rewriting\n")
574{
575 talloc_free(_nat->sms_num_rewr_name);
576 _nat->sms_num_rewr_name = NULL;
577
578 bsc_nat_num_rewr_entry_adapt(NULL, &_nat->sms_num_rewr, NULL);
579 return CMD_SUCCESS;
580}
581
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200582DEFUN(cfg_nat_ussd_lst_name,
583 cfg_nat_ussd_lst_name_cmd,
584 "ussd-list-name NAME",
585 "Set the name of the access list to check for IMSIs for USSD message\n"
586 "The name of the access list for HLR USSD handling")
587{
Holger Hans Peter Freyther64b12922010-10-12 21:31:02 +0200588 bsc_replace_string(_nat, &_nat->ussd_lst_name, argv[0]);
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +0200589 return CMD_SUCCESS;
590}
591
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200592DEFUN(cfg_nat_ussd_query,
593 cfg_nat_ussd_query_cmd,
Holger Hans Peter Freythera18b1162011-04-01 17:32:21 +0200594 "ussd-query REGEXP",
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200595 "Set the USSD query to match with the ussd-list-name\n"
596 "The query to match")
597{
Holger Hans Peter Freyther06c9da62011-06-09 21:48:49 +0200598 if (gsm_parse_reg(_nat, &_nat->ussd_query_re, &_nat->ussd_query, argc, argv) != 0)
Holger Hans Peter Freyther4c9557e2011-04-04 19:19:26 +0200599 return CMD_WARNING;
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +0200600 return CMD_SUCCESS;
601}
602
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200603DEFUN(cfg_nat_ussd_token,
604 cfg_nat_ussd_token_cmd,
605 "ussd-token TOKEN",
606 "Set the token used to identify the USSD module\n" "Secret key\n")
607{
Holger Hans Peter Freyther64b12922010-10-12 21:31:02 +0200608 bsc_replace_string(_nat, &_nat->ussd_token, argv[0]);
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200609 return CMD_SUCCESS;
610}
611
612DEFUN(cfg_nat_ussd_local,
613 cfg_nat_ussd_local_cmd,
614 "ussd-local-ip A.B.C.D",
615 "Set the IP to listen for the USSD Provider\n" "IP Address\n")
616{
Holger Hans Peter Freyther64b12922010-10-12 21:31:02 +0200617 bsc_replace_string(_nat, &_nat->ussd_local, argv[0]);
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +0200618 return CMD_SUCCESS;
619}
620
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800621/* per BSC configuration */
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200622DEFUN(cfg_bsc, cfg_bsc_cmd, "bsc BSC_NR",
623 "BSC configuration\n" "Identifier of the BSC\n")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800624{
625 int bsc_nr = atoi(argv[0]);
626 struct bsc_config *bsc;
627
628 if (bsc_nr > _nat->num_bsc) {
629 vty_out(vty, "%% The next unused BSC number is %u%s",
630 _nat->num_bsc, VTY_NEWLINE);
631 return CMD_WARNING;
632 } else if (bsc_nr == _nat->num_bsc) {
633 /* allocate a new one */
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800634 bsc = bsc_config_alloc(_nat, "unknown");
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800635 } else
636 bsc = bsc_config_num(_nat, bsc_nr);
637
638 if (!bsc)
639 return CMD_WARNING;
640
641 vty->index = bsc;
Holger Hans Peter Freyther7b4a53d2010-06-17 14:42:20 +0800642 vty->node = NAT_BSC_NODE;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800643
644 return CMD_SUCCESS;
645}
646
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200647DEFUN(cfg_bsc_token, cfg_bsc_token_cmd, "token TOKEN",
648 "Authentication token configuration\n"
649 "Token of the BSC, currently transferred in cleartext\n")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800650{
651 struct bsc_config *conf = vty->index;
652
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200653 bsc_replace_string(conf, &conf->token, argv[0]);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800654 return CMD_SUCCESS;
655}
656
657DEFUN(cfg_bsc_lac, cfg_bsc_lac_cmd, "location_area_code <0-65535>",
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200658 "Add the Location Area Code (LAC) of this BSC\n" "LAC\n")
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800659{
Holger Hans Peter Freyther39ee8772010-03-30 06:08:56 +0200660 struct bsc_config *tmp;
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800661 struct bsc_config *conf = vty->index;
662
663 int lac = atoi(argv[0]);
664
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800665 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
666 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
667 lac, VTY_NEWLINE);
668 return CMD_WARNING;
669 }
670
Holger Hans Peter Freyther39ee8772010-03-30 06:08:56 +0200671 /* verify that the LACs are unique */
672 llist_for_each_entry(tmp, &_nat->bsc_configs, entry) {
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800673 if (bsc_config_handles_lac(tmp, lac)) {
Holger Hans Peter Freyther39ee8772010-03-30 06:08:56 +0200674 vty_out(vty, "%% LAC %d is already used.%s", lac, VTY_NEWLINE);
675 return CMD_ERR_INCOMPLETE;
676 }
677 }
678
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800679 bsc_config_add_lac(conf, lac);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800680
681 return CMD_SUCCESS;
682}
683
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800684DEFUN(cfg_bsc_no_lac, cfg_bsc_no_lac_cmd,
685 "no location_area_code <0-65535>",
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200686 NO_STR "Remove the Location Area Code (LAC) of this BSC\n" "LAC\n")
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +0800687{
688 int lac = atoi(argv[0]);
689 struct bsc_config *conf = vty->index;
690
691 bsc_config_del_lac(conf, lac);
692 return CMD_SUCCESS;
693}
694
695
696
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800697DEFUN(cfg_lst_imsi_allow,
698 cfg_lst_imsi_allow_cmd,
699 "access-list NAME imsi-allow [REGEXP]",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200700 "Access list commands\n"
701 "Name of the access list\n"
702 "Add allowed IMSI to the list\n"
703 "Regexp for IMSIs\n")
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200704{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800705 struct bsc_nat_acc_lst *acc;
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800706 struct bsc_nat_acc_lst_entry *entry;
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200707
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800708 acc = bsc_nat_acc_lst_get(_nat, argv[0]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800709 if (!acc)
710 return CMD_WARNING;
711
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800712 entry = bsc_nat_acc_lst_entry_create(acc);
713 if (!entry)
714 return CMD_WARNING;
715
Holger Hans Peter Freyther06c9da62011-06-09 21:48:49 +0200716 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 +0200717 return CMD_WARNING;
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200718 return CMD_SUCCESS;
719}
720
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800721DEFUN(cfg_lst_imsi_deny,
722 cfg_lst_imsi_deny_cmd,
723 "access-list NAME imsi-deny [REGEXP]",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200724 "Access list commands\n"
725 "Name of the access list\n"
726 "Add denied IMSI to the list\n"
727 "Regexp for IMSIs\n")
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800728{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800729 struct bsc_nat_acc_lst *acc;
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800730 struct bsc_nat_acc_lst_entry *entry;
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800731
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800732 acc = bsc_nat_acc_lst_get(_nat, argv[0]);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800733 if (!acc)
734 return CMD_WARNING;
735
Holger Hans Peter Freytherd77c8172010-06-08 10:53:39 +0800736 entry = bsc_nat_acc_lst_entry_create(acc);
737 if (!entry)
738 return CMD_WARNING;
739
Holger Hans Peter Freyther06c9da62011-06-09 21:48:49 +0200740 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 +0200741 return CMD_WARNING;
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800742 return CMD_SUCCESS;
743}
744
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800745/* naming to follow Zebra... */
746DEFUN(cfg_lst_no,
747 cfg_lst_no_cmd,
748 "no access-list NAME",
749 NO_STR "Remove an access-list by name\n"
750 "The access-list to remove\n")
751{
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800752 struct bsc_nat_acc_lst *acc;
753 acc = bsc_nat_acc_lst_find(_nat, argv[0]);
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800754 if (!acc)
755 return CMD_WARNING;
756
Holger Hans Peter Freyther29c67032010-06-08 10:14:44 +0800757 bsc_nat_acc_lst_delete(acc);
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +0800758 return CMD_SUCCESS;
759}
760
Holger Hans Peter Freyther520c1f12010-09-25 16:25:47 +0800761DEFUN(show_acc_lst,
762 show_acc_lst_cmd,
763 "show access-list NAME",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200764 SHOW_STR "IMSI access list\n" "Name of the access list\n")
Holger Hans Peter Freyther520c1f12010-09-25 16:25:47 +0800765{
766 struct bsc_nat_acc_lst *acc;
767 acc = bsc_nat_acc_lst_find(_nat, argv[0]);
768 if (!acc)
769 return CMD_WARNING;
770
771 vty_out(vty, "access-list %s%s", acc->name, VTY_NEWLINE);
772 vty_out_rate_ctr_group(vty, " ", acc->stats);
773
774 return CMD_SUCCESS;
775}
776
777
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +0800778DEFUN(cfg_bsc_acc_lst_name,
779 cfg_bsc_acc_lst_name_cmd,
780 "access-list-name NAME",
781 "Set the name of the access list to use.\n"
782 "The name of the to be used access list.")
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200783{
784 struct bsc_config *conf = vty->index;
785
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200786 bsc_replace_string(conf, &conf->acc_lst_name, argv[0]);
Holger Hans Peter Freytherc16cf272010-04-13 09:24:37 +0200787 return CMD_SUCCESS;
788}
789
Holger Hans Peter Freyther6a7babd2011-03-29 17:14:34 +0200790DEFUN(cfg_bsc_no_acc_lst_name,
791 cfg_bsc_no_acc_lst_name_cmd,
792 "no access-list-name",
Holger Hans Peter Freythera64037c2011-04-13 20:58:14 +0200793 NO_STR "Do not use an access-list for the BSC.\n")
Holger Hans Peter Freyther6a7babd2011-03-29 17:14:34 +0200794{
795 struct bsc_config *conf = vty->index;
796
797 if (conf->acc_lst_name) {
798 talloc_free(conf->acc_lst_name);
799 conf->acc_lst_name = NULL;
800 }
801
802 return CMD_SUCCESS;
803}
804
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100805DEFUN(cfg_bsc_max_endps, cfg_bsc_max_endps_cmd,
806 "max-endpoints <1-1024>",
807 "Highest endpoint to use (exclusively)\n" "Number of ports\n")
Holger Hans Peter Freyther7b07b2d2011-02-25 20:38:15 +0100808{
809 struct bsc_config *conf = vty->index;
810
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +0100811 conf->max_endpoints = atoi(argv[0]);
Holger Hans Peter Freyther7b07b2d2011-02-25 20:38:15 +0100812 return CMD_SUCCESS;
813}
814
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800815DEFUN(cfg_bsc_paging,
816 cfg_bsc_paging_cmd,
817 "paging forbidden (0|1)",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200818 PAGING_STR "Forbid sending PAGING REQUESTS to the BSC.\n"
819 "Do not forbid\n" "Forbid\n")
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800820{
821 struct bsc_config *conf = vty->index;
822
Holger Hans Peter Freyther834f1df2010-04-21 20:07:07 +0800823 if (strcmp("1", argv[0]) == 0)
Holger Hans Peter Freyther62e58432010-04-21 19:05:14 +0800824 conf->forbid_paging = 1;
825 else
826 conf->forbid_paging = 0;
827
828 return CMD_SUCCESS;
829}
830
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800831DEFUN(cfg_bsc_desc,
832 cfg_bsc_desc_cmd,
833 "description DESC",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200834 "Provide a description for the given BSC.\n" "Description\n")
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800835{
836 struct bsc_config *conf = vty->index;
837
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200838 bsc_replace_string(conf, &conf->description, argv[0]);
Holger Hans Peter Freytherb6061012010-05-14 22:06:28 +0800839 return CMD_SUCCESS;
840}
841
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200842DEFUN(cfg_bsc_paging_grp,
843 cfg_bsc_paging_grp_cmd,
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +0200844 "paging group <0-1000>",
845 PAGING_STR "Use a paging group\n" "Paging Group to use\n")
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200846{
847 struct bsc_config *conf = vty->index;
848 conf->paging_group = atoi(argv[0]);
849 return CMD_SUCCESS;
850}
851
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +0200852ALIAS_DEPRECATED(cfg_bsc_paging_grp, cfg_bsc_old_grp_cmd,
853 "paging-group <0-1000>",
854 "Use a paging group\n" "Paging Group to use\n")
855
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200856DEFUN(cfg_bsc_no_paging_grp,
857 cfg_bsc_no_paging_grp_cmd,
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +0200858 "no paging group",
859 NO_STR PAGING_STR "Disable the usage of a paging group.\n")
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200860{
861 struct bsc_config *conf = vty->index;
862 conf->paging_group = PAGIN_GROUP_UNASSIGNED;
863 return CMD_SUCCESS;
864}
865
Holger Hans Peter Freyther52c4ba02010-05-14 23:43:12 +0800866DEFUN(test_regex, test_regex_cmd,
867 "test regex PATTERN STRING",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200868 "Test utilities\n"
869 "Regexp testing\n" "The regexp pattern\n"
870 "The string to match\n")
Holger Hans Peter Freyther52c4ba02010-05-14 23:43:12 +0800871{
872 regex_t reg;
873 char *str = NULL;
874
875 memset(&reg, 0, sizeof(reg));
Holger Hans Peter Freyther06c9da62011-06-09 21:48:49 +0200876 if (gsm_parse_reg(_nat, &reg, &str, 1, argv) != 0)
Holger Hans Peter Freyther4c9557e2011-04-04 19:19:26 +0200877 return CMD_WARNING;
Holger Hans Peter Freyther52c4ba02010-05-14 23:43:12 +0800878
879 vty_out(vty, "String matches allow pattern: %d%s",
880 regexec(&reg, argv[1], 0, NULL, 0) == 0, VTY_NEWLINE);
881
882 talloc_free(str);
883 regfree(&reg);
884 return CMD_SUCCESS;
885}
886
Holger Hans Peter Freytherdfdf8d92011-02-28 01:07:13 +0100887DEFUN(set_last_endp, set_last_endp_cmd,
888 "set bsc last-used-endpoint <0-9999999999> <0-1024>",
889 "Set a value\n" "Operate on a BSC\n"
890 "Last used endpoint for an assignment\n" "BSC configuration number\n"
891 "Endpoint number used\n")
892{
893 struct bsc_connection *con;
894 int nr = atoi(argv[0]);
895 int endp = atoi(argv[1]);
896
897
898 llist_for_each_entry(con, &_nat->bsc_connections, list_entry) {
899 if (!con->cfg)
900 continue;
901 if (con->cfg->nr != nr)
902 continue;
903
904 con->last_endpoint = endp;
905 vty_out(vty, "Updated the last endpoint for %d to %d.%s",
906 con->cfg->nr, con->last_endpoint, VTY_NEWLINE);
907 }
908
909 return CMD_SUCCESS;
910}
911
Holger Hans Peter Freytherde2b8602011-04-23 23:55:14 +0200912DEFUN(block_new_conn, block_new_conn_cmd,
913 "nat-block (block|unblock)",
914 "Block the NAT for new connections\n"
915 "Block\n" "Unblock\n")
916{
917 _nat->blocked = argv[0][0] == 'b';
918 vty_out(vty, "%%Going to %s the NAT.%s",
919 _nat->blocked ? "block" : "unblock", VTY_NEWLINE);
920 return CMD_SUCCESS;
921}
922
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200923/* paging group */
924DEFUN(cfg_nat_pgroup, cfg_nat_pgroup_cmd,
925 "paging-group <0-1000>",
926 "Create a Paging Group\n" "Number of the Group\n")
927{
928 int group = atoi(argv[0]);
929 struct bsc_nat_paging_group *pgroup;
930 pgroup = bsc_nat_paging_group_num(_nat, group);
931 if (!pgroup)
932 pgroup = bsc_nat_paging_group_create(_nat, group);
933 if (!pgroup) {
934 vty_out(vty, "Failed to create the group.%s", VTY_NEWLINE);
935 return CMD_WARNING;
936 }
937
938 vty->index = pgroup;
939 vty->node = PGROUP_NODE;
940 return CMD_SUCCESS;
941}
942
943DEFUN(cfg_nat_no_pgroup, cfg_nat_no_pgroup_cmd,
944 "no paging-group <0-1000>",
Holger Hans Peter Freyther1a6b83c2012-07-28 16:14:04 +0200945 NO_STR "Delete paging-group\n" "Paging-group number\n")
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +0200946{
947 int group = atoi(argv[0]);
948 struct bsc_nat_paging_group *pgroup;
949 pgroup = bsc_nat_paging_group_num(_nat, group);
950 if (!pgroup) {
951 vty_out(vty, "No such paging group %d.%s", group, VTY_NEWLINE);
952 return CMD_WARNING;
953 }
954
955 bsc_nat_paging_group_delete(pgroup);
956 return CMD_SUCCESS;
957}
958
959DEFUN(cfg_pgroup_lac, cfg_pgroup_lac_cmd,
960 "location_area_code <0-65535>",
961 "Add the Location Area Code (LAC)\n" "LAC\n")
962{
963 struct bsc_nat_paging_group *pgroup = vty->index;
964
965 int lac = atoi(argv[0]);
966 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
967 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
968 lac, VTY_NEWLINE);
969 return CMD_WARNING;
970 }
971
972 bsc_nat_paging_group_add_lac(pgroup, lac);
973 return CMD_SUCCESS;
974}
975
976DEFUN(cfg_pgroup_no_lac, cfg_pgroup_no_lac_cmd,
977 "no location_area_code <0-65535>",
978 NO_STR "Remove the Location Area Code (LAC)\n" "LAC\n")
979{
980 int lac = atoi(argv[0]);
981 struct bsc_nat_paging_group *pgroup = vty->index;
982
983 bsc_nat_paging_group_del_lac(pgroup, lac);
984 return CMD_SUCCESS;
985}
986
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800987int bsc_nat_vty_init(struct bsc_nat *nat)
988{
989 _nat = nat;
990
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +0800991 /* show commands */
Holger Hans Peter Freyther1398f132010-06-15 20:14:08 +0800992 install_element_ve(&show_sccp_cmd);
993 install_element_ve(&show_bsc_cmd);
994 install_element_ve(&show_bsc_cfg_cmd);
995 install_element_ve(&show_stats_cmd);
Holger Hans Peter Freytherc95cfda2010-07-22 20:26:10 +0800996 install_element_ve(&show_stats_lac_cmd);
Holger Hans Peter Freyther1398f132010-06-15 20:14:08 +0800997 install_element_ve(&close_bsc_cmd);
998 install_element_ve(&show_msc_cmd);
999 install_element_ve(&test_regex_cmd);
Holger Hans Peter Freyther0d8330c2010-08-28 18:33:34 +08001000 install_element_ve(&show_bsc_mgcp_cmd);
Holger Hans Peter Freyther520c1f12010-09-25 16:25:47 +08001001 install_element_ve(&show_acc_lst_cmd);
Holger Hans Peter Freyther5f291d52010-04-06 12:01:15 +02001002
Holger Hans Peter Freytherdfdf8d92011-02-28 01:07:13 +01001003 install_element(ENABLE_NODE, &set_last_endp_cmd);
Holger Hans Peter Freytherde2b8602011-04-23 23:55:14 +02001004 install_element(ENABLE_NODE, &block_new_conn_cmd);
Holger Hans Peter Freytherdfdf8d92011-02-28 01:07:13 +01001005
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +08001006 /* nat group */
1007 install_element(CONFIG_NODE, &cfg_nat_cmd);
1008 install_node(&nat_node, config_write_nat);
1009 install_default(NAT_NODE);
Holger Hans Peter Freyther9c786972010-06-17 14:39:15 +08001010 install_element(NAT_NODE, &ournode_exit_cmd);
1011 install_element(NAT_NODE, &ournode_end_cmd);
Holger Hans Peter Freythera88742c2010-06-15 18:51:04 +08001012 install_element(NAT_NODE, &cfg_nat_msc_ip_cmd);
Holger Hans Peter Freyther81395532010-04-17 07:48:45 +02001013 install_element(NAT_NODE, &cfg_nat_msc_port_cmd);
Holger Hans Peter Freytherda35a8d2010-05-05 16:57:38 +08001014 install_element(NAT_NODE, &cfg_nat_auth_time_cmd);
1015 install_element(NAT_NODE, &cfg_nat_ping_time_cmd);
1016 install_element(NAT_NODE, &cfg_nat_pong_time_cmd);
Holger Hans Peter Freythere635dab2010-05-15 00:14:58 +08001017 install_element(NAT_NODE, &cfg_nat_token_cmd);
Holger Hans Peter Freyther6b771072010-07-27 19:21:53 +08001018 install_element(NAT_NODE, &cfg_nat_bsc_ip_dscp_cmd);
Holger Hans Peter Freyther078321a2010-05-31 10:36:35 +08001019 install_element(NAT_NODE, &cfg_nat_bsc_ip_tos_cmd);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +08001020 install_element(NAT_NODE, &cfg_nat_acc_lst_name_cmd);
Holger Hans Peter Freyther6a7babd2011-03-29 17:14:34 +02001021 install_element(NAT_NODE, &cfg_nat_no_acc_lst_name_cmd);
Holger Hans Peter Freytherd1effd82010-10-10 17:29:20 +02001022 install_element(NAT_NODE, &cfg_nat_ussd_lst_name_cmd);
Holger Hans Peter Freytherc1578bc2010-10-11 10:06:39 +02001023 install_element(NAT_NODE, &cfg_nat_ussd_query_cmd);
Holger Hans Peter Freythere393f272010-10-12 18:25:52 +02001024 install_element(NAT_NODE, &cfg_nat_ussd_token_cmd);
1025 install_element(NAT_NODE, &cfg_nat_ussd_local_cmd);
Holger Hans Peter Freyther8affef52010-06-01 01:03:13 +08001026
1027 /* access-list */
1028 install_element(NAT_NODE, &cfg_lst_imsi_allow_cmd);
1029 install_element(NAT_NODE, &cfg_lst_imsi_deny_cmd);
Holger Hans Peter Freythere4900a02010-06-03 01:44:05 +08001030 install_element(NAT_NODE, &cfg_lst_no_cmd);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +08001031
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +02001032 /* number rewriting */
1033 install_element(NAT_NODE, &cfg_nat_number_rewrite_cmd);
Holger Hans Peter Freythere36b4872011-05-31 00:35:46 +02001034 install_element(NAT_NODE, &cfg_nat_smsc_addr_cmd);
1035 install_element(NAT_NODE, &cfg_nat_smsc_tpdest_cmd);
Holger Hans Peter Freyther68368dd2012-01-10 22:39:07 +01001036 install_element(NAT_NODE, &cfg_nat_sms_clear_tpsrr_cmd);
1037 install_element(NAT_NODE, &cfg_nat_no_sms_clear_tpsrr_cmd);
Holger Hans Peter Freyther7d60bdb2012-01-18 20:40:01 +01001038 install_element(NAT_NODE, &cfg_nat_sms_number_rewrite_cmd);
1039 install_element(NAT_NODE, &cfg_nat_no_sms_number_rewrite_cmd);
Holger Hans Peter Freyther76424392010-10-21 10:59:54 +02001040
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +02001041 install_element(NAT_NODE, &cfg_nat_pgroup_cmd);
1042 install_element(NAT_NODE, &cfg_nat_no_pgroup_cmd);
1043 install_node(&pgroup_node, config_write_pgroup);
1044 install_default(PGROUP_NODE);
Harald Welte570ce242012-08-17 13:16:10 +02001045 install_element(PGROUP_NODE, &ournode_exit_cmd);
1046 install_element(PGROUP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +02001047 install_element(PGROUP_NODE, &cfg_pgroup_lac_cmd);
1048 install_element(PGROUP_NODE, &cfg_pgroup_no_lac_cmd);
1049
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +08001050 /* BSC subgroups */
1051 install_element(NAT_NODE, &cfg_bsc_cmd);
1052 install_node(&bsc_node, config_write_bsc);
Holger Hans Peter Freyther7b4a53d2010-06-17 14:42:20 +08001053 install_default(NAT_BSC_NODE);
1054 install_element(NAT_BSC_NODE, &ournode_exit_cmd);
1055 install_element(NAT_BSC_NODE, &ournode_end_cmd);
1056 install_element(NAT_BSC_NODE, &cfg_bsc_token_cmd);
1057 install_element(NAT_BSC_NODE, &cfg_bsc_lac_cmd);
Holger Hans Peter Freyther0bd60f32010-10-08 22:08:29 +08001058 install_element(NAT_BSC_NODE, &cfg_bsc_no_lac_cmd);
Holger Hans Peter Freyther7b4a53d2010-06-17 14:42:20 +08001059 install_element(NAT_BSC_NODE, &cfg_bsc_paging_cmd);
1060 install_element(NAT_BSC_NODE, &cfg_bsc_desc_cmd);
1061 install_element(NAT_BSC_NODE, &cfg_bsc_acc_lst_name_cmd);
Holger Hans Peter Freyther6a7babd2011-03-29 17:14:34 +02001062 install_element(NAT_BSC_NODE, &cfg_bsc_no_acc_lst_name_cmd);
Holger Hans Peter Freyther9ec030d2011-02-27 11:04:27 +01001063 install_element(NAT_BSC_NODE, &cfg_bsc_max_endps_cmd);
Holger Hans Peter Freytherc0370e42011-05-17 19:28:07 +02001064 install_element(NAT_BSC_NODE, &cfg_bsc_old_grp_cmd);
Holger Hans Peter Freyther6860c442011-05-02 19:16:13 +02001065 install_element(NAT_BSC_NODE, &cfg_bsc_paging_grp_cmd);
1066 install_element(NAT_BSC_NODE, &cfg_bsc_no_paging_grp_cmd);
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +08001067
Holger Hans Peter Freytherf7d33352010-06-15 18:50:26 +08001068 mgcp_vty_init();
1069
Holger Hans Peter Freyther9a85ef32010-06-15 18:46:11 +08001070 return 0;
1071}
1072
1073
1074/* called by the telnet interface... we have our own init above */
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01001075int bsc_vty_init(const struct log_info *cat)
Holger Hans Peter Freyther6c79a682011-02-24 14:33:09 +01001076{
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01001077 logging_vty_add_cmds(cat);
Holger Hans Peter Freyther6c79a682011-02-24 14:33:09 +01001078 return 0;
1079}