blob: 9ed19aa1f80daa349254217799d77cab62091775 [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));
Neels Hofmeyr2afffd52016-09-25 17:01:20 +0200332 bts_chan_load(&pl, bts);
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
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001081/* call vty_out() to print a string like " as TCH/H" for dynamic timeslots.
1082 * Don't do anything if the ts is not dynamic. */
1083static void vty_out_dyn_ts_status(struct vty *vty, struct gsm_bts_trx_ts *ts)
1084{
1085 switch (ts->pchan) {
1086 case GSM_PCHAN_TCH_F_TCH_H_PDCH:
1087 if (ts->dyn.pchan_is == ts->dyn.pchan_want)
1088 vty_out(vty, " as %s",
1089 gsm_pchan_name(ts->dyn.pchan_is));
1090 else
1091 vty_out(vty, " switching %s -> %s",
1092 gsm_pchan_name(ts->dyn.pchan_is),
1093 gsm_pchan_name(ts->dyn.pchan_want));
1094 break;
1095 case GSM_PCHAN_TCH_F_PDCH:
1096 if ((ts->flags & TS_F_PDCH_PENDING_MASK) == 0)
1097 vty_out(vty, " as %s",
1098 (ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
1099 : "TCH/F");
1100 else
1101 vty_out(vty, " switching %s -> %s",
1102 (ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
1103 : "TCH/F",
1104 (ts->flags & TS_F_PDCH_ACT_PENDING)? "PDCH"
1105 : "TCH/F");
1106 break;
1107 default:
1108 /* no dyn ts */
1109 break;
1110 }
1111}
1112
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001113static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte68628e82009-03-10 12:17:57 +00001114{
Harald Welte8387a492009-12-22 21:43:14 +01001115 int idx;
1116
Harald Welte85bded82010-12-24 12:22:34 +01001117 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",
1118 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
1119 lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001120 /* show dyn TS details, if applicable */
1121 switch (lchan->ts->pchan) {
1122 case GSM_PCHAN_TCH_F_TCH_H_PDCH:
1123 vty_out(vty, " Osmocom Dyn TS:");
1124 vty_out_dyn_ts_status(vty, lchan->ts);
1125 vty_out(vty, VTY_NEWLINE);
1126 break;
1127 case GSM_PCHAN_TCH_F_PDCH:
1128 vty_out(vty, " IPACC Dyn PDCH TS:");
1129 vty_out_dyn_ts_status(vty, lchan->ts);
1130 vty_out(vty, VTY_NEWLINE);
1131 break;
1132 default:
1133 /* no dyn ts */
1134 break;
1135 }
Holger Hans Peter Freyther454140e2014-12-28 12:08:28 +01001136 vty_out(vty, " Connection: %u, State: %s%s%s%s",
Holger Hans Peter Freyther40494552010-06-28 17:09:29 +08001137 lchan->conn ? 1: 0,
Holger Hans Peter Freyther454140e2014-12-28 12:08:28 +01001138 gsm_lchans_name(lchan->state),
1139 lchan->state == LCHAN_S_BROKEN ? " Error reason: " : "",
1140 lchan->state == LCHAN_S_BROKEN ? lchan->broken_reason : "",
1141 VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +01001142 vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s",
1143 lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
1144 - lchan->bs_power*2,
1145 ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),
1146 VTY_NEWLINE);
Harald Welte0a8cf322015-12-05 17:22:49 +01001147 vty_out(vty, " Channel Mode / Codec: %s%s",
1148 get_value_string(gsm48_cmode_names, lchan->tch_mode),
1149 VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +08001150 if (lchan->conn && lchan->conn->subscr) {
Harald Welte68628e82009-03-10 12:17:57 +00001151 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +08001152 subscr_dump_vty(vty, lchan->conn->subscr);
Harald Welte68628e82009-03-10 12:17:57 +00001153 } else
1154 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte2c828992009-12-02 01:56:49 +05301155 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
1156 struct in_addr ia;
Holger Hans Peter Freyther54fa7992010-04-07 15:39:16 +02001157 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte2c828992009-12-02 01:56:49 +05301158 vty_out(vty, " Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",
1159 inet_ntoa(ia), lchan->abis_ip.bound_port,
1160 lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,
1161 VTY_NEWLINE);
1162 }
Harald Welte8387a492009-12-22 21:43:14 +01001163
1164 /* we want to report the last measurement report */
1165 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1166 lchan->meas_rep_idx, 1);
1167 meas_rep_dump_vty(vty, &lchan->meas_rep[idx], " ");
Harald Welte68628e82009-03-10 12:17:57 +00001168}
1169
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001170static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
1171{
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +08001172 struct gsm_meas_rep *mr;
1173 int idx;
1174
1175 /* we want to report the last measurement report */
1176 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1177 lchan->meas_rep_idx, 1);
1178 mr = &lchan->meas_rep[idx];
1179
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001180 vty_out(vty, "BTS %u, TRX %u, Timeslot %u %s",
Harald Welte85bded82010-12-24 12:22:34 +01001181 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001182 gsm_pchan_name(lchan->ts->pchan));
1183 vty_out_dyn_ts_status(vty, lchan->ts);
1184 vty_out(vty, ", Lchan %u, Type %s, State %s - "
1185 "L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
Neels Hofmeyrefedf802016-06-14 01:31:38 +02001186 lchan->nr,
1187 gsm_lchant_name(lchan->type), gsm_lchans_name(lchan->state),
1188 mr->ms_l1.pwr,
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +08001189 rxlev2dbm(mr->dl.full.rx_lev),
1190 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001191 VTY_NEWLINE);
1192}
1193
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001194
1195static int dump_lchan_trx_ts(struct gsm_bts_trx_ts *ts, struct vty *vty,
1196 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1197{
1198 int lchan_nr;
1199 for (lchan_nr = 0; lchan_nr < TS_MAX_LCHAN; lchan_nr++) {
1200 struct gsm_lchan *lchan = &ts->lchan[lchan_nr];
1201 if ((lchan->type == GSM_LCHAN_NONE) && (lchan->state == LCHAN_S_NONE))
1202 continue;
1203 dump_cb(vty, lchan);
1204 }
1205
1206 return CMD_SUCCESS;
1207}
1208
1209static int dump_lchan_trx(struct gsm_bts_trx *trx, struct vty *vty,
1210 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1211{
1212 int ts_nr;
1213
1214 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
1215 struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
1216 dump_lchan_trx_ts(ts, vty, dump_cb);
1217 }
1218
1219 return CMD_SUCCESS;
1220}
1221
1222static int dump_lchan_bts(struct gsm_bts *bts, struct vty *vty,
1223 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1224{
1225 int trx_nr;
1226
1227 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
1228 struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, trx_nr);
1229 dump_lchan_trx(trx, vty, dump_cb);
1230 }
1231
1232 return CMD_SUCCESS;
1233}
1234
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001235static int lchan_summary(struct vty *vty, int argc, const char **argv,
1236 void (*dump_cb)(struct vty *, struct gsm_lchan *))
Harald Welte68628e82009-03-10 12:17:57 +00001237{
Harald Weltedcccb182010-05-16 20:52:23 +02001238 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +00001239 struct gsm_bts *bts;
1240 struct gsm_bts_trx *trx;
1241 struct gsm_bts_trx_ts *ts;
1242 struct gsm_lchan *lchan;
1243 int bts_nr, trx_nr, ts_nr, lchan_nr;
1244
1245 if (argc >= 1) {
1246 /* use the BTS number that the user has specified */
1247 bts_nr = atoi(argv[0]);
1248 if (bts_nr >= net->num_bts) {
1249 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1250 VTY_NEWLINE);
1251 return CMD_WARNING;
1252 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001253 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001254
1255 if (argc == 1)
1256 return dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001257 }
1258 if (argc >= 2) {
1259 trx_nr = atoi(argv[1]);
1260 if (trx_nr >= bts->num_trx) {
1261 vty_out(vty, "%% can't find TRX %s%s", argv[1],
1262 VTY_NEWLINE);
1263 return CMD_WARNING;
1264 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001265 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001266
1267 if (argc == 2)
1268 return dump_lchan_trx(trx, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001269 }
1270 if (argc >= 3) {
1271 ts_nr = atoi(argv[2]);
1272 if (ts_nr >= TRX_NR_TS) {
1273 vty_out(vty, "%% can't find TS %s%s", argv[2],
1274 VTY_NEWLINE);
1275 return CMD_WARNING;
1276 }
1277 ts = &trx->ts[ts_nr];
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001278
1279 if (argc == 3)
1280 return dump_lchan_trx_ts(ts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001281 }
1282 if (argc >= 4) {
1283 lchan_nr = atoi(argv[3]);
1284 if (lchan_nr >= TS_MAX_LCHAN) {
1285 vty_out(vty, "%% can't find LCHAN %s%s", argv[3],
1286 VTY_NEWLINE);
1287 return CMD_WARNING;
1288 }
1289 lchan = &ts->lchan[lchan_nr];
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001290 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +00001291 return CMD_SUCCESS;
1292 }
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001293
1294
Harald Welte68628e82009-03-10 12:17:57 +00001295 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001296 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001297 dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001298 }
1299
1300 return CMD_SUCCESS;
1301}
1302
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001303
1304DEFUN(show_lchan,
1305 show_lchan_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001306 "show lchan [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001307 SHOW_STR "Display information about a logical channel\n"
1308 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001309 LCHAN_NR_STR)
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001310
1311{
1312 return lchan_summary(vty, argc, argv, lchan_dump_full_vty);
1313}
1314
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001315DEFUN(show_lchan_summary,
1316 show_lchan_summary_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001317 "show lchan summary [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001318 SHOW_STR "Display information about a logical channel\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001319 "Short summary\n"
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001320 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001321 LCHAN_NR_STR)
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001322{
1323 return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
1324}
1325
Harald Weltebe4b7302009-05-23 16:59:33 +00001326static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
Harald Weltef5025b62009-03-28 16:55:11 +00001327{
1328 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
1329 subscr_dump_vty(vty, pag->subscr);
1330}
1331
Harald Weltebe4b7302009-05-23 16:59:33 +00001332static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
Harald Weltef5025b62009-03-28 16:55:11 +00001333{
1334 struct gsm_paging_request *pag;
1335
Holger Hans Peter Freyther9b5192b2013-03-03 11:03:17 +01001336 if (!bts->paging.bts)
1337 return;
1338
Harald Weltef5025b62009-03-28 16:55:11 +00001339 llist_for_each_entry(pag, &bts->paging.pending_requests, entry)
1340 paging_dump_vty(vty, pag);
1341}
1342
1343DEFUN(show_paging,
1344 show_paging_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001345 "show paging [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +02001346 SHOW_STR "Display information about paging reuqests of a BTS\n"
1347 "BTS Number\n")
Harald Weltef5025b62009-03-28 16:55:11 +00001348{
Harald Weltedcccb182010-05-16 20:52:23 +02001349 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Weltef5025b62009-03-28 16:55:11 +00001350 struct gsm_bts *bts;
1351 int bts_nr;
1352
1353 if (argc >= 1) {
1354 /* use the BTS number that the user has specified */
1355 bts_nr = atoi(argv[0]);
1356 if (bts_nr >= net->num_bts) {
1357 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1358 VTY_NEWLINE);
1359 return CMD_WARNING;
1360 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001361 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001362 bts_paging_dump_vty(vty, bts);
1363
1364 return CMD_SUCCESS;
1365 }
1366 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001367 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001368 bts_paging_dump_vty(vty, bts);
1369 }
1370
1371 return CMD_SUCCESS;
1372}
1373
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01001374DEFUN(show_paging_group,
1375 show_paging_group_cmd,
1376 "show paging-group <0-255> IMSI",
1377 SHOW_STR "Display the paging group\n"
1378 "BTS Number\n" "IMSI\n")
1379{
1380 struct gsm_network *net = gsmnet_from_vty(vty);
1381 struct gsm_bts *bts;
1382 unsigned int page_group;
1383 int bts_nr = atoi(argv[0]);
1384
1385 if (bts_nr >= net->num_bts) {
1386 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1387 return CMD_WARNING;
1388 }
1389
1390 bts = gsm_bts_num(net, bts_nr);
1391 if (!bts) {
1392 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1393 return CMD_WARNING;
1394 }
1395
1396 page_group = gsm0502_calc_paging_group(&bts->si_common.chan_desc,
1397 str_to_imsi(argv[1]));
1398 vty_out(vty, "%%Paging group for IMSI %" PRIu64 " on BTS #%d is %u%s",
1399 str_to_imsi(argv[1]), bts->nr,
1400 page_group, VTY_NEWLINE);
1401 return CMD_SUCCESS;
1402}
1403
Harald Welte5013b2a2009-08-07 13:29:14 +02001404DEFUN(cfg_net,
1405 cfg_net_cmd,
Harald Welte8f0ed552010-05-11 21:53:49 +02001406 "network", NETWORK_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001407{
Harald Weltedcccb182010-05-16 20:52:23 +02001408 vty->index = gsmnet_from_vty(vty);
Harald Welte5013b2a2009-08-07 13:29:14 +02001409 vty->node = GSMNET_NODE;
1410
1411 return CMD_SUCCESS;
1412}
1413
Harald Welte5013b2a2009-08-07 13:29:14 +02001414DEFUN(cfg_net_ncc,
1415 cfg_net_ncc_cmd,
1416 "network country code <1-999>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001417 "Set the GSM network country code\n"
1418 "Country commands\n"
1419 CODE_CMD_STR
1420 "Network Country Code to use\n")
Harald Welte5013b2a2009-08-07 13:29:14 +02001421{
Harald Weltedcccb182010-05-16 20:52:23 +02001422 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1423
Harald Welte5013b2a2009-08-07 13:29:14 +02001424 gsmnet->country_code = atoi(argv[0]);
1425
1426 return CMD_SUCCESS;
1427}
1428
1429DEFUN(cfg_net_mnc,
1430 cfg_net_mnc_cmd,
Dieter Spaar402cced2011-07-27 23:43:56 +02001431 "mobile network code <0-999>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001432 "Set the GSM mobile network code\n"
1433 "Network Commands\n"
1434 CODE_CMD_STR
1435 "Mobile Network Code to use\n")
Harald Welte5013b2a2009-08-07 13:29:14 +02001436{
Harald Weltedcccb182010-05-16 20:52:23 +02001437 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1438
Harald Welte5013b2a2009-08-07 13:29:14 +02001439 gsmnet->network_code = atoi(argv[0]);
1440
1441 return CMD_SUCCESS;
1442}
1443
1444DEFUN(cfg_net_name_short,
1445 cfg_net_name_short_cmd,
1446 "short name NAME",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001447 "Set the short GSM network name\n" NAME_CMD_STR NAME_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001448{
Harald Weltedcccb182010-05-16 20:52:23 +02001449 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1450
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +02001451 bsc_replace_string(gsmnet, &gsmnet->name_short, argv[0]);
Harald Welte5013b2a2009-08-07 13:29:14 +02001452 return CMD_SUCCESS;
1453}
1454
1455DEFUN(cfg_net_name_long,
1456 cfg_net_name_long_cmd,
1457 "long name NAME",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001458 "Set the long GSM network name\n" NAME_CMD_STR NAME_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001459{
Harald Weltedcccb182010-05-16 20:52:23 +02001460 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1461
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +02001462 bsc_replace_string(gsmnet, &gsmnet->name_long, argv[0]);
Harald Welte5013b2a2009-08-07 13:29:14 +02001463 return CMD_SUCCESS;
1464}
Harald Welte40f82892009-05-23 17:31:39 +00001465
Harald Welte (local)69de3972009-08-12 14:42:23 +02001466DEFUN(cfg_net_auth_policy,
1467 cfg_net_auth_policy_cmd,
Maxddee01f2016-05-24 14:23:27 +02001468 "auth policy (closed|accept-all|regexp|token)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001469 "Authentication (not cryptographic)\n"
1470 "Set the GSM network authentication policy\n"
1471 "Require the MS to be activated in HLR\n"
1472 "Accept all MS, whether in HLR or not\n"
Maxddee01f2016-05-24 14:23:27 +02001473 "Use regular expression for IMSI authorization decision\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001474 "Use SMS-token based authentication\n")
Harald Welte (local)69de3972009-08-12 14:42:23 +02001475{
1476 enum gsm_auth_policy policy = gsm_auth_policy_parse(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001477 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte (local)69de3972009-08-12 14:42:23 +02001478
1479 gsmnet->auth_policy = policy;
1480
1481 return CMD_SUCCESS;
1482}
1483
Maxddee01f2016-05-24 14:23:27 +02001484DEFUN(cfg_net_authorize_regexp, cfg_net_authorize_regexp_cmd,
1485 "authorized-regexp REGEXP",
1486 "Set regexp for IMSI which will be used for authorization decision\n"
1487 "Regular expression, IMSIs matching it are allowed to use the network\n")
1488{
1489 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1490 if (gsm_parse_reg(gsmnet, &gsmnet->authorized_regexp,
1491 &gsmnet->authorized_reg_str, argc, argv) != 0) {
1492 vty_out(vty, "%%Failed to parse the authorized-regexp: '%s'%s",
1493 argv[0], VTY_NEWLINE);
1494 return CMD_WARNING;
1495 }
1496
1497 return CMD_SUCCESS;
1498}
1499
Harald Welte1085c092009-11-18 20:33:19 +01001500DEFUN(cfg_net_reject_cause,
1501 cfg_net_reject_cause_cmd,
1502 "location updating reject cause <2-111>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001503 "Set the reject cause of location updating reject\n"
1504 "Set the reject cause of location updating reject\n"
1505 "Set the reject cause of location updating reject\n"
1506 "Set the reject cause of location updating reject\n"
1507 "Cause Value as Per GSM TS 04.08\n")
Harald Welte1085c092009-11-18 20:33:19 +01001508{
Harald Weltedcccb182010-05-16 20:52:23 +02001509 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1510
Harald Welte1085c092009-11-18 20:33:19 +01001511 gsmnet->reject_cause = atoi(argv[0]);
1512
1513 return CMD_SUCCESS;
1514}
1515
Harald Welte4381cfe2009-08-30 15:47:06 +09001516DEFUN(cfg_net_encryption,
1517 cfg_net_encryption_cmd,
Harald Weltead66a2d2012-07-04 21:37:56 +02001518 "encryption a5 (0|1|2|3)",
Harald Welte28326062010-05-14 20:05:17 +02001519 "Encryption options\n"
1520 "A5 encryption\n" "A5/0: No encryption\n"
Harald Weltead66a2d2012-07-04 21:37:56 +02001521 "A5/1: Encryption\n" "A5/2: Export-grade Encryption\n"
1522 "A5/3: 'New' Secure Encryption\n")
Harald Welte4381cfe2009-08-30 15:47:06 +09001523{
Harald Weltedcccb182010-05-16 20:52:23 +02001524 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1525
Andreas.Eversberg1059deb2009-11-17 09:55:26 +01001526 gsmnet->a5_encryption= atoi(argv[0]);
Harald Welte4381cfe2009-08-30 15:47:06 +09001527
1528 return CMD_SUCCESS;
1529}
1530
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001531DEFUN(cfg_net_neci,
1532 cfg_net_neci_cmd,
1533 "neci (0|1)",
Harald Welte28326062010-05-14 20:05:17 +02001534 "New Establish Cause Indication\n"
1535 "Don't set the NECI bit\n" "Set the NECI bit\n")
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001536{
Harald Weltedcccb182010-05-16 20:52:23 +02001537 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1538
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001539 gsmnet->neci = atoi(argv[0]);
Holger Hans Peter Freyther78891072010-09-06 09:36:02 +08001540 gsm_net_update_ctype(gsmnet);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001541 return CMD_SUCCESS;
1542}
1543
Harald Welteeab84a12009-12-13 10:53:12 +01001544DEFUN(cfg_net_rrlp_mode, cfg_net_rrlp_mode_cmd,
1545 "rrlp mode (none|ms-based|ms-preferred|ass-preferred)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001546 "Radio Resource Location Protocol\n"
1547 "Set the Radio Resource Location Protocol Mode\n"
1548 "Don't send RRLP request\n"
1549 "Request MS-based location\n"
1550 "Request any location, prefer MS-based\n"
1551 "Request any location, prefer MS-assisted\n")
Harald Welteeab84a12009-12-13 10:53:12 +01001552{
Harald Weltedcccb182010-05-16 20:52:23 +02001553 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1554
Harald Welteeab84a12009-12-13 10:53:12 +01001555 gsmnet->rrlp.mode = rrlp_mode_parse(argv[0]);
1556
1557 return CMD_SUCCESS;
1558}
1559
Harald Welte648b6ce2009-12-14 09:00:24 +01001560DEFUN(cfg_net_mm_info, cfg_net_mm_info_cmd,
1561 "mm info (0|1)",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001562 "Mobility Management\n"
1563 "Send MM INFO after LOC UPD ACCEPT\n"
1564 "Disable\n" "Enable\n")
Harald Welte648b6ce2009-12-14 09:00:24 +01001565{
Harald Weltedcccb182010-05-16 20:52:23 +02001566 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1567
Harald Welte648b6ce2009-12-14 09:00:24 +01001568 gsmnet->send_mm_info = atoi(argv[0]);
1569
1570 return CMD_SUCCESS;
1571}
1572
Harald Welte8f0ed552010-05-11 21:53:49 +02001573#define HANDOVER_STR "Handover Options\n"
1574
Harald Weltebc814502009-12-19 21:41:52 +01001575DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1576 "handover (0|1)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001577 HANDOVER_STR
1578 "Don't perform in-call handover\n"
1579 "Perform in-call handover\n")
Harald Weltebc814502009-12-19 21:41:52 +01001580{
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001581 int enable = atoi(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001582 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001583
1584 if (enable && ipacc_rtp_direct) {
Harald Weltefe03f0d2009-12-20 13:51:01 +01001585 vty_out(vty, "%% Cannot enable handover unless RTP Proxy mode "
1586 "is enabled by using the -P command line option%s",
1587 VTY_NEWLINE);
1588 return CMD_WARNING;
1589 }
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001590 gsmnet->handover.active = enable;
Harald Weltebc814502009-12-19 21:41:52 +01001591
1592 return CMD_SUCCESS;
1593}
1594
Harald Welte8f0ed552010-05-11 21:53:49 +02001595#define HO_WIN_STR HANDOVER_STR "Measurement Window\n"
1596#define HO_WIN_RXLEV_STR HO_WIN_STR "Received Level Averaging\n"
1597#define HO_WIN_RXQUAL_STR HO_WIN_STR "Received Quality Averaging\n"
1598#define HO_PBUDGET_STR HANDOVER_STR "Power Budget\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001599#define HO_AVG_COUNT_STR "Amount to use for Averaging\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001600
Harald Welteb720bd32009-12-21 16:51:50 +01001601DEFUN(cfg_net_ho_win_rxlev_avg, cfg_net_ho_win_rxlev_avg_cmd,
1602 "handover window rxlev averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001603 HO_WIN_RXLEV_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001604 "How many RxLev measurements are used for averaging\n"
1605 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001606{
Harald Weltedcccb182010-05-16 20:52:23 +02001607 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001608 gsmnet->handover.win_rxlev_avg = atoi(argv[0]);
1609 return CMD_SUCCESS;
1610}
1611
1612DEFUN(cfg_net_ho_win_rxqual_avg, cfg_net_ho_win_rxqual_avg_cmd,
1613 "handover window rxqual averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001614 HO_WIN_RXQUAL_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001615 "How many RxQual measurements are used for averaging\n"
1616 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001617{
Harald Weltedcccb182010-05-16 20:52:23 +02001618 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001619 gsmnet->handover.win_rxqual_avg = atoi(argv[0]);
1620 return CMD_SUCCESS;
1621}
1622
1623DEFUN(cfg_net_ho_win_rxlev_neigh_avg, cfg_net_ho_win_rxlev_avg_neigh_cmd,
1624 "handover window rxlev neighbor averaging <1-10>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001625 HO_WIN_RXLEV_STR "Neighbor\n"
1626 "How many RxQual measurements are used for averaging\n"
1627 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001628{
Harald Weltedcccb182010-05-16 20:52:23 +02001629 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001630 gsmnet->handover.win_rxlev_avg_neigh = atoi(argv[0]);
1631 return CMD_SUCCESS;
1632}
1633
1634DEFUN(cfg_net_ho_pwr_interval, cfg_net_ho_pwr_interval_cmd,
1635 "handover power budget interval <1-99>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001636 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001637 "How often to check if we have a better cell (SACCH frames)\n"
1638 "Interval\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001639{
Harald Weltedcccb182010-05-16 20:52:23 +02001640 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001641 gsmnet->handover.pwr_interval = atoi(argv[0]);
1642 return CMD_SUCCESS;
1643}
1644
1645DEFUN(cfg_net_ho_pwr_hysteresis, cfg_net_ho_pwr_hysteresis_cmd,
1646 "handover power budget hysteresis <0-999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001647 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001648 "How many dB does a neighbor to be stronger to become a HO candidate\n"
1649 "Hysteresis\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001650{
Harald Weltedcccb182010-05-16 20:52:23 +02001651 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001652 gsmnet->handover.pwr_hysteresis = atoi(argv[0]);
1653 return CMD_SUCCESS;
1654}
1655
1656DEFUN(cfg_net_ho_max_distance, cfg_net_ho_max_distance_cmd,
1657 "handover maximum distance <0-9999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001658 HANDOVER_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001659 "How big is the maximum timing advance before HO is forced\n"
1660 "Distance\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001661{
Harald Weltedcccb182010-05-16 20:52:23 +02001662 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001663 gsmnet->handover.max_distance = atoi(argv[0]);
1664 return CMD_SUCCESS;
1665}
Harald Weltebc814502009-12-19 21:41:52 +01001666
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001667DEFUN(cfg_net_pag_any_tch,
1668 cfg_net_pag_any_tch_cmd,
1669 "paging any use tch (0|1)",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001670 "Assign a TCH when receiving a Paging Any request\n"
1671 "Any Channel\n" "Use\n" "TCH\n"
1672 "Do not use TCH for Paging Request Any\n"
1673 "Do use TCH for Paging Request Any\n")
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001674{
Holger Hans Peter Freytherb0e88b82010-09-06 10:09:19 +08001675 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001676 gsmnet->pag_any_tch = atoi(argv[0]);
1677 gsm_net_update_ctype(gsmnet);
1678 return CMD_SUCCESS;
1679}
1680
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001681#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001682 DEFUN(cfg_net_T##number, \
1683 cfg_net_T##number##_cmd, \
1684 "timer t" #number " <0-65535>", \
Harald Welte8f0ed552010-05-11 21:53:49 +02001685 "Configure GSM Timers\n" \
Holger Hans Peter Freyther5dd295f2014-04-11 19:30:27 +02001686 doc "Timer Value in seconds\n") \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001687{ \
Harald Weltedcccb182010-05-16 20:52:23 +02001688 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001689 int value = atoi(argv[0]); \
1690 \
1691 if (value < 0 || value > 65535) { \
1692 vty_out(vty, "Timer value %s out of range.%s", \
1693 argv[0], VTY_NEWLINE); \
1694 return CMD_WARNING; \
1695 } \
1696 \
1697 gsmnet->T##number = value; \
1698 return CMD_SUCCESS; \
1699}
1700
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001701DECLARE_TIMER(3101, "Set the timeout value for IMMEDIATE ASSIGNMENT.\n")
1702DECLARE_TIMER(3103, "Set the timeout value for HANDOVER.\n")
Harald Welte67161f22012-06-03 13:01:47 +02001703DECLARE_TIMER(3105, "Set the timer for repetition of PHYSICAL INFORMATION.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001704DECLARE_TIMER(3107, "Currently not used.\n")
Holger Hans Peter Freytherb3489392011-12-28 16:21:05 +01001705DECLARE_TIMER(3109, "Set the RSL SACCH deactivation timeout.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001706DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.\n")
1707DECLARE_TIMER(3113, "Set the time to try paging a subscriber.\n")
1708DECLARE_TIMER(3115, "Currently not used.\n")
1709DECLARE_TIMER(3117, "Currently not used.\n")
1710DECLARE_TIMER(3119, "Currently not used.\n")
1711DECLARE_TIMER(3122, "Waiting time (seconds) after IMM ASS REJECT\n")
1712DECLARE_TIMER(3141, "Currently not used.\n")
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001713
Maxc08ee712016-05-11 12:45:13 +02001714DEFUN_DEPRECATED(cfg_net_dtx,
1715 cfg_net_dtx_cmd,
1716 "dtx-used (0|1)",
1717 ".HIDDEN\n""Obsolete\n""Obsolete\n")
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001718{
Maxc08ee712016-05-11 12:45:13 +02001719 vty_out(vty, "%% 'dtx-used' is now deprecated: use dtx * "
1720 "configuration options of BTS instead%s", VTY_NEWLINE);
1721 return CMD_SUCCESS;
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001722}
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001723
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +01001724DEFUN(cfg_net_subscr_keep,
1725 cfg_net_subscr_keep_cmd,
1726 "subscriber-keep-in-ram (0|1)",
1727 "Keep unused subscribers in RAM.\n"
1728 "Delete unused subscribers\n" "Keep unused subscribers\n")
1729{
1730 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Jacob Erlbeck1e30a282014-12-03 09:28:24 +01001731 gsmnet->subscr_group->keep_subscr = atoi(argv[0]);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +01001732 return CMD_SUCCESS;
1733}
1734
Harald Welte5258fc42009-03-28 19:07:53 +00001735/* per-BTS configuration */
1736DEFUN(cfg_bts,
1737 cfg_bts_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02001738 "bts <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001739 "Select a BTS to configure\n"
1740 "BTS Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001741{
Harald Weltedcccb182010-05-16 20:52:23 +02001742 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte5258fc42009-03-28 19:07:53 +00001743 int bts_nr = atoi(argv[0]);
1744 struct gsm_bts *bts;
1745
Harald Weltee441d9c2009-06-21 16:17:15 +02001746 if (bts_nr > gsmnet->num_bts) {
1747 vty_out(vty, "%% The next unused BTS number is %u%s",
1748 gsmnet->num_bts, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00001749 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02001750 } else if (bts_nr == gsmnet->num_bts) {
1751 /* allocate a new one */
Harald Welte3300c012011-06-05 13:31:33 +02001752 bts = gsm_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,
Harald Weltea2bbc5e2015-11-20 10:43:31 +01001753 HARDCODED_BSIC);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02001754 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02001755 bts = gsm_bts_num(gsmnet, bts_nr);
1756
Daniel Willmannf15c2762010-01-11 13:43:07 +01001757 if (!bts) {
1758 vty_out(vty, "%% Unable to allocate BTS %u%s",
1759 gsmnet->num_bts, VTY_NEWLINE);
Harald Weltee441d9c2009-06-21 16:17:15 +02001760 return CMD_WARNING;
Daniel Willmannf15c2762010-01-11 13:43:07 +01001761 }
Harald Welte5258fc42009-03-28 19:07:53 +00001762
1763 vty->index = bts;
Harald Welte197dea92010-05-14 17:59:53 +02001764 vty->index_sub = &bts->description;
Harald Welte5258fc42009-03-28 19:07:53 +00001765 vty->node = BTS_NODE;
1766
1767 return CMD_SUCCESS;
1768}
1769
1770DEFUN(cfg_bts_type,
1771 cfg_bts_type_cmd,
Harald Weltee555c2b2012-08-17 13:02:12 +02001772 "type TYPE", /* dynamically created */
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001773 "Set the BTS type\n" "Type\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001774{
1775 struct gsm_bts *bts = vty->index;
Harald Welte39315c42010-01-10 18:01:52 +01001776 int rc;
Harald Welte5258fc42009-03-28 19:07:53 +00001777
Harald Welte39315c42010-01-10 18:01:52 +01001778 rc = gsm_set_bts_type(bts, parse_btstype(argv[0]));
1779 if (rc < 0)
1780 return CMD_WARNING;
Harald Welte8175e952009-10-20 00:22:00 +02001781
Harald Welte5258fc42009-03-28 19:07:53 +00001782 return CMD_SUCCESS;
1783}
1784
Harald Weltefcd24452009-06-20 18:15:19 +02001785DEFUN(cfg_bts_band,
1786 cfg_bts_band_cmd,
1787 "band BAND",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001788 "Set the frequency band of this BTS\n" "Frequency band\n")
Harald Weltefcd24452009-06-20 18:15:19 +02001789{
1790 struct gsm_bts *bts = vty->index;
Harald Welte42581822009-08-08 16:12:58 +02001791 int band = gsm_band_parse(argv[0]);
Harald Weltefcd24452009-06-20 18:15:19 +02001792
1793 if (band < 0) {
1794 vty_out(vty, "%% BAND %d is not a valid GSM band%s",
1795 band, VTY_NEWLINE);
1796 return CMD_WARNING;
1797 }
1798
1799 bts->band = band;
1800
1801 return CMD_SUCCESS;
1802}
1803
Maxc08ee712016-05-11 12:45:13 +02001804DEFUN(cfg_bts_dtxu, cfg_bts_dtxu_cmd, "dtx uplink [force]",
1805 "Configure discontinuous transmission\n"
1806 "Enable Uplink DTX for this BTS\n"
1807 "MS 'shall' use DTXu instead of 'may' use (might not be supported by "
1808 "older phones).\n")
1809{
1810 struct gsm_bts *bts = vty->index;
1811
1812 bts->dtxu = (argc > 0) ? GSM48_DTX_SHALL_BE_USED : GSM48_DTX_MAY_BE_USED;
Max60795282016-06-06 11:30:57 +02001813 if (!is_ipaccess_bts(bts))
1814 vty_out(vty, "%% DTX enabled on non-IP BTS: this configuration "
1815 "neither supported nor tested!%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +02001816 return CMD_SUCCESS;
1817}
1818
1819DEFUN(cfg_bts_no_dtxu, cfg_bts_no_dtxu_cmd, "no dtx uplink",
1820 NO_STR
1821 "Configure discontinuous transmission\n"
1822 "Disable Uplink DTX for this BTS\n")
1823{
1824 struct gsm_bts *bts = vty->index;
1825
1826 bts->dtxu = GSM48_DTX_SHALL_NOT_BE_USED;
1827
1828 return CMD_SUCCESS;
1829}
1830
1831DEFUN(cfg_bts_dtxd, cfg_bts_dtxd_cmd, "dtx downlink",
1832 "Configure discontinuous transmission\n"
1833 "Enable Downlink DTX for this BTS\n")
1834{
1835 struct gsm_bts *bts = vty->index;
1836
1837 bts->dtxd = true;
Max60795282016-06-06 11:30:57 +02001838 if (!is_ipaccess_bts(bts))
1839 vty_out(vty, "%% DTX enabled on non-IP BTS: this configuration "
1840 "neither supported nor tested!%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +02001841 return CMD_SUCCESS;
1842}
1843
1844DEFUN(cfg_bts_no_dtxd, cfg_bts_no_dtxd_cmd, "no dtx downlink",
1845 NO_STR
1846 "Configure discontinuous transmission\n"
1847 "Disable Downlink DTX for this BTS\n")
1848{
1849 struct gsm_bts *bts = vty->index;
1850
1851 bts->dtxd = false;
1852
1853 return CMD_SUCCESS;
1854}
1855
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001856DEFUN(cfg_bts_ci,
1857 cfg_bts_ci_cmd,
1858 "cell_identity <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001859 "Set the Cell identity of this BTS\n" "Cell Identity\n")
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001860{
1861 struct gsm_bts *bts = vty->index;
1862 int ci = atoi(argv[0]);
1863
1864 if (ci < 0 || ci > 0xffff) {
1865 vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s",
1866 ci, VTY_NEWLINE);
1867 return CMD_WARNING;
1868 }
1869 bts->cell_identity = ci;
1870
1871 return CMD_SUCCESS;
1872}
1873
Harald Welte5258fc42009-03-28 19:07:53 +00001874DEFUN(cfg_bts_lac,
1875 cfg_bts_lac_cmd,
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001876 "location_area_code <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001877 "Set the Location Area Code (LAC) of this BTS\n" "LAC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001878{
1879 struct gsm_bts *bts = vty->index;
1880 int lac = atoi(argv[0]);
1881
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001882 if (lac < 0 || lac > 0xffff) {
1883 vty_out(vty, "%% LAC %d is not in the valid range (0-65535)%s",
Harald Welte5258fc42009-03-28 19:07:53 +00001884 lac, VTY_NEWLINE);
1885 return CMD_WARNING;
1886 }
Holger Hans Peter Freythere48b9562009-10-01 04:07:15 +02001887
1888 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
1889 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
1890 lac, VTY_NEWLINE);
1891 return CMD_WARNING;
1892 }
1893
Harald Welte5258fc42009-03-28 19:07:53 +00001894 bts->location_area_code = lac;
1895
1896 return CMD_SUCCESS;
1897}
1898
Harald Weltea43f7892009-12-01 18:04:30 +05301899
Harald Weltea2bbc5e2015-11-20 10:43:31 +01001900/* compatibility wrapper for old config files */
1901DEFUN_HIDDEN(cfg_bts_tsc,
Harald Welte5258fc42009-03-28 19:07:53 +00001902 cfg_bts_tsc_cmd,
Harald Weltec513ded2012-05-31 10:57:08 +02001903 "training_sequence_code <0-7>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001904 "Set the Training Sequence Code (TSC) of this BTS\n" "TSC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001905{
Harald Welte5258fc42009-03-28 19:07:53 +00001906 return CMD_SUCCESS;
1907}
1908
Harald Welte78f2f502009-05-23 16:56:52 +00001909DEFUN(cfg_bts_bsic,
1910 cfg_bts_bsic_cmd,
1911 "base_station_id_code <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001912 "Set the Base Station Identity Code (BSIC) of this BTS\n"
1913 "BSIC of this BTS\n")
Harald Welte78f2f502009-05-23 16:56:52 +00001914{
1915 struct gsm_bts *bts = vty->index;
1916 int bsic = atoi(argv[0]);
1917
1918 if (bsic < 0 || bsic > 0x3f) {
Harald Welte42581822009-08-08 16:12:58 +02001919 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte78f2f502009-05-23 16:56:52 +00001920 bsic, VTY_NEWLINE);
1921 return CMD_WARNING;
1922 }
1923 bts->bsic = bsic;
1924
1925 return CMD_SUCCESS;
1926}
1927
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001928DEFUN(cfg_bts_timezone,
1929 cfg_bts_timezone_cmd,
1930 "timezone <-19-19> (0|15|30|45)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001931 "Set the Timezone Offset of this BTS\n"
1932 "Timezone offset (hours)\n"
1933 "Timezone offset (00 minutes)\n"
1934 "Timezone offset (15 minutes)\n"
1935 "Timezone offset (30 minutes)\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02001936 "Timezone offset (45 minutes)\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001937 )
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001938{
1939 struct gsm_bts *bts = vty->index;
1940 int tzhr = atoi(argv[0]);
1941 int tzmn = atoi(argv[1]);
1942
Harald Welte45f91712012-07-08 16:48:11 +02001943 bts->tz.hr = tzhr;
1944 bts->tz.mn = tzmn;
Jacob Erlbeck946d1412013-09-17 13:59:29 +02001945 bts->tz.dst = 0;
1946 bts->tz.override = 1;
1947
1948 return CMD_SUCCESS;
1949}
1950
1951DEFUN(cfg_bts_timezone_dst,
1952 cfg_bts_timezone_dst_cmd,
1953 "timezone <-19-19> (0|15|30|45) <0-2>",
1954 "Set the Timezone Offset of this BTS\n"
1955 "Timezone offset (hours)\n"
1956 "Timezone offset (00 minutes)\n"
1957 "Timezone offset (15 minutes)\n"
1958 "Timezone offset (30 minutes)\n"
1959 "Timezone offset (45 minutes)\n"
1960 "DST offset (hours)\n"
1961 )
1962{
1963 struct gsm_bts *bts = vty->index;
1964 int tzhr = atoi(argv[0]);
1965 int tzmn = atoi(argv[1]);
1966 int tzdst = atoi(argv[2]);
1967
1968 bts->tz.hr = tzhr;
1969 bts->tz.mn = tzmn;
1970 bts->tz.dst = tzdst;
Harald Welte45f91712012-07-08 16:48:11 +02001971 bts->tz.override = 1;
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001972
1973 return CMD_SUCCESS;
1974}
1975
1976DEFUN(cfg_bts_no_timezone,
1977 cfg_bts_no_timezone_cmd,
1978 "no timezone",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001979 NO_STR
1980 "Disable BTS specific timezone\n")
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001981{
1982 struct gsm_bts *bts = vty->index;
Harald Welte45f91712012-07-08 16:48:11 +02001983
1984 bts->tz.override = 0;
1985
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001986 return CMD_SUCCESS;
1987}
Harald Welte78f2f502009-05-23 16:56:52 +00001988
Harald Welte4cc34222009-05-01 15:12:31 +00001989DEFUN(cfg_bts_unit_id,
1990 cfg_bts_unit_id_cmd,
Harald Welte07dc73d2009-08-07 13:27:09 +02001991 "ip.access unit_id <0-65534> <0-255>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001992 "Abis/IP specific options\n"
1993 "Set the IPA BTS Unit ID\n"
1994 "Unit ID (Site)\n"
1995 "Unit ID (BTS)\n")
Harald Welte4cc34222009-05-01 15:12:31 +00001996{
1997 struct gsm_bts *bts = vty->index;
1998 int site_id = atoi(argv[0]);
1999 int bts_id = atoi(argv[1]);
2000
Harald Welte07dc73d2009-08-07 13:27:09 +02002001 if (!is_ipaccess_bts(bts)) {
2002 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
2003 return CMD_WARNING;
2004 }
2005
Harald Welte4cc34222009-05-01 15:12:31 +00002006 bts->ip_access.site_id = site_id;
2007 bts->ip_access.bts_id = bts_id;
2008
2009 return CMD_SUCCESS;
2010}
2011
Harald Welte8b291802013-03-12 13:57:05 +01002012DEFUN(cfg_bts_rsl_ip,
2013 cfg_bts_rsl_ip_cmd,
2014 "ip.access rsl-ip A.B.C.D",
2015 "Abis/IP specific options\n"
2016 "Set the IPA RSL IP Address of the BSC\n"
2017 "Destination IP address for RSL connection\n")
2018{
2019 struct gsm_bts *bts = vty->index;
2020 struct in_addr ia;
2021
2022 if (!is_ipaccess_bts(bts)) {
2023 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
2024 return CMD_WARNING;
2025 }
2026
2027 inet_aton(argv[0], &ia);
2028 bts->ip_access.rsl_ip = ntohl(ia.s_addr);
2029
2030 return CMD_SUCCESS;
2031}
2032
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01002033#define NOKIA_STR "Nokia *Site related commands\n"
Harald Welte8b291802013-03-12 13:57:05 +01002034
Sylvain Munautc9519462011-10-17 14:04:55 +02002035DEFUN(cfg_bts_nokia_site_skip_reset,
2036 cfg_bts_nokia_site_skip_reset_cmd,
2037 "nokia_site skip-reset (0|1)",
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01002038 NOKIA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002039 "Skip the reset step during bootstrap process of this BTS\n"
2040 "Do NOT skip the reset\n" "Skip the reset\n")
Sylvain Munautc9519462011-10-17 14:04:55 +02002041{
2042 struct gsm_bts *bts = vty->index;
2043
2044 if (bts->type != GSM_BTS_TYPE_NOKIA_SITE) {
2045 vty_out(vty, "%% BTS is not of Nokia *Site type%s", VTY_NEWLINE);
2046 return CMD_WARNING;
2047 }
2048
2049 bts->nokia.skip_reset = atoi(argv[0]);
2050
2051 return CMD_SUCCESS;
2052}
2053
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01002054DEFUN(cfg_bts_nokia_site_no_loc_rel_cnf,
2055 cfg_bts_nokia_site_no_loc_rel_cnf_cmd,
2056 "nokia_site no-local-rel-conf (0|1)",
2057 NOKIA_STR
2058 "Do not wait for RELease CONFirm message when releasing channel locally\n"
2059 "Wait for RELease CONFirm\n" "Do not wait for RELease CONFirm\n")
2060{
2061 struct gsm_bts *bts = vty->index;
2062
2063 if (!is_nokia_bts(bts)) {
2064 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
2065 VTY_NEWLINE);
2066 return CMD_WARNING;
2067 }
2068
2069 bts->nokia.no_loc_rel_cnf = atoi(argv[0]);
2070
2071 return CMD_SUCCESS;
2072}
2073
Sipos Csaba56e17662015-02-07 13:27:36 +01002074DEFUN(cfg_bts_nokia_site_bts_reset_timer_cnf,
2075 cfg_bts_nokia_site_bts_reset_timer_cnf_cmd,
2076 "nokia_site bts-reset-timer <15-100>",
2077 NOKIA_STR
2078 "The amount of time (in sec.) between BTS_RESET is sent,\n"
2079 "and the BTS is being bootstrapped.\n")
2080{
2081 struct gsm_bts *bts = vty->index;
2082
2083 if (!is_nokia_bts(bts)) {
2084 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
2085 VTY_NEWLINE);
2086 return CMD_WARNING;
2087 }
2088
2089 bts->nokia.bts_reset_timer_cnf = atoi(argv[0]);
2090
2091 return CMD_SUCCESS;
2092}
Harald Welte8f0ed552010-05-11 21:53:49 +02002093#define OML_STR "Organization & Maintenance Link\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002094#define IPA_STR "A-bis/IP Specific Options\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02002095
Harald Welte8175e952009-10-20 00:22:00 +02002096DEFUN(cfg_bts_stream_id,
2097 cfg_bts_stream_id_cmd,
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02002098 "oml ip.access stream_id <0-255> line E1_LINE",
Harald Welte8f0ed552010-05-11 21:53:49 +02002099 OML_STR IPA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002100 "Set the ip.access Stream ID of the OML link of this BTS\n"
2101 "Stream Identifier\n" "Virtual E1 Line Number\n" "Virtual E1 Line Number\n")
Harald Welte8175e952009-10-20 00:22:00 +02002102{
2103 struct gsm_bts *bts = vty->index;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02002104 int stream_id = atoi(argv[0]), linenr = atoi(argv[1]);
Harald Welte8175e952009-10-20 00:22:00 +02002105
2106 if (!is_ipaccess_bts(bts)) {
2107 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
2108 return CMD_WARNING;
2109 }
2110
2111 bts->oml_tei = stream_id;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02002112 /* This is used by e1inp_bind_ops callback for each BTS model. */
2113 bts->oml_e1_link.e1_nr = linenr;
2114
2115 return CMD_SUCCESS;
2116}
2117
Harald Welted13e0cd2012-08-17 09:52:03 +02002118#define OML_E1_STR OML_STR "OML E1/T1 Configuration\n"
Harald Welte8175e952009-10-20 00:22:00 +02002119
Harald Welte42581822009-08-08 16:12:58 +02002120DEFUN(cfg_bts_oml_e1,
2121 cfg_bts_oml_e1_cmd,
2122 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welted13e0cd2012-08-17 09:52:03 +02002123 OML_E1_STR
2124 "E1/T1 line number to be used for OML\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002125 "E1/T1 line number to be used for OML\n"
2126 "E1/T1 timeslot to be used for OML\n"
2127 "E1/T1 timeslot to be used for OML\n"
2128 "E1/T1 sub-slot to be used for OML\n"
2129 "Use E1/T1 sub-slot 0\n"
2130 "Use E1/T1 sub-slot 1\n"
2131 "Use E1/T1 sub-slot 2\n"
2132 "Use E1/T1 sub-slot 3\n"
2133 "Use full E1 slot 3\n"
2134 )
Harald Welte42581822009-08-08 16:12:58 +02002135{
2136 struct gsm_bts *bts = vty->index;
2137
2138 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
2139
2140 return CMD_SUCCESS;
2141}
2142
2143
2144DEFUN(cfg_bts_oml_e1_tei,
2145 cfg_bts_oml_e1_tei_cmd,
2146 "oml e1 tei <0-63>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002147 OML_E1_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002148 "Set the TEI to be used for OML\n"
2149 "TEI Number\n")
Harald Welte42581822009-08-08 16:12:58 +02002150{
2151 struct gsm_bts *bts = vty->index;
2152
2153 bts->oml_tei = atoi(argv[0]);
2154
2155 return CMD_SUCCESS;
2156}
2157
Harald Welte7a8fa412009-08-10 13:48:16 +02002158DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
2159 "channel allocator (ascending|descending)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002160 "Channnel Allocator\n" "Channel Allocator\n"
2161 "Allocate Timeslots and Transceivers in ascending order\n"
2162 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte7a8fa412009-08-10 13:48:16 +02002163{
2164 struct gsm_bts *bts = vty->index;
2165
2166 if (!strcmp(argv[0], "ascending"))
2167 bts->chan_alloc_reverse = 0;
2168 else
2169 bts->chan_alloc_reverse = 1;
2170
2171 return CMD_SUCCESS;
2172}
2173
Harald Welte8f0ed552010-05-11 21:53:49 +02002174#define RACH_STR "Random Access Control Channel\n"
2175
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01002176DEFUN(cfg_bts_rach_tx_integer,
2177 cfg_bts_rach_tx_integer_cmd,
2178 "rach tx integer <0-15>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002179 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002180 "Set the raw tx integer value in RACH Control parameters IE\n"
2181 "Set the raw tx integer value in RACH Control parameters IE\n"
2182 "Raw tx integer value in RACH Control parameters IE\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01002183{
2184 struct gsm_bts *bts = vty->index;
2185 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
2186 return CMD_SUCCESS;
2187}
2188
2189DEFUN(cfg_bts_rach_max_trans,
2190 cfg_bts_rach_max_trans_cmd,
2191 "rach max transmission (1|2|4|7)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002192 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002193 "Set the maximum number of RACH burst transmissions\n"
2194 "Set the maximum number of RACH burst transmissions\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02002195 "Maximum number of 1 RACH burst transmissions\n"
2196 "Maximum number of 2 RACH burst transmissions\n"
2197 "Maximum number of 4 RACH burst transmissions\n"
2198 "Maximum number of 7 RACH burst transmissions\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01002199{
2200 struct gsm_bts *bts = vty->index;
2201 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
2202 return CMD_SUCCESS;
2203}
2204
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02002205#define CD_STR "Channel Description\n"
2206
2207DEFUN(cfg_bts_chan_desc_att,
2208 cfg_bts_chan_desc_att_cmd,
2209 "channel-descrption attach (0|1)",
2210 CD_STR
2211 "Set if attachment is required\n"
2212 "Attachment is NOT required\n"
2213 "Attachment is required (standard)\n")
2214{
2215 struct gsm_bts *bts = vty->index;
2216 bts->si_common.chan_desc.att = atoi(argv[0]);
2217 return CMD_SUCCESS;
2218}
2219
2220DEFUN(cfg_bts_chan_desc_bs_pa_mfrms,
2221 cfg_bts_chan_desc_bs_pa_mfrms_cmd,
2222 "channel-descrption bs-pa-mfrms <2-9>",
2223 CD_STR
2224 "Set number of multiframe periods for paging groups\n"
2225 "Number of multiframe periods for paging groups\n")
2226{
2227 struct gsm_bts *bts = vty->index;
2228 int bs_pa_mfrms = atoi(argv[0]);
2229
2230 bts->si_common.chan_desc.bs_pa_mfrms = bs_pa_mfrms - 2;
2231 return CMD_SUCCESS;
2232}
2233
2234DEFUN(cfg_bts_chan_desc_bs_ag_blks_res,
2235 cfg_bts_chan_desc_bs_ag_blks_res_cmd,
2236 "channel-descrption bs-ag-blks-res <0-7>",
2237 CD_STR
2238 "Set number of blocks reserved for access grant\n"
2239 "Number of blocks reserved for access grant\n")
2240{
2241 struct gsm_bts *bts = vty->index;
2242 int bs_ag_blks_res = atoi(argv[0]);
2243
2244 bts->si_common.chan_desc.bs_ag_blks_res = bs_ag_blks_res;
2245 return CMD_SUCCESS;
2246}
2247
Harald Welte8f0ed552010-05-11 21:53:49 +02002248#define NM_STR "Network Management\n"
2249
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002250DEFUN(cfg_bts_rach_nm_b_thresh,
2251 cfg_bts_rach_nm_b_thresh_cmd,
2252 "rach nm busy threshold <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002253 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002254 "Set the NM Busy Threshold\n"
2255 "Set the NM Busy Threshold\n"
2256 "NM Busy Threshold in dB")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002257{
2258 struct gsm_bts *bts = vty->index;
2259 bts->rach_b_thresh = atoi(argv[0]);
2260 return CMD_SUCCESS;
2261}
2262
2263DEFUN(cfg_bts_rach_nm_ldavg,
2264 cfg_bts_rach_nm_ldavg_cmd,
2265 "rach nm load average <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002266 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002267 "Set the NM Loadaverage Slots value\n"
2268 "Set the NM Loadaverage Slots value\n"
2269 "NM Loadaverage Slots value\n")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002270{
2271 struct gsm_bts *bts = vty->index;
2272 bts->rach_ldavg_slots = atoi(argv[0]);
2273 return CMD_SUCCESS;
2274}
2275
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002276DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
2277 "cell barred (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002278 "Should this cell be barred from access?\n"
2279 "Should this cell be barred from access?\n"
2280 "Cell should NOT be barred\n"
2281 "Cell should be barred\n")
2282
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002283{
2284 struct gsm_bts *bts = vty->index;
2285
Harald Welte71355012009-12-21 23:08:18 +01002286 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002287
2288 return CMD_SUCCESS;
2289}
2290
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002291DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
2292 "rach emergency call allowed (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002293 RACH_STR
2294 "Should this cell allow emergency calls?\n"
2295 "Should this cell allow emergency calls?\n"
2296 "Should this cell allow emergency calls?\n"
2297 "Do NOT allow emergency calls\n"
2298 "Allow emergency calls\n")
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002299{
2300 struct gsm_bts *bts = vty->index;
2301
2302 if (atoi(argv[0]) == 0)
2303 bts->si_common.rach_control.t2 |= 0x4;
2304 else
2305 bts->si_common.rach_control.t2 &= ~0x4;
2306
2307 return CMD_SUCCESS;
2308}
2309
Ivan Kluchnikov67920592013-09-16 13:13:04 +04002310DEFUN(cfg_bts_rach_ac_class, cfg_bts_rach_ac_class_cmd,
2311 "rach access-control-class (0|1|2|3|4|5|6|7|8|9|11|12|13|14|15) (barred|allowed)",
2312 RACH_STR
2313 "Set access control class\n"
2314 "Access control class 0\n"
2315 "Access control class 1\n"
2316 "Access control class 2\n"
2317 "Access control class 3\n"
2318 "Access control class 4\n"
2319 "Access control class 5\n"
2320 "Access control class 6\n"
2321 "Access control class 7\n"
2322 "Access control class 8\n"
2323 "Access control class 9\n"
2324 "Access control class 11 for PLMN use\n"
2325 "Access control class 12 for security services\n"
2326 "Access control class 13 for public utilities (e.g. water/gas suppliers)\n"
2327 "Access control class 14 for emergency services\n"
2328 "Access control class 15 for PLMN staff\n"
2329 "barred to use access control class\n"
2330 "allowed to use access control class\n")
2331{
2332 struct gsm_bts *bts = vty->index;
2333
2334 uint8_t control_class;
2335 uint8_t allowed = 0;
2336
2337 if (strcmp(argv[1], "allowed") == 0)
2338 allowed = 1;
2339
2340 control_class = atoi(argv[0]);
2341 if (control_class < 8)
2342 if (allowed)
2343 bts->si_common.rach_control.t3 &= ~(0x1 << control_class);
2344 else
2345 bts->si_common.rach_control.t3 |= (0x1 << control_class);
2346 else
2347 if (allowed)
2348 bts->si_common.rach_control.t2 &= ~(0x1 << (control_class - 8));
2349 else
2350 bts->si_common.rach_control.t2 |= (0x1 << (control_class - 8));
2351
2352 return CMD_SUCCESS;
2353}
2354
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002355DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
2356 "ms max power <0-40>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002357 "MS Options\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02002358 "Maximum transmit power of the MS\n"
2359 "Maximum transmit power of the MS\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002360 "Maximum transmit power of the MS in dBm")
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002361{
2362 struct gsm_bts *bts = vty->index;
2363
2364 bts->ms_max_power = atoi(argv[0]);
2365
2366 return CMD_SUCCESS;
2367}
2368
Harald Weltecfaabbb2012-08-16 23:23:50 +02002369#define CELL_STR "Cell Parameters\n"
2370
Harald Welte73225282009-12-12 18:17:25 +01002371DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
2372 "cell reselection hysteresis <0-14>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002373 CELL_STR "Cell re-selection parameters\n"
2374 "Cell Re-Selection Hysteresis in dB\n"
Harald Welte73225282009-12-12 18:17:25 +01002375 "Cell Re-Selection Hysteresis in dB")
2376{
2377 struct gsm_bts *bts = vty->index;
2378
2379 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
2380
2381 return CMD_SUCCESS;
2382}
2383
2384DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
2385 "rxlev access min <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002386 "Minimum RxLev needed for cell access\n"
2387 "Minimum RxLev needed for cell access\n"
2388 "Minimum RxLev needed for cell access\n"
Harald Welte73225282009-12-12 18:17:25 +01002389 "Minimum RxLev needed for cell access (better than -110dBm)")
2390{
2391 struct gsm_bts *bts = vty->index;
2392
2393 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
2394
2395 return CMD_SUCCESS;
2396}
2397
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002398DEFUN(cfg_bts_cell_bar_qualify, cfg_bts_cell_bar_qualify_cmd,
2399 "cell bar qualify (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002400 CELL_STR "Cell Bar Qualify\n" "Cell Bar Qualify\n"
2401 "Set CBQ to 0\n" "Set CBQ to 1\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002402{
2403 struct gsm_bts *bts = vty->index;
2404
2405 bts->si_common.cell_ro_sel_par.present = 1;
2406 bts->si_common.cell_ro_sel_par.cbq = atoi(argv[0]);
2407
2408 return CMD_SUCCESS;
2409}
2410
2411DEFUN(cfg_bts_cell_resel_ofs, cfg_bts_cell_resel_ofs_cmd,
2412 "cell reselection offset <0-126>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002413 CELL_STR "Cell Re-Selection Parameters\n"
2414 "Cell Re-Selection Offset (CRO) in dB\n"
2415 "Cell Re-Selection Offset (CRO) in dB\n"
2416 )
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002417{
2418 struct gsm_bts *bts = vty->index;
2419
2420 bts->si_common.cell_ro_sel_par.present = 1;
2421 bts->si_common.cell_ro_sel_par.cell_resel_off = atoi(argv[0])/2;
2422
2423 return CMD_SUCCESS;
2424}
2425
2426DEFUN(cfg_bts_temp_ofs, cfg_bts_temp_ofs_cmd,
2427 "temporary offset <0-60>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002428 "Cell selection temporary negative offset\n"
2429 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002430 "Cell selection temporary negative offset in dB")
2431{
2432 struct gsm_bts *bts = vty->index;
2433
2434 bts->si_common.cell_ro_sel_par.present = 1;
2435 bts->si_common.cell_ro_sel_par.temp_offs = atoi(argv[0])/10;
2436
2437 return CMD_SUCCESS;
2438}
2439
2440DEFUN(cfg_bts_temp_ofs_inf, cfg_bts_temp_ofs_inf_cmd,
2441 "temporary offset infinite",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002442 "Cell selection temporary negative offset\n"
2443 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002444 "Sets cell selection temporary negative offset to infinity")
2445{
2446 struct gsm_bts *bts = vty->index;
2447
2448 bts->si_common.cell_ro_sel_par.present = 1;
2449 bts->si_common.cell_ro_sel_par.temp_offs = 7;
2450
2451 return CMD_SUCCESS;
2452}
2453
2454DEFUN(cfg_bts_penalty_time, cfg_bts_penalty_time_cmd,
2455 "penalty time <20-620>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002456 "Cell selection penalty time\n"
2457 "Cell selection penalty time\n"
2458 "Cell selection penalty time in seconds (by 20s increments)\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002459{
2460 struct gsm_bts *bts = vty->index;
2461
2462 bts->si_common.cell_ro_sel_par.present = 1;
2463 bts->si_common.cell_ro_sel_par.penalty_time = (atoi(argv[0])-20)/20;
2464
2465 return CMD_SUCCESS;
2466}
2467
2468DEFUN(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd,
2469 "penalty time reserved",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002470 "Cell selection penalty time\n"
2471 "Cell selection penalty time\n"
2472 "Set cell selection penalty time to reserved value 31, "
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002473 "(indicate that CELL_RESELECT_OFFSET is subtracted from C2 "
2474 "and TEMPORARY_OFFSET is ignored)")
2475{
2476 struct gsm_bts *bts = vty->index;
2477
2478 bts->si_common.cell_ro_sel_par.present = 1;
2479 bts->si_common.cell_ro_sel_par.penalty_time = 31;
2480
2481 return CMD_SUCCESS;
2482}
2483
Harald Welte (local)efc92312009-08-14 23:09:25 +02002484DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
Daniel Willmann4d62d632012-12-27 00:02:01 +01002485 "periodic location update <6-1530>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002486 "Periodic Location Updating Interval\n"
2487 "Periodic Location Updating Interval\n"
2488 "Periodic Location Updating Interval\n"
2489 "Periodic Location Updating Interval in Minutes\n")
Harald Welte (local)efc92312009-08-14 23:09:25 +02002490{
2491 struct gsm_bts *bts = vty->index;
2492
Dieter Spaard6613e02010-10-05 21:10:55 +02002493 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
Harald Welte (local)efc92312009-08-14 23:09:25 +02002494
2495 return CMD_SUCCESS;
2496}
2497
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002498DEFUN(cfg_bts_no_per_loc_upd, cfg_bts_no_per_loc_upd_cmd,
2499 "no periodic location update",
2500 NO_STR
2501 "Periodic Location Updating Interval\n"
2502 "Periodic Location Updating Interval\n"
2503 "Periodic Location Updating Interval\n")
2504{
2505 struct gsm_bts *bts = vty->index;
2506
2507 bts->si_common.chan_desc.t3212 = 0;
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01002508
2509 return CMD_SUCCESS;
2510}
2511
2512DEFUN(cfg_bts_radio_link_timeout, cfg_bts_radio_link_timeout_cmd,
2513 "radio-link-timeout <4-64>",
2514 "Radio link timeout criterion (BTS side)\n"
2515 "Radio link timeout value (lost SACCH block)\n")
2516{
2517 struct gsm_bts *bts = vty->index;
2518
2519 set_radio_link_timeout(&bts->si_common.cell_options, atoi(argv[0]));
2520
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002521 return CMD_SUCCESS;
2522}
2523
Harald Welte8f0ed552010-05-11 21:53:49 +02002524#define GPRS_TEXT "GPRS Packet Network\n"
2525
Harald Welteaf387632010-03-14 23:30:30 +08002526DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welte57ba7e32010-04-18 14:00:26 +02002527 "gprs cell bvci <2-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002528 GPRS_TEXT
2529 "GPRS Cell Settings\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002530 "GPRS BSSGP VC Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002531 "GPRS BSSGP VC Identifier")
2532{
2533 struct gsm_bts *bts = vty->index;
2534
Harald Welte4511d892010-04-18 15:51:20 +02002535 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002536 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2537 return CMD_WARNING;
2538 }
2539
Harald Welte97a282b2010-03-14 15:37:43 +08002540 bts->gprs.cell.bvci = atoi(argv[0]);
2541
2542 return CMD_SUCCESS;
2543}
2544
Harald Weltea5731cf2010-03-22 11:48:36 +08002545DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
2546 "gprs nsei <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002547 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002548 "GPRS NS Entity Identifier\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002549 "GPRS NS Entity Identifier")
2550{
2551 struct gsm_bts *bts = vty->index;
2552
Harald Welte4511d892010-04-18 15:51:20 +02002553 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltea5731cf2010-03-22 11:48:36 +08002554 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2555 return CMD_WARNING;
2556 }
2557
2558 bts->gprs.nse.nsei = atoi(argv[0]);
2559
2560 return CMD_SUCCESS;
2561}
2562
Harald Welte8f0ed552010-05-11 21:53:49 +02002563#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
2564 "NSVC Logical Number\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002565
Harald Welte97a282b2010-03-14 15:37:43 +08002566DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
2567 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002568 GPRS_TEXT NSVC_TEXT
2569 "NS Virtual Connection Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002570 "GPRS NS VC Identifier")
2571{
2572 struct gsm_bts *bts = vty->index;
2573 int idx = atoi(argv[0]);
2574
Harald Welte4511d892010-04-18 15:51:20 +02002575 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002576 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2577 return CMD_WARNING;
2578 }
2579
Harald Welte97a282b2010-03-14 15:37:43 +08002580 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
2581
2582 return CMD_SUCCESS;
2583}
2584
Harald Welteaf387632010-03-14 23:30:30 +08002585DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
2586 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002587 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002588 "GPRS NS Local UDP Port\n"
2589 "GPRS NS Local UDP Port\n"
2590 "GPRS NS Local UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002591 "GPRS NS Local UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002592{
2593 struct gsm_bts *bts = vty->index;
2594 int idx = atoi(argv[0]);
2595
Harald Welte4511d892010-04-18 15:51:20 +02002596 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002597 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2598 return CMD_WARNING;
2599 }
2600
Harald Welteaf387632010-03-14 23:30:30 +08002601 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
2602
2603 return CMD_SUCCESS;
2604}
2605
2606DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
2607 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002608 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002609 "GPRS NS Remote UDP Port\n"
2610 "GPRS NS Remote UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002611 "GPRS NS Remote UDP Port\n"
2612 "GPRS NS Remote UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002613{
2614 struct gsm_bts *bts = vty->index;
2615 int idx = atoi(argv[0]);
2616
Harald Welte4511d892010-04-18 15:51:20 +02002617 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002618 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2619 return CMD_WARNING;
2620 }
2621
Harald Welteaf387632010-03-14 23:30:30 +08002622 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
2623
2624 return CMD_SUCCESS;
2625}
2626
2627DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
2628 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte8f0ed552010-05-11 21:53:49 +02002629 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002630 "GPRS NS Remote IP Address\n"
2631 "GPRS NS Remote IP Address\n"
2632 "GPRS NS Remote IP Address\n")
Harald Welteaf387632010-03-14 23:30:30 +08002633{
2634 struct gsm_bts *bts = vty->index;
2635 int idx = atoi(argv[0]);
2636 struct in_addr ia;
2637
Harald Welte4511d892010-04-18 15:51:20 +02002638 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002639 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2640 return CMD_WARNING;
2641 }
2642
Harald Welteaf387632010-03-14 23:30:30 +08002643 inet_aton(argv[1], &ia);
2644 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
2645
2646 return CMD_SUCCESS;
2647}
2648
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002649DEFUN(cfg_bts_pag_free, cfg_bts_pag_free_cmd,
Harald Weltecfaabbb2012-08-16 23:23:50 +02002650 "paging free <-1-1024>",
2651 "Paging options\n"
2652 "Only page when having a certain amount of free slots\n"
2653 "amount of required free paging slots. -1 to disable\n")
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002654{
2655 struct gsm_bts *bts = vty->index;
2656
2657 bts->paging.free_chans_need = atoi(argv[0]);
2658 return CMD_SUCCESS;
2659}
2660
Harald Welte615e9562010-05-11 23:50:21 +02002661DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
2662 "gprs ns timer " NS_TIMERS " <0-255>",
2663 GPRS_TEXT "Network Service\n"
2664 "Network Service Timer\n"
2665 NS_TIMERS_HELP "Timer Value\n")
2666{
2667 struct gsm_bts *bts = vty->index;
2668 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
2669 int val = atoi(argv[1]);
2670
2671 if (bts->gprs.mode == BTS_GPRS_NONE) {
2672 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2673 return CMD_WARNING;
2674 }
2675
2676 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
2677 return CMD_WARNING;
2678
2679 bts->gprs.nse.timer[idx] = val;
2680
2681 return CMD_SUCCESS;
2682}
2683
2684#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 +02002685#define BSSGP_TIMERS_HELP \
2686 "Tbvc-block timeout\n" \
2687 "Tbvc-block retries\n" \
2688 "Tbvc-unblock retries\n" \
2689 "Tbvcc-reset timeout\n" \
2690 "Tbvc-reset retries\n" \
2691 "Tbvc-suspend timeout\n" \
2692 "Tbvc-suspend retries\n" \
2693 "Tbvc-resume timeout\n" \
2694 "Tbvc-resume retries\n" \
2695 "Tbvc-capa-update timeout\n" \
2696 "Tbvc-capa-update retries\n"
Harald Welte615e9562010-05-11 23:50:21 +02002697
2698DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
2699 "gprs cell timer " BSSGP_TIMERS " <0-255>",
2700 GPRS_TEXT "Cell / BSSGP\n"
2701 "Cell/BSSGP Timer\n"
2702 BSSGP_TIMERS_HELP "Timer Value\n")
2703{
2704 struct gsm_bts *bts = vty->index;
2705 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
2706 int val = atoi(argv[1]);
2707
2708 if (bts->gprs.mode == BTS_GPRS_NONE) {
2709 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2710 return CMD_WARNING;
2711 }
2712
2713 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
2714 return CMD_WARNING;
2715
2716 bts->gprs.cell.timer[idx] = val;
2717
2718 return CMD_SUCCESS;
2719}
2720
Harald Welte97a282b2010-03-14 15:37:43 +08002721DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
2722 "gprs routing area <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002723 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002724 "GPRS Routing Area Code\n"
2725 "GPRS Routing Area Code\n"
2726 "GPRS Routing Area Code\n")
Harald Welte97a282b2010-03-14 15:37:43 +08002727{
2728 struct gsm_bts *bts = vty->index;
2729
Harald Welte4511d892010-04-18 15:51:20 +02002730 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002731 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2732 return CMD_WARNING;
2733 }
2734
Harald Welte97a282b2010-03-14 15:37:43 +08002735 bts->gprs.rac = atoi(argv[0]);
2736
2737 return CMD_SUCCESS;
2738}
2739
Max292ec582016-07-28 11:55:37 +02002740DEFUN(cfg_bts_gprs_ctrl_ack, cfg_bts_gprs_ctrl_ack_cmd,
2741 "gprs control-ack-type-rach", GPRS_TEXT
2742 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2743 "four access bursts format instead of default RLC/MAC control block\n")
2744{
2745 struct gsm_bts *bts = vty->index;
2746
2747 if (bts->gprs.mode == BTS_GPRS_NONE) {
2748 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2749 return CMD_WARNING;
2750 }
2751
2752 bts->gprs.ctrl_ack_type_use_block = false;
2753
2754 return CMD_SUCCESS;
2755}
2756
2757DEFUN(cfg_no_bts_gprs_ctrl_ack, cfg_no_bts_gprs_ctrl_ack_cmd,
2758 "no gprs control-ack-type-rach", NO_STR GPRS_TEXT
2759 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2760 "four access bursts format instead of default RLC/MAC control block\n")
2761{
2762 struct gsm_bts *bts = vty->index;
2763
2764 if (bts->gprs.mode == BTS_GPRS_NONE) {
2765 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2766 return CMD_WARNING;
2767 }
2768
2769 bts->gprs.ctrl_ack_type_use_block = true;
2770
2771 return CMD_SUCCESS;
2772}
2773
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01002774DEFUN(cfg_bts_gprs_net_ctrl_ord, cfg_bts_gprs_net_ctrl_ord_cmd,
2775 "gprs network-control-order (nc0|nc1|nc2)",
2776 GPRS_TEXT
2777 "GPRS Network Control Order\n"
2778 "MS controlled cell re-selection, no measurement reporting\n"
2779 "MS controlled cell re-selection, MS sends measurement reports\n"
2780 "Network controlled cell re-selection, MS sends measurement reports\n")
2781{
2782 struct gsm_bts *bts = vty->index;
2783
2784 if (bts->gprs.mode == BTS_GPRS_NONE) {
2785 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2786 return CMD_WARNING;
2787 }
2788
2789 bts->gprs.net_ctrl_ord = atoi(argv[0] + 2);
2790
2791 return CMD_SUCCESS;
2792}
2793
Harald Welte4511d892010-04-18 15:51:20 +02002794DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
2795 "gprs mode (none|gprs|egprs)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002796 GPRS_TEXT
2797 "GPRS Mode for this BTS\n"
2798 "GPRS Disabled on this BTS\n"
2799 "GPRS Enabled on this BTS\n"
2800 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welteaf387632010-03-14 23:30:30 +08002801{
2802 struct gsm_bts *bts = vty->index;
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002803 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0], NULL);
Harald Welteaf387632010-03-14 23:30:30 +08002804
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002805 if (!bts_gprs_mode_is_compat(bts, mode)) {
Harald Weltef3d8e922010-06-14 22:44:42 +02002806 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2807 VTY_NEWLINE);
2808 return CMD_WARNING;
2809 }
2810
2811 bts->gprs.mode = mode;
Harald Welteaf387632010-03-14 23:30:30 +08002812
2813 return CMD_SUCCESS;
2814}
2815
bhargava350533c2016-07-21 11:14:34 +05302816DEFUN(cfg_bts_gprs_11bit_rach_support_for_egprs,
2817 cfg_bts_gprs_11bit_rach_support_for_egprs_cmd,
2818 "gprs 11bit_rach_support_for_egprs (0|1)",
2819 GPRS_TEXT "11 bit RACH options\n"
2820 "Disable 11 bit RACH for EGPRS\n"
2821 "Enable 11 bit RACH for EGPRS")
2822{
2823 struct gsm_bts *bts = vty->index;
2824
2825 bts->gprs.supports_egprs_11bit_rach = atoi(argv[0]);
2826
2827 if (bts->gprs.supports_egprs_11bit_rach > 1) {
2828 vty_out(vty, "Error in RACH type%s", VTY_NEWLINE);
2829 return CMD_WARNING;
2830 }
2831
2832 if ((bts->gprs.mode == BTS_GPRS_NONE) &&
2833 (bts->gprs.supports_egprs_11bit_rach == 1)) {
2834 vty_out(vty, "Error:gprs mode is none and 11bit rach is"
2835 " enabled%s", VTY_NEWLINE);
2836 return CMD_WARNING;
2837 }
2838
2839 return CMD_SUCCESS;
2840}
2841
Harald Welte9fbff4a2010-07-30 11:50:09 +02002842#define SI_TEXT "System Information Messages\n"
2843#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)"
2844#define SI_TYPE_HELP "System Information Type 1\n" \
2845 "System Information Type 2\n" \
2846 "System Information Type 3\n" \
2847 "System Information Type 4\n" \
2848 "System Information Type 5\n" \
2849 "System Information Type 6\n" \
2850 "System Information Type 7\n" \
2851 "System Information Type 8\n" \
2852 "System Information Type 9\n" \
2853 "System Information Type 10\n" \
2854 "System Information Type 13\n" \
2855 "System Information Type 16\n" \
2856 "System Information Type 17\n" \
2857 "System Information Type 18\n" \
2858 "System Information Type 19\n" \
2859 "System Information Type 20\n" \
2860 "System Information Type 2bis\n" \
2861 "System Information Type 2ter\n" \
2862 "System Information Type 2quater\n" \
2863 "System Information Type 5bis\n" \
2864 "System Information Type 5ter\n"
2865
2866DEFUN(cfg_bts_si_mode, cfg_bts_si_mode_cmd,
2867 "system-information " SI_TYPE_TEXT " mode (static|computed)",
2868 SI_TEXT SI_TYPE_HELP
2869 "System Information Mode\n"
2870 "Static user-specified\n"
2871 "Dynamic, BSC-computed\n")
2872{
2873 struct gsm_bts *bts = vty->index;
2874 int type;
2875
2876 type = get_string_value(osmo_sitype_strs, argv[0]);
2877 if (type < 0) {
2878 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2879 return CMD_WARNING;
2880 }
2881
2882 if (!strcmp(argv[1], "static"))
2883 bts->si_mode_static |= (1 << type);
2884 else
2885 bts->si_mode_static &= ~(1 << type);
2886
2887 return CMD_SUCCESS;
2888}
2889
2890DEFUN(cfg_bts_si_static, cfg_bts_si_static_cmd,
2891 "system-information " SI_TYPE_TEXT " static HEXSTRING",
2892 SI_TEXT SI_TYPE_HELP
2893 "Static System Information filling\n"
2894 "Static user-specified SI content in HEX notation\n")
2895{
2896 struct gsm_bts *bts = vty->index;
2897 int rc, type;
2898
2899 type = get_string_value(osmo_sitype_strs, argv[0]);
2900 if (type < 0) {
2901 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2902 return CMD_WARNING;
2903 }
2904
2905 if (!(bts->si_mode_static & (1 << type))) {
2906 vty_out(vty, "SI Type %s is not configured in static mode%s",
2907 get_value_string(osmo_sitype_strs, type), VTY_NEWLINE);
2908 return CMD_WARNING;
2909 }
2910
Harald Welte290aaed2010-07-30 11:53:18 +02002911 /* Fill buffer with padding pattern */
2912 memset(bts->si_buf[type], 0x2b, sizeof(bts->si_buf[type]));
2913
2914 /* Parse the user-specified SI in hex format, [partially] overwriting padding */
Pablo Neira Ayusoc0d17f22011-05-07 12:12:48 +02002915 rc = osmo_hexparse(argv[1], bts->si_buf[type], sizeof(bts->si_buf[0]));
Harald Welte9fbff4a2010-07-30 11:50:09 +02002916 if (rc < 0 || rc > sizeof(bts->si_buf[0])) {
2917 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
2918 return CMD_WARNING;
2919 }
2920
2921 /* Mark this SI as present */
2922 bts->si_valid |= (1 << type);
2923
2924 return CMD_SUCCESS;
2925}
2926
Harald Welte32c09622011-01-11 23:44:56 +01002927DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
Harald Welte64c07d22011-02-15 11:43:27 +01002928 "neighbor-list mode (automatic|manual|manual-si5)",
Harald Welte32c09622011-01-11 23:44:56 +01002929 "Neighbor List\n" "Mode of Neighbor List generation\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002930 "Automatically from all BTS in this OpenBSC\n" "Manual\n"
2931 "Manual with different lists for SI2 and SI5\n")
Harald Welte32c09622011-01-11 23:44:56 +01002932{
2933 struct gsm_bts *bts = vty->index;
Harald Welte64c07d22011-02-15 11:43:27 +01002934 int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
Harald Welte32c09622011-01-11 23:44:56 +01002935
Harald Welte64c07d22011-02-15 11:43:27 +01002936 switch (mode) {
2937 case NL_MODE_MANUAL_SI5SEP:
2938 case NL_MODE_MANUAL:
Harald Welte32c09622011-01-11 23:44:56 +01002939 /* make sure we clear the current list when switching to
2940 * manual mode */
2941 if (bts->neigh_list_manual_mode == 0)
2942 memset(&bts->si_common.data.neigh_list, 0,
2943 sizeof(bts->si_common.data.neigh_list));
Harald Welte64c07d22011-02-15 11:43:27 +01002944 break;
2945 default:
2946 break;
2947 }
2948
2949 bts->neigh_list_manual_mode = mode;
Harald Welte32c09622011-01-11 23:44:56 +01002950
2951 return CMD_SUCCESS;
2952}
2953
2954DEFUN(cfg_bts_neigh, cfg_bts_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002955 "neighbor-list (add|del) arfcn <0-1023>",
Harald Welte32c09622011-01-11 23:44:56 +01002956 "Neighbor List\n" "Add to manual neighbor list\n"
2957 "Delete from manual neighbor list\n" "ARFCN of neighbor\n"
2958 "ARFCN of neighbor\n")
2959{
2960 struct gsm_bts *bts = vty->index;
2961 struct bitvec *bv = &bts->si_common.neigh_list;
2962 uint16_t arfcn = atoi(argv[1]);
2963
2964 if (!bts->neigh_list_manual_mode) {
2965 vty_out(vty, "%% Cannot configure neighbor list in "
2966 "automatic mode%s", VTY_NEWLINE);
2967 return CMD_WARNING;
2968 }
2969
2970 if (!strcmp(argv[0], "add"))
2971 bitvec_set_bit_pos(bv, arfcn, 1);
2972 else
2973 bitvec_set_bit_pos(bv, arfcn, 0);
2974
2975 return CMD_SUCCESS;
2976}
2977
Max35697b92016-04-29 12:51:31 +02002978
Max59a1bf32016-04-15 16:04:46 +02002979DEFUN(cfg_bts_si2quater_neigh_add, cfg_bts_si2quater_neigh_add_cmd,
Max35697b92016-04-29 12:51:31 +02002980 "si2quater neighbor-list add earfcn <0-65535> threshold <0-31> "
2981 "[<0-7>]", "SI2quater Neighbor List\n"
Max59a1bf32016-04-15 16:04:46 +02002982 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
2983 "EARFCN of neighbor\n" "EARFCN of neighbor\n" "threshold high bits\n"
2984 "threshold high bits\n" "measurement bandwidth\n")
2985{
2986 struct gsm_bts *bts = vty->index;
2987 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
2988 uint16_t arfcn = atoi(argv[0]);
2989 uint8_t meas = OSMO_EARFCN_MEAS_INVALID, thresh = atoi(argv[1]);
2990 int r;
2991
2992 if (3 == argc)
2993 meas = atoi(argv[2]);
2994
2995 r = osmo_earfcn_add(e, arfcn, meas);
2996
2997 if (r < 0) {
2998 vty_out(vty, "Unable to add arfcn %u: %s%s", arfcn, strerror(r),
2999 VTY_NEWLINE);
3000 return CMD_WARNING;
3001 }
Maxaafff962016-04-20 15:57:14 +02003002 if (si2q_size_check(bts)) {
3003 if (e->thresh_hi && thresh != e->thresh_hi)
3004 vty_out(vty, "Warning: multiple thresholds are not "
3005 "supported, overriding previous threshold %u%s",
3006 e->thresh_hi, VTY_NEWLINE);
Max59a1bf32016-04-15 16:04:46 +02003007
Maxaafff962016-04-20 15:57:14 +02003008 e->thresh_hi = thresh;
3009 return CMD_SUCCESS;
3010 }
3011 vty_out(vty, "Warning: not enough space in si2quater for a given arfcn%s"
3012 , VTY_NEWLINE);
3013 osmo_earfcn_del(e, arfcn);
3014 return CMD_WARNING;
Max59a1bf32016-04-15 16:04:46 +02003015}
3016
3017DEFUN(cfg_bts_si2quater_neigh_del, cfg_bts_si2quater_neigh_del_cmd,
Max35697b92016-04-29 12:51:31 +02003018 "si2quater neighbor-list del earfcn <0-65535>",
Max59a1bf32016-04-15 16:04:46 +02003019 "SI2quater Neighbor List\n"
3020 "SI2quater Neighbor List\n"
3021 "Delete from SI2quater manual neighbor list\n"
Max36212f22016-04-20 12:06:05 +02003022 "EARFCN of neighbor\n"
3023 "EARFCN\n")
Max59a1bf32016-04-15 16:04:46 +02003024{
3025 struct gsm_bts *bts = vty->index;
3026 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
Max0c1bc262016-04-20 12:06:06 +02003027 uint16_t arfcn = atoi(argv[0]);
Max59a1bf32016-04-15 16:04:46 +02003028 int r = osmo_earfcn_del(e, arfcn);
3029 if (r < 0) {
3030 vty_out(vty, "Unable to delete arfcn %u: %s%s", arfcn,
Max0c1bc262016-04-20 12:06:06 +02003031 strerror(-r), VTY_NEWLINE);
Max59a1bf32016-04-15 16:04:46 +02003032 return CMD_WARNING;
3033 }
3034
3035 return CMD_SUCCESS;
3036}
3037
Max26679e02016-04-20 15:57:13 +02003038DEFUN(cfg_bts_si2quater_uarfcn_add, cfg_bts_si2quater_uarfcn_add_cmd,
Max35697b92016-04-29 12:51:31 +02003039 "si2quater neighbor-list add uarfcn <0-16383> <0-511> <0-1>",
Max26679e02016-04-20 15:57:13 +02003040 "SI2quater Neighbor List\n"
3041 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
3042 "UARFCN of neighbor\n" "UARFCN of neighbor\n" "scrambling code\n"
3043 "diversity bit\n")
3044{
3045 struct gsm_bts *bts = vty->index;
3046 uint16_t arfcn = atoi(argv[0]), scramble = atoi(argv[1]);
3047
3048 switch(bts_uarfcn_add(bts, arfcn, scramble, atoi(argv[2]))) {
3049 case -ENOMEM:
3050 vty_out(vty, "Unable to add arfcn: max number of UARFCNs (%u) "
3051 "reached%s", MAX_EARFCN_LIST, VTY_NEWLINE);
Maxaafff962016-04-20 15:57:14 +02003052 case -ENOSPC:
3053 vty_out(vty, "Warning: not enough space in si2quater for a "
3054 "given arfcn%s", VTY_NEWLINE);
Max26679e02016-04-20 15:57:13 +02003055 case -EADDRINUSE:
3056 vty_out(vty, "Unable to add arfcn: (%u, %u) is already added%s",
3057 arfcn, scramble, VTY_NEWLINE);
3058 return CMD_WARNING;
3059 }
3060
3061 return CMD_SUCCESS;
3062}
3063
3064DEFUN(cfg_bts_si2quater_uarfcn_del, cfg_bts_si2quater_uarfcn_del_cmd,
Max35697b92016-04-29 12:51:31 +02003065 "si2quater neighbor-list del uarfcn <0-16383> <0-511>",
Max26679e02016-04-20 15:57:13 +02003066 "SI2quater Neighbor List\n"
3067 "SI2quater Neighbor List\n"
3068 "Delete from SI2quater manual neighbor list\n"
3069 "UARFCN of neighbor\n"
3070 "UARFCN\n"
3071 "scrambling code\n")
3072{
3073 struct gsm_bts *bts = vty->index;
3074
3075 if (bts_uarfcn_del(bts, atoi(argv[0]), atoi(argv[1])) < 0) {
3076 vty_out(vty, "Unable to delete uarfcn: pair not found%s",
3077 VTY_NEWLINE);
3078 return CMD_WARNING;
3079 }
3080
3081 return CMD_SUCCESS;
3082}
3083
Harald Welte64c07d22011-02-15 11:43:27 +01003084DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01003085 "si5 neighbor-list (add|del) arfcn <0-1023>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003086 "SI5 Neighbor List\n"
Harald Welte64c07d22011-02-15 11:43:27 +01003087 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
3088 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
3089 "ARFCN of neighbor\n")
3090{
3091 struct gsm_bts *bts = vty->index;
3092 struct bitvec *bv = &bts->si_common.si5_neigh_list;
3093 uint16_t arfcn = atoi(argv[1]);
3094
3095 if (!bts->neigh_list_manual_mode) {
3096 vty_out(vty, "%% Cannot configure neighbor list in "
3097 "automatic mode%s", VTY_NEWLINE);
3098 return CMD_WARNING;
3099 }
3100
3101 if (!strcmp(argv[0], "add"))
3102 bitvec_set_bit_pos(bv, arfcn, 1);
3103 else
3104 bitvec_set_bit_pos(bv, arfcn, 0);
3105
3106 return CMD_SUCCESS;
3107}
Harald Welte9fbff4a2010-07-30 11:50:09 +02003108
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02003109#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
3110
3111DEFUN(cfg_bts_excl_rf_lock,
3112 cfg_bts_excl_rf_lock_cmd,
3113 "rf-lock-exclude",
3114 EXCL_RFLOCK_STR)
3115{
3116 struct gsm_bts *bts = vty->index;
3117 bts->excl_from_rf_lock = 1;
3118 return CMD_SUCCESS;
3119}
3120
3121DEFUN(cfg_bts_no_excl_rf_lock,
3122 cfg_bts_no_excl_rf_lock_cmd,
3123 "no rf-lock-exclude",
3124 NO_STR EXCL_RFLOCK_STR)
3125{
3126 struct gsm_bts *bts = vty->index;
3127 bts->excl_from_rf_lock = 0;
3128 return CMD_SUCCESS;
3129}
3130
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01003131#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
3132
3133DEFUN(cfg_bts_force_comb_si,
3134 cfg_bts_force_comb_si_cmd,
3135 "force-combined-si",
3136 FORCE_COMB_SI_STR)
3137{
3138 struct gsm_bts *bts = vty->index;
3139 bts->force_combined_si = 1;
3140 return CMD_SUCCESS;
3141}
3142
3143DEFUN(cfg_bts_no_force_comb_si,
3144 cfg_bts_no_force_comb_si_cmd,
3145 "no force-combined-si",
3146 NO_STR FORCE_COMB_SI_STR)
3147{
3148 struct gsm_bts *bts = vty->index;
3149 bts->force_combined_si = 0;
3150 return CMD_SUCCESS;
3151}
3152
Andreas Eversberga83d5112013-12-07 18:32:28 +01003153static void _get_codec_from_arg(struct vty *vty, int argc, const char *argv[])
3154{
3155 struct gsm_bts *bts = vty->index;
3156 struct bts_codec_conf *codec = &bts->codec;
3157 int i;
3158
3159 codec->hr = 0;
3160 codec->efr = 0;
3161 codec->amr = 0;
3162 for (i = 0; i < argc; i++) {
3163 if (!strcmp(argv[i], "hr"))
3164 codec->hr = 1;
3165 if (!strcmp(argv[i], "efr"))
3166 codec->efr = 1;
3167 if (!strcmp(argv[i], "amr"))
3168 codec->amr = 1;
3169 }
3170}
3171
3172#define CODEC_PAR_STR " (hr|efr|amr)"
3173#define CODEC_HELP_STR "Half Rate\n" \
3174 "Enhanced Full Rate\nAdaptive Multirate\n"
3175
3176DEFUN(cfg_bts_codec0, cfg_bts_codec0_cmd,
3177 "codec-support fr",
3178 "Codec Support settings\nFullrate\n")
3179{
3180 _get_codec_from_arg(vty, 0, argv);
3181 return CMD_SUCCESS;
3182}
3183
3184DEFUN(cfg_bts_codec1, cfg_bts_codec1_cmd,
3185 "codec-support fr" CODEC_PAR_STR,
3186 "Codec Support settings\nFullrate\n"
3187 CODEC_HELP_STR)
3188{
3189 _get_codec_from_arg(vty, 1, argv);
3190 return CMD_SUCCESS;
3191}
3192
3193DEFUN(cfg_bts_codec2, cfg_bts_codec2_cmd,
3194 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR,
3195 "Codec Support settings\nFullrate\n"
3196 CODEC_HELP_STR CODEC_HELP_STR)
3197{
3198 _get_codec_from_arg(vty, 2, argv);
3199 return CMD_SUCCESS;
3200}
3201
3202DEFUN(cfg_bts_codec3, cfg_bts_codec3_cmd,
3203 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
3204 "Codec Support settings\nFullrate\n"
3205 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
3206{
3207 _get_codec_from_arg(vty, 3, argv);
3208 return CMD_SUCCESS;
3209}
3210
3211DEFUN(cfg_bts_codec4, cfg_bts_codec4_cmd,
3212 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
3213 "Codec Support settings\nFullrate\n"
3214 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
3215{
3216 _get_codec_from_arg(vty, 4, argv);
3217 return CMD_SUCCESS;
3218}
3219
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01003220DEFUN(cfg_bts_depends_on, cfg_bts_depends_on_cmd,
3221 "depends-on-bts <0-255>",
3222 "This BTS can only be started if another one is up\n" "BTS Number\n")
3223{
3224 struct gsm_bts *bts = vty->index;
3225 struct gsm_bts *other_bts;
3226 int dep = atoi(argv[0]);
3227
3228
3229 if (!is_ipaccess_bts(bts)) {
3230 vty_out(vty, "This feature is only available for IP systems.%s",
3231 VTY_NEWLINE);
3232 return CMD_WARNING;
3233 }
3234
3235 other_bts = gsm_bts_num(bts->network, dep);
3236 if (!other_bts || !is_ipaccess_bts(other_bts)) {
3237 vty_out(vty, "This feature is only available for IP systems.%s",
3238 VTY_NEWLINE);
3239 return CMD_WARNING;
3240 }
3241
3242 if (dep >= bts->nr) {
3243 vty_out(vty, "%%Need to depend on an already declared unit.%s",
3244 VTY_NEWLINE);
3245 return CMD_WARNING;
3246 }
3247
3248 bts_depend_mark(bts, dep);
3249 return CMD_SUCCESS;
3250}
3251
3252DEFUN(cfg_bts_no_depends_on, cfg_bts_no_depends_on_cmd,
3253 "depeneds-on-bts <0-255>",
3254 NO_STR "This BTS can only be started if another one is up\n"
3255 "BTS Number\n")
3256{
3257 struct gsm_bts *bts = vty->index;
3258 int dep = atoi(argv[0]);
3259
3260 bts_depend_clear(bts, dep);
3261 return CMD_SUCCESS;
3262}
3263
Andreas Eversberg73266522014-01-19 11:47:44 +01003264#define AMR_TEXT "Adaptive Multi Rate settings\n"
3265#define AMR_MODE_TEXT "Codec modes to use with AMR codec\n"
3266#define AMR_START_TEXT "Initial codec to use with AMR\n" \
3267 "Automatically\nFirst codec\nSecond codec\nThird codec\nFourth codec\n"
3268#define AMR_TH_TEXT "AMR threshold between codecs\nMS side\nBTS side\n"
3269#define AMR_HY_TEXT "AMR hysteresis between codecs\nMS side\nBTS side\n"
3270
3271static void get_amr_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3272{
3273 struct gsm_bts *bts = vty->index;
3274 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3275 struct gsm48_multi_rate_conf *mr_conf =
3276 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3277 int i;
3278
3279 mr->gsm48_ie[1] = 0;
3280 for (i = 0; i < argc; i++)
3281 mr->gsm48_ie[1] |= 1 << atoi(argv[i]);
3282 mr_conf->icmi = 0;
3283}
3284
3285static void get_amr_th_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3286{
3287 struct gsm_bts *bts = vty->index;
3288 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003289 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003290 int i;
3291
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003292 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3293 for (i = 0; i < argc - 1; i++)
3294 modes[i].threshold = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003295}
3296
3297static void get_amr_hy_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3298{
3299 struct gsm_bts *bts = vty->index;
3300 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003301 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003302 int i;
3303
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003304 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3305 for (i = 0; i < argc - 1; i++)
3306 modes[i].hysteresis = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003307}
3308
3309static void get_amr_start_from_arg(struct vty *vty, const char *argv[], int full)
3310{
3311 struct gsm_bts *bts = vty->index;
3312 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3313 struct gsm48_multi_rate_conf *mr_conf =
3314 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3315 int num = 0, i;
3316
3317 for (i = 0; i < ((full) ? 8 : 6); i++) {
3318 if ((mr->gsm48_ie[1] & (1 << i))) {
3319 num++;
3320 }
3321 }
3322
3323 if (argv[0][0] == 'a' || num == 0)
3324 mr_conf->icmi = 0;
3325 else {
3326 mr_conf->icmi = 1;
3327 if (num < atoi(argv[0]))
3328 mr_conf->smod = num - 1;
3329 else
3330 mr_conf->smod = atoi(argv[0]) - 1;
3331 }
3332}
3333
3334#define AMR_TCHF_PAR_STR " (0|1|2|3|4|5|6|7)"
3335#define AMR_TCHF_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n" \
3336 "10,2k\n12,2k\n"
3337
3338#define AMR_TCHH_PAR_STR " (0|1|2|3|4|5)"
3339#define AMR_TCHH_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n"
3340
3341#define AMR_TH_HELP_STR "Threshold between codec 1 and 2\n"
3342#define AMR_HY_HELP_STR "Hysteresis between codec 1 and 2\n"
3343
3344DEFUN(cfg_bts_amr_fr_modes1, cfg_bts_amr_fr_modes1_cmd,
3345 "amr tch-f modes" AMR_TCHF_PAR_STR,
3346 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3347 AMR_TCHF_HELP_STR)
3348{
3349 get_amr_from_arg(vty, 1, argv, 1);
3350 return CMD_SUCCESS;
3351}
3352
3353DEFUN(cfg_bts_amr_fr_modes2, cfg_bts_amr_fr_modes2_cmd,
3354 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3355 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3356 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3357{
3358 get_amr_from_arg(vty, 2, argv, 1);
3359 return CMD_SUCCESS;
3360}
3361
3362DEFUN(cfg_bts_amr_fr_modes3, cfg_bts_amr_fr_modes3_cmd,
3363 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3364 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3365 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3366{
3367 get_amr_from_arg(vty, 3, argv, 1);
3368 return CMD_SUCCESS;
3369}
3370
3371DEFUN(cfg_bts_amr_fr_modes4, cfg_bts_amr_fr_modes4_cmd,
3372 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3373 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3374 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3375{
3376 get_amr_from_arg(vty, 4, argv, 1);
3377 return CMD_SUCCESS;
3378}
3379
3380DEFUN(cfg_bts_amr_fr_start_mode, cfg_bts_amr_fr_start_mode_cmd,
3381 "amr tch-f start-mode (auto|1|2|3|4)",
3382 AMR_TEXT "Full Rate\n" AMR_START_TEXT)
3383{
3384 get_amr_start_from_arg(vty, argv, 1);
3385 return CMD_SUCCESS;
3386}
3387
3388DEFUN(cfg_bts_amr_fr_thres1, cfg_bts_amr_fr_thres1_cmd,
3389 "amr tch-f threshold (ms|bts) <0-63>",
3390 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3391 AMR_TH_HELP_STR)
3392{
3393 get_amr_th_from_arg(vty, 2, argv, 1);
3394 return CMD_SUCCESS;
3395}
3396
3397DEFUN(cfg_bts_amr_fr_thres2, cfg_bts_amr_fr_thres2_cmd,
3398 "amr tch-f threshold (ms|bts) <0-63> <0-63>",
3399 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3400 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3401{
3402 get_amr_th_from_arg(vty, 3, argv, 1);
3403 return CMD_SUCCESS;
3404}
3405
3406DEFUN(cfg_bts_amr_fr_thres3, cfg_bts_amr_fr_thres3_cmd,
3407 "amr tch-f threshold (ms|bts) <0-63> <0-63> <0-63>",
3408 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3409 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3410{
3411 get_amr_th_from_arg(vty, 4, argv, 1);
3412 return CMD_SUCCESS;
3413}
3414
3415DEFUN(cfg_bts_amr_fr_hyst1, cfg_bts_amr_fr_hyst1_cmd,
3416 "amr tch-f hysteresis (ms|bts) <0-15>",
3417 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3418 AMR_HY_HELP_STR)
3419{
3420 get_amr_hy_from_arg(vty, 2, argv, 1);
3421 return CMD_SUCCESS;
3422}
3423
3424DEFUN(cfg_bts_amr_fr_hyst2, cfg_bts_amr_fr_hyst2_cmd,
3425 "amr tch-f hysteresis (ms|bts) <0-15> <0-15>",
3426 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3427 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3428{
3429 get_amr_hy_from_arg(vty, 3, argv, 1);
3430 return CMD_SUCCESS;
3431}
3432
3433DEFUN(cfg_bts_amr_fr_hyst3, cfg_bts_amr_fr_hyst3_cmd,
3434 "amr tch-f hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3435 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3436 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3437{
3438 get_amr_hy_from_arg(vty, 4, argv, 1);
3439 return CMD_SUCCESS;
3440}
3441
3442DEFUN(cfg_bts_amr_hr_modes1, cfg_bts_amr_hr_modes1_cmd,
3443 "amr tch-h modes" AMR_TCHH_PAR_STR,
3444 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3445 AMR_TCHH_HELP_STR)
3446{
3447 get_amr_from_arg(vty, 1, argv, 0);
3448 return CMD_SUCCESS;
3449}
3450
3451DEFUN(cfg_bts_amr_hr_modes2, cfg_bts_amr_hr_modes2_cmd,
3452 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3453 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3454 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3455{
3456 get_amr_from_arg(vty, 2, argv, 0);
3457 return CMD_SUCCESS;
3458}
3459
3460DEFUN(cfg_bts_amr_hr_modes3, cfg_bts_amr_hr_modes3_cmd,
3461 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3462 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3463 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3464{
3465 get_amr_from_arg(vty, 3, argv, 0);
3466 return CMD_SUCCESS;
3467}
3468
3469DEFUN(cfg_bts_amr_hr_modes4, cfg_bts_amr_hr_modes4_cmd,
3470 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3471 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3472 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3473{
3474 get_amr_from_arg(vty, 4, argv, 0);
3475 return CMD_SUCCESS;
3476}
3477
3478DEFUN(cfg_bts_amr_hr_start_mode, cfg_bts_amr_hr_start_mode_cmd,
3479 "amr tch-h start-mode (auto|1|2|3|4)",
3480 AMR_TEXT "Half Rate\n" AMR_START_TEXT)
3481{
3482 get_amr_start_from_arg(vty, argv, 0);
3483 return CMD_SUCCESS;
3484}
3485
3486DEFUN(cfg_bts_amr_hr_thres1, cfg_bts_amr_hr_thres1_cmd,
3487 "amr tch-h threshold (ms|bts) <0-63>",
3488 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3489 AMR_TH_HELP_STR)
3490{
3491 get_amr_th_from_arg(vty, 2, argv, 0);
3492 return CMD_SUCCESS;
3493}
3494
3495DEFUN(cfg_bts_amr_hr_thres2, cfg_bts_amr_hr_thres2_cmd,
3496 "amr tch-h threshold (ms|bts) <0-63> <0-63>",
3497 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3498 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3499{
3500 get_amr_th_from_arg(vty, 3, argv, 0);
3501 return CMD_SUCCESS;
3502}
3503
3504DEFUN(cfg_bts_amr_hr_thres3, cfg_bts_amr_hr_thres3_cmd,
3505 "amr tch-h threshold (ms|bts) <0-63> <0-63> <0-63>",
3506 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3507 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3508{
3509 get_amr_th_from_arg(vty, 4, argv, 0);
3510 return CMD_SUCCESS;
3511}
3512
3513DEFUN(cfg_bts_amr_hr_hyst1, cfg_bts_amr_hr_hyst1_cmd,
3514 "amr tch-h hysteresis (ms|bts) <0-15>",
3515 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3516 AMR_HY_HELP_STR)
3517{
3518 get_amr_hy_from_arg(vty, 2, argv, 0);
3519 return CMD_SUCCESS;
3520}
3521
3522DEFUN(cfg_bts_amr_hr_hyst2, cfg_bts_amr_hr_hyst2_cmd,
3523 "amr tch-h hysteresis (ms|bts) <0-15> <0-15>",
3524 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3525 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3526{
3527 get_amr_hy_from_arg(vty, 3, argv, 0);
3528 return CMD_SUCCESS;
3529}
3530
3531DEFUN(cfg_bts_amr_hr_hyst3, cfg_bts_amr_hr_hyst3_cmd,
3532 "amr tch-h hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3533 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3534 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3535{
3536 get_amr_hy_from_arg(vty, 4, argv, 0);
3537 return CMD_SUCCESS;
3538}
3539
Harald Welte8f0ed552010-05-11 21:53:49 +02003540#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02003541
Harald Welte5258fc42009-03-28 19:07:53 +00003542/* per TRX configuration */
3543DEFUN(cfg_trx,
3544 cfg_trx_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02003545 "trx <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02003546 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00003547 "Select a TRX to configure")
3548{
3549 int trx_nr = atoi(argv[0]);
3550 struct gsm_bts *bts = vty->index;
3551 struct gsm_bts_trx *trx;
3552
Harald Weltee441d9c2009-06-21 16:17:15 +02003553 if (trx_nr > bts->num_trx) {
3554 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
3555 bts->num_trx, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00003556 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02003557 } else if (trx_nr == bts->num_trx) {
3558 /* we need to allocate a new one */
3559 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003560 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02003561 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003562
Harald Weltee441d9c2009-06-21 16:17:15 +02003563 if (!trx)
3564 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00003565
3566 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02003567 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00003568 vty->node = TRX_NODE;
3569
3570 return CMD_SUCCESS;
3571}
3572
3573DEFUN(cfg_trx_arfcn,
3574 cfg_trx_arfcn_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01003575 "arfcn <0-1023>",
Harald Welte13fe2192012-08-17 09:57:25 +02003576 "Set the ARFCN for this TRX\n"
3577 "Absolute Radio Frequency Channel Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003578{
3579 int arfcn = atoi(argv[0]);
3580 struct gsm_bts_trx *trx = vty->index;
3581
3582 /* FIXME: check if this ARFCN is supported by this TRX */
3583
3584 trx->arfcn = arfcn;
3585
3586 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
3587 /* FIXME: use OML layer to update the ARFCN */
3588 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
3589
3590 return CMD_SUCCESS;
3591}
3592
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003593DEFUN(cfg_trx_nominal_power,
3594 cfg_trx_nominal_power_cmd,
3595 "nominal power <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003596 "Nominal TRX RF Power in dBm\n"
3597 "Nominal TRX RF Power in dBm\n"
3598 "Nominal TRX RF Power in dBm\n")
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003599{
3600 struct gsm_bts_trx *trx = vty->index;
3601
3602 trx->nominal_power = atoi(argv[0]);
3603
3604 return CMD_SUCCESS;
3605}
3606
Harald Weltefcd24452009-06-20 18:15:19 +02003607DEFUN(cfg_trx_max_power_red,
3608 cfg_trx_max_power_red_cmd,
3609 "max_power_red <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003610 "Reduction of maximum BS RF Power (relative to nominal power)\n"
Harald Weltefcd24452009-06-20 18:15:19 +02003611 "Reduction of maximum BS RF Power in dB\n")
3612{
3613 int maxpwr_r = atoi(argv[0]);
3614 struct gsm_bts_trx *trx = vty->index;
Harald Welte61a83b22009-11-18 09:20:22 +01003615 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-06-20 18:15:19 +02003616
3617 /* FIXME: check if our BTS type supports more than 12 */
3618 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
3619 vty_out(vty, "%% Power %d dB is not in the valid range%s",
3620 maxpwr_r, VTY_NEWLINE);
3621 return CMD_WARNING;
3622 }
3623 if (maxpwr_r & 1) {
3624 vty_out(vty, "%% Power %d dB is not an even value%s",
3625 maxpwr_r, VTY_NEWLINE);
3626 return CMD_WARNING;
3627 }
3628
3629 trx->max_power_red = maxpwr_r;
3630
3631 /* FIXME: make sure we update this using OML */
3632
3633 return CMD_SUCCESS;
3634}
3635
Harald Welte42581822009-08-08 16:12:58 +02003636DEFUN(cfg_trx_rsl_e1,
3637 cfg_trx_rsl_e1_cmd,
3638 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003639 "RSL Parameters\n"
3640 "E1/T1 interface to be used for RSL\n"
3641 "E1/T1 interface to be used for RSL\n"
3642 "E1/T1 Line Number to be used for RSL\n"
3643 "E1/T1 Timeslot to be used for RSL\n"
3644 "E1/T1 Timeslot to be used for RSL\n"
3645 "E1/T1 Sub-slot to be used for RSL\n"
3646 "E1/T1 Sub-slot 0 is to be used for RSL\n"
3647 "E1/T1 Sub-slot 1 is to be used for RSL\n"
3648 "E1/T1 Sub-slot 2 is to be used for RSL\n"
3649 "E1/T1 Sub-slot 3 is to be used for RSL\n"
3650 "E1/T1 full timeslot is to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003651{
3652 struct gsm_bts_trx *trx = vty->index;
3653
3654 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
3655
3656 return CMD_SUCCESS;
3657}
3658
3659DEFUN(cfg_trx_rsl_e1_tei,
3660 cfg_trx_rsl_e1_tei_cmd,
3661 "rsl e1 tei <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003662 "RSL Parameters\n"
3663 "Set the TEI to be used for RSL\n"
3664 "Set the TEI to be used for RSL\n"
3665 "TEI to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003666{
3667 struct gsm_bts_trx *trx = vty->index;
3668
3669 trx->rsl_tei = atoi(argv[0]);
3670
3671 return CMD_SUCCESS;
3672}
3673
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003674DEFUN(cfg_trx_rf_locked,
3675 cfg_trx_rf_locked_cmd,
3676 "rf_locked (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003677 "Set or unset the RF Locking (Turn off RF of the TRX)\n"
3678 "TRX is NOT RF locked (active)\n"
3679 "TRX is RF locked (turned off)\n")
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003680{
3681 int locked = atoi(argv[0]);
3682 struct gsm_bts_trx *trx = vty->index;
3683
3684 gsm_trx_lock_rf(trx, locked);
3685 return CMD_SUCCESS;
3686}
Harald Welte42581822009-08-08 16:12:58 +02003687
Harald Welte5258fc42009-03-28 19:07:53 +00003688/* per TS configuration */
3689DEFUN(cfg_ts,
3690 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003691 "timeslot <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003692 "Select a Timeslot to configure\n"
3693 "Timeslot number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003694{
3695 int ts_nr = atoi(argv[0]);
3696 struct gsm_bts_trx *trx = vty->index;
3697 struct gsm_bts_trx_ts *ts;
3698
3699 if (ts_nr >= TRX_NR_TS) {
3700 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
3701 TRX_NR_TS, VTY_NEWLINE);
3702 return CMD_WARNING;
3703 }
3704
3705 ts = &trx->ts[ts_nr];
3706
3707 vty->index = ts;
3708 vty->node = TS_NODE;
3709
3710 return CMD_SUCCESS;
3711}
3712
Harald Weltea6fd58e2009-08-07 00:25:23 +02003713DEFUN(cfg_ts_pchan,
3714 cfg_ts_pchan_cmd,
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003715 "phys_chan_config PCHAN", /* dynamically generated! */
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003716 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003717{
3718 struct gsm_bts_trx_ts *ts = vty->index;
3719 int pchanc;
3720
3721 pchanc = gsm_pchan_parse(argv[0]);
3722 if (pchanc < 0)
3723 return CMD_WARNING;
3724
3725 ts->pchan = pchanc;
3726
3727 return CMD_SUCCESS;
3728}
3729
3730/* used for backwards compatibility with old config files that still
3731 * have uppercase pchan type names */
3732DEFUN_HIDDEN(cfg_ts_pchan_compat,
3733 cfg_ts_pchan_compat_cmd,
Harald Weltea6fd58e2009-08-07 00:25:23 +02003734 "phys_chan_config PCHAN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003735 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003736{
3737 struct gsm_bts_trx_ts *ts = vty->index;
3738 int pchanc;
3739
3740 pchanc = gsm_pchan_parse(argv[0]);
3741 if (pchanc < 0)
3742 return CMD_WARNING;
3743
3744 ts->pchan = pchanc;
3745
3746 return CMD_SUCCESS;
3747}
3748
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003749
3750
Harald Welte135a6482011-05-30 12:09:13 +02003751DEFUN(cfg_ts_tsc,
3752 cfg_ts_tsc_cmd,
3753 "training_sequence_code <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003754 "Training Sequence Code of the Timeslot\n" "TSC\n")
Harald Welte135a6482011-05-30 12:09:13 +02003755{
3756 struct gsm_bts_trx_ts *ts = vty->index;
3757
Harald Welte903aaea2014-01-19 17:10:50 +01003758 if (!gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_MULTI_TSC)) {
3759 vty_out(vty, "%% This BTS does not support a TSC != BCC, "
3760 "falling back to BCC%s", VTY_NEWLINE);
3761 ts->tsc = -1;
3762 return CMD_WARNING;
3763 }
3764
Harald Welte135a6482011-05-30 12:09:13 +02003765 ts->tsc = atoi(argv[0]);
3766
3767 return CMD_SUCCESS;
3768}
3769
Harald Weltea39b0f22010-06-14 22:26:10 +02003770#define HOPPING_STR "Configure frequency hopping\n"
3771
3772DEFUN(cfg_ts_hopping,
3773 cfg_ts_hopping_cmd,
3774 "hopping enabled (0|1)",
3775 HOPPING_STR "Enable or disable frequency hopping\n"
3776 "Disable frequency hopping\n" "Enable frequency hopping\n")
3777{
3778 struct gsm_bts_trx_ts *ts = vty->index;
Harald Weltec2fb3d02010-06-14 22:47:37 +02003779 int enabled = atoi(argv[0]);
Harald Weltea39b0f22010-06-14 22:26:10 +02003780
Harald Weltec2fb3d02010-06-14 22:47:37 +02003781 if (enabled && !gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_HOPPING)) {
3782 vty_out(vty, "BTS model does not support hopping%s",
3783 VTY_NEWLINE);
3784 return CMD_WARNING;
3785 }
3786
3787 ts->hopping.enabled = enabled;
Harald Weltea39b0f22010-06-14 22:26:10 +02003788
3789 return CMD_SUCCESS;
3790}
3791
Harald Welte6e0cd042009-09-12 13:05:33 +02003792DEFUN(cfg_ts_hsn,
3793 cfg_ts_hsn_cmd,
Harald Weltea39b0f22010-06-14 22:26:10 +02003794 "hopping sequence-number <0-63>",
3795 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003796 "Which hopping sequence to use for this channel\n"
3797 "Hopping Sequence Number (HSN)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003798{
3799 struct gsm_bts_trx_ts *ts = vty->index;
3800
3801 ts->hopping.hsn = atoi(argv[0]);
3802
3803 return CMD_SUCCESS;
3804}
3805
3806DEFUN(cfg_ts_maio,
3807 cfg_ts_maio_cmd,
3808 "hopping maio <0-63>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003809 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003810 "Which hopping MAIO to use for this channel\n"
3811 "Mobile Allocation Index Offset (MAIO)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003812{
3813 struct gsm_bts_trx_ts *ts = vty->index;
3814
3815 ts->hopping.maio = atoi(argv[0]);
3816
3817 return CMD_SUCCESS;
3818}
3819
3820DEFUN(cfg_ts_arfcn_add,
3821 cfg_ts_arfcn_add_cmd,
3822 "hopping arfcn add <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003823 HOPPING_STR "Configure hopping ARFCN list\n"
3824 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003825{
3826 struct gsm_bts_trx_ts *ts = vty->index;
3827 int arfcn = atoi(argv[0]);
3828
Harald Weltea39b0f22010-06-14 22:26:10 +02003829 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
3830
Harald Welte6e0cd042009-09-12 13:05:33 +02003831 return CMD_SUCCESS;
3832}
3833
3834DEFUN(cfg_ts_arfcn_del,
3835 cfg_ts_arfcn_del_cmd,
3836 "hopping arfcn del <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003837 HOPPING_STR "Configure hopping ARFCN list\n"
3838 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003839{
3840 struct gsm_bts_trx_ts *ts = vty->index;
3841 int arfcn = atoi(argv[0]);
3842
Harald Weltea39b0f22010-06-14 22:26:10 +02003843 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
3844
Harald Welte6e0cd042009-09-12 13:05:33 +02003845 return CMD_SUCCESS;
3846}
3847
Harald Weltea6fd58e2009-08-07 00:25:23 +02003848DEFUN(cfg_ts_e1_subslot,
3849 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003850 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003851 "E1/T1 channel connected to this on-air timeslot\n"
3852 "E1/T1 channel connected to this on-air timeslot\n"
3853 "E1/T1 line connected to this on-air timeslot\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02003854 "E1/T1 timeslot connected to this on-air timeslot\n"
3855 "E1/T1 timeslot connected to this on-air timeslot\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02003856 "E1/T1 sub-slot connected to this on-air timeslot\n"
3857 "E1/T1 sub-slot 0 connected to this on-air timeslot\n"
3858 "E1/T1 sub-slot 1 connected to this on-air timeslot\n"
3859 "E1/T1 sub-slot 2 connected to this on-air timeslot\n"
3860 "E1/T1 sub-slot 3 connected to this on-air timeslot\n"
3861 "Full E1/T1 timeslot connected to this on-air timeslot\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003862{
3863 struct gsm_bts_trx_ts *ts = vty->index;
3864
Harald Welte42581822009-08-08 16:12:58 +02003865 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003866
3867 return CMD_SUCCESS;
3868}
Harald Welte5258fc42009-03-28 19:07:53 +00003869
Harald Welte4f10c252010-05-16 21:47:13 +02003870void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
3871{
3872 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003873 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_TOTAL].current,
3874 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_NO_CHANNEL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003875 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003876 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003877 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RF_FAIL].current,
3878 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RLL_ERR].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003879 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003880 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003881 net->bsc_ctrs->ctr[BSC_CTR_PAGING_ATTEMPTED].current,
3882 net->bsc_ctrs->ctr[BSC_CTR_PAGING_COMPLETED].current,
3883 net->bsc_ctrs->ctr[BSC_CTR_PAGING_EXPIRED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003884 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003885 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003886 net->bsc_ctrs->ctr[BSC_CTR_BTS_OML_FAIL].current,
3887 net->bsc_ctrs->ctr[BSC_CTR_BTS_RSL_FAIL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003888 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003889}
3890
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003891DEFUN(drop_bts,
3892 drop_bts_cmd,
Holger Hans Peter Freyther0586b0f2010-04-11 12:46:45 +02003893 "drop bts connection <0-65535> (oml|rsl)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003894 "Debug/Simulation command to drop Abis/IP BTS\n"
3895 "Debug/Simulation command to drop Abis/IP BTS\n"
3896 "Debug/Simulation command to drop Abis/IP BTS\n"
3897 "BTS NR\n" "Drop OML Connection\n" "Drop RSL Connection\n")
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003898{
3899 struct gsm_network *gsmnet;
3900 struct gsm_bts_trx *trx;
3901 struct gsm_bts *bts;
3902 unsigned int bts_nr;
3903
3904 gsmnet = gsmnet_from_vty(vty);
3905
3906 bts_nr = atoi(argv[0]);
3907 if (bts_nr >= gsmnet->num_bts) {
3908 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3909 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3910 return CMD_WARNING;
3911 }
3912
3913 bts = gsm_bts_num(gsmnet, bts_nr);
3914 if (!bts) {
3915 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3916 return CMD_WARNING;
3917 }
3918
3919 if (!is_ipaccess_bts(bts)) {
3920 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
3921 return CMD_WARNING;
3922 }
3923
3924
3925 /* close all connections */
3926 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003927 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003928 } else if (strcmp(argv[1], "rsl") == 0) {
3929 /* close all rsl connections */
3930 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003931 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003932 }
3933 } else {
3934 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
3935 return CMD_WARNING;
3936 }
3937
3938 return CMD_SUCCESS;
3939}
3940
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01003941DEFUN(restart_bts, restart_bts_cmd,
3942 "restart-bts <0-65535>",
3943 "Restart ip.access nanoBTS through OML\n"
3944 "BTS Number\n")
3945{
3946 struct gsm_network *gsmnet;
3947 struct gsm_bts_trx *trx;
3948 struct gsm_bts *bts;
3949 unsigned int bts_nr;
3950
3951 gsmnet = gsmnet_from_vty(vty);
3952
3953 bts_nr = atoi(argv[0]);
3954 if (bts_nr >= gsmnet->num_bts) {
3955 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3956 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3957 return CMD_WARNING;
3958 }
3959
3960 bts = gsm_bts_num(gsmnet, bts_nr);
3961 if (!bts) {
3962 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3963 return CMD_WARNING;
3964 }
3965
3966 if (!is_ipaccess_bts(bts) || is_sysmobts_v2(bts)) {
3967 vty_out(vty, "This command only works for ipaccess nanoBTS.%s",
3968 VTY_NEWLINE);
3969 return CMD_WARNING;
3970 }
3971
3972 /* go from last TRX to c0 */
3973 llist_for_each_entry_reverse(trx, &bts->trx_list, list)
3974 abis_nm_ipaccess_restart(trx);
3975
3976 return CMD_SUCCESS;
3977}
3978
Harald Welte30f1f372014-12-28 15:00:45 +01003979DEFUN(smscb_cmd, smscb_cmd_cmd,
3980 "bts <0-255> smscb-command <1-4> HEXSTRING",
3981 "BTS related commands\n" "BTS Number\n"
3982 "SMS Cell Broadcast\n" "Last Valid Block\n"
3983 "Hex Encoded SMSCB message (up to 88 octets)\n")
3984{
3985 struct gsm_bts *bts;
3986 int bts_nr = atoi(argv[0]);
3987 int last_block = atoi(argv[1]);
3988 struct rsl_ie_cb_cmd_type cb_cmd;
3989 uint8_t buf[88];
3990 int rc;
3991
3992 bts = gsm_bts_num(bsc_gsmnet, bts_nr);
3993 if (!bts) {
3994 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3995 return CMD_WARNING;
3996 }
3997 rc = osmo_hexparse(argv[2], buf, sizeof(buf));
3998 if (rc < 0 || rc > sizeof(buf)) {
3999 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
4000 return CMD_WARNING;
4001 }
4002
4003 cb_cmd.spare = 0;
4004 cb_cmd.def_bcast = 0;
4005 cb_cmd.command = RSL_CB_CMD_TYPE_NORMAL;
4006
4007 switch (last_block) {
4008 case 1:
4009 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_1;
4010 break;
4011 case 2:
4012 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_2;
4013 break;
4014 case 3:
4015 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_3;
4016 break;
4017 case 4:
4018 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_4;
4019 break;
4020 }
4021
4022 rsl_sms_cb_command(bts, RSL_CHAN_SDCCH4_ACCH, cb_cmd, buf, rc);
4023
4024 return CMD_SUCCESS;
4025}
4026
4027
Harald Welted0d2b0b2010-12-23 13:18:07 +01004028DEFUN(pdch_act, pdch_act_cmd,
4029 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
4030 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
4031 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
4032 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
4033 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
4034{
4035 struct gsm_bts *bts;
4036 struct gsm_bts_trx *trx;
4037 struct gsm_bts_trx_ts *ts;
4038 int bts_nr = atoi(argv[0]);
4039 int trx_nr = atoi(argv[1]);
4040 int ts_nr = atoi(argv[2]);
4041 int activate;
4042
4043 bts = gsm_bts_num(bsc_gsmnet, bts_nr);
4044 if (!bts) {
4045 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
4046 return CMD_WARNING;
4047 }
4048
4049 if (!is_ipaccess_bts(bts)) {
4050 vty_out(vty, "%% This command only works for ipaccess BTS%s",
4051 VTY_NEWLINE);
4052 return CMD_WARNING;
4053 }
4054
4055 trx = gsm_bts_trx_num(bts, trx_nr);
4056 if (!trx) {
4057 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
4058 return CMD_WARNING;
4059 }
4060
4061 ts = &trx->ts[ts_nr];
4062 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
4063 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
4064 "mode%s", ts_nr, VTY_NEWLINE);
4065 return CMD_WARNING;
4066 }
4067
4068 if (!strcmp(argv[3], "activate"))
4069 activate = 1;
4070 else
4071 activate = 0;
4072
4073 rsl_ipacc_pdch_activate(ts, activate);
4074
4075 return CMD_SUCCESS;
4076
4077}
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004078
Harald Weltedcccb182010-05-16 20:52:23 +02004079extern int bsc_vty_init_extra(void);
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02004080
Neels Hofmeyr43d86bf2016-05-10 13:40:19 +02004081int bsc_vty_init(const struct log_info *cat, struct gsm_network *network)
Harald Welte68628e82009-03-10 12:17:57 +00004082{
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004083 cfg_ts_pchan_cmd.string =
4084 vty_cmd_string_from_valstr(tall_bsc_ctx,
4085 gsm_pchant_names,
4086 "phys_chan_config (", "|", ")",
4087 VTY_DO_LOWER);
4088 cfg_ts_pchan_cmd.doc =
4089 vty_cmd_string_from_valstr(tall_bsc_ctx,
4090 gsm_pchant_descs,
4091 "Physical Channel Combination\n",
4092 "\n", "", 0);
4093
Harald Weltee555c2b2012-08-17 13:02:12 +02004094 cfg_bts_type_cmd.string =
4095 vty_cmd_string_from_valstr(tall_bsc_ctx,
4096 bts_type_names,
4097 "type (", "|", ")",
4098 VTY_DO_LOWER);
4099 cfg_bts_type_cmd.doc =
4100 vty_cmd_string_from_valstr(tall_bsc_ctx,
4101 bts_type_descs,
4102 "BTS Vendor/Type\n",
4103 "\n", "", 0);
4104
4105
Harald Welteb4d5b172010-05-12 16:10:35 +00004106 install_element_ve(&show_net_cmd);
4107 install_element_ve(&show_bts_cmd);
4108 install_element_ve(&show_trx_cmd);
4109 install_element_ve(&show_ts_cmd);
4110 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08004111 install_element_ve(&show_lchan_summary_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00004112
Harald Welteb4d5b172010-05-12 16:10:35 +00004113 install_element_ve(&show_paging_cmd);
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01004114 install_element_ve(&show_paging_group_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00004115
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01004116 logging_vty_add_cmds(cat);
Jacob Erlbeck64630cc2015-10-26 16:25:37 +01004117 osmo_stats_vty_add_cmds();
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01004118
Harald Welte5013b2a2009-08-07 13:29:14 +02004119 install_element(CONFIG_NODE, &cfg_net_cmd);
4120 install_node(&net_node, config_write_net);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004121 vty_install_default(GSMNET_NODE);
Harald Welte42581822009-08-08 16:12:58 +02004122 install_element(GSMNET_NODE, &cfg_net_ncc_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02004123 install_element(GSMNET_NODE, &cfg_net_mnc_cmd);
4124 install_element(GSMNET_NODE, &cfg_net_name_short_cmd);
4125 install_element(GSMNET_NODE, &cfg_net_name_long_cmd);
Harald Welte (local)69de3972009-08-12 14:42:23 +02004126 install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd);
Maxddee01f2016-05-24 14:23:27 +02004127 install_element(GSMNET_NODE, &cfg_net_authorize_regexp_cmd);
Harald Welte1085c092009-11-18 20:33:19 +01004128 install_element(GSMNET_NODE, &cfg_net_reject_cause_cmd);
Harald Welte4381cfe2009-08-30 15:47:06 +09004129 install_element(GSMNET_NODE, &cfg_net_encryption_cmd);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01004130 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Welteeab84a12009-12-13 10:53:12 +01004131 install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd);
Harald Welte3d23db42009-12-14 17:49:15 +01004132 install_element(GSMNET_NODE, &cfg_net_mm_info_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01004133 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-12-21 16:51:50 +01004134 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
4135 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
4136 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
4137 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
4138 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
4139 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01004140 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01004141 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
4142 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
4143 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
4144 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
4145 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
4146 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
4147 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
4148 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
4149 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltec9f499f2010-12-23 22:53:50 +01004150 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01004151 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08004152 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +01004153 install_element(GSMNET_NODE, &cfg_net_subscr_keep_cmd);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08004154 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02004155
4156 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02004157 install_node(&bts_node, config_write_bts);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004158 vty_install_default(BTS_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004159 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004160 install_element(BTS_NODE, &cfg_description_cmd);
4161 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02004162 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02004163 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Maxc08ee712016-05-11 12:45:13 +02004164 install_element(BTS_NODE, &cfg_bts_dtxu_cmd);
4165 install_element(BTS_NODE, &cfg_bts_dtxd_cmd);
4166 install_element(BTS_NODE, &cfg_bts_no_dtxu_cmd);
4167 install_element(BTS_NODE, &cfg_bts_no_dtxd_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00004168 install_element(BTS_NODE, &cfg_bts_lac_cmd);
4169 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004170 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00004171 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8b291802013-03-12 13:57:05 +01004172 install_element(BTS_NODE, &cfg_bts_rsl_ip_cmd);
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01004173 install_element(BTS_NODE, &cfg_bts_timezone_cmd);
Jacob Erlbeck946d1412013-09-17 13:59:29 +02004174 install_element(BTS_NODE, &cfg_bts_timezone_dst_cmd);
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01004175 install_element(BTS_NODE, &cfg_bts_no_timezone_cmd);
Sylvain Munautc9519462011-10-17 14:04:55 +02004176 install_element(BTS_NODE, &cfg_bts_nokia_site_skip_reset_cmd);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01004177 install_element(BTS_NODE, &cfg_bts_nokia_site_no_loc_rel_cnf_cmd);
Sipos Csaba56e17662015-02-07 13:27:36 +01004178 install_element(BTS_NODE, &cfg_bts_nokia_site_bts_reset_timer_cnf_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02004179 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004180 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
4181 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte7a8fa412009-08-10 13:48:16 +02004182 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01004183 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
4184 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02004185 install_element(BTS_NODE, &cfg_bts_chan_desc_att_cmd);
4186 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_pa_mfrms_cmd);
4187 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_ag_blks_res_cmd);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08004188 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
4189 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02004190 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08004191 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Ivan Kluchnikov67920592013-09-16 13:13:04 +04004192 install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02004193 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02004194 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02004195 install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
Harald Welte73225282009-12-12 18:17:25 +01004196 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
4197 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaute0b06b02010-11-28 18:17:28 +01004198 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
4199 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
4200 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
4201 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
4202 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
4203 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01004204 install_element(BTS_NODE, &cfg_bts_radio_link_timeout_cmd);
Harald Welte4511d892010-04-18 15:51:20 +02004205 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
bhargava350533c2016-07-21 11:14:34 +05304206 install_element(BTS_NODE, &cfg_bts_gprs_11bit_rach_support_for_egprs_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02004207 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004208 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01004209 install_element(BTS_NODE, &cfg_bts_gprs_net_ctrl_ord_cmd);
Max292ec582016-07-28 11:55:37 +02004210 install_element(BTS_NODE, &cfg_bts_gprs_ctrl_ack_cmd);
4211 install_element(BTS_NODE, &cfg_no_bts_gprs_ctrl_ack_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004212 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02004213 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08004214 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004215 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-03-14 23:30:30 +08004216 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
4217 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
4218 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08004219 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welte9fbff4a2010-07-30 11:50:09 +02004220 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
4221 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welte32c09622011-01-11 23:44:56 +01004222 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
4223 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Welte64c07d22011-02-15 11:43:27 +01004224 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Max59a1bf32016-04-15 16:04:46 +02004225 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_add_cmd);
4226 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_del_cmd);
Max26679e02016-04-20 15:57:13 +02004227 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_add_cmd);
4228 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_del_cmd);
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02004229 install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
4230 install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01004231 install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
4232 install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
Andreas Eversberga83d5112013-12-07 18:32:28 +01004233 install_element(BTS_NODE, &cfg_bts_codec0_cmd);
4234 install_element(BTS_NODE, &cfg_bts_codec1_cmd);
4235 install_element(BTS_NODE, &cfg_bts_codec2_cmd);
4236 install_element(BTS_NODE, &cfg_bts_codec3_cmd);
4237 install_element(BTS_NODE, &cfg_bts_codec4_cmd);
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01004238 install_element(BTS_NODE, &cfg_bts_depends_on_cmd);
4239 install_element(BTS_NODE, &cfg_bts_no_depends_on_cmd);
Andreas Eversberg73266522014-01-19 11:47:44 +01004240 install_element(BTS_NODE, &cfg_bts_amr_fr_modes1_cmd);
4241 install_element(BTS_NODE, &cfg_bts_amr_fr_modes2_cmd);
4242 install_element(BTS_NODE, &cfg_bts_amr_fr_modes3_cmd);
4243 install_element(BTS_NODE, &cfg_bts_amr_fr_modes4_cmd);
4244 install_element(BTS_NODE, &cfg_bts_amr_fr_thres1_cmd);
4245 install_element(BTS_NODE, &cfg_bts_amr_fr_thres2_cmd);
4246 install_element(BTS_NODE, &cfg_bts_amr_fr_thres3_cmd);
4247 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst1_cmd);
4248 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst2_cmd);
4249 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst3_cmd);
4250 install_element(BTS_NODE, &cfg_bts_amr_fr_start_mode_cmd);
4251 install_element(BTS_NODE, &cfg_bts_amr_hr_modes1_cmd);
4252 install_element(BTS_NODE, &cfg_bts_amr_hr_modes2_cmd);
4253 install_element(BTS_NODE, &cfg_bts_amr_hr_modes3_cmd);
4254 install_element(BTS_NODE, &cfg_bts_amr_hr_modes4_cmd);
4255 install_element(BTS_NODE, &cfg_bts_amr_hr_thres1_cmd);
4256 install_element(BTS_NODE, &cfg_bts_amr_hr_thres2_cmd);
4257 install_element(BTS_NODE, &cfg_bts_amr_hr_thres3_cmd);
4258 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst1_cmd);
4259 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst2_cmd);
4260 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst3_cmd);
4261 install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004262
Harald Welte5258fc42009-03-28 19:07:53 +00004263 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004264 install_node(&trx_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004265 vty_install_default(TRX_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004266 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004267 install_element(TRX_NODE, &cfg_description_cmd);
4268 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)7b37d972009-12-27 20:56:38 +01004269 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02004270 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004271 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
4272 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01004273 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004274
Harald Welte5258fc42009-03-28 19:07:53 +00004275 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004276 install_node(&ts_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004277 vty_install_default(TS_NODE);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004278 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004279 install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);
Harald Welte135a6482011-05-30 12:09:13 +02004280 install_element(TS_NODE, &cfg_ts_tsc_cmd);
Harald Weltea39b0f22010-06-14 22:26:10 +02004281 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte6e0cd042009-09-12 13:05:33 +02004282 install_element(TS_NODE, &cfg_ts_hsn_cmd);
4283 install_element(TS_NODE, &cfg_ts_maio_cmd);
4284 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
4285 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004286 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004287
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004288 install_element(ENABLE_NODE, &drop_bts_cmd);
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01004289 install_element(ENABLE_NODE, &restart_bts_cmd);
Harald Welted0d2b0b2010-12-23 13:18:07 +01004290 install_element(ENABLE_NODE, &pdch_act_cmd);
Harald Welte30f1f372014-12-28 15:00:45 +01004291 install_element(ENABLE_NODE, &smscb_cmd_cmd);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004292
Harald Welte81c9b9c2010-05-31 16:40:40 +02004293 abis_nm_vty_init();
Harald Weltee1d5eca2011-02-12 14:42:59 +01004294 abis_om2k_vty_init();
Harald Welte3016d9f2011-02-05 13:54:41 +01004295 e1inp_vty_init();
Harald Welte81c9b9c2010-05-31 16:40:40 +02004296
Harald Weltedcccb182010-05-16 20:52:23 +02004297 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00004298
Harald Welte68628e82009-03-10 12:17:57 +00004299 return 0;
4300}