blob: 4fbf337164305ad227582b2c83d80d41e5f2cab7 [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>
Jacob Erlbeck64630cc2015-10-26 16:25:37 +010027#include <osmocom/vty/stats.h>
Harald Welte4b037e42010-05-19 19:45:32 +020028#include <osmocom/vty/telnet_interface.h>
Harald Welte4ab9d7c2012-08-17 12:42:06 +020029#include <osmocom/vty/misc.h>
Harald Welte68628e82009-03-10 12:17:57 +000030
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +010031#include <osmocom/gsm/gsm0502.h>
32
Harald Welte68628e82009-03-10 12:17:57 +000033#include <arpa/inet.h>
34
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010035#include <osmocom/core/linuxlist.h>
Harald Welte68628e82009-03-10 12:17:57 +000036#include <openbsc/gsm_data.h>
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +020037#include <osmocom/abis/e1_input.h>
Harald Welte1bc77352009-03-10 19:47:51 +000038#include <openbsc/abis_nm.h>
Harald Welte4d54d0b2011-02-19 16:48:17 +010039#include <openbsc/abis_om2000.h>
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010040#include <osmocom/core/utils.h>
41#include <osmocom/gsm/gsm_utils.h>
Harald Weltecdc59ff2011-05-23 20:42:26 +020042#include <osmocom/gsm/abis_nm.h>
Harald Welteb908cb72009-12-22 13:09:29 +010043#include <openbsc/chan_alloc.h>
Harald Welte8387a492009-12-22 21:43:14 +010044#include <openbsc/meas_rep.h>
Harald Welte40f82892009-05-23 17:31:39 +000045#include <openbsc/db.h>
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010046#include <osmocom/core/talloc.h>
Holger Hans Peter Freyther3c712322010-04-06 11:55:37 +020047#include <openbsc/vty.h>
Harald Welteea34a4e2012-06-16 14:59:56 +080048#include <osmocom/gprs/gprs_ns.h>
Harald Welte9fbff4a2010-07-30 11:50:09 +020049#include <openbsc/system_information.h>
Harald Welte5bc61dc2010-05-16 22:02:16 +020050#include <openbsc/debug.h>
Holger Hans Peter Freyther85334f12010-11-09 17:00:42 +010051#include <openbsc/paging.h>
Harald Weltef7a2b192011-08-20 18:25:02 +020052#include <openbsc/ipaccess.h>
Harald Welted0d2b0b2010-12-23 13:18:07 +010053#include <openbsc/abis_rsl.h>
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +010054#include <openbsc/osmo_msc_data.h>
55#include <openbsc/osmo_bsc_rf.h>
Harald Welte68628e82009-03-10 12:17:57 +000056
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +010057#include <inttypes.h>
58
Harald Weltec08e8be2011-03-04 13:53:51 +010059#include "../../bscconfig.h"
Harald Welte1353f962010-05-16 19:20:24 +020060
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +020061
62#define NETWORK_STR "Configure the GSM network\n"
63#define CODE_CMD_STR "Code commands\n"
64#define NAME_CMD_STR "Name Commands\n"
65#define NAME_STR "Name to use\n"
66#define LCHAN_NR_STR "Logical Channel Number\n"
67
68
Harald Welteea4647d2010-05-12 17:19:53 +000069/* FIXME: this should go to some common file */
70static const struct value_string gprs_ns_timer_strs[] = {
Harald Welte615e9562010-05-11 23:50:21 +020071 { 0, "tns-block" },
72 { 1, "tns-block-retries" },
73 { 2, "tns-reset" },
74 { 3, "tns-reset-retries" },
75 { 4, "tns-test" },
76 { 5, "tns-alive" },
77 { 6, "tns-alive-retries" },
78 { 0, NULL }
79};
80
Harald Welteea4647d2010-05-12 17:19:53 +000081static const struct value_string gprs_bssgp_cfg_strs[] = {
Harald Welte615e9562010-05-11 23:50:21 +020082 { 0, "blocking-timer" },
83 { 1, "blocking-retries" },
84 { 2, "unblocking-retries" },
85 { 3, "reset-timer" },
86 { 4, "reset-retries" },
87 { 5, "suspend-timer" },
88 { 6, "suspend-retries" },
89 { 7, "resume-timer" },
90 { 8, "resume-retries" },
91 { 9, "capability-update-timer" },
92 { 10, "capability-update-retries" },
93 { 0, NULL }
94};
95
Harald Welte64c07d22011-02-15 11:43:27 +010096static const struct value_string bts_neigh_mode_strs[] = {
97 { NL_MODE_AUTOMATIC, "automatic" },
98 { NL_MODE_MANUAL, "manual" },
99 { NL_MODE_MANUAL_SI5SEP, "manual-si5" },
100 { 0, NULL }
101};
102
Daniel Willmann7d109832012-05-14 18:43:23 +0200103const struct value_string bts_loc_fix_names[] = {
104 { BTS_LOC_FIX_INVALID, "invalid" },
105 { BTS_LOC_FIX_2D, "fix2d" },
106 { BTS_LOC_FIX_3D, "fix3d" },
107 { 0, NULL }
108};
109
Harald Welte5013b2a2009-08-07 13:29:14 +0200110struct cmd_node net_node = {
111 GSMNET_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200112 "%s(config-net)# ",
Harald Welte5013b2a2009-08-07 13:29:14 +0200113 1,
114};
115
Harald Welte68628e82009-03-10 12:17:57 +0000116struct cmd_node bts_node = {
117 BTS_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200118 "%s(config-net-bts)# ",
Harald Welte68628e82009-03-10 12:17:57 +0000119 1,
120};
121
122struct cmd_node trx_node = {
123 TRX_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200124 "%s(config-net-bts-trx)# ",
Harald Welte68628e82009-03-10 12:17:57 +0000125 1,
126};
127
128struct cmd_node ts_node = {
129 TS_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200130 "%s(config-net-bts-trx-ts)# ",
Harald Welte68628e82009-03-10 12:17:57 +0000131 1,
132};
133
Harald Welte39231152010-05-27 13:39:40 +0200134extern struct gsm_network *bsc_gsmnet;
135
Harald Weltedcccb182010-05-16 20:52:23 +0200136struct gsm_network *gsmnet_from_vty(struct vty *v)
137{
Harald Welte39231152010-05-27 13:39:40 +0200138 /* In case we read from the config file, the vty->priv cannot
139 * point to a struct telnet_connection, and thus conn->priv
140 * will not point to the gsm_network structure */
141#if 0
Harald Weltedcccb182010-05-16 20:52:23 +0200142 struct telnet_connection *conn = v->priv;
143 return (struct gsm_network *) conn->priv;
Harald Welte39231152010-05-27 13:39:40 +0200144#else
145 return bsc_gsmnet;
146#endif
Harald Weltedcccb182010-05-16 20:52:23 +0200147}
148
Harald Welte68628e82009-03-10 12:17:57 +0000149static int dummy_config_write(struct vty *v)
150{
151 return CMD_SUCCESS;
152}
153
154static void net_dump_nmstate(struct vty *vty, struct gsm_nm_state *nms)
155{
Harald Welte1304b352013-03-15 16:57:33 +0100156 vty_out(vty,"Oper '%s', Admin '%s', Avail '%s'%s",
157 abis_nm_opstate_name(nms->operational),
158 get_value_string(abis_nm_adm_state_names, nms->administrative),
Harald Welte867d9f32011-05-23 20:30:39 +0200159 abis_nm_avail_name(nms->availability), VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000160}
161
Harald Welteb908cb72009-12-22 13:09:29 +0100162static void dump_pchan_load_vty(struct vty *vty, char *prefix,
163 const struct pchan_load *pl)
164{
165 int i;
166
167 for (i = 0; i < ARRAY_SIZE(pl->pchan); i++) {
168 const struct load_counter *lc = &pl->pchan[i];
169 unsigned int percent;
170
171 if (lc->total == 0)
172 continue;
173
174 percent = (lc->used * 100) / lc->total;
175
176 vty_out(vty, "%s%20s: %3u%% (%u/%u)%s", prefix,
177 gsm_pchan_name(i), percent, lc->used, lc->total,
178 VTY_NEWLINE);
179 }
180}
181
Harald Welte68628e82009-03-10 12:17:57 +0000182static void net_dump_vty(struct vty *vty, struct gsm_network *net)
183{
Harald Welteb908cb72009-12-22 13:09:29 +0100184 struct pchan_load pl;
185
Harald Welteef235b52009-03-10 12:34:02 +0000186 vty_out(vty, "BSC is on Country Code %u, Network Code %u "
187 "and has %u BTS%s", net->country_code, net->network_code,
188 net->num_bts, VTY_NEWLINE);
Harald Welte1bc77352009-03-10 19:47:51 +0000189 vty_out(vty, " Long network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000190 net->name_long, VTY_NEWLINE);
Harald Welte1bc77352009-03-10 19:47:51 +0000191 vty_out(vty, " Short network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000192 net->name_short, VTY_NEWLINE);
Harald Welte (local)69de3972009-08-12 14:42:23 +0200193 vty_out(vty, " Authentication policy: %s%s",
194 gsm_auth_policy_name(net->auth_policy), VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100195 vty_out(vty, " Location updating reject cause: %u%s",
196 net->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900197 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
198 VTY_NEWLINE);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +0100199 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
200 VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800201 vty_out(vty, " Use TCH for Paging any: %d%s", net->pag_any_tch,
202 VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100203 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
204 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100205 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
206 VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100207 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
208 VTY_NEWLINE);
Harald Welteb908cb72009-12-22 13:09:29 +0100209 network_chan_load(&pl, net);
210 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
211 dump_pchan_load_vty(vty, " ", &pl);
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100212
213 /* show rf */
Holger Hans Peter Freythera9fae1a2014-02-08 12:12:03 +0100214 if (net->bsc_data)
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100215 vty_out(vty, " Last RF Command: %s%s",
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200216 net->bsc_data->rf_ctrl->last_state_command,
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100217 VTY_NEWLINE);
Holger Hans Peter Freythera9fae1a2014-02-08 12:12:03 +0100218 if (net->bsc_data)
Jacob Erlbeck779a7282013-09-11 10:46:57 +0200219 vty_out(vty, " Last RF Lock Command: %s%s",
220 net->bsc_data->rf_ctrl->last_rf_lock_ctrl_command,
221 VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000222}
223
224DEFUN(show_net, show_net_cmd, "show network",
225 SHOW_STR "Display information about a GSM NETWORK\n")
226{
Harald Weltedcccb182010-05-16 20:52:23 +0200227 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000228 net_dump_vty(vty, net);
229
230 return CMD_SUCCESS;
231}
232
233static void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l)
234{
Harald Welteedb37782009-05-01 14:59:07 +0000235 struct e1inp_line *line;
236
237 if (!e1l) {
238 vty_out(vty, " None%s", VTY_NEWLINE);
239 return;
240 }
241
242 line = e1l->ts->line;
243
244 vty_out(vty, " E1 Line %u, Type %s: Timeslot %u, Mode %s%s",
245 line->num, line->driver->name, e1l->ts->num,
Harald Welte1bc77352009-03-10 19:47:51 +0000246 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
Harald Welteedb37782009-05-01 14:59:07 +0000247 vty_out(vty, " E1 TEI %u, SAPI %u%s",
Harald Welte68628e82009-03-10 12:17:57 +0000248 e1l->tei, e1l->sapi, VTY_NEWLINE);
249}
250
251static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
252{
Harald Welteb908cb72009-12-22 13:09:29 +0100253 struct pchan_load pl;
254
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200255 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Welte557c84e2015-11-20 10:50:24 +0100256 "BSIC %u (NCC=%u, BCC=%u) and %u TRX%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200257 bts->nr, btstype2str(bts->type), gsm_band_name(bts->band),
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200258 bts->cell_identity,
Harald Weltea2bbc5e2015-11-20 10:43:31 +0100259 bts->location_area_code, bts->bsic,
Harald Welte557c84e2015-11-20 10:50:24 +0100260 bts->bsic >> 3, bts->bsic & 7,
Harald Weltefcd24452009-06-20 18:15:19 +0200261 bts->num_trx, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200262 vty_out(vty, "Description: %s%s",
263 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Harald Welte1d8dbc42009-12-12 15:38:16 +0100264 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100265 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte1d8dbc42009-12-12 15:38:16 +0100266 rxlev2dbm(bts->si_common.cell_sel_par.rxlev_acc_min),
267 VTY_NEWLINE);
268 vty_out(vty, "Cell Reselection Hysteresis: %u dBm%s",
Harald Welte73225282009-12-12 18:17:25 +0100269 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100270 vty_out(vty, "RACH TX-Integer: %u%s", bts->si_common.rach_control.tx_integer,
271 VTY_NEWLINE);
272 vty_out(vty, "RACH Max transmissions: %u%s",
273 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
274 VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100275 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200276 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +0200277 vty_out(vty, "Channel Description Attachment: %s%s",
278 (bts->si_common.chan_desc.att) ? "yes" : "no", VTY_NEWLINE);
279 vty_out(vty, "Channel Description BS-PA-MFRMS: %u%s",
280 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
281 vty_out(vty, "Channel Description BS-AG_BLKS-RES: %u%s",
282 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
Harald Welte9fbff4a2010-07-30 11:50:09 +0200283 vty_out(vty, "System Information present: 0x%08x, static: 0x%08x%s",
284 bts->si_valid, bts->si_mode_static, VTY_NEWLINE);
Harald Welte4cc34222009-05-01 15:12:31 +0000285 if (is_ipaccess_bts(bts))
Harald Welte8175e952009-10-20 00:22:00 +0200286 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte4cc34222009-05-01 15:12:31 +0000287 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte8175e952009-10-20 00:22:00 +0200288 bts->oml_tei, VTY_NEWLINE);
Sylvain Munautc9519462011-10-17 14:04:55 +0200289 else if (bts->type == GSM_BTS_TYPE_NOKIA_SITE)
290 vty_out(vty, " Skip Reset: %d%s",
291 bts->nokia.skip_reset, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000292 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200293 net_dump_nmstate(vty, &bts->mo.nm_state);
Harald Welte68628e82009-03-10 12:17:57 +0000294 vty_out(vty, " Site Mgr NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200295 net_dump_nmstate(vty, &bts->site_mgr.mo.nm_state);
Holger Hans Peter Freyther846d8dc2013-05-29 16:22:09 +0200296 vty_out(vty, " GPRS NSE: ");
297 net_dump_nmstate(vty, &bts->gprs.nse.mo.nm_state);
298 vty_out(vty, " GPRS CELL: ");
299 net_dump_nmstate(vty, &bts->gprs.cell.mo.nm_state);
300 vty_out(vty, " GPRS NSVC0: ");
301 net_dump_nmstate(vty, &bts->gprs.nsvc[0].mo.nm_state);
302 vty_out(vty, " GPRS NSVC1: ");
303 net_dump_nmstate(vty, &bts->gprs.nsvc[1].mo.nm_state);
Holger Hans Peter Freyther66e14cd2011-04-26 15:52:34 +0200304 vty_out(vty, " Paging: %u pending requests, %u free slots%s",
305 paging_pending_requests_nr(bts),
Harald Welte68628e82009-03-10 12:17:57 +0000306 bts->paging.available_slots, VTY_NEWLINE);
Holger Hans Peter Freytherd283db42010-11-25 16:28:45 +0100307 if (is_ipaccess_bts(bts)) {
308 vty_out(vty, " OML Link state: %s.%s",
309 bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);
310 } else {
Harald Welte8175e952009-10-20 00:22:00 +0200311 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
312 e1isl_dump_vty(vty, bts->oml_link);
313 }
Holger Hans Peter Freytherd283db42010-11-25 16:28:45 +0100314
315 /* FIXME: chan_desc */
Harald Welteb908cb72009-12-22 13:09:29 +0100316 memset(&pl, 0, sizeof(pl));
317 bts_chan_load(&pl, bts);
318 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
319 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte68628e82009-03-10 12:17:57 +0000320}
321
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100322DEFUN(show_bts, show_bts_cmd, "show bts [<0-255>]",
Harald Welte68628e82009-03-10 12:17:57 +0000323 SHOW_STR "Display information about a BTS\n"
324 "BTS number")
325{
Harald Weltedcccb182010-05-16 20:52:23 +0200326 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000327 int bts_nr;
328
329 if (argc != 0) {
330 /* use the BTS number that the user has specified */
331 bts_nr = atoi(argv[0]);
Harald Welte712ddbc2010-12-24 12:24:03 +0100332 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000333 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000334 VTY_NEWLINE);
335 return CMD_WARNING;
336 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200337 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000338 return CMD_SUCCESS;
339 }
340 /* print all BTS's */
341 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee441d9c2009-06-21 16:17:15 +0200342 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000343
344 return CMD_SUCCESS;
345}
346
Harald Welte42581822009-08-08 16:12:58 +0200347/* utility functions */
348static void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,
349 const char *ts, const char *ss)
350{
351 e1_link->e1_nr = atoi(line);
352 e1_link->e1_ts = atoi(ts);
353 if (!strcmp(ss, "full"))
354 e1_link->e1_ts_ss = 255;
355 else
356 e1_link->e1_ts_ss = atoi(ss);
357}
358
359static void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,
360 const char *prefix)
361{
362 if (!e1_link->e1_ts)
363 return;
364
365 if (e1_link->e1_ts_ss == 255)
366 vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",
367 prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);
368 else
369 vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",
370 prefix, e1_link->e1_nr, e1_link->e1_ts,
371 e1_link->e1_ts_ss, VTY_NEWLINE);
372}
373
374
Harald Welte67ce0732009-08-06 19:06:46 +0200375static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
376{
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100377 vty_out(vty, " timeslot %u%s", ts->nr, VTY_NEWLINE);
Harald Weltea2bbc5e2015-11-20 10:43:31 +0100378 if (ts->tsc != -1)
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100379 vty_out(vty, " training_sequence_code %u%s", ts->tsc, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200380 if (ts->pchan != GSM_PCHAN_NONE)
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100381 vty_out(vty, " phys_chan_config %s%s",
Harald Welte42581822009-08-08 16:12:58 +0200382 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100383 vty_out(vty, " hopping enabled %u%s",
Harald Weltea39b0f22010-06-14 22:26:10 +0200384 ts->hopping.enabled, VTY_NEWLINE);
385 if (ts->hopping.enabled) {
386 unsigned int i;
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100387 vty_out(vty, " hopping sequence-number %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200388 ts->hopping.hsn, VTY_NEWLINE);
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100389 vty_out(vty, " hopping maio %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200390 ts->hopping.maio, VTY_NEWLINE);
Harald Weltea39b0f22010-06-14 22:26:10 +0200391 for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {
392 if (!bitvec_get_bit_pos(&ts->hopping.arfcns, i))
393 continue;
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100394 vty_out(vty, " hopping arfcn add %u%s",
Harald Weltea39b0f22010-06-14 22:26:10 +0200395 i, VTY_NEWLINE);
396 }
Harald Welte127af342010-12-24 12:07:07 +0100397 }
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100398 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Welteface7ed2011-02-14 16:15:21 +0100399
400 if (ts->trx->bts->model->config_write_ts)
401 ts->trx->bts->model->config_write_ts(vty, ts);
Harald Welte67ce0732009-08-06 19:06:46 +0200402}
403
404static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
405{
406 int i;
407
Harald Welte5013b2a2009-08-07 13:29:14 +0200408 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200409 if (trx->description)
410 vty_out(vty, " description %s%s", trx->description,
411 VTY_NEWLINE);
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200412 vty_out(vty, " rf_locked %u%s",
Harald Welted64c0bc2011-05-30 12:07:53 +0200413 trx->mo.nm_state.administrative == NM_STATE_LOCKED ? 1 : 0,
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200414 VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200415 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)7b37d972009-12-27 20:56:38 +0100416 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200417 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200418 config_write_e1_link(vty, &trx->rsl_e1_link, " rsl ");
419 vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei, VTY_NEWLINE);
Harald Welte67ce0732009-08-06 19:06:46 +0200420
Harald Welteface7ed2011-02-14 16:15:21 +0100421 if (trx->bts->model->config_write_trx)
422 trx->bts->model->config_write_trx(vty, trx);
423
Harald Welte67ce0732009-08-06 19:06:46 +0200424 for (i = 0; i < TRX_NR_TS; i++)
425 config_write_ts_single(vty, &trx->ts[i]);
426}
427
Harald Welte615e9562010-05-11 23:50:21 +0200428static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
429{
430 unsigned int i;
431 vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
432 VTY_NEWLINE);
433 if (bts->gprs.mode == BTS_GPRS_NONE)
434 return;
435
436 vty_out(vty, " gprs routing area %u%s", bts->gprs.rac,
437 VTY_NEWLINE);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +0100438 vty_out(vty, " gprs network-control-order nc%u%s",
439 bts->gprs.net_ctrl_ord, VTY_NEWLINE);
Harald Welte615e9562010-05-11 23:50:21 +0200440 vty_out(vty, " gprs cell bvci %u%s", bts->gprs.cell.bvci,
441 VTY_NEWLINE);
442 for (i = 0; i < ARRAY_SIZE(bts->gprs.cell.timer); i++)
443 vty_out(vty, " gprs cell timer %s %u%s",
444 get_value_string(gprs_bssgp_cfg_strs, i),
445 bts->gprs.cell.timer[i], VTY_NEWLINE);
446 vty_out(vty, " gprs nsei %u%s", bts->gprs.nse.nsei,
447 VTY_NEWLINE);
448 for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)
449 vty_out(vty, " gprs ns timer %s %u%s",
450 get_value_string(gprs_ns_timer_strs, i),
451 bts->gprs.nse.timer[i], VTY_NEWLINE);
452 for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
453 struct gsm_bts_gprs_nsvc *nsvc =
454 &bts->gprs.nsvc[i];
455 struct in_addr ia;
456
457 ia.s_addr = htonl(nsvc->remote_ip);
458 vty_out(vty, " gprs nsvc %u nsvci %u%s", i,
459 nsvc->nsvci, VTY_NEWLINE);
460 vty_out(vty, " gprs nsvc %u local udp port %u%s", i,
461 nsvc->local_port, VTY_NEWLINE);
462 vty_out(vty, " gprs nsvc %u remote udp port %u%s", i,
463 nsvc->remote_port, VTY_NEWLINE);
464 vty_out(vty, " gprs nsvc %u remote ip %s%s", i,
465 inet_ntoa(ia), VTY_NEWLINE);
466 }
467}
468
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200469/* Write the model data if there is one */
470static void config_write_bts_model(struct vty *vty, struct gsm_bts *bts)
Harald Welte67ce0732009-08-06 19:06:46 +0200471{
472 struct gsm_bts_trx *trx;
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200473
474 if (!bts->model)
475 return;
476
477 if (bts->model->config_write_bts)
478 bts->model->config_write_bts(vty, bts);
479
480 llist_for_each_entry(trx, &bts->trx_list, list)
481 config_write_trx_single(vty, trx);
482}
483
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +0200484static void write_amr_modes(struct vty *vty, const char *prefix,
485 const char *name, struct amr_mode *modes, int num)
486{
487 int i;
488
489 vty_out(vty, " %s threshold %s", prefix, name);
490 for (i = 0; i < num - 1; i++)
491 vty_out(vty, " %d", modes[i].threshold);
492 vty_out(vty, "%s", VTY_NEWLINE);
493 vty_out(vty, " %s hysteresis %s", prefix, name);
494 for (i = 0; i < num - 1; i++)
495 vty_out(vty, " %d", modes[i].hysteresis);
496 vty_out(vty, "%s", VTY_NEWLINE);
497}
498
Andreas Eversberg73266522014-01-19 11:47:44 +0100499static void config_write_bts_amr(struct vty *vty, struct gsm_bts *bts,
500 struct amr_multirate_conf *mr, int full)
501{
502 struct gsm48_multi_rate_conf *mr_conf;
503 const char *prefix = (full) ? "amr tch-f" : "amr tch-h";
504 int i, num;
505
506 if (!(mr->gsm48_ie[1]))
507 return;
508
509 mr_conf = (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
510
511 num = 0;
512 vty_out(vty, " %s modes", prefix);
513 for (i = 0; i < ((full) ? 8 : 6); i++) {
514 if ((mr->gsm48_ie[1] & (1 << i))) {
515 vty_out(vty, " %d", i);
516 num++;
517 }
518 }
519 vty_out(vty, "%s", VTY_NEWLINE);
520 if (num > 4)
521 num = 4;
522 if (num > 1) {
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +0200523 write_amr_modes(vty, prefix, "ms", mr->ms_mode, num);
524 write_amr_modes(vty, prefix, "bts", mr->bts_mode, num);
Andreas Eversberg73266522014-01-19 11:47:44 +0100525 }
526 vty_out(vty, " %s start-mode ", prefix);
527 if (mr_conf->icmi) {
528 num = 0;
529 for (i = 0; i < ((full) ? 8 : 6) && num < 4; i++) {
530 if ((mr->gsm48_ie[1] & (1 << i)))
531 num++;
532 if (mr_conf->smod == num - 1) {
533 vty_out(vty, "%d%s", num, VTY_NEWLINE);
534 break;
535 }
536 }
537 } else
538 vty_out(vty, "auto%s", VTY_NEWLINE);
539}
540
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200541static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
542{
Harald Welte9fbff4a2010-07-30 11:50:09 +0200543 int i;
Harald Welte67ce0732009-08-06 19:06:46 +0200544
Harald Welte5013b2a2009-08-07 13:29:14 +0200545 vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE);
546 vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200547 if (bts->description)
548 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200549 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freytherf926ed62009-11-19 16:38:49 +0100550 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200551 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte67ce0732009-08-06 19:06:46 +0200552 VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200553 vty_out(vty, " base_station_id_code %u%s", bts->bsic, VTY_NEWLINE);
Jacob Erlbeck946d1412013-09-17 13:59:29 +0200554 if (bts->tz.override != 0) {
555 if (bts->tz.dst)
556 vty_out(vty, " timezone %d %d %d%s",
557 bts->tz.hr, bts->tz.mn, bts->tz.dst, VTY_NEWLINE);
558 else
559 vty_out(vty, " timezone %d %d%s",
560 bts->tz.hr, bts->tz.mn, VTY_NEWLINE);
561 }
Harald Welte (local)0e451d02009-08-13 10:14:26 +0200562 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100563 vty_out(vty, " cell reselection hysteresis %u%s",
564 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
565 vty_out(vty, " rxlev access min %u%s",
566 bts->si_common.cell_sel_par.rxlev_acc_min, VTY_NEWLINE);
Sylvain Munaute0b06b02010-11-28 18:17:28 +0100567
568 if (bts->si_common.cell_ro_sel_par.present) {
569 struct gsm48_si_selection_params *sp;
570 sp = &bts->si_common.cell_ro_sel_par;
571
572 if (sp->cbq)
573 vty_out(vty, " cell bar qualify %u%s",
574 sp->cbq, VTY_NEWLINE);
575
576 if (sp->cell_resel_off)
577 vty_out(vty, " cell reselection offset %u%s",
578 sp->cell_resel_off*2, VTY_NEWLINE);
579
580 if (sp->temp_offs == 7)
581 vty_out(vty, " temporary offset infinite%s",
582 VTY_NEWLINE);
583 else if (sp->temp_offs)
584 vty_out(vty, " temporary offset %u%s",
585 sp->temp_offs*10, VTY_NEWLINE);
586
587 if (sp->penalty_time == 31)
588 vty_out(vty, " penalty time reserved%s",
589 VTY_NEWLINE);
590 else if (sp->penalty_time)
591 vty_out(vty, " penalty time %u%s",
592 (sp->penalty_time*20)+20, VTY_NEWLINE);
593 }
594
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +0200595 /* Is periodic LU enabled or disabled? */
596 if (bts->si_common.chan_desc.t3212 == 0)
597 vty_out(vty, " no periodic location update%s", VTY_NEWLINE);
598 else
599 vty_out(vty, " periodic location update %u%s",
600 bts->si_common.chan_desc.t3212 * 6, VTY_NEWLINE);
601
Andreas Eversberg4d4944a2013-03-10 11:49:35 +0100602 vty_out(vty, " radio-link-timeout %d%s",
603 get_radio_link_timeout(&bts->si_common.cell_options),
604 VTY_NEWLINE);
Harald Welte7a8fa412009-08-10 13:48:16 +0200605 vty_out(vty, " channel allocator %s%s",
606 bts->chan_alloc_reverse ? "descending" : "ascending",
607 VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100608 vty_out(vty, " rach tx integer %u%s",
609 bts->si_common.rach_control.tx_integer, VTY_NEWLINE);
610 vty_out(vty, " rach max transmission %u%s",
611 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
612 VTY_NEWLINE);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800613
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +0200614 vty_out(vty, " channel-descrption attach %u%s",
615 bts->si_common.chan_desc.att, VTY_NEWLINE);
616 vty_out(vty, " channel-descrption bs-pa-mfrms %u%s",
617 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
618 vty_out(vty, " channel-descrption bs-ag-blks-res %u%s",
619 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
620
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800621 if (bts->rach_b_thresh != -1)
622 vty_out(vty, " rach nm busy threshold %u%s",
623 bts->rach_b_thresh, VTY_NEWLINE);
624 if (bts->rach_ldavg_slots != -1)
625 vty_out(vty, " rach nm load average %u%s",
626 bts->rach_ldavg_slots, VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100627 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200628 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +0800629 if ((bts->si_common.rach_control.t2 & 0x4) == 0)
630 vty_out(vty, " rach emergency call allowed 1%s", VTY_NEWLINE);
Ivan Kluchnikov67920592013-09-16 13:13:04 +0400631 if ((bts->si_common.rach_control.t3) != 0)
632 for (i = 0; i < 8; i++)
633 if (bts->si_common.rach_control.t3 & (0x1 << i))
634 vty_out(vty, " rach access-control-class %d barred%s", i, VTY_NEWLINE);
635 if ((bts->si_common.rach_control.t2 & 0xfb) != 0)
636 for (i = 0; i < 8; i++)
637 if ((i != 2) && (bts->si_common.rach_control.t2 & (0x1 << i)))
638 vty_out(vty, " rach access-control-class %d barred%s", i+8, VTY_NEWLINE);
Harald Welte9fbff4a2010-07-30 11:50:09 +0200639 for (i = SYSINFO_TYPE_1; i < _MAX_SYSINFO_TYPE; i++) {
640 if (bts->si_mode_static & (1 << i)) {
641 vty_out(vty, " system-information %s mode static%s",
642 get_value_string(osmo_sitype_strs, i), VTY_NEWLINE);
643 vty_out(vty, " system-information %s static %s%s",
644 get_value_string(osmo_sitype_strs, i),
Sylvain Munaut63ef2152011-11-13 23:05:23 +0100645 osmo_hexdump_nospc(bts->si_buf[i], sizeof(bts->si_buf[i])),
Harald Welte9fbff4a2010-07-30 11:50:09 +0200646 VTY_NEWLINE);
647 }
648 }
Harald Weltefd355a32011-03-04 13:41:31 +0100649 switch (bts->type) {
650 case GSM_BTS_TYPE_NANOBTS:
Harald Weltef383aa12012-07-02 19:51:55 +0200651 case GSM_BTS_TYPE_OSMO_SYSMO:
Harald Welte5013b2a2009-08-07 13:29:14 +0200652 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Weltea6fd58e2009-08-07 00:25:23 +0200653 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte8b291802013-03-12 13:57:05 +0100654 if (bts->ip_access.rsl_ip) {
655 struct in_addr ia;
656 ia.s_addr = htonl(bts->ip_access.rsl_ip);
657 vty_out(vty, " ip.access rsl-ip %s%s", inet_ntoa(ia),
658 VTY_NEWLINE);
659 }
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +0200660 vty_out(vty, " oml ip.access stream_id %u line %u%s",
661 bts->oml_tei, bts->oml_e1_link.e1_nr, VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100662 break;
Sylvain Munautc9519462011-10-17 14:04:55 +0200663 case GSM_BTS_TYPE_NOKIA_SITE:
664 vty_out(vty, " nokia_site skip-reset %d%s", bts->nokia.skip_reset, VTY_NEWLINE);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +0100665 vty_out(vty, " nokia_site no-local-rel-conf %d%s",
666 bts->nokia.no_loc_rel_cnf, VTY_NEWLINE);
Sipos Csaba56e17662015-02-07 13:27:36 +0100667 vty_out(vty, " nokia_site bts-reset-timer %d%s", bts->nokia.bts_reset_timer_cnf, VTY_NEWLINE);
Andreas Eversbergb6f95162013-12-05 16:02:37 +0100668 /* fall through: Nokia requires "oml e1" parameters also */
Harald Weltefd355a32011-03-04 13:41:31 +0100669 default:
Harald Welte42581822009-08-08 16:12:58 +0200670 config_write_e1_link(vty, &bts->oml_e1_link, " oml ");
671 vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100672 break;
Harald Welte42581822009-08-08 16:12:58 +0200673 }
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +0800674
675 /* if we have a limit, write it */
676 if (bts->paging.free_chans_need >= 0)
677 vty_out(vty, " paging free %d%s", bts->paging.free_chans_need, VTY_NEWLINE);
678
Harald Welte32c09622011-01-11 23:44:56 +0100679 vty_out(vty, " neighbor-list mode %s%s",
Harald Welte64c07d22011-02-15 11:43:27 +0100680 get_value_string(bts_neigh_mode_strs, bts->neigh_list_manual_mode), VTY_NEWLINE);
681 if (bts->neigh_list_manual_mode != NL_MODE_AUTOMATIC) {
Harald Welte32c09622011-01-11 23:44:56 +0100682 for (i = 0; i < 1024; i++) {
683 if (bitvec_get_bit_pos(&bts->si_common.neigh_list, i))
684 vty_out(vty, " neighbor-list add arfcn %u%s",
685 i, VTY_NEWLINE);
686 }
687 }
Harald Welte64c07d22011-02-15 11:43:27 +0100688 if (bts->neigh_list_manual_mode == NL_MODE_MANUAL_SI5SEP) {
689 for (i = 0; i < 1024; i++) {
690 if (bitvec_get_bit_pos(&bts->si_common.si5_neigh_list, i))
691 vty_out(vty, " si5 neighbor-list add arfcn %u%s",
692 i, VTY_NEWLINE);
693 }
694 }
Harald Welte32c09622011-01-11 23:44:56 +0100695
Andreas Eversberga83d5112013-12-07 18:32:28 +0100696 vty_out(vty, " codec-support fr");
697 if (bts->codec.hr)
698 vty_out(vty, " hr");
699 if (bts->codec.efr)
700 vty_out(vty, " efr");
701 if (bts->codec.amr)
702 vty_out(vty, " amr");
703 vty_out(vty, "%s", VTY_NEWLINE);
704
Andreas Eversberg73266522014-01-19 11:47:44 +0100705 config_write_bts_amr(vty, bts, &bts->mr_full, 1);
706 config_write_bts_amr(vty, bts, &bts->mr_half, 0);
707
Harald Welte615e9562010-05-11 23:50:21 +0200708 config_write_bts_gprs(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200709
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +0200710 if (bts->excl_from_rf_lock)
711 vty_out(vty, " rf-lock-exclude%s", VTY_NEWLINE);
712
Jacob Erlbeck65d114f2014-01-16 11:02:14 +0100713 vty_out(vty, " %sforce-combined-si%s",
714 bts->force_combined_si ? "" : "no ", VTY_NEWLINE);
715
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +0100716 for (i = 0; i < ARRAY_SIZE(bts->depends_on); ++i) {
717 int j;
718
719 if (bts->depends_on[i] == 0)
720 continue;
721
722 for (j = 0; j < sizeof(bts->depends_on[i]) * 8; ++j) {
723 int bts_nr;
724
725 if ((bts->depends_on[i] & (1<<j)) == 0)
726 continue;
727
728 bts_nr = (i * sizeof(bts->depends_on[i]) * 8) + j;
729 vty_out(vty, " depends-on-bts %d%s", bts_nr, VTY_NEWLINE);
730 }
731 }
732
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200733 config_write_bts_model(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200734}
735
736static int config_write_bts(struct vty *v)
737{
Harald Weltedcccb182010-05-16 20:52:23 +0200738 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte67ce0732009-08-06 19:06:46 +0200739 struct gsm_bts *bts;
740
741 llist_for_each_entry(bts, &gsmnet->bts_list, list)
742 config_write_bts_single(v, bts);
743
744 return CMD_SUCCESS;
745}
746
Harald Welte5013b2a2009-08-07 13:29:14 +0200747static int config_write_net(struct vty *vty)
748{
Harald Weltedcccb182010-05-16 20:52:23 +0200749 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
750
Harald Welte5013b2a2009-08-07 13:29:14 +0200751 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200752 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200753 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200754 vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE);
755 vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE);
Harald Welte (local)69de3972009-08-12 14:42:23 +0200756 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100757 vty_out(vty, " location updating reject cause %u%s",
758 gsmnet->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900759 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freytherd54c3372009-11-19 16:37:48 +0100760 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800761 vty_out(vty, " paging any use tch %d%s", gsmnet->pag_any_tch, VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100762 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
763 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100764 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100765 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Welteb720bd32009-12-21 16:51:50 +0100766 vty_out(vty, " handover window rxlev averaging %u%s",
767 gsmnet->handover.win_rxlev_avg, VTY_NEWLINE);
768 vty_out(vty, " handover window rxqual averaging %u%s",
769 gsmnet->handover.win_rxqual_avg, VTY_NEWLINE);
770 vty_out(vty, " handover window rxlev neighbor averaging %u%s",
771 gsmnet->handover.win_rxlev_avg_neigh, VTY_NEWLINE);
772 vty_out(vty, " handover power budget interval %u%s",
773 gsmnet->handover.pwr_interval, VTY_NEWLINE);
774 vty_out(vty, " handover power budget hysteresis %u%s",
775 gsmnet->handover.pwr_hysteresis, VTY_NEWLINE);
776 vty_out(vty, " handover maximum distance %u%s",
777 gsmnet->handover.max_distance, VTY_NEWLINE);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +0100778 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100779 vty_out(vty, " timer t3103 %u%s", gsmnet->T3103, VTY_NEWLINE);
780 vty_out(vty, " timer t3105 %u%s", gsmnet->T3105, VTY_NEWLINE);
781 vty_out(vty, " timer t3107 %u%s", gsmnet->T3107, VTY_NEWLINE);
782 vty_out(vty, " timer t3109 %u%s", gsmnet->T3109, VTY_NEWLINE);
783 vty_out(vty, " timer t3111 %u%s", gsmnet->T3111, VTY_NEWLINE);
784 vty_out(vty, " timer t3113 %u%s", gsmnet->T3113, VTY_NEWLINE);
785 vty_out(vty, " timer t3115 %u%s", gsmnet->T3115, VTY_NEWLINE);
786 vty_out(vty, " timer t3117 %u%s", gsmnet->T3117, VTY_NEWLINE);
787 vty_out(vty, " timer t3119 %u%s", gsmnet->T3119, VTY_NEWLINE);
Harald Welte2862dca2010-12-23 14:39:29 +0100788 vty_out(vty, " timer t3122 %u%s", gsmnet->T3122, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100789 vty_out(vty, " timer t3141 %u%s", gsmnet->T3141, VTY_NEWLINE);
Harald Welte63dbfc62010-12-15 15:34:23 +0100790 vty_out(vty, " dtx-used %u%s", gsmnet->dtx_enabled, VTY_NEWLINE);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +0100791 vty_out(vty, " subscriber-keep-in-ram %d%s",
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100792 gsmnet->subscr_group->keep_subscr, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200793
794 return CMD_SUCCESS;
795}
Harald Welte67ce0732009-08-06 19:06:46 +0200796
Harald Welte68628e82009-03-10 12:17:57 +0000797static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx)
798{
799 vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
800 trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200801 vty_out(vty, "Description: %s%s",
802 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Weltefcd24452009-06-20 18:15:19 +0200803 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte42581822009-08-08 16:12:58 +0200804 "resulting BS power: %d dBm%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200805 trx->nominal_power, trx->max_power_red,
Harald Welte42581822009-08-08 16:12:58 +0200806 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000807 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200808 net_dump_nmstate(vty, &trx->mo.nm_state);
Harald Welte68628e82009-03-10 12:17:57 +0000809 vty_out(vty, " Baseband Transceiver NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200810 net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);
Harald Welte8175e952009-10-20 00:22:00 +0200811 if (is_ipaccess_bts(trx->bts)) {
812 vty_out(vty, " ip.access stream ID: 0x%02x%s",
813 trx->rsl_tei, VTY_NEWLINE);
814 } else {
815 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
816 e1isl_dump_vty(vty, trx->rsl_link);
817 }
Harald Welte68628e82009-03-10 12:17:57 +0000818}
819
820DEFUN(show_trx,
821 show_trx_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100822 "show trx [<0-255>] [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200823 SHOW_STR "Display information about a TRX\n"
824 "BTS Number\n"
825 "TRX Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000826{
Harald Weltedcccb182010-05-16 20:52:23 +0200827 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000828 struct gsm_bts *bts = NULL;
829 struct gsm_bts_trx *trx;
830 int bts_nr, trx_nr;
831
832 if (argc >= 1) {
833 /* use the BTS number that the user has specified */
834 bts_nr = atoi(argv[0]);
835 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000836 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000837 VTY_NEWLINE);
838 return CMD_WARNING;
839 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200840 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000841 }
842 if (argc >= 2) {
843 trx_nr = atoi(argv[1]);
844 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000845 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000846 VTY_NEWLINE);
847 return CMD_WARNING;
848 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200849 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000850 trx_dump_vty(vty, trx);
851 return CMD_SUCCESS;
852 }
853 if (bts) {
854 /* print all TRX in this BTS */
855 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200856 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000857 trx_dump_vty(vty, trx);
858 }
859 return CMD_SUCCESS;
860 }
861
862 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200863 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000864 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200865 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000866 trx_dump_vty(vty, trx);
867 }
868 }
869
870 return CMD_SUCCESS;
871}
872
Harald Welte67ce0732009-08-06 19:06:46 +0200873
Harald Welte68628e82009-03-10 12:17:57 +0000874static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
875{
Harald Welte135a6482011-05-30 12:09:13 +0200876 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, phys cfg %s, TSC %u",
Harald Welte026b4ca2010-12-24 12:12:10 +0100877 ts->trx->bts->nr, ts->trx->nr, ts->nr,
Harald Welte1fe24122014-01-19 17:18:21 +0100878 gsm_pchan_name(ts->pchan), gsm_ts_tsc(ts));
Harald Weltecd103a92010-12-24 12:14:52 +0100879 if (ts->pchan == GSM_PCHAN_TCH_F_PDCH)
Harald Welteb29cea12010-12-24 12:26:13 +0100880 vty_out(vty, " (%s mode)",
Harald Weltecd103a92010-12-24 12:14:52 +0100881 ts->flags & TS_F_PDCH_MODE ? "PDCH" : "TCH/F");
882 vty_out(vty, "%s", VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000883 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200884 net_dump_nmstate(vty, &ts->mo.nm_state);
Harald Welte2c828992009-12-02 01:56:49 +0530885 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welteef235b52009-03-10 12:34:02 +0000886 vty_out(vty, " E1 Line %u, Timeslot %u, Subslot %u%s",
887 ts->e1_link.e1_nr, ts->e1_link.e1_ts,
888 ts->e1_link.e1_ts_ss, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000889}
890
891DEFUN(show_ts,
892 show_ts_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100893 "show timeslot [<0-255>] [<0-255>] [<0-7>]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200894 SHOW_STR "Display information about a TS\n"
895 "BTS Number\n" "TRX Number\n" "Timeslot Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000896{
Harald Weltedcccb182010-05-16 20:52:23 +0200897 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte274d0152010-12-24 12:05:03 +0100898 struct gsm_bts *bts = NULL;
899 struct gsm_bts_trx *trx = NULL;
900 struct gsm_bts_trx_ts *ts = NULL;
Harald Welte68628e82009-03-10 12:17:57 +0000901 int bts_nr, trx_nr, ts_nr;
902
903 if (argc >= 1) {
904 /* use the BTS number that the user has specified */
905 bts_nr = atoi(argv[0]);
906 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000907 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000908 VTY_NEWLINE);
909 return CMD_WARNING;
910 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200911 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000912 }
913 if (argc >= 2) {
914 trx_nr = atoi(argv[1]);
915 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000916 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000917 VTY_NEWLINE);
918 return CMD_WARNING;
919 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200920 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000921 }
922 if (argc >= 3) {
923 ts_nr = atoi(argv[2]);
924 if (ts_nr >= TRX_NR_TS) {
Harald Welte1bc77352009-03-10 19:47:51 +0000925 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
Harald Welte68628e82009-03-10 12:17:57 +0000926 VTY_NEWLINE);
927 return CMD_WARNING;
928 }
Harald Welte274d0152010-12-24 12:05:03 +0100929 /* Fully Specified: print and exit */
Harald Welte68628e82009-03-10 12:17:57 +0000930 ts = &trx->ts[ts_nr];
931 ts_dump_vty(vty, ts);
932 return CMD_SUCCESS;
933 }
Harald Welte274d0152010-12-24 12:05:03 +0100934
935 if (bts && trx) {
936 /* Iterate over all TS in this TRX */
937 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
938 ts = &trx->ts[ts_nr];
939 ts_dump_vty(vty, ts);
940 }
941 } else if (bts) {
942 /* Iterate over all TRX in this BTS, TS in each TRX */
Harald Welte68628e82009-03-10 12:17:57 +0000943 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200944 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000945 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
946 ts = &trx->ts[ts_nr];
947 ts_dump_vty(vty, ts);
948 }
949 }
Harald Welte274d0152010-12-24 12:05:03 +0100950 } else {
951 /* Iterate over all BTS, TRX in each BTS, TS in each TRX */
952 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
953 bts = gsm_bts_num(net, bts_nr);
954 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
955 trx = gsm_bts_trx_num(bts, trx_nr);
956 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
957 ts = &trx->ts[ts_nr];
958 ts_dump_vty(vty, ts);
959 }
960 }
961 }
Harald Welte68628e82009-03-10 12:17:57 +0000962 }
963
964 return CMD_SUCCESS;
965}
966
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100967static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte68628e82009-03-10 12:17:57 +0000968{
Harald Weltefcd24452009-06-20 18:15:19 +0200969 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte40f82892009-05-23 17:31:39 +0000970 subscr->authorized, VTY_NEWLINE);
Holger Hans Peter Freyther7f180e82013-12-12 15:45:41 +0100971 if (strlen(subscr->name))
Harald Welte1bc77352009-03-10 19:47:51 +0000972 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
Holger Hans Peter Freytherbd30cd32014-04-04 11:53:18 +0200973 if (strlen(subscr->extension))
Harald Welte68628e82009-03-10 12:17:57 +0000974 vty_out(vty, " Extension: %s%s", subscr->extension,
975 VTY_NEWLINE);
Holger Hans Peter Freyther5ccd0152013-07-14 08:38:24 +0200976 vty_out(vty, " IMSI: %s%s", subscr->imsi, VTY_NEWLINE);
Holger Hans Peter Freyther22230252009-08-19 12:53:57 +0200977 if (subscr->tmsi != GSM_RESERVED_TMSI)
978 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte731fd912009-08-15 03:24:51 +0200979 VTY_NEWLINE);
Sylvain Munautaf292642009-12-27 19:29:28 +0100980
Harald Welte (local)15920de2009-08-14 20:27:16 +0200981 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000982}
983
Harald Welte8387a492009-12-22 21:43:14 +0100984static void meas_rep_dump_uni_vty(struct vty *vty,
985 struct gsm_meas_rep_unidir *mru,
986 const char *prefix,
987 const char *dir)
988{
989 vty_out(vty, "%s RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",
990 prefix, dir, rxlev2dbm(mru->full.rx_lev),
991 dir, rxlev2dbm(mru->sub.rx_lev));
992 vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",
993 dir, mru->full.rx_qual, dir, mru->sub.rx_qual,
994 VTY_NEWLINE);
995}
996
997static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,
998 const char *prefix)
999{
1000 vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);
1001 vty_out(vty, "%s Flags: %s%s%s%s%s", prefix,
1002 mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",
1003 mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",
1004 mr->flags & MEAS_REP_F_FPC ? "FPC " : "",
1005 mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",
1006 VTY_NEWLINE);
1007 if (mr->flags & MEAS_REP_F_MS_TO)
1008 vty_out(vty, "%s MS Timing Offset: %u%s", prefix,
1009 mr->ms_timing_offset, VTY_NEWLINE);
1010 if (mr->flags & MEAS_REP_F_MS_L1)
1011 vty_out(vty, "%s L1 MS Power: %u dBm, Timing Advance: %u%s",
1012 prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);
1013 if (mr->flags & MEAS_REP_F_DL_VALID)
1014 meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");
1015 meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");
1016}
1017
Harald Welte0a8cf322015-12-05 17:22:49 +01001018/* FIXME: move this to libosmogsm */
1019static const struct value_string gsm48_cmode_names[] = {
1020 { GSM48_CMODE_SIGN, "signalling" },
1021 { GSM48_CMODE_SPEECH_V1, "FR or HR" },
1022 { GSM48_CMODE_SPEECH_EFR, "EFR" },
1023 { GSM48_CMODE_SPEECH_AMR, "AMR" },
1024 { GSM48_CMODE_DATA_14k5, "CSD(14k5)" },
1025 { GSM48_CMODE_DATA_12k0, "CSD(12k0)" },
1026 { GSM48_CMODE_DATA_6k0, "CSD(6k0)" },
1027 { GSM48_CMODE_DATA_3k6, "CSD(3k6)" },
1028 { 0, NULL }
1029};
1030
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001031static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte68628e82009-03-10 12:17:57 +00001032{
Harald Welte8387a492009-12-22 21:43:14 +01001033 int idx;
1034
Harald Welte85bded82010-12-24 12:22:34 +01001035 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",
1036 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
1037 lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);
Holger Hans Peter Freyther454140e2014-12-28 12:08:28 +01001038 vty_out(vty, " Connection: %u, State: %s%s%s%s",
Holger Hans Peter Freyther40494552010-06-28 17:09:29 +08001039 lchan->conn ? 1: 0,
Holger Hans Peter Freyther454140e2014-12-28 12:08:28 +01001040 gsm_lchans_name(lchan->state),
1041 lchan->state == LCHAN_S_BROKEN ? " Error reason: " : "",
1042 lchan->state == LCHAN_S_BROKEN ? lchan->broken_reason : "",
1043 VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +01001044 vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s",
1045 lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
1046 - lchan->bs_power*2,
1047 ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),
1048 VTY_NEWLINE);
Harald Welte0a8cf322015-12-05 17:22:49 +01001049 vty_out(vty, " Channel Mode / Codec: %s%s",
1050 get_value_string(gsm48_cmode_names, lchan->tch_mode),
1051 VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +08001052 if (lchan->conn && lchan->conn->subscr) {
Harald Welte68628e82009-03-10 12:17:57 +00001053 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +08001054 subscr_dump_vty(vty, lchan->conn->subscr);
Harald Welte68628e82009-03-10 12:17:57 +00001055 } else
1056 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte2c828992009-12-02 01:56:49 +05301057 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
1058 struct in_addr ia;
Holger Hans Peter Freyther54fa7992010-04-07 15:39:16 +02001059 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte2c828992009-12-02 01:56:49 +05301060 vty_out(vty, " Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",
1061 inet_ntoa(ia), lchan->abis_ip.bound_port,
1062 lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,
1063 VTY_NEWLINE);
1064 }
Harald Welte8387a492009-12-22 21:43:14 +01001065
1066 /* we want to report the last measurement report */
1067 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1068 lchan->meas_rep_idx, 1);
1069 meas_rep_dump_vty(vty, &lchan->meas_rep[idx], " ");
Harald Welte68628e82009-03-10 12:17:57 +00001070}
1071
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001072static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
1073{
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +08001074 struct gsm_meas_rep *mr;
1075 int idx;
1076
1077 /* we want to report the last measurement report */
1078 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1079 lchan->meas_rep_idx, 1);
1080 mr = &lchan->meas_rep[idx];
1081
Harald Welte85bded82010-12-24 12:22:34 +01001082 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u, Type %s - "
1083 "L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
1084 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
Harald Welteb29cea12010-12-24 12:26:13 +01001085 lchan->nr, gsm_lchant_name(lchan->type), mr->ms_l1.pwr,
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +08001086 rxlev2dbm(mr->dl.full.rx_lev),
1087 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001088 VTY_NEWLINE);
1089}
1090
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001091
1092static int dump_lchan_trx_ts(struct gsm_bts_trx_ts *ts, struct vty *vty,
1093 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1094{
1095 int lchan_nr;
1096 for (lchan_nr = 0; lchan_nr < TS_MAX_LCHAN; lchan_nr++) {
1097 struct gsm_lchan *lchan = &ts->lchan[lchan_nr];
1098 if ((lchan->type == GSM_LCHAN_NONE) && (lchan->state == LCHAN_S_NONE))
1099 continue;
1100 dump_cb(vty, lchan);
1101 }
1102
1103 return CMD_SUCCESS;
1104}
1105
1106static int dump_lchan_trx(struct gsm_bts_trx *trx, struct vty *vty,
1107 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1108{
1109 int ts_nr;
1110
1111 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
1112 struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
1113 dump_lchan_trx_ts(ts, vty, dump_cb);
1114 }
1115
1116 return CMD_SUCCESS;
1117}
1118
1119static int dump_lchan_bts(struct gsm_bts *bts, struct vty *vty,
1120 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1121{
1122 int trx_nr;
1123
1124 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
1125 struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, trx_nr);
1126 dump_lchan_trx(trx, vty, dump_cb);
1127 }
1128
1129 return CMD_SUCCESS;
1130}
1131
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001132static int lchan_summary(struct vty *vty, int argc, const char **argv,
1133 void (*dump_cb)(struct vty *, struct gsm_lchan *))
Harald Welte68628e82009-03-10 12:17:57 +00001134{
Harald Weltedcccb182010-05-16 20:52:23 +02001135 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +00001136 struct gsm_bts *bts;
1137 struct gsm_bts_trx *trx;
1138 struct gsm_bts_trx_ts *ts;
1139 struct gsm_lchan *lchan;
1140 int bts_nr, trx_nr, ts_nr, lchan_nr;
1141
1142 if (argc >= 1) {
1143 /* use the BTS number that the user has specified */
1144 bts_nr = atoi(argv[0]);
1145 if (bts_nr >= net->num_bts) {
1146 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1147 VTY_NEWLINE);
1148 return CMD_WARNING;
1149 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001150 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001151
1152 if (argc == 1)
1153 return dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001154 }
1155 if (argc >= 2) {
1156 trx_nr = atoi(argv[1]);
1157 if (trx_nr >= bts->num_trx) {
1158 vty_out(vty, "%% can't find TRX %s%s", argv[1],
1159 VTY_NEWLINE);
1160 return CMD_WARNING;
1161 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001162 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001163
1164 if (argc == 2)
1165 return dump_lchan_trx(trx, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001166 }
1167 if (argc >= 3) {
1168 ts_nr = atoi(argv[2]);
1169 if (ts_nr >= TRX_NR_TS) {
1170 vty_out(vty, "%% can't find TS %s%s", argv[2],
1171 VTY_NEWLINE);
1172 return CMD_WARNING;
1173 }
1174 ts = &trx->ts[ts_nr];
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001175
1176 if (argc == 3)
1177 return dump_lchan_trx_ts(ts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001178 }
1179 if (argc >= 4) {
1180 lchan_nr = atoi(argv[3]);
1181 if (lchan_nr >= TS_MAX_LCHAN) {
1182 vty_out(vty, "%% can't find LCHAN %s%s", argv[3],
1183 VTY_NEWLINE);
1184 return CMD_WARNING;
1185 }
1186 lchan = &ts->lchan[lchan_nr];
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001187 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +00001188 return CMD_SUCCESS;
1189 }
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001190
1191
Harald Welte68628e82009-03-10 12:17:57 +00001192 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001193 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001194 dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001195 }
1196
1197 return CMD_SUCCESS;
1198}
1199
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001200
1201DEFUN(show_lchan,
1202 show_lchan_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001203 "show lchan [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001204 SHOW_STR "Display information about a logical channel\n"
1205 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001206 LCHAN_NR_STR)
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001207
1208{
1209 return lchan_summary(vty, argc, argv, lchan_dump_full_vty);
1210}
1211
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001212DEFUN(show_lchan_summary,
1213 show_lchan_summary_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001214 "show lchan summary [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001215 SHOW_STR "Display information about a logical channel\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001216 "Short summary\n"
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001217 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001218 LCHAN_NR_STR)
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001219{
1220 return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
1221}
1222
Harald Weltebe4b7302009-05-23 16:59:33 +00001223static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
Harald Weltef5025b62009-03-28 16:55:11 +00001224{
1225 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
1226 subscr_dump_vty(vty, pag->subscr);
1227}
1228
Harald Weltebe4b7302009-05-23 16:59:33 +00001229static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
Harald Weltef5025b62009-03-28 16:55:11 +00001230{
1231 struct gsm_paging_request *pag;
1232
Holger Hans Peter Freyther9b5192b2013-03-03 11:03:17 +01001233 if (!bts->paging.bts)
1234 return;
1235
Harald Weltef5025b62009-03-28 16:55:11 +00001236 llist_for_each_entry(pag, &bts->paging.pending_requests, entry)
1237 paging_dump_vty(vty, pag);
1238}
1239
1240DEFUN(show_paging,
1241 show_paging_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001242 "show paging [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +02001243 SHOW_STR "Display information about paging reuqests of a BTS\n"
1244 "BTS Number\n")
Harald Weltef5025b62009-03-28 16:55:11 +00001245{
Harald Weltedcccb182010-05-16 20:52:23 +02001246 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Weltef5025b62009-03-28 16:55:11 +00001247 struct gsm_bts *bts;
1248 int bts_nr;
1249
1250 if (argc >= 1) {
1251 /* use the BTS number that the user has specified */
1252 bts_nr = atoi(argv[0]);
1253 if (bts_nr >= net->num_bts) {
1254 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1255 VTY_NEWLINE);
1256 return CMD_WARNING;
1257 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001258 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001259 bts_paging_dump_vty(vty, bts);
1260
1261 return CMD_SUCCESS;
1262 }
1263 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001264 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001265 bts_paging_dump_vty(vty, bts);
1266 }
1267
1268 return CMD_SUCCESS;
1269}
1270
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01001271DEFUN(show_paging_group,
1272 show_paging_group_cmd,
1273 "show paging-group <0-255> IMSI",
1274 SHOW_STR "Display the paging group\n"
1275 "BTS Number\n" "IMSI\n")
1276{
1277 struct gsm_network *net = gsmnet_from_vty(vty);
1278 struct gsm_bts *bts;
1279 unsigned int page_group;
1280 int bts_nr = atoi(argv[0]);
1281
1282 if (bts_nr >= net->num_bts) {
1283 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1284 return CMD_WARNING;
1285 }
1286
1287 bts = gsm_bts_num(net, bts_nr);
1288 if (!bts) {
1289 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1290 return CMD_WARNING;
1291 }
1292
1293 page_group = gsm0502_calc_paging_group(&bts->si_common.chan_desc,
1294 str_to_imsi(argv[1]));
1295 vty_out(vty, "%%Paging group for IMSI %" PRIu64 " on BTS #%d is %u%s",
1296 str_to_imsi(argv[1]), bts->nr,
1297 page_group, VTY_NEWLINE);
1298 return CMD_SUCCESS;
1299}
1300
Harald Welte5013b2a2009-08-07 13:29:14 +02001301DEFUN(cfg_net,
1302 cfg_net_cmd,
Harald Welte8f0ed552010-05-11 21:53:49 +02001303 "network", NETWORK_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001304{
Harald Weltedcccb182010-05-16 20:52:23 +02001305 vty->index = gsmnet_from_vty(vty);
Harald Welte5013b2a2009-08-07 13:29:14 +02001306 vty->node = GSMNET_NODE;
1307
1308 return CMD_SUCCESS;
1309}
1310
Harald Welte5013b2a2009-08-07 13:29:14 +02001311DEFUN(cfg_net_ncc,
1312 cfg_net_ncc_cmd,
1313 "network country code <1-999>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001314 "Set the GSM network country code\n"
1315 "Country commands\n"
1316 CODE_CMD_STR
1317 "Network Country Code to use\n")
Harald Welte5013b2a2009-08-07 13:29:14 +02001318{
Harald Weltedcccb182010-05-16 20:52:23 +02001319 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1320
Harald Welte5013b2a2009-08-07 13:29:14 +02001321 gsmnet->country_code = atoi(argv[0]);
1322
1323 return CMD_SUCCESS;
1324}
1325
1326DEFUN(cfg_net_mnc,
1327 cfg_net_mnc_cmd,
Dieter Spaar402cced2011-07-27 23:43:56 +02001328 "mobile network code <0-999>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001329 "Set the GSM mobile network code\n"
1330 "Network Commands\n"
1331 CODE_CMD_STR
1332 "Mobile Network Code to use\n")
Harald Welte5013b2a2009-08-07 13:29:14 +02001333{
Harald Weltedcccb182010-05-16 20:52:23 +02001334 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1335
Harald Welte5013b2a2009-08-07 13:29:14 +02001336 gsmnet->network_code = atoi(argv[0]);
1337
1338 return CMD_SUCCESS;
1339}
1340
1341DEFUN(cfg_net_name_short,
1342 cfg_net_name_short_cmd,
1343 "short name NAME",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001344 "Set the short GSM network name\n" NAME_CMD_STR NAME_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001345{
Harald Weltedcccb182010-05-16 20:52:23 +02001346 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1347
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +02001348 bsc_replace_string(gsmnet, &gsmnet->name_short, argv[0]);
Harald Welte5013b2a2009-08-07 13:29:14 +02001349 return CMD_SUCCESS;
1350}
1351
1352DEFUN(cfg_net_name_long,
1353 cfg_net_name_long_cmd,
1354 "long name NAME",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001355 "Set the long GSM network name\n" NAME_CMD_STR NAME_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001356{
Harald Weltedcccb182010-05-16 20:52:23 +02001357 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1358
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +02001359 bsc_replace_string(gsmnet, &gsmnet->name_long, argv[0]);
Harald Welte5013b2a2009-08-07 13:29:14 +02001360 return CMD_SUCCESS;
1361}
Harald Welte40f82892009-05-23 17:31:39 +00001362
Harald Welte (local)69de3972009-08-12 14:42:23 +02001363DEFUN(cfg_net_auth_policy,
1364 cfg_net_auth_policy_cmd,
1365 "auth policy (closed|accept-all|token)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001366 "Authentication (not cryptographic)\n"
1367 "Set the GSM network authentication policy\n"
1368 "Require the MS to be activated in HLR\n"
1369 "Accept all MS, whether in HLR or not\n"
1370 "Use SMS-token based authentication\n")
Harald Welte (local)69de3972009-08-12 14:42:23 +02001371{
1372 enum gsm_auth_policy policy = gsm_auth_policy_parse(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001373 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte (local)69de3972009-08-12 14:42:23 +02001374
1375 gsmnet->auth_policy = policy;
1376
1377 return CMD_SUCCESS;
1378}
1379
Harald Welte1085c092009-11-18 20:33:19 +01001380DEFUN(cfg_net_reject_cause,
1381 cfg_net_reject_cause_cmd,
1382 "location updating reject cause <2-111>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001383 "Set the reject cause of location updating reject\n"
1384 "Set the reject cause of location updating reject\n"
1385 "Set the reject cause of location updating reject\n"
1386 "Set the reject cause of location updating reject\n"
1387 "Cause Value as Per GSM TS 04.08\n")
Harald Welte1085c092009-11-18 20:33:19 +01001388{
Harald Weltedcccb182010-05-16 20:52:23 +02001389 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1390
Harald Welte1085c092009-11-18 20:33:19 +01001391 gsmnet->reject_cause = atoi(argv[0]);
1392
1393 return CMD_SUCCESS;
1394}
1395
Harald Welte4381cfe2009-08-30 15:47:06 +09001396DEFUN(cfg_net_encryption,
1397 cfg_net_encryption_cmd,
Harald Weltead66a2d2012-07-04 21:37:56 +02001398 "encryption a5 (0|1|2|3)",
Harald Welte28326062010-05-14 20:05:17 +02001399 "Encryption options\n"
1400 "A5 encryption\n" "A5/0: No encryption\n"
Harald Weltead66a2d2012-07-04 21:37:56 +02001401 "A5/1: Encryption\n" "A5/2: Export-grade Encryption\n"
1402 "A5/3: 'New' Secure Encryption\n")
Harald Welte4381cfe2009-08-30 15:47:06 +09001403{
Harald Weltedcccb182010-05-16 20:52:23 +02001404 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1405
Andreas.Eversberg1059deb2009-11-17 09:55:26 +01001406 gsmnet->a5_encryption= atoi(argv[0]);
Harald Welte4381cfe2009-08-30 15:47:06 +09001407
1408 return CMD_SUCCESS;
1409}
1410
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001411DEFUN(cfg_net_neci,
1412 cfg_net_neci_cmd,
1413 "neci (0|1)",
Harald Welte28326062010-05-14 20:05:17 +02001414 "New Establish Cause Indication\n"
1415 "Don't set the NECI bit\n" "Set the NECI bit\n")
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001416{
Harald Weltedcccb182010-05-16 20:52:23 +02001417 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1418
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001419 gsmnet->neci = atoi(argv[0]);
Holger Hans Peter Freyther78891072010-09-06 09:36:02 +08001420 gsm_net_update_ctype(gsmnet);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001421 return CMD_SUCCESS;
1422}
1423
Harald Welteeab84a12009-12-13 10:53:12 +01001424DEFUN(cfg_net_rrlp_mode, cfg_net_rrlp_mode_cmd,
1425 "rrlp mode (none|ms-based|ms-preferred|ass-preferred)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001426 "Radio Resource Location Protocol\n"
1427 "Set the Radio Resource Location Protocol Mode\n"
1428 "Don't send RRLP request\n"
1429 "Request MS-based location\n"
1430 "Request any location, prefer MS-based\n"
1431 "Request any location, prefer MS-assisted\n")
Harald Welteeab84a12009-12-13 10:53:12 +01001432{
Harald Weltedcccb182010-05-16 20:52:23 +02001433 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1434
Harald Welteeab84a12009-12-13 10:53:12 +01001435 gsmnet->rrlp.mode = rrlp_mode_parse(argv[0]);
1436
1437 return CMD_SUCCESS;
1438}
1439
Harald Welte648b6ce2009-12-14 09:00:24 +01001440DEFUN(cfg_net_mm_info, cfg_net_mm_info_cmd,
1441 "mm info (0|1)",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001442 "Mobility Management\n"
1443 "Send MM INFO after LOC UPD ACCEPT\n"
1444 "Disable\n" "Enable\n")
Harald Welte648b6ce2009-12-14 09:00:24 +01001445{
Harald Weltedcccb182010-05-16 20:52:23 +02001446 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1447
Harald Welte648b6ce2009-12-14 09:00:24 +01001448 gsmnet->send_mm_info = atoi(argv[0]);
1449
1450 return CMD_SUCCESS;
1451}
1452
Harald Welte8f0ed552010-05-11 21:53:49 +02001453#define HANDOVER_STR "Handover Options\n"
1454
Harald Weltebc814502009-12-19 21:41:52 +01001455DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1456 "handover (0|1)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001457 HANDOVER_STR
1458 "Don't perform in-call handover\n"
1459 "Perform in-call handover\n")
Harald Weltebc814502009-12-19 21:41:52 +01001460{
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001461 int enable = atoi(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001462 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001463
1464 if (enable && ipacc_rtp_direct) {
Harald Weltefe03f0d2009-12-20 13:51:01 +01001465 vty_out(vty, "%% Cannot enable handover unless RTP Proxy mode "
1466 "is enabled by using the -P command line option%s",
1467 VTY_NEWLINE);
1468 return CMD_WARNING;
1469 }
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001470 gsmnet->handover.active = enable;
Harald Weltebc814502009-12-19 21:41:52 +01001471
1472 return CMD_SUCCESS;
1473}
1474
Harald Welte8f0ed552010-05-11 21:53:49 +02001475#define HO_WIN_STR HANDOVER_STR "Measurement Window\n"
1476#define HO_WIN_RXLEV_STR HO_WIN_STR "Received Level Averaging\n"
1477#define HO_WIN_RXQUAL_STR HO_WIN_STR "Received Quality Averaging\n"
1478#define HO_PBUDGET_STR HANDOVER_STR "Power Budget\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001479#define HO_AVG_COUNT_STR "Amount to use for Averaging\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001480
Harald Welteb720bd32009-12-21 16:51:50 +01001481DEFUN(cfg_net_ho_win_rxlev_avg, cfg_net_ho_win_rxlev_avg_cmd,
1482 "handover window rxlev averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001483 HO_WIN_RXLEV_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001484 "How many RxLev measurements are used for averaging\n"
1485 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001486{
Harald Weltedcccb182010-05-16 20:52:23 +02001487 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001488 gsmnet->handover.win_rxlev_avg = atoi(argv[0]);
1489 return CMD_SUCCESS;
1490}
1491
1492DEFUN(cfg_net_ho_win_rxqual_avg, cfg_net_ho_win_rxqual_avg_cmd,
1493 "handover window rxqual averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001494 HO_WIN_RXQUAL_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001495 "How many RxQual measurements are used for averaging\n"
1496 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001497{
Harald Weltedcccb182010-05-16 20:52:23 +02001498 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001499 gsmnet->handover.win_rxqual_avg = atoi(argv[0]);
1500 return CMD_SUCCESS;
1501}
1502
1503DEFUN(cfg_net_ho_win_rxlev_neigh_avg, cfg_net_ho_win_rxlev_avg_neigh_cmd,
1504 "handover window rxlev neighbor averaging <1-10>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001505 HO_WIN_RXLEV_STR "Neighbor\n"
1506 "How many RxQual measurements are used for averaging\n"
1507 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001508{
Harald Weltedcccb182010-05-16 20:52:23 +02001509 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001510 gsmnet->handover.win_rxlev_avg_neigh = atoi(argv[0]);
1511 return CMD_SUCCESS;
1512}
1513
1514DEFUN(cfg_net_ho_pwr_interval, cfg_net_ho_pwr_interval_cmd,
1515 "handover power budget interval <1-99>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001516 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001517 "How often to check if we have a better cell (SACCH frames)\n"
1518 "Interval\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001519{
Harald Weltedcccb182010-05-16 20:52:23 +02001520 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001521 gsmnet->handover.pwr_interval = atoi(argv[0]);
1522 return CMD_SUCCESS;
1523}
1524
1525DEFUN(cfg_net_ho_pwr_hysteresis, cfg_net_ho_pwr_hysteresis_cmd,
1526 "handover power budget hysteresis <0-999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001527 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001528 "How many dB does a neighbor to be stronger to become a HO candidate\n"
1529 "Hysteresis\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001530{
Harald Weltedcccb182010-05-16 20:52:23 +02001531 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001532 gsmnet->handover.pwr_hysteresis = atoi(argv[0]);
1533 return CMD_SUCCESS;
1534}
1535
1536DEFUN(cfg_net_ho_max_distance, cfg_net_ho_max_distance_cmd,
1537 "handover maximum distance <0-9999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001538 HANDOVER_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001539 "How big is the maximum timing advance before HO is forced\n"
1540 "Distance\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001541{
Harald Weltedcccb182010-05-16 20:52:23 +02001542 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001543 gsmnet->handover.max_distance = atoi(argv[0]);
1544 return CMD_SUCCESS;
1545}
Harald Weltebc814502009-12-19 21:41:52 +01001546
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001547DEFUN(cfg_net_pag_any_tch,
1548 cfg_net_pag_any_tch_cmd,
1549 "paging any use tch (0|1)",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001550 "Assign a TCH when receiving a Paging Any request\n"
1551 "Any Channel\n" "Use\n" "TCH\n"
1552 "Do not use TCH for Paging Request Any\n"
1553 "Do use TCH for Paging Request Any\n")
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001554{
Holger Hans Peter Freytherb0e88b82010-09-06 10:09:19 +08001555 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001556 gsmnet->pag_any_tch = atoi(argv[0]);
1557 gsm_net_update_ctype(gsmnet);
1558 return CMD_SUCCESS;
1559}
1560
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001561#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001562 DEFUN(cfg_net_T##number, \
1563 cfg_net_T##number##_cmd, \
1564 "timer t" #number " <0-65535>", \
Harald Welte8f0ed552010-05-11 21:53:49 +02001565 "Configure GSM Timers\n" \
Holger Hans Peter Freyther5dd295f2014-04-11 19:30:27 +02001566 doc "Timer Value in seconds\n") \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001567{ \
Harald Weltedcccb182010-05-16 20:52:23 +02001568 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001569 int value = atoi(argv[0]); \
1570 \
1571 if (value < 0 || value > 65535) { \
1572 vty_out(vty, "Timer value %s out of range.%s", \
1573 argv[0], VTY_NEWLINE); \
1574 return CMD_WARNING; \
1575 } \
1576 \
1577 gsmnet->T##number = value; \
1578 return CMD_SUCCESS; \
1579}
1580
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001581DECLARE_TIMER(3101, "Set the timeout value for IMMEDIATE ASSIGNMENT.\n")
1582DECLARE_TIMER(3103, "Set the timeout value for HANDOVER.\n")
Harald Welte67161f22012-06-03 13:01:47 +02001583DECLARE_TIMER(3105, "Set the timer for repetition of PHYSICAL INFORMATION.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001584DECLARE_TIMER(3107, "Currently not used.\n")
Holger Hans Peter Freytherb3489392011-12-28 16:21:05 +01001585DECLARE_TIMER(3109, "Set the RSL SACCH deactivation timeout.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001586DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.\n")
1587DECLARE_TIMER(3113, "Set the time to try paging a subscriber.\n")
1588DECLARE_TIMER(3115, "Currently not used.\n")
1589DECLARE_TIMER(3117, "Currently not used.\n")
1590DECLARE_TIMER(3119, "Currently not used.\n")
1591DECLARE_TIMER(3122, "Waiting time (seconds) after IMM ASS REJECT\n")
1592DECLARE_TIMER(3141, "Currently not used.\n")
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001593
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001594DEFUN(cfg_net_dtx,
1595 cfg_net_dtx_cmd,
1596 "dtx-used (0|1)",
1597 "Enable the usage of DTX.\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001598 "DTX is disabled\n" "DTX is enabled\n")
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001599{
1600 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1601 gsmnet->dtx_enabled = atoi(argv[0]);
1602 return CMD_SUCCESS;
1603}
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001604
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +01001605DEFUN(cfg_net_subscr_keep,
1606 cfg_net_subscr_keep_cmd,
1607 "subscriber-keep-in-ram (0|1)",
1608 "Keep unused subscribers in RAM.\n"
1609 "Delete unused subscribers\n" "Keep unused subscribers\n")
1610{
1611 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Jacob Erlbeck1e30a282014-12-03 09:28:24 +01001612 gsmnet->subscr_group->keep_subscr = atoi(argv[0]);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +01001613 return CMD_SUCCESS;
1614}
1615
Harald Welte5258fc42009-03-28 19:07:53 +00001616/* per-BTS configuration */
1617DEFUN(cfg_bts,
1618 cfg_bts_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02001619 "bts <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001620 "Select a BTS to configure\n"
1621 "BTS Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001622{
Harald Weltedcccb182010-05-16 20:52:23 +02001623 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte5258fc42009-03-28 19:07:53 +00001624 int bts_nr = atoi(argv[0]);
1625 struct gsm_bts *bts;
1626
Harald Weltee441d9c2009-06-21 16:17:15 +02001627 if (bts_nr > gsmnet->num_bts) {
1628 vty_out(vty, "%% The next unused BTS number is %u%s",
1629 gsmnet->num_bts, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00001630 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02001631 } else if (bts_nr == gsmnet->num_bts) {
1632 /* allocate a new one */
Harald Welte3300c012011-06-05 13:31:33 +02001633 bts = gsm_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,
Harald Weltea2bbc5e2015-11-20 10:43:31 +01001634 HARDCODED_BSIC);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02001635 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02001636 bts = gsm_bts_num(gsmnet, bts_nr);
1637
Daniel Willmannf15c2762010-01-11 13:43:07 +01001638 if (!bts) {
1639 vty_out(vty, "%% Unable to allocate BTS %u%s",
1640 gsmnet->num_bts, VTY_NEWLINE);
Harald Weltee441d9c2009-06-21 16:17:15 +02001641 return CMD_WARNING;
Daniel Willmannf15c2762010-01-11 13:43:07 +01001642 }
Harald Welte5258fc42009-03-28 19:07:53 +00001643
1644 vty->index = bts;
Harald Welte197dea92010-05-14 17:59:53 +02001645 vty->index_sub = &bts->description;
Harald Welte5258fc42009-03-28 19:07:53 +00001646 vty->node = BTS_NODE;
1647
1648 return CMD_SUCCESS;
1649}
1650
1651DEFUN(cfg_bts_type,
1652 cfg_bts_type_cmd,
Harald Weltee555c2b2012-08-17 13:02:12 +02001653 "type TYPE", /* dynamically created */
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001654 "Set the BTS type\n" "Type\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001655{
1656 struct gsm_bts *bts = vty->index;
Harald Welte39315c42010-01-10 18:01:52 +01001657 int rc;
Harald Welte5258fc42009-03-28 19:07:53 +00001658
Harald Welte39315c42010-01-10 18:01:52 +01001659 rc = gsm_set_bts_type(bts, parse_btstype(argv[0]));
1660 if (rc < 0)
1661 return CMD_WARNING;
Harald Welte8175e952009-10-20 00:22:00 +02001662
Harald Welte5258fc42009-03-28 19:07:53 +00001663 return CMD_SUCCESS;
1664}
1665
Harald Weltefcd24452009-06-20 18:15:19 +02001666DEFUN(cfg_bts_band,
1667 cfg_bts_band_cmd,
1668 "band BAND",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001669 "Set the frequency band of this BTS\n" "Frequency band\n")
Harald Weltefcd24452009-06-20 18:15:19 +02001670{
1671 struct gsm_bts *bts = vty->index;
Harald Welte42581822009-08-08 16:12:58 +02001672 int band = gsm_band_parse(argv[0]);
Harald Weltefcd24452009-06-20 18:15:19 +02001673
1674 if (band < 0) {
1675 vty_out(vty, "%% BAND %d is not a valid GSM band%s",
1676 band, VTY_NEWLINE);
1677 return CMD_WARNING;
1678 }
1679
1680 bts->band = band;
1681
1682 return CMD_SUCCESS;
1683}
1684
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001685DEFUN(cfg_bts_ci,
1686 cfg_bts_ci_cmd,
1687 "cell_identity <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001688 "Set the Cell identity of this BTS\n" "Cell Identity\n")
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001689{
1690 struct gsm_bts *bts = vty->index;
1691 int ci = atoi(argv[0]);
1692
1693 if (ci < 0 || ci > 0xffff) {
1694 vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s",
1695 ci, VTY_NEWLINE);
1696 return CMD_WARNING;
1697 }
1698 bts->cell_identity = ci;
1699
1700 return CMD_SUCCESS;
1701}
1702
Harald Welte5258fc42009-03-28 19:07:53 +00001703DEFUN(cfg_bts_lac,
1704 cfg_bts_lac_cmd,
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001705 "location_area_code <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001706 "Set the Location Area Code (LAC) of this BTS\n" "LAC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001707{
1708 struct gsm_bts *bts = vty->index;
1709 int lac = atoi(argv[0]);
1710
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001711 if (lac < 0 || lac > 0xffff) {
1712 vty_out(vty, "%% LAC %d is not in the valid range (0-65535)%s",
Harald Welte5258fc42009-03-28 19:07:53 +00001713 lac, VTY_NEWLINE);
1714 return CMD_WARNING;
1715 }
Holger Hans Peter Freythere48b9562009-10-01 04:07:15 +02001716
1717 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
1718 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
1719 lac, VTY_NEWLINE);
1720 return CMD_WARNING;
1721 }
1722
Harald Welte5258fc42009-03-28 19:07:53 +00001723 bts->location_area_code = lac;
1724
1725 return CMD_SUCCESS;
1726}
1727
Harald Weltea43f7892009-12-01 18:04:30 +05301728
Harald Weltea2bbc5e2015-11-20 10:43:31 +01001729/* compatibility wrapper for old config files */
1730DEFUN_HIDDEN(cfg_bts_tsc,
Harald Welte5258fc42009-03-28 19:07:53 +00001731 cfg_bts_tsc_cmd,
Harald Weltec513ded2012-05-31 10:57:08 +02001732 "training_sequence_code <0-7>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001733 "Set the Training Sequence Code (TSC) of this BTS\n" "TSC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001734{
Harald Welte5258fc42009-03-28 19:07:53 +00001735 return CMD_SUCCESS;
1736}
1737
Harald Welte78f2f502009-05-23 16:56:52 +00001738DEFUN(cfg_bts_bsic,
1739 cfg_bts_bsic_cmd,
1740 "base_station_id_code <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001741 "Set the Base Station Identity Code (BSIC) of this BTS\n"
1742 "BSIC of this BTS\n")
Harald Welte78f2f502009-05-23 16:56:52 +00001743{
1744 struct gsm_bts *bts = vty->index;
1745 int bsic = atoi(argv[0]);
1746
1747 if (bsic < 0 || bsic > 0x3f) {
Harald Welte42581822009-08-08 16:12:58 +02001748 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte78f2f502009-05-23 16:56:52 +00001749 bsic, VTY_NEWLINE);
1750 return CMD_WARNING;
1751 }
1752 bts->bsic = bsic;
1753
1754 return CMD_SUCCESS;
1755}
1756
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001757DEFUN(cfg_bts_timezone,
1758 cfg_bts_timezone_cmd,
1759 "timezone <-19-19> (0|15|30|45)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001760 "Set the Timezone Offset of this BTS\n"
1761 "Timezone offset (hours)\n"
1762 "Timezone offset (00 minutes)\n"
1763 "Timezone offset (15 minutes)\n"
1764 "Timezone offset (30 minutes)\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02001765 "Timezone offset (45 minutes)\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001766 )
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001767{
1768 struct gsm_bts *bts = vty->index;
1769 int tzhr = atoi(argv[0]);
1770 int tzmn = atoi(argv[1]);
1771
Harald Welte45f91712012-07-08 16:48:11 +02001772 bts->tz.hr = tzhr;
1773 bts->tz.mn = tzmn;
Jacob Erlbeck946d1412013-09-17 13:59:29 +02001774 bts->tz.dst = 0;
1775 bts->tz.override = 1;
1776
1777 return CMD_SUCCESS;
1778}
1779
1780DEFUN(cfg_bts_timezone_dst,
1781 cfg_bts_timezone_dst_cmd,
1782 "timezone <-19-19> (0|15|30|45) <0-2>",
1783 "Set the Timezone Offset of this BTS\n"
1784 "Timezone offset (hours)\n"
1785 "Timezone offset (00 minutes)\n"
1786 "Timezone offset (15 minutes)\n"
1787 "Timezone offset (30 minutes)\n"
1788 "Timezone offset (45 minutes)\n"
1789 "DST offset (hours)\n"
1790 )
1791{
1792 struct gsm_bts *bts = vty->index;
1793 int tzhr = atoi(argv[0]);
1794 int tzmn = atoi(argv[1]);
1795 int tzdst = atoi(argv[2]);
1796
1797 bts->tz.hr = tzhr;
1798 bts->tz.mn = tzmn;
1799 bts->tz.dst = tzdst;
Harald Welte45f91712012-07-08 16:48:11 +02001800 bts->tz.override = 1;
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001801
1802 return CMD_SUCCESS;
1803}
1804
1805DEFUN(cfg_bts_no_timezone,
1806 cfg_bts_no_timezone_cmd,
1807 "no timezone",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001808 NO_STR
1809 "Disable BTS specific timezone\n")
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001810{
1811 struct gsm_bts *bts = vty->index;
Harald Welte45f91712012-07-08 16:48:11 +02001812
1813 bts->tz.override = 0;
1814
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001815 return CMD_SUCCESS;
1816}
Harald Welte78f2f502009-05-23 16:56:52 +00001817
Harald Welte4cc34222009-05-01 15:12:31 +00001818DEFUN(cfg_bts_unit_id,
1819 cfg_bts_unit_id_cmd,
Harald Welte07dc73d2009-08-07 13:27:09 +02001820 "ip.access unit_id <0-65534> <0-255>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001821 "Abis/IP specific options\n"
1822 "Set the IPA BTS Unit ID\n"
1823 "Unit ID (Site)\n"
1824 "Unit ID (BTS)\n")
Harald Welte4cc34222009-05-01 15:12:31 +00001825{
1826 struct gsm_bts *bts = vty->index;
1827 int site_id = atoi(argv[0]);
1828 int bts_id = atoi(argv[1]);
1829
Harald Welte07dc73d2009-08-07 13:27:09 +02001830 if (!is_ipaccess_bts(bts)) {
1831 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1832 return CMD_WARNING;
1833 }
1834
Harald Welte4cc34222009-05-01 15:12:31 +00001835 bts->ip_access.site_id = site_id;
1836 bts->ip_access.bts_id = bts_id;
1837
1838 return CMD_SUCCESS;
1839}
1840
Harald Welte8b291802013-03-12 13:57:05 +01001841DEFUN(cfg_bts_rsl_ip,
1842 cfg_bts_rsl_ip_cmd,
1843 "ip.access rsl-ip A.B.C.D",
1844 "Abis/IP specific options\n"
1845 "Set the IPA RSL IP Address of the BSC\n"
1846 "Destination IP address for RSL connection\n")
1847{
1848 struct gsm_bts *bts = vty->index;
1849 struct in_addr ia;
1850
1851 if (!is_ipaccess_bts(bts)) {
1852 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1853 return CMD_WARNING;
1854 }
1855
1856 inet_aton(argv[0], &ia);
1857 bts->ip_access.rsl_ip = ntohl(ia.s_addr);
1858
1859 return CMD_SUCCESS;
1860}
1861
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001862#define NOKIA_STR "Nokia *Site related commands\n"
Harald Welte8b291802013-03-12 13:57:05 +01001863
Sylvain Munautc9519462011-10-17 14:04:55 +02001864DEFUN(cfg_bts_nokia_site_skip_reset,
1865 cfg_bts_nokia_site_skip_reset_cmd,
1866 "nokia_site skip-reset (0|1)",
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001867 NOKIA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001868 "Skip the reset step during bootstrap process of this BTS\n"
1869 "Do NOT skip the reset\n" "Skip the reset\n")
Sylvain Munautc9519462011-10-17 14:04:55 +02001870{
1871 struct gsm_bts *bts = vty->index;
1872
1873 if (bts->type != GSM_BTS_TYPE_NOKIA_SITE) {
1874 vty_out(vty, "%% BTS is not of Nokia *Site type%s", VTY_NEWLINE);
1875 return CMD_WARNING;
1876 }
1877
1878 bts->nokia.skip_reset = atoi(argv[0]);
1879
1880 return CMD_SUCCESS;
1881}
1882
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001883DEFUN(cfg_bts_nokia_site_no_loc_rel_cnf,
1884 cfg_bts_nokia_site_no_loc_rel_cnf_cmd,
1885 "nokia_site no-local-rel-conf (0|1)",
1886 NOKIA_STR
1887 "Do not wait for RELease CONFirm message when releasing channel locally\n"
1888 "Wait for RELease CONFirm\n" "Do not wait for RELease CONFirm\n")
1889{
1890 struct gsm_bts *bts = vty->index;
1891
1892 if (!is_nokia_bts(bts)) {
1893 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1894 VTY_NEWLINE);
1895 return CMD_WARNING;
1896 }
1897
1898 bts->nokia.no_loc_rel_cnf = atoi(argv[0]);
1899
1900 return CMD_SUCCESS;
1901}
1902
Sipos Csaba56e17662015-02-07 13:27:36 +01001903DEFUN(cfg_bts_nokia_site_bts_reset_timer_cnf,
1904 cfg_bts_nokia_site_bts_reset_timer_cnf_cmd,
1905 "nokia_site bts-reset-timer <15-100>",
1906 NOKIA_STR
1907 "The amount of time (in sec.) between BTS_RESET is sent,\n"
1908 "and the BTS is being bootstrapped.\n")
1909{
1910 struct gsm_bts *bts = vty->index;
1911
1912 if (!is_nokia_bts(bts)) {
1913 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1914 VTY_NEWLINE);
1915 return CMD_WARNING;
1916 }
1917
1918 bts->nokia.bts_reset_timer_cnf = atoi(argv[0]);
1919
1920 return CMD_SUCCESS;
1921}
Harald Welte8f0ed552010-05-11 21:53:49 +02001922#define OML_STR "Organization & Maintenance Link\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001923#define IPA_STR "A-bis/IP Specific Options\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001924
Harald Welte8175e952009-10-20 00:22:00 +02001925DEFUN(cfg_bts_stream_id,
1926 cfg_bts_stream_id_cmd,
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001927 "oml ip.access stream_id <0-255> line E1_LINE",
Harald Welte8f0ed552010-05-11 21:53:49 +02001928 OML_STR IPA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001929 "Set the ip.access Stream ID of the OML link of this BTS\n"
1930 "Stream Identifier\n" "Virtual E1 Line Number\n" "Virtual E1 Line Number\n")
Harald Welte8175e952009-10-20 00:22:00 +02001931{
1932 struct gsm_bts *bts = vty->index;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001933 int stream_id = atoi(argv[0]), linenr = atoi(argv[1]);
Harald Welte8175e952009-10-20 00:22:00 +02001934
1935 if (!is_ipaccess_bts(bts)) {
1936 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1937 return CMD_WARNING;
1938 }
1939
1940 bts->oml_tei = stream_id;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001941 /* This is used by e1inp_bind_ops callback for each BTS model. */
1942 bts->oml_e1_link.e1_nr = linenr;
1943
1944 return CMD_SUCCESS;
1945}
1946
Harald Welted13e0cd2012-08-17 09:52:03 +02001947#define OML_E1_STR OML_STR "OML E1/T1 Configuration\n"
Harald Welte8175e952009-10-20 00:22:00 +02001948
Harald Welte42581822009-08-08 16:12:58 +02001949DEFUN(cfg_bts_oml_e1,
1950 cfg_bts_oml_e1_cmd,
1951 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welted13e0cd2012-08-17 09:52:03 +02001952 OML_E1_STR
1953 "E1/T1 line number to be used for OML\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001954 "E1/T1 line number to be used for OML\n"
1955 "E1/T1 timeslot to be used for OML\n"
1956 "E1/T1 timeslot to be used for OML\n"
1957 "E1/T1 sub-slot to be used for OML\n"
1958 "Use E1/T1 sub-slot 0\n"
1959 "Use E1/T1 sub-slot 1\n"
1960 "Use E1/T1 sub-slot 2\n"
1961 "Use E1/T1 sub-slot 3\n"
1962 "Use full E1 slot 3\n"
1963 )
Harald Welte42581822009-08-08 16:12:58 +02001964{
1965 struct gsm_bts *bts = vty->index;
1966
1967 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
1968
1969 return CMD_SUCCESS;
1970}
1971
1972
1973DEFUN(cfg_bts_oml_e1_tei,
1974 cfg_bts_oml_e1_tei_cmd,
1975 "oml e1 tei <0-63>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001976 OML_E1_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001977 "Set the TEI to be used for OML\n"
1978 "TEI Number\n")
Harald Welte42581822009-08-08 16:12:58 +02001979{
1980 struct gsm_bts *bts = vty->index;
1981
1982 bts->oml_tei = atoi(argv[0]);
1983
1984 return CMD_SUCCESS;
1985}
1986
Harald Welte7a8fa412009-08-10 13:48:16 +02001987DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1988 "channel allocator (ascending|descending)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001989 "Channnel Allocator\n" "Channel Allocator\n"
1990 "Allocate Timeslots and Transceivers in ascending order\n"
1991 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte7a8fa412009-08-10 13:48:16 +02001992{
1993 struct gsm_bts *bts = vty->index;
1994
1995 if (!strcmp(argv[0], "ascending"))
1996 bts->chan_alloc_reverse = 0;
1997 else
1998 bts->chan_alloc_reverse = 1;
1999
2000 return CMD_SUCCESS;
2001}
2002
Harald Welte8f0ed552010-05-11 21:53:49 +02002003#define RACH_STR "Random Access Control Channel\n"
2004
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01002005DEFUN(cfg_bts_rach_tx_integer,
2006 cfg_bts_rach_tx_integer_cmd,
2007 "rach tx integer <0-15>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002008 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002009 "Set the raw tx integer value in RACH Control parameters IE\n"
2010 "Set the raw tx integer value in RACH Control parameters IE\n"
2011 "Raw tx integer value in RACH Control parameters IE\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01002012{
2013 struct gsm_bts *bts = vty->index;
2014 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
2015 return CMD_SUCCESS;
2016}
2017
2018DEFUN(cfg_bts_rach_max_trans,
2019 cfg_bts_rach_max_trans_cmd,
2020 "rach max transmission (1|2|4|7)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002021 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002022 "Set the maximum number of RACH burst transmissions\n"
2023 "Set the maximum number of RACH burst transmissions\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02002024 "Maximum number of 1 RACH burst transmissions\n"
2025 "Maximum number of 2 RACH burst transmissions\n"
2026 "Maximum number of 4 RACH burst transmissions\n"
2027 "Maximum number of 7 RACH burst transmissions\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01002028{
2029 struct gsm_bts *bts = vty->index;
2030 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
2031 return CMD_SUCCESS;
2032}
2033
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02002034#define CD_STR "Channel Description\n"
2035
2036DEFUN(cfg_bts_chan_desc_att,
2037 cfg_bts_chan_desc_att_cmd,
2038 "channel-descrption attach (0|1)",
2039 CD_STR
2040 "Set if attachment is required\n"
2041 "Attachment is NOT required\n"
2042 "Attachment is required (standard)\n")
2043{
2044 struct gsm_bts *bts = vty->index;
2045 bts->si_common.chan_desc.att = atoi(argv[0]);
2046 return CMD_SUCCESS;
2047}
2048
2049DEFUN(cfg_bts_chan_desc_bs_pa_mfrms,
2050 cfg_bts_chan_desc_bs_pa_mfrms_cmd,
2051 "channel-descrption bs-pa-mfrms <2-9>",
2052 CD_STR
2053 "Set number of multiframe periods for paging groups\n"
2054 "Number of multiframe periods for paging groups\n")
2055{
2056 struct gsm_bts *bts = vty->index;
2057 int bs_pa_mfrms = atoi(argv[0]);
2058
2059 bts->si_common.chan_desc.bs_pa_mfrms = bs_pa_mfrms - 2;
2060 return CMD_SUCCESS;
2061}
2062
2063DEFUN(cfg_bts_chan_desc_bs_ag_blks_res,
2064 cfg_bts_chan_desc_bs_ag_blks_res_cmd,
2065 "channel-descrption bs-ag-blks-res <0-7>",
2066 CD_STR
2067 "Set number of blocks reserved for access grant\n"
2068 "Number of blocks reserved for access grant\n")
2069{
2070 struct gsm_bts *bts = vty->index;
2071 int bs_ag_blks_res = atoi(argv[0]);
2072
2073 bts->si_common.chan_desc.bs_ag_blks_res = bs_ag_blks_res;
2074 return CMD_SUCCESS;
2075}
2076
Harald Welte8f0ed552010-05-11 21:53:49 +02002077#define NM_STR "Network Management\n"
2078
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002079DEFUN(cfg_bts_rach_nm_b_thresh,
2080 cfg_bts_rach_nm_b_thresh_cmd,
2081 "rach nm busy threshold <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002082 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002083 "Set the NM Busy Threshold\n"
2084 "Set the NM Busy Threshold\n"
2085 "NM Busy Threshold in dB")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002086{
2087 struct gsm_bts *bts = vty->index;
2088 bts->rach_b_thresh = atoi(argv[0]);
2089 return CMD_SUCCESS;
2090}
2091
2092DEFUN(cfg_bts_rach_nm_ldavg,
2093 cfg_bts_rach_nm_ldavg_cmd,
2094 "rach nm load average <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002095 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002096 "Set the NM Loadaverage Slots value\n"
2097 "Set the NM Loadaverage Slots value\n"
2098 "NM Loadaverage Slots value\n")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002099{
2100 struct gsm_bts *bts = vty->index;
2101 bts->rach_ldavg_slots = atoi(argv[0]);
2102 return CMD_SUCCESS;
2103}
2104
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002105DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
2106 "cell barred (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002107 "Should this cell be barred from access?\n"
2108 "Should this cell be barred from access?\n"
2109 "Cell should NOT be barred\n"
2110 "Cell should be barred\n")
2111
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002112{
2113 struct gsm_bts *bts = vty->index;
2114
Harald Welte71355012009-12-21 23:08:18 +01002115 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002116
2117 return CMD_SUCCESS;
2118}
2119
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002120DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
2121 "rach emergency call allowed (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002122 RACH_STR
2123 "Should this cell allow emergency calls?\n"
2124 "Should this cell allow emergency calls?\n"
2125 "Should this cell allow emergency calls?\n"
2126 "Do NOT allow emergency calls\n"
2127 "Allow emergency calls\n")
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002128{
2129 struct gsm_bts *bts = vty->index;
2130
2131 if (atoi(argv[0]) == 0)
2132 bts->si_common.rach_control.t2 |= 0x4;
2133 else
2134 bts->si_common.rach_control.t2 &= ~0x4;
2135
2136 return CMD_SUCCESS;
2137}
2138
Ivan Kluchnikov67920592013-09-16 13:13:04 +04002139DEFUN(cfg_bts_rach_ac_class, cfg_bts_rach_ac_class_cmd,
2140 "rach access-control-class (0|1|2|3|4|5|6|7|8|9|11|12|13|14|15) (barred|allowed)",
2141 RACH_STR
2142 "Set access control class\n"
2143 "Access control class 0\n"
2144 "Access control class 1\n"
2145 "Access control class 2\n"
2146 "Access control class 3\n"
2147 "Access control class 4\n"
2148 "Access control class 5\n"
2149 "Access control class 6\n"
2150 "Access control class 7\n"
2151 "Access control class 8\n"
2152 "Access control class 9\n"
2153 "Access control class 11 for PLMN use\n"
2154 "Access control class 12 for security services\n"
2155 "Access control class 13 for public utilities (e.g. water/gas suppliers)\n"
2156 "Access control class 14 for emergency services\n"
2157 "Access control class 15 for PLMN staff\n"
2158 "barred to use access control class\n"
2159 "allowed to use access control class\n")
2160{
2161 struct gsm_bts *bts = vty->index;
2162
2163 uint8_t control_class;
2164 uint8_t allowed = 0;
2165
2166 if (strcmp(argv[1], "allowed") == 0)
2167 allowed = 1;
2168
2169 control_class = atoi(argv[0]);
2170 if (control_class < 8)
2171 if (allowed)
2172 bts->si_common.rach_control.t3 &= ~(0x1 << control_class);
2173 else
2174 bts->si_common.rach_control.t3 |= (0x1 << control_class);
2175 else
2176 if (allowed)
2177 bts->si_common.rach_control.t2 &= ~(0x1 << (control_class - 8));
2178 else
2179 bts->si_common.rach_control.t2 |= (0x1 << (control_class - 8));
2180
2181 return CMD_SUCCESS;
2182}
2183
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002184DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
2185 "ms max power <0-40>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002186 "MS Options\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02002187 "Maximum transmit power of the MS\n"
2188 "Maximum transmit power of the MS\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002189 "Maximum transmit power of the MS in dBm")
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002190{
2191 struct gsm_bts *bts = vty->index;
2192
2193 bts->ms_max_power = atoi(argv[0]);
2194
2195 return CMD_SUCCESS;
2196}
2197
Harald Weltecfaabbb2012-08-16 23:23:50 +02002198#define CELL_STR "Cell Parameters\n"
2199
Harald Welte73225282009-12-12 18:17:25 +01002200DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
2201 "cell reselection hysteresis <0-14>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002202 CELL_STR "Cell re-selection parameters\n"
2203 "Cell Re-Selection Hysteresis in dB\n"
Harald Welte73225282009-12-12 18:17:25 +01002204 "Cell Re-Selection Hysteresis in dB")
2205{
2206 struct gsm_bts *bts = vty->index;
2207
2208 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
2209
2210 return CMD_SUCCESS;
2211}
2212
2213DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
2214 "rxlev access min <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002215 "Minimum RxLev needed for cell access\n"
2216 "Minimum RxLev needed for cell access\n"
2217 "Minimum RxLev needed for cell access\n"
Harald Welte73225282009-12-12 18:17:25 +01002218 "Minimum RxLev needed for cell access (better than -110dBm)")
2219{
2220 struct gsm_bts *bts = vty->index;
2221
2222 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
2223
2224 return CMD_SUCCESS;
2225}
2226
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002227DEFUN(cfg_bts_cell_bar_qualify, cfg_bts_cell_bar_qualify_cmd,
2228 "cell bar qualify (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002229 CELL_STR "Cell Bar Qualify\n" "Cell Bar Qualify\n"
2230 "Set CBQ to 0\n" "Set CBQ to 1\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002231{
2232 struct gsm_bts *bts = vty->index;
2233
2234 bts->si_common.cell_ro_sel_par.present = 1;
2235 bts->si_common.cell_ro_sel_par.cbq = atoi(argv[0]);
2236
2237 return CMD_SUCCESS;
2238}
2239
2240DEFUN(cfg_bts_cell_resel_ofs, cfg_bts_cell_resel_ofs_cmd,
2241 "cell reselection offset <0-126>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002242 CELL_STR "Cell Re-Selection Parameters\n"
2243 "Cell Re-Selection Offset (CRO) in dB\n"
2244 "Cell Re-Selection Offset (CRO) in dB\n"
2245 )
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002246{
2247 struct gsm_bts *bts = vty->index;
2248
2249 bts->si_common.cell_ro_sel_par.present = 1;
2250 bts->si_common.cell_ro_sel_par.cell_resel_off = atoi(argv[0])/2;
2251
2252 return CMD_SUCCESS;
2253}
2254
2255DEFUN(cfg_bts_temp_ofs, cfg_bts_temp_ofs_cmd,
2256 "temporary offset <0-60>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002257 "Cell selection temporary negative offset\n"
2258 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002259 "Cell selection temporary negative offset in dB")
2260{
2261 struct gsm_bts *bts = vty->index;
2262
2263 bts->si_common.cell_ro_sel_par.present = 1;
2264 bts->si_common.cell_ro_sel_par.temp_offs = atoi(argv[0])/10;
2265
2266 return CMD_SUCCESS;
2267}
2268
2269DEFUN(cfg_bts_temp_ofs_inf, cfg_bts_temp_ofs_inf_cmd,
2270 "temporary offset infinite",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002271 "Cell selection temporary negative offset\n"
2272 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002273 "Sets cell selection temporary negative offset to infinity")
2274{
2275 struct gsm_bts *bts = vty->index;
2276
2277 bts->si_common.cell_ro_sel_par.present = 1;
2278 bts->si_common.cell_ro_sel_par.temp_offs = 7;
2279
2280 return CMD_SUCCESS;
2281}
2282
2283DEFUN(cfg_bts_penalty_time, cfg_bts_penalty_time_cmd,
2284 "penalty time <20-620>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002285 "Cell selection penalty time\n"
2286 "Cell selection penalty time\n"
2287 "Cell selection penalty time in seconds (by 20s increments)\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002288{
2289 struct gsm_bts *bts = vty->index;
2290
2291 bts->si_common.cell_ro_sel_par.present = 1;
2292 bts->si_common.cell_ro_sel_par.penalty_time = (atoi(argv[0])-20)/20;
2293
2294 return CMD_SUCCESS;
2295}
2296
2297DEFUN(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd,
2298 "penalty time reserved",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002299 "Cell selection penalty time\n"
2300 "Cell selection penalty time\n"
2301 "Set cell selection penalty time to reserved value 31, "
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002302 "(indicate that CELL_RESELECT_OFFSET is subtracted from C2 "
2303 "and TEMPORARY_OFFSET is ignored)")
2304{
2305 struct gsm_bts *bts = vty->index;
2306
2307 bts->si_common.cell_ro_sel_par.present = 1;
2308 bts->si_common.cell_ro_sel_par.penalty_time = 31;
2309
2310 return CMD_SUCCESS;
2311}
2312
Harald Welte (local)efc92312009-08-14 23:09:25 +02002313DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
Daniel Willmann4d62d632012-12-27 00:02:01 +01002314 "periodic location update <6-1530>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002315 "Periodic Location Updating Interval\n"
2316 "Periodic Location Updating Interval\n"
2317 "Periodic Location Updating Interval\n"
2318 "Periodic Location Updating Interval in Minutes\n")
Harald Welte (local)efc92312009-08-14 23:09:25 +02002319{
2320 struct gsm_bts *bts = vty->index;
2321
Dieter Spaard6613e02010-10-05 21:10:55 +02002322 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
Harald Welte (local)efc92312009-08-14 23:09:25 +02002323
2324 return CMD_SUCCESS;
2325}
2326
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002327DEFUN(cfg_bts_no_per_loc_upd, cfg_bts_no_per_loc_upd_cmd,
2328 "no periodic location update",
2329 NO_STR
2330 "Periodic Location Updating Interval\n"
2331 "Periodic Location Updating Interval\n"
2332 "Periodic Location Updating Interval\n")
2333{
2334 struct gsm_bts *bts = vty->index;
2335
2336 bts->si_common.chan_desc.t3212 = 0;
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01002337
2338 return CMD_SUCCESS;
2339}
2340
2341DEFUN(cfg_bts_radio_link_timeout, cfg_bts_radio_link_timeout_cmd,
2342 "radio-link-timeout <4-64>",
2343 "Radio link timeout criterion (BTS side)\n"
2344 "Radio link timeout value (lost SACCH block)\n")
2345{
2346 struct gsm_bts *bts = vty->index;
2347
2348 set_radio_link_timeout(&bts->si_common.cell_options, atoi(argv[0]));
2349
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002350 return CMD_SUCCESS;
2351}
2352
Harald Welte8f0ed552010-05-11 21:53:49 +02002353#define GPRS_TEXT "GPRS Packet Network\n"
2354
Harald Welteaf387632010-03-14 23:30:30 +08002355DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welte57ba7e32010-04-18 14:00:26 +02002356 "gprs cell bvci <2-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002357 GPRS_TEXT
2358 "GPRS Cell Settings\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002359 "GPRS BSSGP VC Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002360 "GPRS BSSGP VC Identifier")
2361{
2362 struct gsm_bts *bts = vty->index;
2363
Harald Welte4511d892010-04-18 15:51:20 +02002364 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002365 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2366 return CMD_WARNING;
2367 }
2368
Harald Welte97a282b2010-03-14 15:37:43 +08002369 bts->gprs.cell.bvci = atoi(argv[0]);
2370
2371 return CMD_SUCCESS;
2372}
2373
Harald Weltea5731cf2010-03-22 11:48:36 +08002374DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
2375 "gprs nsei <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002376 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002377 "GPRS NS Entity Identifier\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002378 "GPRS NS Entity Identifier")
2379{
2380 struct gsm_bts *bts = vty->index;
2381
Harald Welte4511d892010-04-18 15:51:20 +02002382 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltea5731cf2010-03-22 11:48:36 +08002383 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2384 return CMD_WARNING;
2385 }
2386
2387 bts->gprs.nse.nsei = atoi(argv[0]);
2388
2389 return CMD_SUCCESS;
2390}
2391
Harald Welte8f0ed552010-05-11 21:53:49 +02002392#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
2393 "NSVC Logical Number\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002394
Harald Welte97a282b2010-03-14 15:37:43 +08002395DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
2396 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002397 GPRS_TEXT NSVC_TEXT
2398 "NS Virtual Connection Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002399 "GPRS NS VC Identifier")
2400{
2401 struct gsm_bts *bts = vty->index;
2402 int idx = atoi(argv[0]);
2403
Harald Welte4511d892010-04-18 15:51:20 +02002404 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002405 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2406 return CMD_WARNING;
2407 }
2408
Harald Welte97a282b2010-03-14 15:37:43 +08002409 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
2410
2411 return CMD_SUCCESS;
2412}
2413
Harald Welteaf387632010-03-14 23:30:30 +08002414DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
2415 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002416 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002417 "GPRS NS Local UDP Port\n"
2418 "GPRS NS Local UDP Port\n"
2419 "GPRS NS Local UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002420 "GPRS NS Local UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002421{
2422 struct gsm_bts *bts = vty->index;
2423 int idx = atoi(argv[0]);
2424
Harald Welte4511d892010-04-18 15:51:20 +02002425 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002426 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2427 return CMD_WARNING;
2428 }
2429
Harald Welteaf387632010-03-14 23:30:30 +08002430 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
2431
2432 return CMD_SUCCESS;
2433}
2434
2435DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
2436 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002437 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002438 "GPRS NS Remote UDP Port\n"
2439 "GPRS NS Remote UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002440 "GPRS NS Remote UDP Port\n"
2441 "GPRS NS Remote UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002442{
2443 struct gsm_bts *bts = vty->index;
2444 int idx = atoi(argv[0]);
2445
Harald Welte4511d892010-04-18 15:51:20 +02002446 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002447 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2448 return CMD_WARNING;
2449 }
2450
Harald Welteaf387632010-03-14 23:30:30 +08002451 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
2452
2453 return CMD_SUCCESS;
2454}
2455
2456DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
2457 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte8f0ed552010-05-11 21:53:49 +02002458 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002459 "GPRS NS Remote IP Address\n"
2460 "GPRS NS Remote IP Address\n"
2461 "GPRS NS Remote IP Address\n")
Harald Welteaf387632010-03-14 23:30:30 +08002462{
2463 struct gsm_bts *bts = vty->index;
2464 int idx = atoi(argv[0]);
2465 struct in_addr ia;
2466
Harald Welte4511d892010-04-18 15:51:20 +02002467 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002468 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2469 return CMD_WARNING;
2470 }
2471
Harald Welteaf387632010-03-14 23:30:30 +08002472 inet_aton(argv[1], &ia);
2473 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
2474
2475 return CMD_SUCCESS;
2476}
2477
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002478DEFUN(cfg_bts_pag_free, cfg_bts_pag_free_cmd,
Harald Weltecfaabbb2012-08-16 23:23:50 +02002479 "paging free <-1-1024>",
2480 "Paging options\n"
2481 "Only page when having a certain amount of free slots\n"
2482 "amount of required free paging slots. -1 to disable\n")
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002483{
2484 struct gsm_bts *bts = vty->index;
2485
2486 bts->paging.free_chans_need = atoi(argv[0]);
2487 return CMD_SUCCESS;
2488}
2489
Harald Welte615e9562010-05-11 23:50:21 +02002490DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
2491 "gprs ns timer " NS_TIMERS " <0-255>",
2492 GPRS_TEXT "Network Service\n"
2493 "Network Service Timer\n"
2494 NS_TIMERS_HELP "Timer Value\n")
2495{
2496 struct gsm_bts *bts = vty->index;
2497 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
2498 int val = atoi(argv[1]);
2499
2500 if (bts->gprs.mode == BTS_GPRS_NONE) {
2501 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2502 return CMD_WARNING;
2503 }
2504
2505 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
2506 return CMD_WARNING;
2507
2508 bts->gprs.nse.timer[idx] = val;
2509
2510 return CMD_SUCCESS;
2511}
2512
2513#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 +02002514#define BSSGP_TIMERS_HELP \
2515 "Tbvc-block timeout\n" \
2516 "Tbvc-block retries\n" \
2517 "Tbvc-unblock retries\n" \
2518 "Tbvcc-reset timeout\n" \
2519 "Tbvc-reset retries\n" \
2520 "Tbvc-suspend timeout\n" \
2521 "Tbvc-suspend retries\n" \
2522 "Tbvc-resume timeout\n" \
2523 "Tbvc-resume retries\n" \
2524 "Tbvc-capa-update timeout\n" \
2525 "Tbvc-capa-update retries\n"
Harald Welte615e9562010-05-11 23:50:21 +02002526
2527DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
2528 "gprs cell timer " BSSGP_TIMERS " <0-255>",
2529 GPRS_TEXT "Cell / BSSGP\n"
2530 "Cell/BSSGP Timer\n"
2531 BSSGP_TIMERS_HELP "Timer Value\n")
2532{
2533 struct gsm_bts *bts = vty->index;
2534 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
2535 int val = atoi(argv[1]);
2536
2537 if (bts->gprs.mode == BTS_GPRS_NONE) {
2538 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2539 return CMD_WARNING;
2540 }
2541
2542 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
2543 return CMD_WARNING;
2544
2545 bts->gprs.cell.timer[idx] = val;
2546
2547 return CMD_SUCCESS;
2548}
2549
Harald Welte97a282b2010-03-14 15:37:43 +08002550DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
2551 "gprs routing area <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002552 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002553 "GPRS Routing Area Code\n"
2554 "GPRS Routing Area Code\n"
2555 "GPRS Routing Area Code\n")
Harald Welte97a282b2010-03-14 15:37:43 +08002556{
2557 struct gsm_bts *bts = vty->index;
2558
Harald Welte4511d892010-04-18 15:51:20 +02002559 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002560 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2561 return CMD_WARNING;
2562 }
2563
Harald Welte97a282b2010-03-14 15:37:43 +08002564 bts->gprs.rac = atoi(argv[0]);
2565
2566 return CMD_SUCCESS;
2567}
2568
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01002569DEFUN(cfg_bts_gprs_net_ctrl_ord, cfg_bts_gprs_net_ctrl_ord_cmd,
2570 "gprs network-control-order (nc0|nc1|nc2)",
2571 GPRS_TEXT
2572 "GPRS Network Control Order\n"
2573 "MS controlled cell re-selection, no measurement reporting\n"
2574 "MS controlled cell re-selection, MS sends measurement reports\n"
2575 "Network controlled cell re-selection, MS sends measurement reports\n")
2576{
2577 struct gsm_bts *bts = vty->index;
2578
2579 if (bts->gprs.mode == BTS_GPRS_NONE) {
2580 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2581 return CMD_WARNING;
2582 }
2583
2584 bts->gprs.net_ctrl_ord = atoi(argv[0] + 2);
2585
2586 return CMD_SUCCESS;
2587}
2588
Harald Welte4511d892010-04-18 15:51:20 +02002589DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
2590 "gprs mode (none|gprs|egprs)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002591 GPRS_TEXT
2592 "GPRS Mode for this BTS\n"
2593 "GPRS Disabled on this BTS\n"
2594 "GPRS Enabled on this BTS\n"
2595 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welteaf387632010-03-14 23:30:30 +08002596{
2597 struct gsm_bts *bts = vty->index;
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002598 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0], NULL);
Harald Welteaf387632010-03-14 23:30:30 +08002599
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002600 if (!bts_gprs_mode_is_compat(bts, mode)) {
Harald Weltef3d8e922010-06-14 22:44:42 +02002601 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2602 VTY_NEWLINE);
2603 return CMD_WARNING;
2604 }
2605
2606 bts->gprs.mode = mode;
Harald Welteaf387632010-03-14 23:30:30 +08002607
2608 return CMD_SUCCESS;
2609}
2610
Harald Welte9fbff4a2010-07-30 11:50:09 +02002611#define SI_TEXT "System Information Messages\n"
2612#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)"
2613#define SI_TYPE_HELP "System Information Type 1\n" \
2614 "System Information Type 2\n" \
2615 "System Information Type 3\n" \
2616 "System Information Type 4\n" \
2617 "System Information Type 5\n" \
2618 "System Information Type 6\n" \
2619 "System Information Type 7\n" \
2620 "System Information Type 8\n" \
2621 "System Information Type 9\n" \
2622 "System Information Type 10\n" \
2623 "System Information Type 13\n" \
2624 "System Information Type 16\n" \
2625 "System Information Type 17\n" \
2626 "System Information Type 18\n" \
2627 "System Information Type 19\n" \
2628 "System Information Type 20\n" \
2629 "System Information Type 2bis\n" \
2630 "System Information Type 2ter\n" \
2631 "System Information Type 2quater\n" \
2632 "System Information Type 5bis\n" \
2633 "System Information Type 5ter\n"
2634
2635DEFUN(cfg_bts_si_mode, cfg_bts_si_mode_cmd,
2636 "system-information " SI_TYPE_TEXT " mode (static|computed)",
2637 SI_TEXT SI_TYPE_HELP
2638 "System Information Mode\n"
2639 "Static user-specified\n"
2640 "Dynamic, BSC-computed\n")
2641{
2642 struct gsm_bts *bts = vty->index;
2643 int type;
2644
2645 type = get_string_value(osmo_sitype_strs, argv[0]);
2646 if (type < 0) {
2647 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2648 return CMD_WARNING;
2649 }
2650
2651 if (!strcmp(argv[1], "static"))
2652 bts->si_mode_static |= (1 << type);
2653 else
2654 bts->si_mode_static &= ~(1 << type);
2655
2656 return CMD_SUCCESS;
2657}
2658
2659DEFUN(cfg_bts_si_static, cfg_bts_si_static_cmd,
2660 "system-information " SI_TYPE_TEXT " static HEXSTRING",
2661 SI_TEXT SI_TYPE_HELP
2662 "Static System Information filling\n"
2663 "Static user-specified SI content in HEX notation\n")
2664{
2665 struct gsm_bts *bts = vty->index;
2666 int rc, type;
2667
2668 type = get_string_value(osmo_sitype_strs, argv[0]);
2669 if (type < 0) {
2670 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2671 return CMD_WARNING;
2672 }
2673
2674 if (!(bts->si_mode_static & (1 << type))) {
2675 vty_out(vty, "SI Type %s is not configured in static mode%s",
2676 get_value_string(osmo_sitype_strs, type), VTY_NEWLINE);
2677 return CMD_WARNING;
2678 }
2679
Harald Welte290aaed2010-07-30 11:53:18 +02002680 /* Fill buffer with padding pattern */
2681 memset(bts->si_buf[type], 0x2b, sizeof(bts->si_buf[type]));
2682
2683 /* Parse the user-specified SI in hex format, [partially] overwriting padding */
Pablo Neira Ayusoc0d17f22011-05-07 12:12:48 +02002684 rc = osmo_hexparse(argv[1], bts->si_buf[type], sizeof(bts->si_buf[0]));
Harald Welte9fbff4a2010-07-30 11:50:09 +02002685 if (rc < 0 || rc > sizeof(bts->si_buf[0])) {
2686 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
2687 return CMD_WARNING;
2688 }
2689
2690 /* Mark this SI as present */
2691 bts->si_valid |= (1 << type);
2692
2693 return CMD_SUCCESS;
2694}
2695
Harald Welte32c09622011-01-11 23:44:56 +01002696DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
Harald Welte64c07d22011-02-15 11:43:27 +01002697 "neighbor-list mode (automatic|manual|manual-si5)",
Harald Welte32c09622011-01-11 23:44:56 +01002698 "Neighbor List\n" "Mode of Neighbor List generation\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002699 "Automatically from all BTS in this OpenBSC\n" "Manual\n"
2700 "Manual with different lists for SI2 and SI5\n")
Harald Welte32c09622011-01-11 23:44:56 +01002701{
2702 struct gsm_bts *bts = vty->index;
Harald Welte64c07d22011-02-15 11:43:27 +01002703 int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
Harald Welte32c09622011-01-11 23:44:56 +01002704
Harald Welte64c07d22011-02-15 11:43:27 +01002705 switch (mode) {
2706 case NL_MODE_MANUAL_SI5SEP:
2707 case NL_MODE_MANUAL:
Harald Welte32c09622011-01-11 23:44:56 +01002708 /* make sure we clear the current list when switching to
2709 * manual mode */
2710 if (bts->neigh_list_manual_mode == 0)
2711 memset(&bts->si_common.data.neigh_list, 0,
2712 sizeof(bts->si_common.data.neigh_list));
Harald Welte64c07d22011-02-15 11:43:27 +01002713 break;
2714 default:
2715 break;
2716 }
2717
2718 bts->neigh_list_manual_mode = mode;
Harald Welte32c09622011-01-11 23:44:56 +01002719
2720 return CMD_SUCCESS;
2721}
2722
2723DEFUN(cfg_bts_neigh, cfg_bts_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002724 "neighbor-list (add|del) arfcn <0-1023>",
Harald Welte32c09622011-01-11 23:44:56 +01002725 "Neighbor List\n" "Add to manual neighbor list\n"
2726 "Delete from manual neighbor list\n" "ARFCN of neighbor\n"
2727 "ARFCN of neighbor\n")
2728{
2729 struct gsm_bts *bts = vty->index;
2730 struct bitvec *bv = &bts->si_common.neigh_list;
2731 uint16_t arfcn = atoi(argv[1]);
2732
2733 if (!bts->neigh_list_manual_mode) {
2734 vty_out(vty, "%% Cannot configure neighbor list in "
2735 "automatic mode%s", VTY_NEWLINE);
2736 return CMD_WARNING;
2737 }
2738
2739 if (!strcmp(argv[0], "add"))
2740 bitvec_set_bit_pos(bv, arfcn, 1);
2741 else
2742 bitvec_set_bit_pos(bv, arfcn, 0);
2743
2744 return CMD_SUCCESS;
2745}
2746
Harald Welte64c07d22011-02-15 11:43:27 +01002747DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002748 "si5 neighbor-list (add|del) arfcn <0-1023>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002749 "SI5 Neighbor List\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002750 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
2751 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
2752 "ARFCN of neighbor\n")
2753{
2754 struct gsm_bts *bts = vty->index;
2755 struct bitvec *bv = &bts->si_common.si5_neigh_list;
2756 uint16_t arfcn = atoi(argv[1]);
2757
2758 if (!bts->neigh_list_manual_mode) {
2759 vty_out(vty, "%% Cannot configure neighbor list in "
2760 "automatic mode%s", VTY_NEWLINE);
2761 return CMD_WARNING;
2762 }
2763
2764 if (!strcmp(argv[0], "add"))
2765 bitvec_set_bit_pos(bv, arfcn, 1);
2766 else
2767 bitvec_set_bit_pos(bv, arfcn, 0);
2768
2769 return CMD_SUCCESS;
2770}
Harald Welte9fbff4a2010-07-30 11:50:09 +02002771
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02002772#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
2773
2774DEFUN(cfg_bts_excl_rf_lock,
2775 cfg_bts_excl_rf_lock_cmd,
2776 "rf-lock-exclude",
2777 EXCL_RFLOCK_STR)
2778{
2779 struct gsm_bts *bts = vty->index;
2780 bts->excl_from_rf_lock = 1;
2781 return CMD_SUCCESS;
2782}
2783
2784DEFUN(cfg_bts_no_excl_rf_lock,
2785 cfg_bts_no_excl_rf_lock_cmd,
2786 "no rf-lock-exclude",
2787 NO_STR EXCL_RFLOCK_STR)
2788{
2789 struct gsm_bts *bts = vty->index;
2790 bts->excl_from_rf_lock = 0;
2791 return CMD_SUCCESS;
2792}
2793
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01002794#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
2795
2796DEFUN(cfg_bts_force_comb_si,
2797 cfg_bts_force_comb_si_cmd,
2798 "force-combined-si",
2799 FORCE_COMB_SI_STR)
2800{
2801 struct gsm_bts *bts = vty->index;
2802 bts->force_combined_si = 1;
2803 return CMD_SUCCESS;
2804}
2805
2806DEFUN(cfg_bts_no_force_comb_si,
2807 cfg_bts_no_force_comb_si_cmd,
2808 "no force-combined-si",
2809 NO_STR FORCE_COMB_SI_STR)
2810{
2811 struct gsm_bts *bts = vty->index;
2812 bts->force_combined_si = 0;
2813 return CMD_SUCCESS;
2814}
2815
Andreas Eversberga83d5112013-12-07 18:32:28 +01002816static void _get_codec_from_arg(struct vty *vty, int argc, const char *argv[])
2817{
2818 struct gsm_bts *bts = vty->index;
2819 struct bts_codec_conf *codec = &bts->codec;
2820 int i;
2821
2822 codec->hr = 0;
2823 codec->efr = 0;
2824 codec->amr = 0;
2825 for (i = 0; i < argc; i++) {
2826 if (!strcmp(argv[i], "hr"))
2827 codec->hr = 1;
2828 if (!strcmp(argv[i], "efr"))
2829 codec->efr = 1;
2830 if (!strcmp(argv[i], "amr"))
2831 codec->amr = 1;
2832 }
2833}
2834
2835#define CODEC_PAR_STR " (hr|efr|amr)"
2836#define CODEC_HELP_STR "Half Rate\n" \
2837 "Enhanced Full Rate\nAdaptive Multirate\n"
2838
2839DEFUN(cfg_bts_codec0, cfg_bts_codec0_cmd,
2840 "codec-support fr",
2841 "Codec Support settings\nFullrate\n")
2842{
2843 _get_codec_from_arg(vty, 0, argv);
2844 return CMD_SUCCESS;
2845}
2846
2847DEFUN(cfg_bts_codec1, cfg_bts_codec1_cmd,
2848 "codec-support fr" CODEC_PAR_STR,
2849 "Codec Support settings\nFullrate\n"
2850 CODEC_HELP_STR)
2851{
2852 _get_codec_from_arg(vty, 1, argv);
2853 return CMD_SUCCESS;
2854}
2855
2856DEFUN(cfg_bts_codec2, cfg_bts_codec2_cmd,
2857 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR,
2858 "Codec Support settings\nFullrate\n"
2859 CODEC_HELP_STR CODEC_HELP_STR)
2860{
2861 _get_codec_from_arg(vty, 2, argv);
2862 return CMD_SUCCESS;
2863}
2864
2865DEFUN(cfg_bts_codec3, cfg_bts_codec3_cmd,
2866 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
2867 "Codec Support settings\nFullrate\n"
2868 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
2869{
2870 _get_codec_from_arg(vty, 3, argv);
2871 return CMD_SUCCESS;
2872}
2873
2874DEFUN(cfg_bts_codec4, cfg_bts_codec4_cmd,
2875 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
2876 "Codec Support settings\nFullrate\n"
2877 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
2878{
2879 _get_codec_from_arg(vty, 4, argv);
2880 return CMD_SUCCESS;
2881}
2882
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01002883DEFUN(cfg_bts_depends_on, cfg_bts_depends_on_cmd,
2884 "depends-on-bts <0-255>",
2885 "This BTS can only be started if another one is up\n" "BTS Number\n")
2886{
2887 struct gsm_bts *bts = vty->index;
2888 struct gsm_bts *other_bts;
2889 int dep = atoi(argv[0]);
2890
2891
2892 if (!is_ipaccess_bts(bts)) {
2893 vty_out(vty, "This feature is only available for IP systems.%s",
2894 VTY_NEWLINE);
2895 return CMD_WARNING;
2896 }
2897
2898 other_bts = gsm_bts_num(bts->network, dep);
2899 if (!other_bts || !is_ipaccess_bts(other_bts)) {
2900 vty_out(vty, "This feature is only available for IP systems.%s",
2901 VTY_NEWLINE);
2902 return CMD_WARNING;
2903 }
2904
2905 if (dep >= bts->nr) {
2906 vty_out(vty, "%%Need to depend on an already declared unit.%s",
2907 VTY_NEWLINE);
2908 return CMD_WARNING;
2909 }
2910
2911 bts_depend_mark(bts, dep);
2912 return CMD_SUCCESS;
2913}
2914
2915DEFUN(cfg_bts_no_depends_on, cfg_bts_no_depends_on_cmd,
2916 "depeneds-on-bts <0-255>",
2917 NO_STR "This BTS can only be started if another one is up\n"
2918 "BTS Number\n")
2919{
2920 struct gsm_bts *bts = vty->index;
2921 int dep = atoi(argv[0]);
2922
2923 bts_depend_clear(bts, dep);
2924 return CMD_SUCCESS;
2925}
2926
Andreas Eversberg73266522014-01-19 11:47:44 +01002927#define AMR_TEXT "Adaptive Multi Rate settings\n"
2928#define AMR_MODE_TEXT "Codec modes to use with AMR codec\n"
2929#define AMR_START_TEXT "Initial codec to use with AMR\n" \
2930 "Automatically\nFirst codec\nSecond codec\nThird codec\nFourth codec\n"
2931#define AMR_TH_TEXT "AMR threshold between codecs\nMS side\nBTS side\n"
2932#define AMR_HY_TEXT "AMR hysteresis between codecs\nMS side\nBTS side\n"
2933
2934static void get_amr_from_arg(struct vty *vty, int argc, const char *argv[], int full)
2935{
2936 struct gsm_bts *bts = vty->index;
2937 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
2938 struct gsm48_multi_rate_conf *mr_conf =
2939 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
2940 int i;
2941
2942 mr->gsm48_ie[1] = 0;
2943 for (i = 0; i < argc; i++)
2944 mr->gsm48_ie[1] |= 1 << atoi(argv[i]);
2945 mr_conf->icmi = 0;
2946}
2947
2948static void get_amr_th_from_arg(struct vty *vty, int argc, const char *argv[], int full)
2949{
2950 struct gsm_bts *bts = vty->index;
2951 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02002952 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01002953 int i;
2954
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02002955 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
2956 for (i = 0; i < argc - 1; i++)
2957 modes[i].threshold = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01002958}
2959
2960static void get_amr_hy_from_arg(struct vty *vty, int argc, const char *argv[], int full)
2961{
2962 struct gsm_bts *bts = vty->index;
2963 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02002964 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01002965 int i;
2966
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02002967 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
2968 for (i = 0; i < argc - 1; i++)
2969 modes[i].hysteresis = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01002970}
2971
2972static void get_amr_start_from_arg(struct vty *vty, const char *argv[], int full)
2973{
2974 struct gsm_bts *bts = vty->index;
2975 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
2976 struct gsm48_multi_rate_conf *mr_conf =
2977 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
2978 int num = 0, i;
2979
2980 for (i = 0; i < ((full) ? 8 : 6); i++) {
2981 if ((mr->gsm48_ie[1] & (1 << i))) {
2982 num++;
2983 }
2984 }
2985
2986 if (argv[0][0] == 'a' || num == 0)
2987 mr_conf->icmi = 0;
2988 else {
2989 mr_conf->icmi = 1;
2990 if (num < atoi(argv[0]))
2991 mr_conf->smod = num - 1;
2992 else
2993 mr_conf->smod = atoi(argv[0]) - 1;
2994 }
2995}
2996
2997#define AMR_TCHF_PAR_STR " (0|1|2|3|4|5|6|7)"
2998#define AMR_TCHF_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n" \
2999 "10,2k\n12,2k\n"
3000
3001#define AMR_TCHH_PAR_STR " (0|1|2|3|4|5)"
3002#define AMR_TCHH_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n"
3003
3004#define AMR_TH_HELP_STR "Threshold between codec 1 and 2\n"
3005#define AMR_HY_HELP_STR "Hysteresis between codec 1 and 2\n"
3006
3007DEFUN(cfg_bts_amr_fr_modes1, cfg_bts_amr_fr_modes1_cmd,
3008 "amr tch-f modes" AMR_TCHF_PAR_STR,
3009 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3010 AMR_TCHF_HELP_STR)
3011{
3012 get_amr_from_arg(vty, 1, argv, 1);
3013 return CMD_SUCCESS;
3014}
3015
3016DEFUN(cfg_bts_amr_fr_modes2, cfg_bts_amr_fr_modes2_cmd,
3017 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3018 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3019 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3020{
3021 get_amr_from_arg(vty, 2, argv, 1);
3022 return CMD_SUCCESS;
3023}
3024
3025DEFUN(cfg_bts_amr_fr_modes3, cfg_bts_amr_fr_modes3_cmd,
3026 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3027 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3028 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3029{
3030 get_amr_from_arg(vty, 3, argv, 1);
3031 return CMD_SUCCESS;
3032}
3033
3034DEFUN(cfg_bts_amr_fr_modes4, cfg_bts_amr_fr_modes4_cmd,
3035 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3036 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3037 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3038{
3039 get_amr_from_arg(vty, 4, argv, 1);
3040 return CMD_SUCCESS;
3041}
3042
3043DEFUN(cfg_bts_amr_fr_start_mode, cfg_bts_amr_fr_start_mode_cmd,
3044 "amr tch-f start-mode (auto|1|2|3|4)",
3045 AMR_TEXT "Full Rate\n" AMR_START_TEXT)
3046{
3047 get_amr_start_from_arg(vty, argv, 1);
3048 return CMD_SUCCESS;
3049}
3050
3051DEFUN(cfg_bts_amr_fr_thres1, cfg_bts_amr_fr_thres1_cmd,
3052 "amr tch-f threshold (ms|bts) <0-63>",
3053 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3054 AMR_TH_HELP_STR)
3055{
3056 get_amr_th_from_arg(vty, 2, argv, 1);
3057 return CMD_SUCCESS;
3058}
3059
3060DEFUN(cfg_bts_amr_fr_thres2, cfg_bts_amr_fr_thres2_cmd,
3061 "amr tch-f threshold (ms|bts) <0-63> <0-63>",
3062 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3063 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3064{
3065 get_amr_th_from_arg(vty, 3, argv, 1);
3066 return CMD_SUCCESS;
3067}
3068
3069DEFUN(cfg_bts_amr_fr_thres3, cfg_bts_amr_fr_thres3_cmd,
3070 "amr tch-f threshold (ms|bts) <0-63> <0-63> <0-63>",
3071 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3072 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3073{
3074 get_amr_th_from_arg(vty, 4, argv, 1);
3075 return CMD_SUCCESS;
3076}
3077
3078DEFUN(cfg_bts_amr_fr_hyst1, cfg_bts_amr_fr_hyst1_cmd,
3079 "amr tch-f hysteresis (ms|bts) <0-15>",
3080 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3081 AMR_HY_HELP_STR)
3082{
3083 get_amr_hy_from_arg(vty, 2, argv, 1);
3084 return CMD_SUCCESS;
3085}
3086
3087DEFUN(cfg_bts_amr_fr_hyst2, cfg_bts_amr_fr_hyst2_cmd,
3088 "amr tch-f hysteresis (ms|bts) <0-15> <0-15>",
3089 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3090 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3091{
3092 get_amr_hy_from_arg(vty, 3, argv, 1);
3093 return CMD_SUCCESS;
3094}
3095
3096DEFUN(cfg_bts_amr_fr_hyst3, cfg_bts_amr_fr_hyst3_cmd,
3097 "amr tch-f hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3098 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3099 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3100{
3101 get_amr_hy_from_arg(vty, 4, argv, 1);
3102 return CMD_SUCCESS;
3103}
3104
3105DEFUN(cfg_bts_amr_hr_modes1, cfg_bts_amr_hr_modes1_cmd,
3106 "amr tch-h modes" AMR_TCHH_PAR_STR,
3107 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3108 AMR_TCHH_HELP_STR)
3109{
3110 get_amr_from_arg(vty, 1, argv, 0);
3111 return CMD_SUCCESS;
3112}
3113
3114DEFUN(cfg_bts_amr_hr_modes2, cfg_bts_amr_hr_modes2_cmd,
3115 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3116 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3117 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3118{
3119 get_amr_from_arg(vty, 2, argv, 0);
3120 return CMD_SUCCESS;
3121}
3122
3123DEFUN(cfg_bts_amr_hr_modes3, cfg_bts_amr_hr_modes3_cmd,
3124 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3125 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3126 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3127{
3128 get_amr_from_arg(vty, 3, argv, 0);
3129 return CMD_SUCCESS;
3130}
3131
3132DEFUN(cfg_bts_amr_hr_modes4, cfg_bts_amr_hr_modes4_cmd,
3133 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3134 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3135 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3136{
3137 get_amr_from_arg(vty, 4, argv, 0);
3138 return CMD_SUCCESS;
3139}
3140
3141DEFUN(cfg_bts_amr_hr_start_mode, cfg_bts_amr_hr_start_mode_cmd,
3142 "amr tch-h start-mode (auto|1|2|3|4)",
3143 AMR_TEXT "Half Rate\n" AMR_START_TEXT)
3144{
3145 get_amr_start_from_arg(vty, argv, 0);
3146 return CMD_SUCCESS;
3147}
3148
3149DEFUN(cfg_bts_amr_hr_thres1, cfg_bts_amr_hr_thres1_cmd,
3150 "amr tch-h threshold (ms|bts) <0-63>",
3151 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3152 AMR_TH_HELP_STR)
3153{
3154 get_amr_th_from_arg(vty, 2, argv, 0);
3155 return CMD_SUCCESS;
3156}
3157
3158DEFUN(cfg_bts_amr_hr_thres2, cfg_bts_amr_hr_thres2_cmd,
3159 "amr tch-h threshold (ms|bts) <0-63> <0-63>",
3160 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3161 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3162{
3163 get_amr_th_from_arg(vty, 3, argv, 0);
3164 return CMD_SUCCESS;
3165}
3166
3167DEFUN(cfg_bts_amr_hr_thres3, cfg_bts_amr_hr_thres3_cmd,
3168 "amr tch-h threshold (ms|bts) <0-63> <0-63> <0-63>",
3169 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3170 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3171{
3172 get_amr_th_from_arg(vty, 4, argv, 0);
3173 return CMD_SUCCESS;
3174}
3175
3176DEFUN(cfg_bts_amr_hr_hyst1, cfg_bts_amr_hr_hyst1_cmd,
3177 "amr tch-h hysteresis (ms|bts) <0-15>",
3178 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3179 AMR_HY_HELP_STR)
3180{
3181 get_amr_hy_from_arg(vty, 2, argv, 0);
3182 return CMD_SUCCESS;
3183}
3184
3185DEFUN(cfg_bts_amr_hr_hyst2, cfg_bts_amr_hr_hyst2_cmd,
3186 "amr tch-h hysteresis (ms|bts) <0-15> <0-15>",
3187 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3188 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3189{
3190 get_amr_hy_from_arg(vty, 3, argv, 0);
3191 return CMD_SUCCESS;
3192}
3193
3194DEFUN(cfg_bts_amr_hr_hyst3, cfg_bts_amr_hr_hyst3_cmd,
3195 "amr tch-h hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3196 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3197 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3198{
3199 get_amr_hy_from_arg(vty, 4, argv, 0);
3200 return CMD_SUCCESS;
3201}
3202
Harald Welte8f0ed552010-05-11 21:53:49 +02003203#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02003204
Harald Welte5258fc42009-03-28 19:07:53 +00003205/* per TRX configuration */
3206DEFUN(cfg_trx,
3207 cfg_trx_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02003208 "trx <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02003209 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00003210 "Select a TRX to configure")
3211{
3212 int trx_nr = atoi(argv[0]);
3213 struct gsm_bts *bts = vty->index;
3214 struct gsm_bts_trx *trx;
3215
Harald Weltee441d9c2009-06-21 16:17:15 +02003216 if (trx_nr > bts->num_trx) {
3217 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
3218 bts->num_trx, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00003219 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02003220 } else if (trx_nr == bts->num_trx) {
3221 /* we need to allocate a new one */
3222 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003223 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02003224 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003225
Harald Weltee441d9c2009-06-21 16:17:15 +02003226 if (!trx)
3227 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00003228
3229 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02003230 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00003231 vty->node = TRX_NODE;
3232
3233 return CMD_SUCCESS;
3234}
3235
3236DEFUN(cfg_trx_arfcn,
3237 cfg_trx_arfcn_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01003238 "arfcn <0-1023>",
Harald Welte13fe2192012-08-17 09:57:25 +02003239 "Set the ARFCN for this TRX\n"
3240 "Absolute Radio Frequency Channel Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003241{
3242 int arfcn = atoi(argv[0]);
3243 struct gsm_bts_trx *trx = vty->index;
3244
3245 /* FIXME: check if this ARFCN is supported by this TRX */
3246
3247 trx->arfcn = arfcn;
3248
3249 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
3250 /* FIXME: use OML layer to update the ARFCN */
3251 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
3252
3253 return CMD_SUCCESS;
3254}
3255
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003256DEFUN(cfg_trx_nominal_power,
3257 cfg_trx_nominal_power_cmd,
3258 "nominal power <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003259 "Nominal TRX RF Power in dBm\n"
3260 "Nominal TRX RF Power in dBm\n"
3261 "Nominal TRX RF Power in dBm\n")
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003262{
3263 struct gsm_bts_trx *trx = vty->index;
3264
3265 trx->nominal_power = atoi(argv[0]);
3266
3267 return CMD_SUCCESS;
3268}
3269
Harald Weltefcd24452009-06-20 18:15:19 +02003270DEFUN(cfg_trx_max_power_red,
3271 cfg_trx_max_power_red_cmd,
3272 "max_power_red <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003273 "Reduction of maximum BS RF Power (relative to nominal power)\n"
Harald Weltefcd24452009-06-20 18:15:19 +02003274 "Reduction of maximum BS RF Power in dB\n")
3275{
3276 int maxpwr_r = atoi(argv[0]);
3277 struct gsm_bts_trx *trx = vty->index;
Harald Welte61a83b22009-11-18 09:20:22 +01003278 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-06-20 18:15:19 +02003279
3280 /* FIXME: check if our BTS type supports more than 12 */
3281 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
3282 vty_out(vty, "%% Power %d dB is not in the valid range%s",
3283 maxpwr_r, VTY_NEWLINE);
3284 return CMD_WARNING;
3285 }
3286 if (maxpwr_r & 1) {
3287 vty_out(vty, "%% Power %d dB is not an even value%s",
3288 maxpwr_r, VTY_NEWLINE);
3289 return CMD_WARNING;
3290 }
3291
3292 trx->max_power_red = maxpwr_r;
3293
3294 /* FIXME: make sure we update this using OML */
3295
3296 return CMD_SUCCESS;
3297}
3298
Harald Welte42581822009-08-08 16:12:58 +02003299DEFUN(cfg_trx_rsl_e1,
3300 cfg_trx_rsl_e1_cmd,
3301 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003302 "RSL Parameters\n"
3303 "E1/T1 interface to be used for RSL\n"
3304 "E1/T1 interface to be used for RSL\n"
3305 "E1/T1 Line Number to be used for RSL\n"
3306 "E1/T1 Timeslot to be used for RSL\n"
3307 "E1/T1 Timeslot to be used for RSL\n"
3308 "E1/T1 Sub-slot to be used for RSL\n"
3309 "E1/T1 Sub-slot 0 is to be used for RSL\n"
3310 "E1/T1 Sub-slot 1 is to be used for RSL\n"
3311 "E1/T1 Sub-slot 2 is to be used for RSL\n"
3312 "E1/T1 Sub-slot 3 is to be used for RSL\n"
3313 "E1/T1 full timeslot is to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003314{
3315 struct gsm_bts_trx *trx = vty->index;
3316
3317 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
3318
3319 return CMD_SUCCESS;
3320}
3321
3322DEFUN(cfg_trx_rsl_e1_tei,
3323 cfg_trx_rsl_e1_tei_cmd,
3324 "rsl e1 tei <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003325 "RSL Parameters\n"
3326 "Set the TEI to be used for RSL\n"
3327 "Set the TEI to be used for RSL\n"
3328 "TEI to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003329{
3330 struct gsm_bts_trx *trx = vty->index;
3331
3332 trx->rsl_tei = atoi(argv[0]);
3333
3334 return CMD_SUCCESS;
3335}
3336
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003337DEFUN(cfg_trx_rf_locked,
3338 cfg_trx_rf_locked_cmd,
3339 "rf_locked (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003340 "Set or unset the RF Locking (Turn off RF of the TRX)\n"
3341 "TRX is NOT RF locked (active)\n"
3342 "TRX is RF locked (turned off)\n")
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003343{
3344 int locked = atoi(argv[0]);
3345 struct gsm_bts_trx *trx = vty->index;
3346
3347 gsm_trx_lock_rf(trx, locked);
3348 return CMD_SUCCESS;
3349}
Harald Welte42581822009-08-08 16:12:58 +02003350
Harald Welte5258fc42009-03-28 19:07:53 +00003351/* per TS configuration */
3352DEFUN(cfg_ts,
3353 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003354 "timeslot <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003355 "Select a Timeslot to configure\n"
3356 "Timeslot number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003357{
3358 int ts_nr = atoi(argv[0]);
3359 struct gsm_bts_trx *trx = vty->index;
3360 struct gsm_bts_trx_ts *ts;
3361
3362 if (ts_nr >= TRX_NR_TS) {
3363 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
3364 TRX_NR_TS, VTY_NEWLINE);
3365 return CMD_WARNING;
3366 }
3367
3368 ts = &trx->ts[ts_nr];
3369
3370 vty->index = ts;
3371 vty->node = TS_NODE;
3372
3373 return CMD_SUCCESS;
3374}
3375
Harald Weltea6fd58e2009-08-07 00:25:23 +02003376DEFUN(cfg_ts_pchan,
3377 cfg_ts_pchan_cmd,
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003378 "phys_chan_config PCHAN", /* dynamically generated! */
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003379 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003380{
3381 struct gsm_bts_trx_ts *ts = vty->index;
3382 int pchanc;
3383
3384 pchanc = gsm_pchan_parse(argv[0]);
3385 if (pchanc < 0)
3386 return CMD_WARNING;
3387
3388 ts->pchan = pchanc;
3389
3390 return CMD_SUCCESS;
3391}
3392
3393/* used for backwards compatibility with old config files that still
3394 * have uppercase pchan type names */
3395DEFUN_HIDDEN(cfg_ts_pchan_compat,
3396 cfg_ts_pchan_compat_cmd,
Harald Weltea6fd58e2009-08-07 00:25:23 +02003397 "phys_chan_config PCHAN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003398 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003399{
3400 struct gsm_bts_trx_ts *ts = vty->index;
3401 int pchanc;
3402
3403 pchanc = gsm_pchan_parse(argv[0]);
3404 if (pchanc < 0)
3405 return CMD_WARNING;
3406
3407 ts->pchan = pchanc;
3408
3409 return CMD_SUCCESS;
3410}
3411
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003412
3413
Harald Welte135a6482011-05-30 12:09:13 +02003414DEFUN(cfg_ts_tsc,
3415 cfg_ts_tsc_cmd,
3416 "training_sequence_code <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003417 "Training Sequence Code of the Timeslot\n" "TSC\n")
Harald Welte135a6482011-05-30 12:09:13 +02003418{
3419 struct gsm_bts_trx_ts *ts = vty->index;
3420
Harald Welte903aaea2014-01-19 17:10:50 +01003421 if (!gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_MULTI_TSC)) {
3422 vty_out(vty, "%% This BTS does not support a TSC != BCC, "
3423 "falling back to BCC%s", VTY_NEWLINE);
3424 ts->tsc = -1;
3425 return CMD_WARNING;
3426 }
3427
Harald Welte135a6482011-05-30 12:09:13 +02003428 ts->tsc = atoi(argv[0]);
3429
3430 return CMD_SUCCESS;
3431}
3432
Harald Weltea39b0f22010-06-14 22:26:10 +02003433#define HOPPING_STR "Configure frequency hopping\n"
3434
3435DEFUN(cfg_ts_hopping,
3436 cfg_ts_hopping_cmd,
3437 "hopping enabled (0|1)",
3438 HOPPING_STR "Enable or disable frequency hopping\n"
3439 "Disable frequency hopping\n" "Enable frequency hopping\n")
3440{
3441 struct gsm_bts_trx_ts *ts = vty->index;
Harald Weltec2fb3d02010-06-14 22:47:37 +02003442 int enabled = atoi(argv[0]);
Harald Weltea39b0f22010-06-14 22:26:10 +02003443
Harald Weltec2fb3d02010-06-14 22:47:37 +02003444 if (enabled && !gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_HOPPING)) {
3445 vty_out(vty, "BTS model does not support hopping%s",
3446 VTY_NEWLINE);
3447 return CMD_WARNING;
3448 }
3449
3450 ts->hopping.enabled = enabled;
Harald Weltea39b0f22010-06-14 22:26:10 +02003451
3452 return CMD_SUCCESS;
3453}
3454
Harald Welte6e0cd042009-09-12 13:05:33 +02003455DEFUN(cfg_ts_hsn,
3456 cfg_ts_hsn_cmd,
Harald Weltea39b0f22010-06-14 22:26:10 +02003457 "hopping sequence-number <0-63>",
3458 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003459 "Which hopping sequence to use for this channel\n"
3460 "Hopping Sequence Number (HSN)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003461{
3462 struct gsm_bts_trx_ts *ts = vty->index;
3463
3464 ts->hopping.hsn = atoi(argv[0]);
3465
3466 return CMD_SUCCESS;
3467}
3468
3469DEFUN(cfg_ts_maio,
3470 cfg_ts_maio_cmd,
3471 "hopping maio <0-63>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003472 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003473 "Which hopping MAIO to use for this channel\n"
3474 "Mobile Allocation Index Offset (MAIO)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003475{
3476 struct gsm_bts_trx_ts *ts = vty->index;
3477
3478 ts->hopping.maio = atoi(argv[0]);
3479
3480 return CMD_SUCCESS;
3481}
3482
3483DEFUN(cfg_ts_arfcn_add,
3484 cfg_ts_arfcn_add_cmd,
3485 "hopping arfcn add <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003486 HOPPING_STR "Configure hopping ARFCN list\n"
3487 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003488{
3489 struct gsm_bts_trx_ts *ts = vty->index;
3490 int arfcn = atoi(argv[0]);
3491
Harald Weltea39b0f22010-06-14 22:26:10 +02003492 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
3493
Harald Welte6e0cd042009-09-12 13:05:33 +02003494 return CMD_SUCCESS;
3495}
3496
3497DEFUN(cfg_ts_arfcn_del,
3498 cfg_ts_arfcn_del_cmd,
3499 "hopping arfcn del <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003500 HOPPING_STR "Configure hopping ARFCN list\n"
3501 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003502{
3503 struct gsm_bts_trx_ts *ts = vty->index;
3504 int arfcn = atoi(argv[0]);
3505
Harald Weltea39b0f22010-06-14 22:26:10 +02003506 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
3507
Harald Welte6e0cd042009-09-12 13:05:33 +02003508 return CMD_SUCCESS;
3509}
3510
Harald Weltea6fd58e2009-08-07 00:25:23 +02003511DEFUN(cfg_ts_e1_subslot,
3512 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003513 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003514 "E1/T1 channel connected to this on-air timeslot\n"
3515 "E1/T1 channel connected to this on-air timeslot\n"
3516 "E1/T1 line connected to this on-air timeslot\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02003517 "E1/T1 timeslot connected to this on-air timeslot\n"
3518 "E1/T1 timeslot connected to this on-air timeslot\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02003519 "E1/T1 sub-slot connected to this on-air timeslot\n"
3520 "E1/T1 sub-slot 0 connected to this on-air timeslot\n"
3521 "E1/T1 sub-slot 1 connected to this on-air timeslot\n"
3522 "E1/T1 sub-slot 2 connected to this on-air timeslot\n"
3523 "E1/T1 sub-slot 3 connected to this on-air timeslot\n"
3524 "Full E1/T1 timeslot connected to this on-air timeslot\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003525{
3526 struct gsm_bts_trx_ts *ts = vty->index;
3527
Harald Welte42581822009-08-08 16:12:58 +02003528 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003529
3530 return CMD_SUCCESS;
3531}
Harald Welte5258fc42009-03-28 19:07:53 +00003532
Harald Welte4f10c252010-05-16 21:47:13 +02003533void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
3534{
3535 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +02003536 osmo_counter_get(net->stats.chreq.total),
3537 osmo_counter_get(net->stats.chreq.no_channel), VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003538 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +02003539 osmo_counter_get(net->stats.chan.rf_fail),
3540 osmo_counter_get(net->stats.chan.rll_err), VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003541 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +02003542 osmo_counter_get(net->stats.paging.attempted),
3543 osmo_counter_get(net->stats.paging.completed),
3544 osmo_counter_get(net->stats.paging.expired), VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003545 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
Pablo Neira Ayusodfb342c2011-05-06 12:13:10 +02003546 osmo_counter_get(net->stats.bts.oml_fail),
3547 osmo_counter_get(net->stats.bts.rsl_fail), VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003548}
3549
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003550DEFUN(drop_bts,
3551 drop_bts_cmd,
Holger Hans Peter Freyther0586b0f2010-04-11 12:46:45 +02003552 "drop bts connection <0-65535> (oml|rsl)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003553 "Debug/Simulation command to drop Abis/IP BTS\n"
3554 "Debug/Simulation command to drop Abis/IP BTS\n"
3555 "Debug/Simulation command to drop Abis/IP BTS\n"
3556 "BTS NR\n" "Drop OML Connection\n" "Drop RSL Connection\n")
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003557{
3558 struct gsm_network *gsmnet;
3559 struct gsm_bts_trx *trx;
3560 struct gsm_bts *bts;
3561 unsigned int bts_nr;
3562
3563 gsmnet = gsmnet_from_vty(vty);
3564
3565 bts_nr = atoi(argv[0]);
3566 if (bts_nr >= gsmnet->num_bts) {
3567 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3568 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3569 return CMD_WARNING;
3570 }
3571
3572 bts = gsm_bts_num(gsmnet, bts_nr);
3573 if (!bts) {
3574 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3575 return CMD_WARNING;
3576 }
3577
3578 if (!is_ipaccess_bts(bts)) {
3579 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
3580 return CMD_WARNING;
3581 }
3582
3583
3584 /* close all connections */
3585 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003586 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003587 } else if (strcmp(argv[1], "rsl") == 0) {
3588 /* close all rsl connections */
3589 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003590 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003591 }
3592 } else {
3593 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
3594 return CMD_WARNING;
3595 }
3596
3597 return CMD_SUCCESS;
3598}
3599
Harald Welte30f1f372014-12-28 15:00:45 +01003600DEFUN(smscb_cmd, smscb_cmd_cmd,
3601 "bts <0-255> smscb-command <1-4> HEXSTRING",
3602 "BTS related commands\n" "BTS Number\n"
3603 "SMS Cell Broadcast\n" "Last Valid Block\n"
3604 "Hex Encoded SMSCB message (up to 88 octets)\n")
3605{
3606 struct gsm_bts *bts;
3607 int bts_nr = atoi(argv[0]);
3608 int last_block = atoi(argv[1]);
3609 struct rsl_ie_cb_cmd_type cb_cmd;
3610 uint8_t buf[88];
3611 int rc;
3612
3613 bts = gsm_bts_num(bsc_gsmnet, bts_nr);
3614 if (!bts) {
3615 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3616 return CMD_WARNING;
3617 }
3618 rc = osmo_hexparse(argv[2], buf, sizeof(buf));
3619 if (rc < 0 || rc > sizeof(buf)) {
3620 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
3621 return CMD_WARNING;
3622 }
3623
3624 cb_cmd.spare = 0;
3625 cb_cmd.def_bcast = 0;
3626 cb_cmd.command = RSL_CB_CMD_TYPE_NORMAL;
3627
3628 switch (last_block) {
3629 case 1:
3630 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_1;
3631 break;
3632 case 2:
3633 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_2;
3634 break;
3635 case 3:
3636 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_3;
3637 break;
3638 case 4:
3639 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_4;
3640 break;
3641 }
3642
3643 rsl_sms_cb_command(bts, RSL_CHAN_SDCCH4_ACCH, cb_cmd, buf, rc);
3644
3645 return CMD_SUCCESS;
3646}
3647
3648
Harald Welted0d2b0b2010-12-23 13:18:07 +01003649DEFUN(pdch_act, pdch_act_cmd,
3650 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
3651 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3652 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
3653 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
3654 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
3655{
3656 struct gsm_bts *bts;
3657 struct gsm_bts_trx *trx;
3658 struct gsm_bts_trx_ts *ts;
3659 int bts_nr = atoi(argv[0]);
3660 int trx_nr = atoi(argv[1]);
3661 int ts_nr = atoi(argv[2]);
3662 int activate;
3663
3664 bts = gsm_bts_num(bsc_gsmnet, bts_nr);
3665 if (!bts) {
3666 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3667 return CMD_WARNING;
3668 }
3669
3670 if (!is_ipaccess_bts(bts)) {
3671 vty_out(vty, "%% This command only works for ipaccess BTS%s",
3672 VTY_NEWLINE);
3673 return CMD_WARNING;
3674 }
3675
3676 trx = gsm_bts_trx_num(bts, trx_nr);
3677 if (!trx) {
3678 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
3679 return CMD_WARNING;
3680 }
3681
3682 ts = &trx->ts[ts_nr];
3683 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
3684 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
3685 "mode%s", ts_nr, VTY_NEWLINE);
3686 return CMD_WARNING;
3687 }
3688
3689 if (!strcmp(argv[3], "activate"))
3690 activate = 1;
3691 else
3692 activate = 0;
3693
3694 rsl_ipacc_pdch_activate(ts, activate);
3695
3696 return CMD_SUCCESS;
3697
3698}
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003699
Harald Weltedcccb182010-05-16 20:52:23 +02003700extern int bsc_vty_init_extra(void);
Harald Welte1353f962010-05-16 19:20:24 +02003701extern const char *openbsc_copyright;
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02003702
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01003703int bsc_vty_init(const struct log_info *cat)
Harald Welte68628e82009-03-10 12:17:57 +00003704{
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003705 cfg_ts_pchan_cmd.string =
3706 vty_cmd_string_from_valstr(tall_bsc_ctx,
3707 gsm_pchant_names,
3708 "phys_chan_config (", "|", ")",
3709 VTY_DO_LOWER);
3710 cfg_ts_pchan_cmd.doc =
3711 vty_cmd_string_from_valstr(tall_bsc_ctx,
3712 gsm_pchant_descs,
3713 "Physical Channel Combination\n",
3714 "\n", "", 0);
3715
Harald Weltee555c2b2012-08-17 13:02:12 +02003716 cfg_bts_type_cmd.string =
3717 vty_cmd_string_from_valstr(tall_bsc_ctx,
3718 bts_type_names,
3719 "type (", "|", ")",
3720 VTY_DO_LOWER);
3721 cfg_bts_type_cmd.doc =
3722 vty_cmd_string_from_valstr(tall_bsc_ctx,
3723 bts_type_descs,
3724 "BTS Vendor/Type\n",
3725 "\n", "", 0);
3726
3727
Harald Welteb4d5b172010-05-12 16:10:35 +00003728 install_element_ve(&show_net_cmd);
3729 install_element_ve(&show_bts_cmd);
3730 install_element_ve(&show_trx_cmd);
3731 install_element_ve(&show_ts_cmd);
3732 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08003733 install_element_ve(&show_lchan_summary_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00003734
Harald Welteb4d5b172010-05-12 16:10:35 +00003735 install_element_ve(&show_paging_cmd);
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01003736 install_element_ve(&show_paging_group_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00003737
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01003738 logging_vty_add_cmds(cat);
Jacob Erlbeck64630cc2015-10-26 16:25:37 +01003739 osmo_stats_vty_add_cmds();
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01003740
Harald Welte5013b2a2009-08-07 13:29:14 +02003741 install_element(CONFIG_NODE, &cfg_net_cmd);
3742 install_node(&net_node, config_write_net);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01003743 vty_install_default(GSMNET_NODE);
Harald Welte42581822009-08-08 16:12:58 +02003744 install_element(GSMNET_NODE, &cfg_net_ncc_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02003745 install_element(GSMNET_NODE, &cfg_net_mnc_cmd);
3746 install_element(GSMNET_NODE, &cfg_net_name_short_cmd);
3747 install_element(GSMNET_NODE, &cfg_net_name_long_cmd);
Harald Welte (local)69de3972009-08-12 14:42:23 +02003748 install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd);
Harald Welte1085c092009-11-18 20:33:19 +01003749 install_element(GSMNET_NODE, &cfg_net_reject_cause_cmd);
Harald Welte4381cfe2009-08-30 15:47:06 +09003750 install_element(GSMNET_NODE, &cfg_net_encryption_cmd);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01003751 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Welteeab84a12009-12-13 10:53:12 +01003752 install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd);
Harald Welte3d23db42009-12-14 17:49:15 +01003753 install_element(GSMNET_NODE, &cfg_net_mm_info_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01003754 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-12-21 16:51:50 +01003755 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
3756 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
3757 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
3758 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
3759 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
3760 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01003761 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01003762 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
3763 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
3764 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
3765 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
3766 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
3767 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
3768 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
3769 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
3770 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltec9f499f2010-12-23 22:53:50 +01003771 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01003772 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08003773 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +01003774 install_element(GSMNET_NODE, &cfg_net_subscr_keep_cmd);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08003775 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02003776
3777 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02003778 install_node(&bts_node, config_write_bts);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01003779 vty_install_default(BTS_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00003780 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02003781 install_element(BTS_NODE, &cfg_description_cmd);
3782 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02003783 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02003784 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00003785 install_element(BTS_NODE, &cfg_bts_lac_cmd);
3786 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02003787 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00003788 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8b291802013-03-12 13:57:05 +01003789 install_element(BTS_NODE, &cfg_bts_rsl_ip_cmd);
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01003790 install_element(BTS_NODE, &cfg_bts_timezone_cmd);
Jacob Erlbeck946d1412013-09-17 13:59:29 +02003791 install_element(BTS_NODE, &cfg_bts_timezone_dst_cmd);
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01003792 install_element(BTS_NODE, &cfg_bts_no_timezone_cmd);
Sylvain Munautc9519462011-10-17 14:04:55 +02003793 install_element(BTS_NODE, &cfg_bts_nokia_site_skip_reset_cmd);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01003794 install_element(BTS_NODE, &cfg_bts_nokia_site_no_loc_rel_cnf_cmd);
Sipos Csaba56e17662015-02-07 13:27:36 +01003795 install_element(BTS_NODE, &cfg_bts_nokia_site_bts_reset_timer_cnf_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02003796 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-08-08 16:12:58 +02003797 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
3798 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte7a8fa412009-08-10 13:48:16 +02003799 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01003800 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
3801 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02003802 install_element(BTS_NODE, &cfg_bts_chan_desc_att_cmd);
3803 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_pa_mfrms_cmd);
3804 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_ag_blks_res_cmd);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08003805 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
3806 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02003807 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08003808 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Ivan Kluchnikov67920592013-09-16 13:13:04 +04003809 install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02003810 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02003811 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02003812 install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
Harald Welte73225282009-12-12 18:17:25 +01003813 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
3814 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaute0b06b02010-11-28 18:17:28 +01003815 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
3816 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
3817 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
3818 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
3819 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
3820 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01003821 install_element(BTS_NODE, &cfg_bts_radio_link_timeout_cmd);
Harald Welte4511d892010-04-18 15:51:20 +02003822 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02003823 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08003824 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01003825 install_element(BTS_NODE, &cfg_bts_gprs_net_ctrl_ord_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08003826 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02003827 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08003828 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08003829 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-03-14 23:30:30 +08003830 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
3831 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
3832 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08003833 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welte9fbff4a2010-07-30 11:50:09 +02003834 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
3835 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welte32c09622011-01-11 23:44:56 +01003836 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
3837 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Welte64c07d22011-02-15 11:43:27 +01003838 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02003839 install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
3840 install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01003841 install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
3842 install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
Andreas Eversberga83d5112013-12-07 18:32:28 +01003843 install_element(BTS_NODE, &cfg_bts_codec0_cmd);
3844 install_element(BTS_NODE, &cfg_bts_codec1_cmd);
3845 install_element(BTS_NODE, &cfg_bts_codec2_cmd);
3846 install_element(BTS_NODE, &cfg_bts_codec3_cmd);
3847 install_element(BTS_NODE, &cfg_bts_codec4_cmd);
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01003848 install_element(BTS_NODE, &cfg_bts_depends_on_cmd);
3849 install_element(BTS_NODE, &cfg_bts_no_depends_on_cmd);
Andreas Eversberg73266522014-01-19 11:47:44 +01003850 install_element(BTS_NODE, &cfg_bts_amr_fr_modes1_cmd);
3851 install_element(BTS_NODE, &cfg_bts_amr_fr_modes2_cmd);
3852 install_element(BTS_NODE, &cfg_bts_amr_fr_modes3_cmd);
3853 install_element(BTS_NODE, &cfg_bts_amr_fr_modes4_cmd);
3854 install_element(BTS_NODE, &cfg_bts_amr_fr_thres1_cmd);
3855 install_element(BTS_NODE, &cfg_bts_amr_fr_thres2_cmd);
3856 install_element(BTS_NODE, &cfg_bts_amr_fr_thres3_cmd);
3857 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst1_cmd);
3858 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst2_cmd);
3859 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst3_cmd);
3860 install_element(BTS_NODE, &cfg_bts_amr_fr_start_mode_cmd);
3861 install_element(BTS_NODE, &cfg_bts_amr_hr_modes1_cmd);
3862 install_element(BTS_NODE, &cfg_bts_amr_hr_modes2_cmd);
3863 install_element(BTS_NODE, &cfg_bts_amr_hr_modes3_cmd);
3864 install_element(BTS_NODE, &cfg_bts_amr_hr_modes4_cmd);
3865 install_element(BTS_NODE, &cfg_bts_amr_hr_thres1_cmd);
3866 install_element(BTS_NODE, &cfg_bts_amr_hr_thres2_cmd);
3867 install_element(BTS_NODE, &cfg_bts_amr_hr_thres3_cmd);
3868 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst1_cmd);
3869 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst2_cmd);
3870 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst3_cmd);
3871 install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003872
Harald Welte5258fc42009-03-28 19:07:53 +00003873 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003874 install_node(&trx_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01003875 vty_install_default(TRX_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00003876 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02003877 install_element(TRX_NODE, &cfg_description_cmd);
3878 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003879 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02003880 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-08-08 16:12:58 +02003881 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
3882 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003883 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003884
Harald Welte5258fc42009-03-28 19:07:53 +00003885 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003886 install_node(&ts_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01003887 vty_install_default(TS_NODE);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003888 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003889 install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);
Harald Welte135a6482011-05-30 12:09:13 +02003890 install_element(TS_NODE, &cfg_ts_tsc_cmd);
Harald Weltea39b0f22010-06-14 22:26:10 +02003891 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte6e0cd042009-09-12 13:05:33 +02003892 install_element(TS_NODE, &cfg_ts_hsn_cmd);
3893 install_element(TS_NODE, &cfg_ts_maio_cmd);
3894 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
3895 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003896 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003897
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003898 install_element(ENABLE_NODE, &drop_bts_cmd);
Harald Welted0d2b0b2010-12-23 13:18:07 +01003899 install_element(ENABLE_NODE, &pdch_act_cmd);
Harald Welte30f1f372014-12-28 15:00:45 +01003900 install_element(ENABLE_NODE, &smscb_cmd_cmd);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003901
Harald Welte81c9b9c2010-05-31 16:40:40 +02003902 abis_nm_vty_init();
Harald Weltee1d5eca2011-02-12 14:42:59 +01003903 abis_om2k_vty_init();
Harald Welte3016d9f2011-02-05 13:54:41 +01003904 e1inp_vty_init();
Harald Welte81c9b9c2010-05-31 16:40:40 +02003905
Harald Weltedcccb182010-05-16 20:52:23 +02003906 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00003907
Harald Welte68628e82009-03-10 12:17:57 +00003908 return 0;
3909}