blob: 3b85892e04f1931c42284a573f85996357622a24 [file] [log] [blame]
Harald Welte68628e82009-03-10 12:17:57 +00001/* OpenBSC interface to quagga VTY */
Harald Welteaf387632010-03-14 23:30:30 +08002/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
Harald Welte68628e82009-03-10 12:17:57 +00003 * All Rights Reserved
4 *
5 * This program is free software; you can redistribute it and/or modify
Harald Welte9af6ddf2011-01-01 15:25:50 +01006 * it under the terms of the GNU Affero General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
Harald Welte68628e82009-03-10 12:17:57 +00008 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Harald Welte9af6ddf2011-01-01 15:25:50 +010013 * GNU Affero General Public License for more details.
Harald Welte68628e82009-03-10 12:17:57 +000014 *
Harald Welte9af6ddf2011-01-01 15:25:50 +010015 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Harald Welte68628e82009-03-10 12:17:57 +000017 *
18 */
19
20#include <stdlib.h>
21#include <unistd.h>
Harald Welte68628e82009-03-10 12:17:57 +000022
Harald Welte4b037e42010-05-19 19:45:32 +020023#include <osmocom/vty/command.h>
24#include <osmocom/vty/buffer.h>
25#include <osmocom/vty/vty.h>
26#include <osmocom/vty/logging.h>
27#include <osmocom/vty/telnet_interface.h>
Harald Welte4ab9d7c2012-08-17 12:42:06 +020028#include <osmocom/vty/misc.h>
Harald Welte68628e82009-03-10 12:17:57 +000029
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +010030#include <osmocom/gsm/gsm0502.h>
31
Harald Welte68628e82009-03-10 12:17:57 +000032#include <arpa/inet.h>
33
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010034#include <osmocom/core/linuxlist.h>
Harald Welte68628e82009-03-10 12:17:57 +000035#include <openbsc/gsm_data.h>
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +020036#include <osmocom/abis/e1_input.h>
Harald Welte1bc77352009-03-10 19:47:51 +000037#include <openbsc/abis_nm.h>
Harald Welte4d54d0b2011-02-19 16:48:17 +010038#include <openbsc/abis_om2000.h>
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010039#include <osmocom/core/utils.h>
40#include <osmocom/gsm/gsm_utils.h>
Harald Weltecdc59ff2011-05-23 20:42:26 +020041#include <osmocom/gsm/abis_nm.h>
Harald Welteb908cb72009-12-22 13:09:29 +010042#include <openbsc/chan_alloc.h>
Harald Welte8387a492009-12-22 21:43:14 +010043#include <openbsc/meas_rep.h>
Harald Welte40f82892009-05-23 17:31:39 +000044#include <openbsc/db.h>
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010045#include <osmocom/core/talloc.h>
Holger Hans Peter Freyther3c712322010-04-06 11:55:37 +020046#include <openbsc/vty.h>
Harald Welteea34a4e2012-06-16 14:59:56 +080047#include <osmocom/gprs/gprs_ns.h>
Harald Welte9fbff4a2010-07-30 11:50:09 +020048#include <openbsc/system_information.h>
Harald Welte5bc61dc2010-05-16 22:02:16 +020049#include <openbsc/debug.h>
Holger Hans Peter Freyther85334f12010-11-09 17:00:42 +010050#include <openbsc/paging.h>
Harald Weltef7a2b192011-08-20 18:25:02 +020051#include <openbsc/ipaccess.h>
Harald Welted0d2b0b2010-12-23 13:18:07 +010052#include <openbsc/abis_rsl.h>
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +010053#include <openbsc/osmo_msc_data.h>
54#include <openbsc/osmo_bsc_rf.h>
Harald Welte68628e82009-03-10 12:17:57 +000055
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +010056#include <inttypes.h>
57
Harald Weltec08e8be2011-03-04 13:53:51 +010058#include "../../bscconfig.h"
Harald Welte1353f962010-05-16 19:20:24 +020059
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +020060
61#define NETWORK_STR "Configure the GSM network\n"
62#define CODE_CMD_STR "Code commands\n"
63#define NAME_CMD_STR "Name Commands\n"
64#define NAME_STR "Name to use\n"
65#define LCHAN_NR_STR "Logical Channel Number\n"
66
67
Harald Welteea4647d2010-05-12 17:19:53 +000068/* FIXME: this should go to some common file */
69static const struct value_string gprs_ns_timer_strs[] = {
Harald Welte615e9562010-05-11 23:50:21 +020070 { 0, "tns-block" },
71 { 1, "tns-block-retries" },
72 { 2, "tns-reset" },
73 { 3, "tns-reset-retries" },
74 { 4, "tns-test" },
75 { 5, "tns-alive" },
76 { 6, "tns-alive-retries" },
77 { 0, NULL }
78};
79
Harald Welteea4647d2010-05-12 17:19:53 +000080static const struct value_string gprs_bssgp_cfg_strs[] = {
Harald Welte615e9562010-05-11 23:50:21 +020081 { 0, "blocking-timer" },
82 { 1, "blocking-retries" },
83 { 2, "unblocking-retries" },
84 { 3, "reset-timer" },
85 { 4, "reset-retries" },
86 { 5, "suspend-timer" },
87 { 6, "suspend-retries" },
88 { 7, "resume-timer" },
89 { 8, "resume-retries" },
90 { 9, "capability-update-timer" },
91 { 10, "capability-update-retries" },
92 { 0, NULL }
93};
94
Harald Welte64c07d22011-02-15 11:43:27 +010095static const struct value_string bts_neigh_mode_strs[] = {
96 { NL_MODE_AUTOMATIC, "automatic" },
97 { NL_MODE_MANUAL, "manual" },
98 { NL_MODE_MANUAL_SI5SEP, "manual-si5" },
99 { 0, NULL }
100};
101
Daniel Willmann7d109832012-05-14 18:43:23 +0200102const struct value_string bts_loc_fix_names[] = {
103 { BTS_LOC_FIX_INVALID, "invalid" },
104 { BTS_LOC_FIX_2D, "fix2d" },
105 { BTS_LOC_FIX_3D, "fix3d" },
106 { 0, NULL }
107};
108
Harald Welte5013b2a2009-08-07 13:29:14 +0200109struct cmd_node net_node = {
110 GSMNET_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200111 "%s(config-net)# ",
Harald Welte5013b2a2009-08-07 13:29:14 +0200112 1,
113};
114
Harald Welte68628e82009-03-10 12:17:57 +0000115struct cmd_node bts_node = {
116 BTS_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200117 "%s(config-net-bts)# ",
Harald Welte68628e82009-03-10 12:17:57 +0000118 1,
119};
120
121struct cmd_node trx_node = {
122 TRX_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200123 "%s(config-net-bts-trx)# ",
Harald Welte68628e82009-03-10 12:17:57 +0000124 1,
125};
126
127struct cmd_node ts_node = {
128 TS_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200129 "%s(config-net-bts-trx-ts)# ",
Harald Welte68628e82009-03-10 12:17:57 +0000130 1,
131};
132
Harald Welte39231152010-05-27 13:39:40 +0200133extern struct gsm_network *bsc_gsmnet;
134
Harald Weltedcccb182010-05-16 20:52:23 +0200135struct gsm_network *gsmnet_from_vty(struct vty *v)
136{
Harald Welte39231152010-05-27 13:39:40 +0200137 /* In case we read from the config file, the vty->priv cannot
138 * point to a struct telnet_connection, and thus conn->priv
139 * will not point to the gsm_network structure */
140#if 0
Harald Weltedcccb182010-05-16 20:52:23 +0200141 struct telnet_connection *conn = v->priv;
142 return (struct gsm_network *) conn->priv;
Harald Welte39231152010-05-27 13:39:40 +0200143#else
144 return bsc_gsmnet;
145#endif
Harald Weltedcccb182010-05-16 20:52:23 +0200146}
147
Harald Welte68628e82009-03-10 12:17:57 +0000148static int dummy_config_write(struct vty *v)
149{
150 return CMD_SUCCESS;
151}
152
153static void net_dump_nmstate(struct vty *vty, struct gsm_nm_state *nms)
154{
Harald Welte1304b352013-03-15 16:57:33 +0100155 vty_out(vty,"Oper '%s', Admin '%s', Avail '%s'%s",
156 abis_nm_opstate_name(nms->operational),
157 get_value_string(abis_nm_adm_state_names, nms->administrative),
Harald Welte867d9f32011-05-23 20:30:39 +0200158 abis_nm_avail_name(nms->availability), VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000159}
160
Harald Welteb908cb72009-12-22 13:09:29 +0100161static void dump_pchan_load_vty(struct vty *vty, char *prefix,
162 const struct pchan_load *pl)
163{
164 int i;
165
166 for (i = 0; i < ARRAY_SIZE(pl->pchan); i++) {
167 const struct load_counter *lc = &pl->pchan[i];
168 unsigned int percent;
169
170 if (lc->total == 0)
171 continue;
172
173 percent = (lc->used * 100) / lc->total;
174
175 vty_out(vty, "%s%20s: %3u%% (%u/%u)%s", prefix,
176 gsm_pchan_name(i), percent, lc->used, lc->total,
177 VTY_NEWLINE);
178 }
179}
180
Harald Welte68628e82009-03-10 12:17:57 +0000181static void net_dump_vty(struct vty *vty, struct gsm_network *net)
182{
Harald Welteb908cb72009-12-22 13:09:29 +0100183 struct pchan_load pl;
184
Harald Welteef235b52009-03-10 12:34:02 +0000185 vty_out(vty, "BSC is on Country Code %u, Network Code %u "
186 "and has %u BTS%s", net->country_code, net->network_code,
187 net->num_bts, VTY_NEWLINE);
Harald Welte1bc77352009-03-10 19:47:51 +0000188 vty_out(vty, " Long network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000189 net->name_long, VTY_NEWLINE);
Harald Welte1bc77352009-03-10 19:47:51 +0000190 vty_out(vty, " Short network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000191 net->name_short, VTY_NEWLINE);
Harald Welte (local)69de3972009-08-12 14:42:23 +0200192 vty_out(vty, " Authentication policy: %s%s",
193 gsm_auth_policy_name(net->auth_policy), VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100194 vty_out(vty, " Location updating reject cause: %u%s",
195 net->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900196 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
197 VTY_NEWLINE);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +0100198 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
199 VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800200 vty_out(vty, " Use TCH for Paging any: %d%s", net->pag_any_tch,
201 VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100202 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
203 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100204 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
205 VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100206 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
207 VTY_NEWLINE);
Harald Welteb908cb72009-12-22 13:09:29 +0100208 network_chan_load(&pl, net);
209 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
210 dump_pchan_load_vty(vty, " ", &pl);
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100211
212 /* show rf */
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200213 if (net->bsc_data && net->bsc_data->rf_ctrl)
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100214 vty_out(vty, " Last RF Command: %s%s",
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200215 net->bsc_data->rf_ctrl->last_state_command,
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100216 VTY_NEWLINE);
Jacob Erlbeck779a7282013-09-11 10:46:57 +0200217 if (net->bsc_data && net->bsc_data->rf_ctrl)
218 vty_out(vty, " Last RF Lock Command: %s%s",
219 net->bsc_data->rf_ctrl->last_rf_lock_ctrl_command,
220 VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000221}
222
223DEFUN(show_net, show_net_cmd, "show network",
224 SHOW_STR "Display information about a GSM NETWORK\n")
225{
Harald Weltedcccb182010-05-16 20:52:23 +0200226 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000227 net_dump_vty(vty, net);
228
229 return CMD_SUCCESS;
230}
231
232static void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l)
233{
Harald Welteedb37782009-05-01 14:59:07 +0000234 struct e1inp_line *line;
235
236 if (!e1l) {
237 vty_out(vty, " None%s", VTY_NEWLINE);
238 return;
239 }
240
241 line = e1l->ts->line;
242
243 vty_out(vty, " E1 Line %u, Type %s: Timeslot %u, Mode %s%s",
244 line->num, line->driver->name, e1l->ts->num,
Harald Welte1bc77352009-03-10 19:47:51 +0000245 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
Harald Welteedb37782009-05-01 14:59:07 +0000246 vty_out(vty, " E1 TEI %u, SAPI %u%s",
Harald Welte68628e82009-03-10 12:17:57 +0000247 e1l->tei, e1l->sapi, VTY_NEWLINE);
248}
249
250static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
251{
Harald Welteb908cb72009-12-22 13:09:29 +0100252 struct pchan_load pl;
253
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200254 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Weltefcd24452009-06-20 18:15:19 +0200255 "BSIC %u, TSC %u and %u TRX%s",
256 bts->nr, btstype2str(bts->type), gsm_band_name(bts->band),
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200257 bts->cell_identity,
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +0200258 bts->location_area_code, bts->bsic, bts->tsc,
Harald Weltefcd24452009-06-20 18:15:19 +0200259 bts->num_trx, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200260 vty_out(vty, "Description: %s%s",
261 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Harald Welte1d8dbc42009-12-12 15:38:16 +0100262 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100263 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte1d8dbc42009-12-12 15:38:16 +0100264 rxlev2dbm(bts->si_common.cell_sel_par.rxlev_acc_min),
265 VTY_NEWLINE);
266 vty_out(vty, "Cell Reselection Hysteresis: %u dBm%s",
Harald Welte73225282009-12-12 18:17:25 +0100267 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100268 vty_out(vty, "RACH TX-Integer: %u%s", bts->si_common.rach_control.tx_integer,
269 VTY_NEWLINE);
270 vty_out(vty, "RACH Max transmissions: %u%s",
271 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
272 VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100273 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200274 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +0200275 vty_out(vty, "Channel Description Attachment: %s%s",
276 (bts->si_common.chan_desc.att) ? "yes" : "no", VTY_NEWLINE);
277 vty_out(vty, "Channel Description BS-PA-MFRMS: %u%s",
278 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
279 vty_out(vty, "Channel Description BS-AG_BLKS-RES: %u%s",
280 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
Harald Welte9fbff4a2010-07-30 11:50:09 +0200281 vty_out(vty, "System Information present: 0x%08x, static: 0x%08x%s",
282 bts->si_valid, bts->si_mode_static, VTY_NEWLINE);
Harald Welte4cc34222009-05-01 15:12:31 +0000283 if (is_ipaccess_bts(bts))
Harald Welte8175e952009-10-20 00:22:00 +0200284 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte4cc34222009-05-01 15:12:31 +0000285 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte8175e952009-10-20 00:22:00 +0200286 bts->oml_tei, VTY_NEWLINE);
Sylvain Munautc9519462011-10-17 14:04:55 +0200287 else if (bts->type == GSM_BTS_TYPE_NOKIA_SITE)
288 vty_out(vty, " Skip Reset: %d%s",
289 bts->nokia.skip_reset, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000290 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200291 net_dump_nmstate(vty, &bts->mo.nm_state);
Harald Welte68628e82009-03-10 12:17:57 +0000292 vty_out(vty, " Site Mgr NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200293 net_dump_nmstate(vty, &bts->site_mgr.mo.nm_state);
Holger Hans Peter Freyther846d8dc2013-05-29 16:22:09 +0200294 vty_out(vty, " GPRS NSE: ");
295 net_dump_nmstate(vty, &bts->gprs.nse.mo.nm_state);
296 vty_out(vty, " GPRS CELL: ");
297 net_dump_nmstate(vty, &bts->gprs.cell.mo.nm_state);
298 vty_out(vty, " GPRS NSVC0: ");
299 net_dump_nmstate(vty, &bts->gprs.nsvc[0].mo.nm_state);
300 vty_out(vty, " GPRS NSVC1: ");
301 net_dump_nmstate(vty, &bts->gprs.nsvc[1].mo.nm_state);
Holger Hans Peter Freyther66e14cd2011-04-26 15:52:34 +0200302 vty_out(vty, " Paging: %u pending requests, %u free slots%s",
303 paging_pending_requests_nr(bts),
Harald Welte68628e82009-03-10 12:17:57 +0000304 bts->paging.available_slots, VTY_NEWLINE);
Holger Hans Peter Freytherd283db42010-11-25 16:28:45 +0100305 if (is_ipaccess_bts(bts)) {
306 vty_out(vty, " OML Link state: %s.%s",
307 bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);
308 } else {
Harald Welte8175e952009-10-20 00:22:00 +0200309 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
310 e1isl_dump_vty(vty, bts->oml_link);
311 }
Holger Hans Peter Freytherd283db42010-11-25 16:28:45 +0100312
313 /* FIXME: chan_desc */
Harald Welteb908cb72009-12-22 13:09:29 +0100314 memset(&pl, 0, sizeof(pl));
315 bts_chan_load(&pl, bts);
316 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
317 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte68628e82009-03-10 12:17:57 +0000318}
319
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100320DEFUN(show_bts, show_bts_cmd, "show bts [<0-255>]",
Harald Welte68628e82009-03-10 12:17:57 +0000321 SHOW_STR "Display information about a BTS\n"
322 "BTS number")
323{
Harald Weltedcccb182010-05-16 20:52:23 +0200324 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000325 int bts_nr;
326
327 if (argc != 0) {
328 /* use the BTS number that the user has specified */
329 bts_nr = atoi(argv[0]);
Harald Welte712ddbc2010-12-24 12:24:03 +0100330 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000331 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000332 VTY_NEWLINE);
333 return CMD_WARNING;
334 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200335 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000336 return CMD_SUCCESS;
337 }
338 /* print all BTS's */
339 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee441d9c2009-06-21 16:17:15 +0200340 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000341
342 return CMD_SUCCESS;
343}
344
Harald Welte42581822009-08-08 16:12:58 +0200345/* utility functions */
346static void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,
347 const char *ts, const char *ss)
348{
349 e1_link->e1_nr = atoi(line);
350 e1_link->e1_ts = atoi(ts);
351 if (!strcmp(ss, "full"))
352 e1_link->e1_ts_ss = 255;
353 else
354 e1_link->e1_ts_ss = atoi(ss);
355}
356
357static void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,
358 const char *prefix)
359{
360 if (!e1_link->e1_ts)
361 return;
362
363 if (e1_link->e1_ts_ss == 255)
364 vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",
365 prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);
366 else
367 vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",
368 prefix, e1_link->e1_nr, e1_link->e1_ts,
369 e1_link->e1_ts_ss, VTY_NEWLINE);
370}
371
372
Harald Welte67ce0732009-08-06 19:06:46 +0200373static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
374{
Harald Welte42581822009-08-08 16:12:58 +0200375 vty_out(vty, " timeslot %u%s", ts->nr, VTY_NEWLINE);
Harald Welte135a6482011-05-30 12:09:13 +0200376 if (ts->tsc != -1 && ts->tsc != ts->trx->bts->tsc)
377 vty_out(vty, " training_sequence_code %u%s", ts->tsc, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200378 if (ts->pchan != GSM_PCHAN_NONE)
379 vty_out(vty, " phys_chan_config %s%s",
380 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
Harald Weltea39b0f22010-06-14 22:26:10 +0200381 vty_out(vty, " hopping enabled %u%s",
382 ts->hopping.enabled, VTY_NEWLINE);
383 if (ts->hopping.enabled) {
384 unsigned int i;
385 vty_out(vty, " hopping sequence-number %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200386 ts->hopping.hsn, VTY_NEWLINE);
Harald Weltea39b0f22010-06-14 22:26:10 +0200387 vty_out(vty, " hopping maio %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200388 ts->hopping.maio, VTY_NEWLINE);
Harald Weltea39b0f22010-06-14 22:26:10 +0200389 for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {
390 if (!bitvec_get_bit_pos(&ts->hopping.arfcns, i))
391 continue;
392 vty_out(vty, " hopping arfcn add %u%s",
393 i, VTY_NEWLINE);
394 }
Harald Welte127af342010-12-24 12:07:07 +0100395 }
Harald Welte42581822009-08-08 16:12:58 +0200396 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Welteface7ed2011-02-14 16:15:21 +0100397
398 if (ts->trx->bts->model->config_write_ts)
399 ts->trx->bts->model->config_write_ts(vty, ts);
Harald Welte67ce0732009-08-06 19:06:46 +0200400}
401
402static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
403{
404 int i;
405
Harald Welte5013b2a2009-08-07 13:29:14 +0200406 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200407 if (trx->description)
408 vty_out(vty, " description %s%s", trx->description,
409 VTY_NEWLINE);
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200410 vty_out(vty, " rf_locked %u%s",
Harald Welted64c0bc2011-05-30 12:07:53 +0200411 trx->mo.nm_state.administrative == NM_STATE_LOCKED ? 1 : 0,
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200412 VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200413 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)7b37d972009-12-27 20:56:38 +0100414 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200415 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200416 config_write_e1_link(vty, &trx->rsl_e1_link, " rsl ");
417 vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei, VTY_NEWLINE);
Harald Welte67ce0732009-08-06 19:06:46 +0200418
Harald Welteface7ed2011-02-14 16:15:21 +0100419 if (trx->bts->model->config_write_trx)
420 trx->bts->model->config_write_trx(vty, trx);
421
Harald Welte67ce0732009-08-06 19:06:46 +0200422 for (i = 0; i < TRX_NR_TS; i++)
423 config_write_ts_single(vty, &trx->ts[i]);
424}
425
Harald Welte615e9562010-05-11 23:50:21 +0200426static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
427{
428 unsigned int i;
429 vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
430 VTY_NEWLINE);
431 if (bts->gprs.mode == BTS_GPRS_NONE)
432 return;
433
434 vty_out(vty, " gprs routing area %u%s", bts->gprs.rac,
435 VTY_NEWLINE);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +0100436 vty_out(vty, " gprs network-control-order nc%u%s",
437 bts->gprs.net_ctrl_ord, VTY_NEWLINE);
Harald Welte615e9562010-05-11 23:50:21 +0200438 vty_out(vty, " gprs cell bvci %u%s", bts->gprs.cell.bvci,
439 VTY_NEWLINE);
440 for (i = 0; i < ARRAY_SIZE(bts->gprs.cell.timer); i++)
441 vty_out(vty, " gprs cell timer %s %u%s",
442 get_value_string(gprs_bssgp_cfg_strs, i),
443 bts->gprs.cell.timer[i], VTY_NEWLINE);
444 vty_out(vty, " gprs nsei %u%s", bts->gprs.nse.nsei,
445 VTY_NEWLINE);
446 for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)
447 vty_out(vty, " gprs ns timer %s %u%s",
448 get_value_string(gprs_ns_timer_strs, i),
449 bts->gprs.nse.timer[i], VTY_NEWLINE);
450 for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
451 struct gsm_bts_gprs_nsvc *nsvc =
452 &bts->gprs.nsvc[i];
453 struct in_addr ia;
454
455 ia.s_addr = htonl(nsvc->remote_ip);
456 vty_out(vty, " gprs nsvc %u nsvci %u%s", i,
457 nsvc->nsvci, VTY_NEWLINE);
458 vty_out(vty, " gprs nsvc %u local udp port %u%s", i,
459 nsvc->local_port, VTY_NEWLINE);
460 vty_out(vty, " gprs nsvc %u remote udp port %u%s", i,
461 nsvc->remote_port, VTY_NEWLINE);
462 vty_out(vty, " gprs nsvc %u remote ip %s%s", i,
463 inet_ntoa(ia), VTY_NEWLINE);
464 }
465}
466
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200467/* Write the model data if there is one */
468static void config_write_bts_model(struct vty *vty, struct gsm_bts *bts)
Harald Welte67ce0732009-08-06 19:06:46 +0200469{
470 struct gsm_bts_trx *trx;
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200471
472 if (!bts->model)
473 return;
474
475 if (bts->model->config_write_bts)
476 bts->model->config_write_bts(vty, bts);
477
478 llist_for_each_entry(trx, &bts->trx_list, list)
479 config_write_trx_single(vty, trx);
480}
481
482static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
483{
Harald Welte9fbff4a2010-07-30 11:50:09 +0200484 int i;
Harald Welte67ce0732009-08-06 19:06:46 +0200485
Harald Welte5013b2a2009-08-07 13:29:14 +0200486 vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE);
487 vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200488 if (bts->description)
489 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200490 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freytherf926ed62009-11-19 16:38:49 +0100491 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200492 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte67ce0732009-08-06 19:06:46 +0200493 VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200494 vty_out(vty, " training_sequence_code %u%s", bts->tsc, VTY_NEWLINE);
495 vty_out(vty, " base_station_id_code %u%s", bts->bsic, VTY_NEWLINE);
Jacob Erlbeck946d1412013-09-17 13:59:29 +0200496 if (bts->tz.override != 0) {
497 if (bts->tz.dst)
498 vty_out(vty, " timezone %d %d %d%s",
499 bts->tz.hr, bts->tz.mn, bts->tz.dst, VTY_NEWLINE);
500 else
501 vty_out(vty, " timezone %d %d%s",
502 bts->tz.hr, bts->tz.mn, VTY_NEWLINE);
503 }
Harald Welte (local)0e451d02009-08-13 10:14:26 +0200504 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100505 vty_out(vty, " cell reselection hysteresis %u%s",
506 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
507 vty_out(vty, " rxlev access min %u%s",
508 bts->si_common.cell_sel_par.rxlev_acc_min, VTY_NEWLINE);
Sylvain Munaute0b06b02010-11-28 18:17:28 +0100509
510 if (bts->si_common.cell_ro_sel_par.present) {
511 struct gsm48_si_selection_params *sp;
512 sp = &bts->si_common.cell_ro_sel_par;
513
514 if (sp->cbq)
515 vty_out(vty, " cell bar qualify %u%s",
516 sp->cbq, VTY_NEWLINE);
517
518 if (sp->cell_resel_off)
519 vty_out(vty, " cell reselection offset %u%s",
520 sp->cell_resel_off*2, VTY_NEWLINE);
521
522 if (sp->temp_offs == 7)
523 vty_out(vty, " temporary offset infinite%s",
524 VTY_NEWLINE);
525 else if (sp->temp_offs)
526 vty_out(vty, " temporary offset %u%s",
527 sp->temp_offs*10, VTY_NEWLINE);
528
529 if (sp->penalty_time == 31)
530 vty_out(vty, " penalty time reserved%s",
531 VTY_NEWLINE);
532 else if (sp->penalty_time)
533 vty_out(vty, " penalty time %u%s",
534 (sp->penalty_time*20)+20, VTY_NEWLINE);
535 }
536
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +0200537 /* Is periodic LU enabled or disabled? */
538 if (bts->si_common.chan_desc.t3212 == 0)
539 vty_out(vty, " no periodic location update%s", VTY_NEWLINE);
540 else
541 vty_out(vty, " periodic location update %u%s",
542 bts->si_common.chan_desc.t3212 * 6, VTY_NEWLINE);
543
Harald Welte7a8fa412009-08-10 13:48:16 +0200544 vty_out(vty, " channel allocator %s%s",
545 bts->chan_alloc_reverse ? "descending" : "ascending",
546 VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100547 vty_out(vty, " rach tx integer %u%s",
548 bts->si_common.rach_control.tx_integer, VTY_NEWLINE);
549 vty_out(vty, " rach max transmission %u%s",
550 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
551 VTY_NEWLINE);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800552
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +0200553 vty_out(vty, " channel-descrption attach %u%s",
554 bts->si_common.chan_desc.att, VTY_NEWLINE);
555 vty_out(vty, " channel-descrption bs-pa-mfrms %u%s",
556 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
557 vty_out(vty, " channel-descrption bs-ag-blks-res %u%s",
558 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
559
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800560 if (bts->rach_b_thresh != -1)
561 vty_out(vty, " rach nm busy threshold %u%s",
562 bts->rach_b_thresh, VTY_NEWLINE);
563 if (bts->rach_ldavg_slots != -1)
564 vty_out(vty, " rach nm load average %u%s",
565 bts->rach_ldavg_slots, VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100566 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200567 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +0800568 if ((bts->si_common.rach_control.t2 & 0x4) == 0)
569 vty_out(vty, " rach emergency call allowed 1%s", VTY_NEWLINE);
Ivan Kluchnikov67920592013-09-16 13:13:04 +0400570 if ((bts->si_common.rach_control.t3) != 0)
571 for (i = 0; i < 8; i++)
572 if (bts->si_common.rach_control.t3 & (0x1 << i))
573 vty_out(vty, " rach access-control-class %d barred%s", i, VTY_NEWLINE);
574 if ((bts->si_common.rach_control.t2 & 0xfb) != 0)
575 for (i = 0; i < 8; i++)
576 if ((i != 2) && (bts->si_common.rach_control.t2 & (0x1 << i)))
577 vty_out(vty, " rach access-control-class %d barred%s", i+8, VTY_NEWLINE);
Harald Welte9fbff4a2010-07-30 11:50:09 +0200578 for (i = SYSINFO_TYPE_1; i < _MAX_SYSINFO_TYPE; i++) {
579 if (bts->si_mode_static & (1 << i)) {
580 vty_out(vty, " system-information %s mode static%s",
581 get_value_string(osmo_sitype_strs, i), VTY_NEWLINE);
582 vty_out(vty, " system-information %s static %s%s",
583 get_value_string(osmo_sitype_strs, i),
Sylvain Munaut63ef2152011-11-13 23:05:23 +0100584 osmo_hexdump_nospc(bts->si_buf[i], sizeof(bts->si_buf[i])),
Harald Welte9fbff4a2010-07-30 11:50:09 +0200585 VTY_NEWLINE);
586 }
587 }
Harald Weltefd355a32011-03-04 13:41:31 +0100588 switch (bts->type) {
589 case GSM_BTS_TYPE_NANOBTS:
Harald Weltef383aa12012-07-02 19:51:55 +0200590 case GSM_BTS_TYPE_OSMO_SYSMO:
Harald Welte5013b2a2009-08-07 13:29:14 +0200591 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Weltea6fd58e2009-08-07 00:25:23 +0200592 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte8b291802013-03-12 13:57:05 +0100593 if (bts->ip_access.rsl_ip) {
594 struct in_addr ia;
595 ia.s_addr = htonl(bts->ip_access.rsl_ip);
596 vty_out(vty, " ip.access rsl-ip %s%s", inet_ntoa(ia),
597 VTY_NEWLINE);
598 }
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +0200599 vty_out(vty, " oml ip.access stream_id %u line %u%s",
600 bts->oml_tei, bts->oml_e1_link.e1_nr, VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100601 break;
Sylvain Munautc9519462011-10-17 14:04:55 +0200602 case GSM_BTS_TYPE_NOKIA_SITE:
603 vty_out(vty, " nokia_site skip-reset %d%s", bts->nokia.skip_reset, VTY_NEWLINE);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +0100604 vty_out(vty, " nokia_site no-local-rel-conf %d%s",
605 bts->nokia.no_loc_rel_cnf, VTY_NEWLINE);
Andreas Eversbergb6f95162013-12-05 16:02:37 +0100606 /* fall through: Nokia requires "oml e1" parameters also */
Harald Weltefd355a32011-03-04 13:41:31 +0100607 default:
Harald Welte42581822009-08-08 16:12:58 +0200608 config_write_e1_link(vty, &bts->oml_e1_link, " oml ");
609 vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100610 break;
Harald Welte42581822009-08-08 16:12:58 +0200611 }
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +0800612
613 /* if we have a limit, write it */
614 if (bts->paging.free_chans_need >= 0)
615 vty_out(vty, " paging free %d%s", bts->paging.free_chans_need, VTY_NEWLINE);
616
Harald Welte32c09622011-01-11 23:44:56 +0100617 vty_out(vty, " neighbor-list mode %s%s",
Harald Welte64c07d22011-02-15 11:43:27 +0100618 get_value_string(bts_neigh_mode_strs, bts->neigh_list_manual_mode), VTY_NEWLINE);
619 if (bts->neigh_list_manual_mode != NL_MODE_AUTOMATIC) {
Harald Welte32c09622011-01-11 23:44:56 +0100620 for (i = 0; i < 1024; i++) {
621 if (bitvec_get_bit_pos(&bts->si_common.neigh_list, i))
622 vty_out(vty, " neighbor-list add arfcn %u%s",
623 i, VTY_NEWLINE);
624 }
625 }
Harald Welte64c07d22011-02-15 11:43:27 +0100626 if (bts->neigh_list_manual_mode == NL_MODE_MANUAL_SI5SEP) {
627 for (i = 0; i < 1024; i++) {
628 if (bitvec_get_bit_pos(&bts->si_common.si5_neigh_list, i))
629 vty_out(vty, " si5 neighbor-list add arfcn %u%s",
630 i, VTY_NEWLINE);
631 }
632 }
Harald Welte32c09622011-01-11 23:44:56 +0100633
Andreas Eversberga83d5112013-12-07 18:32:28 +0100634 vty_out(vty, " codec-support fr");
635 if (bts->codec.hr)
636 vty_out(vty, " hr");
637 if (bts->codec.efr)
638 vty_out(vty, " efr");
639 if (bts->codec.amr)
640 vty_out(vty, " amr");
641 vty_out(vty, "%s", VTY_NEWLINE);
642
Harald Welte615e9562010-05-11 23:50:21 +0200643 config_write_bts_gprs(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200644
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +0200645 if (bts->excl_from_rf_lock)
646 vty_out(vty, " rf-lock-exclude%s", VTY_NEWLINE);
647
Jacob Erlbeck65d114f2014-01-16 11:02:14 +0100648 vty_out(vty, " %sforce-combined-si%s",
649 bts->force_combined_si ? "" : "no ", VTY_NEWLINE);
650
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200651 config_write_bts_model(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200652}
653
654static int config_write_bts(struct vty *v)
655{
Harald Weltedcccb182010-05-16 20:52:23 +0200656 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte67ce0732009-08-06 19:06:46 +0200657 struct gsm_bts *bts;
658
659 llist_for_each_entry(bts, &gsmnet->bts_list, list)
660 config_write_bts_single(v, bts);
661
662 return CMD_SUCCESS;
663}
664
Harald Welte5013b2a2009-08-07 13:29:14 +0200665static int config_write_net(struct vty *vty)
666{
Harald Weltedcccb182010-05-16 20:52:23 +0200667 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
668
Harald Welte5013b2a2009-08-07 13:29:14 +0200669 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200670 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200671 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200672 vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE);
673 vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE);
Harald Welte (local)69de3972009-08-12 14:42:23 +0200674 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100675 vty_out(vty, " location updating reject cause %u%s",
676 gsmnet->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900677 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freytherd54c3372009-11-19 16:37:48 +0100678 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800679 vty_out(vty, " paging any use tch %d%s", gsmnet->pag_any_tch, VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100680 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
681 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100682 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100683 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Welteb720bd32009-12-21 16:51:50 +0100684 vty_out(vty, " handover window rxlev averaging %u%s",
685 gsmnet->handover.win_rxlev_avg, VTY_NEWLINE);
686 vty_out(vty, " handover window rxqual averaging %u%s",
687 gsmnet->handover.win_rxqual_avg, VTY_NEWLINE);
688 vty_out(vty, " handover window rxlev neighbor averaging %u%s",
689 gsmnet->handover.win_rxlev_avg_neigh, VTY_NEWLINE);
690 vty_out(vty, " handover power budget interval %u%s",
691 gsmnet->handover.pwr_interval, VTY_NEWLINE);
692 vty_out(vty, " handover power budget hysteresis %u%s",
693 gsmnet->handover.pwr_hysteresis, VTY_NEWLINE);
694 vty_out(vty, " handover maximum distance %u%s",
695 gsmnet->handover.max_distance, VTY_NEWLINE);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +0100696 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100697 vty_out(vty, " timer t3103 %u%s", gsmnet->T3103, VTY_NEWLINE);
698 vty_out(vty, " timer t3105 %u%s", gsmnet->T3105, VTY_NEWLINE);
699 vty_out(vty, " timer t3107 %u%s", gsmnet->T3107, VTY_NEWLINE);
700 vty_out(vty, " timer t3109 %u%s", gsmnet->T3109, VTY_NEWLINE);
701 vty_out(vty, " timer t3111 %u%s", gsmnet->T3111, VTY_NEWLINE);
702 vty_out(vty, " timer t3113 %u%s", gsmnet->T3113, VTY_NEWLINE);
703 vty_out(vty, " timer t3115 %u%s", gsmnet->T3115, VTY_NEWLINE);
704 vty_out(vty, " timer t3117 %u%s", gsmnet->T3117, VTY_NEWLINE);
705 vty_out(vty, " timer t3119 %u%s", gsmnet->T3119, VTY_NEWLINE);
Harald Welte2862dca2010-12-23 14:39:29 +0100706 vty_out(vty, " timer t3122 %u%s", gsmnet->T3122, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100707 vty_out(vty, " timer t3141 %u%s", gsmnet->T3141, VTY_NEWLINE);
Harald Welte63dbfc62010-12-15 15:34:23 +0100708 vty_out(vty, " dtx-used %u%s", gsmnet->dtx_enabled, VTY_NEWLINE);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +0100709 vty_out(vty, " subscriber-keep-in-ram %d%s",
710 gsmnet->keep_subscr, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200711
712 return CMD_SUCCESS;
713}
Harald Welte67ce0732009-08-06 19:06:46 +0200714
Harald Welte68628e82009-03-10 12:17:57 +0000715static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx)
716{
717 vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
718 trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200719 vty_out(vty, "Description: %s%s",
720 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Weltefcd24452009-06-20 18:15:19 +0200721 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte42581822009-08-08 16:12:58 +0200722 "resulting BS power: %d dBm%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200723 trx->nominal_power, trx->max_power_red,
Harald Welte42581822009-08-08 16:12:58 +0200724 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000725 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200726 net_dump_nmstate(vty, &trx->mo.nm_state);
Harald Welte68628e82009-03-10 12:17:57 +0000727 vty_out(vty, " Baseband Transceiver NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200728 net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);
Harald Welte8175e952009-10-20 00:22:00 +0200729 if (is_ipaccess_bts(trx->bts)) {
730 vty_out(vty, " ip.access stream ID: 0x%02x%s",
731 trx->rsl_tei, VTY_NEWLINE);
732 } else {
733 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
734 e1isl_dump_vty(vty, trx->rsl_link);
735 }
Harald Welte68628e82009-03-10 12:17:57 +0000736}
737
738DEFUN(show_trx,
739 show_trx_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100740 "show trx [<0-255>] [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200741 SHOW_STR "Display information about a TRX\n"
742 "BTS Number\n"
743 "TRX Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000744{
Harald Weltedcccb182010-05-16 20:52:23 +0200745 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000746 struct gsm_bts *bts = NULL;
747 struct gsm_bts_trx *trx;
748 int bts_nr, trx_nr;
749
750 if (argc >= 1) {
751 /* use the BTS number that the user has specified */
752 bts_nr = atoi(argv[0]);
753 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000754 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000755 VTY_NEWLINE);
756 return CMD_WARNING;
757 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200758 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000759 }
760 if (argc >= 2) {
761 trx_nr = atoi(argv[1]);
762 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000763 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000764 VTY_NEWLINE);
765 return CMD_WARNING;
766 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200767 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000768 trx_dump_vty(vty, trx);
769 return CMD_SUCCESS;
770 }
771 if (bts) {
772 /* print all TRX in this BTS */
773 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200774 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000775 trx_dump_vty(vty, trx);
776 }
777 return CMD_SUCCESS;
778 }
779
780 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200781 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000782 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200783 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000784 trx_dump_vty(vty, trx);
785 }
786 }
787
788 return CMD_SUCCESS;
789}
790
Harald Welte67ce0732009-08-06 19:06:46 +0200791
Harald Welte68628e82009-03-10 12:17:57 +0000792static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
793{
Harald Welte135a6482011-05-30 12:09:13 +0200794 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, phys cfg %s, TSC %u",
Harald Welte026b4ca2010-12-24 12:12:10 +0100795 ts->trx->bts->nr, ts->trx->nr, ts->nr,
Harald Weltee972dba2013-03-08 07:44:45 +0000796 gsm_pchan_name(ts->pchan),
797 ts->tsc == -1 ? ts->trx->bts->tsc : ts->tsc);
Harald Weltecd103a92010-12-24 12:14:52 +0100798 if (ts->pchan == GSM_PCHAN_TCH_F_PDCH)
Harald Welteb29cea12010-12-24 12:26:13 +0100799 vty_out(vty, " (%s mode)",
Harald Weltecd103a92010-12-24 12:14:52 +0100800 ts->flags & TS_F_PDCH_MODE ? "PDCH" : "TCH/F");
801 vty_out(vty, "%s", VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000802 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200803 net_dump_nmstate(vty, &ts->mo.nm_state);
Harald Welte2c828992009-12-02 01:56:49 +0530804 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welteef235b52009-03-10 12:34:02 +0000805 vty_out(vty, " E1 Line %u, Timeslot %u, Subslot %u%s",
806 ts->e1_link.e1_nr, ts->e1_link.e1_ts,
807 ts->e1_link.e1_ts_ss, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000808}
809
810DEFUN(show_ts,
811 show_ts_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100812 "show timeslot [<0-255>] [<0-255>] [<0-7>]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200813 SHOW_STR "Display information about a TS\n"
814 "BTS Number\n" "TRX Number\n" "Timeslot Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000815{
Harald Weltedcccb182010-05-16 20:52:23 +0200816 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte274d0152010-12-24 12:05:03 +0100817 struct gsm_bts *bts = NULL;
818 struct gsm_bts_trx *trx = NULL;
819 struct gsm_bts_trx_ts *ts = NULL;
Harald Welte68628e82009-03-10 12:17:57 +0000820 int bts_nr, trx_nr, ts_nr;
821
822 if (argc >= 1) {
823 /* use the BTS number that the user has specified */
824 bts_nr = atoi(argv[0]);
825 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000826 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000827 VTY_NEWLINE);
828 return CMD_WARNING;
829 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200830 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000831 }
832 if (argc >= 2) {
833 trx_nr = atoi(argv[1]);
834 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000835 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000836 VTY_NEWLINE);
837 return CMD_WARNING;
838 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200839 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000840 }
841 if (argc >= 3) {
842 ts_nr = atoi(argv[2]);
843 if (ts_nr >= TRX_NR_TS) {
Harald Welte1bc77352009-03-10 19:47:51 +0000844 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
Harald Welte68628e82009-03-10 12:17:57 +0000845 VTY_NEWLINE);
846 return CMD_WARNING;
847 }
Harald Welte274d0152010-12-24 12:05:03 +0100848 /* Fully Specified: print and exit */
Harald Welte68628e82009-03-10 12:17:57 +0000849 ts = &trx->ts[ts_nr];
850 ts_dump_vty(vty, ts);
851 return CMD_SUCCESS;
852 }
Harald Welte274d0152010-12-24 12:05:03 +0100853
854 if (bts && trx) {
855 /* Iterate over all TS in this TRX */
856 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
857 ts = &trx->ts[ts_nr];
858 ts_dump_vty(vty, ts);
859 }
860 } else if (bts) {
861 /* Iterate over all TRX in this BTS, TS in each TRX */
Harald Welte68628e82009-03-10 12:17:57 +0000862 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200863 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000864 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
865 ts = &trx->ts[ts_nr];
866 ts_dump_vty(vty, ts);
867 }
868 }
Harald Welte274d0152010-12-24 12:05:03 +0100869 } else {
870 /* Iterate over all BTS, TRX in each BTS, TS in each TRX */
871 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
872 bts = gsm_bts_num(net, bts_nr);
873 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
874 trx = gsm_bts_trx_num(bts, trx_nr);
875 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
876 ts = &trx->ts[ts_nr];
877 ts_dump_vty(vty, ts);
878 }
879 }
880 }
Harald Welte68628e82009-03-10 12:17:57 +0000881 }
882
883 return CMD_SUCCESS;
884}
885
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100886static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte68628e82009-03-10 12:17:57 +0000887{
Harald Weltefcd24452009-06-20 18:15:19 +0200888 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte40f82892009-05-23 17:31:39 +0000889 subscr->authorized, VTY_NEWLINE);
Holger Hans Peter Freyther7f180e82013-12-12 15:45:41 +0100890 if (strlen(subscr->name))
Harald Welte1bc77352009-03-10 19:47:51 +0000891 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000892 if (subscr->extension)
893 vty_out(vty, " Extension: %s%s", subscr->extension,
894 VTY_NEWLINE);
Holger Hans Peter Freyther5ccd0152013-07-14 08:38:24 +0200895 vty_out(vty, " IMSI: %s%s", subscr->imsi, VTY_NEWLINE);
Holger Hans Peter Freyther22230252009-08-19 12:53:57 +0200896 if (subscr->tmsi != GSM_RESERVED_TMSI)
897 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte731fd912009-08-15 03:24:51 +0200898 VTY_NEWLINE);
Sylvain Munautaf292642009-12-27 19:29:28 +0100899
Harald Welte (local)15920de2009-08-14 20:27:16 +0200900 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000901}
902
Harald Welte8387a492009-12-22 21:43:14 +0100903static void meas_rep_dump_uni_vty(struct vty *vty,
904 struct gsm_meas_rep_unidir *mru,
905 const char *prefix,
906 const char *dir)
907{
908 vty_out(vty, "%s RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",
909 prefix, dir, rxlev2dbm(mru->full.rx_lev),
910 dir, rxlev2dbm(mru->sub.rx_lev));
911 vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",
912 dir, mru->full.rx_qual, dir, mru->sub.rx_qual,
913 VTY_NEWLINE);
914}
915
916static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,
917 const char *prefix)
918{
919 vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);
920 vty_out(vty, "%s Flags: %s%s%s%s%s", prefix,
921 mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",
922 mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",
923 mr->flags & MEAS_REP_F_FPC ? "FPC " : "",
924 mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",
925 VTY_NEWLINE);
926 if (mr->flags & MEAS_REP_F_MS_TO)
927 vty_out(vty, "%s MS Timing Offset: %u%s", prefix,
928 mr->ms_timing_offset, VTY_NEWLINE);
929 if (mr->flags & MEAS_REP_F_MS_L1)
930 vty_out(vty, "%s L1 MS Power: %u dBm, Timing Advance: %u%s",
931 prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);
932 if (mr->flags & MEAS_REP_F_DL_VALID)
933 meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");
934 meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");
935}
936
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +0800937static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte68628e82009-03-10 12:17:57 +0000938{
Harald Welte8387a492009-12-22 21:43:14 +0100939 int idx;
940
Harald Welte85bded82010-12-24 12:22:34 +0100941 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",
942 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
943 lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);
Holger Hans Peter Freyther40494552010-06-28 17:09:29 +0800944 vty_out(vty, " Connection: %u, State: %s%s",
945 lchan->conn ? 1: 0,
Harald Welte1887f9d2009-12-29 10:52:38 +0100946 gsm_lchans_name(lchan->state), VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100947 vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s",
948 lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
949 - lchan->bs_power*2,
950 ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),
951 VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +0800952 if (lchan->conn && lchan->conn->subscr) {
Harald Welte68628e82009-03-10 12:17:57 +0000953 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +0800954 subscr_dump_vty(vty, lchan->conn->subscr);
Harald Welte68628e82009-03-10 12:17:57 +0000955 } else
956 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte2c828992009-12-02 01:56:49 +0530957 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
958 struct in_addr ia;
Holger Hans Peter Freyther54fa7992010-04-07 15:39:16 +0200959 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte2c828992009-12-02 01:56:49 +0530960 vty_out(vty, " Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",
961 inet_ntoa(ia), lchan->abis_ip.bound_port,
962 lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,
963 VTY_NEWLINE);
964 }
Harald Welte8387a492009-12-22 21:43:14 +0100965
966 /* we want to report the last measurement report */
967 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
968 lchan->meas_rep_idx, 1);
969 meas_rep_dump_vty(vty, &lchan->meas_rep[idx], " ");
Harald Welte68628e82009-03-10 12:17:57 +0000970}
971
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +0800972static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
973{
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +0800974 struct gsm_meas_rep *mr;
975 int idx;
976
977 /* we want to report the last measurement report */
978 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
979 lchan->meas_rep_idx, 1);
980 mr = &lchan->meas_rep[idx];
981
Harald Welte85bded82010-12-24 12:22:34 +0100982 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u, Type %s - "
983 "L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
984 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
Harald Welteb29cea12010-12-24 12:26:13 +0100985 lchan->nr, gsm_lchant_name(lchan->type), mr->ms_l1.pwr,
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +0800986 rxlev2dbm(mr->dl.full.rx_lev),
987 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +0800988 VTY_NEWLINE);
989}
990
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +0100991
992static int dump_lchan_trx_ts(struct gsm_bts_trx_ts *ts, struct vty *vty,
993 void (*dump_cb)(struct vty *, struct gsm_lchan *))
994{
995 int lchan_nr;
996 for (lchan_nr = 0; lchan_nr < TS_MAX_LCHAN; lchan_nr++) {
997 struct gsm_lchan *lchan = &ts->lchan[lchan_nr];
998 if ((lchan->type == GSM_LCHAN_NONE) && (lchan->state == LCHAN_S_NONE))
999 continue;
1000 dump_cb(vty, lchan);
1001 }
1002
1003 return CMD_SUCCESS;
1004}
1005
1006static int dump_lchan_trx(struct gsm_bts_trx *trx, struct vty *vty,
1007 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1008{
1009 int ts_nr;
1010
1011 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
1012 struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
1013 dump_lchan_trx_ts(ts, vty, dump_cb);
1014 }
1015
1016 return CMD_SUCCESS;
1017}
1018
1019static int dump_lchan_bts(struct gsm_bts *bts, struct vty *vty,
1020 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1021{
1022 int trx_nr;
1023
1024 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
1025 struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, trx_nr);
1026 dump_lchan_trx(trx, vty, dump_cb);
1027 }
1028
1029 return CMD_SUCCESS;
1030}
1031
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001032static int lchan_summary(struct vty *vty, int argc, const char **argv,
1033 void (*dump_cb)(struct vty *, struct gsm_lchan *))
Harald Welte68628e82009-03-10 12:17:57 +00001034{
Harald Weltedcccb182010-05-16 20:52:23 +02001035 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +00001036 struct gsm_bts *bts;
1037 struct gsm_bts_trx *trx;
1038 struct gsm_bts_trx_ts *ts;
1039 struct gsm_lchan *lchan;
1040 int bts_nr, trx_nr, ts_nr, lchan_nr;
1041
1042 if (argc >= 1) {
1043 /* use the BTS number that the user has specified */
1044 bts_nr = atoi(argv[0]);
1045 if (bts_nr >= net->num_bts) {
1046 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1047 VTY_NEWLINE);
1048 return CMD_WARNING;
1049 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001050 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001051
1052 if (argc == 1)
1053 return dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001054 }
1055 if (argc >= 2) {
1056 trx_nr = atoi(argv[1]);
1057 if (trx_nr >= bts->num_trx) {
1058 vty_out(vty, "%% can't find TRX %s%s", argv[1],
1059 VTY_NEWLINE);
1060 return CMD_WARNING;
1061 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001062 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001063
1064 if (argc == 2)
1065 return dump_lchan_trx(trx, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001066 }
1067 if (argc >= 3) {
1068 ts_nr = atoi(argv[2]);
1069 if (ts_nr >= TRX_NR_TS) {
1070 vty_out(vty, "%% can't find TS %s%s", argv[2],
1071 VTY_NEWLINE);
1072 return CMD_WARNING;
1073 }
1074 ts = &trx->ts[ts_nr];
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001075
1076 if (argc == 3)
1077 return dump_lchan_trx_ts(ts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001078 }
1079 if (argc >= 4) {
1080 lchan_nr = atoi(argv[3]);
1081 if (lchan_nr >= TS_MAX_LCHAN) {
1082 vty_out(vty, "%% can't find LCHAN %s%s", argv[3],
1083 VTY_NEWLINE);
1084 return CMD_WARNING;
1085 }
1086 lchan = &ts->lchan[lchan_nr];
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001087 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +00001088 return CMD_SUCCESS;
1089 }
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001090
1091
Harald Welte68628e82009-03-10 12:17:57 +00001092 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001093 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001094 dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001095 }
1096
1097 return CMD_SUCCESS;
1098}
1099
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001100
1101DEFUN(show_lchan,
1102 show_lchan_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001103 "show lchan [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001104 SHOW_STR "Display information about a logical channel\n"
1105 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001106 LCHAN_NR_STR)
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001107
1108{
1109 return lchan_summary(vty, argc, argv, lchan_dump_full_vty);
1110}
1111
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001112DEFUN(show_lchan_summary,
1113 show_lchan_summary_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001114 "show lchan summary [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001115 SHOW_STR "Display information about a logical channel\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001116 "Short summary\n"
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001117 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001118 LCHAN_NR_STR)
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001119{
1120 return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
1121}
1122
Harald Weltebe4b7302009-05-23 16:59:33 +00001123static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
Harald Weltef5025b62009-03-28 16:55:11 +00001124{
1125 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
1126 subscr_dump_vty(vty, pag->subscr);
1127}
1128
Harald Weltebe4b7302009-05-23 16:59:33 +00001129static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
Harald Weltef5025b62009-03-28 16:55:11 +00001130{
1131 struct gsm_paging_request *pag;
1132
Holger Hans Peter Freyther9b5192b2013-03-03 11:03:17 +01001133 if (!bts->paging.bts)
1134 return;
1135
Harald Weltef5025b62009-03-28 16:55:11 +00001136 llist_for_each_entry(pag, &bts->paging.pending_requests, entry)
1137 paging_dump_vty(vty, pag);
1138}
1139
1140DEFUN(show_paging,
1141 show_paging_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001142 "show paging [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +02001143 SHOW_STR "Display information about paging reuqests of a BTS\n"
1144 "BTS Number\n")
Harald Weltef5025b62009-03-28 16:55:11 +00001145{
Harald Weltedcccb182010-05-16 20:52:23 +02001146 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Weltef5025b62009-03-28 16:55:11 +00001147 struct gsm_bts *bts;
1148 int bts_nr;
1149
1150 if (argc >= 1) {
1151 /* use the BTS number that the user has specified */
1152 bts_nr = atoi(argv[0]);
1153 if (bts_nr >= net->num_bts) {
1154 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1155 VTY_NEWLINE);
1156 return CMD_WARNING;
1157 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001158 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001159 bts_paging_dump_vty(vty, bts);
1160
1161 return CMD_SUCCESS;
1162 }
1163 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001164 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001165 bts_paging_dump_vty(vty, bts);
1166 }
1167
1168 return CMD_SUCCESS;
1169}
1170
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01001171DEFUN(show_paging_group,
1172 show_paging_group_cmd,
1173 "show paging-group <0-255> IMSI",
1174 SHOW_STR "Display the paging group\n"
1175 "BTS Number\n" "IMSI\n")
1176{
1177 struct gsm_network *net = gsmnet_from_vty(vty);
1178 struct gsm_bts *bts;
1179 unsigned int page_group;
1180 int bts_nr = atoi(argv[0]);
1181
1182 if (bts_nr >= net->num_bts) {
1183 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1184 return CMD_WARNING;
1185 }
1186
1187 bts = gsm_bts_num(net, bts_nr);
1188 if (!bts) {
1189 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1190 return CMD_WARNING;
1191 }
1192
1193 page_group = gsm0502_calc_paging_group(&bts->si_common.chan_desc,
1194 str_to_imsi(argv[1]));
1195 vty_out(vty, "%%Paging group for IMSI %" PRIu64 " on BTS #%d is %u%s",
1196 str_to_imsi(argv[1]), bts->nr,
1197 page_group, VTY_NEWLINE);
1198 return CMD_SUCCESS;
1199}
1200
Harald Welte5013b2a2009-08-07 13:29:14 +02001201DEFUN(cfg_net,
1202 cfg_net_cmd,
Harald Welte8f0ed552010-05-11 21:53:49 +02001203 "network", NETWORK_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001204{
Harald Weltedcccb182010-05-16 20:52:23 +02001205 vty->index = gsmnet_from_vty(vty);
Harald Welte5013b2a2009-08-07 13:29:14 +02001206 vty->node = GSMNET_NODE;
1207
1208 return CMD_SUCCESS;
1209}
1210
Harald Welte5013b2a2009-08-07 13:29:14 +02001211DEFUN(cfg_net_ncc,
1212 cfg_net_ncc_cmd,
1213 "network country code <1-999>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001214 "Set the GSM network country code\n"
1215 "Country commands\n"
1216 CODE_CMD_STR
1217 "Network Country Code to use\n")
Harald Welte5013b2a2009-08-07 13:29:14 +02001218{
Harald Weltedcccb182010-05-16 20:52:23 +02001219 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1220
Harald Welte5013b2a2009-08-07 13:29:14 +02001221 gsmnet->country_code = atoi(argv[0]);
1222
1223 return CMD_SUCCESS;
1224}
1225
1226DEFUN(cfg_net_mnc,
1227 cfg_net_mnc_cmd,
Dieter Spaar402cced2011-07-27 23:43:56 +02001228 "mobile network code <0-999>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001229 "Set the GSM mobile network code\n"
1230 "Network Commands\n"
1231 CODE_CMD_STR
1232 "Mobile Network Code to use\n")
Harald Welte5013b2a2009-08-07 13:29:14 +02001233{
Harald Weltedcccb182010-05-16 20:52:23 +02001234 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1235
Harald Welte5013b2a2009-08-07 13:29:14 +02001236 gsmnet->network_code = atoi(argv[0]);
1237
1238 return CMD_SUCCESS;
1239}
1240
1241DEFUN(cfg_net_name_short,
1242 cfg_net_name_short_cmd,
1243 "short name NAME",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001244 "Set the short GSM network name\n" NAME_CMD_STR NAME_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001245{
Harald Weltedcccb182010-05-16 20:52:23 +02001246 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1247
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +02001248 bsc_replace_string(gsmnet, &gsmnet->name_short, argv[0]);
Harald Welte5013b2a2009-08-07 13:29:14 +02001249 return CMD_SUCCESS;
1250}
1251
1252DEFUN(cfg_net_name_long,
1253 cfg_net_name_long_cmd,
1254 "long name NAME",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001255 "Set the long GSM network name\n" NAME_CMD_STR NAME_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001256{
Harald Weltedcccb182010-05-16 20:52:23 +02001257 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1258
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +02001259 bsc_replace_string(gsmnet, &gsmnet->name_long, argv[0]);
Harald Welte5013b2a2009-08-07 13:29:14 +02001260 return CMD_SUCCESS;
1261}
Harald Welte40f82892009-05-23 17:31:39 +00001262
Harald Welte (local)69de3972009-08-12 14:42:23 +02001263DEFUN(cfg_net_auth_policy,
1264 cfg_net_auth_policy_cmd,
1265 "auth policy (closed|accept-all|token)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001266 "Authentication (not cryptographic)\n"
1267 "Set the GSM network authentication policy\n"
1268 "Require the MS to be activated in HLR\n"
1269 "Accept all MS, whether in HLR or not\n"
1270 "Use SMS-token based authentication\n")
Harald Welte (local)69de3972009-08-12 14:42:23 +02001271{
1272 enum gsm_auth_policy policy = gsm_auth_policy_parse(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001273 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte (local)69de3972009-08-12 14:42:23 +02001274
1275 gsmnet->auth_policy = policy;
1276
1277 return CMD_SUCCESS;
1278}
1279
Harald Welte1085c092009-11-18 20:33:19 +01001280DEFUN(cfg_net_reject_cause,
1281 cfg_net_reject_cause_cmd,
1282 "location updating reject cause <2-111>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001283 "Set the reject cause of location updating reject\n"
1284 "Set the reject cause of location updating reject\n"
1285 "Set the reject cause of location updating reject\n"
1286 "Set the reject cause of location updating reject\n"
1287 "Cause Value as Per GSM TS 04.08\n")
Harald Welte1085c092009-11-18 20:33:19 +01001288{
Harald Weltedcccb182010-05-16 20:52:23 +02001289 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1290
Harald Welte1085c092009-11-18 20:33:19 +01001291 gsmnet->reject_cause = atoi(argv[0]);
1292
1293 return CMD_SUCCESS;
1294}
1295
Harald Welte4381cfe2009-08-30 15:47:06 +09001296DEFUN(cfg_net_encryption,
1297 cfg_net_encryption_cmd,
Harald Weltead66a2d2012-07-04 21:37:56 +02001298 "encryption a5 (0|1|2|3)",
Harald Welte28326062010-05-14 20:05:17 +02001299 "Encryption options\n"
1300 "A5 encryption\n" "A5/0: No encryption\n"
Harald Weltead66a2d2012-07-04 21:37:56 +02001301 "A5/1: Encryption\n" "A5/2: Export-grade Encryption\n"
1302 "A5/3: 'New' Secure Encryption\n")
Harald Welte4381cfe2009-08-30 15:47:06 +09001303{
Harald Weltedcccb182010-05-16 20:52:23 +02001304 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1305
Andreas.Eversberg1059deb2009-11-17 09:55:26 +01001306 gsmnet->a5_encryption= atoi(argv[0]);
Harald Welte4381cfe2009-08-30 15:47:06 +09001307
1308 return CMD_SUCCESS;
1309}
1310
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001311DEFUN(cfg_net_neci,
1312 cfg_net_neci_cmd,
1313 "neci (0|1)",
Harald Welte28326062010-05-14 20:05:17 +02001314 "New Establish Cause Indication\n"
1315 "Don't set the NECI bit\n" "Set the NECI bit\n")
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001316{
Harald Weltedcccb182010-05-16 20:52:23 +02001317 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1318
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001319 gsmnet->neci = atoi(argv[0]);
Holger Hans Peter Freyther78891072010-09-06 09:36:02 +08001320 gsm_net_update_ctype(gsmnet);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001321 return CMD_SUCCESS;
1322}
1323
Harald Welteeab84a12009-12-13 10:53:12 +01001324DEFUN(cfg_net_rrlp_mode, cfg_net_rrlp_mode_cmd,
1325 "rrlp mode (none|ms-based|ms-preferred|ass-preferred)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001326 "Radio Resource Location Protocol\n"
1327 "Set the Radio Resource Location Protocol Mode\n"
1328 "Don't send RRLP request\n"
1329 "Request MS-based location\n"
1330 "Request any location, prefer MS-based\n"
1331 "Request any location, prefer MS-assisted\n")
Harald Welteeab84a12009-12-13 10:53:12 +01001332{
Harald Weltedcccb182010-05-16 20:52:23 +02001333 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1334
Harald Welteeab84a12009-12-13 10:53:12 +01001335 gsmnet->rrlp.mode = rrlp_mode_parse(argv[0]);
1336
1337 return CMD_SUCCESS;
1338}
1339
Harald Welte648b6ce2009-12-14 09:00:24 +01001340DEFUN(cfg_net_mm_info, cfg_net_mm_info_cmd,
1341 "mm info (0|1)",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001342 "Mobility Management\n"
1343 "Send MM INFO after LOC UPD ACCEPT\n"
1344 "Disable\n" "Enable\n")
Harald Welte648b6ce2009-12-14 09:00:24 +01001345{
Harald Weltedcccb182010-05-16 20:52:23 +02001346 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1347
Harald Welte648b6ce2009-12-14 09:00:24 +01001348 gsmnet->send_mm_info = atoi(argv[0]);
1349
1350 return CMD_SUCCESS;
1351}
1352
Harald Welte8f0ed552010-05-11 21:53:49 +02001353#define HANDOVER_STR "Handover Options\n"
1354
Harald Weltebc814502009-12-19 21:41:52 +01001355DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1356 "handover (0|1)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001357 HANDOVER_STR
1358 "Don't perform in-call handover\n"
1359 "Perform in-call handover\n")
Harald Weltebc814502009-12-19 21:41:52 +01001360{
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001361 int enable = atoi(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001362 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001363
1364 if (enable && ipacc_rtp_direct) {
Harald Weltefe03f0d2009-12-20 13:51:01 +01001365 vty_out(vty, "%% Cannot enable handover unless RTP Proxy mode "
1366 "is enabled by using the -P command line option%s",
1367 VTY_NEWLINE);
1368 return CMD_WARNING;
1369 }
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001370 gsmnet->handover.active = enable;
Harald Weltebc814502009-12-19 21:41:52 +01001371
1372 return CMD_SUCCESS;
1373}
1374
Harald Welte8f0ed552010-05-11 21:53:49 +02001375#define HO_WIN_STR HANDOVER_STR "Measurement Window\n"
1376#define HO_WIN_RXLEV_STR HO_WIN_STR "Received Level Averaging\n"
1377#define HO_WIN_RXQUAL_STR HO_WIN_STR "Received Quality Averaging\n"
1378#define HO_PBUDGET_STR HANDOVER_STR "Power Budget\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001379#define HO_AVG_COUNT_STR "Amount to use for Averaging\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001380
Harald Welteb720bd32009-12-21 16:51:50 +01001381DEFUN(cfg_net_ho_win_rxlev_avg, cfg_net_ho_win_rxlev_avg_cmd,
1382 "handover window rxlev averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001383 HO_WIN_RXLEV_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001384 "How many RxLev measurements are used for averaging\n"
1385 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001386{
Harald Weltedcccb182010-05-16 20:52:23 +02001387 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001388 gsmnet->handover.win_rxlev_avg = atoi(argv[0]);
1389 return CMD_SUCCESS;
1390}
1391
1392DEFUN(cfg_net_ho_win_rxqual_avg, cfg_net_ho_win_rxqual_avg_cmd,
1393 "handover window rxqual averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001394 HO_WIN_RXQUAL_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001395 "How many RxQual measurements are used for averaging\n"
1396 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001397{
Harald Weltedcccb182010-05-16 20:52:23 +02001398 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001399 gsmnet->handover.win_rxqual_avg = atoi(argv[0]);
1400 return CMD_SUCCESS;
1401}
1402
1403DEFUN(cfg_net_ho_win_rxlev_neigh_avg, cfg_net_ho_win_rxlev_avg_neigh_cmd,
1404 "handover window rxlev neighbor averaging <1-10>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001405 HO_WIN_RXLEV_STR "Neighbor\n"
1406 "How many RxQual measurements are used for averaging\n"
1407 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001408{
Harald Weltedcccb182010-05-16 20:52:23 +02001409 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001410 gsmnet->handover.win_rxlev_avg_neigh = atoi(argv[0]);
1411 return CMD_SUCCESS;
1412}
1413
1414DEFUN(cfg_net_ho_pwr_interval, cfg_net_ho_pwr_interval_cmd,
1415 "handover power budget interval <1-99>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001416 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001417 "How often to check if we have a better cell (SACCH frames)\n"
1418 "Interval\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001419{
Harald Weltedcccb182010-05-16 20:52:23 +02001420 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001421 gsmnet->handover.pwr_interval = atoi(argv[0]);
1422 return CMD_SUCCESS;
1423}
1424
1425DEFUN(cfg_net_ho_pwr_hysteresis, cfg_net_ho_pwr_hysteresis_cmd,
1426 "handover power budget hysteresis <0-999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001427 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001428 "How many dB does a neighbor to be stronger to become a HO candidate\n"
1429 "Hysteresis\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001430{
Harald Weltedcccb182010-05-16 20:52:23 +02001431 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001432 gsmnet->handover.pwr_hysteresis = atoi(argv[0]);
1433 return CMD_SUCCESS;
1434}
1435
1436DEFUN(cfg_net_ho_max_distance, cfg_net_ho_max_distance_cmd,
1437 "handover maximum distance <0-9999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001438 HANDOVER_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001439 "How big is the maximum timing advance before HO is forced\n"
1440 "Distance\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001441{
Harald Weltedcccb182010-05-16 20:52:23 +02001442 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001443 gsmnet->handover.max_distance = atoi(argv[0]);
1444 return CMD_SUCCESS;
1445}
Harald Weltebc814502009-12-19 21:41:52 +01001446
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001447DEFUN(cfg_net_pag_any_tch,
1448 cfg_net_pag_any_tch_cmd,
1449 "paging any use tch (0|1)",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001450 "Assign a TCH when receiving a Paging Any request\n"
1451 "Any Channel\n" "Use\n" "TCH\n"
1452 "Do not use TCH for Paging Request Any\n"
1453 "Do use TCH for Paging Request Any\n")
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001454{
Holger Hans Peter Freytherb0e88b82010-09-06 10:09:19 +08001455 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001456 gsmnet->pag_any_tch = atoi(argv[0]);
1457 gsm_net_update_ctype(gsmnet);
1458 return CMD_SUCCESS;
1459}
1460
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001461#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001462 DEFUN(cfg_net_T##number, \
1463 cfg_net_T##number##_cmd, \
1464 "timer t" #number " <0-65535>", \
Harald Welte8f0ed552010-05-11 21:53:49 +02001465 "Configure GSM Timers\n" \
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001466 doc "Timer Value\n") \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001467{ \
Harald Weltedcccb182010-05-16 20:52:23 +02001468 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001469 int value = atoi(argv[0]); \
1470 \
1471 if (value < 0 || value > 65535) { \
1472 vty_out(vty, "Timer value %s out of range.%s", \
1473 argv[0], VTY_NEWLINE); \
1474 return CMD_WARNING; \
1475 } \
1476 \
1477 gsmnet->T##number = value; \
1478 return CMD_SUCCESS; \
1479}
1480
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001481DECLARE_TIMER(3101, "Set the timeout value for IMMEDIATE ASSIGNMENT.\n")
1482DECLARE_TIMER(3103, "Set the timeout value for HANDOVER.\n")
Harald Welte67161f22012-06-03 13:01:47 +02001483DECLARE_TIMER(3105, "Set the timer for repetition of PHYSICAL INFORMATION.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001484DECLARE_TIMER(3107, "Currently not used.\n")
Holger Hans Peter Freytherb3489392011-12-28 16:21:05 +01001485DECLARE_TIMER(3109, "Set the RSL SACCH deactivation timeout.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001486DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.\n")
1487DECLARE_TIMER(3113, "Set the time to try paging a subscriber.\n")
1488DECLARE_TIMER(3115, "Currently not used.\n")
1489DECLARE_TIMER(3117, "Currently not used.\n")
1490DECLARE_TIMER(3119, "Currently not used.\n")
1491DECLARE_TIMER(3122, "Waiting time (seconds) after IMM ASS REJECT\n")
1492DECLARE_TIMER(3141, "Currently not used.\n")
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001493
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001494DEFUN(cfg_net_dtx,
1495 cfg_net_dtx_cmd,
1496 "dtx-used (0|1)",
1497 "Enable the usage of DTX.\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001498 "DTX is disabled\n" "DTX is enabled\n")
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001499{
1500 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1501 gsmnet->dtx_enabled = atoi(argv[0]);
1502 return CMD_SUCCESS;
1503}
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001504
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +01001505DEFUN(cfg_net_subscr_keep,
1506 cfg_net_subscr_keep_cmd,
1507 "subscriber-keep-in-ram (0|1)",
1508 "Keep unused subscribers in RAM.\n"
1509 "Delete unused subscribers\n" "Keep unused subscribers\n")
1510{
1511 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1512 gsmnet->keep_subscr = atoi(argv[0]);
1513 return CMD_SUCCESS;
1514}
1515
Harald Welte5258fc42009-03-28 19:07:53 +00001516/* per-BTS configuration */
1517DEFUN(cfg_bts,
1518 cfg_bts_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02001519 "bts <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001520 "Select a BTS to configure\n"
1521 "BTS Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001522{
Harald Weltedcccb182010-05-16 20:52:23 +02001523 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte5258fc42009-03-28 19:07:53 +00001524 int bts_nr = atoi(argv[0]);
1525 struct gsm_bts *bts;
1526
Harald Weltee441d9c2009-06-21 16:17:15 +02001527 if (bts_nr > gsmnet->num_bts) {
1528 vty_out(vty, "%% The next unused BTS number is %u%s",
1529 gsmnet->num_bts, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00001530 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02001531 } else if (bts_nr == gsmnet->num_bts) {
1532 /* allocate a new one */
Harald Welte3300c012011-06-05 13:31:33 +02001533 bts = gsm_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,
1534 HARDCODED_TSC, HARDCODED_BSIC);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02001535 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02001536 bts = gsm_bts_num(gsmnet, bts_nr);
1537
Daniel Willmannf15c2762010-01-11 13:43:07 +01001538 if (!bts) {
1539 vty_out(vty, "%% Unable to allocate BTS %u%s",
1540 gsmnet->num_bts, VTY_NEWLINE);
Harald Weltee441d9c2009-06-21 16:17:15 +02001541 return CMD_WARNING;
Daniel Willmannf15c2762010-01-11 13:43:07 +01001542 }
Harald Welte5258fc42009-03-28 19:07:53 +00001543
1544 vty->index = bts;
Harald Welte197dea92010-05-14 17:59:53 +02001545 vty->index_sub = &bts->description;
Harald Welte5258fc42009-03-28 19:07:53 +00001546 vty->node = BTS_NODE;
1547
1548 return CMD_SUCCESS;
1549}
1550
1551DEFUN(cfg_bts_type,
1552 cfg_bts_type_cmd,
Harald Weltee555c2b2012-08-17 13:02:12 +02001553 "type TYPE", /* dynamically created */
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001554 "Set the BTS type\n" "Type\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001555{
1556 struct gsm_bts *bts = vty->index;
Harald Welte39315c42010-01-10 18:01:52 +01001557 int rc;
Harald Welte5258fc42009-03-28 19:07:53 +00001558
Harald Welte39315c42010-01-10 18:01:52 +01001559 rc = gsm_set_bts_type(bts, parse_btstype(argv[0]));
1560 if (rc < 0)
1561 return CMD_WARNING;
Harald Welte8175e952009-10-20 00:22:00 +02001562
Harald Welte5258fc42009-03-28 19:07:53 +00001563 return CMD_SUCCESS;
1564}
1565
Harald Weltefcd24452009-06-20 18:15:19 +02001566DEFUN(cfg_bts_band,
1567 cfg_bts_band_cmd,
1568 "band BAND",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001569 "Set the frequency band of this BTS\n" "Frequency band\n")
Harald Weltefcd24452009-06-20 18:15:19 +02001570{
1571 struct gsm_bts *bts = vty->index;
Harald Welte42581822009-08-08 16:12:58 +02001572 int band = gsm_band_parse(argv[0]);
Harald Weltefcd24452009-06-20 18:15:19 +02001573
1574 if (band < 0) {
1575 vty_out(vty, "%% BAND %d is not a valid GSM band%s",
1576 band, VTY_NEWLINE);
1577 return CMD_WARNING;
1578 }
1579
1580 bts->band = band;
1581
1582 return CMD_SUCCESS;
1583}
1584
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001585DEFUN(cfg_bts_ci,
1586 cfg_bts_ci_cmd,
1587 "cell_identity <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001588 "Set the Cell identity of this BTS\n" "Cell Identity\n")
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001589{
1590 struct gsm_bts *bts = vty->index;
1591 int ci = atoi(argv[0]);
1592
1593 if (ci < 0 || ci > 0xffff) {
1594 vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s",
1595 ci, VTY_NEWLINE);
1596 return CMD_WARNING;
1597 }
1598 bts->cell_identity = ci;
1599
1600 return CMD_SUCCESS;
1601}
1602
Harald Welte5258fc42009-03-28 19:07:53 +00001603DEFUN(cfg_bts_lac,
1604 cfg_bts_lac_cmd,
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001605 "location_area_code <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001606 "Set the Location Area Code (LAC) of this BTS\n" "LAC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001607{
1608 struct gsm_bts *bts = vty->index;
1609 int lac = atoi(argv[0]);
1610
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001611 if (lac < 0 || lac > 0xffff) {
1612 vty_out(vty, "%% LAC %d is not in the valid range (0-65535)%s",
Harald Welte5258fc42009-03-28 19:07:53 +00001613 lac, VTY_NEWLINE);
1614 return CMD_WARNING;
1615 }
Holger Hans Peter Freythere48b9562009-10-01 04:07:15 +02001616
1617 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
1618 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
1619 lac, VTY_NEWLINE);
1620 return CMD_WARNING;
1621 }
1622
Harald Welte5258fc42009-03-28 19:07:53 +00001623 bts->location_area_code = lac;
1624
1625 return CMD_SUCCESS;
1626}
1627
Harald Weltea43f7892009-12-01 18:04:30 +05301628
Harald Welte5258fc42009-03-28 19:07:53 +00001629DEFUN(cfg_bts_tsc,
1630 cfg_bts_tsc_cmd,
Harald Weltec513ded2012-05-31 10:57:08 +02001631 "training_sequence_code <0-7>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001632 "Set the Training Sequence Code (TSC) of this BTS\n" "TSC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001633{
1634 struct gsm_bts *bts = vty->index;
1635 int tsc = atoi(argv[0]);
1636
Harald Welte5258fc42009-03-28 19:07:53 +00001637 bts->tsc = tsc;
1638
1639 return CMD_SUCCESS;
1640}
1641
Harald Welte78f2f502009-05-23 16:56:52 +00001642DEFUN(cfg_bts_bsic,
1643 cfg_bts_bsic_cmd,
1644 "base_station_id_code <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001645 "Set the Base Station Identity Code (BSIC) of this BTS\n"
1646 "BSIC of this BTS\n")
Harald Welte78f2f502009-05-23 16:56:52 +00001647{
1648 struct gsm_bts *bts = vty->index;
1649 int bsic = atoi(argv[0]);
1650
1651 if (bsic < 0 || bsic > 0x3f) {
Harald Welte42581822009-08-08 16:12:58 +02001652 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte78f2f502009-05-23 16:56:52 +00001653 bsic, VTY_NEWLINE);
1654 return CMD_WARNING;
1655 }
1656 bts->bsic = bsic;
1657
1658 return CMD_SUCCESS;
1659}
1660
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001661DEFUN(cfg_bts_timezone,
1662 cfg_bts_timezone_cmd,
1663 "timezone <-19-19> (0|15|30|45)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001664 "Set the Timezone Offset of this BTS\n"
1665 "Timezone offset (hours)\n"
1666 "Timezone offset (00 minutes)\n"
1667 "Timezone offset (15 minutes)\n"
1668 "Timezone offset (30 minutes)\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02001669 "Timezone offset (45 minutes)\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001670 )
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001671{
1672 struct gsm_bts *bts = vty->index;
1673 int tzhr = atoi(argv[0]);
1674 int tzmn = atoi(argv[1]);
1675
Harald Welte45f91712012-07-08 16:48:11 +02001676 bts->tz.hr = tzhr;
1677 bts->tz.mn = tzmn;
Jacob Erlbeck946d1412013-09-17 13:59:29 +02001678 bts->tz.dst = 0;
1679 bts->tz.override = 1;
1680
1681 return CMD_SUCCESS;
1682}
1683
1684DEFUN(cfg_bts_timezone_dst,
1685 cfg_bts_timezone_dst_cmd,
1686 "timezone <-19-19> (0|15|30|45) <0-2>",
1687 "Set the Timezone Offset of this BTS\n"
1688 "Timezone offset (hours)\n"
1689 "Timezone offset (00 minutes)\n"
1690 "Timezone offset (15 minutes)\n"
1691 "Timezone offset (30 minutes)\n"
1692 "Timezone offset (45 minutes)\n"
1693 "DST offset (hours)\n"
1694 )
1695{
1696 struct gsm_bts *bts = vty->index;
1697 int tzhr = atoi(argv[0]);
1698 int tzmn = atoi(argv[1]);
1699 int tzdst = atoi(argv[2]);
1700
1701 bts->tz.hr = tzhr;
1702 bts->tz.mn = tzmn;
1703 bts->tz.dst = tzdst;
Harald Welte45f91712012-07-08 16:48:11 +02001704 bts->tz.override = 1;
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001705
1706 return CMD_SUCCESS;
1707}
1708
1709DEFUN(cfg_bts_no_timezone,
1710 cfg_bts_no_timezone_cmd,
1711 "no timezone",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001712 NO_STR
1713 "Disable BTS specific timezone\n")
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001714{
1715 struct gsm_bts *bts = vty->index;
Harald Welte45f91712012-07-08 16:48:11 +02001716
1717 bts->tz.override = 0;
1718
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001719 return CMD_SUCCESS;
1720}
Harald Welte78f2f502009-05-23 16:56:52 +00001721
Harald Welte4cc34222009-05-01 15:12:31 +00001722DEFUN(cfg_bts_unit_id,
1723 cfg_bts_unit_id_cmd,
Harald Welte07dc73d2009-08-07 13:27:09 +02001724 "ip.access unit_id <0-65534> <0-255>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001725 "Abis/IP specific options\n"
1726 "Set the IPA BTS Unit ID\n"
1727 "Unit ID (Site)\n"
1728 "Unit ID (BTS)\n")
Harald Welte4cc34222009-05-01 15:12:31 +00001729{
1730 struct gsm_bts *bts = vty->index;
1731 int site_id = atoi(argv[0]);
1732 int bts_id = atoi(argv[1]);
1733
Harald Welte07dc73d2009-08-07 13:27:09 +02001734 if (!is_ipaccess_bts(bts)) {
1735 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1736 return CMD_WARNING;
1737 }
1738
Harald Welte4cc34222009-05-01 15:12:31 +00001739 bts->ip_access.site_id = site_id;
1740 bts->ip_access.bts_id = bts_id;
1741
1742 return CMD_SUCCESS;
1743}
1744
Harald Welte8b291802013-03-12 13:57:05 +01001745DEFUN(cfg_bts_rsl_ip,
1746 cfg_bts_rsl_ip_cmd,
1747 "ip.access rsl-ip A.B.C.D",
1748 "Abis/IP specific options\n"
1749 "Set the IPA RSL IP Address of the BSC\n"
1750 "Destination IP address for RSL connection\n")
1751{
1752 struct gsm_bts *bts = vty->index;
1753 struct in_addr ia;
1754
1755 if (!is_ipaccess_bts(bts)) {
1756 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1757 return CMD_WARNING;
1758 }
1759
1760 inet_aton(argv[0], &ia);
1761 bts->ip_access.rsl_ip = ntohl(ia.s_addr);
1762
1763 return CMD_SUCCESS;
1764}
1765
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001766#define NOKIA_STR "Nokia *Site related commands\n"
Harald Welte8b291802013-03-12 13:57:05 +01001767
Sylvain Munautc9519462011-10-17 14:04:55 +02001768DEFUN(cfg_bts_nokia_site_skip_reset,
1769 cfg_bts_nokia_site_skip_reset_cmd,
1770 "nokia_site skip-reset (0|1)",
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001771 NOKIA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001772 "Skip the reset step during bootstrap process of this BTS\n"
1773 "Do NOT skip the reset\n" "Skip the reset\n")
Sylvain Munautc9519462011-10-17 14:04:55 +02001774{
1775 struct gsm_bts *bts = vty->index;
1776
1777 if (bts->type != GSM_BTS_TYPE_NOKIA_SITE) {
1778 vty_out(vty, "%% BTS is not of Nokia *Site type%s", VTY_NEWLINE);
1779 return CMD_WARNING;
1780 }
1781
1782 bts->nokia.skip_reset = atoi(argv[0]);
1783
1784 return CMD_SUCCESS;
1785}
1786
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001787DEFUN(cfg_bts_nokia_site_no_loc_rel_cnf,
1788 cfg_bts_nokia_site_no_loc_rel_cnf_cmd,
1789 "nokia_site no-local-rel-conf (0|1)",
1790 NOKIA_STR
1791 "Do not wait for RELease CONFirm message when releasing channel locally\n"
1792 "Wait for RELease CONFirm\n" "Do not wait for RELease CONFirm\n")
1793{
1794 struct gsm_bts *bts = vty->index;
1795
1796 if (!is_nokia_bts(bts)) {
1797 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1798 VTY_NEWLINE);
1799 return CMD_WARNING;
1800 }
1801
1802 bts->nokia.no_loc_rel_cnf = atoi(argv[0]);
1803
1804 return CMD_SUCCESS;
1805}
1806
Harald Welte8f0ed552010-05-11 21:53:49 +02001807#define OML_STR "Organization & Maintenance Link\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001808#define IPA_STR "A-bis/IP Specific Options\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001809
Harald Welte8175e952009-10-20 00:22:00 +02001810DEFUN(cfg_bts_stream_id,
1811 cfg_bts_stream_id_cmd,
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001812 "oml ip.access stream_id <0-255> line E1_LINE",
Harald Welte8f0ed552010-05-11 21:53:49 +02001813 OML_STR IPA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001814 "Set the ip.access Stream ID of the OML link of this BTS\n"
1815 "Stream Identifier\n" "Virtual E1 Line Number\n" "Virtual E1 Line Number\n")
Harald Welte8175e952009-10-20 00:22:00 +02001816{
1817 struct gsm_bts *bts = vty->index;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001818 int stream_id = atoi(argv[0]), linenr = atoi(argv[1]);
Harald Welte8175e952009-10-20 00:22:00 +02001819
1820 if (!is_ipaccess_bts(bts)) {
1821 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1822 return CMD_WARNING;
1823 }
1824
1825 bts->oml_tei = stream_id;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001826 /* This is used by e1inp_bind_ops callback for each BTS model. */
1827 bts->oml_e1_link.e1_nr = linenr;
1828
1829 return CMD_SUCCESS;
1830}
1831
Harald Welted13e0cd2012-08-17 09:52:03 +02001832#define OML_E1_STR OML_STR "OML E1/T1 Configuration\n"
Harald Welte8175e952009-10-20 00:22:00 +02001833
Harald Welte42581822009-08-08 16:12:58 +02001834DEFUN(cfg_bts_oml_e1,
1835 cfg_bts_oml_e1_cmd,
1836 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welted13e0cd2012-08-17 09:52:03 +02001837 OML_E1_STR
1838 "E1/T1 line number to be used for OML\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001839 "E1/T1 line number to be used for OML\n"
1840 "E1/T1 timeslot to be used for OML\n"
1841 "E1/T1 timeslot to be used for OML\n"
1842 "E1/T1 sub-slot to be used for OML\n"
1843 "Use E1/T1 sub-slot 0\n"
1844 "Use E1/T1 sub-slot 1\n"
1845 "Use E1/T1 sub-slot 2\n"
1846 "Use E1/T1 sub-slot 3\n"
1847 "Use full E1 slot 3\n"
1848 )
Harald Welte42581822009-08-08 16:12:58 +02001849{
1850 struct gsm_bts *bts = vty->index;
1851
1852 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
1853
1854 return CMD_SUCCESS;
1855}
1856
1857
1858DEFUN(cfg_bts_oml_e1_tei,
1859 cfg_bts_oml_e1_tei_cmd,
1860 "oml e1 tei <0-63>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001861 OML_E1_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001862 "Set the TEI to be used for OML\n"
1863 "TEI Number\n")
Harald Welte42581822009-08-08 16:12:58 +02001864{
1865 struct gsm_bts *bts = vty->index;
1866
1867 bts->oml_tei = atoi(argv[0]);
1868
1869 return CMD_SUCCESS;
1870}
1871
Harald Welte7a8fa412009-08-10 13:48:16 +02001872DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1873 "channel allocator (ascending|descending)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001874 "Channnel Allocator\n" "Channel Allocator\n"
1875 "Allocate Timeslots and Transceivers in ascending order\n"
1876 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte7a8fa412009-08-10 13:48:16 +02001877{
1878 struct gsm_bts *bts = vty->index;
1879
1880 if (!strcmp(argv[0], "ascending"))
1881 bts->chan_alloc_reverse = 0;
1882 else
1883 bts->chan_alloc_reverse = 1;
1884
1885 return CMD_SUCCESS;
1886}
1887
Harald Welte8f0ed552010-05-11 21:53:49 +02001888#define RACH_STR "Random Access Control Channel\n"
1889
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001890DEFUN(cfg_bts_rach_tx_integer,
1891 cfg_bts_rach_tx_integer_cmd,
1892 "rach tx integer <0-15>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001893 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001894 "Set the raw tx integer value in RACH Control parameters IE\n"
1895 "Set the raw tx integer value in RACH Control parameters IE\n"
1896 "Raw tx integer value in RACH Control parameters IE\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001897{
1898 struct gsm_bts *bts = vty->index;
1899 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
1900 return CMD_SUCCESS;
1901}
1902
1903DEFUN(cfg_bts_rach_max_trans,
1904 cfg_bts_rach_max_trans_cmd,
1905 "rach max transmission (1|2|4|7)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001906 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001907 "Set the maximum number of RACH burst transmissions\n"
1908 "Set the maximum number of RACH burst transmissions\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02001909 "Maximum number of 1 RACH burst transmissions\n"
1910 "Maximum number of 2 RACH burst transmissions\n"
1911 "Maximum number of 4 RACH burst transmissions\n"
1912 "Maximum number of 7 RACH burst transmissions\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001913{
1914 struct gsm_bts *bts = vty->index;
1915 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
1916 return CMD_SUCCESS;
1917}
1918
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02001919#define CD_STR "Channel Description\n"
1920
1921DEFUN(cfg_bts_chan_desc_att,
1922 cfg_bts_chan_desc_att_cmd,
1923 "channel-descrption attach (0|1)",
1924 CD_STR
1925 "Set if attachment is required\n"
1926 "Attachment is NOT required\n"
1927 "Attachment is required (standard)\n")
1928{
1929 struct gsm_bts *bts = vty->index;
1930 bts->si_common.chan_desc.att = atoi(argv[0]);
1931 return CMD_SUCCESS;
1932}
1933
1934DEFUN(cfg_bts_chan_desc_bs_pa_mfrms,
1935 cfg_bts_chan_desc_bs_pa_mfrms_cmd,
1936 "channel-descrption bs-pa-mfrms <2-9>",
1937 CD_STR
1938 "Set number of multiframe periods for paging groups\n"
1939 "Number of multiframe periods for paging groups\n")
1940{
1941 struct gsm_bts *bts = vty->index;
1942 int bs_pa_mfrms = atoi(argv[0]);
1943
1944 bts->si_common.chan_desc.bs_pa_mfrms = bs_pa_mfrms - 2;
1945 return CMD_SUCCESS;
1946}
1947
1948DEFUN(cfg_bts_chan_desc_bs_ag_blks_res,
1949 cfg_bts_chan_desc_bs_ag_blks_res_cmd,
1950 "channel-descrption bs-ag-blks-res <0-7>",
1951 CD_STR
1952 "Set number of blocks reserved for access grant\n"
1953 "Number of blocks reserved for access grant\n")
1954{
1955 struct gsm_bts *bts = vty->index;
1956 int bs_ag_blks_res = atoi(argv[0]);
1957
1958 bts->si_common.chan_desc.bs_ag_blks_res = bs_ag_blks_res;
1959 return CMD_SUCCESS;
1960}
1961
Harald Welte8f0ed552010-05-11 21:53:49 +02001962#define NM_STR "Network Management\n"
1963
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08001964DEFUN(cfg_bts_rach_nm_b_thresh,
1965 cfg_bts_rach_nm_b_thresh_cmd,
1966 "rach nm busy threshold <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001967 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001968 "Set the NM Busy Threshold\n"
1969 "Set the NM Busy Threshold\n"
1970 "NM Busy Threshold in dB")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08001971{
1972 struct gsm_bts *bts = vty->index;
1973 bts->rach_b_thresh = atoi(argv[0]);
1974 return CMD_SUCCESS;
1975}
1976
1977DEFUN(cfg_bts_rach_nm_ldavg,
1978 cfg_bts_rach_nm_ldavg_cmd,
1979 "rach nm load average <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001980 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001981 "Set the NM Loadaverage Slots value\n"
1982 "Set the NM Loadaverage Slots value\n"
1983 "NM Loadaverage Slots value\n")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08001984{
1985 struct gsm_bts *bts = vty->index;
1986 bts->rach_ldavg_slots = atoi(argv[0]);
1987 return CMD_SUCCESS;
1988}
1989
Harald Welte (local)5dececf2009-08-12 13:28:23 +02001990DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
1991 "cell barred (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001992 "Should this cell be barred from access?\n"
1993 "Should this cell be barred from access?\n"
1994 "Cell should NOT be barred\n"
1995 "Cell should be barred\n")
1996
Harald Welte (local)5dececf2009-08-12 13:28:23 +02001997{
1998 struct gsm_bts *bts = vty->index;
1999
Harald Welte71355012009-12-21 23:08:18 +01002000 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002001
2002 return CMD_SUCCESS;
2003}
2004
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002005DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
2006 "rach emergency call allowed (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002007 RACH_STR
2008 "Should this cell allow emergency calls?\n"
2009 "Should this cell allow emergency calls?\n"
2010 "Should this cell allow emergency calls?\n"
2011 "Do NOT allow emergency calls\n"
2012 "Allow emergency calls\n")
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002013{
2014 struct gsm_bts *bts = vty->index;
2015
2016 if (atoi(argv[0]) == 0)
2017 bts->si_common.rach_control.t2 |= 0x4;
2018 else
2019 bts->si_common.rach_control.t2 &= ~0x4;
2020
2021 return CMD_SUCCESS;
2022}
2023
Ivan Kluchnikov67920592013-09-16 13:13:04 +04002024DEFUN(cfg_bts_rach_ac_class, cfg_bts_rach_ac_class_cmd,
2025 "rach access-control-class (0|1|2|3|4|5|6|7|8|9|11|12|13|14|15) (barred|allowed)",
2026 RACH_STR
2027 "Set access control class\n"
2028 "Access control class 0\n"
2029 "Access control class 1\n"
2030 "Access control class 2\n"
2031 "Access control class 3\n"
2032 "Access control class 4\n"
2033 "Access control class 5\n"
2034 "Access control class 6\n"
2035 "Access control class 7\n"
2036 "Access control class 8\n"
2037 "Access control class 9\n"
2038 "Access control class 11 for PLMN use\n"
2039 "Access control class 12 for security services\n"
2040 "Access control class 13 for public utilities (e.g. water/gas suppliers)\n"
2041 "Access control class 14 for emergency services\n"
2042 "Access control class 15 for PLMN staff\n"
2043 "barred to use access control class\n"
2044 "allowed to use access control class\n")
2045{
2046 struct gsm_bts *bts = vty->index;
2047
2048 uint8_t control_class;
2049 uint8_t allowed = 0;
2050
2051 if (strcmp(argv[1], "allowed") == 0)
2052 allowed = 1;
2053
2054 control_class = atoi(argv[0]);
2055 if (control_class < 8)
2056 if (allowed)
2057 bts->si_common.rach_control.t3 &= ~(0x1 << control_class);
2058 else
2059 bts->si_common.rach_control.t3 |= (0x1 << control_class);
2060 else
2061 if (allowed)
2062 bts->si_common.rach_control.t2 &= ~(0x1 << (control_class - 8));
2063 else
2064 bts->si_common.rach_control.t2 |= (0x1 << (control_class - 8));
2065
2066 return CMD_SUCCESS;
2067}
2068
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002069DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
2070 "ms max power <0-40>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002071 "MS Options\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02002072 "Maximum transmit power of the MS\n"
2073 "Maximum transmit power of the MS\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002074 "Maximum transmit power of the MS in dBm")
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002075{
2076 struct gsm_bts *bts = vty->index;
2077
2078 bts->ms_max_power = atoi(argv[0]);
2079
2080 return CMD_SUCCESS;
2081}
2082
Harald Weltecfaabbb2012-08-16 23:23:50 +02002083#define CELL_STR "Cell Parameters\n"
2084
Harald Welte73225282009-12-12 18:17:25 +01002085DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
2086 "cell reselection hysteresis <0-14>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002087 CELL_STR "Cell re-selection parameters\n"
2088 "Cell Re-Selection Hysteresis in dB\n"
Harald Welte73225282009-12-12 18:17:25 +01002089 "Cell Re-Selection Hysteresis in dB")
2090{
2091 struct gsm_bts *bts = vty->index;
2092
2093 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
2094
2095 return CMD_SUCCESS;
2096}
2097
2098DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
2099 "rxlev access min <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002100 "Minimum RxLev needed for cell access\n"
2101 "Minimum RxLev needed for cell access\n"
2102 "Minimum RxLev needed for cell access\n"
Harald Welte73225282009-12-12 18:17:25 +01002103 "Minimum RxLev needed for cell access (better than -110dBm)")
2104{
2105 struct gsm_bts *bts = vty->index;
2106
2107 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
2108
2109 return CMD_SUCCESS;
2110}
2111
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002112DEFUN(cfg_bts_cell_bar_qualify, cfg_bts_cell_bar_qualify_cmd,
2113 "cell bar qualify (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002114 CELL_STR "Cell Bar Qualify\n" "Cell Bar Qualify\n"
2115 "Set CBQ to 0\n" "Set CBQ to 1\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002116{
2117 struct gsm_bts *bts = vty->index;
2118
2119 bts->si_common.cell_ro_sel_par.present = 1;
2120 bts->si_common.cell_ro_sel_par.cbq = atoi(argv[0]);
2121
2122 return CMD_SUCCESS;
2123}
2124
2125DEFUN(cfg_bts_cell_resel_ofs, cfg_bts_cell_resel_ofs_cmd,
2126 "cell reselection offset <0-126>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002127 CELL_STR "Cell Re-Selection Parameters\n"
2128 "Cell Re-Selection Offset (CRO) in dB\n"
2129 "Cell Re-Selection Offset (CRO) in dB\n"
2130 )
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002131{
2132 struct gsm_bts *bts = vty->index;
2133
2134 bts->si_common.cell_ro_sel_par.present = 1;
2135 bts->si_common.cell_ro_sel_par.cell_resel_off = atoi(argv[0])/2;
2136
2137 return CMD_SUCCESS;
2138}
2139
2140DEFUN(cfg_bts_temp_ofs, cfg_bts_temp_ofs_cmd,
2141 "temporary offset <0-60>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002142 "Cell selection temporary negative offset\n"
2143 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002144 "Cell selection temporary negative offset in dB")
2145{
2146 struct gsm_bts *bts = vty->index;
2147
2148 bts->si_common.cell_ro_sel_par.present = 1;
2149 bts->si_common.cell_ro_sel_par.temp_offs = atoi(argv[0])/10;
2150
2151 return CMD_SUCCESS;
2152}
2153
2154DEFUN(cfg_bts_temp_ofs_inf, cfg_bts_temp_ofs_inf_cmd,
2155 "temporary offset infinite",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002156 "Cell selection temporary negative offset\n"
2157 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002158 "Sets cell selection temporary negative offset to infinity")
2159{
2160 struct gsm_bts *bts = vty->index;
2161
2162 bts->si_common.cell_ro_sel_par.present = 1;
2163 bts->si_common.cell_ro_sel_par.temp_offs = 7;
2164
2165 return CMD_SUCCESS;
2166}
2167
2168DEFUN(cfg_bts_penalty_time, cfg_bts_penalty_time_cmd,
2169 "penalty time <20-620>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002170 "Cell selection penalty time\n"
2171 "Cell selection penalty time\n"
2172 "Cell selection penalty time in seconds (by 20s increments)\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002173{
2174 struct gsm_bts *bts = vty->index;
2175
2176 bts->si_common.cell_ro_sel_par.present = 1;
2177 bts->si_common.cell_ro_sel_par.penalty_time = (atoi(argv[0])-20)/20;
2178
2179 return CMD_SUCCESS;
2180}
2181
2182DEFUN(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd,
2183 "penalty time reserved",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002184 "Cell selection penalty time\n"
2185 "Cell selection penalty time\n"
2186 "Set cell selection penalty time to reserved value 31, "
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002187 "(indicate that CELL_RESELECT_OFFSET is subtracted from C2 "
2188 "and TEMPORARY_OFFSET is ignored)")
2189{
2190 struct gsm_bts *bts = vty->index;
2191
2192 bts->si_common.cell_ro_sel_par.present = 1;
2193 bts->si_common.cell_ro_sel_par.penalty_time = 31;
2194
2195 return CMD_SUCCESS;
2196}
2197
Harald Welte (local)efc92312009-08-14 23:09:25 +02002198DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
Daniel Willmann4d62d632012-12-27 00:02:01 +01002199 "periodic location update <6-1530>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002200 "Periodic Location Updating Interval\n"
2201 "Periodic Location Updating Interval\n"
2202 "Periodic Location Updating Interval\n"
2203 "Periodic Location Updating Interval in Minutes\n")
Harald Welte (local)efc92312009-08-14 23:09:25 +02002204{
2205 struct gsm_bts *bts = vty->index;
2206
Dieter Spaard6613e02010-10-05 21:10:55 +02002207 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
Harald Welte (local)efc92312009-08-14 23:09:25 +02002208
2209 return CMD_SUCCESS;
2210}
2211
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002212DEFUN(cfg_bts_no_per_loc_upd, cfg_bts_no_per_loc_upd_cmd,
2213 "no periodic location update",
2214 NO_STR
2215 "Periodic Location Updating Interval\n"
2216 "Periodic Location Updating Interval\n"
2217 "Periodic Location Updating Interval\n")
2218{
2219 struct gsm_bts *bts = vty->index;
2220
2221 bts->si_common.chan_desc.t3212 = 0;
2222 return CMD_SUCCESS;
2223}
2224
Harald Welte8f0ed552010-05-11 21:53:49 +02002225#define GPRS_TEXT "GPRS Packet Network\n"
2226
Harald Welteaf387632010-03-14 23:30:30 +08002227DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welte57ba7e32010-04-18 14:00:26 +02002228 "gprs cell bvci <2-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002229 GPRS_TEXT
2230 "GPRS Cell Settings\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002231 "GPRS BSSGP VC Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002232 "GPRS BSSGP VC Identifier")
2233{
2234 struct gsm_bts *bts = vty->index;
2235
Harald Welte4511d892010-04-18 15:51:20 +02002236 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002237 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2238 return CMD_WARNING;
2239 }
2240
Harald Welte97a282b2010-03-14 15:37:43 +08002241 bts->gprs.cell.bvci = atoi(argv[0]);
2242
2243 return CMD_SUCCESS;
2244}
2245
Harald Weltea5731cf2010-03-22 11:48:36 +08002246DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
2247 "gprs nsei <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002248 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002249 "GPRS NS Entity Identifier\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002250 "GPRS NS Entity Identifier")
2251{
2252 struct gsm_bts *bts = vty->index;
2253
Harald Welte4511d892010-04-18 15:51:20 +02002254 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltea5731cf2010-03-22 11:48:36 +08002255 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2256 return CMD_WARNING;
2257 }
2258
2259 bts->gprs.nse.nsei = atoi(argv[0]);
2260
2261 return CMD_SUCCESS;
2262}
2263
Harald Welte8f0ed552010-05-11 21:53:49 +02002264#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
2265 "NSVC Logical Number\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002266
Harald Welte97a282b2010-03-14 15:37:43 +08002267DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
2268 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002269 GPRS_TEXT NSVC_TEXT
2270 "NS Virtual Connection Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002271 "GPRS NS VC Identifier")
2272{
2273 struct gsm_bts *bts = vty->index;
2274 int idx = atoi(argv[0]);
2275
Harald Welte4511d892010-04-18 15:51:20 +02002276 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002277 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2278 return CMD_WARNING;
2279 }
2280
Harald Welte97a282b2010-03-14 15:37:43 +08002281 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
2282
2283 return CMD_SUCCESS;
2284}
2285
Harald Welteaf387632010-03-14 23:30:30 +08002286DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
2287 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002288 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002289 "GPRS NS Local UDP Port\n"
2290 "GPRS NS Local UDP Port\n"
2291 "GPRS NS Local UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002292 "GPRS NS Local UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002293{
2294 struct gsm_bts *bts = vty->index;
2295 int idx = atoi(argv[0]);
2296
Harald Welte4511d892010-04-18 15:51:20 +02002297 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002298 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2299 return CMD_WARNING;
2300 }
2301
Harald Welteaf387632010-03-14 23:30:30 +08002302 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
2303
2304 return CMD_SUCCESS;
2305}
2306
2307DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
2308 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002309 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002310 "GPRS NS Remote UDP Port\n"
2311 "GPRS NS Remote UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002312 "GPRS NS Remote UDP Port\n"
2313 "GPRS NS Remote UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002314{
2315 struct gsm_bts *bts = vty->index;
2316 int idx = atoi(argv[0]);
2317
Harald Welte4511d892010-04-18 15:51:20 +02002318 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002319 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2320 return CMD_WARNING;
2321 }
2322
Harald Welteaf387632010-03-14 23:30:30 +08002323 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
2324
2325 return CMD_SUCCESS;
2326}
2327
2328DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
2329 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte8f0ed552010-05-11 21:53:49 +02002330 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002331 "GPRS NS Remote IP Address\n"
2332 "GPRS NS Remote IP Address\n"
2333 "GPRS NS Remote IP Address\n")
Harald Welteaf387632010-03-14 23:30:30 +08002334{
2335 struct gsm_bts *bts = vty->index;
2336 int idx = atoi(argv[0]);
2337 struct in_addr ia;
2338
Harald Welte4511d892010-04-18 15:51:20 +02002339 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002340 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2341 return CMD_WARNING;
2342 }
2343
Harald Welteaf387632010-03-14 23:30:30 +08002344 inet_aton(argv[1], &ia);
2345 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
2346
2347 return CMD_SUCCESS;
2348}
2349
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002350DEFUN(cfg_bts_pag_free, cfg_bts_pag_free_cmd,
Harald Weltecfaabbb2012-08-16 23:23:50 +02002351 "paging free <-1-1024>",
2352 "Paging options\n"
2353 "Only page when having a certain amount of free slots\n"
2354 "amount of required free paging slots. -1 to disable\n")
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002355{
2356 struct gsm_bts *bts = vty->index;
2357
2358 bts->paging.free_chans_need = atoi(argv[0]);
2359 return CMD_SUCCESS;
2360}
2361
Harald Welte615e9562010-05-11 23:50:21 +02002362DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
2363 "gprs ns timer " NS_TIMERS " <0-255>",
2364 GPRS_TEXT "Network Service\n"
2365 "Network Service Timer\n"
2366 NS_TIMERS_HELP "Timer Value\n")
2367{
2368 struct gsm_bts *bts = vty->index;
2369 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
2370 int val = atoi(argv[1]);
2371
2372 if (bts->gprs.mode == BTS_GPRS_NONE) {
2373 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2374 return CMD_WARNING;
2375 }
2376
2377 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
2378 return CMD_WARNING;
2379
2380 bts->gprs.nse.timer[idx] = val;
2381
2382 return CMD_SUCCESS;
2383}
2384
2385#define BSSGP_TIMERS "(blocking-timer|blocking-retries|unblocking-retries|reset-timer|reset-retries|suspend-timer|suspend-retries|resume-timer|resume-retries|capability-update-timer|capability-update-retries)"
Harald Welte28326062010-05-14 20:05:17 +02002386#define BSSGP_TIMERS_HELP \
2387 "Tbvc-block timeout\n" \
2388 "Tbvc-block retries\n" \
2389 "Tbvc-unblock retries\n" \
2390 "Tbvcc-reset timeout\n" \
2391 "Tbvc-reset retries\n" \
2392 "Tbvc-suspend timeout\n" \
2393 "Tbvc-suspend retries\n" \
2394 "Tbvc-resume timeout\n" \
2395 "Tbvc-resume retries\n" \
2396 "Tbvc-capa-update timeout\n" \
2397 "Tbvc-capa-update retries\n"
Harald Welte615e9562010-05-11 23:50:21 +02002398
2399DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
2400 "gprs cell timer " BSSGP_TIMERS " <0-255>",
2401 GPRS_TEXT "Cell / BSSGP\n"
2402 "Cell/BSSGP Timer\n"
2403 BSSGP_TIMERS_HELP "Timer Value\n")
2404{
2405 struct gsm_bts *bts = vty->index;
2406 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
2407 int val = atoi(argv[1]);
2408
2409 if (bts->gprs.mode == BTS_GPRS_NONE) {
2410 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2411 return CMD_WARNING;
2412 }
2413
2414 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
2415 return CMD_WARNING;
2416
2417 bts->gprs.cell.timer[idx] = val;
2418
2419 return CMD_SUCCESS;
2420}
2421
Harald Welte97a282b2010-03-14 15:37:43 +08002422DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
2423 "gprs routing area <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002424 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002425 "GPRS Routing Area Code\n"
2426 "GPRS Routing Area Code\n"
2427 "GPRS Routing Area Code\n")
Harald Welte97a282b2010-03-14 15:37:43 +08002428{
2429 struct gsm_bts *bts = vty->index;
2430
Harald Welte4511d892010-04-18 15:51:20 +02002431 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002432 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2433 return CMD_WARNING;
2434 }
2435
Harald Welte97a282b2010-03-14 15:37:43 +08002436 bts->gprs.rac = atoi(argv[0]);
2437
2438 return CMD_SUCCESS;
2439}
2440
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01002441DEFUN(cfg_bts_gprs_net_ctrl_ord, cfg_bts_gprs_net_ctrl_ord_cmd,
2442 "gprs network-control-order (nc0|nc1|nc2)",
2443 GPRS_TEXT
2444 "GPRS Network Control Order\n"
2445 "MS controlled cell re-selection, no measurement reporting\n"
2446 "MS controlled cell re-selection, MS sends measurement reports\n"
2447 "Network controlled cell re-selection, MS sends measurement reports\n")
2448{
2449 struct gsm_bts *bts = vty->index;
2450
2451 if (bts->gprs.mode == BTS_GPRS_NONE) {
2452 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2453 return CMD_WARNING;
2454 }
2455
2456 bts->gprs.net_ctrl_ord = atoi(argv[0] + 2);
2457
2458 return CMD_SUCCESS;
2459}
2460
Harald Welte4511d892010-04-18 15:51:20 +02002461DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
2462 "gprs mode (none|gprs|egprs)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002463 GPRS_TEXT
2464 "GPRS Mode for this BTS\n"
2465 "GPRS Disabled on this BTS\n"
2466 "GPRS Enabled on this BTS\n"
2467 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welteaf387632010-03-14 23:30:30 +08002468{
2469 struct gsm_bts *bts = vty->index;
Harald Weltef3d8e922010-06-14 22:44:42 +02002470 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0]);
Harald Welteaf387632010-03-14 23:30:30 +08002471
Harald Weltef3d8e922010-06-14 22:44:42 +02002472 if (mode != BTS_GPRS_NONE &&
2473 !gsm_bts_has_feature(bts, BTS_FEAT_GPRS)) {
2474 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2475 VTY_NEWLINE);
2476 return CMD_WARNING;
2477 }
2478 if (mode == BTS_GPRS_EGPRS &&
2479 !gsm_bts_has_feature(bts, BTS_FEAT_EGPRS)) {
2480 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2481 VTY_NEWLINE);
2482 return CMD_WARNING;
2483 }
2484
2485 bts->gprs.mode = mode;
Harald Welteaf387632010-03-14 23:30:30 +08002486
2487 return CMD_SUCCESS;
2488}
2489
Harald Welte9fbff4a2010-07-30 11:50:09 +02002490#define SI_TEXT "System Information Messages\n"
2491#define SI_TYPE_TEXT "(1|2|3|4|5|6|7|8|9|10|13|16|17|18|19|20|2bis|2ter|2quater|5bis|5ter)"
2492#define SI_TYPE_HELP "System Information Type 1\n" \
2493 "System Information Type 2\n" \
2494 "System Information Type 3\n" \
2495 "System Information Type 4\n" \
2496 "System Information Type 5\n" \
2497 "System Information Type 6\n" \
2498 "System Information Type 7\n" \
2499 "System Information Type 8\n" \
2500 "System Information Type 9\n" \
2501 "System Information Type 10\n" \
2502 "System Information Type 13\n" \
2503 "System Information Type 16\n" \
2504 "System Information Type 17\n" \
2505 "System Information Type 18\n" \
2506 "System Information Type 19\n" \
2507 "System Information Type 20\n" \
2508 "System Information Type 2bis\n" \
2509 "System Information Type 2ter\n" \
2510 "System Information Type 2quater\n" \
2511 "System Information Type 5bis\n" \
2512 "System Information Type 5ter\n"
2513
2514DEFUN(cfg_bts_si_mode, cfg_bts_si_mode_cmd,
2515 "system-information " SI_TYPE_TEXT " mode (static|computed)",
2516 SI_TEXT SI_TYPE_HELP
2517 "System Information Mode\n"
2518 "Static user-specified\n"
2519 "Dynamic, BSC-computed\n")
2520{
2521 struct gsm_bts *bts = vty->index;
2522 int type;
2523
2524 type = get_string_value(osmo_sitype_strs, argv[0]);
2525 if (type < 0) {
2526 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2527 return CMD_WARNING;
2528 }
2529
2530 if (!strcmp(argv[1], "static"))
2531 bts->si_mode_static |= (1 << type);
2532 else
2533 bts->si_mode_static &= ~(1 << type);
2534
2535 return CMD_SUCCESS;
2536}
2537
2538DEFUN(cfg_bts_si_static, cfg_bts_si_static_cmd,
2539 "system-information " SI_TYPE_TEXT " static HEXSTRING",
2540 SI_TEXT SI_TYPE_HELP
2541 "Static System Information filling\n"
2542 "Static user-specified SI content in HEX notation\n")
2543{
2544 struct gsm_bts *bts = vty->index;
2545 int rc, type;
2546
2547 type = get_string_value(osmo_sitype_strs, argv[0]);
2548 if (type < 0) {
2549 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2550 return CMD_WARNING;
2551 }
2552
2553 if (!(bts->si_mode_static & (1 << type))) {
2554 vty_out(vty, "SI Type %s is not configured in static mode%s",
2555 get_value_string(osmo_sitype_strs, type), VTY_NEWLINE);
2556 return CMD_WARNING;
2557 }
2558
Harald Welte290aaed2010-07-30 11:53:18 +02002559 /* Fill buffer with padding pattern */
2560 memset(bts->si_buf[type], 0x2b, sizeof(bts->si_buf[type]));
2561
2562 /* Parse the user-specified SI in hex format, [partially] overwriting padding */
Pablo Neira Ayusoc0d17f22011-05-07 12:12:48 +02002563 rc = osmo_hexparse(argv[1], bts->si_buf[type], sizeof(bts->si_buf[0]));
Harald Welte9fbff4a2010-07-30 11:50:09 +02002564 if (rc < 0 || rc > sizeof(bts->si_buf[0])) {
2565 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
2566 return CMD_WARNING;
2567 }
2568
2569 /* Mark this SI as present */
2570 bts->si_valid |= (1 << type);
2571
2572 return CMD_SUCCESS;
2573}
2574
Harald Welte32c09622011-01-11 23:44:56 +01002575DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
Harald Welte64c07d22011-02-15 11:43:27 +01002576 "neighbor-list mode (automatic|manual|manual-si5)",
Harald Welte32c09622011-01-11 23:44:56 +01002577 "Neighbor List\n" "Mode of Neighbor List generation\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002578 "Automatically from all BTS in this OpenBSC\n" "Manual\n"
2579 "Manual with different lists for SI2 and SI5\n")
Harald Welte32c09622011-01-11 23:44:56 +01002580{
2581 struct gsm_bts *bts = vty->index;
Harald Welte64c07d22011-02-15 11:43:27 +01002582 int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
Harald Welte32c09622011-01-11 23:44:56 +01002583
Harald Welte64c07d22011-02-15 11:43:27 +01002584 switch (mode) {
2585 case NL_MODE_MANUAL_SI5SEP:
2586 case NL_MODE_MANUAL:
Harald Welte32c09622011-01-11 23:44:56 +01002587 /* make sure we clear the current list when switching to
2588 * manual mode */
2589 if (bts->neigh_list_manual_mode == 0)
2590 memset(&bts->si_common.data.neigh_list, 0,
2591 sizeof(bts->si_common.data.neigh_list));
Harald Welte64c07d22011-02-15 11:43:27 +01002592 break;
2593 default:
2594 break;
2595 }
2596
2597 bts->neigh_list_manual_mode = mode;
Harald Welte32c09622011-01-11 23:44:56 +01002598
2599 return CMD_SUCCESS;
2600}
2601
2602DEFUN(cfg_bts_neigh, cfg_bts_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002603 "neighbor-list (add|del) arfcn <0-1023>",
Harald Welte32c09622011-01-11 23:44:56 +01002604 "Neighbor List\n" "Add to manual neighbor list\n"
2605 "Delete from manual neighbor list\n" "ARFCN of neighbor\n"
2606 "ARFCN of neighbor\n")
2607{
2608 struct gsm_bts *bts = vty->index;
2609 struct bitvec *bv = &bts->si_common.neigh_list;
2610 uint16_t arfcn = atoi(argv[1]);
2611
2612 if (!bts->neigh_list_manual_mode) {
2613 vty_out(vty, "%% Cannot configure neighbor list in "
2614 "automatic mode%s", VTY_NEWLINE);
2615 return CMD_WARNING;
2616 }
2617
2618 if (!strcmp(argv[0], "add"))
2619 bitvec_set_bit_pos(bv, arfcn, 1);
2620 else
2621 bitvec_set_bit_pos(bv, arfcn, 0);
2622
2623 return CMD_SUCCESS;
2624}
2625
Harald Welte64c07d22011-02-15 11:43:27 +01002626DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002627 "si5 neighbor-list (add|del) arfcn <0-1023>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002628 "SI5 Neighbor List\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002629 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
2630 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
2631 "ARFCN of neighbor\n")
2632{
2633 struct gsm_bts *bts = vty->index;
2634 struct bitvec *bv = &bts->si_common.si5_neigh_list;
2635 uint16_t arfcn = atoi(argv[1]);
2636
2637 if (!bts->neigh_list_manual_mode) {
2638 vty_out(vty, "%% Cannot configure neighbor list in "
2639 "automatic mode%s", VTY_NEWLINE);
2640 return CMD_WARNING;
2641 }
2642
2643 if (!strcmp(argv[0], "add"))
2644 bitvec_set_bit_pos(bv, arfcn, 1);
2645 else
2646 bitvec_set_bit_pos(bv, arfcn, 0);
2647
2648 return CMD_SUCCESS;
2649}
Harald Welte9fbff4a2010-07-30 11:50:09 +02002650
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02002651#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
2652
2653DEFUN(cfg_bts_excl_rf_lock,
2654 cfg_bts_excl_rf_lock_cmd,
2655 "rf-lock-exclude",
2656 EXCL_RFLOCK_STR)
2657{
2658 struct gsm_bts *bts = vty->index;
2659 bts->excl_from_rf_lock = 1;
2660 return CMD_SUCCESS;
2661}
2662
2663DEFUN(cfg_bts_no_excl_rf_lock,
2664 cfg_bts_no_excl_rf_lock_cmd,
2665 "no rf-lock-exclude",
2666 NO_STR EXCL_RFLOCK_STR)
2667{
2668 struct gsm_bts *bts = vty->index;
2669 bts->excl_from_rf_lock = 0;
2670 return CMD_SUCCESS;
2671}
2672
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01002673#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
2674
2675DEFUN(cfg_bts_force_comb_si,
2676 cfg_bts_force_comb_si_cmd,
2677 "force-combined-si",
2678 FORCE_COMB_SI_STR)
2679{
2680 struct gsm_bts *bts = vty->index;
2681 bts->force_combined_si = 1;
2682 return CMD_SUCCESS;
2683}
2684
2685DEFUN(cfg_bts_no_force_comb_si,
2686 cfg_bts_no_force_comb_si_cmd,
2687 "no force-combined-si",
2688 NO_STR FORCE_COMB_SI_STR)
2689{
2690 struct gsm_bts *bts = vty->index;
2691 bts->force_combined_si = 0;
2692 return CMD_SUCCESS;
2693}
2694
Andreas Eversberga83d5112013-12-07 18:32:28 +01002695static void _get_codec_from_arg(struct vty *vty, int argc, const char *argv[])
2696{
2697 struct gsm_bts *bts = vty->index;
2698 struct bts_codec_conf *codec = &bts->codec;
2699 int i;
2700
2701 codec->hr = 0;
2702 codec->efr = 0;
2703 codec->amr = 0;
2704 for (i = 0; i < argc; i++) {
2705 if (!strcmp(argv[i], "hr"))
2706 codec->hr = 1;
2707 if (!strcmp(argv[i], "efr"))
2708 codec->efr = 1;
2709 if (!strcmp(argv[i], "amr"))
2710 codec->amr = 1;
2711 }
2712}
2713
2714#define CODEC_PAR_STR " (hr|efr|amr)"
2715#define CODEC_HELP_STR "Half Rate\n" \
2716 "Enhanced Full Rate\nAdaptive Multirate\n"
2717
2718DEFUN(cfg_bts_codec0, cfg_bts_codec0_cmd,
2719 "codec-support fr",
2720 "Codec Support settings\nFullrate\n")
2721{
2722 _get_codec_from_arg(vty, 0, argv);
2723 return CMD_SUCCESS;
2724}
2725
2726DEFUN(cfg_bts_codec1, cfg_bts_codec1_cmd,
2727 "codec-support fr" CODEC_PAR_STR,
2728 "Codec Support settings\nFullrate\n"
2729 CODEC_HELP_STR)
2730{
2731 _get_codec_from_arg(vty, 1, argv);
2732 return CMD_SUCCESS;
2733}
2734
2735DEFUN(cfg_bts_codec2, cfg_bts_codec2_cmd,
2736 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR,
2737 "Codec Support settings\nFullrate\n"
2738 CODEC_HELP_STR CODEC_HELP_STR)
2739{
2740 _get_codec_from_arg(vty, 2, argv);
2741 return CMD_SUCCESS;
2742}
2743
2744DEFUN(cfg_bts_codec3, cfg_bts_codec3_cmd,
2745 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
2746 "Codec Support settings\nFullrate\n"
2747 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
2748{
2749 _get_codec_from_arg(vty, 3, argv);
2750 return CMD_SUCCESS;
2751}
2752
2753DEFUN(cfg_bts_codec4, cfg_bts_codec4_cmd,
2754 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
2755 "Codec Support settings\nFullrate\n"
2756 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
2757{
2758 _get_codec_from_arg(vty, 4, argv);
2759 return CMD_SUCCESS;
2760}
2761
Harald Welte8f0ed552010-05-11 21:53:49 +02002762#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02002763
Harald Welte5258fc42009-03-28 19:07:53 +00002764/* per TRX configuration */
2765DEFUN(cfg_trx,
2766 cfg_trx_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02002767 "trx <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002768 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00002769 "Select a TRX to configure")
2770{
2771 int trx_nr = atoi(argv[0]);
2772 struct gsm_bts *bts = vty->index;
2773 struct gsm_bts_trx *trx;
2774
Harald Weltee441d9c2009-06-21 16:17:15 +02002775 if (trx_nr > bts->num_trx) {
2776 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
2777 bts->num_trx, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00002778 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02002779 } else if (trx_nr == bts->num_trx) {
2780 /* we need to allocate a new one */
2781 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02002782 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02002783 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02002784
Harald Weltee441d9c2009-06-21 16:17:15 +02002785 if (!trx)
2786 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00002787
2788 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02002789 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00002790 vty->node = TRX_NODE;
2791
2792 return CMD_SUCCESS;
2793}
2794
2795DEFUN(cfg_trx_arfcn,
2796 cfg_trx_arfcn_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002797 "arfcn <0-1023>",
Harald Welte13fe2192012-08-17 09:57:25 +02002798 "Set the ARFCN for this TRX\n"
2799 "Absolute Radio Frequency Channel Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00002800{
2801 int arfcn = atoi(argv[0]);
2802 struct gsm_bts_trx *trx = vty->index;
2803
2804 /* FIXME: check if this ARFCN is supported by this TRX */
2805
2806 trx->arfcn = arfcn;
2807
2808 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
2809 /* FIXME: use OML layer to update the ARFCN */
2810 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
2811
2812 return CMD_SUCCESS;
2813}
2814
Harald Welte (local)7b37d972009-12-27 20:56:38 +01002815DEFUN(cfg_trx_nominal_power,
2816 cfg_trx_nominal_power_cmd,
2817 "nominal power <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002818 "Nominal TRX RF Power in dBm\n"
2819 "Nominal TRX RF Power in dBm\n"
2820 "Nominal TRX RF Power in dBm\n")
Harald Welte (local)7b37d972009-12-27 20:56:38 +01002821{
2822 struct gsm_bts_trx *trx = vty->index;
2823
2824 trx->nominal_power = atoi(argv[0]);
2825
2826 return CMD_SUCCESS;
2827}
2828
Harald Weltefcd24452009-06-20 18:15:19 +02002829DEFUN(cfg_trx_max_power_red,
2830 cfg_trx_max_power_red_cmd,
2831 "max_power_red <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002832 "Reduction of maximum BS RF Power (relative to nominal power)\n"
Harald Weltefcd24452009-06-20 18:15:19 +02002833 "Reduction of maximum BS RF Power in dB\n")
2834{
2835 int maxpwr_r = atoi(argv[0]);
2836 struct gsm_bts_trx *trx = vty->index;
Harald Welte61a83b22009-11-18 09:20:22 +01002837 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-06-20 18:15:19 +02002838
2839 /* FIXME: check if our BTS type supports more than 12 */
2840 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
2841 vty_out(vty, "%% Power %d dB is not in the valid range%s",
2842 maxpwr_r, VTY_NEWLINE);
2843 return CMD_WARNING;
2844 }
2845 if (maxpwr_r & 1) {
2846 vty_out(vty, "%% Power %d dB is not an even value%s",
2847 maxpwr_r, VTY_NEWLINE);
2848 return CMD_WARNING;
2849 }
2850
2851 trx->max_power_red = maxpwr_r;
2852
2853 /* FIXME: make sure we update this using OML */
2854
2855 return CMD_SUCCESS;
2856}
2857
Harald Welte42581822009-08-08 16:12:58 +02002858DEFUN(cfg_trx_rsl_e1,
2859 cfg_trx_rsl_e1_cmd,
2860 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002861 "RSL Parameters\n"
2862 "E1/T1 interface to be used for RSL\n"
2863 "E1/T1 interface to be used for RSL\n"
2864 "E1/T1 Line Number to be used for RSL\n"
2865 "E1/T1 Timeslot to be used for RSL\n"
2866 "E1/T1 Timeslot to be used for RSL\n"
2867 "E1/T1 Sub-slot to be used for RSL\n"
2868 "E1/T1 Sub-slot 0 is to be used for RSL\n"
2869 "E1/T1 Sub-slot 1 is to be used for RSL\n"
2870 "E1/T1 Sub-slot 2 is to be used for RSL\n"
2871 "E1/T1 Sub-slot 3 is to be used for RSL\n"
2872 "E1/T1 full timeslot is to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02002873{
2874 struct gsm_bts_trx *trx = vty->index;
2875
2876 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
2877
2878 return CMD_SUCCESS;
2879}
2880
2881DEFUN(cfg_trx_rsl_e1_tei,
2882 cfg_trx_rsl_e1_tei_cmd,
2883 "rsl e1 tei <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002884 "RSL Parameters\n"
2885 "Set the TEI to be used for RSL\n"
2886 "Set the TEI to be used for RSL\n"
2887 "TEI to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02002888{
2889 struct gsm_bts_trx *trx = vty->index;
2890
2891 trx->rsl_tei = atoi(argv[0]);
2892
2893 return CMD_SUCCESS;
2894}
2895
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01002896DEFUN(cfg_trx_rf_locked,
2897 cfg_trx_rf_locked_cmd,
2898 "rf_locked (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002899 "Set or unset the RF Locking (Turn off RF of the TRX)\n"
2900 "TRX is NOT RF locked (active)\n"
2901 "TRX is RF locked (turned off)\n")
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01002902{
2903 int locked = atoi(argv[0]);
2904 struct gsm_bts_trx *trx = vty->index;
2905
2906 gsm_trx_lock_rf(trx, locked);
2907 return CMD_SUCCESS;
2908}
Harald Welte42581822009-08-08 16:12:58 +02002909
Harald Welte5258fc42009-03-28 19:07:53 +00002910/* per TS configuration */
2911DEFUN(cfg_ts,
2912 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02002913 "timeslot <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002914 "Select a Timeslot to configure\n"
2915 "Timeslot number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00002916{
2917 int ts_nr = atoi(argv[0]);
2918 struct gsm_bts_trx *trx = vty->index;
2919 struct gsm_bts_trx_ts *ts;
2920
2921 if (ts_nr >= TRX_NR_TS) {
2922 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
2923 TRX_NR_TS, VTY_NEWLINE);
2924 return CMD_WARNING;
2925 }
2926
2927 ts = &trx->ts[ts_nr];
2928
2929 vty->index = ts;
2930 vty->node = TS_NODE;
2931
2932 return CMD_SUCCESS;
2933}
2934
Harald Weltea6fd58e2009-08-07 00:25:23 +02002935DEFUN(cfg_ts_pchan,
2936 cfg_ts_pchan_cmd,
Harald Welte4ab9d7c2012-08-17 12:42:06 +02002937 "phys_chan_config PCHAN", /* dynamically generated! */
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01002938 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte4ab9d7c2012-08-17 12:42:06 +02002939{
2940 struct gsm_bts_trx_ts *ts = vty->index;
2941 int pchanc;
2942
2943 pchanc = gsm_pchan_parse(argv[0]);
2944 if (pchanc < 0)
2945 return CMD_WARNING;
2946
2947 ts->pchan = pchanc;
2948
2949 return CMD_SUCCESS;
2950}
2951
2952/* used for backwards compatibility with old config files that still
2953 * have uppercase pchan type names */
2954DEFUN_HIDDEN(cfg_ts_pchan_compat,
2955 cfg_ts_pchan_compat_cmd,
Harald Weltea6fd58e2009-08-07 00:25:23 +02002956 "phys_chan_config PCHAN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01002957 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02002958{
2959 struct gsm_bts_trx_ts *ts = vty->index;
2960 int pchanc;
2961
2962 pchanc = gsm_pchan_parse(argv[0]);
2963 if (pchanc < 0)
2964 return CMD_WARNING;
2965
2966 ts->pchan = pchanc;
2967
2968 return CMD_SUCCESS;
2969}
2970
Harald Welte4ab9d7c2012-08-17 12:42:06 +02002971
2972
Harald Welte135a6482011-05-30 12:09:13 +02002973DEFUN(cfg_ts_tsc,
2974 cfg_ts_tsc_cmd,
2975 "training_sequence_code <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002976 "Training Sequence Code of the Timeslot\n" "TSC\n")
Harald Welte135a6482011-05-30 12:09:13 +02002977{
2978 struct gsm_bts_trx_ts *ts = vty->index;
2979
2980 ts->tsc = atoi(argv[0]);
2981
2982 return CMD_SUCCESS;
2983}
2984
Harald Weltea39b0f22010-06-14 22:26:10 +02002985#define HOPPING_STR "Configure frequency hopping\n"
2986
2987DEFUN(cfg_ts_hopping,
2988 cfg_ts_hopping_cmd,
2989 "hopping enabled (0|1)",
2990 HOPPING_STR "Enable or disable frequency hopping\n"
2991 "Disable frequency hopping\n" "Enable frequency hopping\n")
2992{
2993 struct gsm_bts_trx_ts *ts = vty->index;
Harald Weltec2fb3d02010-06-14 22:47:37 +02002994 int enabled = atoi(argv[0]);
Harald Weltea39b0f22010-06-14 22:26:10 +02002995
Harald Weltec2fb3d02010-06-14 22:47:37 +02002996 if (enabled && !gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_HOPPING)) {
2997 vty_out(vty, "BTS model does not support hopping%s",
2998 VTY_NEWLINE);
2999 return CMD_WARNING;
3000 }
3001
3002 ts->hopping.enabled = enabled;
Harald Weltea39b0f22010-06-14 22:26:10 +02003003
3004 return CMD_SUCCESS;
3005}
3006
Harald Welte6e0cd042009-09-12 13:05:33 +02003007DEFUN(cfg_ts_hsn,
3008 cfg_ts_hsn_cmd,
Harald Weltea39b0f22010-06-14 22:26:10 +02003009 "hopping sequence-number <0-63>",
3010 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003011 "Which hopping sequence to use for this channel\n"
3012 "Hopping Sequence Number (HSN)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003013{
3014 struct gsm_bts_trx_ts *ts = vty->index;
3015
3016 ts->hopping.hsn = atoi(argv[0]);
3017
3018 return CMD_SUCCESS;
3019}
3020
3021DEFUN(cfg_ts_maio,
3022 cfg_ts_maio_cmd,
3023 "hopping maio <0-63>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003024 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003025 "Which hopping MAIO to use for this channel\n"
3026 "Mobile Allocation Index Offset (MAIO)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003027{
3028 struct gsm_bts_trx_ts *ts = vty->index;
3029
3030 ts->hopping.maio = atoi(argv[0]);
3031
3032 return CMD_SUCCESS;
3033}
3034
3035DEFUN(cfg_ts_arfcn_add,
3036 cfg_ts_arfcn_add_cmd,
3037 "hopping arfcn add <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003038 HOPPING_STR "Configure hopping ARFCN list\n"
3039 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003040{
3041 struct gsm_bts_trx_ts *ts = vty->index;
3042 int arfcn = atoi(argv[0]);
3043
Harald Weltea39b0f22010-06-14 22:26:10 +02003044 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
3045
Harald Welte6e0cd042009-09-12 13:05:33 +02003046 return CMD_SUCCESS;
3047}
3048
3049DEFUN(cfg_ts_arfcn_del,
3050 cfg_ts_arfcn_del_cmd,
3051 "hopping arfcn del <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003052 HOPPING_STR "Configure hopping ARFCN list\n"
3053 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003054{
3055 struct gsm_bts_trx_ts *ts = vty->index;
3056 int arfcn = atoi(argv[0]);
3057
Harald Weltea39b0f22010-06-14 22:26:10 +02003058 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
3059
Harald Welte6e0cd042009-09-12 13:05:33 +02003060 return CMD_SUCCESS;
3061}
3062
Harald Weltea6fd58e2009-08-07 00:25:23 +02003063DEFUN(cfg_ts_e1_subslot,
3064 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003065 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003066 "E1/T1 channel connected to this on-air timeslot\n"
3067 "E1/T1 channel connected to this on-air timeslot\n"
3068 "E1/T1 line connected to this on-air timeslot\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02003069 "E1/T1 timeslot connected to this on-air timeslot\n"
3070 "E1/T1 timeslot connected to this on-air timeslot\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02003071 "E1/T1 sub-slot connected to this on-air timeslot\n"
3072 "E1/T1 sub-slot 0 connected to this on-air timeslot\n"
3073 "E1/T1 sub-slot 1 connected to this on-air timeslot\n"
3074 "E1/T1 sub-slot 2 connected to this on-air timeslot\n"
3075 "E1/T1 sub-slot 3 connected to this on-air timeslot\n"
3076 "Full E1/T1 timeslot connected to this on-air timeslot\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003077{
3078 struct gsm_bts_trx_ts *ts = vty->index;
3079
Harald Welte42581822009-08-08 16:12:58 +02003080 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003081
3082 return CMD_SUCCESS;
3083}
Harald Welte5258fc42009-03-28 19:07:53 +00003084
Harald Welte4f10c252010-05-16 21:47:13 +02003085void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
3086{
3087 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +02003088 osmo_counter_get(net->stats.chreq.total),
3089 osmo_counter_get(net->stats.chreq.no_channel), VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003090 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +02003091 osmo_counter_get(net->stats.chan.rf_fail),
3092 osmo_counter_get(net->stats.chan.rll_err), VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003093 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +02003094 osmo_counter_get(net->stats.paging.attempted),
3095 osmo_counter_get(net->stats.paging.completed),
3096 osmo_counter_get(net->stats.paging.expired), VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003097 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +02003098 osmo_counter_get(net->stats.bts.oml_fail),
3099 osmo_counter_get(net->stats.bts.rsl_fail), VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003100}
3101
Harald Welte5bc61dc2010-05-16 22:02:16 +02003102DEFUN(logging_fltr_imsi,
3103 logging_fltr_imsi_cmd,
3104 "logging filter imsi IMSI",
3105 LOGGING_STR FILTER_STR
3106 "Filter log messages by IMSI\n" "IMSI to be used as filter\n")
3107{
Harald Welte8dcebd32011-02-18 21:10:05 +01003108 struct log_target *tgt = osmo_log_vty2tgt(vty);
Harald Welte5bc61dc2010-05-16 22:02:16 +02003109
Harald Welte8dcebd32011-02-18 21:10:05 +01003110 if (!tgt)
Harald Welte5bc61dc2010-05-16 22:02:16 +02003111 return CMD_WARNING;
Harald Welte5bc61dc2010-05-16 22:02:16 +02003112
Harald Welte8dcebd32011-02-18 21:10:05 +01003113 log_set_imsi_filter(tgt, argv[0]);
Harald Welte5bc61dc2010-05-16 22:02:16 +02003114 return CMD_SUCCESS;
3115}
3116
Harald Welte8dcebd32011-02-18 21:10:05 +01003117
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003118DEFUN(drop_bts,
3119 drop_bts_cmd,
Holger Hans Peter Freyther0586b0f2010-04-11 12:46:45 +02003120 "drop bts connection <0-65535> (oml|rsl)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003121 "Debug/Simulation command to drop Abis/IP BTS\n"
3122 "Debug/Simulation command to drop Abis/IP BTS\n"
3123 "Debug/Simulation command to drop Abis/IP BTS\n"
3124 "BTS NR\n" "Drop OML Connection\n" "Drop RSL Connection\n")
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003125{
3126 struct gsm_network *gsmnet;
3127 struct gsm_bts_trx *trx;
3128 struct gsm_bts *bts;
3129 unsigned int bts_nr;
3130
3131 gsmnet = gsmnet_from_vty(vty);
3132
3133 bts_nr = atoi(argv[0]);
3134 if (bts_nr >= gsmnet->num_bts) {
3135 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3136 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3137 return CMD_WARNING;
3138 }
3139
3140 bts = gsm_bts_num(gsmnet, bts_nr);
3141 if (!bts) {
3142 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3143 return CMD_WARNING;
3144 }
3145
3146 if (!is_ipaccess_bts(bts)) {
3147 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
3148 return CMD_WARNING;
3149 }
3150
3151
3152 /* close all connections */
3153 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003154 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003155 } else if (strcmp(argv[1], "rsl") == 0) {
3156 /* close all rsl connections */
3157 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003158 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003159 }
3160 } else {
3161 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
3162 return CMD_WARNING;
3163 }
3164
3165 return CMD_SUCCESS;
3166}
3167
Harald Welted0d2b0b2010-12-23 13:18:07 +01003168DEFUN(pdch_act, pdch_act_cmd,
3169 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
3170 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3171 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
3172 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
3173 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
3174{
3175 struct gsm_bts *bts;
3176 struct gsm_bts_trx *trx;
3177 struct gsm_bts_trx_ts *ts;
3178 int bts_nr = atoi(argv[0]);
3179 int trx_nr = atoi(argv[1]);
3180 int ts_nr = atoi(argv[2]);
3181 int activate;
3182
3183 bts = gsm_bts_num(bsc_gsmnet, bts_nr);
3184 if (!bts) {
3185 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3186 return CMD_WARNING;
3187 }
3188
3189 if (!is_ipaccess_bts(bts)) {
3190 vty_out(vty, "%% This command only works for ipaccess BTS%s",
3191 VTY_NEWLINE);
3192 return CMD_WARNING;
3193 }
3194
3195 trx = gsm_bts_trx_num(bts, trx_nr);
3196 if (!trx) {
3197 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
3198 return CMD_WARNING;
3199 }
3200
3201 ts = &trx->ts[ts_nr];
3202 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
3203 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
3204 "mode%s", ts_nr, VTY_NEWLINE);
3205 return CMD_WARNING;
3206 }
3207
3208 if (!strcmp(argv[3], "activate"))
3209 activate = 1;
3210 else
3211 activate = 0;
3212
3213 rsl_ipacc_pdch_activate(ts, activate);
3214
3215 return CMD_SUCCESS;
3216
3217}
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003218
Harald Weltedcccb182010-05-16 20:52:23 +02003219extern int bsc_vty_init_extra(void);
Harald Welte1353f962010-05-16 19:20:24 +02003220extern const char *openbsc_copyright;
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02003221
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01003222int bsc_vty_init(const struct log_info *cat)
Harald Welte68628e82009-03-10 12:17:57 +00003223{
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003224 cfg_ts_pchan_cmd.string =
3225 vty_cmd_string_from_valstr(tall_bsc_ctx,
3226 gsm_pchant_names,
3227 "phys_chan_config (", "|", ")",
3228 VTY_DO_LOWER);
3229 cfg_ts_pchan_cmd.doc =
3230 vty_cmd_string_from_valstr(tall_bsc_ctx,
3231 gsm_pchant_descs,
3232 "Physical Channel Combination\n",
3233 "\n", "", 0);
3234
Harald Weltee555c2b2012-08-17 13:02:12 +02003235 cfg_bts_type_cmd.string =
3236 vty_cmd_string_from_valstr(tall_bsc_ctx,
3237 bts_type_names,
3238 "type (", "|", ")",
3239 VTY_DO_LOWER);
3240 cfg_bts_type_cmd.doc =
3241 vty_cmd_string_from_valstr(tall_bsc_ctx,
3242 bts_type_descs,
3243 "BTS Vendor/Type\n",
3244 "\n", "", 0);
3245
3246
Harald Welteb4d5b172010-05-12 16:10:35 +00003247 install_element_ve(&show_net_cmd);
3248 install_element_ve(&show_bts_cmd);
3249 install_element_ve(&show_trx_cmd);
3250 install_element_ve(&show_ts_cmd);
3251 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08003252 install_element_ve(&show_lchan_summary_cmd);
Harald Welte5bc61dc2010-05-16 22:02:16 +02003253 install_element_ve(&logging_fltr_imsi_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00003254
Harald Welteb4d5b172010-05-12 16:10:35 +00003255 install_element_ve(&show_paging_cmd);
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01003256 install_element_ve(&show_paging_group_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00003257
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01003258 logging_vty_add_cmds(cat);
Harald Welte8dcebd32011-02-18 21:10:05 +01003259 install_element(CFG_LOG_NODE, &logging_fltr_imsi_cmd);
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01003260
Harald Welte5013b2a2009-08-07 13:29:14 +02003261 install_element(CONFIG_NODE, &cfg_net_cmd);
3262 install_node(&net_node, config_write_net);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01003263 vty_install_default(GSMNET_NODE);
Harald Welte42581822009-08-08 16:12:58 +02003264 install_element(GSMNET_NODE, &cfg_net_ncc_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02003265 install_element(GSMNET_NODE, &cfg_net_mnc_cmd);
3266 install_element(GSMNET_NODE, &cfg_net_name_short_cmd);
3267 install_element(GSMNET_NODE, &cfg_net_name_long_cmd);
Harald Welte (local)69de3972009-08-12 14:42:23 +02003268 install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd);
Harald Welte1085c092009-11-18 20:33:19 +01003269 install_element(GSMNET_NODE, &cfg_net_reject_cause_cmd);
Harald Welte4381cfe2009-08-30 15:47:06 +09003270 install_element(GSMNET_NODE, &cfg_net_encryption_cmd);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01003271 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Welteeab84a12009-12-13 10:53:12 +01003272 install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd);
Harald Welte3d23db42009-12-14 17:49:15 +01003273 install_element(GSMNET_NODE, &cfg_net_mm_info_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01003274 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-12-21 16:51:50 +01003275 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
3276 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
3277 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
3278 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
3279 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
3280 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01003281 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01003282 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
3283 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
3284 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
3285 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
3286 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
3287 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
3288 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
3289 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
3290 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltec9f499f2010-12-23 22:53:50 +01003291 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01003292 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08003293 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +01003294 install_element(GSMNET_NODE, &cfg_net_subscr_keep_cmd);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08003295 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02003296
3297 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02003298 install_node(&bts_node, config_write_bts);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01003299 vty_install_default(BTS_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00003300 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02003301 install_element(BTS_NODE, &cfg_description_cmd);
3302 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02003303 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02003304 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00003305 install_element(BTS_NODE, &cfg_bts_lac_cmd);
3306 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02003307 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00003308 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8b291802013-03-12 13:57:05 +01003309 install_element(BTS_NODE, &cfg_bts_rsl_ip_cmd);
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01003310 install_element(BTS_NODE, &cfg_bts_timezone_cmd);
Jacob Erlbeck946d1412013-09-17 13:59:29 +02003311 install_element(BTS_NODE, &cfg_bts_timezone_dst_cmd);
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01003312 install_element(BTS_NODE, &cfg_bts_no_timezone_cmd);
Sylvain Munautc9519462011-10-17 14:04:55 +02003313 install_element(BTS_NODE, &cfg_bts_nokia_site_skip_reset_cmd);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01003314 install_element(BTS_NODE, &cfg_bts_nokia_site_no_loc_rel_cnf_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02003315 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-08-08 16:12:58 +02003316 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
3317 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte7a8fa412009-08-10 13:48:16 +02003318 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01003319 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
3320 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02003321 install_element(BTS_NODE, &cfg_bts_chan_desc_att_cmd);
3322 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_pa_mfrms_cmd);
3323 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_ag_blks_res_cmd);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08003324 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
3325 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02003326 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08003327 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Ivan Kluchnikov67920592013-09-16 13:13:04 +04003328 install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02003329 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02003330 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02003331 install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
Harald Welte73225282009-12-12 18:17:25 +01003332 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
3333 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaute0b06b02010-11-28 18:17:28 +01003334 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
3335 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
3336 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
3337 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
3338 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
3339 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Harald Welte4511d892010-04-18 15:51:20 +02003340 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02003341 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08003342 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01003343 install_element(BTS_NODE, &cfg_bts_gprs_net_ctrl_ord_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08003344 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02003345 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08003346 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08003347 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-03-14 23:30:30 +08003348 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
3349 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
3350 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08003351 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welte9fbff4a2010-07-30 11:50:09 +02003352 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
3353 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welte32c09622011-01-11 23:44:56 +01003354 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
3355 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Welte64c07d22011-02-15 11:43:27 +01003356 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02003357 install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
3358 install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01003359 install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
3360 install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
Andreas Eversberga83d5112013-12-07 18:32:28 +01003361 install_element(BTS_NODE, &cfg_bts_codec0_cmd);
3362 install_element(BTS_NODE, &cfg_bts_codec1_cmd);
3363 install_element(BTS_NODE, &cfg_bts_codec2_cmd);
3364 install_element(BTS_NODE, &cfg_bts_codec3_cmd);
3365 install_element(BTS_NODE, &cfg_bts_codec4_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003366
Harald Welte5258fc42009-03-28 19:07:53 +00003367 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003368 install_node(&trx_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01003369 vty_install_default(TRX_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00003370 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02003371 install_element(TRX_NODE, &cfg_description_cmd);
3372 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003373 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02003374 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-08-08 16:12:58 +02003375 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
3376 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003377 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003378
Harald Welte5258fc42009-03-28 19:07:53 +00003379 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003380 install_node(&ts_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01003381 vty_install_default(TS_NODE);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003382 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003383 install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);
Harald Welte135a6482011-05-30 12:09:13 +02003384 install_element(TS_NODE, &cfg_ts_tsc_cmd);
Harald Weltea39b0f22010-06-14 22:26:10 +02003385 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte6e0cd042009-09-12 13:05:33 +02003386 install_element(TS_NODE, &cfg_ts_hsn_cmd);
3387 install_element(TS_NODE, &cfg_ts_maio_cmd);
3388 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
3389 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003390 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003391
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003392 install_element(ENABLE_NODE, &drop_bts_cmd);
Harald Welted0d2b0b2010-12-23 13:18:07 +01003393 install_element(ENABLE_NODE, &pdch_act_cmd);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003394
Harald Welte81c9b9c2010-05-31 16:40:40 +02003395 abis_nm_vty_init();
Harald Weltee1d5eca2011-02-12 14:42:59 +01003396 abis_om2k_vty_init();
Harald Welte3016d9f2011-02-05 13:54:41 +01003397 e1inp_vty_init();
Harald Welte81c9b9c2010-05-31 16:40:40 +02003398
Harald Weltedcccb182010-05-16 20:52:23 +02003399 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00003400
Harald Welte68628e82009-03-10 12:17:57 +00003401 return 0;
3402}