blob: cdcc011fbb624fee44b1d8fcb3df89bd69d204b9 [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>
Maxc08ee712016-05-11 12:45:13 +020021#include <stdbool.h>
Harald Welte68628e82009-03-10 12:17:57 +000022#include <unistd.h>
Harald Welte68628e82009-03-10 12:17:57 +000023
Harald Welte4b037e42010-05-19 19:45:32 +020024#include <osmocom/vty/command.h>
25#include <osmocom/vty/buffer.h>
26#include <osmocom/vty/vty.h>
27#include <osmocom/vty/logging.h>
Jacob Erlbeck64630cc2015-10-26 16:25:37 +010028#include <osmocom/vty/stats.h>
Harald Welte4b037e42010-05-19 19:45:32 +020029#include <osmocom/vty/telnet_interface.h>
Harald Welte4ab9d7c2012-08-17 12:42:06 +020030#include <osmocom/vty/misc.h>
Maxc08ee712016-05-11 12:45:13 +020031#include <osmocom/gsm/protocol/gsm_04_08.h>
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +010032#include <osmocom/gsm/gsm0502.h>
33
Harald Welte68628e82009-03-10 12:17:57 +000034#include <arpa/inet.h>
35
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010036#include <osmocom/core/linuxlist.h>
Harald Welte68628e82009-03-10 12:17:57 +000037#include <openbsc/gsm_data.h>
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +020038#include <osmocom/abis/e1_input.h>
Harald Welte1bc77352009-03-10 19:47:51 +000039#include <openbsc/abis_nm.h>
Harald Welte4d54d0b2011-02-19 16:48:17 +010040#include <openbsc/abis_om2000.h>
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010041#include <osmocom/core/utils.h>
42#include <osmocom/gsm/gsm_utils.h>
Harald Weltecdc59ff2011-05-23 20:42:26 +020043#include <osmocom/gsm/abis_nm.h>
Harald Welteb908cb72009-12-22 13:09:29 +010044#include <openbsc/chan_alloc.h>
Harald Welte8387a492009-12-22 21:43:14 +010045#include <openbsc/meas_rep.h>
Harald Welte40f82892009-05-23 17:31:39 +000046#include <openbsc/db.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);
Maxddee01f2016-05-24 14:23:27 +0200193 vty_out(vty, " Authentication policy: %s",
194 gsm_auth_policy_name(net->auth_policy));
195 if (net->authorized_reg_str)
196 vty_out(vty, ", authorized regexp: %s", net->authorized_reg_str);
197 vty_out(vty, "%s", VTY_NEWLINE);
Maxe6052c42016-06-30 10:25:49 +0200198 vty_out(vty, " Auto create subscriber: %s%s",
199 net->auto_create_subscr ? "yes" : "no", VTY_NEWLINE);
200 vty_out(vty, " Auto assign extension: %s%s",
201 net->auto_assign_exten ? "yes" : "no", VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100202 vty_out(vty, " Location updating reject cause: %u%s",
203 net->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900204 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
205 VTY_NEWLINE);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +0100206 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
207 VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800208 vty_out(vty, " Use TCH for Paging any: %d%s", net->pag_any_tch,
209 VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100210 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
211 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100212 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
213 VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100214 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
215 VTY_NEWLINE);
Harald Welteb908cb72009-12-22 13:09:29 +0100216 network_chan_load(&pl, net);
217 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
218 dump_pchan_load_vty(vty, " ", &pl);
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100219
220 /* show rf */
Holger Hans Peter Freythera9fae1a2014-02-08 12:12:03 +0100221 if (net->bsc_data)
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100222 vty_out(vty, " Last RF Command: %s%s",
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200223 net->bsc_data->rf_ctrl->last_state_command,
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100224 VTY_NEWLINE);
Holger Hans Peter Freythera9fae1a2014-02-08 12:12:03 +0100225 if (net->bsc_data)
Jacob Erlbeck779a7282013-09-11 10:46:57 +0200226 vty_out(vty, " Last RF Lock Command: %s%s",
227 net->bsc_data->rf_ctrl->last_rf_lock_ctrl_command,
228 VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000229}
230
231DEFUN(show_net, show_net_cmd, "show network",
232 SHOW_STR "Display information about a GSM NETWORK\n")
233{
Harald Weltedcccb182010-05-16 20:52:23 +0200234 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000235 net_dump_vty(vty, net);
236
237 return CMD_SUCCESS;
238}
239
240static void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l)
241{
Harald Welteedb37782009-05-01 14:59:07 +0000242 struct e1inp_line *line;
243
244 if (!e1l) {
245 vty_out(vty, " None%s", VTY_NEWLINE);
246 return;
247 }
248
249 line = e1l->ts->line;
250
251 vty_out(vty, " E1 Line %u, Type %s: Timeslot %u, Mode %s%s",
252 line->num, line->driver->name, e1l->ts->num,
Harald Welte1bc77352009-03-10 19:47:51 +0000253 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
Harald Welteedb37782009-05-01 14:59:07 +0000254 vty_out(vty, " E1 TEI %u, SAPI %u%s",
Harald Welte68628e82009-03-10 12:17:57 +0000255 e1l->tei, e1l->sapi, VTY_NEWLINE);
256}
257
258static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
259{
Harald Welteb908cb72009-12-22 13:09:29 +0100260 struct pchan_load pl;
261
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200262 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Welte557c84e2015-11-20 10:50:24 +0100263 "BSIC %u (NCC=%u, BCC=%u) and %u TRX%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200264 bts->nr, btstype2str(bts->type), gsm_band_name(bts->band),
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200265 bts->cell_identity,
Harald Weltea2bbc5e2015-11-20 10:43:31 +0100266 bts->location_area_code, bts->bsic,
Harald Welte557c84e2015-11-20 10:50:24 +0100267 bts->bsic >> 3, bts->bsic & 7,
Harald Weltefcd24452009-06-20 18:15:19 +0200268 bts->num_trx, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200269 vty_out(vty, "Description: %s%s",
270 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Harald Welte1d8dbc42009-12-12 15:38:16 +0100271 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100272 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte1d8dbc42009-12-12 15:38:16 +0100273 rxlev2dbm(bts->si_common.cell_sel_par.rxlev_acc_min),
274 VTY_NEWLINE);
275 vty_out(vty, "Cell Reselection Hysteresis: %u dBm%s",
Harald Welte73225282009-12-12 18:17:25 +0100276 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100277 vty_out(vty, "RACH TX-Integer: %u%s", bts->si_common.rach_control.tx_integer,
278 VTY_NEWLINE);
279 vty_out(vty, "RACH Max transmissions: %u%s",
280 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
281 VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100282 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200283 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +0200284 if (bts->dtxu != GSM48_DTX_SHALL_NOT_BE_USED)
285 vty_out(vty, "Uplink DTX: %s%s",
286 (bts->dtxu != GSM48_DTX_SHALL_BE_USED) ?
287 "enabled" : "forced", VTY_NEWLINE);
288 else
289 vty_out(vty, "Uplink DTX: not enabled%s", VTY_NEWLINE);
290 vty_out(vty, "Downlink DTX: %senabled%s", bts->dtxd ? "" : "not ",
291 VTY_NEWLINE);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +0200292 vty_out(vty, "Channel Description Attachment: %s%s",
293 (bts->si_common.chan_desc.att) ? "yes" : "no", VTY_NEWLINE);
294 vty_out(vty, "Channel Description BS-PA-MFRMS: %u%s",
295 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
296 vty_out(vty, "Channel Description BS-AG_BLKS-RES: %u%s",
297 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
Harald Welte9fbff4a2010-07-30 11:50:09 +0200298 vty_out(vty, "System Information present: 0x%08x, static: 0x%08x%s",
299 bts->si_valid, bts->si_mode_static, VTY_NEWLINE);
Harald Welte4cc34222009-05-01 15:12:31 +0000300 if (is_ipaccess_bts(bts))
Harald Welte8175e952009-10-20 00:22:00 +0200301 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte4cc34222009-05-01 15:12:31 +0000302 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte8175e952009-10-20 00:22:00 +0200303 bts->oml_tei, VTY_NEWLINE);
Sylvain Munautc9519462011-10-17 14:04:55 +0200304 else if (bts->type == GSM_BTS_TYPE_NOKIA_SITE)
305 vty_out(vty, " Skip Reset: %d%s",
306 bts->nokia.skip_reset, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000307 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200308 net_dump_nmstate(vty, &bts->mo.nm_state);
Harald Welte68628e82009-03-10 12:17:57 +0000309 vty_out(vty, " Site Mgr NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200310 net_dump_nmstate(vty, &bts->site_mgr.mo.nm_state);
Holger Hans Peter Freyther846d8dc2013-05-29 16:22:09 +0200311 vty_out(vty, " GPRS NSE: ");
312 net_dump_nmstate(vty, &bts->gprs.nse.mo.nm_state);
313 vty_out(vty, " GPRS CELL: ");
314 net_dump_nmstate(vty, &bts->gprs.cell.mo.nm_state);
315 vty_out(vty, " GPRS NSVC0: ");
316 net_dump_nmstate(vty, &bts->gprs.nsvc[0].mo.nm_state);
317 vty_out(vty, " GPRS NSVC1: ");
318 net_dump_nmstate(vty, &bts->gprs.nsvc[1].mo.nm_state);
Holger Hans Peter Freyther66e14cd2011-04-26 15:52:34 +0200319 vty_out(vty, " Paging: %u pending requests, %u free slots%s",
320 paging_pending_requests_nr(bts),
Harald Welte68628e82009-03-10 12:17:57 +0000321 bts->paging.available_slots, VTY_NEWLINE);
Holger Hans Peter Freytherd283db42010-11-25 16:28:45 +0100322 if (is_ipaccess_bts(bts)) {
323 vty_out(vty, " OML Link state: %s.%s",
324 bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);
325 } else {
Harald Welte8175e952009-10-20 00:22:00 +0200326 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
327 e1isl_dump_vty(vty, bts->oml_link);
328 }
Holger Hans Peter Freytherd283db42010-11-25 16:28:45 +0100329
330 /* FIXME: chan_desc */
Harald Welteb908cb72009-12-22 13:09:29 +0100331 memset(&pl, 0, sizeof(pl));
Alexander Couzens308cb072016-08-29 18:45:42 +0200332 bts_chan_load(&pl, bts, 0);
Harald Welteb908cb72009-12-22 13:09:29 +0100333 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
334 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte68628e82009-03-10 12:17:57 +0000335}
336
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100337DEFUN(show_bts, show_bts_cmd, "show bts [<0-255>]",
Harald Welte68628e82009-03-10 12:17:57 +0000338 SHOW_STR "Display information about a BTS\n"
339 "BTS number")
340{
Harald Weltedcccb182010-05-16 20:52:23 +0200341 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000342 int bts_nr;
343
344 if (argc != 0) {
345 /* use the BTS number that the user has specified */
346 bts_nr = atoi(argv[0]);
Harald Welte712ddbc2010-12-24 12:24:03 +0100347 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000348 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000349 VTY_NEWLINE);
350 return CMD_WARNING;
351 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200352 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000353 return CMD_SUCCESS;
354 }
355 /* print all BTS's */
356 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee441d9c2009-06-21 16:17:15 +0200357 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000358
359 return CMD_SUCCESS;
360}
361
Harald Welte42581822009-08-08 16:12:58 +0200362/* utility functions */
363static void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,
364 const char *ts, const char *ss)
365{
366 e1_link->e1_nr = atoi(line);
367 e1_link->e1_ts = atoi(ts);
368 if (!strcmp(ss, "full"))
369 e1_link->e1_ts_ss = 255;
370 else
371 e1_link->e1_ts_ss = atoi(ss);
372}
373
374static void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,
375 const char *prefix)
376{
377 if (!e1_link->e1_ts)
378 return;
379
380 if (e1_link->e1_ts_ss == 255)
381 vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",
382 prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);
383 else
384 vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",
385 prefix, e1_link->e1_nr, e1_link->e1_ts,
386 e1_link->e1_ts_ss, VTY_NEWLINE);
387}
388
389
Harald Welte67ce0732009-08-06 19:06:46 +0200390static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
391{
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100392 vty_out(vty, " timeslot %u%s", ts->nr, VTY_NEWLINE);
Harald Weltea2bbc5e2015-11-20 10:43:31 +0100393 if (ts->tsc != -1)
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100394 vty_out(vty, " training_sequence_code %u%s", ts->tsc, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200395 if (ts->pchan != GSM_PCHAN_NONE)
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100396 vty_out(vty, " phys_chan_config %s%s",
Harald Welte42581822009-08-08 16:12:58 +0200397 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100398 vty_out(vty, " hopping enabled %u%s",
Harald Weltea39b0f22010-06-14 22:26:10 +0200399 ts->hopping.enabled, VTY_NEWLINE);
400 if (ts->hopping.enabled) {
401 unsigned int i;
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100402 vty_out(vty, " hopping sequence-number %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200403 ts->hopping.hsn, VTY_NEWLINE);
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100404 vty_out(vty, " hopping maio %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200405 ts->hopping.maio, VTY_NEWLINE);
Harald Weltea39b0f22010-06-14 22:26:10 +0200406 for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {
407 if (!bitvec_get_bit_pos(&ts->hopping.arfcns, i))
408 continue;
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100409 vty_out(vty, " hopping arfcn add %u%s",
Harald Weltea39b0f22010-06-14 22:26:10 +0200410 i, VTY_NEWLINE);
411 }
Harald Welte127af342010-12-24 12:07:07 +0100412 }
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100413 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Welteface7ed2011-02-14 16:15:21 +0100414
415 if (ts->trx->bts->model->config_write_ts)
416 ts->trx->bts->model->config_write_ts(vty, ts);
Harald Welte67ce0732009-08-06 19:06:46 +0200417}
418
419static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
420{
421 int i;
422
Harald Welte5013b2a2009-08-07 13:29:14 +0200423 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200424 if (trx->description)
425 vty_out(vty, " description %s%s", trx->description,
426 VTY_NEWLINE);
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200427 vty_out(vty, " rf_locked %u%s",
Harald Welted64c0bc2011-05-30 12:07:53 +0200428 trx->mo.nm_state.administrative == NM_STATE_LOCKED ? 1 : 0,
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200429 VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200430 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)7b37d972009-12-27 20:56:38 +0100431 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200432 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200433 config_write_e1_link(vty, &trx->rsl_e1_link, " rsl ");
434 vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei, VTY_NEWLINE);
Harald Welte67ce0732009-08-06 19:06:46 +0200435
Harald Welteface7ed2011-02-14 16:15:21 +0100436 if (trx->bts->model->config_write_trx)
437 trx->bts->model->config_write_trx(vty, trx);
438
Harald Welte67ce0732009-08-06 19:06:46 +0200439 for (i = 0; i < TRX_NR_TS; i++)
440 config_write_ts_single(vty, &trx->ts[i]);
441}
442
Harald Welte615e9562010-05-11 23:50:21 +0200443static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
444{
445 unsigned int i;
446 vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
447 VTY_NEWLINE);
448 if (bts->gprs.mode == BTS_GPRS_NONE)
449 return;
450
bhargava350533c2016-07-21 11:14:34 +0530451 vty_out(vty, " gprs 11bit_rach_support_for_egprs %u%s",
452 bts->gprs.supports_egprs_11bit_rach, VTY_NEWLINE);
453
Harald Welte615e9562010-05-11 23:50:21 +0200454 vty_out(vty, " gprs routing area %u%s", bts->gprs.rac,
455 VTY_NEWLINE);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +0100456 vty_out(vty, " gprs network-control-order nc%u%s",
457 bts->gprs.net_ctrl_ord, VTY_NEWLINE);
Max292ec582016-07-28 11:55:37 +0200458 if (!bts->gprs.ctrl_ack_type_use_block)
459 vty_out(vty, " gprs control-ack-type-rach%s", VTY_NEWLINE);
Harald Welte615e9562010-05-11 23:50:21 +0200460 vty_out(vty, " gprs cell bvci %u%s", bts->gprs.cell.bvci,
461 VTY_NEWLINE);
462 for (i = 0; i < ARRAY_SIZE(bts->gprs.cell.timer); i++)
463 vty_out(vty, " gprs cell timer %s %u%s",
464 get_value_string(gprs_bssgp_cfg_strs, i),
465 bts->gprs.cell.timer[i], VTY_NEWLINE);
466 vty_out(vty, " gprs nsei %u%s", bts->gprs.nse.nsei,
467 VTY_NEWLINE);
468 for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)
469 vty_out(vty, " gprs ns timer %s %u%s",
470 get_value_string(gprs_ns_timer_strs, i),
471 bts->gprs.nse.timer[i], VTY_NEWLINE);
472 for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
473 struct gsm_bts_gprs_nsvc *nsvc =
474 &bts->gprs.nsvc[i];
475 struct in_addr ia;
476
477 ia.s_addr = htonl(nsvc->remote_ip);
478 vty_out(vty, " gprs nsvc %u nsvci %u%s", i,
479 nsvc->nsvci, VTY_NEWLINE);
480 vty_out(vty, " gprs nsvc %u local udp port %u%s", i,
481 nsvc->local_port, VTY_NEWLINE);
482 vty_out(vty, " gprs nsvc %u remote udp port %u%s", i,
483 nsvc->remote_port, VTY_NEWLINE);
484 vty_out(vty, " gprs nsvc %u remote ip %s%s", i,
485 inet_ntoa(ia), VTY_NEWLINE);
486 }
487}
488
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200489/* Write the model data if there is one */
490static void config_write_bts_model(struct vty *vty, struct gsm_bts *bts)
Harald Welte67ce0732009-08-06 19:06:46 +0200491{
492 struct gsm_bts_trx *trx;
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200493
494 if (!bts->model)
495 return;
496
497 if (bts->model->config_write_bts)
498 bts->model->config_write_bts(vty, bts);
499
500 llist_for_each_entry(trx, &bts->trx_list, list)
501 config_write_trx_single(vty, trx);
502}
503
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +0200504static void write_amr_modes(struct vty *vty, const char *prefix,
505 const char *name, struct amr_mode *modes, int num)
506{
507 int i;
508
509 vty_out(vty, " %s threshold %s", prefix, name);
510 for (i = 0; i < num - 1; i++)
511 vty_out(vty, " %d", modes[i].threshold);
512 vty_out(vty, "%s", VTY_NEWLINE);
513 vty_out(vty, " %s hysteresis %s", prefix, name);
514 for (i = 0; i < num - 1; i++)
515 vty_out(vty, " %d", modes[i].hysteresis);
516 vty_out(vty, "%s", VTY_NEWLINE);
517}
518
Andreas Eversberg73266522014-01-19 11:47:44 +0100519static void config_write_bts_amr(struct vty *vty, struct gsm_bts *bts,
520 struct amr_multirate_conf *mr, int full)
521{
522 struct gsm48_multi_rate_conf *mr_conf;
523 const char *prefix = (full) ? "amr tch-f" : "amr tch-h";
524 int i, num;
525
526 if (!(mr->gsm48_ie[1]))
527 return;
528
529 mr_conf = (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
530
531 num = 0;
532 vty_out(vty, " %s modes", prefix);
533 for (i = 0; i < ((full) ? 8 : 6); i++) {
534 if ((mr->gsm48_ie[1] & (1 << i))) {
535 vty_out(vty, " %d", i);
536 num++;
537 }
538 }
539 vty_out(vty, "%s", VTY_NEWLINE);
540 if (num > 4)
541 num = 4;
542 if (num > 1) {
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +0200543 write_amr_modes(vty, prefix, "ms", mr->ms_mode, num);
544 write_amr_modes(vty, prefix, "bts", mr->bts_mode, num);
Andreas Eversberg73266522014-01-19 11:47:44 +0100545 }
546 vty_out(vty, " %s start-mode ", prefix);
547 if (mr_conf->icmi) {
548 num = 0;
549 for (i = 0; i < ((full) ? 8 : 6) && num < 4; i++) {
550 if ((mr->gsm48_ie[1] & (1 << i)))
551 num++;
552 if (mr_conf->smod == num - 1) {
553 vty_out(vty, "%d%s", num, VTY_NEWLINE);
554 break;
555 }
556 }
557 } else
558 vty_out(vty, "auto%s", VTY_NEWLINE);
559}
560
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200561static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
562{
Harald Welte9fbff4a2010-07-30 11:50:09 +0200563 int i;
Harald Welte67ce0732009-08-06 19:06:46 +0200564
Harald Welte5013b2a2009-08-07 13:29:14 +0200565 vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE);
566 vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200567 if (bts->description)
568 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200569 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freytherf926ed62009-11-19 16:38:49 +0100570 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200571 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte67ce0732009-08-06 19:06:46 +0200572 VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +0200573 if (bts->dtxu != GSM48_DTX_SHALL_NOT_BE_USED)
574 vty_out(vty, " dtx uplink%s%s",
575 (bts->dtxu != GSM48_DTX_SHALL_BE_USED) ? "" : " force",
576 VTY_NEWLINE);
577 if (bts->dtxd)
578 vty_out(vty, " dtx downlink%s", VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200579 vty_out(vty, " base_station_id_code %u%s", bts->bsic, VTY_NEWLINE);
Jacob Erlbeck946d1412013-09-17 13:59:29 +0200580 if (bts->tz.override != 0) {
581 if (bts->tz.dst)
582 vty_out(vty, " timezone %d %d %d%s",
583 bts->tz.hr, bts->tz.mn, bts->tz.dst, VTY_NEWLINE);
584 else
585 vty_out(vty, " timezone %d %d%s",
586 bts->tz.hr, bts->tz.mn, VTY_NEWLINE);
587 }
Harald Welte (local)0e451d02009-08-13 10:14:26 +0200588 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100589 vty_out(vty, " cell reselection hysteresis %u%s",
590 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
591 vty_out(vty, " rxlev access min %u%s",
592 bts->si_common.cell_sel_par.rxlev_acc_min, VTY_NEWLINE);
Sylvain Munaute0b06b02010-11-28 18:17:28 +0100593
594 if (bts->si_common.cell_ro_sel_par.present) {
595 struct gsm48_si_selection_params *sp;
596 sp = &bts->si_common.cell_ro_sel_par;
597
598 if (sp->cbq)
599 vty_out(vty, " cell bar qualify %u%s",
600 sp->cbq, VTY_NEWLINE);
601
602 if (sp->cell_resel_off)
603 vty_out(vty, " cell reselection offset %u%s",
604 sp->cell_resel_off*2, VTY_NEWLINE);
605
606 if (sp->temp_offs == 7)
607 vty_out(vty, " temporary offset infinite%s",
608 VTY_NEWLINE);
609 else if (sp->temp_offs)
610 vty_out(vty, " temporary offset %u%s",
611 sp->temp_offs*10, VTY_NEWLINE);
612
613 if (sp->penalty_time == 31)
614 vty_out(vty, " penalty time reserved%s",
615 VTY_NEWLINE);
616 else if (sp->penalty_time)
617 vty_out(vty, " penalty time %u%s",
618 (sp->penalty_time*20)+20, VTY_NEWLINE);
619 }
620
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +0200621 /* Is periodic LU enabled or disabled? */
622 if (bts->si_common.chan_desc.t3212 == 0)
623 vty_out(vty, " no periodic location update%s", VTY_NEWLINE);
624 else
625 vty_out(vty, " periodic location update %u%s",
626 bts->si_common.chan_desc.t3212 * 6, VTY_NEWLINE);
627
Andreas Eversberg4d4944a2013-03-10 11:49:35 +0100628 vty_out(vty, " radio-link-timeout %d%s",
629 get_radio_link_timeout(&bts->si_common.cell_options),
630 VTY_NEWLINE);
Harald Welte7a8fa412009-08-10 13:48:16 +0200631 vty_out(vty, " channel allocator %s%s",
632 bts->chan_alloc_reverse ? "descending" : "ascending",
633 VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100634 vty_out(vty, " rach tx integer %u%s",
635 bts->si_common.rach_control.tx_integer, VTY_NEWLINE);
636 vty_out(vty, " rach max transmission %u%s",
637 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
638 VTY_NEWLINE);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800639
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +0200640 vty_out(vty, " channel-descrption attach %u%s",
641 bts->si_common.chan_desc.att, VTY_NEWLINE);
642 vty_out(vty, " channel-descrption bs-pa-mfrms %u%s",
643 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
644 vty_out(vty, " channel-descrption bs-ag-blks-res %u%s",
645 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
646
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800647 if (bts->rach_b_thresh != -1)
648 vty_out(vty, " rach nm busy threshold %u%s",
649 bts->rach_b_thresh, VTY_NEWLINE);
650 if (bts->rach_ldavg_slots != -1)
651 vty_out(vty, " rach nm load average %u%s",
652 bts->rach_ldavg_slots, VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100653 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200654 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +0800655 if ((bts->si_common.rach_control.t2 & 0x4) == 0)
656 vty_out(vty, " rach emergency call allowed 1%s", VTY_NEWLINE);
Ivan Kluchnikov67920592013-09-16 13:13:04 +0400657 if ((bts->si_common.rach_control.t3) != 0)
658 for (i = 0; i < 8; i++)
659 if (bts->si_common.rach_control.t3 & (0x1 << i))
660 vty_out(vty, " rach access-control-class %d barred%s", i, VTY_NEWLINE);
661 if ((bts->si_common.rach_control.t2 & 0xfb) != 0)
662 for (i = 0; i < 8; i++)
663 if ((i != 2) && (bts->si_common.rach_control.t2 & (0x1 << i)))
664 vty_out(vty, " rach access-control-class %d barred%s", i+8, VTY_NEWLINE);
Harald Welte9fbff4a2010-07-30 11:50:09 +0200665 for (i = SYSINFO_TYPE_1; i < _MAX_SYSINFO_TYPE; i++) {
666 if (bts->si_mode_static & (1 << i)) {
667 vty_out(vty, " system-information %s mode static%s",
668 get_value_string(osmo_sitype_strs, i), VTY_NEWLINE);
669 vty_out(vty, " system-information %s static %s%s",
670 get_value_string(osmo_sitype_strs, i),
Sylvain Munaut63ef2152011-11-13 23:05:23 +0100671 osmo_hexdump_nospc(bts->si_buf[i], sizeof(bts->si_buf[i])),
Harald Welte9fbff4a2010-07-30 11:50:09 +0200672 VTY_NEWLINE);
673 }
674 }
Harald Weltefd355a32011-03-04 13:41:31 +0100675 switch (bts->type) {
676 case GSM_BTS_TYPE_NANOBTS:
Harald Weltef383aa12012-07-02 19:51:55 +0200677 case GSM_BTS_TYPE_OSMO_SYSMO:
Harald Welte5013b2a2009-08-07 13:29:14 +0200678 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Weltea6fd58e2009-08-07 00:25:23 +0200679 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte8b291802013-03-12 13:57:05 +0100680 if (bts->ip_access.rsl_ip) {
681 struct in_addr ia;
682 ia.s_addr = htonl(bts->ip_access.rsl_ip);
683 vty_out(vty, " ip.access rsl-ip %s%s", inet_ntoa(ia),
684 VTY_NEWLINE);
685 }
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +0200686 vty_out(vty, " oml ip.access stream_id %u line %u%s",
687 bts->oml_tei, bts->oml_e1_link.e1_nr, VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100688 break;
Sylvain Munautc9519462011-10-17 14:04:55 +0200689 case GSM_BTS_TYPE_NOKIA_SITE:
690 vty_out(vty, " nokia_site skip-reset %d%s", bts->nokia.skip_reset, VTY_NEWLINE);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +0100691 vty_out(vty, " nokia_site no-local-rel-conf %d%s",
692 bts->nokia.no_loc_rel_cnf, VTY_NEWLINE);
Sipos Csaba56e17662015-02-07 13:27:36 +0100693 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 +0100694 /* fall through: Nokia requires "oml e1" parameters also */
Harald Weltefd355a32011-03-04 13:41:31 +0100695 default:
Harald Welte42581822009-08-08 16:12:58 +0200696 config_write_e1_link(vty, &bts->oml_e1_link, " oml ");
697 vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100698 break;
Harald Welte42581822009-08-08 16:12:58 +0200699 }
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +0800700
701 /* if we have a limit, write it */
702 if (bts->paging.free_chans_need >= 0)
703 vty_out(vty, " paging free %d%s", bts->paging.free_chans_need, VTY_NEWLINE);
704
Harald Welte32c09622011-01-11 23:44:56 +0100705 vty_out(vty, " neighbor-list mode %s%s",
Harald Welte64c07d22011-02-15 11:43:27 +0100706 get_value_string(bts_neigh_mode_strs, bts->neigh_list_manual_mode), VTY_NEWLINE);
707 if (bts->neigh_list_manual_mode != NL_MODE_AUTOMATIC) {
Harald Welte32c09622011-01-11 23:44:56 +0100708 for (i = 0; i < 1024; i++) {
709 if (bitvec_get_bit_pos(&bts->si_common.neigh_list, i))
710 vty_out(vty, " neighbor-list add arfcn %u%s",
711 i, VTY_NEWLINE);
712 }
713 }
Harald Welte64c07d22011-02-15 11:43:27 +0100714 if (bts->neigh_list_manual_mode == NL_MODE_MANUAL_SI5SEP) {
715 for (i = 0; i < 1024; i++) {
716 if (bitvec_get_bit_pos(&bts->si_common.si5_neigh_list, i))
717 vty_out(vty, " si5 neighbor-list add arfcn %u%s",
718 i, VTY_NEWLINE);
719 }
720 }
Harald Welte32c09622011-01-11 23:44:56 +0100721
Max59a1bf32016-04-15 16:04:46 +0200722 for (i = 0; i < MAX_EARFCN_LIST; i++) {
723 if (bts->si_common.si2quater_neigh_list.arfcn[i] !=
724 OSMO_EARFCN_INVALID) {
725 vty_out(vty, " si2quater neighbor-list add earfcn %u threshold %u",
726 bts->si_common.si2quater_neigh_list.arfcn[i],
727 bts->si_common.si2quater_neigh_list.thresh_hi);
728 if (bts->si_common.si2quater_neigh_list.meas_bw[i] !=
729 OSMO_EARFCN_MEAS_INVALID)
730 vty_out(vty, " %u",
731 bts->si_common.si2quater_neigh_list.meas_bw[i]);
732
733 vty_out(vty, "%s", VTY_NEWLINE);
734 }
735 }
736
Max26679e02016-04-20 15:57:13 +0200737 for (i = 0; i < bts->si_common.uarfcn_length; i++) {
738 vty_out(vty, " si2quater neighbor-list add uarfcn %u %u %u%s",
739 bts->si_common.data.uarfcn_list[i],
740 bts->si_common.data.scramble_list[i] & ~(1 << 9),
741 (bts->si_common.data.scramble_list[i] >> 9) & 1,
742 VTY_NEWLINE);
743 }
744
Andreas Eversberga83d5112013-12-07 18:32:28 +0100745 vty_out(vty, " codec-support fr");
746 if (bts->codec.hr)
747 vty_out(vty, " hr");
748 if (bts->codec.efr)
749 vty_out(vty, " efr");
750 if (bts->codec.amr)
751 vty_out(vty, " amr");
752 vty_out(vty, "%s", VTY_NEWLINE);
753
Andreas Eversberg73266522014-01-19 11:47:44 +0100754 config_write_bts_amr(vty, bts, &bts->mr_full, 1);
755 config_write_bts_amr(vty, bts, &bts->mr_half, 0);
756
Harald Welte615e9562010-05-11 23:50:21 +0200757 config_write_bts_gprs(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200758
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +0200759 if (bts->excl_from_rf_lock)
760 vty_out(vty, " rf-lock-exclude%s", VTY_NEWLINE);
761
Jacob Erlbeck65d114f2014-01-16 11:02:14 +0100762 vty_out(vty, " %sforce-combined-si%s",
763 bts->force_combined_si ? "" : "no ", VTY_NEWLINE);
764
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +0100765 for (i = 0; i < ARRAY_SIZE(bts->depends_on); ++i) {
766 int j;
767
768 if (bts->depends_on[i] == 0)
769 continue;
770
771 for (j = 0; j < sizeof(bts->depends_on[i]) * 8; ++j) {
772 int bts_nr;
773
774 if ((bts->depends_on[i] & (1<<j)) == 0)
775 continue;
776
777 bts_nr = (i * sizeof(bts->depends_on[i]) * 8) + j;
778 vty_out(vty, " depends-on-bts %d%s", bts_nr, VTY_NEWLINE);
779 }
780 }
781
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200782 config_write_bts_model(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200783}
784
785static int config_write_bts(struct vty *v)
786{
Harald Weltedcccb182010-05-16 20:52:23 +0200787 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte67ce0732009-08-06 19:06:46 +0200788 struct gsm_bts *bts;
789
790 llist_for_each_entry(bts, &gsmnet->bts_list, list)
791 config_write_bts_single(v, bts);
792
793 return CMD_SUCCESS;
794}
795
Harald Welte5013b2a2009-08-07 13:29:14 +0200796static int config_write_net(struct vty *vty)
797{
Harald Weltedcccb182010-05-16 20:52:23 +0200798 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
799
Harald Welte5013b2a2009-08-07 13:29:14 +0200800 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200801 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200802 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200803 vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE);
804 vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE);
Harald Welte (local)69de3972009-08-12 14:42:23 +0200805 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Maxddee01f2016-05-24 14:23:27 +0200806 if (gsmnet->authorized_reg_str)
807 vty_out(vty, " authorized-regexp %s%s", gsmnet->authorized_reg_str, VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100808 vty_out(vty, " location updating reject cause %u%s",
809 gsmnet->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900810 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freytherd54c3372009-11-19 16:37:48 +0100811 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800812 vty_out(vty, " paging any use tch %d%s", gsmnet->pag_any_tch, VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100813 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
814 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100815 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100816 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Welteb720bd32009-12-21 16:51:50 +0100817 vty_out(vty, " handover window rxlev averaging %u%s",
818 gsmnet->handover.win_rxlev_avg, VTY_NEWLINE);
819 vty_out(vty, " handover window rxqual averaging %u%s",
820 gsmnet->handover.win_rxqual_avg, VTY_NEWLINE);
821 vty_out(vty, " handover window rxlev neighbor averaging %u%s",
822 gsmnet->handover.win_rxlev_avg_neigh, VTY_NEWLINE);
823 vty_out(vty, " handover power budget interval %u%s",
824 gsmnet->handover.pwr_interval, VTY_NEWLINE);
825 vty_out(vty, " handover power budget hysteresis %u%s",
826 gsmnet->handover.pwr_hysteresis, VTY_NEWLINE);
827 vty_out(vty, " handover maximum distance %u%s",
828 gsmnet->handover.max_distance, VTY_NEWLINE);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +0100829 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100830 vty_out(vty, " timer t3103 %u%s", gsmnet->T3103, VTY_NEWLINE);
831 vty_out(vty, " timer t3105 %u%s", gsmnet->T3105, VTY_NEWLINE);
832 vty_out(vty, " timer t3107 %u%s", gsmnet->T3107, VTY_NEWLINE);
833 vty_out(vty, " timer t3109 %u%s", gsmnet->T3109, VTY_NEWLINE);
834 vty_out(vty, " timer t3111 %u%s", gsmnet->T3111, VTY_NEWLINE);
835 vty_out(vty, " timer t3113 %u%s", gsmnet->T3113, VTY_NEWLINE);
836 vty_out(vty, " timer t3115 %u%s", gsmnet->T3115, VTY_NEWLINE);
837 vty_out(vty, " timer t3117 %u%s", gsmnet->T3117, VTY_NEWLINE);
838 vty_out(vty, " timer t3119 %u%s", gsmnet->T3119, VTY_NEWLINE);
Harald Welte2862dca2010-12-23 14:39:29 +0100839 vty_out(vty, " timer t3122 %u%s", gsmnet->T3122, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100840 vty_out(vty, " timer t3141 %u%s", gsmnet->T3141, VTY_NEWLINE);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +0100841 vty_out(vty, " subscriber-keep-in-ram %d%s",
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100842 gsmnet->subscr_group->keep_subscr, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200843
844 return CMD_SUCCESS;
845}
Harald Welte67ce0732009-08-06 19:06:46 +0200846
Harald Welte68628e82009-03-10 12:17:57 +0000847static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx)
848{
849 vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
850 trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200851 vty_out(vty, "Description: %s%s",
852 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Weltefcd24452009-06-20 18:15:19 +0200853 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte42581822009-08-08 16:12:58 +0200854 "resulting BS power: %d dBm%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200855 trx->nominal_power, trx->max_power_red,
Harald Welte42581822009-08-08 16:12:58 +0200856 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000857 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200858 net_dump_nmstate(vty, &trx->mo.nm_state);
Harald Welte68628e82009-03-10 12:17:57 +0000859 vty_out(vty, " Baseband Transceiver NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200860 net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);
Harald Welte8175e952009-10-20 00:22:00 +0200861 if (is_ipaccess_bts(trx->bts)) {
862 vty_out(vty, " ip.access stream ID: 0x%02x%s",
863 trx->rsl_tei, VTY_NEWLINE);
864 } else {
865 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
866 e1isl_dump_vty(vty, trx->rsl_link);
867 }
Harald Welte68628e82009-03-10 12:17:57 +0000868}
869
870DEFUN(show_trx,
871 show_trx_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100872 "show trx [<0-255>] [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200873 SHOW_STR "Display information about a TRX\n"
874 "BTS Number\n"
875 "TRX Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000876{
Harald Weltedcccb182010-05-16 20:52:23 +0200877 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000878 struct gsm_bts *bts = NULL;
879 struct gsm_bts_trx *trx;
880 int bts_nr, trx_nr;
881
882 if (argc >= 1) {
883 /* use the BTS number that the user has specified */
884 bts_nr = atoi(argv[0]);
885 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000886 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000887 VTY_NEWLINE);
888 return CMD_WARNING;
889 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200890 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000891 }
892 if (argc >= 2) {
893 trx_nr = atoi(argv[1]);
894 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000895 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000896 VTY_NEWLINE);
897 return CMD_WARNING;
898 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200899 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000900 trx_dump_vty(vty, trx);
901 return CMD_SUCCESS;
902 }
903 if (bts) {
904 /* print all TRX in this BTS */
905 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200906 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000907 trx_dump_vty(vty, trx);
908 }
909 return CMD_SUCCESS;
910 }
911
912 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200913 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000914 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200915 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000916 trx_dump_vty(vty, trx);
917 }
918 }
919
920 return CMD_SUCCESS;
921}
922
Harald Welte67ce0732009-08-06 19:06:46 +0200923
Harald Welte68628e82009-03-10 12:17:57 +0000924static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
925{
Harald Welte135a6482011-05-30 12:09:13 +0200926 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, phys cfg %s, TSC %u",
Harald Welte026b4ca2010-12-24 12:12:10 +0100927 ts->trx->bts->nr, ts->trx->nr, ts->nr,
Harald Welte1fe24122014-01-19 17:18:21 +0100928 gsm_pchan_name(ts->pchan), gsm_ts_tsc(ts));
Harald Weltecd103a92010-12-24 12:14:52 +0100929 if (ts->pchan == GSM_PCHAN_TCH_F_PDCH)
Harald Welteb29cea12010-12-24 12:26:13 +0100930 vty_out(vty, " (%s mode)",
Neels Hofmeyr2ebacce2016-06-14 14:08:35 +0200931 ts->flags & TS_F_PDCH_ACTIVE ? "PDCH" : "TCH/F");
Harald Weltecd103a92010-12-24 12:14:52 +0100932 vty_out(vty, "%s", VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000933 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200934 net_dump_nmstate(vty, &ts->mo.nm_state);
Harald Welte2c828992009-12-02 01:56:49 +0530935 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welteef235b52009-03-10 12:34:02 +0000936 vty_out(vty, " E1 Line %u, Timeslot %u, Subslot %u%s",
937 ts->e1_link.e1_nr, ts->e1_link.e1_ts,
938 ts->e1_link.e1_ts_ss, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000939}
940
941DEFUN(show_ts,
942 show_ts_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100943 "show timeslot [<0-255>] [<0-255>] [<0-7>]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200944 SHOW_STR "Display information about a TS\n"
945 "BTS Number\n" "TRX Number\n" "Timeslot Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000946{
Harald Weltedcccb182010-05-16 20:52:23 +0200947 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte274d0152010-12-24 12:05:03 +0100948 struct gsm_bts *bts = NULL;
949 struct gsm_bts_trx *trx = NULL;
950 struct gsm_bts_trx_ts *ts = NULL;
Harald Welte68628e82009-03-10 12:17:57 +0000951 int bts_nr, trx_nr, ts_nr;
952
953 if (argc >= 1) {
954 /* use the BTS number that the user has specified */
955 bts_nr = atoi(argv[0]);
956 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000957 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000958 VTY_NEWLINE);
959 return CMD_WARNING;
960 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200961 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000962 }
963 if (argc >= 2) {
964 trx_nr = atoi(argv[1]);
965 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000966 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000967 VTY_NEWLINE);
968 return CMD_WARNING;
969 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200970 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000971 }
972 if (argc >= 3) {
973 ts_nr = atoi(argv[2]);
974 if (ts_nr >= TRX_NR_TS) {
Harald Welte1bc77352009-03-10 19:47:51 +0000975 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
Harald Welte68628e82009-03-10 12:17:57 +0000976 VTY_NEWLINE);
977 return CMD_WARNING;
978 }
Harald Welte274d0152010-12-24 12:05:03 +0100979 /* Fully Specified: print and exit */
Harald Welte68628e82009-03-10 12:17:57 +0000980 ts = &trx->ts[ts_nr];
981 ts_dump_vty(vty, ts);
982 return CMD_SUCCESS;
983 }
Harald Welte274d0152010-12-24 12:05:03 +0100984
985 if (bts && trx) {
986 /* Iterate over all TS in this TRX */
987 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
988 ts = &trx->ts[ts_nr];
989 ts_dump_vty(vty, ts);
990 }
991 } else if (bts) {
992 /* Iterate over all TRX in this BTS, TS in each TRX */
Harald Welte68628e82009-03-10 12:17:57 +0000993 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200994 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000995 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
996 ts = &trx->ts[ts_nr];
997 ts_dump_vty(vty, ts);
998 }
999 }
Harald Welte274d0152010-12-24 12:05:03 +01001000 } else {
1001 /* Iterate over all BTS, TRX in each BTS, TS in each TRX */
1002 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
1003 bts = gsm_bts_num(net, bts_nr);
1004 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
1005 trx = gsm_bts_trx_num(bts, trx_nr);
1006 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
1007 ts = &trx->ts[ts_nr];
1008 ts_dump_vty(vty, ts);
1009 }
1010 }
1011 }
Harald Welte68628e82009-03-10 12:17:57 +00001012 }
1013
1014 return CMD_SUCCESS;
1015}
1016
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +01001017static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte68628e82009-03-10 12:17:57 +00001018{
Harald Weltefcd24452009-06-20 18:15:19 +02001019 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte40f82892009-05-23 17:31:39 +00001020 subscr->authorized, VTY_NEWLINE);
Holger Hans Peter Freyther7f180e82013-12-12 15:45:41 +01001021 if (strlen(subscr->name))
Harald Welte1bc77352009-03-10 19:47:51 +00001022 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
Holger Hans Peter Freytherbd30cd32014-04-04 11:53:18 +02001023 if (strlen(subscr->extension))
Harald Welte68628e82009-03-10 12:17:57 +00001024 vty_out(vty, " Extension: %s%s", subscr->extension,
1025 VTY_NEWLINE);
Holger Hans Peter Freyther5ccd0152013-07-14 08:38:24 +02001026 vty_out(vty, " IMSI: %s%s", subscr->imsi, VTY_NEWLINE);
Holger Hans Peter Freyther22230252009-08-19 12:53:57 +02001027 if (subscr->tmsi != GSM_RESERVED_TMSI)
1028 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte731fd912009-08-15 03:24:51 +02001029 VTY_NEWLINE);
Sylvain Munautaf292642009-12-27 19:29:28 +01001030
Harald Welte (local)15920de2009-08-14 20:27:16 +02001031 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +00001032}
1033
Harald Welte8387a492009-12-22 21:43:14 +01001034static void meas_rep_dump_uni_vty(struct vty *vty,
1035 struct gsm_meas_rep_unidir *mru,
1036 const char *prefix,
1037 const char *dir)
1038{
1039 vty_out(vty, "%s RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",
1040 prefix, dir, rxlev2dbm(mru->full.rx_lev),
1041 dir, rxlev2dbm(mru->sub.rx_lev));
1042 vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",
1043 dir, mru->full.rx_qual, dir, mru->sub.rx_qual,
1044 VTY_NEWLINE);
1045}
1046
1047static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,
1048 const char *prefix)
1049{
1050 vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);
1051 vty_out(vty, "%s Flags: %s%s%s%s%s", prefix,
1052 mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",
1053 mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",
1054 mr->flags & MEAS_REP_F_FPC ? "FPC " : "",
1055 mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",
1056 VTY_NEWLINE);
1057 if (mr->flags & MEAS_REP_F_MS_TO)
1058 vty_out(vty, "%s MS Timing Offset: %u%s", prefix,
1059 mr->ms_timing_offset, VTY_NEWLINE);
1060 if (mr->flags & MEAS_REP_F_MS_L1)
1061 vty_out(vty, "%s L1 MS Power: %u dBm, Timing Advance: %u%s",
1062 prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);
1063 if (mr->flags & MEAS_REP_F_DL_VALID)
1064 meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");
1065 meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");
1066}
1067
Harald Welte0a8cf322015-12-05 17:22:49 +01001068/* FIXME: move this to libosmogsm */
1069static const struct value_string gsm48_cmode_names[] = {
1070 { GSM48_CMODE_SIGN, "signalling" },
1071 { GSM48_CMODE_SPEECH_V1, "FR or HR" },
1072 { GSM48_CMODE_SPEECH_EFR, "EFR" },
1073 { GSM48_CMODE_SPEECH_AMR, "AMR" },
1074 { GSM48_CMODE_DATA_14k5, "CSD(14k5)" },
1075 { GSM48_CMODE_DATA_12k0, "CSD(12k0)" },
1076 { GSM48_CMODE_DATA_6k0, "CSD(6k0)" },
1077 { GSM48_CMODE_DATA_3k6, "CSD(3k6)" },
1078 { 0, NULL }
1079};
1080
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001081static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte68628e82009-03-10 12:17:57 +00001082{
Harald Welte8387a492009-12-22 21:43:14 +01001083 int idx;
1084
Harald Welte85bded82010-12-24 12:22:34 +01001085 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",
1086 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
1087 lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);
Holger Hans Peter Freyther454140e2014-12-28 12:08:28 +01001088 vty_out(vty, " Connection: %u, State: %s%s%s%s",
Holger Hans Peter Freyther40494552010-06-28 17:09:29 +08001089 lchan->conn ? 1: 0,
Holger Hans Peter Freyther454140e2014-12-28 12:08:28 +01001090 gsm_lchans_name(lchan->state),
1091 lchan->state == LCHAN_S_BROKEN ? " Error reason: " : "",
1092 lchan->state == LCHAN_S_BROKEN ? lchan->broken_reason : "",
1093 VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +01001094 vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s",
1095 lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
1096 - lchan->bs_power*2,
1097 ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),
1098 VTY_NEWLINE);
Harald Welte0a8cf322015-12-05 17:22:49 +01001099 vty_out(vty, " Channel Mode / Codec: %s%s",
1100 get_value_string(gsm48_cmode_names, lchan->tch_mode),
1101 VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +08001102 if (lchan->conn && lchan->conn->subscr) {
Harald Welte68628e82009-03-10 12:17:57 +00001103 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +08001104 subscr_dump_vty(vty, lchan->conn->subscr);
Harald Welte68628e82009-03-10 12:17:57 +00001105 } else
1106 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte2c828992009-12-02 01:56:49 +05301107 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
1108 struct in_addr ia;
Holger Hans Peter Freyther54fa7992010-04-07 15:39:16 +02001109 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte2c828992009-12-02 01:56:49 +05301110 vty_out(vty, " Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",
1111 inet_ntoa(ia), lchan->abis_ip.bound_port,
1112 lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,
1113 VTY_NEWLINE);
1114 }
Harald Welte8387a492009-12-22 21:43:14 +01001115
1116 /* we want to report the last measurement report */
1117 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1118 lchan->meas_rep_idx, 1);
1119 meas_rep_dump_vty(vty, &lchan->meas_rep[idx], " ");
Harald Welte68628e82009-03-10 12:17:57 +00001120}
1121
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001122static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
1123{
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +08001124 struct gsm_meas_rep *mr;
1125 int idx;
1126
1127 /* we want to report the last measurement report */
1128 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1129 lchan->meas_rep_idx, 1);
1130 mr = &lchan->meas_rep[idx];
1131
Neels Hofmeyrefedf802016-06-14 01:31:38 +02001132 vty_out(vty, "BTS %u, TRX %u, Timeslot %u %s, Lchan %u, Type %s, State %s - "
Harald Welte85bded82010-12-24 12:22:34 +01001133 "L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
1134 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
Neels Hofmeyrefedf802016-06-14 01:31:38 +02001135 gsm_pchan_name(lchan->ts->pchan),
1136 lchan->nr,
1137 gsm_lchant_name(lchan->type), gsm_lchans_name(lchan->state),
1138 mr->ms_l1.pwr,
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +08001139 rxlev2dbm(mr->dl.full.rx_lev),
1140 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001141 VTY_NEWLINE);
1142}
1143
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001144
1145static int dump_lchan_trx_ts(struct gsm_bts_trx_ts *ts, struct vty *vty,
1146 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1147{
1148 int lchan_nr;
1149 for (lchan_nr = 0; lchan_nr < TS_MAX_LCHAN; lchan_nr++) {
1150 struct gsm_lchan *lchan = &ts->lchan[lchan_nr];
1151 if ((lchan->type == GSM_LCHAN_NONE) && (lchan->state == LCHAN_S_NONE))
1152 continue;
1153 dump_cb(vty, lchan);
1154 }
1155
1156 return CMD_SUCCESS;
1157}
1158
1159static int dump_lchan_trx(struct gsm_bts_trx *trx, struct vty *vty,
1160 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1161{
1162 int ts_nr;
1163
1164 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
1165 struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
1166 dump_lchan_trx_ts(ts, vty, dump_cb);
1167 }
1168
1169 return CMD_SUCCESS;
1170}
1171
1172static int dump_lchan_bts(struct gsm_bts *bts, struct vty *vty,
1173 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1174{
1175 int trx_nr;
1176
1177 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
1178 struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, trx_nr);
1179 dump_lchan_trx(trx, vty, dump_cb);
1180 }
1181
1182 return CMD_SUCCESS;
1183}
1184
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001185static int lchan_summary(struct vty *vty, int argc, const char **argv,
1186 void (*dump_cb)(struct vty *, struct gsm_lchan *))
Harald Welte68628e82009-03-10 12:17:57 +00001187{
Harald Weltedcccb182010-05-16 20:52:23 +02001188 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +00001189 struct gsm_bts *bts;
1190 struct gsm_bts_trx *trx;
1191 struct gsm_bts_trx_ts *ts;
1192 struct gsm_lchan *lchan;
1193 int bts_nr, trx_nr, ts_nr, lchan_nr;
1194
1195 if (argc >= 1) {
1196 /* use the BTS number that the user has specified */
1197 bts_nr = atoi(argv[0]);
1198 if (bts_nr >= net->num_bts) {
1199 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1200 VTY_NEWLINE);
1201 return CMD_WARNING;
1202 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001203 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001204
1205 if (argc == 1)
1206 return dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001207 }
1208 if (argc >= 2) {
1209 trx_nr = atoi(argv[1]);
1210 if (trx_nr >= bts->num_trx) {
1211 vty_out(vty, "%% can't find TRX %s%s", argv[1],
1212 VTY_NEWLINE);
1213 return CMD_WARNING;
1214 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001215 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001216
1217 if (argc == 2)
1218 return dump_lchan_trx(trx, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001219 }
1220 if (argc >= 3) {
1221 ts_nr = atoi(argv[2]);
1222 if (ts_nr >= TRX_NR_TS) {
1223 vty_out(vty, "%% can't find TS %s%s", argv[2],
1224 VTY_NEWLINE);
1225 return CMD_WARNING;
1226 }
1227 ts = &trx->ts[ts_nr];
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001228
1229 if (argc == 3)
1230 return dump_lchan_trx_ts(ts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001231 }
1232 if (argc >= 4) {
1233 lchan_nr = atoi(argv[3]);
1234 if (lchan_nr >= TS_MAX_LCHAN) {
1235 vty_out(vty, "%% can't find LCHAN %s%s", argv[3],
1236 VTY_NEWLINE);
1237 return CMD_WARNING;
1238 }
1239 lchan = &ts->lchan[lchan_nr];
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001240 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +00001241 return CMD_SUCCESS;
1242 }
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001243
1244
Harald Welte68628e82009-03-10 12:17:57 +00001245 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001246 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001247 dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001248 }
1249
1250 return CMD_SUCCESS;
1251}
1252
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001253
1254DEFUN(show_lchan,
1255 show_lchan_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001256 "show lchan [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001257 SHOW_STR "Display information about a logical channel\n"
1258 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001259 LCHAN_NR_STR)
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001260
1261{
1262 return lchan_summary(vty, argc, argv, lchan_dump_full_vty);
1263}
1264
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001265DEFUN(show_lchan_summary,
1266 show_lchan_summary_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001267 "show lchan summary [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001268 SHOW_STR "Display information about a logical channel\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001269 "Short summary\n"
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001270 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001271 LCHAN_NR_STR)
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001272{
1273 return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
1274}
1275
Harald Weltebe4b7302009-05-23 16:59:33 +00001276static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
Harald Weltef5025b62009-03-28 16:55:11 +00001277{
1278 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
1279 subscr_dump_vty(vty, pag->subscr);
1280}
1281
Harald Weltebe4b7302009-05-23 16:59:33 +00001282static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
Harald Weltef5025b62009-03-28 16:55:11 +00001283{
1284 struct gsm_paging_request *pag;
1285
Holger Hans Peter Freyther9b5192b2013-03-03 11:03:17 +01001286 if (!bts->paging.bts)
1287 return;
1288
Harald Weltef5025b62009-03-28 16:55:11 +00001289 llist_for_each_entry(pag, &bts->paging.pending_requests, entry)
1290 paging_dump_vty(vty, pag);
1291}
1292
1293DEFUN(show_paging,
1294 show_paging_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001295 "show paging [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +02001296 SHOW_STR "Display information about paging reuqests of a BTS\n"
1297 "BTS Number\n")
Harald Weltef5025b62009-03-28 16:55:11 +00001298{
Harald Weltedcccb182010-05-16 20:52:23 +02001299 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Weltef5025b62009-03-28 16:55:11 +00001300 struct gsm_bts *bts;
1301 int bts_nr;
1302
1303 if (argc >= 1) {
1304 /* use the BTS number that the user has specified */
1305 bts_nr = atoi(argv[0]);
1306 if (bts_nr >= net->num_bts) {
1307 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1308 VTY_NEWLINE);
1309 return CMD_WARNING;
1310 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001311 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001312 bts_paging_dump_vty(vty, bts);
1313
1314 return CMD_SUCCESS;
1315 }
1316 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001317 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001318 bts_paging_dump_vty(vty, bts);
1319 }
1320
1321 return CMD_SUCCESS;
1322}
1323
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01001324DEFUN(show_paging_group,
1325 show_paging_group_cmd,
1326 "show paging-group <0-255> IMSI",
1327 SHOW_STR "Display the paging group\n"
1328 "BTS Number\n" "IMSI\n")
1329{
1330 struct gsm_network *net = gsmnet_from_vty(vty);
1331 struct gsm_bts *bts;
1332 unsigned int page_group;
1333 int bts_nr = atoi(argv[0]);
1334
1335 if (bts_nr >= net->num_bts) {
1336 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1337 return CMD_WARNING;
1338 }
1339
1340 bts = gsm_bts_num(net, bts_nr);
1341 if (!bts) {
1342 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1343 return CMD_WARNING;
1344 }
1345
1346 page_group = gsm0502_calc_paging_group(&bts->si_common.chan_desc,
1347 str_to_imsi(argv[1]));
1348 vty_out(vty, "%%Paging group for IMSI %" PRIu64 " on BTS #%d is %u%s",
1349 str_to_imsi(argv[1]), bts->nr,
1350 page_group, VTY_NEWLINE);
1351 return CMD_SUCCESS;
1352}
1353
Harald Welte5013b2a2009-08-07 13:29:14 +02001354DEFUN(cfg_net,
1355 cfg_net_cmd,
Harald Welte8f0ed552010-05-11 21:53:49 +02001356 "network", NETWORK_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001357{
Harald Weltedcccb182010-05-16 20:52:23 +02001358 vty->index = gsmnet_from_vty(vty);
Harald Welte5013b2a2009-08-07 13:29:14 +02001359 vty->node = GSMNET_NODE;
1360
1361 return CMD_SUCCESS;
1362}
1363
Harald Welte5013b2a2009-08-07 13:29:14 +02001364DEFUN(cfg_net_ncc,
1365 cfg_net_ncc_cmd,
1366 "network country code <1-999>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001367 "Set the GSM network country code\n"
1368 "Country commands\n"
1369 CODE_CMD_STR
1370 "Network Country Code to use\n")
Harald Welte5013b2a2009-08-07 13:29:14 +02001371{
Harald Weltedcccb182010-05-16 20:52:23 +02001372 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1373
Harald Welte5013b2a2009-08-07 13:29:14 +02001374 gsmnet->country_code = atoi(argv[0]);
1375
1376 return CMD_SUCCESS;
1377}
1378
1379DEFUN(cfg_net_mnc,
1380 cfg_net_mnc_cmd,
Dieter Spaar402cced2011-07-27 23:43:56 +02001381 "mobile network code <0-999>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001382 "Set the GSM mobile network code\n"
1383 "Network Commands\n"
1384 CODE_CMD_STR
1385 "Mobile Network Code to use\n")
Harald Welte5013b2a2009-08-07 13:29:14 +02001386{
Harald Weltedcccb182010-05-16 20:52:23 +02001387 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1388
Harald Welte5013b2a2009-08-07 13:29:14 +02001389 gsmnet->network_code = atoi(argv[0]);
1390
1391 return CMD_SUCCESS;
1392}
1393
1394DEFUN(cfg_net_name_short,
1395 cfg_net_name_short_cmd,
1396 "short name NAME",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001397 "Set the short GSM network name\n" NAME_CMD_STR NAME_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001398{
Harald Weltedcccb182010-05-16 20:52:23 +02001399 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1400
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +02001401 bsc_replace_string(gsmnet, &gsmnet->name_short, argv[0]);
Harald Welte5013b2a2009-08-07 13:29:14 +02001402 return CMD_SUCCESS;
1403}
1404
1405DEFUN(cfg_net_name_long,
1406 cfg_net_name_long_cmd,
1407 "long name NAME",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001408 "Set the long GSM network name\n" NAME_CMD_STR NAME_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001409{
Harald Weltedcccb182010-05-16 20:52:23 +02001410 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1411
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +02001412 bsc_replace_string(gsmnet, &gsmnet->name_long, argv[0]);
Harald Welte5013b2a2009-08-07 13:29:14 +02001413 return CMD_SUCCESS;
1414}
Harald Welte40f82892009-05-23 17:31:39 +00001415
Harald Welte (local)69de3972009-08-12 14:42:23 +02001416DEFUN(cfg_net_auth_policy,
1417 cfg_net_auth_policy_cmd,
Maxddee01f2016-05-24 14:23:27 +02001418 "auth policy (closed|accept-all|regexp|token)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001419 "Authentication (not cryptographic)\n"
1420 "Set the GSM network authentication policy\n"
1421 "Require the MS to be activated in HLR\n"
1422 "Accept all MS, whether in HLR or not\n"
Maxddee01f2016-05-24 14:23:27 +02001423 "Use regular expression for IMSI authorization decision\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001424 "Use SMS-token based authentication\n")
Harald Welte (local)69de3972009-08-12 14:42:23 +02001425{
1426 enum gsm_auth_policy policy = gsm_auth_policy_parse(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001427 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte (local)69de3972009-08-12 14:42:23 +02001428
1429 gsmnet->auth_policy = policy;
1430
1431 return CMD_SUCCESS;
1432}
1433
Maxddee01f2016-05-24 14:23:27 +02001434DEFUN(cfg_net_authorize_regexp, cfg_net_authorize_regexp_cmd,
1435 "authorized-regexp REGEXP",
1436 "Set regexp for IMSI which will be used for authorization decision\n"
1437 "Regular expression, IMSIs matching it are allowed to use the network\n")
1438{
1439 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1440 if (gsm_parse_reg(gsmnet, &gsmnet->authorized_regexp,
1441 &gsmnet->authorized_reg_str, argc, argv) != 0) {
1442 vty_out(vty, "%%Failed to parse the authorized-regexp: '%s'%s",
1443 argv[0], VTY_NEWLINE);
1444 return CMD_WARNING;
1445 }
1446
1447 return CMD_SUCCESS;
1448}
1449
Harald Welte1085c092009-11-18 20:33:19 +01001450DEFUN(cfg_net_reject_cause,
1451 cfg_net_reject_cause_cmd,
1452 "location updating reject cause <2-111>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001453 "Set the reject cause of location updating reject\n"
1454 "Set the reject cause of location updating reject\n"
1455 "Set the reject cause of location updating reject\n"
1456 "Set the reject cause of location updating reject\n"
1457 "Cause Value as Per GSM TS 04.08\n")
Harald Welte1085c092009-11-18 20:33:19 +01001458{
Harald Weltedcccb182010-05-16 20:52:23 +02001459 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1460
Harald Welte1085c092009-11-18 20:33:19 +01001461 gsmnet->reject_cause = atoi(argv[0]);
1462
1463 return CMD_SUCCESS;
1464}
1465
Harald Welte4381cfe2009-08-30 15:47:06 +09001466DEFUN(cfg_net_encryption,
1467 cfg_net_encryption_cmd,
Harald Weltead66a2d2012-07-04 21:37:56 +02001468 "encryption a5 (0|1|2|3)",
Harald Welte28326062010-05-14 20:05:17 +02001469 "Encryption options\n"
1470 "A5 encryption\n" "A5/0: No encryption\n"
Harald Weltead66a2d2012-07-04 21:37:56 +02001471 "A5/1: Encryption\n" "A5/2: Export-grade Encryption\n"
1472 "A5/3: 'New' Secure Encryption\n")
Harald Welte4381cfe2009-08-30 15:47:06 +09001473{
Harald Weltedcccb182010-05-16 20:52:23 +02001474 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1475
Andreas.Eversberg1059deb2009-11-17 09:55:26 +01001476 gsmnet->a5_encryption= atoi(argv[0]);
Harald Welte4381cfe2009-08-30 15:47:06 +09001477
1478 return CMD_SUCCESS;
1479}
1480
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001481DEFUN(cfg_net_neci,
1482 cfg_net_neci_cmd,
1483 "neci (0|1)",
Harald Welte28326062010-05-14 20:05:17 +02001484 "New Establish Cause Indication\n"
1485 "Don't set the NECI bit\n" "Set the NECI bit\n")
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001486{
Harald Weltedcccb182010-05-16 20:52:23 +02001487 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1488
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001489 gsmnet->neci = atoi(argv[0]);
Holger Hans Peter Freyther78891072010-09-06 09:36:02 +08001490 gsm_net_update_ctype(gsmnet);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001491 return CMD_SUCCESS;
1492}
1493
Harald Welteeab84a12009-12-13 10:53:12 +01001494DEFUN(cfg_net_rrlp_mode, cfg_net_rrlp_mode_cmd,
1495 "rrlp mode (none|ms-based|ms-preferred|ass-preferred)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001496 "Radio Resource Location Protocol\n"
1497 "Set the Radio Resource Location Protocol Mode\n"
1498 "Don't send RRLP request\n"
1499 "Request MS-based location\n"
1500 "Request any location, prefer MS-based\n"
1501 "Request any location, prefer MS-assisted\n")
Harald Welteeab84a12009-12-13 10:53:12 +01001502{
Harald Weltedcccb182010-05-16 20:52:23 +02001503 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1504
Harald Welteeab84a12009-12-13 10:53:12 +01001505 gsmnet->rrlp.mode = rrlp_mode_parse(argv[0]);
1506
1507 return CMD_SUCCESS;
1508}
1509
Harald Welte648b6ce2009-12-14 09:00:24 +01001510DEFUN(cfg_net_mm_info, cfg_net_mm_info_cmd,
1511 "mm info (0|1)",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001512 "Mobility Management\n"
1513 "Send MM INFO after LOC UPD ACCEPT\n"
1514 "Disable\n" "Enable\n")
Harald Welte648b6ce2009-12-14 09:00:24 +01001515{
Harald Weltedcccb182010-05-16 20:52:23 +02001516 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1517
Harald Welte648b6ce2009-12-14 09:00:24 +01001518 gsmnet->send_mm_info = atoi(argv[0]);
1519
1520 return CMD_SUCCESS;
1521}
1522
Harald Welte8f0ed552010-05-11 21:53:49 +02001523#define HANDOVER_STR "Handover Options\n"
1524
Harald Weltebc814502009-12-19 21:41:52 +01001525DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1526 "handover (0|1)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001527 HANDOVER_STR
1528 "Don't perform in-call handover\n"
1529 "Perform in-call handover\n")
Harald Weltebc814502009-12-19 21:41:52 +01001530{
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001531 int enable = atoi(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001532 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001533
1534 if (enable && ipacc_rtp_direct) {
Harald Weltefe03f0d2009-12-20 13:51:01 +01001535 vty_out(vty, "%% Cannot enable handover unless RTP Proxy mode "
1536 "is enabled by using the -P command line option%s",
1537 VTY_NEWLINE);
1538 return CMD_WARNING;
1539 }
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001540 gsmnet->handover.active = enable;
Harald Weltebc814502009-12-19 21:41:52 +01001541
1542 return CMD_SUCCESS;
1543}
1544
Harald Welte8f0ed552010-05-11 21:53:49 +02001545#define HO_WIN_STR HANDOVER_STR "Measurement Window\n"
1546#define HO_WIN_RXLEV_STR HO_WIN_STR "Received Level Averaging\n"
1547#define HO_WIN_RXQUAL_STR HO_WIN_STR "Received Quality Averaging\n"
1548#define HO_PBUDGET_STR HANDOVER_STR "Power Budget\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001549#define HO_AVG_COUNT_STR "Amount to use for Averaging\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001550
Harald Welteb720bd32009-12-21 16:51:50 +01001551DEFUN(cfg_net_ho_win_rxlev_avg, cfg_net_ho_win_rxlev_avg_cmd,
1552 "handover window rxlev averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001553 HO_WIN_RXLEV_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001554 "How many RxLev measurements are used for averaging\n"
1555 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001556{
Harald Weltedcccb182010-05-16 20:52:23 +02001557 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001558 gsmnet->handover.win_rxlev_avg = atoi(argv[0]);
1559 return CMD_SUCCESS;
1560}
1561
1562DEFUN(cfg_net_ho_win_rxqual_avg, cfg_net_ho_win_rxqual_avg_cmd,
1563 "handover window rxqual averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001564 HO_WIN_RXQUAL_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001565 "How many RxQual measurements are used for averaging\n"
1566 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001567{
Harald Weltedcccb182010-05-16 20:52:23 +02001568 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001569 gsmnet->handover.win_rxqual_avg = atoi(argv[0]);
1570 return CMD_SUCCESS;
1571}
1572
1573DEFUN(cfg_net_ho_win_rxlev_neigh_avg, cfg_net_ho_win_rxlev_avg_neigh_cmd,
1574 "handover window rxlev neighbor averaging <1-10>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001575 HO_WIN_RXLEV_STR "Neighbor\n"
1576 "How many RxQual measurements are used for averaging\n"
1577 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001578{
Harald Weltedcccb182010-05-16 20:52:23 +02001579 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001580 gsmnet->handover.win_rxlev_avg_neigh = atoi(argv[0]);
1581 return CMD_SUCCESS;
1582}
1583
1584DEFUN(cfg_net_ho_pwr_interval, cfg_net_ho_pwr_interval_cmd,
1585 "handover power budget interval <1-99>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001586 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001587 "How often to check if we have a better cell (SACCH frames)\n"
1588 "Interval\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001589{
Harald Weltedcccb182010-05-16 20:52:23 +02001590 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001591 gsmnet->handover.pwr_interval = atoi(argv[0]);
1592 return CMD_SUCCESS;
1593}
1594
1595DEFUN(cfg_net_ho_pwr_hysteresis, cfg_net_ho_pwr_hysteresis_cmd,
1596 "handover power budget hysteresis <0-999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001597 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001598 "How many dB does a neighbor to be stronger to become a HO candidate\n"
1599 "Hysteresis\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001600{
Harald Weltedcccb182010-05-16 20:52:23 +02001601 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001602 gsmnet->handover.pwr_hysteresis = atoi(argv[0]);
1603 return CMD_SUCCESS;
1604}
1605
1606DEFUN(cfg_net_ho_max_distance, cfg_net_ho_max_distance_cmd,
1607 "handover maximum distance <0-9999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001608 HANDOVER_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001609 "How big is the maximum timing advance before HO is forced\n"
1610 "Distance\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001611{
Harald Weltedcccb182010-05-16 20:52:23 +02001612 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001613 gsmnet->handover.max_distance = atoi(argv[0]);
1614 return CMD_SUCCESS;
1615}
Harald Weltebc814502009-12-19 21:41:52 +01001616
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001617DEFUN(cfg_net_pag_any_tch,
1618 cfg_net_pag_any_tch_cmd,
1619 "paging any use tch (0|1)",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001620 "Assign a TCH when receiving a Paging Any request\n"
1621 "Any Channel\n" "Use\n" "TCH\n"
1622 "Do not use TCH for Paging Request Any\n"
1623 "Do use TCH for Paging Request Any\n")
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001624{
Holger Hans Peter Freytherb0e88b82010-09-06 10:09:19 +08001625 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001626 gsmnet->pag_any_tch = atoi(argv[0]);
1627 gsm_net_update_ctype(gsmnet);
1628 return CMD_SUCCESS;
1629}
1630
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001631#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001632 DEFUN(cfg_net_T##number, \
1633 cfg_net_T##number##_cmd, \
1634 "timer t" #number " <0-65535>", \
Harald Welte8f0ed552010-05-11 21:53:49 +02001635 "Configure GSM Timers\n" \
Holger Hans Peter Freyther5dd295f2014-04-11 19:30:27 +02001636 doc "Timer Value in seconds\n") \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001637{ \
Harald Weltedcccb182010-05-16 20:52:23 +02001638 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001639 int value = atoi(argv[0]); \
1640 \
1641 if (value < 0 || value > 65535) { \
1642 vty_out(vty, "Timer value %s out of range.%s", \
1643 argv[0], VTY_NEWLINE); \
1644 return CMD_WARNING; \
1645 } \
1646 \
1647 gsmnet->T##number = value; \
1648 return CMD_SUCCESS; \
1649}
1650
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001651DECLARE_TIMER(3101, "Set the timeout value for IMMEDIATE ASSIGNMENT.\n")
1652DECLARE_TIMER(3103, "Set the timeout value for HANDOVER.\n")
Harald Welte67161f22012-06-03 13:01:47 +02001653DECLARE_TIMER(3105, "Set the timer for repetition of PHYSICAL INFORMATION.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001654DECLARE_TIMER(3107, "Currently not used.\n")
Holger Hans Peter Freytherb3489392011-12-28 16:21:05 +01001655DECLARE_TIMER(3109, "Set the RSL SACCH deactivation timeout.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001656DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.\n")
1657DECLARE_TIMER(3113, "Set the time to try paging a subscriber.\n")
1658DECLARE_TIMER(3115, "Currently not used.\n")
1659DECLARE_TIMER(3117, "Currently not used.\n")
1660DECLARE_TIMER(3119, "Currently not used.\n")
1661DECLARE_TIMER(3122, "Waiting time (seconds) after IMM ASS REJECT\n")
1662DECLARE_TIMER(3141, "Currently not used.\n")
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001663
Maxc08ee712016-05-11 12:45:13 +02001664DEFUN_DEPRECATED(cfg_net_dtx,
1665 cfg_net_dtx_cmd,
1666 "dtx-used (0|1)",
1667 ".HIDDEN\n""Obsolete\n""Obsolete\n")
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001668{
Maxc08ee712016-05-11 12:45:13 +02001669 vty_out(vty, "%% 'dtx-used' is now deprecated: use dtx * "
1670 "configuration options of BTS instead%s", VTY_NEWLINE);
1671 return CMD_SUCCESS;
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001672}
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001673
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +01001674DEFUN(cfg_net_subscr_keep,
1675 cfg_net_subscr_keep_cmd,
1676 "subscriber-keep-in-ram (0|1)",
1677 "Keep unused subscribers in RAM.\n"
1678 "Delete unused subscribers\n" "Keep unused subscribers\n")
1679{
1680 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Jacob Erlbeck1e30a282014-12-03 09:28:24 +01001681 gsmnet->subscr_group->keep_subscr = atoi(argv[0]);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +01001682 return CMD_SUCCESS;
1683}
1684
Harald Welte5258fc42009-03-28 19:07:53 +00001685/* per-BTS configuration */
1686DEFUN(cfg_bts,
1687 cfg_bts_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02001688 "bts <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001689 "Select a BTS to configure\n"
1690 "BTS Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001691{
Harald Weltedcccb182010-05-16 20:52:23 +02001692 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte5258fc42009-03-28 19:07:53 +00001693 int bts_nr = atoi(argv[0]);
1694 struct gsm_bts *bts;
1695
Harald Weltee441d9c2009-06-21 16:17:15 +02001696 if (bts_nr > gsmnet->num_bts) {
1697 vty_out(vty, "%% The next unused BTS number is %u%s",
1698 gsmnet->num_bts, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00001699 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02001700 } else if (bts_nr == gsmnet->num_bts) {
1701 /* allocate a new one */
Harald Welte3300c012011-06-05 13:31:33 +02001702 bts = gsm_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,
Harald Weltea2bbc5e2015-11-20 10:43:31 +01001703 HARDCODED_BSIC);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02001704 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02001705 bts = gsm_bts_num(gsmnet, bts_nr);
1706
Daniel Willmannf15c2762010-01-11 13:43:07 +01001707 if (!bts) {
1708 vty_out(vty, "%% Unable to allocate BTS %u%s",
1709 gsmnet->num_bts, VTY_NEWLINE);
Harald Weltee441d9c2009-06-21 16:17:15 +02001710 return CMD_WARNING;
Daniel Willmannf15c2762010-01-11 13:43:07 +01001711 }
Harald Welte5258fc42009-03-28 19:07:53 +00001712
1713 vty->index = bts;
Harald Welte197dea92010-05-14 17:59:53 +02001714 vty->index_sub = &bts->description;
Harald Welte5258fc42009-03-28 19:07:53 +00001715 vty->node = BTS_NODE;
1716
1717 return CMD_SUCCESS;
1718}
1719
1720DEFUN(cfg_bts_type,
1721 cfg_bts_type_cmd,
Harald Weltee555c2b2012-08-17 13:02:12 +02001722 "type TYPE", /* dynamically created */
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001723 "Set the BTS type\n" "Type\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001724{
1725 struct gsm_bts *bts = vty->index;
Harald Welte39315c42010-01-10 18:01:52 +01001726 int rc;
Harald Welte5258fc42009-03-28 19:07:53 +00001727
Harald Welte39315c42010-01-10 18:01:52 +01001728 rc = gsm_set_bts_type(bts, parse_btstype(argv[0]));
1729 if (rc < 0)
1730 return CMD_WARNING;
Harald Welte8175e952009-10-20 00:22:00 +02001731
Harald Welte5258fc42009-03-28 19:07:53 +00001732 return CMD_SUCCESS;
1733}
1734
Harald Weltefcd24452009-06-20 18:15:19 +02001735DEFUN(cfg_bts_band,
1736 cfg_bts_band_cmd,
1737 "band BAND",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001738 "Set the frequency band of this BTS\n" "Frequency band\n")
Harald Weltefcd24452009-06-20 18:15:19 +02001739{
1740 struct gsm_bts *bts = vty->index;
Harald Welte42581822009-08-08 16:12:58 +02001741 int band = gsm_band_parse(argv[0]);
Harald Weltefcd24452009-06-20 18:15:19 +02001742
1743 if (band < 0) {
1744 vty_out(vty, "%% BAND %d is not a valid GSM band%s",
1745 band, VTY_NEWLINE);
1746 return CMD_WARNING;
1747 }
1748
1749 bts->band = band;
1750
1751 return CMD_SUCCESS;
1752}
1753
Maxc08ee712016-05-11 12:45:13 +02001754DEFUN(cfg_bts_dtxu, cfg_bts_dtxu_cmd, "dtx uplink [force]",
1755 "Configure discontinuous transmission\n"
1756 "Enable Uplink DTX for this BTS\n"
1757 "MS 'shall' use DTXu instead of 'may' use (might not be supported by "
1758 "older phones).\n")
1759{
1760 struct gsm_bts *bts = vty->index;
1761
1762 bts->dtxu = (argc > 0) ? GSM48_DTX_SHALL_BE_USED : GSM48_DTX_MAY_BE_USED;
Max60795282016-06-06 11:30:57 +02001763 if (!is_ipaccess_bts(bts))
1764 vty_out(vty, "%% DTX enabled on non-IP BTS: this configuration "
1765 "neither supported nor tested!%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +02001766 return CMD_SUCCESS;
1767}
1768
1769DEFUN(cfg_bts_no_dtxu, cfg_bts_no_dtxu_cmd, "no dtx uplink",
1770 NO_STR
1771 "Configure discontinuous transmission\n"
1772 "Disable Uplink DTX for this BTS\n")
1773{
1774 struct gsm_bts *bts = vty->index;
1775
1776 bts->dtxu = GSM48_DTX_SHALL_NOT_BE_USED;
1777
1778 return CMD_SUCCESS;
1779}
1780
1781DEFUN(cfg_bts_dtxd, cfg_bts_dtxd_cmd, "dtx downlink",
1782 "Configure discontinuous transmission\n"
1783 "Enable Downlink DTX for this BTS\n")
1784{
1785 struct gsm_bts *bts = vty->index;
1786
1787 bts->dtxd = true;
Max60795282016-06-06 11:30:57 +02001788 if (!is_ipaccess_bts(bts))
1789 vty_out(vty, "%% DTX enabled on non-IP BTS: this configuration "
1790 "neither supported nor tested!%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +02001791 return CMD_SUCCESS;
1792}
1793
1794DEFUN(cfg_bts_no_dtxd, cfg_bts_no_dtxd_cmd, "no dtx downlink",
1795 NO_STR
1796 "Configure discontinuous transmission\n"
1797 "Disable Downlink DTX for this BTS\n")
1798{
1799 struct gsm_bts *bts = vty->index;
1800
1801 bts->dtxd = false;
1802
1803 return CMD_SUCCESS;
1804}
1805
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001806DEFUN(cfg_bts_ci,
1807 cfg_bts_ci_cmd,
1808 "cell_identity <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001809 "Set the Cell identity of this BTS\n" "Cell Identity\n")
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001810{
1811 struct gsm_bts *bts = vty->index;
1812 int ci = atoi(argv[0]);
1813
1814 if (ci < 0 || ci > 0xffff) {
1815 vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s",
1816 ci, VTY_NEWLINE);
1817 return CMD_WARNING;
1818 }
1819 bts->cell_identity = ci;
1820
1821 return CMD_SUCCESS;
1822}
1823
Harald Welte5258fc42009-03-28 19:07:53 +00001824DEFUN(cfg_bts_lac,
1825 cfg_bts_lac_cmd,
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001826 "location_area_code <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001827 "Set the Location Area Code (LAC) of this BTS\n" "LAC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001828{
1829 struct gsm_bts *bts = vty->index;
1830 int lac = atoi(argv[0]);
1831
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001832 if (lac < 0 || lac > 0xffff) {
1833 vty_out(vty, "%% LAC %d is not in the valid range (0-65535)%s",
Harald Welte5258fc42009-03-28 19:07:53 +00001834 lac, VTY_NEWLINE);
1835 return CMD_WARNING;
1836 }
Holger Hans Peter Freythere48b9562009-10-01 04:07:15 +02001837
1838 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
1839 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
1840 lac, VTY_NEWLINE);
1841 return CMD_WARNING;
1842 }
1843
Harald Welte5258fc42009-03-28 19:07:53 +00001844 bts->location_area_code = lac;
1845
1846 return CMD_SUCCESS;
1847}
1848
Harald Weltea43f7892009-12-01 18:04:30 +05301849
Harald Weltea2bbc5e2015-11-20 10:43:31 +01001850/* compatibility wrapper for old config files */
1851DEFUN_HIDDEN(cfg_bts_tsc,
Harald Welte5258fc42009-03-28 19:07:53 +00001852 cfg_bts_tsc_cmd,
Harald Weltec513ded2012-05-31 10:57:08 +02001853 "training_sequence_code <0-7>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001854 "Set the Training Sequence Code (TSC) of this BTS\n" "TSC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001855{
Harald Welte5258fc42009-03-28 19:07:53 +00001856 return CMD_SUCCESS;
1857}
1858
Harald Welte78f2f502009-05-23 16:56:52 +00001859DEFUN(cfg_bts_bsic,
1860 cfg_bts_bsic_cmd,
1861 "base_station_id_code <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001862 "Set the Base Station Identity Code (BSIC) of this BTS\n"
1863 "BSIC of this BTS\n")
Harald Welte78f2f502009-05-23 16:56:52 +00001864{
1865 struct gsm_bts *bts = vty->index;
1866 int bsic = atoi(argv[0]);
1867
1868 if (bsic < 0 || bsic > 0x3f) {
Harald Welte42581822009-08-08 16:12:58 +02001869 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte78f2f502009-05-23 16:56:52 +00001870 bsic, VTY_NEWLINE);
1871 return CMD_WARNING;
1872 }
1873 bts->bsic = bsic;
1874
1875 return CMD_SUCCESS;
1876}
1877
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001878DEFUN(cfg_bts_timezone,
1879 cfg_bts_timezone_cmd,
1880 "timezone <-19-19> (0|15|30|45)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001881 "Set the Timezone Offset of this BTS\n"
1882 "Timezone offset (hours)\n"
1883 "Timezone offset (00 minutes)\n"
1884 "Timezone offset (15 minutes)\n"
1885 "Timezone offset (30 minutes)\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02001886 "Timezone offset (45 minutes)\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001887 )
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001888{
1889 struct gsm_bts *bts = vty->index;
1890 int tzhr = atoi(argv[0]);
1891 int tzmn = atoi(argv[1]);
1892
Harald Welte45f91712012-07-08 16:48:11 +02001893 bts->tz.hr = tzhr;
1894 bts->tz.mn = tzmn;
Jacob Erlbeck946d1412013-09-17 13:59:29 +02001895 bts->tz.dst = 0;
1896 bts->tz.override = 1;
1897
1898 return CMD_SUCCESS;
1899}
1900
1901DEFUN(cfg_bts_timezone_dst,
1902 cfg_bts_timezone_dst_cmd,
1903 "timezone <-19-19> (0|15|30|45) <0-2>",
1904 "Set the Timezone Offset of this BTS\n"
1905 "Timezone offset (hours)\n"
1906 "Timezone offset (00 minutes)\n"
1907 "Timezone offset (15 minutes)\n"
1908 "Timezone offset (30 minutes)\n"
1909 "Timezone offset (45 minutes)\n"
1910 "DST offset (hours)\n"
1911 )
1912{
1913 struct gsm_bts *bts = vty->index;
1914 int tzhr = atoi(argv[0]);
1915 int tzmn = atoi(argv[1]);
1916 int tzdst = atoi(argv[2]);
1917
1918 bts->tz.hr = tzhr;
1919 bts->tz.mn = tzmn;
1920 bts->tz.dst = tzdst;
Harald Welte45f91712012-07-08 16:48:11 +02001921 bts->tz.override = 1;
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001922
1923 return CMD_SUCCESS;
1924}
1925
1926DEFUN(cfg_bts_no_timezone,
1927 cfg_bts_no_timezone_cmd,
1928 "no timezone",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001929 NO_STR
1930 "Disable BTS specific timezone\n")
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001931{
1932 struct gsm_bts *bts = vty->index;
Harald Welte45f91712012-07-08 16:48:11 +02001933
1934 bts->tz.override = 0;
1935
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001936 return CMD_SUCCESS;
1937}
Harald Welte78f2f502009-05-23 16:56:52 +00001938
Harald Welte4cc34222009-05-01 15:12:31 +00001939DEFUN(cfg_bts_unit_id,
1940 cfg_bts_unit_id_cmd,
Harald Welte07dc73d2009-08-07 13:27:09 +02001941 "ip.access unit_id <0-65534> <0-255>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001942 "Abis/IP specific options\n"
1943 "Set the IPA BTS Unit ID\n"
1944 "Unit ID (Site)\n"
1945 "Unit ID (BTS)\n")
Harald Welte4cc34222009-05-01 15:12:31 +00001946{
1947 struct gsm_bts *bts = vty->index;
1948 int site_id = atoi(argv[0]);
1949 int bts_id = atoi(argv[1]);
1950
Harald Welte07dc73d2009-08-07 13:27:09 +02001951 if (!is_ipaccess_bts(bts)) {
1952 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1953 return CMD_WARNING;
1954 }
1955
Harald Welte4cc34222009-05-01 15:12:31 +00001956 bts->ip_access.site_id = site_id;
1957 bts->ip_access.bts_id = bts_id;
1958
1959 return CMD_SUCCESS;
1960}
1961
Harald Welte8b291802013-03-12 13:57:05 +01001962DEFUN(cfg_bts_rsl_ip,
1963 cfg_bts_rsl_ip_cmd,
1964 "ip.access rsl-ip A.B.C.D",
1965 "Abis/IP specific options\n"
1966 "Set the IPA RSL IP Address of the BSC\n"
1967 "Destination IP address for RSL connection\n")
1968{
1969 struct gsm_bts *bts = vty->index;
1970 struct in_addr ia;
1971
1972 if (!is_ipaccess_bts(bts)) {
1973 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1974 return CMD_WARNING;
1975 }
1976
1977 inet_aton(argv[0], &ia);
1978 bts->ip_access.rsl_ip = ntohl(ia.s_addr);
1979
1980 return CMD_SUCCESS;
1981}
1982
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001983#define NOKIA_STR "Nokia *Site related commands\n"
Harald Welte8b291802013-03-12 13:57:05 +01001984
Sylvain Munautc9519462011-10-17 14:04:55 +02001985DEFUN(cfg_bts_nokia_site_skip_reset,
1986 cfg_bts_nokia_site_skip_reset_cmd,
1987 "nokia_site skip-reset (0|1)",
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001988 NOKIA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001989 "Skip the reset step during bootstrap process of this BTS\n"
1990 "Do NOT skip the reset\n" "Skip the reset\n")
Sylvain Munautc9519462011-10-17 14:04:55 +02001991{
1992 struct gsm_bts *bts = vty->index;
1993
1994 if (bts->type != GSM_BTS_TYPE_NOKIA_SITE) {
1995 vty_out(vty, "%% BTS is not of Nokia *Site type%s", VTY_NEWLINE);
1996 return CMD_WARNING;
1997 }
1998
1999 bts->nokia.skip_reset = atoi(argv[0]);
2000
2001 return CMD_SUCCESS;
2002}
2003
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01002004DEFUN(cfg_bts_nokia_site_no_loc_rel_cnf,
2005 cfg_bts_nokia_site_no_loc_rel_cnf_cmd,
2006 "nokia_site no-local-rel-conf (0|1)",
2007 NOKIA_STR
2008 "Do not wait for RELease CONFirm message when releasing channel locally\n"
2009 "Wait for RELease CONFirm\n" "Do not wait for RELease CONFirm\n")
2010{
2011 struct gsm_bts *bts = vty->index;
2012
2013 if (!is_nokia_bts(bts)) {
2014 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
2015 VTY_NEWLINE);
2016 return CMD_WARNING;
2017 }
2018
2019 bts->nokia.no_loc_rel_cnf = atoi(argv[0]);
2020
2021 return CMD_SUCCESS;
2022}
2023
Sipos Csaba56e17662015-02-07 13:27:36 +01002024DEFUN(cfg_bts_nokia_site_bts_reset_timer_cnf,
2025 cfg_bts_nokia_site_bts_reset_timer_cnf_cmd,
2026 "nokia_site bts-reset-timer <15-100>",
2027 NOKIA_STR
2028 "The amount of time (in sec.) between BTS_RESET is sent,\n"
2029 "and the BTS is being bootstrapped.\n")
2030{
2031 struct gsm_bts *bts = vty->index;
2032
2033 if (!is_nokia_bts(bts)) {
2034 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
2035 VTY_NEWLINE);
2036 return CMD_WARNING;
2037 }
2038
2039 bts->nokia.bts_reset_timer_cnf = atoi(argv[0]);
2040
2041 return CMD_SUCCESS;
2042}
Harald Welte8f0ed552010-05-11 21:53:49 +02002043#define OML_STR "Organization & Maintenance Link\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002044#define IPA_STR "A-bis/IP Specific Options\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02002045
Harald Welte8175e952009-10-20 00:22:00 +02002046DEFUN(cfg_bts_stream_id,
2047 cfg_bts_stream_id_cmd,
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02002048 "oml ip.access stream_id <0-255> line E1_LINE",
Harald Welte8f0ed552010-05-11 21:53:49 +02002049 OML_STR IPA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002050 "Set the ip.access Stream ID of the OML link of this BTS\n"
2051 "Stream Identifier\n" "Virtual E1 Line Number\n" "Virtual E1 Line Number\n")
Harald Welte8175e952009-10-20 00:22:00 +02002052{
2053 struct gsm_bts *bts = vty->index;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02002054 int stream_id = atoi(argv[0]), linenr = atoi(argv[1]);
Harald Welte8175e952009-10-20 00:22:00 +02002055
2056 if (!is_ipaccess_bts(bts)) {
2057 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
2058 return CMD_WARNING;
2059 }
2060
2061 bts->oml_tei = stream_id;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02002062 /* This is used by e1inp_bind_ops callback for each BTS model. */
2063 bts->oml_e1_link.e1_nr = linenr;
2064
2065 return CMD_SUCCESS;
2066}
2067
Harald Welted13e0cd2012-08-17 09:52:03 +02002068#define OML_E1_STR OML_STR "OML E1/T1 Configuration\n"
Harald Welte8175e952009-10-20 00:22:00 +02002069
Harald Welte42581822009-08-08 16:12:58 +02002070DEFUN(cfg_bts_oml_e1,
2071 cfg_bts_oml_e1_cmd,
2072 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welted13e0cd2012-08-17 09:52:03 +02002073 OML_E1_STR
2074 "E1/T1 line number to be used for OML\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002075 "E1/T1 line number to be used for OML\n"
2076 "E1/T1 timeslot to be used for OML\n"
2077 "E1/T1 timeslot to be used for OML\n"
2078 "E1/T1 sub-slot to be used for OML\n"
2079 "Use E1/T1 sub-slot 0\n"
2080 "Use E1/T1 sub-slot 1\n"
2081 "Use E1/T1 sub-slot 2\n"
2082 "Use E1/T1 sub-slot 3\n"
2083 "Use full E1 slot 3\n"
2084 )
Harald Welte42581822009-08-08 16:12:58 +02002085{
2086 struct gsm_bts *bts = vty->index;
2087
2088 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
2089
2090 return CMD_SUCCESS;
2091}
2092
2093
2094DEFUN(cfg_bts_oml_e1_tei,
2095 cfg_bts_oml_e1_tei_cmd,
2096 "oml e1 tei <0-63>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002097 OML_E1_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002098 "Set the TEI to be used for OML\n"
2099 "TEI Number\n")
Harald Welte42581822009-08-08 16:12:58 +02002100{
2101 struct gsm_bts *bts = vty->index;
2102
2103 bts->oml_tei = atoi(argv[0]);
2104
2105 return CMD_SUCCESS;
2106}
2107
Harald Welte7a8fa412009-08-10 13:48:16 +02002108DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
2109 "channel allocator (ascending|descending)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002110 "Channnel Allocator\n" "Channel Allocator\n"
2111 "Allocate Timeslots and Transceivers in ascending order\n"
2112 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte7a8fa412009-08-10 13:48:16 +02002113{
2114 struct gsm_bts *bts = vty->index;
2115
2116 if (!strcmp(argv[0], "ascending"))
2117 bts->chan_alloc_reverse = 0;
2118 else
2119 bts->chan_alloc_reverse = 1;
2120
2121 return CMD_SUCCESS;
2122}
2123
Harald Welte8f0ed552010-05-11 21:53:49 +02002124#define RACH_STR "Random Access Control Channel\n"
2125
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01002126DEFUN(cfg_bts_rach_tx_integer,
2127 cfg_bts_rach_tx_integer_cmd,
2128 "rach tx integer <0-15>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002129 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002130 "Set the raw tx integer value in RACH Control parameters IE\n"
2131 "Set the raw tx integer value in RACH Control parameters IE\n"
2132 "Raw tx integer value in RACH Control parameters IE\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01002133{
2134 struct gsm_bts *bts = vty->index;
2135 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
2136 return CMD_SUCCESS;
2137}
2138
2139DEFUN(cfg_bts_rach_max_trans,
2140 cfg_bts_rach_max_trans_cmd,
2141 "rach max transmission (1|2|4|7)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002142 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002143 "Set the maximum number of RACH burst transmissions\n"
2144 "Set the maximum number of RACH burst transmissions\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02002145 "Maximum number of 1 RACH burst transmissions\n"
2146 "Maximum number of 2 RACH burst transmissions\n"
2147 "Maximum number of 4 RACH burst transmissions\n"
2148 "Maximum number of 7 RACH burst transmissions\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01002149{
2150 struct gsm_bts *bts = vty->index;
2151 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
2152 return CMD_SUCCESS;
2153}
2154
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02002155#define CD_STR "Channel Description\n"
2156
2157DEFUN(cfg_bts_chan_desc_att,
2158 cfg_bts_chan_desc_att_cmd,
2159 "channel-descrption attach (0|1)",
2160 CD_STR
2161 "Set if attachment is required\n"
2162 "Attachment is NOT required\n"
2163 "Attachment is required (standard)\n")
2164{
2165 struct gsm_bts *bts = vty->index;
2166 bts->si_common.chan_desc.att = atoi(argv[0]);
2167 return CMD_SUCCESS;
2168}
2169
2170DEFUN(cfg_bts_chan_desc_bs_pa_mfrms,
2171 cfg_bts_chan_desc_bs_pa_mfrms_cmd,
2172 "channel-descrption bs-pa-mfrms <2-9>",
2173 CD_STR
2174 "Set number of multiframe periods for paging groups\n"
2175 "Number of multiframe periods for paging groups\n")
2176{
2177 struct gsm_bts *bts = vty->index;
2178 int bs_pa_mfrms = atoi(argv[0]);
2179
2180 bts->si_common.chan_desc.bs_pa_mfrms = bs_pa_mfrms - 2;
2181 return CMD_SUCCESS;
2182}
2183
2184DEFUN(cfg_bts_chan_desc_bs_ag_blks_res,
2185 cfg_bts_chan_desc_bs_ag_blks_res_cmd,
2186 "channel-descrption bs-ag-blks-res <0-7>",
2187 CD_STR
2188 "Set number of blocks reserved for access grant\n"
2189 "Number of blocks reserved for access grant\n")
2190{
2191 struct gsm_bts *bts = vty->index;
2192 int bs_ag_blks_res = atoi(argv[0]);
2193
2194 bts->si_common.chan_desc.bs_ag_blks_res = bs_ag_blks_res;
2195 return CMD_SUCCESS;
2196}
2197
Harald Welte8f0ed552010-05-11 21:53:49 +02002198#define NM_STR "Network Management\n"
2199
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002200DEFUN(cfg_bts_rach_nm_b_thresh,
2201 cfg_bts_rach_nm_b_thresh_cmd,
2202 "rach nm busy threshold <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002203 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002204 "Set the NM Busy Threshold\n"
2205 "Set the NM Busy Threshold\n"
2206 "NM Busy Threshold in dB")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002207{
2208 struct gsm_bts *bts = vty->index;
2209 bts->rach_b_thresh = atoi(argv[0]);
2210 return CMD_SUCCESS;
2211}
2212
2213DEFUN(cfg_bts_rach_nm_ldavg,
2214 cfg_bts_rach_nm_ldavg_cmd,
2215 "rach nm load average <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002216 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002217 "Set the NM Loadaverage Slots value\n"
2218 "Set the NM Loadaverage Slots value\n"
2219 "NM Loadaverage Slots value\n")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002220{
2221 struct gsm_bts *bts = vty->index;
2222 bts->rach_ldavg_slots = atoi(argv[0]);
2223 return CMD_SUCCESS;
2224}
2225
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002226DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
2227 "cell barred (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002228 "Should this cell be barred from access?\n"
2229 "Should this cell be barred from access?\n"
2230 "Cell should NOT be barred\n"
2231 "Cell should be barred\n")
2232
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002233{
2234 struct gsm_bts *bts = vty->index;
2235
Harald Welte71355012009-12-21 23:08:18 +01002236 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002237
2238 return CMD_SUCCESS;
2239}
2240
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002241DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
2242 "rach emergency call allowed (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002243 RACH_STR
2244 "Should this cell allow emergency calls?\n"
2245 "Should this cell allow emergency calls?\n"
2246 "Should this cell allow emergency calls?\n"
2247 "Do NOT allow emergency calls\n"
2248 "Allow emergency calls\n")
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002249{
2250 struct gsm_bts *bts = vty->index;
2251
2252 if (atoi(argv[0]) == 0)
2253 bts->si_common.rach_control.t2 |= 0x4;
2254 else
2255 bts->si_common.rach_control.t2 &= ~0x4;
2256
2257 return CMD_SUCCESS;
2258}
2259
Ivan Kluchnikov67920592013-09-16 13:13:04 +04002260DEFUN(cfg_bts_rach_ac_class, cfg_bts_rach_ac_class_cmd,
2261 "rach access-control-class (0|1|2|3|4|5|6|7|8|9|11|12|13|14|15) (barred|allowed)",
2262 RACH_STR
2263 "Set access control class\n"
2264 "Access control class 0\n"
2265 "Access control class 1\n"
2266 "Access control class 2\n"
2267 "Access control class 3\n"
2268 "Access control class 4\n"
2269 "Access control class 5\n"
2270 "Access control class 6\n"
2271 "Access control class 7\n"
2272 "Access control class 8\n"
2273 "Access control class 9\n"
2274 "Access control class 11 for PLMN use\n"
2275 "Access control class 12 for security services\n"
2276 "Access control class 13 for public utilities (e.g. water/gas suppliers)\n"
2277 "Access control class 14 for emergency services\n"
2278 "Access control class 15 for PLMN staff\n"
2279 "barred to use access control class\n"
2280 "allowed to use access control class\n")
2281{
2282 struct gsm_bts *bts = vty->index;
2283
2284 uint8_t control_class;
2285 uint8_t allowed = 0;
2286
2287 if (strcmp(argv[1], "allowed") == 0)
2288 allowed = 1;
2289
2290 control_class = atoi(argv[0]);
2291 if (control_class < 8)
2292 if (allowed)
2293 bts->si_common.rach_control.t3 &= ~(0x1 << control_class);
2294 else
2295 bts->si_common.rach_control.t3 |= (0x1 << control_class);
2296 else
2297 if (allowed)
2298 bts->si_common.rach_control.t2 &= ~(0x1 << (control_class - 8));
2299 else
2300 bts->si_common.rach_control.t2 |= (0x1 << (control_class - 8));
2301
2302 return CMD_SUCCESS;
2303}
2304
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002305DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
2306 "ms max power <0-40>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002307 "MS Options\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02002308 "Maximum transmit power of the MS\n"
2309 "Maximum transmit power of the MS\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002310 "Maximum transmit power of the MS in dBm")
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002311{
2312 struct gsm_bts *bts = vty->index;
2313
2314 bts->ms_max_power = atoi(argv[0]);
2315
2316 return CMD_SUCCESS;
2317}
2318
Harald Weltecfaabbb2012-08-16 23:23:50 +02002319#define CELL_STR "Cell Parameters\n"
2320
Harald Welte73225282009-12-12 18:17:25 +01002321DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
2322 "cell reselection hysteresis <0-14>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002323 CELL_STR "Cell re-selection parameters\n"
2324 "Cell Re-Selection Hysteresis in dB\n"
Harald Welte73225282009-12-12 18:17:25 +01002325 "Cell Re-Selection Hysteresis in dB")
2326{
2327 struct gsm_bts *bts = vty->index;
2328
2329 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
2330
2331 return CMD_SUCCESS;
2332}
2333
2334DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
2335 "rxlev access min <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002336 "Minimum RxLev needed for cell access\n"
2337 "Minimum RxLev needed for cell access\n"
2338 "Minimum RxLev needed for cell access\n"
Harald Welte73225282009-12-12 18:17:25 +01002339 "Minimum RxLev needed for cell access (better than -110dBm)")
2340{
2341 struct gsm_bts *bts = vty->index;
2342
2343 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
2344
2345 return CMD_SUCCESS;
2346}
2347
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002348DEFUN(cfg_bts_cell_bar_qualify, cfg_bts_cell_bar_qualify_cmd,
2349 "cell bar qualify (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002350 CELL_STR "Cell Bar Qualify\n" "Cell Bar Qualify\n"
2351 "Set CBQ to 0\n" "Set CBQ to 1\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002352{
2353 struct gsm_bts *bts = vty->index;
2354
2355 bts->si_common.cell_ro_sel_par.present = 1;
2356 bts->si_common.cell_ro_sel_par.cbq = atoi(argv[0]);
2357
2358 return CMD_SUCCESS;
2359}
2360
2361DEFUN(cfg_bts_cell_resel_ofs, cfg_bts_cell_resel_ofs_cmd,
2362 "cell reselection offset <0-126>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002363 CELL_STR "Cell Re-Selection Parameters\n"
2364 "Cell Re-Selection Offset (CRO) in dB\n"
2365 "Cell Re-Selection Offset (CRO) in dB\n"
2366 )
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002367{
2368 struct gsm_bts *bts = vty->index;
2369
2370 bts->si_common.cell_ro_sel_par.present = 1;
2371 bts->si_common.cell_ro_sel_par.cell_resel_off = atoi(argv[0])/2;
2372
2373 return CMD_SUCCESS;
2374}
2375
2376DEFUN(cfg_bts_temp_ofs, cfg_bts_temp_ofs_cmd,
2377 "temporary offset <0-60>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002378 "Cell selection temporary negative offset\n"
2379 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002380 "Cell selection temporary negative offset in dB")
2381{
2382 struct gsm_bts *bts = vty->index;
2383
2384 bts->si_common.cell_ro_sel_par.present = 1;
2385 bts->si_common.cell_ro_sel_par.temp_offs = atoi(argv[0])/10;
2386
2387 return CMD_SUCCESS;
2388}
2389
2390DEFUN(cfg_bts_temp_ofs_inf, cfg_bts_temp_ofs_inf_cmd,
2391 "temporary offset infinite",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002392 "Cell selection temporary negative offset\n"
2393 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002394 "Sets cell selection temporary negative offset to infinity")
2395{
2396 struct gsm_bts *bts = vty->index;
2397
2398 bts->si_common.cell_ro_sel_par.present = 1;
2399 bts->si_common.cell_ro_sel_par.temp_offs = 7;
2400
2401 return CMD_SUCCESS;
2402}
2403
2404DEFUN(cfg_bts_penalty_time, cfg_bts_penalty_time_cmd,
2405 "penalty time <20-620>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002406 "Cell selection penalty time\n"
2407 "Cell selection penalty time\n"
2408 "Cell selection penalty time in seconds (by 20s increments)\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002409{
2410 struct gsm_bts *bts = vty->index;
2411
2412 bts->si_common.cell_ro_sel_par.present = 1;
2413 bts->si_common.cell_ro_sel_par.penalty_time = (atoi(argv[0])-20)/20;
2414
2415 return CMD_SUCCESS;
2416}
2417
2418DEFUN(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd,
2419 "penalty time reserved",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002420 "Cell selection penalty time\n"
2421 "Cell selection penalty time\n"
2422 "Set cell selection penalty time to reserved value 31, "
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002423 "(indicate that CELL_RESELECT_OFFSET is subtracted from C2 "
2424 "and TEMPORARY_OFFSET is ignored)")
2425{
2426 struct gsm_bts *bts = vty->index;
2427
2428 bts->si_common.cell_ro_sel_par.present = 1;
2429 bts->si_common.cell_ro_sel_par.penalty_time = 31;
2430
2431 return CMD_SUCCESS;
2432}
2433
Harald Welte (local)efc92312009-08-14 23:09:25 +02002434DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
Daniel Willmann4d62d632012-12-27 00:02:01 +01002435 "periodic location update <6-1530>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002436 "Periodic Location Updating Interval\n"
2437 "Periodic Location Updating Interval\n"
2438 "Periodic Location Updating Interval\n"
2439 "Periodic Location Updating Interval in Minutes\n")
Harald Welte (local)efc92312009-08-14 23:09:25 +02002440{
2441 struct gsm_bts *bts = vty->index;
2442
Dieter Spaard6613e02010-10-05 21:10:55 +02002443 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
Harald Welte (local)efc92312009-08-14 23:09:25 +02002444
2445 return CMD_SUCCESS;
2446}
2447
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002448DEFUN(cfg_bts_no_per_loc_upd, cfg_bts_no_per_loc_upd_cmd,
2449 "no periodic location update",
2450 NO_STR
2451 "Periodic Location Updating Interval\n"
2452 "Periodic Location Updating Interval\n"
2453 "Periodic Location Updating Interval\n")
2454{
2455 struct gsm_bts *bts = vty->index;
2456
2457 bts->si_common.chan_desc.t3212 = 0;
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01002458
2459 return CMD_SUCCESS;
2460}
2461
2462DEFUN(cfg_bts_radio_link_timeout, cfg_bts_radio_link_timeout_cmd,
2463 "radio-link-timeout <4-64>",
2464 "Radio link timeout criterion (BTS side)\n"
2465 "Radio link timeout value (lost SACCH block)\n")
2466{
2467 struct gsm_bts *bts = vty->index;
2468
2469 set_radio_link_timeout(&bts->si_common.cell_options, atoi(argv[0]));
2470
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002471 return CMD_SUCCESS;
2472}
2473
Harald Welte8f0ed552010-05-11 21:53:49 +02002474#define GPRS_TEXT "GPRS Packet Network\n"
2475
Harald Welteaf387632010-03-14 23:30:30 +08002476DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welte57ba7e32010-04-18 14:00:26 +02002477 "gprs cell bvci <2-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002478 GPRS_TEXT
2479 "GPRS Cell Settings\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002480 "GPRS BSSGP VC Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002481 "GPRS BSSGP VC Identifier")
2482{
2483 struct gsm_bts *bts = vty->index;
2484
Harald Welte4511d892010-04-18 15:51:20 +02002485 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002486 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2487 return CMD_WARNING;
2488 }
2489
Harald Welte97a282b2010-03-14 15:37:43 +08002490 bts->gprs.cell.bvci = atoi(argv[0]);
2491
2492 return CMD_SUCCESS;
2493}
2494
Harald Weltea5731cf2010-03-22 11:48:36 +08002495DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
2496 "gprs nsei <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002497 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002498 "GPRS NS Entity Identifier\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002499 "GPRS NS Entity Identifier")
2500{
2501 struct gsm_bts *bts = vty->index;
2502
Harald Welte4511d892010-04-18 15:51:20 +02002503 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltea5731cf2010-03-22 11:48:36 +08002504 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2505 return CMD_WARNING;
2506 }
2507
2508 bts->gprs.nse.nsei = atoi(argv[0]);
2509
2510 return CMD_SUCCESS;
2511}
2512
Harald Welte8f0ed552010-05-11 21:53:49 +02002513#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
2514 "NSVC Logical Number\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002515
Harald Welte97a282b2010-03-14 15:37:43 +08002516DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
2517 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002518 GPRS_TEXT NSVC_TEXT
2519 "NS Virtual Connection Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002520 "GPRS NS VC Identifier")
2521{
2522 struct gsm_bts *bts = vty->index;
2523 int idx = atoi(argv[0]);
2524
Harald Welte4511d892010-04-18 15:51:20 +02002525 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002526 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2527 return CMD_WARNING;
2528 }
2529
Harald Welte97a282b2010-03-14 15:37:43 +08002530 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
2531
2532 return CMD_SUCCESS;
2533}
2534
Harald Welteaf387632010-03-14 23:30:30 +08002535DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
2536 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002537 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002538 "GPRS NS Local UDP Port\n"
2539 "GPRS NS Local UDP Port\n"
2540 "GPRS NS Local UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002541 "GPRS NS Local UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002542{
2543 struct gsm_bts *bts = vty->index;
2544 int idx = atoi(argv[0]);
2545
Harald Welte4511d892010-04-18 15:51:20 +02002546 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002547 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2548 return CMD_WARNING;
2549 }
2550
Harald Welteaf387632010-03-14 23:30:30 +08002551 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
2552
2553 return CMD_SUCCESS;
2554}
2555
2556DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
2557 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002558 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002559 "GPRS NS Remote UDP Port\n"
2560 "GPRS NS Remote UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002561 "GPRS NS Remote UDP Port\n"
2562 "GPRS NS Remote UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002563{
2564 struct gsm_bts *bts = vty->index;
2565 int idx = atoi(argv[0]);
2566
Harald Welte4511d892010-04-18 15:51:20 +02002567 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002568 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2569 return CMD_WARNING;
2570 }
2571
Harald Welteaf387632010-03-14 23:30:30 +08002572 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
2573
2574 return CMD_SUCCESS;
2575}
2576
2577DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
2578 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte8f0ed552010-05-11 21:53:49 +02002579 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002580 "GPRS NS Remote IP Address\n"
2581 "GPRS NS Remote IP Address\n"
2582 "GPRS NS Remote IP Address\n")
Harald Welteaf387632010-03-14 23:30:30 +08002583{
2584 struct gsm_bts *bts = vty->index;
2585 int idx = atoi(argv[0]);
2586 struct in_addr ia;
2587
Harald Welte4511d892010-04-18 15:51:20 +02002588 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002589 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2590 return CMD_WARNING;
2591 }
2592
Harald Welteaf387632010-03-14 23:30:30 +08002593 inet_aton(argv[1], &ia);
2594 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
2595
2596 return CMD_SUCCESS;
2597}
2598
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002599DEFUN(cfg_bts_pag_free, cfg_bts_pag_free_cmd,
Harald Weltecfaabbb2012-08-16 23:23:50 +02002600 "paging free <-1-1024>",
2601 "Paging options\n"
2602 "Only page when having a certain amount of free slots\n"
2603 "amount of required free paging slots. -1 to disable\n")
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002604{
2605 struct gsm_bts *bts = vty->index;
2606
2607 bts->paging.free_chans_need = atoi(argv[0]);
2608 return CMD_SUCCESS;
2609}
2610
Harald Welte615e9562010-05-11 23:50:21 +02002611DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
2612 "gprs ns timer " NS_TIMERS " <0-255>",
2613 GPRS_TEXT "Network Service\n"
2614 "Network Service Timer\n"
2615 NS_TIMERS_HELP "Timer Value\n")
2616{
2617 struct gsm_bts *bts = vty->index;
2618 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
2619 int val = atoi(argv[1]);
2620
2621 if (bts->gprs.mode == BTS_GPRS_NONE) {
2622 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2623 return CMD_WARNING;
2624 }
2625
2626 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
2627 return CMD_WARNING;
2628
2629 bts->gprs.nse.timer[idx] = val;
2630
2631 return CMD_SUCCESS;
2632}
2633
2634#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 +02002635#define BSSGP_TIMERS_HELP \
2636 "Tbvc-block timeout\n" \
2637 "Tbvc-block retries\n" \
2638 "Tbvc-unblock retries\n" \
2639 "Tbvcc-reset timeout\n" \
2640 "Tbvc-reset retries\n" \
2641 "Tbvc-suspend timeout\n" \
2642 "Tbvc-suspend retries\n" \
2643 "Tbvc-resume timeout\n" \
2644 "Tbvc-resume retries\n" \
2645 "Tbvc-capa-update timeout\n" \
2646 "Tbvc-capa-update retries\n"
Harald Welte615e9562010-05-11 23:50:21 +02002647
2648DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
2649 "gprs cell timer " BSSGP_TIMERS " <0-255>",
2650 GPRS_TEXT "Cell / BSSGP\n"
2651 "Cell/BSSGP Timer\n"
2652 BSSGP_TIMERS_HELP "Timer Value\n")
2653{
2654 struct gsm_bts *bts = vty->index;
2655 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
2656 int val = atoi(argv[1]);
2657
2658 if (bts->gprs.mode == BTS_GPRS_NONE) {
2659 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2660 return CMD_WARNING;
2661 }
2662
2663 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
2664 return CMD_WARNING;
2665
2666 bts->gprs.cell.timer[idx] = val;
2667
2668 return CMD_SUCCESS;
2669}
2670
Harald Welte97a282b2010-03-14 15:37:43 +08002671DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
2672 "gprs routing area <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002673 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002674 "GPRS Routing Area Code\n"
2675 "GPRS Routing Area Code\n"
2676 "GPRS Routing Area Code\n")
Harald Welte97a282b2010-03-14 15:37:43 +08002677{
2678 struct gsm_bts *bts = vty->index;
2679
Harald Welte4511d892010-04-18 15:51:20 +02002680 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002681 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2682 return CMD_WARNING;
2683 }
2684
Harald Welte97a282b2010-03-14 15:37:43 +08002685 bts->gprs.rac = atoi(argv[0]);
2686
2687 return CMD_SUCCESS;
2688}
2689
Max292ec582016-07-28 11:55:37 +02002690DEFUN(cfg_bts_gprs_ctrl_ack, cfg_bts_gprs_ctrl_ack_cmd,
2691 "gprs control-ack-type-rach", GPRS_TEXT
2692 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2693 "four access bursts format instead of default RLC/MAC control block\n")
2694{
2695 struct gsm_bts *bts = vty->index;
2696
2697 if (bts->gprs.mode == BTS_GPRS_NONE) {
2698 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2699 return CMD_WARNING;
2700 }
2701
2702 bts->gprs.ctrl_ack_type_use_block = false;
2703
2704 return CMD_SUCCESS;
2705}
2706
2707DEFUN(cfg_no_bts_gprs_ctrl_ack, cfg_no_bts_gprs_ctrl_ack_cmd,
2708 "no gprs control-ack-type-rach", NO_STR GPRS_TEXT
2709 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2710 "four access bursts format instead of default RLC/MAC control block\n")
2711{
2712 struct gsm_bts *bts = vty->index;
2713
2714 if (bts->gprs.mode == BTS_GPRS_NONE) {
2715 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2716 return CMD_WARNING;
2717 }
2718
2719 bts->gprs.ctrl_ack_type_use_block = true;
2720
2721 return CMD_SUCCESS;
2722}
2723
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01002724DEFUN(cfg_bts_gprs_net_ctrl_ord, cfg_bts_gprs_net_ctrl_ord_cmd,
2725 "gprs network-control-order (nc0|nc1|nc2)",
2726 GPRS_TEXT
2727 "GPRS Network Control Order\n"
2728 "MS controlled cell re-selection, no measurement reporting\n"
2729 "MS controlled cell re-selection, MS sends measurement reports\n"
2730 "Network controlled cell re-selection, MS sends measurement reports\n")
2731{
2732 struct gsm_bts *bts = vty->index;
2733
2734 if (bts->gprs.mode == BTS_GPRS_NONE) {
2735 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2736 return CMD_WARNING;
2737 }
2738
2739 bts->gprs.net_ctrl_ord = atoi(argv[0] + 2);
2740
2741 return CMD_SUCCESS;
2742}
2743
Harald Welte4511d892010-04-18 15:51:20 +02002744DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
2745 "gprs mode (none|gprs|egprs)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002746 GPRS_TEXT
2747 "GPRS Mode for this BTS\n"
2748 "GPRS Disabled on this BTS\n"
2749 "GPRS Enabled on this BTS\n"
2750 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welteaf387632010-03-14 23:30:30 +08002751{
2752 struct gsm_bts *bts = vty->index;
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002753 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0], NULL);
Harald Welteaf387632010-03-14 23:30:30 +08002754
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002755 if (!bts_gprs_mode_is_compat(bts, mode)) {
Harald Weltef3d8e922010-06-14 22:44:42 +02002756 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2757 VTY_NEWLINE);
2758 return CMD_WARNING;
2759 }
2760
2761 bts->gprs.mode = mode;
Harald Welteaf387632010-03-14 23:30:30 +08002762
2763 return CMD_SUCCESS;
2764}
2765
bhargava350533c2016-07-21 11:14:34 +05302766DEFUN(cfg_bts_gprs_11bit_rach_support_for_egprs,
2767 cfg_bts_gprs_11bit_rach_support_for_egprs_cmd,
2768 "gprs 11bit_rach_support_for_egprs (0|1)",
2769 GPRS_TEXT "11 bit RACH options\n"
2770 "Disable 11 bit RACH for EGPRS\n"
2771 "Enable 11 bit RACH for EGPRS")
2772{
2773 struct gsm_bts *bts = vty->index;
2774
2775 bts->gprs.supports_egprs_11bit_rach = atoi(argv[0]);
2776
2777 if (bts->gprs.supports_egprs_11bit_rach > 1) {
2778 vty_out(vty, "Error in RACH type%s", VTY_NEWLINE);
2779 return CMD_WARNING;
2780 }
2781
2782 if ((bts->gprs.mode == BTS_GPRS_NONE) &&
2783 (bts->gprs.supports_egprs_11bit_rach == 1)) {
2784 vty_out(vty, "Error:gprs mode is none and 11bit rach is"
2785 " enabled%s", VTY_NEWLINE);
2786 return CMD_WARNING;
2787 }
2788
2789 return CMD_SUCCESS;
2790}
2791
Harald Welte9fbff4a2010-07-30 11:50:09 +02002792#define SI_TEXT "System Information Messages\n"
2793#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)"
2794#define SI_TYPE_HELP "System Information Type 1\n" \
2795 "System Information Type 2\n" \
2796 "System Information Type 3\n" \
2797 "System Information Type 4\n" \
2798 "System Information Type 5\n" \
2799 "System Information Type 6\n" \
2800 "System Information Type 7\n" \
2801 "System Information Type 8\n" \
2802 "System Information Type 9\n" \
2803 "System Information Type 10\n" \
2804 "System Information Type 13\n" \
2805 "System Information Type 16\n" \
2806 "System Information Type 17\n" \
2807 "System Information Type 18\n" \
2808 "System Information Type 19\n" \
2809 "System Information Type 20\n" \
2810 "System Information Type 2bis\n" \
2811 "System Information Type 2ter\n" \
2812 "System Information Type 2quater\n" \
2813 "System Information Type 5bis\n" \
2814 "System Information Type 5ter\n"
2815
2816DEFUN(cfg_bts_si_mode, cfg_bts_si_mode_cmd,
2817 "system-information " SI_TYPE_TEXT " mode (static|computed)",
2818 SI_TEXT SI_TYPE_HELP
2819 "System Information Mode\n"
2820 "Static user-specified\n"
2821 "Dynamic, BSC-computed\n")
2822{
2823 struct gsm_bts *bts = vty->index;
2824 int type;
2825
2826 type = get_string_value(osmo_sitype_strs, argv[0]);
2827 if (type < 0) {
2828 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2829 return CMD_WARNING;
2830 }
2831
2832 if (!strcmp(argv[1], "static"))
2833 bts->si_mode_static |= (1 << type);
2834 else
2835 bts->si_mode_static &= ~(1 << type);
2836
2837 return CMD_SUCCESS;
2838}
2839
2840DEFUN(cfg_bts_si_static, cfg_bts_si_static_cmd,
2841 "system-information " SI_TYPE_TEXT " static HEXSTRING",
2842 SI_TEXT SI_TYPE_HELP
2843 "Static System Information filling\n"
2844 "Static user-specified SI content in HEX notation\n")
2845{
2846 struct gsm_bts *bts = vty->index;
2847 int rc, type;
2848
2849 type = get_string_value(osmo_sitype_strs, argv[0]);
2850 if (type < 0) {
2851 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2852 return CMD_WARNING;
2853 }
2854
2855 if (!(bts->si_mode_static & (1 << type))) {
2856 vty_out(vty, "SI Type %s is not configured in static mode%s",
2857 get_value_string(osmo_sitype_strs, type), VTY_NEWLINE);
2858 return CMD_WARNING;
2859 }
2860
Harald Welte290aaed2010-07-30 11:53:18 +02002861 /* Fill buffer with padding pattern */
2862 memset(bts->si_buf[type], 0x2b, sizeof(bts->si_buf[type]));
2863
2864 /* Parse the user-specified SI in hex format, [partially] overwriting padding */
Pablo Neira Ayusoc0d17f22011-05-07 12:12:48 +02002865 rc = osmo_hexparse(argv[1], bts->si_buf[type], sizeof(bts->si_buf[0]));
Harald Welte9fbff4a2010-07-30 11:50:09 +02002866 if (rc < 0 || rc > sizeof(bts->si_buf[0])) {
2867 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
2868 return CMD_WARNING;
2869 }
2870
2871 /* Mark this SI as present */
2872 bts->si_valid |= (1 << type);
2873
2874 return CMD_SUCCESS;
2875}
2876
Harald Welte32c09622011-01-11 23:44:56 +01002877DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
Harald Welte64c07d22011-02-15 11:43:27 +01002878 "neighbor-list mode (automatic|manual|manual-si5)",
Harald Welte32c09622011-01-11 23:44:56 +01002879 "Neighbor List\n" "Mode of Neighbor List generation\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002880 "Automatically from all BTS in this OpenBSC\n" "Manual\n"
2881 "Manual with different lists for SI2 and SI5\n")
Harald Welte32c09622011-01-11 23:44:56 +01002882{
2883 struct gsm_bts *bts = vty->index;
Harald Welte64c07d22011-02-15 11:43:27 +01002884 int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
Harald Welte32c09622011-01-11 23:44:56 +01002885
Harald Welte64c07d22011-02-15 11:43:27 +01002886 switch (mode) {
2887 case NL_MODE_MANUAL_SI5SEP:
2888 case NL_MODE_MANUAL:
Harald Welte32c09622011-01-11 23:44:56 +01002889 /* make sure we clear the current list when switching to
2890 * manual mode */
2891 if (bts->neigh_list_manual_mode == 0)
2892 memset(&bts->si_common.data.neigh_list, 0,
2893 sizeof(bts->si_common.data.neigh_list));
Harald Welte64c07d22011-02-15 11:43:27 +01002894 break;
2895 default:
2896 break;
2897 }
2898
2899 bts->neigh_list_manual_mode = mode;
Harald Welte32c09622011-01-11 23:44:56 +01002900
2901 return CMD_SUCCESS;
2902}
2903
2904DEFUN(cfg_bts_neigh, cfg_bts_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002905 "neighbor-list (add|del) arfcn <0-1023>",
Harald Welte32c09622011-01-11 23:44:56 +01002906 "Neighbor List\n" "Add to manual neighbor list\n"
2907 "Delete from manual neighbor list\n" "ARFCN of neighbor\n"
2908 "ARFCN of neighbor\n")
2909{
2910 struct gsm_bts *bts = vty->index;
2911 struct bitvec *bv = &bts->si_common.neigh_list;
2912 uint16_t arfcn = atoi(argv[1]);
2913
2914 if (!bts->neigh_list_manual_mode) {
2915 vty_out(vty, "%% Cannot configure neighbor list in "
2916 "automatic mode%s", VTY_NEWLINE);
2917 return CMD_WARNING;
2918 }
2919
2920 if (!strcmp(argv[0], "add"))
2921 bitvec_set_bit_pos(bv, arfcn, 1);
2922 else
2923 bitvec_set_bit_pos(bv, arfcn, 0);
2924
2925 return CMD_SUCCESS;
2926}
2927
Max35697b92016-04-29 12:51:31 +02002928
Max59a1bf32016-04-15 16:04:46 +02002929DEFUN(cfg_bts_si2quater_neigh_add, cfg_bts_si2quater_neigh_add_cmd,
Max35697b92016-04-29 12:51:31 +02002930 "si2quater neighbor-list add earfcn <0-65535> threshold <0-31> "
2931 "[<0-7>]", "SI2quater Neighbor List\n"
Max59a1bf32016-04-15 16:04:46 +02002932 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
2933 "EARFCN of neighbor\n" "EARFCN of neighbor\n" "threshold high bits\n"
2934 "threshold high bits\n" "measurement bandwidth\n")
2935{
2936 struct gsm_bts *bts = vty->index;
2937 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
2938 uint16_t arfcn = atoi(argv[0]);
2939 uint8_t meas = OSMO_EARFCN_MEAS_INVALID, thresh = atoi(argv[1]);
2940 int r;
2941
2942 if (3 == argc)
2943 meas = atoi(argv[2]);
2944
2945 r = osmo_earfcn_add(e, arfcn, meas);
2946
2947 if (r < 0) {
2948 vty_out(vty, "Unable to add arfcn %u: %s%s", arfcn, strerror(r),
2949 VTY_NEWLINE);
2950 return CMD_WARNING;
2951 }
Maxaafff962016-04-20 15:57:14 +02002952 if (si2q_size_check(bts)) {
2953 if (e->thresh_hi && thresh != e->thresh_hi)
2954 vty_out(vty, "Warning: multiple thresholds are not "
2955 "supported, overriding previous threshold %u%s",
2956 e->thresh_hi, VTY_NEWLINE);
Max59a1bf32016-04-15 16:04:46 +02002957
Maxaafff962016-04-20 15:57:14 +02002958 e->thresh_hi = thresh;
2959 return CMD_SUCCESS;
2960 }
2961 vty_out(vty, "Warning: not enough space in si2quater for a given arfcn%s"
2962 , VTY_NEWLINE);
2963 osmo_earfcn_del(e, arfcn);
2964 return CMD_WARNING;
Max59a1bf32016-04-15 16:04:46 +02002965}
2966
2967DEFUN(cfg_bts_si2quater_neigh_del, cfg_bts_si2quater_neigh_del_cmd,
Max35697b92016-04-29 12:51:31 +02002968 "si2quater neighbor-list del earfcn <0-65535>",
Max59a1bf32016-04-15 16:04:46 +02002969 "SI2quater Neighbor List\n"
2970 "SI2quater Neighbor List\n"
2971 "Delete from SI2quater manual neighbor list\n"
Max36212f22016-04-20 12:06:05 +02002972 "EARFCN of neighbor\n"
2973 "EARFCN\n")
Max59a1bf32016-04-15 16:04:46 +02002974{
2975 struct gsm_bts *bts = vty->index;
2976 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
Max0c1bc262016-04-20 12:06:06 +02002977 uint16_t arfcn = atoi(argv[0]);
Max59a1bf32016-04-15 16:04:46 +02002978 int r = osmo_earfcn_del(e, arfcn);
2979 if (r < 0) {
2980 vty_out(vty, "Unable to delete arfcn %u: %s%s", arfcn,
Max0c1bc262016-04-20 12:06:06 +02002981 strerror(-r), VTY_NEWLINE);
Max59a1bf32016-04-15 16:04:46 +02002982 return CMD_WARNING;
2983 }
2984
2985 return CMD_SUCCESS;
2986}
2987
Max26679e02016-04-20 15:57:13 +02002988DEFUN(cfg_bts_si2quater_uarfcn_add, cfg_bts_si2quater_uarfcn_add_cmd,
Max35697b92016-04-29 12:51:31 +02002989 "si2quater neighbor-list add uarfcn <0-16383> <0-511> <0-1>",
Max26679e02016-04-20 15:57:13 +02002990 "SI2quater Neighbor List\n"
2991 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
2992 "UARFCN of neighbor\n" "UARFCN of neighbor\n" "scrambling code\n"
2993 "diversity bit\n")
2994{
2995 struct gsm_bts *bts = vty->index;
2996 uint16_t arfcn = atoi(argv[0]), scramble = atoi(argv[1]);
2997
2998 switch(bts_uarfcn_add(bts, arfcn, scramble, atoi(argv[2]))) {
2999 case -ENOMEM:
3000 vty_out(vty, "Unable to add arfcn: max number of UARFCNs (%u) "
3001 "reached%s", MAX_EARFCN_LIST, VTY_NEWLINE);
Maxaafff962016-04-20 15:57:14 +02003002 case -ENOSPC:
3003 vty_out(vty, "Warning: not enough space in si2quater for a "
3004 "given arfcn%s", VTY_NEWLINE);
Max26679e02016-04-20 15:57:13 +02003005 case -EADDRINUSE:
3006 vty_out(vty, "Unable to add arfcn: (%u, %u) is already added%s",
3007 arfcn, scramble, VTY_NEWLINE);
3008 return CMD_WARNING;
3009 }
3010
3011 return CMD_SUCCESS;
3012}
3013
3014DEFUN(cfg_bts_si2quater_uarfcn_del, cfg_bts_si2quater_uarfcn_del_cmd,
Max35697b92016-04-29 12:51:31 +02003015 "si2quater neighbor-list del uarfcn <0-16383> <0-511>",
Max26679e02016-04-20 15:57:13 +02003016 "SI2quater Neighbor List\n"
3017 "SI2quater Neighbor List\n"
3018 "Delete from SI2quater manual neighbor list\n"
3019 "UARFCN of neighbor\n"
3020 "UARFCN\n"
3021 "scrambling code\n")
3022{
3023 struct gsm_bts *bts = vty->index;
3024
3025 if (bts_uarfcn_del(bts, atoi(argv[0]), atoi(argv[1])) < 0) {
3026 vty_out(vty, "Unable to delete uarfcn: pair not found%s",
3027 VTY_NEWLINE);
3028 return CMD_WARNING;
3029 }
3030
3031 return CMD_SUCCESS;
3032}
3033
Harald Welte64c07d22011-02-15 11:43:27 +01003034DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01003035 "si5 neighbor-list (add|del) arfcn <0-1023>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003036 "SI5 Neighbor List\n"
Harald Welte64c07d22011-02-15 11:43:27 +01003037 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
3038 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
3039 "ARFCN of neighbor\n")
3040{
3041 struct gsm_bts *bts = vty->index;
3042 struct bitvec *bv = &bts->si_common.si5_neigh_list;
3043 uint16_t arfcn = atoi(argv[1]);
3044
3045 if (!bts->neigh_list_manual_mode) {
3046 vty_out(vty, "%% Cannot configure neighbor list in "
3047 "automatic mode%s", VTY_NEWLINE);
3048 return CMD_WARNING;
3049 }
3050
3051 if (!strcmp(argv[0], "add"))
3052 bitvec_set_bit_pos(bv, arfcn, 1);
3053 else
3054 bitvec_set_bit_pos(bv, arfcn, 0);
3055
3056 return CMD_SUCCESS;
3057}
Harald Welte9fbff4a2010-07-30 11:50:09 +02003058
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02003059#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
3060
3061DEFUN(cfg_bts_excl_rf_lock,
3062 cfg_bts_excl_rf_lock_cmd,
3063 "rf-lock-exclude",
3064 EXCL_RFLOCK_STR)
3065{
3066 struct gsm_bts *bts = vty->index;
3067 bts->excl_from_rf_lock = 1;
3068 return CMD_SUCCESS;
3069}
3070
3071DEFUN(cfg_bts_no_excl_rf_lock,
3072 cfg_bts_no_excl_rf_lock_cmd,
3073 "no rf-lock-exclude",
3074 NO_STR EXCL_RFLOCK_STR)
3075{
3076 struct gsm_bts *bts = vty->index;
3077 bts->excl_from_rf_lock = 0;
3078 return CMD_SUCCESS;
3079}
3080
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01003081#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
3082
3083DEFUN(cfg_bts_force_comb_si,
3084 cfg_bts_force_comb_si_cmd,
3085 "force-combined-si",
3086 FORCE_COMB_SI_STR)
3087{
3088 struct gsm_bts *bts = vty->index;
3089 bts->force_combined_si = 1;
3090 return CMD_SUCCESS;
3091}
3092
3093DEFUN(cfg_bts_no_force_comb_si,
3094 cfg_bts_no_force_comb_si_cmd,
3095 "no force-combined-si",
3096 NO_STR FORCE_COMB_SI_STR)
3097{
3098 struct gsm_bts *bts = vty->index;
3099 bts->force_combined_si = 0;
3100 return CMD_SUCCESS;
3101}
3102
Andreas Eversberga83d5112013-12-07 18:32:28 +01003103static void _get_codec_from_arg(struct vty *vty, int argc, const char *argv[])
3104{
3105 struct gsm_bts *bts = vty->index;
3106 struct bts_codec_conf *codec = &bts->codec;
3107 int i;
3108
3109 codec->hr = 0;
3110 codec->efr = 0;
3111 codec->amr = 0;
3112 for (i = 0; i < argc; i++) {
3113 if (!strcmp(argv[i], "hr"))
3114 codec->hr = 1;
3115 if (!strcmp(argv[i], "efr"))
3116 codec->efr = 1;
3117 if (!strcmp(argv[i], "amr"))
3118 codec->amr = 1;
3119 }
3120}
3121
3122#define CODEC_PAR_STR " (hr|efr|amr)"
3123#define CODEC_HELP_STR "Half Rate\n" \
3124 "Enhanced Full Rate\nAdaptive Multirate\n"
3125
3126DEFUN(cfg_bts_codec0, cfg_bts_codec0_cmd,
3127 "codec-support fr",
3128 "Codec Support settings\nFullrate\n")
3129{
3130 _get_codec_from_arg(vty, 0, argv);
3131 return CMD_SUCCESS;
3132}
3133
3134DEFUN(cfg_bts_codec1, cfg_bts_codec1_cmd,
3135 "codec-support fr" CODEC_PAR_STR,
3136 "Codec Support settings\nFullrate\n"
3137 CODEC_HELP_STR)
3138{
3139 _get_codec_from_arg(vty, 1, argv);
3140 return CMD_SUCCESS;
3141}
3142
3143DEFUN(cfg_bts_codec2, cfg_bts_codec2_cmd,
3144 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR,
3145 "Codec Support settings\nFullrate\n"
3146 CODEC_HELP_STR CODEC_HELP_STR)
3147{
3148 _get_codec_from_arg(vty, 2, argv);
3149 return CMD_SUCCESS;
3150}
3151
3152DEFUN(cfg_bts_codec3, cfg_bts_codec3_cmd,
3153 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
3154 "Codec Support settings\nFullrate\n"
3155 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
3156{
3157 _get_codec_from_arg(vty, 3, argv);
3158 return CMD_SUCCESS;
3159}
3160
3161DEFUN(cfg_bts_codec4, cfg_bts_codec4_cmd,
3162 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
3163 "Codec Support settings\nFullrate\n"
3164 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
3165{
3166 _get_codec_from_arg(vty, 4, argv);
3167 return CMD_SUCCESS;
3168}
3169
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01003170DEFUN(cfg_bts_depends_on, cfg_bts_depends_on_cmd,
3171 "depends-on-bts <0-255>",
3172 "This BTS can only be started if another one is up\n" "BTS Number\n")
3173{
3174 struct gsm_bts *bts = vty->index;
3175 struct gsm_bts *other_bts;
3176 int dep = atoi(argv[0]);
3177
3178
3179 if (!is_ipaccess_bts(bts)) {
3180 vty_out(vty, "This feature is only available for IP systems.%s",
3181 VTY_NEWLINE);
3182 return CMD_WARNING;
3183 }
3184
3185 other_bts = gsm_bts_num(bts->network, dep);
3186 if (!other_bts || !is_ipaccess_bts(other_bts)) {
3187 vty_out(vty, "This feature is only available for IP systems.%s",
3188 VTY_NEWLINE);
3189 return CMD_WARNING;
3190 }
3191
3192 if (dep >= bts->nr) {
3193 vty_out(vty, "%%Need to depend on an already declared unit.%s",
3194 VTY_NEWLINE);
3195 return CMD_WARNING;
3196 }
3197
3198 bts_depend_mark(bts, dep);
3199 return CMD_SUCCESS;
3200}
3201
3202DEFUN(cfg_bts_no_depends_on, cfg_bts_no_depends_on_cmd,
3203 "depeneds-on-bts <0-255>",
3204 NO_STR "This BTS can only be started if another one is up\n"
3205 "BTS Number\n")
3206{
3207 struct gsm_bts *bts = vty->index;
3208 int dep = atoi(argv[0]);
3209
3210 bts_depend_clear(bts, dep);
3211 return CMD_SUCCESS;
3212}
3213
Andreas Eversberg73266522014-01-19 11:47:44 +01003214#define AMR_TEXT "Adaptive Multi Rate settings\n"
3215#define AMR_MODE_TEXT "Codec modes to use with AMR codec\n"
3216#define AMR_START_TEXT "Initial codec to use with AMR\n" \
3217 "Automatically\nFirst codec\nSecond codec\nThird codec\nFourth codec\n"
3218#define AMR_TH_TEXT "AMR threshold between codecs\nMS side\nBTS side\n"
3219#define AMR_HY_TEXT "AMR hysteresis between codecs\nMS side\nBTS side\n"
3220
3221static void get_amr_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3222{
3223 struct gsm_bts *bts = vty->index;
3224 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3225 struct gsm48_multi_rate_conf *mr_conf =
3226 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3227 int i;
3228
3229 mr->gsm48_ie[1] = 0;
3230 for (i = 0; i < argc; i++)
3231 mr->gsm48_ie[1] |= 1 << atoi(argv[i]);
3232 mr_conf->icmi = 0;
3233}
3234
3235static void get_amr_th_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3236{
3237 struct gsm_bts *bts = vty->index;
3238 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003239 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003240 int i;
3241
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003242 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3243 for (i = 0; i < argc - 1; i++)
3244 modes[i].threshold = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003245}
3246
3247static void get_amr_hy_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3248{
3249 struct gsm_bts *bts = vty->index;
3250 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003251 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003252 int i;
3253
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003254 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3255 for (i = 0; i < argc - 1; i++)
3256 modes[i].hysteresis = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003257}
3258
3259static void get_amr_start_from_arg(struct vty *vty, const char *argv[], int full)
3260{
3261 struct gsm_bts *bts = vty->index;
3262 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3263 struct gsm48_multi_rate_conf *mr_conf =
3264 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3265 int num = 0, i;
3266
3267 for (i = 0; i < ((full) ? 8 : 6); i++) {
3268 if ((mr->gsm48_ie[1] & (1 << i))) {
3269 num++;
3270 }
3271 }
3272
3273 if (argv[0][0] == 'a' || num == 0)
3274 mr_conf->icmi = 0;
3275 else {
3276 mr_conf->icmi = 1;
3277 if (num < atoi(argv[0]))
3278 mr_conf->smod = num - 1;
3279 else
3280 mr_conf->smod = atoi(argv[0]) - 1;
3281 }
3282}
3283
3284#define AMR_TCHF_PAR_STR " (0|1|2|3|4|5|6|7)"
3285#define AMR_TCHF_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n" \
3286 "10,2k\n12,2k\n"
3287
3288#define AMR_TCHH_PAR_STR " (0|1|2|3|4|5)"
3289#define AMR_TCHH_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n"
3290
3291#define AMR_TH_HELP_STR "Threshold between codec 1 and 2\n"
3292#define AMR_HY_HELP_STR "Hysteresis between codec 1 and 2\n"
3293
3294DEFUN(cfg_bts_amr_fr_modes1, cfg_bts_amr_fr_modes1_cmd,
3295 "amr tch-f modes" AMR_TCHF_PAR_STR,
3296 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3297 AMR_TCHF_HELP_STR)
3298{
3299 get_amr_from_arg(vty, 1, argv, 1);
3300 return CMD_SUCCESS;
3301}
3302
3303DEFUN(cfg_bts_amr_fr_modes2, cfg_bts_amr_fr_modes2_cmd,
3304 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3305 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3306 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3307{
3308 get_amr_from_arg(vty, 2, argv, 1);
3309 return CMD_SUCCESS;
3310}
3311
3312DEFUN(cfg_bts_amr_fr_modes3, cfg_bts_amr_fr_modes3_cmd,
3313 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3314 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3315 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3316{
3317 get_amr_from_arg(vty, 3, argv, 1);
3318 return CMD_SUCCESS;
3319}
3320
3321DEFUN(cfg_bts_amr_fr_modes4, cfg_bts_amr_fr_modes4_cmd,
3322 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3323 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3324 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3325{
3326 get_amr_from_arg(vty, 4, argv, 1);
3327 return CMD_SUCCESS;
3328}
3329
3330DEFUN(cfg_bts_amr_fr_start_mode, cfg_bts_amr_fr_start_mode_cmd,
3331 "amr tch-f start-mode (auto|1|2|3|4)",
3332 AMR_TEXT "Full Rate\n" AMR_START_TEXT)
3333{
3334 get_amr_start_from_arg(vty, argv, 1);
3335 return CMD_SUCCESS;
3336}
3337
3338DEFUN(cfg_bts_amr_fr_thres1, cfg_bts_amr_fr_thres1_cmd,
3339 "amr tch-f threshold (ms|bts) <0-63>",
3340 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3341 AMR_TH_HELP_STR)
3342{
3343 get_amr_th_from_arg(vty, 2, argv, 1);
3344 return CMD_SUCCESS;
3345}
3346
3347DEFUN(cfg_bts_amr_fr_thres2, cfg_bts_amr_fr_thres2_cmd,
3348 "amr tch-f threshold (ms|bts) <0-63> <0-63>",
3349 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3350 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3351{
3352 get_amr_th_from_arg(vty, 3, argv, 1);
3353 return CMD_SUCCESS;
3354}
3355
3356DEFUN(cfg_bts_amr_fr_thres3, cfg_bts_amr_fr_thres3_cmd,
3357 "amr tch-f threshold (ms|bts) <0-63> <0-63> <0-63>",
3358 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3359 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3360{
3361 get_amr_th_from_arg(vty, 4, argv, 1);
3362 return CMD_SUCCESS;
3363}
3364
3365DEFUN(cfg_bts_amr_fr_hyst1, cfg_bts_amr_fr_hyst1_cmd,
3366 "amr tch-f hysteresis (ms|bts) <0-15>",
3367 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3368 AMR_HY_HELP_STR)
3369{
3370 get_amr_hy_from_arg(vty, 2, argv, 1);
3371 return CMD_SUCCESS;
3372}
3373
3374DEFUN(cfg_bts_amr_fr_hyst2, cfg_bts_amr_fr_hyst2_cmd,
3375 "amr tch-f hysteresis (ms|bts) <0-15> <0-15>",
3376 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3377 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3378{
3379 get_amr_hy_from_arg(vty, 3, argv, 1);
3380 return CMD_SUCCESS;
3381}
3382
3383DEFUN(cfg_bts_amr_fr_hyst3, cfg_bts_amr_fr_hyst3_cmd,
3384 "amr tch-f hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3385 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3386 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3387{
3388 get_amr_hy_from_arg(vty, 4, argv, 1);
3389 return CMD_SUCCESS;
3390}
3391
3392DEFUN(cfg_bts_amr_hr_modes1, cfg_bts_amr_hr_modes1_cmd,
3393 "amr tch-h modes" AMR_TCHH_PAR_STR,
3394 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3395 AMR_TCHH_HELP_STR)
3396{
3397 get_amr_from_arg(vty, 1, argv, 0);
3398 return CMD_SUCCESS;
3399}
3400
3401DEFUN(cfg_bts_amr_hr_modes2, cfg_bts_amr_hr_modes2_cmd,
3402 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3403 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3404 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3405{
3406 get_amr_from_arg(vty, 2, argv, 0);
3407 return CMD_SUCCESS;
3408}
3409
3410DEFUN(cfg_bts_amr_hr_modes3, cfg_bts_amr_hr_modes3_cmd,
3411 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3412 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3413 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3414{
3415 get_amr_from_arg(vty, 3, argv, 0);
3416 return CMD_SUCCESS;
3417}
3418
3419DEFUN(cfg_bts_amr_hr_modes4, cfg_bts_amr_hr_modes4_cmd,
3420 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3421 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3422 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3423{
3424 get_amr_from_arg(vty, 4, argv, 0);
3425 return CMD_SUCCESS;
3426}
3427
3428DEFUN(cfg_bts_amr_hr_start_mode, cfg_bts_amr_hr_start_mode_cmd,
3429 "amr tch-h start-mode (auto|1|2|3|4)",
3430 AMR_TEXT "Half Rate\n" AMR_START_TEXT)
3431{
3432 get_amr_start_from_arg(vty, argv, 0);
3433 return CMD_SUCCESS;
3434}
3435
3436DEFUN(cfg_bts_amr_hr_thres1, cfg_bts_amr_hr_thres1_cmd,
3437 "amr tch-h threshold (ms|bts) <0-63>",
3438 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3439 AMR_TH_HELP_STR)
3440{
3441 get_amr_th_from_arg(vty, 2, argv, 0);
3442 return CMD_SUCCESS;
3443}
3444
3445DEFUN(cfg_bts_amr_hr_thres2, cfg_bts_amr_hr_thres2_cmd,
3446 "amr tch-h threshold (ms|bts) <0-63> <0-63>",
3447 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3448 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3449{
3450 get_amr_th_from_arg(vty, 3, argv, 0);
3451 return CMD_SUCCESS;
3452}
3453
3454DEFUN(cfg_bts_amr_hr_thres3, cfg_bts_amr_hr_thres3_cmd,
3455 "amr tch-h threshold (ms|bts) <0-63> <0-63> <0-63>",
3456 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3457 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3458{
3459 get_amr_th_from_arg(vty, 4, argv, 0);
3460 return CMD_SUCCESS;
3461}
3462
3463DEFUN(cfg_bts_amr_hr_hyst1, cfg_bts_amr_hr_hyst1_cmd,
3464 "amr tch-h hysteresis (ms|bts) <0-15>",
3465 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3466 AMR_HY_HELP_STR)
3467{
3468 get_amr_hy_from_arg(vty, 2, argv, 0);
3469 return CMD_SUCCESS;
3470}
3471
3472DEFUN(cfg_bts_amr_hr_hyst2, cfg_bts_amr_hr_hyst2_cmd,
3473 "amr tch-h hysteresis (ms|bts) <0-15> <0-15>",
3474 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3475 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3476{
3477 get_amr_hy_from_arg(vty, 3, argv, 0);
3478 return CMD_SUCCESS;
3479}
3480
3481DEFUN(cfg_bts_amr_hr_hyst3, cfg_bts_amr_hr_hyst3_cmd,
3482 "amr tch-h hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3483 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3484 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3485{
3486 get_amr_hy_from_arg(vty, 4, argv, 0);
3487 return CMD_SUCCESS;
3488}
3489
Harald Welte8f0ed552010-05-11 21:53:49 +02003490#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02003491
Harald Welte5258fc42009-03-28 19:07:53 +00003492/* per TRX configuration */
3493DEFUN(cfg_trx,
3494 cfg_trx_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02003495 "trx <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02003496 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00003497 "Select a TRX to configure")
3498{
3499 int trx_nr = atoi(argv[0]);
3500 struct gsm_bts *bts = vty->index;
3501 struct gsm_bts_trx *trx;
3502
Harald Weltee441d9c2009-06-21 16:17:15 +02003503 if (trx_nr > bts->num_trx) {
3504 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
3505 bts->num_trx, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00003506 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02003507 } else if (trx_nr == bts->num_trx) {
3508 /* we need to allocate a new one */
3509 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003510 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02003511 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003512
Harald Weltee441d9c2009-06-21 16:17:15 +02003513 if (!trx)
3514 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00003515
3516 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02003517 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00003518 vty->node = TRX_NODE;
3519
3520 return CMD_SUCCESS;
3521}
3522
3523DEFUN(cfg_trx_arfcn,
3524 cfg_trx_arfcn_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01003525 "arfcn <0-1023>",
Harald Welte13fe2192012-08-17 09:57:25 +02003526 "Set the ARFCN for this TRX\n"
3527 "Absolute Radio Frequency Channel Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003528{
3529 int arfcn = atoi(argv[0]);
3530 struct gsm_bts_trx *trx = vty->index;
3531
3532 /* FIXME: check if this ARFCN is supported by this TRX */
3533
3534 trx->arfcn = arfcn;
3535
3536 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
3537 /* FIXME: use OML layer to update the ARFCN */
3538 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
3539
3540 return CMD_SUCCESS;
3541}
3542
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003543DEFUN(cfg_trx_nominal_power,
3544 cfg_trx_nominal_power_cmd,
3545 "nominal power <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003546 "Nominal TRX RF Power in dBm\n"
3547 "Nominal TRX RF Power in dBm\n"
3548 "Nominal TRX RF Power in dBm\n")
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003549{
3550 struct gsm_bts_trx *trx = vty->index;
3551
3552 trx->nominal_power = atoi(argv[0]);
3553
3554 return CMD_SUCCESS;
3555}
3556
Harald Weltefcd24452009-06-20 18:15:19 +02003557DEFUN(cfg_trx_max_power_red,
3558 cfg_trx_max_power_red_cmd,
3559 "max_power_red <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003560 "Reduction of maximum BS RF Power (relative to nominal power)\n"
Harald Weltefcd24452009-06-20 18:15:19 +02003561 "Reduction of maximum BS RF Power in dB\n")
3562{
3563 int maxpwr_r = atoi(argv[0]);
3564 struct gsm_bts_trx *trx = vty->index;
Harald Welte61a83b22009-11-18 09:20:22 +01003565 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-06-20 18:15:19 +02003566
3567 /* FIXME: check if our BTS type supports more than 12 */
3568 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
3569 vty_out(vty, "%% Power %d dB is not in the valid range%s",
3570 maxpwr_r, VTY_NEWLINE);
3571 return CMD_WARNING;
3572 }
3573 if (maxpwr_r & 1) {
3574 vty_out(vty, "%% Power %d dB is not an even value%s",
3575 maxpwr_r, VTY_NEWLINE);
3576 return CMD_WARNING;
3577 }
3578
3579 trx->max_power_red = maxpwr_r;
3580
3581 /* FIXME: make sure we update this using OML */
3582
3583 return CMD_SUCCESS;
3584}
3585
Harald Welte42581822009-08-08 16:12:58 +02003586DEFUN(cfg_trx_rsl_e1,
3587 cfg_trx_rsl_e1_cmd,
3588 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003589 "RSL Parameters\n"
3590 "E1/T1 interface to be used for RSL\n"
3591 "E1/T1 interface to be used for RSL\n"
3592 "E1/T1 Line Number to be used for RSL\n"
3593 "E1/T1 Timeslot to be used for RSL\n"
3594 "E1/T1 Timeslot to be used for RSL\n"
3595 "E1/T1 Sub-slot to be used for RSL\n"
3596 "E1/T1 Sub-slot 0 is to be used for RSL\n"
3597 "E1/T1 Sub-slot 1 is to be used for RSL\n"
3598 "E1/T1 Sub-slot 2 is to be used for RSL\n"
3599 "E1/T1 Sub-slot 3 is to be used for RSL\n"
3600 "E1/T1 full timeslot is to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003601{
3602 struct gsm_bts_trx *trx = vty->index;
3603
3604 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
3605
3606 return CMD_SUCCESS;
3607}
3608
3609DEFUN(cfg_trx_rsl_e1_tei,
3610 cfg_trx_rsl_e1_tei_cmd,
3611 "rsl e1 tei <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003612 "RSL Parameters\n"
3613 "Set the TEI to be used for RSL\n"
3614 "Set the TEI to be used for RSL\n"
3615 "TEI to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003616{
3617 struct gsm_bts_trx *trx = vty->index;
3618
3619 trx->rsl_tei = atoi(argv[0]);
3620
3621 return CMD_SUCCESS;
3622}
3623
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003624DEFUN(cfg_trx_rf_locked,
3625 cfg_trx_rf_locked_cmd,
3626 "rf_locked (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003627 "Set or unset the RF Locking (Turn off RF of the TRX)\n"
3628 "TRX is NOT RF locked (active)\n"
3629 "TRX is RF locked (turned off)\n")
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003630{
3631 int locked = atoi(argv[0]);
3632 struct gsm_bts_trx *trx = vty->index;
3633
3634 gsm_trx_lock_rf(trx, locked);
3635 return CMD_SUCCESS;
3636}
Harald Welte42581822009-08-08 16:12:58 +02003637
Harald Welte5258fc42009-03-28 19:07:53 +00003638/* per TS configuration */
3639DEFUN(cfg_ts,
3640 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003641 "timeslot <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003642 "Select a Timeslot to configure\n"
3643 "Timeslot number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003644{
3645 int ts_nr = atoi(argv[0]);
3646 struct gsm_bts_trx *trx = vty->index;
3647 struct gsm_bts_trx_ts *ts;
3648
3649 if (ts_nr >= TRX_NR_TS) {
3650 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
3651 TRX_NR_TS, VTY_NEWLINE);
3652 return CMD_WARNING;
3653 }
3654
3655 ts = &trx->ts[ts_nr];
3656
3657 vty->index = ts;
3658 vty->node = TS_NODE;
3659
3660 return CMD_SUCCESS;
3661}
3662
Harald Weltea6fd58e2009-08-07 00:25:23 +02003663DEFUN(cfg_ts_pchan,
3664 cfg_ts_pchan_cmd,
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003665 "phys_chan_config PCHAN", /* dynamically generated! */
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003666 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003667{
3668 struct gsm_bts_trx_ts *ts = vty->index;
3669 int pchanc;
3670
3671 pchanc = gsm_pchan_parse(argv[0]);
3672 if (pchanc < 0)
3673 return CMD_WARNING;
3674
3675 ts->pchan = pchanc;
3676
3677 return CMD_SUCCESS;
3678}
3679
3680/* used for backwards compatibility with old config files that still
3681 * have uppercase pchan type names */
3682DEFUN_HIDDEN(cfg_ts_pchan_compat,
3683 cfg_ts_pchan_compat_cmd,
Harald Weltea6fd58e2009-08-07 00:25:23 +02003684 "phys_chan_config PCHAN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003685 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003686{
3687 struct gsm_bts_trx_ts *ts = vty->index;
3688 int pchanc;
3689
3690 pchanc = gsm_pchan_parse(argv[0]);
3691 if (pchanc < 0)
3692 return CMD_WARNING;
3693
3694 ts->pchan = pchanc;
3695
3696 return CMD_SUCCESS;
3697}
3698
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003699
3700
Harald Welte135a6482011-05-30 12:09:13 +02003701DEFUN(cfg_ts_tsc,
3702 cfg_ts_tsc_cmd,
3703 "training_sequence_code <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003704 "Training Sequence Code of the Timeslot\n" "TSC\n")
Harald Welte135a6482011-05-30 12:09:13 +02003705{
3706 struct gsm_bts_trx_ts *ts = vty->index;
3707
Harald Welte903aaea2014-01-19 17:10:50 +01003708 if (!gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_MULTI_TSC)) {
3709 vty_out(vty, "%% This BTS does not support a TSC != BCC, "
3710 "falling back to BCC%s", VTY_NEWLINE);
3711 ts->tsc = -1;
3712 return CMD_WARNING;
3713 }
3714
Harald Welte135a6482011-05-30 12:09:13 +02003715 ts->tsc = atoi(argv[0]);
3716
3717 return CMD_SUCCESS;
3718}
3719
Harald Weltea39b0f22010-06-14 22:26:10 +02003720#define HOPPING_STR "Configure frequency hopping\n"
3721
3722DEFUN(cfg_ts_hopping,
3723 cfg_ts_hopping_cmd,
3724 "hopping enabled (0|1)",
3725 HOPPING_STR "Enable or disable frequency hopping\n"
3726 "Disable frequency hopping\n" "Enable frequency hopping\n")
3727{
3728 struct gsm_bts_trx_ts *ts = vty->index;
Harald Weltec2fb3d02010-06-14 22:47:37 +02003729 int enabled = atoi(argv[0]);
Harald Weltea39b0f22010-06-14 22:26:10 +02003730
Harald Weltec2fb3d02010-06-14 22:47:37 +02003731 if (enabled && !gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_HOPPING)) {
3732 vty_out(vty, "BTS model does not support hopping%s",
3733 VTY_NEWLINE);
3734 return CMD_WARNING;
3735 }
3736
3737 ts->hopping.enabled = enabled;
Harald Weltea39b0f22010-06-14 22:26:10 +02003738
3739 return CMD_SUCCESS;
3740}
3741
Harald Welte6e0cd042009-09-12 13:05:33 +02003742DEFUN(cfg_ts_hsn,
3743 cfg_ts_hsn_cmd,
Harald Weltea39b0f22010-06-14 22:26:10 +02003744 "hopping sequence-number <0-63>",
3745 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003746 "Which hopping sequence to use for this channel\n"
3747 "Hopping Sequence Number (HSN)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003748{
3749 struct gsm_bts_trx_ts *ts = vty->index;
3750
3751 ts->hopping.hsn = atoi(argv[0]);
3752
3753 return CMD_SUCCESS;
3754}
3755
3756DEFUN(cfg_ts_maio,
3757 cfg_ts_maio_cmd,
3758 "hopping maio <0-63>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003759 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003760 "Which hopping MAIO to use for this channel\n"
3761 "Mobile Allocation Index Offset (MAIO)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003762{
3763 struct gsm_bts_trx_ts *ts = vty->index;
3764
3765 ts->hopping.maio = atoi(argv[0]);
3766
3767 return CMD_SUCCESS;
3768}
3769
3770DEFUN(cfg_ts_arfcn_add,
3771 cfg_ts_arfcn_add_cmd,
3772 "hopping arfcn add <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003773 HOPPING_STR "Configure hopping ARFCN list\n"
3774 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003775{
3776 struct gsm_bts_trx_ts *ts = vty->index;
3777 int arfcn = atoi(argv[0]);
3778
Harald Weltea39b0f22010-06-14 22:26:10 +02003779 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
3780
Harald Welte6e0cd042009-09-12 13:05:33 +02003781 return CMD_SUCCESS;
3782}
3783
3784DEFUN(cfg_ts_arfcn_del,
3785 cfg_ts_arfcn_del_cmd,
3786 "hopping arfcn del <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003787 HOPPING_STR "Configure hopping ARFCN list\n"
3788 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003789{
3790 struct gsm_bts_trx_ts *ts = vty->index;
3791 int arfcn = atoi(argv[0]);
3792
Harald Weltea39b0f22010-06-14 22:26:10 +02003793 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
3794
Harald Welte6e0cd042009-09-12 13:05:33 +02003795 return CMD_SUCCESS;
3796}
3797
Harald Weltea6fd58e2009-08-07 00:25:23 +02003798DEFUN(cfg_ts_e1_subslot,
3799 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003800 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003801 "E1/T1 channel connected to this on-air timeslot\n"
3802 "E1/T1 channel connected to this on-air timeslot\n"
3803 "E1/T1 line connected to this on-air timeslot\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02003804 "E1/T1 timeslot connected to this on-air timeslot\n"
3805 "E1/T1 timeslot connected to this on-air timeslot\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02003806 "E1/T1 sub-slot connected to this on-air timeslot\n"
3807 "E1/T1 sub-slot 0 connected to this on-air timeslot\n"
3808 "E1/T1 sub-slot 1 connected to this on-air timeslot\n"
3809 "E1/T1 sub-slot 2 connected to this on-air timeslot\n"
3810 "E1/T1 sub-slot 3 connected to this on-air timeslot\n"
3811 "Full E1/T1 timeslot connected to this on-air timeslot\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003812{
3813 struct gsm_bts_trx_ts *ts = vty->index;
3814
Harald Welte42581822009-08-08 16:12:58 +02003815 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003816
3817 return CMD_SUCCESS;
3818}
Harald Welte5258fc42009-03-28 19:07:53 +00003819
Harald Welte4f10c252010-05-16 21:47:13 +02003820void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
3821{
3822 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003823 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_TOTAL].current,
3824 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_NO_CHANNEL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003825 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003826 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003827 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RF_FAIL].current,
3828 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RLL_ERR].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003829 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003830 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003831 net->bsc_ctrs->ctr[BSC_CTR_PAGING_ATTEMPTED].current,
3832 net->bsc_ctrs->ctr[BSC_CTR_PAGING_COMPLETED].current,
3833 net->bsc_ctrs->ctr[BSC_CTR_PAGING_EXPIRED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003834 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003835 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003836 net->bsc_ctrs->ctr[BSC_CTR_BTS_OML_FAIL].current,
3837 net->bsc_ctrs->ctr[BSC_CTR_BTS_RSL_FAIL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003838 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003839}
3840
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003841DEFUN(drop_bts,
3842 drop_bts_cmd,
Holger Hans Peter Freyther0586b0f2010-04-11 12:46:45 +02003843 "drop bts connection <0-65535> (oml|rsl)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003844 "Debug/Simulation command to drop Abis/IP BTS\n"
3845 "Debug/Simulation command to drop Abis/IP BTS\n"
3846 "Debug/Simulation command to drop Abis/IP BTS\n"
3847 "BTS NR\n" "Drop OML Connection\n" "Drop RSL Connection\n")
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003848{
3849 struct gsm_network *gsmnet;
3850 struct gsm_bts_trx *trx;
3851 struct gsm_bts *bts;
3852 unsigned int bts_nr;
3853
3854 gsmnet = gsmnet_from_vty(vty);
3855
3856 bts_nr = atoi(argv[0]);
3857 if (bts_nr >= gsmnet->num_bts) {
3858 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3859 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3860 return CMD_WARNING;
3861 }
3862
3863 bts = gsm_bts_num(gsmnet, bts_nr);
3864 if (!bts) {
3865 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3866 return CMD_WARNING;
3867 }
3868
3869 if (!is_ipaccess_bts(bts)) {
3870 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
3871 return CMD_WARNING;
3872 }
3873
3874
3875 /* close all connections */
3876 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003877 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003878 } else if (strcmp(argv[1], "rsl") == 0) {
3879 /* close all rsl connections */
3880 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003881 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003882 }
3883 } else {
3884 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
3885 return CMD_WARNING;
3886 }
3887
3888 return CMD_SUCCESS;
3889}
3890
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01003891DEFUN(restart_bts, restart_bts_cmd,
3892 "restart-bts <0-65535>",
3893 "Restart ip.access nanoBTS through OML\n"
3894 "BTS Number\n")
3895{
3896 struct gsm_network *gsmnet;
3897 struct gsm_bts_trx *trx;
3898 struct gsm_bts *bts;
3899 unsigned int bts_nr;
3900
3901 gsmnet = gsmnet_from_vty(vty);
3902
3903 bts_nr = atoi(argv[0]);
3904 if (bts_nr >= gsmnet->num_bts) {
3905 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3906 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3907 return CMD_WARNING;
3908 }
3909
3910 bts = gsm_bts_num(gsmnet, bts_nr);
3911 if (!bts) {
3912 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3913 return CMD_WARNING;
3914 }
3915
3916 if (!is_ipaccess_bts(bts) || is_sysmobts_v2(bts)) {
3917 vty_out(vty, "This command only works for ipaccess nanoBTS.%s",
3918 VTY_NEWLINE);
3919 return CMD_WARNING;
3920 }
3921
3922 /* go from last TRX to c0 */
3923 llist_for_each_entry_reverse(trx, &bts->trx_list, list)
3924 abis_nm_ipaccess_restart(trx);
3925
3926 return CMD_SUCCESS;
3927}
3928
Harald Welte30f1f372014-12-28 15:00:45 +01003929DEFUN(smscb_cmd, smscb_cmd_cmd,
3930 "bts <0-255> smscb-command <1-4> HEXSTRING",
3931 "BTS related commands\n" "BTS Number\n"
3932 "SMS Cell Broadcast\n" "Last Valid Block\n"
3933 "Hex Encoded SMSCB message (up to 88 octets)\n")
3934{
3935 struct gsm_bts *bts;
3936 int bts_nr = atoi(argv[0]);
3937 int last_block = atoi(argv[1]);
3938 struct rsl_ie_cb_cmd_type cb_cmd;
3939 uint8_t buf[88];
3940 int rc;
3941
3942 bts = gsm_bts_num(bsc_gsmnet, bts_nr);
3943 if (!bts) {
3944 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3945 return CMD_WARNING;
3946 }
3947 rc = osmo_hexparse(argv[2], buf, sizeof(buf));
3948 if (rc < 0 || rc > sizeof(buf)) {
3949 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
3950 return CMD_WARNING;
3951 }
3952
3953 cb_cmd.spare = 0;
3954 cb_cmd.def_bcast = 0;
3955 cb_cmd.command = RSL_CB_CMD_TYPE_NORMAL;
3956
3957 switch (last_block) {
3958 case 1:
3959 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_1;
3960 break;
3961 case 2:
3962 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_2;
3963 break;
3964 case 3:
3965 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_3;
3966 break;
3967 case 4:
3968 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_4;
3969 break;
3970 }
3971
3972 rsl_sms_cb_command(bts, RSL_CHAN_SDCCH4_ACCH, cb_cmd, buf, rc);
3973
3974 return CMD_SUCCESS;
3975}
3976
3977
Harald Welted0d2b0b2010-12-23 13:18:07 +01003978DEFUN(pdch_act, pdch_act_cmd,
3979 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
3980 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3981 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
3982 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
3983 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
3984{
3985 struct gsm_bts *bts;
3986 struct gsm_bts_trx *trx;
3987 struct gsm_bts_trx_ts *ts;
3988 int bts_nr = atoi(argv[0]);
3989 int trx_nr = atoi(argv[1]);
3990 int ts_nr = atoi(argv[2]);
3991 int activate;
3992
3993 bts = gsm_bts_num(bsc_gsmnet, bts_nr);
3994 if (!bts) {
3995 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3996 return CMD_WARNING;
3997 }
3998
3999 if (!is_ipaccess_bts(bts)) {
4000 vty_out(vty, "%% This command only works for ipaccess BTS%s",
4001 VTY_NEWLINE);
4002 return CMD_WARNING;
4003 }
4004
4005 trx = gsm_bts_trx_num(bts, trx_nr);
4006 if (!trx) {
4007 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
4008 return CMD_WARNING;
4009 }
4010
4011 ts = &trx->ts[ts_nr];
4012 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
4013 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
4014 "mode%s", ts_nr, VTY_NEWLINE);
4015 return CMD_WARNING;
4016 }
4017
4018 if (!strcmp(argv[3], "activate"))
4019 activate = 1;
4020 else
4021 activate = 0;
4022
4023 rsl_ipacc_pdch_activate(ts, activate);
4024
4025 return CMD_SUCCESS;
4026
4027}
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004028
Harald Weltedcccb182010-05-16 20:52:23 +02004029extern int bsc_vty_init_extra(void);
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02004030
Neels Hofmeyr43d86bf2016-05-10 13:40:19 +02004031int bsc_vty_init(const struct log_info *cat, struct gsm_network *network)
Harald Welte68628e82009-03-10 12:17:57 +00004032{
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004033 cfg_ts_pchan_cmd.string =
4034 vty_cmd_string_from_valstr(tall_bsc_ctx,
4035 gsm_pchant_names,
4036 "phys_chan_config (", "|", ")",
4037 VTY_DO_LOWER);
4038 cfg_ts_pchan_cmd.doc =
4039 vty_cmd_string_from_valstr(tall_bsc_ctx,
4040 gsm_pchant_descs,
4041 "Physical Channel Combination\n",
4042 "\n", "", 0);
4043
Harald Weltee555c2b2012-08-17 13:02:12 +02004044 cfg_bts_type_cmd.string =
4045 vty_cmd_string_from_valstr(tall_bsc_ctx,
4046 bts_type_names,
4047 "type (", "|", ")",
4048 VTY_DO_LOWER);
4049 cfg_bts_type_cmd.doc =
4050 vty_cmd_string_from_valstr(tall_bsc_ctx,
4051 bts_type_descs,
4052 "BTS Vendor/Type\n",
4053 "\n", "", 0);
4054
4055
Harald Welteb4d5b172010-05-12 16:10:35 +00004056 install_element_ve(&show_net_cmd);
4057 install_element_ve(&show_bts_cmd);
4058 install_element_ve(&show_trx_cmd);
4059 install_element_ve(&show_ts_cmd);
4060 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08004061 install_element_ve(&show_lchan_summary_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00004062
Harald Welteb4d5b172010-05-12 16:10:35 +00004063 install_element_ve(&show_paging_cmd);
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01004064 install_element_ve(&show_paging_group_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00004065
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01004066 logging_vty_add_cmds(cat);
Jacob Erlbeck64630cc2015-10-26 16:25:37 +01004067 osmo_stats_vty_add_cmds();
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01004068
Harald Welte5013b2a2009-08-07 13:29:14 +02004069 install_element(CONFIG_NODE, &cfg_net_cmd);
4070 install_node(&net_node, config_write_net);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004071 vty_install_default(GSMNET_NODE);
Harald Welte42581822009-08-08 16:12:58 +02004072 install_element(GSMNET_NODE, &cfg_net_ncc_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02004073 install_element(GSMNET_NODE, &cfg_net_mnc_cmd);
4074 install_element(GSMNET_NODE, &cfg_net_name_short_cmd);
4075 install_element(GSMNET_NODE, &cfg_net_name_long_cmd);
Harald Welte (local)69de3972009-08-12 14:42:23 +02004076 install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd);
Maxddee01f2016-05-24 14:23:27 +02004077 install_element(GSMNET_NODE, &cfg_net_authorize_regexp_cmd);
Harald Welte1085c092009-11-18 20:33:19 +01004078 install_element(GSMNET_NODE, &cfg_net_reject_cause_cmd);
Harald Welte4381cfe2009-08-30 15:47:06 +09004079 install_element(GSMNET_NODE, &cfg_net_encryption_cmd);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01004080 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Welteeab84a12009-12-13 10:53:12 +01004081 install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd);
Harald Welte3d23db42009-12-14 17:49:15 +01004082 install_element(GSMNET_NODE, &cfg_net_mm_info_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01004083 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-12-21 16:51:50 +01004084 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
4085 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
4086 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
4087 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
4088 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
4089 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01004090 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01004091 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
4092 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
4093 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
4094 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
4095 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
4096 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
4097 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
4098 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
4099 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltec9f499f2010-12-23 22:53:50 +01004100 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01004101 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08004102 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +01004103 install_element(GSMNET_NODE, &cfg_net_subscr_keep_cmd);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08004104 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02004105
4106 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02004107 install_node(&bts_node, config_write_bts);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004108 vty_install_default(BTS_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004109 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004110 install_element(BTS_NODE, &cfg_description_cmd);
4111 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02004112 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02004113 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Maxc08ee712016-05-11 12:45:13 +02004114 install_element(BTS_NODE, &cfg_bts_dtxu_cmd);
4115 install_element(BTS_NODE, &cfg_bts_dtxd_cmd);
4116 install_element(BTS_NODE, &cfg_bts_no_dtxu_cmd);
4117 install_element(BTS_NODE, &cfg_bts_no_dtxd_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00004118 install_element(BTS_NODE, &cfg_bts_lac_cmd);
4119 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004120 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00004121 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8b291802013-03-12 13:57:05 +01004122 install_element(BTS_NODE, &cfg_bts_rsl_ip_cmd);
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01004123 install_element(BTS_NODE, &cfg_bts_timezone_cmd);
Jacob Erlbeck946d1412013-09-17 13:59:29 +02004124 install_element(BTS_NODE, &cfg_bts_timezone_dst_cmd);
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01004125 install_element(BTS_NODE, &cfg_bts_no_timezone_cmd);
Sylvain Munautc9519462011-10-17 14:04:55 +02004126 install_element(BTS_NODE, &cfg_bts_nokia_site_skip_reset_cmd);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01004127 install_element(BTS_NODE, &cfg_bts_nokia_site_no_loc_rel_cnf_cmd);
Sipos Csaba56e17662015-02-07 13:27:36 +01004128 install_element(BTS_NODE, &cfg_bts_nokia_site_bts_reset_timer_cnf_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02004129 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004130 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
4131 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte7a8fa412009-08-10 13:48:16 +02004132 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01004133 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
4134 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02004135 install_element(BTS_NODE, &cfg_bts_chan_desc_att_cmd);
4136 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_pa_mfrms_cmd);
4137 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_ag_blks_res_cmd);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08004138 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
4139 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02004140 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08004141 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Ivan Kluchnikov67920592013-09-16 13:13:04 +04004142 install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02004143 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02004144 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02004145 install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
Harald Welte73225282009-12-12 18:17:25 +01004146 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
4147 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaute0b06b02010-11-28 18:17:28 +01004148 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
4149 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
4150 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
4151 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
4152 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
4153 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01004154 install_element(BTS_NODE, &cfg_bts_radio_link_timeout_cmd);
Harald Welte4511d892010-04-18 15:51:20 +02004155 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
bhargava350533c2016-07-21 11:14:34 +05304156 install_element(BTS_NODE, &cfg_bts_gprs_11bit_rach_support_for_egprs_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02004157 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004158 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01004159 install_element(BTS_NODE, &cfg_bts_gprs_net_ctrl_ord_cmd);
Max292ec582016-07-28 11:55:37 +02004160 install_element(BTS_NODE, &cfg_bts_gprs_ctrl_ack_cmd);
4161 install_element(BTS_NODE, &cfg_no_bts_gprs_ctrl_ack_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004162 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02004163 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08004164 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004165 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-03-14 23:30:30 +08004166 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
4167 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
4168 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08004169 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welte9fbff4a2010-07-30 11:50:09 +02004170 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
4171 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welte32c09622011-01-11 23:44:56 +01004172 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
4173 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Welte64c07d22011-02-15 11:43:27 +01004174 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Max59a1bf32016-04-15 16:04:46 +02004175 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_add_cmd);
4176 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_del_cmd);
Max26679e02016-04-20 15:57:13 +02004177 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_add_cmd);
4178 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_del_cmd);
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02004179 install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
4180 install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01004181 install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
4182 install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
Andreas Eversberga83d5112013-12-07 18:32:28 +01004183 install_element(BTS_NODE, &cfg_bts_codec0_cmd);
4184 install_element(BTS_NODE, &cfg_bts_codec1_cmd);
4185 install_element(BTS_NODE, &cfg_bts_codec2_cmd);
4186 install_element(BTS_NODE, &cfg_bts_codec3_cmd);
4187 install_element(BTS_NODE, &cfg_bts_codec4_cmd);
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01004188 install_element(BTS_NODE, &cfg_bts_depends_on_cmd);
4189 install_element(BTS_NODE, &cfg_bts_no_depends_on_cmd);
Andreas Eversberg73266522014-01-19 11:47:44 +01004190 install_element(BTS_NODE, &cfg_bts_amr_fr_modes1_cmd);
4191 install_element(BTS_NODE, &cfg_bts_amr_fr_modes2_cmd);
4192 install_element(BTS_NODE, &cfg_bts_amr_fr_modes3_cmd);
4193 install_element(BTS_NODE, &cfg_bts_amr_fr_modes4_cmd);
4194 install_element(BTS_NODE, &cfg_bts_amr_fr_thres1_cmd);
4195 install_element(BTS_NODE, &cfg_bts_amr_fr_thres2_cmd);
4196 install_element(BTS_NODE, &cfg_bts_amr_fr_thres3_cmd);
4197 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst1_cmd);
4198 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst2_cmd);
4199 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst3_cmd);
4200 install_element(BTS_NODE, &cfg_bts_amr_fr_start_mode_cmd);
4201 install_element(BTS_NODE, &cfg_bts_amr_hr_modes1_cmd);
4202 install_element(BTS_NODE, &cfg_bts_amr_hr_modes2_cmd);
4203 install_element(BTS_NODE, &cfg_bts_amr_hr_modes3_cmd);
4204 install_element(BTS_NODE, &cfg_bts_amr_hr_modes4_cmd);
4205 install_element(BTS_NODE, &cfg_bts_amr_hr_thres1_cmd);
4206 install_element(BTS_NODE, &cfg_bts_amr_hr_thres2_cmd);
4207 install_element(BTS_NODE, &cfg_bts_amr_hr_thres3_cmd);
4208 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst1_cmd);
4209 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst2_cmd);
4210 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst3_cmd);
4211 install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004212
Harald Welte5258fc42009-03-28 19:07:53 +00004213 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004214 install_node(&trx_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004215 vty_install_default(TRX_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004216 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004217 install_element(TRX_NODE, &cfg_description_cmd);
4218 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)7b37d972009-12-27 20:56:38 +01004219 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02004220 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004221 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
4222 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01004223 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004224
Harald Welte5258fc42009-03-28 19:07:53 +00004225 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004226 install_node(&ts_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004227 vty_install_default(TS_NODE);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004228 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004229 install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);
Harald Welte135a6482011-05-30 12:09:13 +02004230 install_element(TS_NODE, &cfg_ts_tsc_cmd);
Harald Weltea39b0f22010-06-14 22:26:10 +02004231 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte6e0cd042009-09-12 13:05:33 +02004232 install_element(TS_NODE, &cfg_ts_hsn_cmd);
4233 install_element(TS_NODE, &cfg_ts_maio_cmd);
4234 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
4235 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004236 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004237
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004238 install_element(ENABLE_NODE, &drop_bts_cmd);
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01004239 install_element(ENABLE_NODE, &restart_bts_cmd);
Harald Welted0d2b0b2010-12-23 13:18:07 +01004240 install_element(ENABLE_NODE, &pdch_act_cmd);
Harald Welte30f1f372014-12-28 15:00:45 +01004241 install_element(ENABLE_NODE, &smscb_cmd_cmd);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004242
Harald Welte81c9b9c2010-05-31 16:40:40 +02004243 abis_nm_vty_init();
Harald Weltee1d5eca2011-02-12 14:42:59 +01004244 abis_om2k_vty_init();
Harald Welte3016d9f2011-02-05 13:54:41 +01004245 e1inp_vty_init();
Harald Welte81c9b9c2010-05-31 16:40:40 +02004246
Harald Weltedcccb182010-05-16 20:52:23 +02004247 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00004248
Harald Welte68628e82009-03-10 12:17:57 +00004249 return 0;
4250}