blob: f14a20568ebe2b9c116158f07f701c1efd85338c [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>
Neels Hofmeyra42855f2017-02-23 21:49:55 +010054#include <openbsc/bsc_msc_data.h>
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +010055#include <openbsc/osmo_bsc_rf.h>
Harald Welte68628e82009-03-10 12:17:57 +000056
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +020057#include <openbsc/common_cs.h>
58
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +010059#include <inttypes.h>
60
Harald Weltec08e8be2011-03-04 13:53:51 +010061#include "../../bscconfig.h"
Harald Welte1353f962010-05-16 19:20:24 +020062
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +020063
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +020064#define LCHAN_NR_STR "Logical Channel Number\n"
65
66
Harald Welteea4647d2010-05-12 17:19:53 +000067/* FIXME: this should go to some common file */
68static const struct value_string gprs_ns_timer_strs[] = {
Harald Welte615e9562010-05-11 23:50:21 +020069 { 0, "tns-block" },
70 { 1, "tns-block-retries" },
71 { 2, "tns-reset" },
72 { 3, "tns-reset-retries" },
73 { 4, "tns-test" },
74 { 5, "tns-alive" },
75 { 6, "tns-alive-retries" },
76 { 0, NULL }
77};
78
Harald Welteea4647d2010-05-12 17:19:53 +000079static const struct value_string gprs_bssgp_cfg_strs[] = {
Harald Welte615e9562010-05-11 23:50:21 +020080 { 0, "blocking-timer" },
81 { 1, "blocking-retries" },
82 { 2, "unblocking-retries" },
83 { 3, "reset-timer" },
84 { 4, "reset-retries" },
85 { 5, "suspend-timer" },
86 { 6, "suspend-retries" },
87 { 7, "resume-timer" },
88 { 8, "resume-retries" },
89 { 9, "capability-update-timer" },
90 { 10, "capability-update-retries" },
91 { 0, NULL }
92};
93
Harald Welte64c07d22011-02-15 11:43:27 +010094static const struct value_string bts_neigh_mode_strs[] = {
95 { NL_MODE_AUTOMATIC, "automatic" },
96 { NL_MODE_MANUAL, "manual" },
97 { NL_MODE_MANUAL_SI5SEP, "manual-si5" },
98 { 0, NULL }
99};
100
Daniel Willmann7d109832012-05-14 18:43:23 +0200101const struct value_string bts_loc_fix_names[] = {
102 { BTS_LOC_FIX_INVALID, "invalid" },
103 { BTS_LOC_FIX_2D, "fix2d" },
104 { BTS_LOC_FIX_3D, "fix3d" },
105 { 0, NULL }
106};
107
Harald Welte68628e82009-03-10 12:17:57 +0000108struct cmd_node bts_node = {
109 BTS_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200110 "%s(config-net-bts)# ",
Harald Welte68628e82009-03-10 12:17:57 +0000111 1,
112};
113
114struct cmd_node trx_node = {
115 TRX_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200116 "%s(config-net-bts-trx)# ",
Harald Welte68628e82009-03-10 12:17:57 +0000117 1,
118};
119
120struct cmd_node ts_node = {
121 TS_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200122 "%s(config-net-bts-trx-ts)# ",
Harald Welte68628e82009-03-10 12:17:57 +0000123 1,
124};
125
126static int dummy_config_write(struct vty *v)
127{
128 return CMD_SUCCESS;
129}
130
131static void net_dump_nmstate(struct vty *vty, struct gsm_nm_state *nms)
132{
Harald Welte1304b352013-03-15 16:57:33 +0100133 vty_out(vty,"Oper '%s', Admin '%s', Avail '%s'%s",
134 abis_nm_opstate_name(nms->operational),
135 get_value_string(abis_nm_adm_state_names, nms->administrative),
Harald Welte867d9f32011-05-23 20:30:39 +0200136 abis_nm_avail_name(nms->availability), VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000137}
138
Harald Welteb908cb72009-12-22 13:09:29 +0100139static void dump_pchan_load_vty(struct vty *vty, char *prefix,
140 const struct pchan_load *pl)
141{
142 int i;
143
144 for (i = 0; i < ARRAY_SIZE(pl->pchan); i++) {
145 const struct load_counter *lc = &pl->pchan[i];
146 unsigned int percent;
147
148 if (lc->total == 0)
149 continue;
150
151 percent = (lc->used * 100) / lc->total;
152
153 vty_out(vty, "%s%20s: %3u%% (%u/%u)%s", prefix,
154 gsm_pchan_name(i), percent, lc->used, lc->total,
155 VTY_NEWLINE);
156 }
157}
158
Harald Welte68628e82009-03-10 12:17:57 +0000159static void net_dump_vty(struct vty *vty, struct gsm_network *net)
160{
Harald Welteb908cb72009-12-22 13:09:29 +0100161 struct pchan_load pl;
162
Harald Welteef235b52009-03-10 12:34:02 +0000163 vty_out(vty, "BSC is on Country Code %u, Network Code %u "
164 "and has %u BTS%s", net->country_code, net->network_code,
165 net->num_bts, VTY_NEWLINE);
Harald Welte1bc77352009-03-10 19:47:51 +0000166 vty_out(vty, " Long network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000167 net->name_long, VTY_NEWLINE);
Harald Welte1bc77352009-03-10 19:47:51 +0000168 vty_out(vty, " Short network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000169 net->name_short, VTY_NEWLINE);
Maxddee01f2016-05-24 14:23:27 +0200170 vty_out(vty, " Authentication policy: %s",
171 gsm_auth_policy_name(net->auth_policy));
172 if (net->authorized_reg_str)
173 vty_out(vty, ", authorized regexp: %s", net->authorized_reg_str);
174 vty_out(vty, "%s", VTY_NEWLINE);
Maxe6052c42016-06-30 10:25:49 +0200175 vty_out(vty, " Auto create subscriber: %s%s",
176 net->auto_create_subscr ? "yes" : "no", VTY_NEWLINE);
177 vty_out(vty, " Auto assign extension: %s%s",
178 net->auto_assign_exten ? "yes" : "no", VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100179 vty_out(vty, " Location updating reject cause: %u%s",
180 net->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900181 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
182 VTY_NEWLINE);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +0100183 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
184 VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800185 vty_out(vty, " Use TCH for Paging any: %d%s", net->pag_any_tch,
186 VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100187 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
188 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100189 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
190 VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100191 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
192 VTY_NEWLINE);
Harald Welteb908cb72009-12-22 13:09:29 +0100193 network_chan_load(&pl, net);
194 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
195 dump_pchan_load_vty(vty, " ", &pl);
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100196
197 /* show rf */
Holger Hans Peter Freythera9fae1a2014-02-08 12:12:03 +0100198 if (net->bsc_data)
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100199 vty_out(vty, " Last RF Command: %s%s",
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200200 net->bsc_data->rf_ctrl->last_state_command,
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100201 VTY_NEWLINE);
Holger Hans Peter Freythera9fae1a2014-02-08 12:12:03 +0100202 if (net->bsc_data)
Jacob Erlbeck779a7282013-09-11 10:46:57 +0200203 vty_out(vty, " Last RF Lock Command: %s%s",
204 net->bsc_data->rf_ctrl->last_rf_lock_ctrl_command,
205 VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000206}
207
Neels Hofmeyrea11bf82016-05-12 01:53:23 +0200208DEFUN(bsc_show_net, bsc_show_net_cmd, "show network",
Harald Welte68628e82009-03-10 12:17:57 +0000209 SHOW_STR "Display information about a GSM NETWORK\n")
210{
Harald Weltedcccb182010-05-16 20:52:23 +0200211 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000212 net_dump_vty(vty, net);
213
214 return CMD_SUCCESS;
215}
216
217static void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l)
218{
Harald Welteedb37782009-05-01 14:59:07 +0000219 struct e1inp_line *line;
220
221 if (!e1l) {
222 vty_out(vty, " None%s", VTY_NEWLINE);
223 return;
224 }
225
226 line = e1l->ts->line;
227
228 vty_out(vty, " E1 Line %u, Type %s: Timeslot %u, Mode %s%s",
229 line->num, line->driver->name, e1l->ts->num,
Harald Welte1bc77352009-03-10 19:47:51 +0000230 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
Harald Welteedb37782009-05-01 14:59:07 +0000231 vty_out(vty, " E1 TEI %u, SAPI %u%s",
Harald Welte68628e82009-03-10 12:17:57 +0000232 e1l->tei, e1l->sapi, VTY_NEWLINE);
233}
234
235static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
236{
Harald Welteb908cb72009-12-22 13:09:29 +0100237 struct pchan_load pl;
238
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200239 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Welte557c84e2015-11-20 10:50:24 +0100240 "BSIC %u (NCC=%u, BCC=%u) and %u TRX%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200241 bts->nr, btstype2str(bts->type), gsm_band_name(bts->band),
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200242 bts->cell_identity,
Harald Weltea2bbc5e2015-11-20 10:43:31 +0100243 bts->location_area_code, bts->bsic,
Harald Welte557c84e2015-11-20 10:50:24 +0100244 bts->bsic >> 3, bts->bsic & 7,
Harald Weltefcd24452009-06-20 18:15:19 +0200245 bts->num_trx, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200246 vty_out(vty, "Description: %s%s",
247 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Maxf9685c12017-03-23 12:01:07 +0100248 if (strnlen(bts->pcu_version, MAX_VERSION_LENGTH))
249 vty_out(vty, "PCU version %s connected%s", bts->pcu_version,
250 VTY_NEWLINE);
Harald Welte1d8dbc42009-12-12 15:38:16 +0100251 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100252 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte1d8dbc42009-12-12 15:38:16 +0100253 rxlev2dbm(bts->si_common.cell_sel_par.rxlev_acc_min),
254 VTY_NEWLINE);
255 vty_out(vty, "Cell Reselection Hysteresis: %u dBm%s",
Harald Welte73225282009-12-12 18:17:25 +0100256 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100257 vty_out(vty, "RACH TX-Integer: %u%s", bts->si_common.rach_control.tx_integer,
258 VTY_NEWLINE);
259 vty_out(vty, "RACH Max transmissions: %u%s",
260 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
261 VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100262 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200263 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +0200264 if (bts->dtxu != GSM48_DTX_SHALL_NOT_BE_USED)
265 vty_out(vty, "Uplink DTX: %s%s",
266 (bts->dtxu != GSM48_DTX_SHALL_BE_USED) ?
267 "enabled" : "forced", VTY_NEWLINE);
268 else
269 vty_out(vty, "Uplink DTX: not enabled%s", VTY_NEWLINE);
270 vty_out(vty, "Downlink DTX: %senabled%s", bts->dtxd ? "" : "not ",
271 VTY_NEWLINE);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +0200272 vty_out(vty, "Channel Description Attachment: %s%s",
273 (bts->si_common.chan_desc.att) ? "yes" : "no", VTY_NEWLINE);
274 vty_out(vty, "Channel Description BS-PA-MFRMS: %u%s",
275 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
276 vty_out(vty, "Channel Description BS-AG_BLKS-RES: %u%s",
277 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
Harald Welte9fbff4a2010-07-30 11:50:09 +0200278 vty_out(vty, "System Information present: 0x%08x, static: 0x%08x%s",
279 bts->si_valid, bts->si_mode_static, VTY_NEWLINE);
Harald Welte42def722017-01-13 00:10:32 +0100280 vty_out(vty, "Early Classmark Sending: %s%s",
281 bts->early_classmark_allowed ? "allowed" : "forbidden",
282 VTY_NEWLINE);
Harald Welte4cc34222009-05-01 15:12:31 +0000283 if (is_ipaccess_bts(bts))
Harald Welte8175e952009-10-20 00:22:00 +0200284 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte4cc34222009-05-01 15:12:31 +0000285 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte8175e952009-10-20 00:22:00 +0200286 bts->oml_tei, VTY_NEWLINE);
Sylvain Munautc9519462011-10-17 14:04:55 +0200287 else if (bts->type == GSM_BTS_TYPE_NOKIA_SITE)
288 vty_out(vty, " Skip Reset: %d%s",
289 bts->nokia.skip_reset, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000290 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200291 net_dump_nmstate(vty, &bts->mo.nm_state);
Harald Welte68628e82009-03-10 12:17:57 +0000292 vty_out(vty, " Site Mgr NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200293 net_dump_nmstate(vty, &bts->site_mgr.mo.nm_state);
Holger Hans Peter Freyther846d8dc2013-05-29 16:22:09 +0200294 vty_out(vty, " GPRS NSE: ");
295 net_dump_nmstate(vty, &bts->gprs.nse.mo.nm_state);
296 vty_out(vty, " GPRS CELL: ");
297 net_dump_nmstate(vty, &bts->gprs.cell.mo.nm_state);
298 vty_out(vty, " GPRS NSVC0: ");
299 net_dump_nmstate(vty, &bts->gprs.nsvc[0].mo.nm_state);
300 vty_out(vty, " GPRS NSVC1: ");
301 net_dump_nmstate(vty, &bts->gprs.nsvc[1].mo.nm_state);
Holger Hans Peter Freyther66e14cd2011-04-26 15:52:34 +0200302 vty_out(vty, " Paging: %u pending requests, %u free slots%s",
303 paging_pending_requests_nr(bts),
Harald Welte68628e82009-03-10 12:17:57 +0000304 bts->paging.available_slots, VTY_NEWLINE);
Holger Hans Peter Freytherd283db42010-11-25 16:28:45 +0100305 if (is_ipaccess_bts(bts)) {
306 vty_out(vty, " OML Link state: %s.%s",
307 bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);
308 } else {
Harald Welte8175e952009-10-20 00:22:00 +0200309 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
310 e1isl_dump_vty(vty, bts->oml_link);
311 }
Holger Hans Peter Freytherd283db42010-11-25 16:28:45 +0100312
313 /* FIXME: chan_desc */
Harald Welteb908cb72009-12-22 13:09:29 +0100314 memset(&pl, 0, sizeof(pl));
Neels Hofmeyr2afffd52016-09-25 17:01:20 +0200315 bts_chan_load(&pl, bts);
Harald Welteb908cb72009-12-22 13:09:29 +0100316 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
317 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte68628e82009-03-10 12:17:57 +0000318}
319
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100320DEFUN(show_bts, show_bts_cmd, "show bts [<0-255>]",
Harald Welte68628e82009-03-10 12:17:57 +0000321 SHOW_STR "Display information about a BTS\n"
322 "BTS number")
323{
Harald Weltedcccb182010-05-16 20:52:23 +0200324 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000325 int bts_nr;
326
327 if (argc != 0) {
328 /* use the BTS number that the user has specified */
329 bts_nr = atoi(argv[0]);
Harald Welte712ddbc2010-12-24 12:24:03 +0100330 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000331 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000332 VTY_NEWLINE);
333 return CMD_WARNING;
334 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200335 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000336 return CMD_SUCCESS;
337 }
338 /* print all BTS's */
339 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee441d9c2009-06-21 16:17:15 +0200340 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000341
342 return CMD_SUCCESS;
343}
344
Harald Welte42581822009-08-08 16:12:58 +0200345/* utility functions */
346static void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,
347 const char *ts, const char *ss)
348{
349 e1_link->e1_nr = atoi(line);
350 e1_link->e1_ts = atoi(ts);
351 if (!strcmp(ss, "full"))
352 e1_link->e1_ts_ss = 255;
353 else
354 e1_link->e1_ts_ss = atoi(ss);
355}
356
357static void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,
358 const char *prefix)
359{
360 if (!e1_link->e1_ts)
361 return;
362
363 if (e1_link->e1_ts_ss == 255)
364 vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",
365 prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);
366 else
367 vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",
368 prefix, e1_link->e1_nr, e1_link->e1_ts,
369 e1_link->e1_ts_ss, VTY_NEWLINE);
370}
371
372
Harald Welte67ce0732009-08-06 19:06:46 +0200373static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
374{
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100375 vty_out(vty, " timeslot %u%s", ts->nr, VTY_NEWLINE);
Harald Weltea2bbc5e2015-11-20 10:43:31 +0100376 if (ts->tsc != -1)
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100377 vty_out(vty, " training_sequence_code %u%s", ts->tsc, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200378 if (ts->pchan != GSM_PCHAN_NONE)
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100379 vty_out(vty, " phys_chan_config %s%s",
Harald Welte42581822009-08-08 16:12:58 +0200380 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100381 vty_out(vty, " hopping enabled %u%s",
Harald Weltea39b0f22010-06-14 22:26:10 +0200382 ts->hopping.enabled, VTY_NEWLINE);
383 if (ts->hopping.enabled) {
384 unsigned int i;
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100385 vty_out(vty, " hopping sequence-number %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200386 ts->hopping.hsn, VTY_NEWLINE);
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100387 vty_out(vty, " hopping maio %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200388 ts->hopping.maio, VTY_NEWLINE);
Harald Weltea39b0f22010-06-14 22:26:10 +0200389 for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {
390 if (!bitvec_get_bit_pos(&ts->hopping.arfcns, i))
391 continue;
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100392 vty_out(vty, " hopping arfcn add %u%s",
Harald Weltea39b0f22010-06-14 22:26:10 +0200393 i, VTY_NEWLINE);
394 }
Harald Welte127af342010-12-24 12:07:07 +0100395 }
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100396 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Welteface7ed2011-02-14 16:15:21 +0100397
398 if (ts->trx->bts->model->config_write_ts)
399 ts->trx->bts->model->config_write_ts(vty, ts);
Harald Welte67ce0732009-08-06 19:06:46 +0200400}
401
402static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
403{
404 int i;
405
Harald Welte5013b2a2009-08-07 13:29:14 +0200406 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200407 if (trx->description)
408 vty_out(vty, " description %s%s", trx->description,
409 VTY_NEWLINE);
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200410 vty_out(vty, " rf_locked %u%s",
Harald Welted64c0bc2011-05-30 12:07:53 +0200411 trx->mo.nm_state.administrative == NM_STATE_LOCKED ? 1 : 0,
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200412 VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200413 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)7b37d972009-12-27 20:56:38 +0100414 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200415 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200416 config_write_e1_link(vty, &trx->rsl_e1_link, " rsl ");
417 vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei, VTY_NEWLINE);
Harald Welte67ce0732009-08-06 19:06:46 +0200418
Harald Welteface7ed2011-02-14 16:15:21 +0100419 if (trx->bts->model->config_write_trx)
420 trx->bts->model->config_write_trx(vty, trx);
421
Harald Welte67ce0732009-08-06 19:06:46 +0200422 for (i = 0; i < TRX_NR_TS; i++)
423 config_write_ts_single(vty, &trx->ts[i]);
424}
425
Harald Welte615e9562010-05-11 23:50:21 +0200426static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
427{
428 unsigned int i;
429 vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
430 VTY_NEWLINE);
431 if (bts->gprs.mode == BTS_GPRS_NONE)
432 return;
433
bhargava350533c2016-07-21 11:14:34 +0530434 vty_out(vty, " gprs 11bit_rach_support_for_egprs %u%s",
435 bts->gprs.supports_egprs_11bit_rach, VTY_NEWLINE);
436
Harald Welte615e9562010-05-11 23:50:21 +0200437 vty_out(vty, " gprs routing area %u%s", bts->gprs.rac,
438 VTY_NEWLINE);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +0100439 vty_out(vty, " gprs network-control-order nc%u%s",
440 bts->gprs.net_ctrl_ord, VTY_NEWLINE);
Max292ec582016-07-28 11:55:37 +0200441 if (!bts->gprs.ctrl_ack_type_use_block)
442 vty_out(vty, " gprs control-ack-type-rach%s", VTY_NEWLINE);
Harald Welte615e9562010-05-11 23:50:21 +0200443 vty_out(vty, " gprs cell bvci %u%s", bts->gprs.cell.bvci,
444 VTY_NEWLINE);
445 for (i = 0; i < ARRAY_SIZE(bts->gprs.cell.timer); i++)
446 vty_out(vty, " gprs cell timer %s %u%s",
447 get_value_string(gprs_bssgp_cfg_strs, i),
448 bts->gprs.cell.timer[i], VTY_NEWLINE);
449 vty_out(vty, " gprs nsei %u%s", bts->gprs.nse.nsei,
450 VTY_NEWLINE);
451 for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)
452 vty_out(vty, " gprs ns timer %s %u%s",
453 get_value_string(gprs_ns_timer_strs, i),
454 bts->gprs.nse.timer[i], VTY_NEWLINE);
455 for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
456 struct gsm_bts_gprs_nsvc *nsvc =
457 &bts->gprs.nsvc[i];
458 struct in_addr ia;
459
460 ia.s_addr = htonl(nsvc->remote_ip);
461 vty_out(vty, " gprs nsvc %u nsvci %u%s", i,
462 nsvc->nsvci, VTY_NEWLINE);
463 vty_out(vty, " gprs nsvc %u local udp port %u%s", i,
464 nsvc->local_port, VTY_NEWLINE);
465 vty_out(vty, " gprs nsvc %u remote udp port %u%s", i,
466 nsvc->remote_port, VTY_NEWLINE);
467 vty_out(vty, " gprs nsvc %u remote ip %s%s", i,
468 inet_ntoa(ia), VTY_NEWLINE);
469 }
470}
471
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200472/* Write the model data if there is one */
473static void config_write_bts_model(struct vty *vty, struct gsm_bts *bts)
Harald Welte67ce0732009-08-06 19:06:46 +0200474{
475 struct gsm_bts_trx *trx;
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200476
477 if (!bts->model)
478 return;
479
480 if (bts->model->config_write_bts)
481 bts->model->config_write_bts(vty, bts);
482
483 llist_for_each_entry(trx, &bts->trx_list, list)
484 config_write_trx_single(vty, trx);
485}
486
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +0200487static void write_amr_modes(struct vty *vty, const char *prefix,
488 const char *name, struct amr_mode *modes, int num)
489{
490 int i;
491
492 vty_out(vty, " %s threshold %s", prefix, name);
493 for (i = 0; i < num - 1; i++)
494 vty_out(vty, " %d", modes[i].threshold);
495 vty_out(vty, "%s", VTY_NEWLINE);
496 vty_out(vty, " %s hysteresis %s", prefix, name);
497 for (i = 0; i < num - 1; i++)
498 vty_out(vty, " %d", modes[i].hysteresis);
499 vty_out(vty, "%s", VTY_NEWLINE);
500}
501
Andreas Eversberg73266522014-01-19 11:47:44 +0100502static void config_write_bts_amr(struct vty *vty, struct gsm_bts *bts,
503 struct amr_multirate_conf *mr, int full)
504{
505 struct gsm48_multi_rate_conf *mr_conf;
506 const char *prefix = (full) ? "amr tch-f" : "amr tch-h";
507 int i, num;
508
509 if (!(mr->gsm48_ie[1]))
510 return;
511
512 mr_conf = (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
513
514 num = 0;
515 vty_out(vty, " %s modes", prefix);
516 for (i = 0; i < ((full) ? 8 : 6); i++) {
517 if ((mr->gsm48_ie[1] & (1 << i))) {
518 vty_out(vty, " %d", i);
519 num++;
520 }
521 }
522 vty_out(vty, "%s", VTY_NEWLINE);
523 if (num > 4)
524 num = 4;
525 if (num > 1) {
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +0200526 write_amr_modes(vty, prefix, "ms", mr->ms_mode, num);
527 write_amr_modes(vty, prefix, "bts", mr->bts_mode, num);
Andreas Eversberg73266522014-01-19 11:47:44 +0100528 }
529 vty_out(vty, " %s start-mode ", prefix);
530 if (mr_conf->icmi) {
531 num = 0;
532 for (i = 0; i < ((full) ? 8 : 6) && num < 4; i++) {
533 if ((mr->gsm48_ie[1] & (1 << i)))
534 num++;
535 if (mr_conf->smod == num - 1) {
536 vty_out(vty, "%d%s", num, VTY_NEWLINE);
537 break;
538 }
539 }
540 } else
541 vty_out(vty, "auto%s", VTY_NEWLINE);
542}
543
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200544static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
545{
Harald Welte9fbff4a2010-07-30 11:50:09 +0200546 int i;
Max2c16bee2017-02-15 13:51:37 +0100547 uint8_t tmp;
Harald Welte67ce0732009-08-06 19:06:46 +0200548
Harald Welte5013b2a2009-08-07 13:29:14 +0200549 vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE);
550 vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200551 if (bts->description)
552 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200553 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freytherf926ed62009-11-19 16:38:49 +0100554 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200555 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte67ce0732009-08-06 19:06:46 +0200556 VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +0200557 if (bts->dtxu != GSM48_DTX_SHALL_NOT_BE_USED)
558 vty_out(vty, " dtx uplink%s%s",
559 (bts->dtxu != GSM48_DTX_SHALL_BE_USED) ? "" : " force",
560 VTY_NEWLINE);
561 if (bts->dtxd)
562 vty_out(vty, " dtx downlink%s", VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200563 vty_out(vty, " base_station_id_code %u%s", bts->bsic, VTY_NEWLINE);
Harald Welte (local)0e451d02009-08-13 10:14:26 +0200564 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100565 vty_out(vty, " cell reselection hysteresis %u%s",
566 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
567 vty_out(vty, " rxlev access min %u%s",
568 bts->si_common.cell_sel_par.rxlev_acc_min, VTY_NEWLINE);
Sylvain Munaute0b06b02010-11-28 18:17:28 +0100569
570 if (bts->si_common.cell_ro_sel_par.present) {
571 struct gsm48_si_selection_params *sp;
572 sp = &bts->si_common.cell_ro_sel_par;
573
574 if (sp->cbq)
575 vty_out(vty, " cell bar qualify %u%s",
576 sp->cbq, VTY_NEWLINE);
577
578 if (sp->cell_resel_off)
579 vty_out(vty, " cell reselection offset %u%s",
580 sp->cell_resel_off*2, VTY_NEWLINE);
581
582 if (sp->temp_offs == 7)
583 vty_out(vty, " temporary offset infinite%s",
584 VTY_NEWLINE);
585 else if (sp->temp_offs)
586 vty_out(vty, " temporary offset %u%s",
587 sp->temp_offs*10, VTY_NEWLINE);
588
589 if (sp->penalty_time == 31)
590 vty_out(vty, " penalty time reserved%s",
591 VTY_NEWLINE);
592 else if (sp->penalty_time)
593 vty_out(vty, " penalty time %u%s",
594 (sp->penalty_time*20)+20, VTY_NEWLINE);
595 }
596
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +0200597 /* Is periodic LU enabled or disabled? */
598 if (bts->si_common.chan_desc.t3212 == 0)
599 vty_out(vty, " no periodic location update%s", VTY_NEWLINE);
600 else
601 vty_out(vty, " periodic location update %u%s",
602 bts->si_common.chan_desc.t3212 * 6, VTY_NEWLINE);
603
Andreas Eversberg4d4944a2013-03-10 11:49:35 +0100604 vty_out(vty, " radio-link-timeout %d%s",
605 get_radio_link_timeout(&bts->si_common.cell_options),
606 VTY_NEWLINE);
Harald Welte7a8fa412009-08-10 13:48:16 +0200607 vty_out(vty, " channel allocator %s%s",
608 bts->chan_alloc_reverse ? "descending" : "ascending",
609 VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100610 vty_out(vty, " rach tx integer %u%s",
611 bts->si_common.rach_control.tx_integer, VTY_NEWLINE);
612 vty_out(vty, " rach max transmission %u%s",
613 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
614 VTY_NEWLINE);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800615
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +0200616 vty_out(vty, " channel-descrption attach %u%s",
617 bts->si_common.chan_desc.att, VTY_NEWLINE);
618 vty_out(vty, " channel-descrption bs-pa-mfrms %u%s",
619 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
620 vty_out(vty, " channel-descrption bs-ag-blks-res %u%s",
621 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
622
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800623 if (bts->rach_b_thresh != -1)
624 vty_out(vty, " rach nm busy threshold %u%s",
625 bts->rach_b_thresh, VTY_NEWLINE);
626 if (bts->rach_ldavg_slots != -1)
627 vty_out(vty, " rach nm load average %u%s",
628 bts->rach_ldavg_slots, VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100629 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200630 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +0800631 if ((bts->si_common.rach_control.t2 & 0x4) == 0)
632 vty_out(vty, " rach emergency call allowed 1%s", VTY_NEWLINE);
Ivan Kluchnikov67920592013-09-16 13:13:04 +0400633 if ((bts->si_common.rach_control.t3) != 0)
634 for (i = 0; i < 8; i++)
635 if (bts->si_common.rach_control.t3 & (0x1 << i))
636 vty_out(vty, " rach access-control-class %d barred%s", i, VTY_NEWLINE);
637 if ((bts->si_common.rach_control.t2 & 0xfb) != 0)
638 for (i = 0; i < 8; i++)
639 if ((i != 2) && (bts->si_common.rach_control.t2 & (0x1 << i)))
640 vty_out(vty, " rach access-control-class %d barred%s", i+8, VTY_NEWLINE);
Harald Welte9fbff4a2010-07-30 11:50:09 +0200641 for (i = SYSINFO_TYPE_1; i < _MAX_SYSINFO_TYPE; i++) {
642 if (bts->si_mode_static & (1 << i)) {
643 vty_out(vty, " system-information %s mode static%s",
644 get_value_string(osmo_sitype_strs, i), VTY_NEWLINE);
645 vty_out(vty, " system-information %s static %s%s",
646 get_value_string(osmo_sitype_strs, i),
Max6f0e50c2017-04-12 15:30:54 +0200647 osmo_hexdump_nospc(GSM_BTS_SI(bts, i), GSM_MACBLOCK_LEN),
Harald Welte9fbff4a2010-07-30 11:50:09 +0200648 VTY_NEWLINE);
649 }
650 }
Harald Welte42def722017-01-13 00:10:32 +0100651 vty_out(vty, " early-classmark-sending %s%s",
652 bts->early_classmark_allowed ? "allowed" : "forbidden", VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100653 switch (bts->type) {
654 case GSM_BTS_TYPE_NANOBTS:
Maxf9685c12017-03-23 12:01:07 +0100655 case GSM_BTS_TYPE_OSMOBTS:
Harald Welte5013b2a2009-08-07 13:29:14 +0200656 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Weltea6fd58e2009-08-07 00:25:23 +0200657 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte8b291802013-03-12 13:57:05 +0100658 if (bts->ip_access.rsl_ip) {
659 struct in_addr ia;
660 ia.s_addr = htonl(bts->ip_access.rsl_ip);
661 vty_out(vty, " ip.access rsl-ip %s%s", inet_ntoa(ia),
662 VTY_NEWLINE);
663 }
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +0200664 vty_out(vty, " oml ip.access stream_id %u line %u%s",
665 bts->oml_tei, bts->oml_e1_link.e1_nr, VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100666 break;
Sylvain Munautc9519462011-10-17 14:04:55 +0200667 case GSM_BTS_TYPE_NOKIA_SITE:
668 vty_out(vty, " nokia_site skip-reset %d%s", bts->nokia.skip_reset, VTY_NEWLINE);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +0100669 vty_out(vty, " nokia_site no-local-rel-conf %d%s",
670 bts->nokia.no_loc_rel_cnf, VTY_NEWLINE);
Sipos Csaba56e17662015-02-07 13:27:36 +0100671 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 +0100672 /* fall through: Nokia requires "oml e1" parameters also */
Harald Weltefd355a32011-03-04 13:41:31 +0100673 default:
Harald Welte42581822009-08-08 16:12:58 +0200674 config_write_e1_link(vty, &bts->oml_e1_link, " oml ");
675 vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100676 break;
Harald Welte42581822009-08-08 16:12:58 +0200677 }
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +0800678
679 /* if we have a limit, write it */
680 if (bts->paging.free_chans_need >= 0)
681 vty_out(vty, " paging free %d%s", bts->paging.free_chans_need, VTY_NEWLINE);
682
Harald Welte32c09622011-01-11 23:44:56 +0100683 vty_out(vty, " neighbor-list mode %s%s",
Harald Welte64c07d22011-02-15 11:43:27 +0100684 get_value_string(bts_neigh_mode_strs, bts->neigh_list_manual_mode), VTY_NEWLINE);
685 if (bts->neigh_list_manual_mode != NL_MODE_AUTOMATIC) {
Harald Welte32c09622011-01-11 23:44:56 +0100686 for (i = 0; i < 1024; i++) {
687 if (bitvec_get_bit_pos(&bts->si_common.neigh_list, i))
688 vty_out(vty, " neighbor-list add arfcn %u%s",
689 i, VTY_NEWLINE);
690 }
691 }
Harald Welte64c07d22011-02-15 11:43:27 +0100692 if (bts->neigh_list_manual_mode == NL_MODE_MANUAL_SI5SEP) {
693 for (i = 0; i < 1024; i++) {
694 if (bitvec_get_bit_pos(&bts->si_common.si5_neigh_list, i))
695 vty_out(vty, " si5 neighbor-list add arfcn %u%s",
696 i, VTY_NEWLINE);
697 }
698 }
Harald Welte32c09622011-01-11 23:44:56 +0100699
Max59a1bf32016-04-15 16:04:46 +0200700 for (i = 0; i < MAX_EARFCN_LIST; i++) {
Max2c16bee2017-02-15 13:51:37 +0100701 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
702 if (e->arfcn[i] != OSMO_EARFCN_INVALID) {
703 vty_out(vty, " si2quater neighbor-list add earfcn %u "
704 "thresh-hi %u", e->arfcn[i], e->thresh_hi);
705
706 vty_out(vty, " thresh-lo %u",
707 e->thresh_lo_valid ? e->thresh_lo : 32);
708
709 vty_out(vty, " prio %u",
710 e->prio_valid ? e->prio : 8);
711
712 vty_out(vty, " qrxlv %u",
713 e->qrxlm_valid ? e->qrxlm : 32);
714
715 tmp = e->meas_bw[i];
716 vty_out(vty, " meas %u",
717 (tmp != OSMO_EARFCN_MEAS_INVALID) ? tmp : 8);
Max59a1bf32016-04-15 16:04:46 +0200718
719 vty_out(vty, "%s", VTY_NEWLINE);
720 }
721 }
722
Max26679e02016-04-20 15:57:13 +0200723 for (i = 0; i < bts->si_common.uarfcn_length; i++) {
724 vty_out(vty, " si2quater neighbor-list add uarfcn %u %u %u%s",
725 bts->si_common.data.uarfcn_list[i],
726 bts->si_common.data.scramble_list[i] & ~(1 << 9),
727 (bts->si_common.data.scramble_list[i] >> 9) & 1,
728 VTY_NEWLINE);
729 }
730
Andreas Eversberga83d5112013-12-07 18:32:28 +0100731 vty_out(vty, " codec-support fr");
732 if (bts->codec.hr)
733 vty_out(vty, " hr");
734 if (bts->codec.efr)
735 vty_out(vty, " efr");
736 if (bts->codec.amr)
737 vty_out(vty, " amr");
738 vty_out(vty, "%s", VTY_NEWLINE);
739
Andreas Eversberg73266522014-01-19 11:47:44 +0100740 config_write_bts_amr(vty, bts, &bts->mr_full, 1);
741 config_write_bts_amr(vty, bts, &bts->mr_half, 0);
742
Harald Welte615e9562010-05-11 23:50:21 +0200743 config_write_bts_gprs(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200744
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +0200745 if (bts->excl_from_rf_lock)
746 vty_out(vty, " rf-lock-exclude%s", VTY_NEWLINE);
747
Jacob Erlbeck65d114f2014-01-16 11:02:14 +0100748 vty_out(vty, " %sforce-combined-si%s",
749 bts->force_combined_si ? "" : "no ", VTY_NEWLINE);
750
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +0100751 for (i = 0; i < ARRAY_SIZE(bts->depends_on); ++i) {
752 int j;
753
754 if (bts->depends_on[i] == 0)
755 continue;
756
757 for (j = 0; j < sizeof(bts->depends_on[i]) * 8; ++j) {
758 int bts_nr;
759
760 if ((bts->depends_on[i] & (1<<j)) == 0)
761 continue;
762
763 bts_nr = (i * sizeof(bts->depends_on[i]) * 8) + j;
764 vty_out(vty, " depends-on-bts %d%s", bts_nr, VTY_NEWLINE);
765 }
766 }
767
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200768 config_write_bts_model(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200769}
770
771static int config_write_bts(struct vty *v)
772{
Harald Weltedcccb182010-05-16 20:52:23 +0200773 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte67ce0732009-08-06 19:06:46 +0200774 struct gsm_bts *bts;
775
776 llist_for_each_entry(bts, &gsmnet->bts_list, list)
777 config_write_bts_single(v, bts);
778
779 return CMD_SUCCESS;
780}
781
Harald Welte5013b2a2009-08-07 13:29:14 +0200782static int config_write_net(struct vty *vty)
783{
Harald Weltedcccb182010-05-16 20:52:23 +0200784 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
785
Harald Welte5013b2a2009-08-07 13:29:14 +0200786 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200787 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200788 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200789 vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE);
790 vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE);
Harald Welte (local)69de3972009-08-12 14:42:23 +0200791 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Maxddee01f2016-05-24 14:23:27 +0200792 if (gsmnet->authorized_reg_str)
793 vty_out(vty, " authorized-regexp %s%s", gsmnet->authorized_reg_str, VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100794 vty_out(vty, " location updating reject cause %u%s",
795 gsmnet->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900796 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freytherd54c3372009-11-19 16:37:48 +0100797 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800798 vty_out(vty, " paging any use tch %d%s", gsmnet->pag_any_tch, VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100799 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
800 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100801 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100802 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Welteb720bd32009-12-21 16:51:50 +0100803 vty_out(vty, " handover window rxlev averaging %u%s",
804 gsmnet->handover.win_rxlev_avg, VTY_NEWLINE);
805 vty_out(vty, " handover window rxqual averaging %u%s",
806 gsmnet->handover.win_rxqual_avg, VTY_NEWLINE);
807 vty_out(vty, " handover window rxlev neighbor averaging %u%s",
808 gsmnet->handover.win_rxlev_avg_neigh, VTY_NEWLINE);
809 vty_out(vty, " handover power budget interval %u%s",
810 gsmnet->handover.pwr_interval, VTY_NEWLINE);
811 vty_out(vty, " handover power budget hysteresis %u%s",
812 gsmnet->handover.pwr_hysteresis, VTY_NEWLINE);
813 vty_out(vty, " handover maximum distance %u%s",
814 gsmnet->handover.max_distance, VTY_NEWLINE);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +0100815 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100816 vty_out(vty, " timer t3103 %u%s", gsmnet->T3103, VTY_NEWLINE);
817 vty_out(vty, " timer t3105 %u%s", gsmnet->T3105, VTY_NEWLINE);
818 vty_out(vty, " timer t3107 %u%s", gsmnet->T3107, VTY_NEWLINE);
819 vty_out(vty, " timer t3109 %u%s", gsmnet->T3109, VTY_NEWLINE);
820 vty_out(vty, " timer t3111 %u%s", gsmnet->T3111, VTY_NEWLINE);
821 vty_out(vty, " timer t3113 %u%s", gsmnet->T3113, VTY_NEWLINE);
822 vty_out(vty, " timer t3115 %u%s", gsmnet->T3115, VTY_NEWLINE);
823 vty_out(vty, " timer t3117 %u%s", gsmnet->T3117, VTY_NEWLINE);
824 vty_out(vty, " timer t3119 %u%s", gsmnet->T3119, VTY_NEWLINE);
Harald Welte2862dca2010-12-23 14:39:29 +0100825 vty_out(vty, " timer t3122 %u%s", gsmnet->T3122, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100826 vty_out(vty, " timer t3141 %u%s", gsmnet->T3141, VTY_NEWLINE);
Vadim Yanitskiy7f3724e2017-03-31 23:27:44 +0700827 vty_out(vty, " dyn_ts_allow_tch_f %d%s",
828 gsmnet->dyn_ts_allow_tch_f ? 1 : 0, VTY_NEWLINE);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +0100829 vty_out(vty, " subscriber-keep-in-ram %d%s",
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100830 gsmnet->subscr_group->keep_subscr, VTY_NEWLINE);
Neels Hofmeyr73983952016-05-10 13:29:33 +0200831 if (gsmnet->tz.override != 0) {
832 if (gsmnet->tz.dst)
833 vty_out(vty, " timezone %d %d %d%s",
834 gsmnet->tz.hr, gsmnet->tz.mn, gsmnet->tz.dst,
835 VTY_NEWLINE);
836 else
837 vty_out(vty, " timezone %d %d%s",
838 gsmnet->tz.hr, gsmnet->tz.mn, VTY_NEWLINE);
839 }
Harald Welte5013b2a2009-08-07 13:29:14 +0200840
841 return CMD_SUCCESS;
842}
Harald Welte67ce0732009-08-06 19:06:46 +0200843
Harald Welte68628e82009-03-10 12:17:57 +0000844static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx)
845{
846 vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
847 trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200848 vty_out(vty, "Description: %s%s",
849 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Weltefcd24452009-06-20 18:15:19 +0200850 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte42581822009-08-08 16:12:58 +0200851 "resulting BS power: %d dBm%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200852 trx->nominal_power, trx->max_power_red,
Harald Welte42581822009-08-08 16:12:58 +0200853 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000854 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200855 net_dump_nmstate(vty, &trx->mo.nm_state);
Harald Welte68628e82009-03-10 12:17:57 +0000856 vty_out(vty, " Baseband Transceiver NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200857 net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);
Harald Welte8175e952009-10-20 00:22:00 +0200858 if (is_ipaccess_bts(trx->bts)) {
859 vty_out(vty, " ip.access stream ID: 0x%02x%s",
860 trx->rsl_tei, VTY_NEWLINE);
861 } else {
862 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
863 e1isl_dump_vty(vty, trx->rsl_link);
864 }
Harald Welte68628e82009-03-10 12:17:57 +0000865}
866
867DEFUN(show_trx,
868 show_trx_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100869 "show trx [<0-255>] [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200870 SHOW_STR "Display information about a TRX\n"
871 "BTS Number\n"
872 "TRX Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000873{
Harald Weltedcccb182010-05-16 20:52:23 +0200874 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000875 struct gsm_bts *bts = NULL;
876 struct gsm_bts_trx *trx;
877 int bts_nr, trx_nr;
878
879 if (argc >= 1) {
880 /* use the BTS number that the user has specified */
881 bts_nr = atoi(argv[0]);
882 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000883 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000884 VTY_NEWLINE);
885 return CMD_WARNING;
886 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200887 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000888 }
889 if (argc >= 2) {
890 trx_nr = atoi(argv[1]);
891 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000892 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000893 VTY_NEWLINE);
894 return CMD_WARNING;
895 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200896 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000897 trx_dump_vty(vty, trx);
898 return CMD_SUCCESS;
899 }
900 if (bts) {
901 /* print all TRX in this BTS */
902 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200903 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000904 trx_dump_vty(vty, trx);
905 }
906 return CMD_SUCCESS;
907 }
908
909 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200910 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000911 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200912 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000913 trx_dump_vty(vty, trx);
914 }
915 }
916
917 return CMD_SUCCESS;
918}
919
Harald Welte67ce0732009-08-06 19:06:46 +0200920
Harald Welte68628e82009-03-10 12:17:57 +0000921static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
922{
Harald Welte135a6482011-05-30 12:09:13 +0200923 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, phys cfg %s, TSC %u",
Harald Welte026b4ca2010-12-24 12:12:10 +0100924 ts->trx->bts->nr, ts->trx->nr, ts->nr,
Harald Welte1fe24122014-01-19 17:18:21 +0100925 gsm_pchan_name(ts->pchan), gsm_ts_tsc(ts));
Harald Weltecd103a92010-12-24 12:14:52 +0100926 if (ts->pchan == GSM_PCHAN_TCH_F_PDCH)
Harald Welteb29cea12010-12-24 12:26:13 +0100927 vty_out(vty, " (%s mode)",
Neels Hofmeyr2ebacce2016-06-14 14:08:35 +0200928 ts->flags & TS_F_PDCH_ACTIVE ? "PDCH" : "TCH/F");
Harald Weltecd103a92010-12-24 12:14:52 +0100929 vty_out(vty, "%s", VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000930 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200931 net_dump_nmstate(vty, &ts->mo.nm_state);
Harald Welte2c828992009-12-02 01:56:49 +0530932 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welteef235b52009-03-10 12:34:02 +0000933 vty_out(vty, " E1 Line %u, Timeslot %u, Subslot %u%s",
934 ts->e1_link.e1_nr, ts->e1_link.e1_ts,
935 ts->e1_link.e1_ts_ss, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000936}
937
938DEFUN(show_ts,
939 show_ts_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100940 "show timeslot [<0-255>] [<0-255>] [<0-7>]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200941 SHOW_STR "Display information about a TS\n"
942 "BTS Number\n" "TRX Number\n" "Timeslot Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000943{
Harald Weltedcccb182010-05-16 20:52:23 +0200944 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte274d0152010-12-24 12:05:03 +0100945 struct gsm_bts *bts = NULL;
946 struct gsm_bts_trx *trx = NULL;
947 struct gsm_bts_trx_ts *ts = NULL;
Harald Welte68628e82009-03-10 12:17:57 +0000948 int bts_nr, trx_nr, ts_nr;
949
950 if (argc >= 1) {
951 /* use the BTS number that the user has specified */
952 bts_nr = atoi(argv[0]);
953 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000954 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000955 VTY_NEWLINE);
956 return CMD_WARNING;
957 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200958 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000959 }
960 if (argc >= 2) {
961 trx_nr = atoi(argv[1]);
962 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000963 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000964 VTY_NEWLINE);
965 return CMD_WARNING;
966 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200967 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000968 }
969 if (argc >= 3) {
970 ts_nr = atoi(argv[2]);
971 if (ts_nr >= TRX_NR_TS) {
Harald Welte1bc77352009-03-10 19:47:51 +0000972 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
Harald Welte68628e82009-03-10 12:17:57 +0000973 VTY_NEWLINE);
974 return CMD_WARNING;
975 }
Harald Welte274d0152010-12-24 12:05:03 +0100976 /* Fully Specified: print and exit */
Harald Welte68628e82009-03-10 12:17:57 +0000977 ts = &trx->ts[ts_nr];
978 ts_dump_vty(vty, ts);
979 return CMD_SUCCESS;
980 }
Harald Welte274d0152010-12-24 12:05:03 +0100981
982 if (bts && trx) {
983 /* Iterate over all TS in this TRX */
984 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
985 ts = &trx->ts[ts_nr];
986 ts_dump_vty(vty, ts);
987 }
988 } else if (bts) {
989 /* Iterate over all TRX in this BTS, TS in each TRX */
Harald Welte68628e82009-03-10 12:17:57 +0000990 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200991 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000992 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
993 ts = &trx->ts[ts_nr];
994 ts_dump_vty(vty, ts);
995 }
996 }
Harald Welte274d0152010-12-24 12:05:03 +0100997 } else {
998 /* Iterate over all BTS, TRX in each BTS, TS in each TRX */
999 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
1000 bts = gsm_bts_num(net, bts_nr);
1001 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
1002 trx = gsm_bts_trx_num(bts, trx_nr);
1003 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
1004 ts = &trx->ts[ts_nr];
1005 ts_dump_vty(vty, ts);
1006 }
1007 }
1008 }
Harald Welte68628e82009-03-10 12:17:57 +00001009 }
1010
1011 return CMD_SUCCESS;
1012}
1013
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +01001014static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte68628e82009-03-10 12:17:57 +00001015{
Harald Weltefcd24452009-06-20 18:15:19 +02001016 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte40f82892009-05-23 17:31:39 +00001017 subscr->authorized, VTY_NEWLINE);
Holger Hans Peter Freyther7f180e82013-12-12 15:45:41 +01001018 if (strlen(subscr->name))
Harald Welte1bc77352009-03-10 19:47:51 +00001019 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
Holger Hans Peter Freytherbd30cd32014-04-04 11:53:18 +02001020 if (strlen(subscr->extension))
Harald Welte68628e82009-03-10 12:17:57 +00001021 vty_out(vty, " Extension: %s%s", subscr->extension,
1022 VTY_NEWLINE);
Holger Hans Peter Freyther5ccd0152013-07-14 08:38:24 +02001023 vty_out(vty, " IMSI: %s%s", subscr->imsi, VTY_NEWLINE);
Holger Hans Peter Freyther22230252009-08-19 12:53:57 +02001024 if (subscr->tmsi != GSM_RESERVED_TMSI)
1025 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte731fd912009-08-15 03:24:51 +02001026 VTY_NEWLINE);
Sylvain Munautaf292642009-12-27 19:29:28 +01001027
Harald Welte (local)15920de2009-08-14 20:27:16 +02001028 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +00001029}
1030
Neels Hofmeyr6d804b12017-02-18 22:20:46 +01001031static void bsc_subscr_dump_vty(struct vty *vty, struct bsc_subscr *bsub)
1032{
1033 if (strlen(bsub->imsi))
1034 vty_out(vty, " IMSI: %s%s", bsub->imsi, VTY_NEWLINE);
1035 if (bsub->tmsi != GSM_RESERVED_TMSI)
1036 vty_out(vty, " TMSI: 0x%08x%s", bsub->tmsi,
1037 VTY_NEWLINE);
1038 vty_out(vty, " Use count: %d%s", bsub->use_count, VTY_NEWLINE);
1039}
1040
Harald Welte8387a492009-12-22 21:43:14 +01001041static void meas_rep_dump_uni_vty(struct vty *vty,
1042 struct gsm_meas_rep_unidir *mru,
1043 const char *prefix,
1044 const char *dir)
1045{
1046 vty_out(vty, "%s RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",
1047 prefix, dir, rxlev2dbm(mru->full.rx_lev),
1048 dir, rxlev2dbm(mru->sub.rx_lev));
1049 vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",
1050 dir, mru->full.rx_qual, dir, mru->sub.rx_qual,
1051 VTY_NEWLINE);
1052}
1053
1054static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,
1055 const char *prefix)
1056{
1057 vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);
1058 vty_out(vty, "%s Flags: %s%s%s%s%s", prefix,
1059 mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",
1060 mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",
1061 mr->flags & MEAS_REP_F_FPC ? "FPC " : "",
1062 mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",
1063 VTY_NEWLINE);
1064 if (mr->flags & MEAS_REP_F_MS_TO)
Max11e4e412017-04-20 13:07:58 +02001065 vty_out(vty, "%s MS Timing Offset: %d%s", prefix, mr->ms_timing_offset, VTY_NEWLINE);
Harald Welte8387a492009-12-22 21:43:14 +01001066 if (mr->flags & MEAS_REP_F_MS_L1)
1067 vty_out(vty, "%s L1 MS Power: %u dBm, Timing Advance: %u%s",
1068 prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);
1069 if (mr->flags & MEAS_REP_F_DL_VALID)
1070 meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");
1071 meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");
1072}
1073
Harald Welte0a8cf322015-12-05 17:22:49 +01001074/* FIXME: move this to libosmogsm */
1075static const struct value_string gsm48_cmode_names[] = {
1076 { GSM48_CMODE_SIGN, "signalling" },
1077 { GSM48_CMODE_SPEECH_V1, "FR or HR" },
1078 { GSM48_CMODE_SPEECH_EFR, "EFR" },
1079 { GSM48_CMODE_SPEECH_AMR, "AMR" },
1080 { GSM48_CMODE_DATA_14k5, "CSD(14k5)" },
1081 { GSM48_CMODE_DATA_12k0, "CSD(12k0)" },
1082 { GSM48_CMODE_DATA_6k0, "CSD(6k0)" },
1083 { GSM48_CMODE_DATA_3k6, "CSD(3k6)" },
1084 { 0, NULL }
1085};
1086
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001087/* call vty_out() to print a string like " as TCH/H" for dynamic timeslots.
1088 * Don't do anything if the ts is not dynamic. */
1089static void vty_out_dyn_ts_status(struct vty *vty, struct gsm_bts_trx_ts *ts)
1090{
1091 switch (ts->pchan) {
1092 case GSM_PCHAN_TCH_F_TCH_H_PDCH:
1093 if (ts->dyn.pchan_is == ts->dyn.pchan_want)
1094 vty_out(vty, " as %s",
1095 gsm_pchan_name(ts->dyn.pchan_is));
1096 else
1097 vty_out(vty, " switching %s -> %s",
1098 gsm_pchan_name(ts->dyn.pchan_is),
1099 gsm_pchan_name(ts->dyn.pchan_want));
1100 break;
1101 case GSM_PCHAN_TCH_F_PDCH:
1102 if ((ts->flags & TS_F_PDCH_PENDING_MASK) == 0)
1103 vty_out(vty, " as %s",
1104 (ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
1105 : "TCH/F");
1106 else
1107 vty_out(vty, " switching %s -> %s",
1108 (ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
1109 : "TCH/F",
1110 (ts->flags & TS_F_PDCH_ACT_PENDING)? "PDCH"
1111 : "TCH/F");
1112 break;
1113 default:
1114 /* no dyn ts */
1115 break;
1116 }
1117}
1118
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001119static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte68628e82009-03-10 12:17:57 +00001120{
Harald Welte8387a492009-12-22 21:43:14 +01001121 int idx;
1122
Harald Welte85bded82010-12-24 12:22:34 +01001123 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",
1124 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
1125 lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001126 /* show dyn TS details, if applicable */
1127 switch (lchan->ts->pchan) {
1128 case GSM_PCHAN_TCH_F_TCH_H_PDCH:
1129 vty_out(vty, " Osmocom Dyn TS:");
1130 vty_out_dyn_ts_status(vty, lchan->ts);
1131 vty_out(vty, VTY_NEWLINE);
1132 break;
1133 case GSM_PCHAN_TCH_F_PDCH:
1134 vty_out(vty, " IPACC Dyn PDCH TS:");
1135 vty_out_dyn_ts_status(vty, lchan->ts);
1136 vty_out(vty, VTY_NEWLINE);
1137 break;
1138 default:
1139 /* no dyn ts */
1140 break;
1141 }
Holger Hans Peter Freyther454140e2014-12-28 12:08:28 +01001142 vty_out(vty, " Connection: %u, State: %s%s%s%s",
Holger Hans Peter Freyther40494552010-06-28 17:09:29 +08001143 lchan->conn ? 1: 0,
Holger Hans Peter Freyther454140e2014-12-28 12:08:28 +01001144 gsm_lchans_name(lchan->state),
1145 lchan->state == LCHAN_S_BROKEN ? " Error reason: " : "",
1146 lchan->state == LCHAN_S_BROKEN ? lchan->broken_reason : "",
1147 VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +01001148 vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s",
1149 lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
1150 - lchan->bs_power*2,
1151 ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),
1152 VTY_NEWLINE);
Harald Welte0a8cf322015-12-05 17:22:49 +01001153 vty_out(vty, " Channel Mode / Codec: %s%s",
1154 get_value_string(gsm48_cmode_names, lchan->tch_mode),
1155 VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +08001156 if (lchan->conn && lchan->conn->subscr) {
Harald Welte68628e82009-03-10 12:17:57 +00001157 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +08001158 subscr_dump_vty(vty, lchan->conn->subscr);
Harald Welte68628e82009-03-10 12:17:57 +00001159 } else
1160 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte2c828992009-12-02 01:56:49 +05301161 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
1162 struct in_addr ia;
Holger Hans Peter Freyther54fa7992010-04-07 15:39:16 +02001163 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte2c828992009-12-02 01:56:49 +05301164 vty_out(vty, " Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",
1165 inet_ntoa(ia), lchan->abis_ip.bound_port,
1166 lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,
1167 VTY_NEWLINE);
1168 }
Harald Welte8387a492009-12-22 21:43:14 +01001169
1170 /* we want to report the last measurement report */
1171 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1172 lchan->meas_rep_idx, 1);
1173 meas_rep_dump_vty(vty, &lchan->meas_rep[idx], " ");
Harald Welte68628e82009-03-10 12:17:57 +00001174}
1175
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001176static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
1177{
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +08001178 struct gsm_meas_rep *mr;
1179 int idx;
1180
1181 /* we want to report the last measurement report */
1182 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1183 lchan->meas_rep_idx, 1);
1184 mr = &lchan->meas_rep[idx];
1185
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001186 vty_out(vty, "BTS %u, TRX %u, Timeslot %u %s",
Harald Welte85bded82010-12-24 12:22:34 +01001187 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001188 gsm_pchan_name(lchan->ts->pchan));
1189 vty_out_dyn_ts_status(vty, lchan->ts);
1190 vty_out(vty, ", Lchan %u, Type %s, State %s - "
1191 "L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
Neels Hofmeyrefedf802016-06-14 01:31:38 +02001192 lchan->nr,
1193 gsm_lchant_name(lchan->type), gsm_lchans_name(lchan->state),
1194 mr->ms_l1.pwr,
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +08001195 rxlev2dbm(mr->dl.full.rx_lev),
1196 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001197 VTY_NEWLINE);
1198}
1199
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001200
1201static int dump_lchan_trx_ts(struct gsm_bts_trx_ts *ts, struct vty *vty,
1202 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1203{
1204 int lchan_nr;
1205 for (lchan_nr = 0; lchan_nr < TS_MAX_LCHAN; lchan_nr++) {
1206 struct gsm_lchan *lchan = &ts->lchan[lchan_nr];
1207 if ((lchan->type == GSM_LCHAN_NONE) && (lchan->state == LCHAN_S_NONE))
1208 continue;
1209 dump_cb(vty, lchan);
1210 }
1211
1212 return CMD_SUCCESS;
1213}
1214
1215static int dump_lchan_trx(struct gsm_bts_trx *trx, struct vty *vty,
1216 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1217{
1218 int ts_nr;
1219
1220 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
1221 struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
1222 dump_lchan_trx_ts(ts, vty, dump_cb);
1223 }
1224
1225 return CMD_SUCCESS;
1226}
1227
1228static int dump_lchan_bts(struct gsm_bts *bts, struct vty *vty,
1229 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1230{
1231 int trx_nr;
1232
1233 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
1234 struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, trx_nr);
1235 dump_lchan_trx(trx, vty, dump_cb);
1236 }
1237
1238 return CMD_SUCCESS;
1239}
1240
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001241static int lchan_summary(struct vty *vty, int argc, const char **argv,
1242 void (*dump_cb)(struct vty *, struct gsm_lchan *))
Harald Welte68628e82009-03-10 12:17:57 +00001243{
Harald Weltedcccb182010-05-16 20:52:23 +02001244 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +00001245 struct gsm_bts *bts;
1246 struct gsm_bts_trx *trx;
1247 struct gsm_bts_trx_ts *ts;
1248 struct gsm_lchan *lchan;
1249 int bts_nr, trx_nr, ts_nr, lchan_nr;
1250
1251 if (argc >= 1) {
1252 /* use the BTS number that the user has specified */
1253 bts_nr = atoi(argv[0]);
1254 if (bts_nr >= net->num_bts) {
1255 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1256 VTY_NEWLINE);
1257 return CMD_WARNING;
1258 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001259 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001260
1261 if (argc == 1)
1262 return dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001263 }
1264 if (argc >= 2) {
1265 trx_nr = atoi(argv[1]);
1266 if (trx_nr >= bts->num_trx) {
1267 vty_out(vty, "%% can't find TRX %s%s", argv[1],
1268 VTY_NEWLINE);
1269 return CMD_WARNING;
1270 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001271 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001272
1273 if (argc == 2)
1274 return dump_lchan_trx(trx, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001275 }
1276 if (argc >= 3) {
1277 ts_nr = atoi(argv[2]);
1278 if (ts_nr >= TRX_NR_TS) {
1279 vty_out(vty, "%% can't find TS %s%s", argv[2],
1280 VTY_NEWLINE);
1281 return CMD_WARNING;
1282 }
1283 ts = &trx->ts[ts_nr];
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001284
1285 if (argc == 3)
1286 return dump_lchan_trx_ts(ts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001287 }
1288 if (argc >= 4) {
1289 lchan_nr = atoi(argv[3]);
1290 if (lchan_nr >= TS_MAX_LCHAN) {
1291 vty_out(vty, "%% can't find LCHAN %s%s", argv[3],
1292 VTY_NEWLINE);
1293 return CMD_WARNING;
1294 }
1295 lchan = &ts->lchan[lchan_nr];
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001296 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +00001297 return CMD_SUCCESS;
1298 }
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001299
1300
Harald Welte68628e82009-03-10 12:17:57 +00001301 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001302 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001303 dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001304 }
1305
1306 return CMD_SUCCESS;
1307}
1308
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001309
1310DEFUN(show_lchan,
1311 show_lchan_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001312 "show lchan [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001313 SHOW_STR "Display information about a logical channel\n"
1314 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001315 LCHAN_NR_STR)
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001316
1317{
1318 return lchan_summary(vty, argc, argv, lchan_dump_full_vty);
1319}
1320
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001321DEFUN(show_lchan_summary,
1322 show_lchan_summary_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001323 "show lchan summary [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001324 SHOW_STR "Display information about a logical channel\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001325 "Short summary\n"
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001326 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001327 LCHAN_NR_STR)
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001328{
1329 return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
1330}
1331
Harald Weltebe4b7302009-05-23 16:59:33 +00001332static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
Harald Weltef5025b62009-03-28 16:55:11 +00001333{
1334 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +01001335 bsc_subscr_dump_vty(vty, pag->bsub);
Harald Weltef5025b62009-03-28 16:55:11 +00001336}
1337
Harald Weltebe4b7302009-05-23 16:59:33 +00001338static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
Harald Weltef5025b62009-03-28 16:55:11 +00001339{
1340 struct gsm_paging_request *pag;
1341
Holger Hans Peter Freyther9b5192b2013-03-03 11:03:17 +01001342 if (!bts->paging.bts)
1343 return;
1344
Harald Weltef5025b62009-03-28 16:55:11 +00001345 llist_for_each_entry(pag, &bts->paging.pending_requests, entry)
1346 paging_dump_vty(vty, pag);
1347}
1348
1349DEFUN(show_paging,
1350 show_paging_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001351 "show paging [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +02001352 SHOW_STR "Display information about paging reuqests of a BTS\n"
1353 "BTS Number\n")
Harald Weltef5025b62009-03-28 16:55:11 +00001354{
Harald Weltedcccb182010-05-16 20:52:23 +02001355 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Weltef5025b62009-03-28 16:55:11 +00001356 struct gsm_bts *bts;
1357 int bts_nr;
1358
1359 if (argc >= 1) {
1360 /* use the BTS number that the user has specified */
1361 bts_nr = atoi(argv[0]);
1362 if (bts_nr >= net->num_bts) {
1363 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1364 VTY_NEWLINE);
1365 return CMD_WARNING;
1366 }
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 return CMD_SUCCESS;
1371 }
1372 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001373 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001374 bts_paging_dump_vty(vty, bts);
1375 }
1376
1377 return CMD_SUCCESS;
1378}
1379
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01001380DEFUN(show_paging_group,
1381 show_paging_group_cmd,
1382 "show paging-group <0-255> IMSI",
1383 SHOW_STR "Display the paging group\n"
1384 "BTS Number\n" "IMSI\n")
1385{
1386 struct gsm_network *net = gsmnet_from_vty(vty);
1387 struct gsm_bts *bts;
1388 unsigned int page_group;
1389 int bts_nr = atoi(argv[0]);
1390
1391 if (bts_nr >= net->num_bts) {
1392 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1393 return CMD_WARNING;
1394 }
1395
1396 bts = gsm_bts_num(net, bts_nr);
1397 if (!bts) {
1398 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1399 return CMD_WARNING;
1400 }
1401
1402 page_group = gsm0502_calc_paging_group(&bts->si_common.chan_desc,
1403 str_to_imsi(argv[1]));
1404 vty_out(vty, "%%Paging group for IMSI %" PRIu64 " on BTS #%d is %u%s",
1405 str_to_imsi(argv[1]), bts->nr,
1406 page_group, VTY_NEWLINE);
1407 return CMD_SUCCESS;
1408}
1409
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001410DEFUN(cfg_net_neci,
1411 cfg_net_neci_cmd,
1412 "neci (0|1)",
Harald Welte28326062010-05-14 20:05:17 +02001413 "New Establish Cause Indication\n"
1414 "Don't set the NECI bit\n" "Set the NECI bit\n")
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001415{
Harald Weltedcccb182010-05-16 20:52:23 +02001416 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1417
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001418 gsmnet->neci = atoi(argv[0]);
Holger Hans Peter Freyther78891072010-09-06 09:36:02 +08001419 gsm_net_update_ctype(gsmnet);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001420 return CMD_SUCCESS;
1421}
1422
Harald Welte8f0ed552010-05-11 21:53:49 +02001423#define HANDOVER_STR "Handover Options\n"
1424
Harald Weltebc814502009-12-19 21:41:52 +01001425DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1426 "handover (0|1)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001427 HANDOVER_STR
1428 "Don't perform in-call handover\n"
1429 "Perform in-call handover\n")
Harald Weltebc814502009-12-19 21:41:52 +01001430{
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001431 int enable = atoi(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001432 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001433
1434 if (enable && ipacc_rtp_direct) {
Harald Weltefe03f0d2009-12-20 13:51:01 +01001435 vty_out(vty, "%% Cannot enable handover unless RTP Proxy mode "
1436 "is enabled by using the -P command line option%s",
1437 VTY_NEWLINE);
1438 return CMD_WARNING;
1439 }
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001440 gsmnet->handover.active = enable;
Harald Weltebc814502009-12-19 21:41:52 +01001441
1442 return CMD_SUCCESS;
1443}
1444
Harald Welte8f0ed552010-05-11 21:53:49 +02001445#define HO_WIN_STR HANDOVER_STR "Measurement Window\n"
1446#define HO_WIN_RXLEV_STR HO_WIN_STR "Received Level Averaging\n"
1447#define HO_WIN_RXQUAL_STR HO_WIN_STR "Received Quality Averaging\n"
1448#define HO_PBUDGET_STR HANDOVER_STR "Power Budget\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001449#define HO_AVG_COUNT_STR "Amount to use for Averaging\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001450
Harald Welteb720bd32009-12-21 16:51:50 +01001451DEFUN(cfg_net_ho_win_rxlev_avg, cfg_net_ho_win_rxlev_avg_cmd,
1452 "handover window rxlev averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001453 HO_WIN_RXLEV_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001454 "How many RxLev measurements are used for averaging\n"
1455 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001456{
Harald Weltedcccb182010-05-16 20:52:23 +02001457 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001458 gsmnet->handover.win_rxlev_avg = atoi(argv[0]);
1459 return CMD_SUCCESS;
1460}
1461
1462DEFUN(cfg_net_ho_win_rxqual_avg, cfg_net_ho_win_rxqual_avg_cmd,
1463 "handover window rxqual averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001464 HO_WIN_RXQUAL_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001465 "How many RxQual measurements are used for averaging\n"
1466 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001467{
Harald Weltedcccb182010-05-16 20:52:23 +02001468 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001469 gsmnet->handover.win_rxqual_avg = atoi(argv[0]);
1470 return CMD_SUCCESS;
1471}
1472
1473DEFUN(cfg_net_ho_win_rxlev_neigh_avg, cfg_net_ho_win_rxlev_avg_neigh_cmd,
1474 "handover window rxlev neighbor averaging <1-10>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001475 HO_WIN_RXLEV_STR "Neighbor\n"
1476 "How many RxQual measurements are used for averaging\n"
1477 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001478{
Harald Weltedcccb182010-05-16 20:52:23 +02001479 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001480 gsmnet->handover.win_rxlev_avg_neigh = atoi(argv[0]);
1481 return CMD_SUCCESS;
1482}
1483
1484DEFUN(cfg_net_ho_pwr_interval, cfg_net_ho_pwr_interval_cmd,
1485 "handover power budget interval <1-99>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001486 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001487 "How often to check if we have a better cell (SACCH frames)\n"
1488 "Interval\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001489{
Harald Weltedcccb182010-05-16 20:52:23 +02001490 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001491 gsmnet->handover.pwr_interval = atoi(argv[0]);
1492 return CMD_SUCCESS;
1493}
1494
1495DEFUN(cfg_net_ho_pwr_hysteresis, cfg_net_ho_pwr_hysteresis_cmd,
1496 "handover power budget hysteresis <0-999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001497 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001498 "How many dB does a neighbor to be stronger to become a HO candidate\n"
1499 "Hysteresis\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001500{
Harald Weltedcccb182010-05-16 20:52:23 +02001501 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001502 gsmnet->handover.pwr_hysteresis = atoi(argv[0]);
1503 return CMD_SUCCESS;
1504}
1505
1506DEFUN(cfg_net_ho_max_distance, cfg_net_ho_max_distance_cmd,
1507 "handover maximum distance <0-9999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001508 HANDOVER_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001509 "How big is the maximum timing advance before HO is forced\n"
1510 "Distance\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001511{
Harald Weltedcccb182010-05-16 20:52:23 +02001512 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001513 gsmnet->handover.max_distance = atoi(argv[0]);
1514 return CMD_SUCCESS;
1515}
Harald Weltebc814502009-12-19 21:41:52 +01001516
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001517DEFUN(cfg_net_pag_any_tch,
1518 cfg_net_pag_any_tch_cmd,
1519 "paging any use tch (0|1)",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001520 "Assign a TCH when receiving a Paging Any request\n"
1521 "Any Channel\n" "Use\n" "TCH\n"
1522 "Do not use TCH for Paging Request Any\n"
1523 "Do use TCH for Paging Request Any\n")
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001524{
Holger Hans Peter Freytherb0e88b82010-09-06 10:09:19 +08001525 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001526 gsmnet->pag_any_tch = atoi(argv[0]);
1527 gsm_net_update_ctype(gsmnet);
1528 return CMD_SUCCESS;
1529}
1530
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001531#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001532 DEFUN(cfg_net_T##number, \
1533 cfg_net_T##number##_cmd, \
1534 "timer t" #number " <0-65535>", \
Harald Welte8f0ed552010-05-11 21:53:49 +02001535 "Configure GSM Timers\n" \
Holger Hans Peter Freyther5dd295f2014-04-11 19:30:27 +02001536 doc "Timer Value in seconds\n") \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001537{ \
Harald Weltedcccb182010-05-16 20:52:23 +02001538 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001539 int value = atoi(argv[0]); \
1540 \
1541 if (value < 0 || value > 65535) { \
1542 vty_out(vty, "Timer value %s out of range.%s", \
1543 argv[0], VTY_NEWLINE); \
1544 return CMD_WARNING; \
1545 } \
1546 \
1547 gsmnet->T##number = value; \
1548 return CMD_SUCCESS; \
1549}
1550
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001551DECLARE_TIMER(3101, "Set the timeout value for IMMEDIATE ASSIGNMENT.\n")
1552DECLARE_TIMER(3103, "Set the timeout value for HANDOVER.\n")
Harald Welte67161f22012-06-03 13:01:47 +02001553DECLARE_TIMER(3105, "Set the timer for repetition of PHYSICAL INFORMATION.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001554DECLARE_TIMER(3107, "Currently not used.\n")
Holger Hans Peter Freytherb3489392011-12-28 16:21:05 +01001555DECLARE_TIMER(3109, "Set the RSL SACCH deactivation timeout.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001556DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.\n")
1557DECLARE_TIMER(3113, "Set the time to try paging a subscriber.\n")
1558DECLARE_TIMER(3115, "Currently not used.\n")
1559DECLARE_TIMER(3117, "Currently not used.\n")
1560DECLARE_TIMER(3119, "Currently not used.\n")
1561DECLARE_TIMER(3122, "Waiting time (seconds) after IMM ASS REJECT\n")
1562DECLARE_TIMER(3141, "Currently not used.\n")
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001563
Maxc08ee712016-05-11 12:45:13 +02001564DEFUN_DEPRECATED(cfg_net_dtx,
1565 cfg_net_dtx_cmd,
1566 "dtx-used (0|1)",
1567 ".HIDDEN\n""Obsolete\n""Obsolete\n")
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001568{
Maxc08ee712016-05-11 12:45:13 +02001569 vty_out(vty, "%% 'dtx-used' is now deprecated: use dtx * "
1570 "configuration options of BTS instead%s", VTY_NEWLINE);
1571 return CMD_SUCCESS;
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001572}
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001573
Harald Welte5258fc42009-03-28 19:07:53 +00001574/* per-BTS configuration */
1575DEFUN(cfg_bts,
1576 cfg_bts_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02001577 "bts <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001578 "Select a BTS to configure\n"
1579 "BTS Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001580{
Harald Weltedcccb182010-05-16 20:52:23 +02001581 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte5258fc42009-03-28 19:07:53 +00001582 int bts_nr = atoi(argv[0]);
1583 struct gsm_bts *bts;
1584
Harald Weltee441d9c2009-06-21 16:17:15 +02001585 if (bts_nr > gsmnet->num_bts) {
1586 vty_out(vty, "%% The next unused BTS number is %u%s",
1587 gsmnet->num_bts, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00001588 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02001589 } else if (bts_nr == gsmnet->num_bts) {
1590 /* allocate a new one */
Harald Welte3300c012011-06-05 13:31:33 +02001591 bts = gsm_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,
Harald Weltea2bbc5e2015-11-20 10:43:31 +01001592 HARDCODED_BSIC);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02001593 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02001594 bts = gsm_bts_num(gsmnet, bts_nr);
1595
Daniel Willmannf15c2762010-01-11 13:43:07 +01001596 if (!bts) {
1597 vty_out(vty, "%% Unable to allocate BTS %u%s",
1598 gsmnet->num_bts, VTY_NEWLINE);
Harald Weltee441d9c2009-06-21 16:17:15 +02001599 return CMD_WARNING;
Daniel Willmannf15c2762010-01-11 13:43:07 +01001600 }
Harald Welte5258fc42009-03-28 19:07:53 +00001601
1602 vty->index = bts;
Harald Welte197dea92010-05-14 17:59:53 +02001603 vty->index_sub = &bts->description;
Harald Welte5258fc42009-03-28 19:07:53 +00001604 vty->node = BTS_NODE;
1605
1606 return CMD_SUCCESS;
1607}
1608
1609DEFUN(cfg_bts_type,
1610 cfg_bts_type_cmd,
Harald Weltee555c2b2012-08-17 13:02:12 +02001611 "type TYPE", /* dynamically created */
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001612 "Set the BTS type\n" "Type\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001613{
1614 struct gsm_bts *bts = vty->index;
Harald Welte39315c42010-01-10 18:01:52 +01001615 int rc;
Harald Welte5258fc42009-03-28 19:07:53 +00001616
Max7507aef2017-04-10 13:59:14 +02001617 rc = gsm_set_bts_type(bts, str2btstype(argv[0]));
Harald Welte39315c42010-01-10 18:01:52 +01001618 if (rc < 0)
1619 return CMD_WARNING;
Harald Welte8175e952009-10-20 00:22:00 +02001620
Harald Welte5258fc42009-03-28 19:07:53 +00001621 return CMD_SUCCESS;
1622}
1623
Harald Weltefcd24452009-06-20 18:15:19 +02001624DEFUN(cfg_bts_band,
1625 cfg_bts_band_cmd,
1626 "band BAND",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001627 "Set the frequency band of this BTS\n" "Frequency band\n")
Harald Weltefcd24452009-06-20 18:15:19 +02001628{
1629 struct gsm_bts *bts = vty->index;
Harald Welte42581822009-08-08 16:12:58 +02001630 int band = gsm_band_parse(argv[0]);
Harald Weltefcd24452009-06-20 18:15:19 +02001631
1632 if (band < 0) {
1633 vty_out(vty, "%% BAND %d is not a valid GSM band%s",
1634 band, VTY_NEWLINE);
1635 return CMD_WARNING;
1636 }
1637
1638 bts->band = band;
1639
1640 return CMD_SUCCESS;
1641}
1642
Maxc08ee712016-05-11 12:45:13 +02001643DEFUN(cfg_bts_dtxu, cfg_bts_dtxu_cmd, "dtx uplink [force]",
1644 "Configure discontinuous transmission\n"
1645 "Enable Uplink DTX for this BTS\n"
1646 "MS 'shall' use DTXu instead of 'may' use (might not be supported by "
1647 "older phones).\n")
1648{
1649 struct gsm_bts *bts = vty->index;
1650
1651 bts->dtxu = (argc > 0) ? GSM48_DTX_SHALL_BE_USED : GSM48_DTX_MAY_BE_USED;
Max60795282016-06-06 11:30:57 +02001652 if (!is_ipaccess_bts(bts))
1653 vty_out(vty, "%% DTX enabled on non-IP BTS: this configuration "
1654 "neither supported nor tested!%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +02001655 return CMD_SUCCESS;
1656}
1657
1658DEFUN(cfg_bts_no_dtxu, cfg_bts_no_dtxu_cmd, "no dtx uplink",
1659 NO_STR
1660 "Configure discontinuous transmission\n"
1661 "Disable Uplink DTX for this BTS\n")
1662{
1663 struct gsm_bts *bts = vty->index;
1664
1665 bts->dtxu = GSM48_DTX_SHALL_NOT_BE_USED;
1666
1667 return CMD_SUCCESS;
1668}
1669
1670DEFUN(cfg_bts_dtxd, cfg_bts_dtxd_cmd, "dtx downlink",
1671 "Configure discontinuous transmission\n"
1672 "Enable Downlink DTX for this BTS\n")
1673{
1674 struct gsm_bts *bts = vty->index;
1675
1676 bts->dtxd = true;
Max60795282016-06-06 11:30:57 +02001677 if (!is_ipaccess_bts(bts))
1678 vty_out(vty, "%% DTX enabled on non-IP BTS: this configuration "
1679 "neither supported nor tested!%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +02001680 return CMD_SUCCESS;
1681}
1682
1683DEFUN(cfg_bts_no_dtxd, cfg_bts_no_dtxd_cmd, "no dtx downlink",
1684 NO_STR
1685 "Configure discontinuous transmission\n"
1686 "Disable Downlink DTX for this BTS\n")
1687{
1688 struct gsm_bts *bts = vty->index;
1689
1690 bts->dtxd = false;
1691
1692 return CMD_SUCCESS;
1693}
1694
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001695DEFUN(cfg_bts_ci,
1696 cfg_bts_ci_cmd,
1697 "cell_identity <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001698 "Set the Cell identity of this BTS\n" "Cell Identity\n")
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001699{
1700 struct gsm_bts *bts = vty->index;
1701 int ci = atoi(argv[0]);
1702
1703 if (ci < 0 || ci > 0xffff) {
1704 vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s",
1705 ci, VTY_NEWLINE);
1706 return CMD_WARNING;
1707 }
1708 bts->cell_identity = ci;
1709
1710 return CMD_SUCCESS;
1711}
1712
Harald Welte5258fc42009-03-28 19:07:53 +00001713DEFUN(cfg_bts_lac,
1714 cfg_bts_lac_cmd,
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001715 "location_area_code <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001716 "Set the Location Area Code (LAC) of this BTS\n" "LAC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001717{
1718 struct gsm_bts *bts = vty->index;
1719 int lac = atoi(argv[0]);
1720
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001721 if (lac < 0 || lac > 0xffff) {
1722 vty_out(vty, "%% LAC %d is not in the valid range (0-65535)%s",
Harald Welte5258fc42009-03-28 19:07:53 +00001723 lac, VTY_NEWLINE);
1724 return CMD_WARNING;
1725 }
Holger Hans Peter Freythere48b9562009-10-01 04:07:15 +02001726
1727 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
1728 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
1729 lac, VTY_NEWLINE);
1730 return CMD_WARNING;
1731 }
1732
Harald Welte5258fc42009-03-28 19:07:53 +00001733 bts->location_area_code = lac;
1734
1735 return CMD_SUCCESS;
1736}
1737
Harald Weltea43f7892009-12-01 18:04:30 +05301738
Harald Weltea2bbc5e2015-11-20 10:43:31 +01001739/* compatibility wrapper for old config files */
1740DEFUN_HIDDEN(cfg_bts_tsc,
Harald Welte5258fc42009-03-28 19:07:53 +00001741 cfg_bts_tsc_cmd,
Harald Weltec513ded2012-05-31 10:57:08 +02001742 "training_sequence_code <0-7>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001743 "Set the Training Sequence Code (TSC) of this BTS\n" "TSC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001744{
Harald Welte5258fc42009-03-28 19:07:53 +00001745 return CMD_SUCCESS;
1746}
1747
Harald Welte78f2f502009-05-23 16:56:52 +00001748DEFUN(cfg_bts_bsic,
1749 cfg_bts_bsic_cmd,
1750 "base_station_id_code <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001751 "Set the Base Station Identity Code (BSIC) of this BTS\n"
1752 "BSIC of this BTS\n")
Harald Welte78f2f502009-05-23 16:56:52 +00001753{
1754 struct gsm_bts *bts = vty->index;
1755 int bsic = atoi(argv[0]);
1756
1757 if (bsic < 0 || bsic > 0x3f) {
Harald Welte42581822009-08-08 16:12:58 +02001758 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte78f2f502009-05-23 16:56:52 +00001759 bsic, VTY_NEWLINE);
1760 return CMD_WARNING;
1761 }
1762 bts->bsic = bsic;
1763
1764 return CMD_SUCCESS;
1765}
1766
Harald Welte4cc34222009-05-01 15:12:31 +00001767DEFUN(cfg_bts_unit_id,
1768 cfg_bts_unit_id_cmd,
Harald Welte07dc73d2009-08-07 13:27:09 +02001769 "ip.access unit_id <0-65534> <0-255>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001770 "Abis/IP specific options\n"
1771 "Set the IPA BTS Unit ID\n"
1772 "Unit ID (Site)\n"
1773 "Unit ID (BTS)\n")
Harald Welte4cc34222009-05-01 15:12:31 +00001774{
1775 struct gsm_bts *bts = vty->index;
1776 int site_id = atoi(argv[0]);
1777 int bts_id = atoi(argv[1]);
1778
Harald Welte07dc73d2009-08-07 13:27:09 +02001779 if (!is_ipaccess_bts(bts)) {
1780 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1781 return CMD_WARNING;
1782 }
1783
Harald Welte4cc34222009-05-01 15:12:31 +00001784 bts->ip_access.site_id = site_id;
1785 bts->ip_access.bts_id = bts_id;
1786
1787 return CMD_SUCCESS;
1788}
1789
Harald Welte8b291802013-03-12 13:57:05 +01001790DEFUN(cfg_bts_rsl_ip,
1791 cfg_bts_rsl_ip_cmd,
1792 "ip.access rsl-ip A.B.C.D",
1793 "Abis/IP specific options\n"
1794 "Set the IPA RSL IP Address of the BSC\n"
1795 "Destination IP address for RSL connection\n")
1796{
1797 struct gsm_bts *bts = vty->index;
1798 struct in_addr ia;
1799
1800 if (!is_ipaccess_bts(bts)) {
1801 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1802 return CMD_WARNING;
1803 }
1804
1805 inet_aton(argv[0], &ia);
1806 bts->ip_access.rsl_ip = ntohl(ia.s_addr);
1807
1808 return CMD_SUCCESS;
1809}
1810
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001811#define NOKIA_STR "Nokia *Site related commands\n"
Harald Welte8b291802013-03-12 13:57:05 +01001812
Sylvain Munautc9519462011-10-17 14:04:55 +02001813DEFUN(cfg_bts_nokia_site_skip_reset,
1814 cfg_bts_nokia_site_skip_reset_cmd,
1815 "nokia_site skip-reset (0|1)",
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001816 NOKIA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001817 "Skip the reset step during bootstrap process of this BTS\n"
1818 "Do NOT skip the reset\n" "Skip the reset\n")
Sylvain Munautc9519462011-10-17 14:04:55 +02001819{
1820 struct gsm_bts *bts = vty->index;
1821
1822 if (bts->type != GSM_BTS_TYPE_NOKIA_SITE) {
1823 vty_out(vty, "%% BTS is not of Nokia *Site type%s", VTY_NEWLINE);
1824 return CMD_WARNING;
1825 }
1826
1827 bts->nokia.skip_reset = atoi(argv[0]);
1828
1829 return CMD_SUCCESS;
1830}
1831
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001832DEFUN(cfg_bts_nokia_site_no_loc_rel_cnf,
1833 cfg_bts_nokia_site_no_loc_rel_cnf_cmd,
1834 "nokia_site no-local-rel-conf (0|1)",
1835 NOKIA_STR
1836 "Do not wait for RELease CONFirm message when releasing channel locally\n"
1837 "Wait for RELease CONFirm\n" "Do not wait for RELease CONFirm\n")
1838{
1839 struct gsm_bts *bts = vty->index;
1840
1841 if (!is_nokia_bts(bts)) {
1842 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1843 VTY_NEWLINE);
1844 return CMD_WARNING;
1845 }
1846
1847 bts->nokia.no_loc_rel_cnf = atoi(argv[0]);
1848
1849 return CMD_SUCCESS;
1850}
1851
Sipos Csaba56e17662015-02-07 13:27:36 +01001852DEFUN(cfg_bts_nokia_site_bts_reset_timer_cnf,
1853 cfg_bts_nokia_site_bts_reset_timer_cnf_cmd,
1854 "nokia_site bts-reset-timer <15-100>",
1855 NOKIA_STR
1856 "The amount of time (in sec.) between BTS_RESET is sent,\n"
1857 "and the BTS is being bootstrapped.\n")
1858{
1859 struct gsm_bts *bts = vty->index;
1860
1861 if (!is_nokia_bts(bts)) {
1862 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1863 VTY_NEWLINE);
1864 return CMD_WARNING;
1865 }
1866
1867 bts->nokia.bts_reset_timer_cnf = atoi(argv[0]);
1868
1869 return CMD_SUCCESS;
1870}
Harald Welte8f0ed552010-05-11 21:53:49 +02001871#define OML_STR "Organization & Maintenance Link\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001872#define IPA_STR "A-bis/IP Specific Options\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001873
Harald Welte8175e952009-10-20 00:22:00 +02001874DEFUN(cfg_bts_stream_id,
1875 cfg_bts_stream_id_cmd,
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001876 "oml ip.access stream_id <0-255> line E1_LINE",
Harald Welte8f0ed552010-05-11 21:53:49 +02001877 OML_STR IPA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001878 "Set the ip.access Stream ID of the OML link of this BTS\n"
1879 "Stream Identifier\n" "Virtual E1 Line Number\n" "Virtual E1 Line Number\n")
Harald Welte8175e952009-10-20 00:22:00 +02001880{
1881 struct gsm_bts *bts = vty->index;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001882 int stream_id = atoi(argv[0]), linenr = atoi(argv[1]);
Harald Welte8175e952009-10-20 00:22:00 +02001883
1884 if (!is_ipaccess_bts(bts)) {
1885 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1886 return CMD_WARNING;
1887 }
1888
1889 bts->oml_tei = stream_id;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001890 /* This is used by e1inp_bind_ops callback for each BTS model. */
1891 bts->oml_e1_link.e1_nr = linenr;
1892
1893 return CMD_SUCCESS;
1894}
1895
Harald Welted13e0cd2012-08-17 09:52:03 +02001896#define OML_E1_STR OML_STR "OML E1/T1 Configuration\n"
Harald Welte8175e952009-10-20 00:22:00 +02001897
Harald Welte42581822009-08-08 16:12:58 +02001898DEFUN(cfg_bts_oml_e1,
1899 cfg_bts_oml_e1_cmd,
1900 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welted13e0cd2012-08-17 09:52:03 +02001901 OML_E1_STR
1902 "E1/T1 line number to be used for OML\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001903 "E1/T1 line number to be used for OML\n"
1904 "E1/T1 timeslot to be used for OML\n"
1905 "E1/T1 timeslot to be used for OML\n"
1906 "E1/T1 sub-slot to be used for OML\n"
1907 "Use E1/T1 sub-slot 0\n"
1908 "Use E1/T1 sub-slot 1\n"
1909 "Use E1/T1 sub-slot 2\n"
1910 "Use E1/T1 sub-slot 3\n"
1911 "Use full E1 slot 3\n"
1912 )
Harald Welte42581822009-08-08 16:12:58 +02001913{
1914 struct gsm_bts *bts = vty->index;
1915
1916 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
1917
1918 return CMD_SUCCESS;
1919}
1920
1921
1922DEFUN(cfg_bts_oml_e1_tei,
1923 cfg_bts_oml_e1_tei_cmd,
1924 "oml e1 tei <0-63>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001925 OML_E1_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001926 "Set the TEI to be used for OML\n"
1927 "TEI Number\n")
Harald Welte42581822009-08-08 16:12:58 +02001928{
1929 struct gsm_bts *bts = vty->index;
1930
1931 bts->oml_tei = atoi(argv[0]);
1932
1933 return CMD_SUCCESS;
1934}
1935
Harald Welte7a8fa412009-08-10 13:48:16 +02001936DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1937 "channel allocator (ascending|descending)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001938 "Channnel Allocator\n" "Channel Allocator\n"
1939 "Allocate Timeslots and Transceivers in ascending order\n"
1940 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte7a8fa412009-08-10 13:48:16 +02001941{
1942 struct gsm_bts *bts = vty->index;
1943
1944 if (!strcmp(argv[0], "ascending"))
1945 bts->chan_alloc_reverse = 0;
1946 else
1947 bts->chan_alloc_reverse = 1;
1948
1949 return CMD_SUCCESS;
1950}
1951
Harald Welte8f0ed552010-05-11 21:53:49 +02001952#define RACH_STR "Random Access Control Channel\n"
1953
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001954DEFUN(cfg_bts_rach_tx_integer,
1955 cfg_bts_rach_tx_integer_cmd,
1956 "rach tx integer <0-15>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001957 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001958 "Set the raw tx integer value in RACH Control parameters IE\n"
1959 "Set the raw tx integer value in RACH Control parameters IE\n"
1960 "Raw tx integer value in RACH Control parameters IE\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001961{
1962 struct gsm_bts *bts = vty->index;
1963 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
1964 return CMD_SUCCESS;
1965}
1966
1967DEFUN(cfg_bts_rach_max_trans,
1968 cfg_bts_rach_max_trans_cmd,
1969 "rach max transmission (1|2|4|7)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001970 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001971 "Set the maximum number of RACH burst transmissions\n"
1972 "Set the maximum number of RACH burst transmissions\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02001973 "Maximum number of 1 RACH burst transmissions\n"
1974 "Maximum number of 2 RACH burst transmissions\n"
1975 "Maximum number of 4 RACH burst transmissions\n"
1976 "Maximum number of 7 RACH burst transmissions\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001977{
1978 struct gsm_bts *bts = vty->index;
1979 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
1980 return CMD_SUCCESS;
1981}
1982
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02001983#define CD_STR "Channel Description\n"
1984
1985DEFUN(cfg_bts_chan_desc_att,
1986 cfg_bts_chan_desc_att_cmd,
1987 "channel-descrption attach (0|1)",
1988 CD_STR
1989 "Set if attachment is required\n"
1990 "Attachment is NOT required\n"
1991 "Attachment is required (standard)\n")
1992{
1993 struct gsm_bts *bts = vty->index;
1994 bts->si_common.chan_desc.att = atoi(argv[0]);
1995 return CMD_SUCCESS;
1996}
1997
1998DEFUN(cfg_bts_chan_desc_bs_pa_mfrms,
1999 cfg_bts_chan_desc_bs_pa_mfrms_cmd,
2000 "channel-descrption bs-pa-mfrms <2-9>",
2001 CD_STR
2002 "Set number of multiframe periods for paging groups\n"
2003 "Number of multiframe periods for paging groups\n")
2004{
2005 struct gsm_bts *bts = vty->index;
2006 int bs_pa_mfrms = atoi(argv[0]);
2007
2008 bts->si_common.chan_desc.bs_pa_mfrms = bs_pa_mfrms - 2;
2009 return CMD_SUCCESS;
2010}
2011
2012DEFUN(cfg_bts_chan_desc_bs_ag_blks_res,
2013 cfg_bts_chan_desc_bs_ag_blks_res_cmd,
2014 "channel-descrption bs-ag-blks-res <0-7>",
2015 CD_STR
2016 "Set number of blocks reserved for access grant\n"
2017 "Number of blocks reserved for access grant\n")
2018{
2019 struct gsm_bts *bts = vty->index;
2020 int bs_ag_blks_res = atoi(argv[0]);
2021
2022 bts->si_common.chan_desc.bs_ag_blks_res = bs_ag_blks_res;
2023 return CMD_SUCCESS;
2024}
2025
Harald Welte8f0ed552010-05-11 21:53:49 +02002026#define NM_STR "Network Management\n"
2027
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002028DEFUN(cfg_bts_rach_nm_b_thresh,
2029 cfg_bts_rach_nm_b_thresh_cmd,
2030 "rach nm busy threshold <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002031 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002032 "Set the NM Busy Threshold\n"
2033 "Set the NM Busy Threshold\n"
2034 "NM Busy Threshold in dB")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002035{
2036 struct gsm_bts *bts = vty->index;
2037 bts->rach_b_thresh = atoi(argv[0]);
2038 return CMD_SUCCESS;
2039}
2040
2041DEFUN(cfg_bts_rach_nm_ldavg,
2042 cfg_bts_rach_nm_ldavg_cmd,
2043 "rach nm load average <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002044 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002045 "Set the NM Loadaverage Slots value\n"
2046 "Set the NM Loadaverage Slots value\n"
2047 "NM Loadaverage Slots value\n")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002048{
2049 struct gsm_bts *bts = vty->index;
2050 bts->rach_ldavg_slots = atoi(argv[0]);
2051 return CMD_SUCCESS;
2052}
2053
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002054DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
2055 "cell barred (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002056 "Should this cell be barred from access?\n"
2057 "Should this cell be barred from access?\n"
2058 "Cell should NOT be barred\n"
2059 "Cell should be barred\n")
2060
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002061{
2062 struct gsm_bts *bts = vty->index;
2063
Harald Welte71355012009-12-21 23:08:18 +01002064 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002065
2066 return CMD_SUCCESS;
2067}
2068
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002069DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
2070 "rach emergency call allowed (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002071 RACH_STR
2072 "Should this cell allow emergency calls?\n"
2073 "Should this cell allow emergency calls?\n"
2074 "Should this cell allow emergency calls?\n"
2075 "Do NOT allow emergency calls\n"
2076 "Allow emergency calls\n")
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002077{
2078 struct gsm_bts *bts = vty->index;
2079
2080 if (atoi(argv[0]) == 0)
2081 bts->si_common.rach_control.t2 |= 0x4;
2082 else
2083 bts->si_common.rach_control.t2 &= ~0x4;
2084
2085 return CMD_SUCCESS;
2086}
2087
Ivan Kluchnikov67920592013-09-16 13:13:04 +04002088DEFUN(cfg_bts_rach_ac_class, cfg_bts_rach_ac_class_cmd,
2089 "rach access-control-class (0|1|2|3|4|5|6|7|8|9|11|12|13|14|15) (barred|allowed)",
2090 RACH_STR
2091 "Set access control class\n"
2092 "Access control class 0\n"
2093 "Access control class 1\n"
2094 "Access control class 2\n"
2095 "Access control class 3\n"
2096 "Access control class 4\n"
2097 "Access control class 5\n"
2098 "Access control class 6\n"
2099 "Access control class 7\n"
2100 "Access control class 8\n"
2101 "Access control class 9\n"
2102 "Access control class 11 for PLMN use\n"
2103 "Access control class 12 for security services\n"
2104 "Access control class 13 for public utilities (e.g. water/gas suppliers)\n"
2105 "Access control class 14 for emergency services\n"
2106 "Access control class 15 for PLMN staff\n"
2107 "barred to use access control class\n"
2108 "allowed to use access control class\n")
2109{
2110 struct gsm_bts *bts = vty->index;
2111
2112 uint8_t control_class;
2113 uint8_t allowed = 0;
2114
2115 if (strcmp(argv[1], "allowed") == 0)
2116 allowed = 1;
2117
2118 control_class = atoi(argv[0]);
2119 if (control_class < 8)
2120 if (allowed)
2121 bts->si_common.rach_control.t3 &= ~(0x1 << control_class);
2122 else
2123 bts->si_common.rach_control.t3 |= (0x1 << control_class);
2124 else
2125 if (allowed)
2126 bts->si_common.rach_control.t2 &= ~(0x1 << (control_class - 8));
2127 else
2128 bts->si_common.rach_control.t2 |= (0x1 << (control_class - 8));
2129
2130 return CMD_SUCCESS;
2131}
2132
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002133DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
2134 "ms max power <0-40>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002135 "MS Options\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02002136 "Maximum transmit power of the MS\n"
2137 "Maximum transmit power of the MS\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002138 "Maximum transmit power of the MS in dBm")
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002139{
2140 struct gsm_bts *bts = vty->index;
2141
2142 bts->ms_max_power = atoi(argv[0]);
2143
2144 return CMD_SUCCESS;
2145}
2146
Harald Weltecfaabbb2012-08-16 23:23:50 +02002147#define CELL_STR "Cell Parameters\n"
2148
Harald Welte73225282009-12-12 18:17:25 +01002149DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
2150 "cell reselection hysteresis <0-14>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002151 CELL_STR "Cell re-selection parameters\n"
2152 "Cell Re-Selection Hysteresis in dB\n"
Harald Welte73225282009-12-12 18:17:25 +01002153 "Cell Re-Selection Hysteresis in dB")
2154{
2155 struct gsm_bts *bts = vty->index;
2156
2157 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
2158
2159 return CMD_SUCCESS;
2160}
2161
2162DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
2163 "rxlev access min <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002164 "Minimum RxLev needed for cell access\n"
2165 "Minimum RxLev needed for cell access\n"
2166 "Minimum RxLev needed for cell access\n"
Harald Welte73225282009-12-12 18:17:25 +01002167 "Minimum RxLev needed for cell access (better than -110dBm)")
2168{
2169 struct gsm_bts *bts = vty->index;
2170
2171 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
2172
2173 return CMD_SUCCESS;
2174}
2175
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002176DEFUN(cfg_bts_cell_bar_qualify, cfg_bts_cell_bar_qualify_cmd,
2177 "cell bar qualify (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002178 CELL_STR "Cell Bar Qualify\n" "Cell Bar Qualify\n"
2179 "Set CBQ to 0\n" "Set CBQ to 1\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002180{
2181 struct gsm_bts *bts = vty->index;
2182
2183 bts->si_common.cell_ro_sel_par.present = 1;
2184 bts->si_common.cell_ro_sel_par.cbq = atoi(argv[0]);
2185
2186 return CMD_SUCCESS;
2187}
2188
2189DEFUN(cfg_bts_cell_resel_ofs, cfg_bts_cell_resel_ofs_cmd,
2190 "cell reselection offset <0-126>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002191 CELL_STR "Cell Re-Selection Parameters\n"
2192 "Cell Re-Selection Offset (CRO) in dB\n"
2193 "Cell Re-Selection Offset (CRO) in dB\n"
2194 )
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002195{
2196 struct gsm_bts *bts = vty->index;
2197
2198 bts->si_common.cell_ro_sel_par.present = 1;
2199 bts->si_common.cell_ro_sel_par.cell_resel_off = atoi(argv[0])/2;
2200
2201 return CMD_SUCCESS;
2202}
2203
2204DEFUN(cfg_bts_temp_ofs, cfg_bts_temp_ofs_cmd,
2205 "temporary offset <0-60>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002206 "Cell selection temporary negative offset\n"
2207 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002208 "Cell selection temporary negative offset in dB")
2209{
2210 struct gsm_bts *bts = vty->index;
2211
2212 bts->si_common.cell_ro_sel_par.present = 1;
2213 bts->si_common.cell_ro_sel_par.temp_offs = atoi(argv[0])/10;
2214
2215 return CMD_SUCCESS;
2216}
2217
2218DEFUN(cfg_bts_temp_ofs_inf, cfg_bts_temp_ofs_inf_cmd,
2219 "temporary offset infinite",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002220 "Cell selection temporary negative offset\n"
2221 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002222 "Sets cell selection temporary negative offset to infinity")
2223{
2224 struct gsm_bts *bts = vty->index;
2225
2226 bts->si_common.cell_ro_sel_par.present = 1;
2227 bts->si_common.cell_ro_sel_par.temp_offs = 7;
2228
2229 return CMD_SUCCESS;
2230}
2231
2232DEFUN(cfg_bts_penalty_time, cfg_bts_penalty_time_cmd,
2233 "penalty time <20-620>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002234 "Cell selection penalty time\n"
2235 "Cell selection penalty time\n"
2236 "Cell selection penalty time in seconds (by 20s increments)\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002237{
2238 struct gsm_bts *bts = vty->index;
2239
2240 bts->si_common.cell_ro_sel_par.present = 1;
2241 bts->si_common.cell_ro_sel_par.penalty_time = (atoi(argv[0])-20)/20;
2242
2243 return CMD_SUCCESS;
2244}
2245
2246DEFUN(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd,
2247 "penalty time reserved",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002248 "Cell selection penalty time\n"
2249 "Cell selection penalty time\n"
2250 "Set cell selection penalty time to reserved value 31, "
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002251 "(indicate that CELL_RESELECT_OFFSET is subtracted from C2 "
2252 "and TEMPORARY_OFFSET is ignored)")
2253{
2254 struct gsm_bts *bts = vty->index;
2255
2256 bts->si_common.cell_ro_sel_par.present = 1;
2257 bts->si_common.cell_ro_sel_par.penalty_time = 31;
2258
2259 return CMD_SUCCESS;
2260}
2261
Harald Welte (local)efc92312009-08-14 23:09:25 +02002262DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
Daniel Willmann4d62d632012-12-27 00:02:01 +01002263 "periodic location update <6-1530>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002264 "Periodic Location Updating Interval\n"
2265 "Periodic Location Updating Interval\n"
2266 "Periodic Location Updating Interval\n"
2267 "Periodic Location Updating Interval in Minutes\n")
Harald Welte (local)efc92312009-08-14 23:09:25 +02002268{
2269 struct gsm_bts *bts = vty->index;
2270
Dieter Spaard6613e02010-10-05 21:10:55 +02002271 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
Harald Welte (local)efc92312009-08-14 23:09:25 +02002272
2273 return CMD_SUCCESS;
2274}
2275
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002276DEFUN(cfg_bts_no_per_loc_upd, cfg_bts_no_per_loc_upd_cmd,
2277 "no periodic location update",
2278 NO_STR
2279 "Periodic Location Updating Interval\n"
2280 "Periodic Location Updating Interval\n"
2281 "Periodic Location Updating Interval\n")
2282{
2283 struct gsm_bts *bts = vty->index;
2284
2285 bts->si_common.chan_desc.t3212 = 0;
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01002286
2287 return CMD_SUCCESS;
2288}
2289
2290DEFUN(cfg_bts_radio_link_timeout, cfg_bts_radio_link_timeout_cmd,
2291 "radio-link-timeout <4-64>",
2292 "Radio link timeout criterion (BTS side)\n"
2293 "Radio link timeout value (lost SACCH block)\n")
2294{
2295 struct gsm_bts *bts = vty->index;
2296
2297 set_radio_link_timeout(&bts->si_common.cell_options, atoi(argv[0]));
2298
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002299 return CMD_SUCCESS;
2300}
2301
Harald Welte8f0ed552010-05-11 21:53:49 +02002302#define GPRS_TEXT "GPRS Packet Network\n"
2303
Harald Welteaf387632010-03-14 23:30:30 +08002304DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welte57ba7e32010-04-18 14:00:26 +02002305 "gprs cell bvci <2-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002306 GPRS_TEXT
2307 "GPRS Cell Settings\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002308 "GPRS BSSGP VC Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002309 "GPRS BSSGP VC Identifier")
2310{
2311 struct gsm_bts *bts = vty->index;
2312
Harald Welte4511d892010-04-18 15:51:20 +02002313 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002314 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2315 return CMD_WARNING;
2316 }
2317
Harald Welte97a282b2010-03-14 15:37:43 +08002318 bts->gprs.cell.bvci = atoi(argv[0]);
2319
2320 return CMD_SUCCESS;
2321}
2322
Harald Weltea5731cf2010-03-22 11:48:36 +08002323DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
2324 "gprs nsei <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002325 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002326 "GPRS NS Entity Identifier\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002327 "GPRS NS Entity Identifier")
2328{
2329 struct gsm_bts *bts = vty->index;
2330
Harald Welte4511d892010-04-18 15:51:20 +02002331 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltea5731cf2010-03-22 11:48:36 +08002332 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2333 return CMD_WARNING;
2334 }
2335
2336 bts->gprs.nse.nsei = atoi(argv[0]);
2337
2338 return CMD_SUCCESS;
2339}
2340
Harald Welte8f0ed552010-05-11 21:53:49 +02002341#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
2342 "NSVC Logical Number\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002343
Harald Welte97a282b2010-03-14 15:37:43 +08002344DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
2345 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002346 GPRS_TEXT NSVC_TEXT
2347 "NS Virtual Connection Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002348 "GPRS NS VC Identifier")
2349{
2350 struct gsm_bts *bts = vty->index;
2351 int idx = atoi(argv[0]);
2352
Harald Welte4511d892010-04-18 15:51:20 +02002353 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002354 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2355 return CMD_WARNING;
2356 }
2357
Harald Welte97a282b2010-03-14 15:37:43 +08002358 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
2359
2360 return CMD_SUCCESS;
2361}
2362
Harald Welteaf387632010-03-14 23:30:30 +08002363DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
2364 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002365 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002366 "GPRS NS Local UDP Port\n"
2367 "GPRS NS Local UDP Port\n"
2368 "GPRS NS Local UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002369 "GPRS NS Local UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002370{
2371 struct gsm_bts *bts = vty->index;
2372 int idx = atoi(argv[0]);
2373
Harald Welte4511d892010-04-18 15:51:20 +02002374 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002375 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2376 return CMD_WARNING;
2377 }
2378
Harald Welteaf387632010-03-14 23:30:30 +08002379 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
2380
2381 return CMD_SUCCESS;
2382}
2383
2384DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
2385 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002386 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002387 "GPRS NS Remote UDP Port\n"
2388 "GPRS NS Remote UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002389 "GPRS NS Remote UDP Port\n"
2390 "GPRS NS Remote UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002391{
2392 struct gsm_bts *bts = vty->index;
2393 int idx = atoi(argv[0]);
2394
Harald Welte4511d892010-04-18 15:51:20 +02002395 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002396 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2397 return CMD_WARNING;
2398 }
2399
Harald Welteaf387632010-03-14 23:30:30 +08002400 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
2401
2402 return CMD_SUCCESS;
2403}
2404
2405DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
2406 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte8f0ed552010-05-11 21:53:49 +02002407 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002408 "GPRS NS Remote IP Address\n"
2409 "GPRS NS Remote IP Address\n"
2410 "GPRS NS Remote IP Address\n")
Harald Welteaf387632010-03-14 23:30:30 +08002411{
2412 struct gsm_bts *bts = vty->index;
2413 int idx = atoi(argv[0]);
2414 struct in_addr ia;
2415
Harald Welte4511d892010-04-18 15:51:20 +02002416 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002417 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2418 return CMD_WARNING;
2419 }
2420
Harald Welteaf387632010-03-14 23:30:30 +08002421 inet_aton(argv[1], &ia);
2422 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
2423
2424 return CMD_SUCCESS;
2425}
2426
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002427DEFUN(cfg_bts_pag_free, cfg_bts_pag_free_cmd,
Harald Weltecfaabbb2012-08-16 23:23:50 +02002428 "paging free <-1-1024>",
2429 "Paging options\n"
2430 "Only page when having a certain amount of free slots\n"
2431 "amount of required free paging slots. -1 to disable\n")
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002432{
2433 struct gsm_bts *bts = vty->index;
2434
2435 bts->paging.free_chans_need = atoi(argv[0]);
2436 return CMD_SUCCESS;
2437}
2438
Harald Welte615e9562010-05-11 23:50:21 +02002439DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
2440 "gprs ns timer " NS_TIMERS " <0-255>",
2441 GPRS_TEXT "Network Service\n"
2442 "Network Service Timer\n"
2443 NS_TIMERS_HELP "Timer Value\n")
2444{
2445 struct gsm_bts *bts = vty->index;
2446 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
2447 int val = atoi(argv[1]);
2448
2449 if (bts->gprs.mode == BTS_GPRS_NONE) {
2450 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2451 return CMD_WARNING;
2452 }
2453
2454 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
2455 return CMD_WARNING;
2456
2457 bts->gprs.nse.timer[idx] = val;
2458
2459 return CMD_SUCCESS;
2460}
2461
2462#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 +02002463#define BSSGP_TIMERS_HELP \
2464 "Tbvc-block timeout\n" \
2465 "Tbvc-block retries\n" \
2466 "Tbvc-unblock retries\n" \
2467 "Tbvcc-reset timeout\n" \
2468 "Tbvc-reset retries\n" \
2469 "Tbvc-suspend timeout\n" \
2470 "Tbvc-suspend retries\n" \
2471 "Tbvc-resume timeout\n" \
2472 "Tbvc-resume retries\n" \
2473 "Tbvc-capa-update timeout\n" \
2474 "Tbvc-capa-update retries\n"
Harald Welte615e9562010-05-11 23:50:21 +02002475
2476DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
2477 "gprs cell timer " BSSGP_TIMERS " <0-255>",
2478 GPRS_TEXT "Cell / BSSGP\n"
2479 "Cell/BSSGP Timer\n"
2480 BSSGP_TIMERS_HELP "Timer Value\n")
2481{
2482 struct gsm_bts *bts = vty->index;
2483 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
2484 int val = atoi(argv[1]);
2485
2486 if (bts->gprs.mode == BTS_GPRS_NONE) {
2487 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2488 return CMD_WARNING;
2489 }
2490
2491 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
2492 return CMD_WARNING;
2493
2494 bts->gprs.cell.timer[idx] = val;
2495
2496 return CMD_SUCCESS;
2497}
2498
Harald Welte97a282b2010-03-14 15:37:43 +08002499DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
2500 "gprs routing area <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002501 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002502 "GPRS Routing Area Code\n"
2503 "GPRS Routing Area Code\n"
2504 "GPRS Routing Area Code\n")
Harald Welte97a282b2010-03-14 15:37:43 +08002505{
2506 struct gsm_bts *bts = vty->index;
2507
Harald Welte4511d892010-04-18 15:51:20 +02002508 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002509 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2510 return CMD_WARNING;
2511 }
2512
Harald Welte97a282b2010-03-14 15:37:43 +08002513 bts->gprs.rac = atoi(argv[0]);
2514
2515 return CMD_SUCCESS;
2516}
2517
Max292ec582016-07-28 11:55:37 +02002518DEFUN(cfg_bts_gprs_ctrl_ack, cfg_bts_gprs_ctrl_ack_cmd,
2519 "gprs control-ack-type-rach", GPRS_TEXT
2520 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2521 "four access bursts format instead of default RLC/MAC control block\n")
2522{
2523 struct gsm_bts *bts = vty->index;
2524
2525 if (bts->gprs.mode == BTS_GPRS_NONE) {
2526 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2527 return CMD_WARNING;
2528 }
2529
2530 bts->gprs.ctrl_ack_type_use_block = false;
2531
2532 return CMD_SUCCESS;
2533}
2534
2535DEFUN(cfg_no_bts_gprs_ctrl_ack, cfg_no_bts_gprs_ctrl_ack_cmd,
2536 "no gprs control-ack-type-rach", NO_STR GPRS_TEXT
2537 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2538 "four access bursts format instead of default RLC/MAC control block\n")
2539{
2540 struct gsm_bts *bts = vty->index;
2541
2542 if (bts->gprs.mode == BTS_GPRS_NONE) {
2543 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2544 return CMD_WARNING;
2545 }
2546
2547 bts->gprs.ctrl_ack_type_use_block = true;
2548
2549 return CMD_SUCCESS;
2550}
2551
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01002552DEFUN(cfg_bts_gprs_net_ctrl_ord, cfg_bts_gprs_net_ctrl_ord_cmd,
2553 "gprs network-control-order (nc0|nc1|nc2)",
2554 GPRS_TEXT
2555 "GPRS Network Control Order\n"
2556 "MS controlled cell re-selection, no measurement reporting\n"
2557 "MS controlled cell re-selection, MS sends measurement reports\n"
2558 "Network controlled cell re-selection, MS sends measurement reports\n")
2559{
2560 struct gsm_bts *bts = vty->index;
2561
2562 if (bts->gprs.mode == BTS_GPRS_NONE) {
2563 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2564 return CMD_WARNING;
2565 }
2566
2567 bts->gprs.net_ctrl_ord = atoi(argv[0] + 2);
2568
2569 return CMD_SUCCESS;
2570}
2571
Harald Welte4511d892010-04-18 15:51:20 +02002572DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
2573 "gprs mode (none|gprs|egprs)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002574 GPRS_TEXT
2575 "GPRS Mode for this BTS\n"
2576 "GPRS Disabled on this BTS\n"
2577 "GPRS Enabled on this BTS\n"
2578 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welteaf387632010-03-14 23:30:30 +08002579{
2580 struct gsm_bts *bts = vty->index;
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002581 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0], NULL);
Harald Welteaf387632010-03-14 23:30:30 +08002582
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002583 if (!bts_gprs_mode_is_compat(bts, mode)) {
Harald Weltef3d8e922010-06-14 22:44:42 +02002584 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2585 VTY_NEWLINE);
2586 return CMD_WARNING;
2587 }
2588
2589 bts->gprs.mode = mode;
Harald Welteaf387632010-03-14 23:30:30 +08002590
2591 return CMD_SUCCESS;
2592}
2593
bhargava350533c2016-07-21 11:14:34 +05302594DEFUN(cfg_bts_gprs_11bit_rach_support_for_egprs,
2595 cfg_bts_gprs_11bit_rach_support_for_egprs_cmd,
2596 "gprs 11bit_rach_support_for_egprs (0|1)",
2597 GPRS_TEXT "11 bit RACH options\n"
2598 "Disable 11 bit RACH for EGPRS\n"
2599 "Enable 11 bit RACH for EGPRS")
2600{
2601 struct gsm_bts *bts = vty->index;
2602
2603 bts->gprs.supports_egprs_11bit_rach = atoi(argv[0]);
2604
2605 if (bts->gprs.supports_egprs_11bit_rach > 1) {
2606 vty_out(vty, "Error in RACH type%s", VTY_NEWLINE);
2607 return CMD_WARNING;
2608 }
2609
2610 if ((bts->gprs.mode == BTS_GPRS_NONE) &&
2611 (bts->gprs.supports_egprs_11bit_rach == 1)) {
2612 vty_out(vty, "Error:gprs mode is none and 11bit rach is"
2613 " enabled%s", VTY_NEWLINE);
2614 return CMD_WARNING;
2615 }
2616
2617 return CMD_SUCCESS;
2618}
2619
Harald Welte9fbff4a2010-07-30 11:50:09 +02002620#define SI_TEXT "System Information Messages\n"
2621#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)"
2622#define SI_TYPE_HELP "System Information Type 1\n" \
2623 "System Information Type 2\n" \
2624 "System Information Type 3\n" \
2625 "System Information Type 4\n" \
2626 "System Information Type 5\n" \
2627 "System Information Type 6\n" \
2628 "System Information Type 7\n" \
2629 "System Information Type 8\n" \
2630 "System Information Type 9\n" \
2631 "System Information Type 10\n" \
2632 "System Information Type 13\n" \
2633 "System Information Type 16\n" \
2634 "System Information Type 17\n" \
2635 "System Information Type 18\n" \
2636 "System Information Type 19\n" \
2637 "System Information Type 20\n" \
2638 "System Information Type 2bis\n" \
2639 "System Information Type 2ter\n" \
2640 "System Information Type 2quater\n" \
2641 "System Information Type 5bis\n" \
2642 "System Information Type 5ter\n"
2643
2644DEFUN(cfg_bts_si_mode, cfg_bts_si_mode_cmd,
2645 "system-information " SI_TYPE_TEXT " mode (static|computed)",
2646 SI_TEXT SI_TYPE_HELP
2647 "System Information Mode\n"
2648 "Static user-specified\n"
2649 "Dynamic, BSC-computed\n")
2650{
2651 struct gsm_bts *bts = vty->index;
2652 int type;
2653
2654 type = get_string_value(osmo_sitype_strs, argv[0]);
2655 if (type < 0) {
2656 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2657 return CMD_WARNING;
2658 }
2659
2660 if (!strcmp(argv[1], "static"))
2661 bts->si_mode_static |= (1 << type);
2662 else
2663 bts->si_mode_static &= ~(1 << type);
2664
2665 return CMD_SUCCESS;
2666}
2667
2668DEFUN(cfg_bts_si_static, cfg_bts_si_static_cmd,
2669 "system-information " SI_TYPE_TEXT " static HEXSTRING",
2670 SI_TEXT SI_TYPE_HELP
2671 "Static System Information filling\n"
2672 "Static user-specified SI content in HEX notation\n")
2673{
2674 struct gsm_bts *bts = vty->index;
2675 int rc, type;
2676
2677 type = get_string_value(osmo_sitype_strs, argv[0]);
2678 if (type < 0) {
2679 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2680 return CMD_WARNING;
2681 }
2682
2683 if (!(bts->si_mode_static & (1 << type))) {
2684 vty_out(vty, "SI Type %s is not configured in static mode%s",
2685 get_value_string(osmo_sitype_strs, type), VTY_NEWLINE);
2686 return CMD_WARNING;
2687 }
2688
Harald Welte290aaed2010-07-30 11:53:18 +02002689 /* Fill buffer with padding pattern */
Max6f0e50c2017-04-12 15:30:54 +02002690 memset(GSM_BTS_SI(bts, type), 0x2b, GSM_MACBLOCK_LEN);
Harald Welte290aaed2010-07-30 11:53:18 +02002691
2692 /* Parse the user-specified SI in hex format, [partially] overwriting padding */
Max6f0e50c2017-04-12 15:30:54 +02002693 rc = osmo_hexparse(argv[1], GSM_BTS_SI(bts, type), GSM_MACBLOCK_LEN);
2694 if (rc < 0 || rc > GSM_MACBLOCK_LEN) {
Harald Welte9fbff4a2010-07-30 11:50:09 +02002695 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
2696 return CMD_WARNING;
2697 }
2698
2699 /* Mark this SI as present */
2700 bts->si_valid |= (1 << type);
2701
2702 return CMD_SUCCESS;
2703}
2704
Harald Welte42def722017-01-13 00:10:32 +01002705DEFUN(cfg_bts_early_cm, cfg_bts_early_cm_cmd,
2706 "early-classmark-sending (allowed|forbidden)",
2707 "Early Classmark Sending\n"
2708 "Early Classmark Sending is allowed\n"
2709 "Early Classmark Sending is forbidden\n")
2710{
2711 struct gsm_bts *bts = vty->index;
Harald Welte42def722017-01-13 00:10:32 +01002712
2713 if (!strcmp(argv[0], "allowed"))
2714 bts->early_classmark_allowed = true;
2715 else
2716 bts->early_classmark_allowed = false;
2717
2718 return CMD_SUCCESS;
2719}
2720
Harald Welte32c09622011-01-11 23:44:56 +01002721DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
Harald Welte64c07d22011-02-15 11:43:27 +01002722 "neighbor-list mode (automatic|manual|manual-si5)",
Harald Welte32c09622011-01-11 23:44:56 +01002723 "Neighbor List\n" "Mode of Neighbor List generation\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002724 "Automatically from all BTS in this OpenBSC\n" "Manual\n"
2725 "Manual with different lists for SI2 and SI5\n")
Harald Welte32c09622011-01-11 23:44:56 +01002726{
2727 struct gsm_bts *bts = vty->index;
Harald Welte64c07d22011-02-15 11:43:27 +01002728 int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
Harald Welte32c09622011-01-11 23:44:56 +01002729
Harald Welte64c07d22011-02-15 11:43:27 +01002730 switch (mode) {
2731 case NL_MODE_MANUAL_SI5SEP:
2732 case NL_MODE_MANUAL:
Harald Welte32c09622011-01-11 23:44:56 +01002733 /* make sure we clear the current list when switching to
2734 * manual mode */
2735 if (bts->neigh_list_manual_mode == 0)
2736 memset(&bts->si_common.data.neigh_list, 0,
2737 sizeof(bts->si_common.data.neigh_list));
Harald Welte64c07d22011-02-15 11:43:27 +01002738 break;
2739 default:
2740 break;
2741 }
2742
2743 bts->neigh_list_manual_mode = mode;
Harald Welte32c09622011-01-11 23:44:56 +01002744
2745 return CMD_SUCCESS;
2746}
2747
2748DEFUN(cfg_bts_neigh, cfg_bts_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002749 "neighbor-list (add|del) arfcn <0-1023>",
Harald Welte32c09622011-01-11 23:44:56 +01002750 "Neighbor List\n" "Add to manual neighbor list\n"
2751 "Delete from manual neighbor list\n" "ARFCN of neighbor\n"
2752 "ARFCN of neighbor\n")
2753{
2754 struct gsm_bts *bts = vty->index;
2755 struct bitvec *bv = &bts->si_common.neigh_list;
2756 uint16_t arfcn = atoi(argv[1]);
2757
2758 if (!bts->neigh_list_manual_mode) {
2759 vty_out(vty, "%% Cannot configure neighbor list in "
2760 "automatic mode%s", VTY_NEWLINE);
2761 return CMD_WARNING;
2762 }
2763
2764 if (!strcmp(argv[0], "add"))
2765 bitvec_set_bit_pos(bv, arfcn, 1);
2766 else
2767 bitvec_set_bit_pos(bv, arfcn, 0);
2768
2769 return CMD_SUCCESS;
2770}
2771
Max59a1bf32016-04-15 16:04:46 +02002772DEFUN(cfg_bts_si2quater_neigh_add, cfg_bts_si2quater_neigh_add_cmd,
Max2c16bee2017-02-15 13:51:37 +01002773 "si2quater neighbor-list add earfcn <0-65535> thresh-hi <0-31> "
2774 "thresh-lo <0-32> prio <0-8> qrxlv <0-32> meas <0-8>",
2775 "SI2quater Neighbor List\n" "SI2quater Neighbor List\n"
2776 "Add to manual SI2quater neighbor list\n"
2777 "EARFCN of neighbor\n" "EARFCN of neighbor\n"
2778 "threshold high bits\n" "threshold high bits\n"
2779 "threshold low bits\n" "threshold low bits (32 means NA)\n"
2780 "priority\n" "priority (8 means NA)\n"
2781 "QRXLEVMIN\n" "QRXLEVMIN (32 means NA)\n"
2782 "measurement bandwidth\n" "measurement bandwidth (8 means NA)\n")
Max59a1bf32016-04-15 16:04:46 +02002783{
2784 struct gsm_bts *bts = vty->index;
2785 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
2786 uint16_t arfcn = atoi(argv[0]);
Max2c16bee2017-02-15 13:51:37 +01002787 uint8_t thresh_hi = atoi(argv[1]), thresh_lo = atoi(argv[2]),
2788 prio = atoi(argv[3]), qrx = atoi(argv[4]), meas = atoi(argv[5]);
2789 int r = osmo_earfcn_add(e, arfcn,
2790 (meas < 8) ? meas : OSMO_EARFCN_MEAS_INVALID);
Max59a1bf32016-04-15 16:04:46 +02002791
2792 if (r < 0) {
Max2c16bee2017-02-15 13:51:37 +01002793 vty_out(vty, "Unable to add ARFCN %u: %s%s", arfcn, strerror(-r),
Max59a1bf32016-04-15 16:04:46 +02002794 VTY_NEWLINE);
2795 return CMD_WARNING;
2796 }
2797
Max2c16bee2017-02-15 13:51:37 +01002798 if (e->thresh_hi && thresh_hi != e->thresh_hi)
2799 vty_out(vty, "Warning: multiple threshold-high are not "
2800 "supported, overriding previous threshold %u%s",
2801 e->thresh_hi, VTY_NEWLINE);
2802
2803 e->thresh_hi = thresh_hi;
2804
2805 if (thresh_lo != 32) {
2806 if (e->thresh_lo_valid && e->thresh_lo != thresh_lo)
2807 vty_out(vty, "Warning: multiple threshold-low are not "
2808 "supported, overriding previous threshold %u%s",
2809 e->thresh_lo, VTY_NEWLINE);
2810 e->thresh_lo = thresh_lo;
2811 e->thresh_lo_valid = true;
Maxaafff962016-04-20 15:57:14 +02002812 }
Max2c16bee2017-02-15 13:51:37 +01002813
2814 if (qrx != 32) {
2815 if (e->qrxlm_valid && e->qrxlm != qrx)
2816 vty_out(vty, "Warning: multiple QRXLEVMIN are not "
2817 "supported, overriding previous value %u%s",
2818 e->qrxlm, VTY_NEWLINE);
2819 e->qrxlm = qrx;
2820 e->qrxlm_valid = true;
2821 }
2822
2823 if (prio != 8) {
2824 if (e->prio_valid && e->prio != prio)
2825 vty_out(vty, "Warning: multiple priorities are not "
2826 "supported, overriding previous value %u%s",
2827 e->prio, VTY_NEWLINE);
2828 e->prio = prio;
2829 e->prio_valid = true;
2830 }
2831
Maxf39d03a2017-05-12 17:00:30 +02002832 if (si2q_num(bts) < 2) /* FIXME: use SI2Q_MAX_NUM */
Max2c16bee2017-02-15 13:51:37 +01002833 return CMD_SUCCESS;
2834
Maxf39d03a2017-05-12 17:00:30 +02002835 vty_out(vty, "Warning: not enough space in SI2quater (%u/%u used) for a given EARFCN %u%s",
2836 bts->si2q_count, 2, arfcn, VTY_NEWLINE); /* FIXME: use SI2Q_MAX_NUM */
Maxaafff962016-04-20 15:57:14 +02002837 osmo_earfcn_del(e, arfcn);
Max2c16bee2017-02-15 13:51:37 +01002838
Maxaafff962016-04-20 15:57:14 +02002839 return CMD_WARNING;
Max59a1bf32016-04-15 16:04:46 +02002840}
2841
2842DEFUN(cfg_bts_si2quater_neigh_del, cfg_bts_si2quater_neigh_del_cmd,
Max35697b92016-04-29 12:51:31 +02002843 "si2quater neighbor-list del earfcn <0-65535>",
Max59a1bf32016-04-15 16:04:46 +02002844 "SI2quater Neighbor List\n"
2845 "SI2quater Neighbor List\n"
2846 "Delete from SI2quater manual neighbor list\n"
Max36212f22016-04-20 12:06:05 +02002847 "EARFCN of neighbor\n"
2848 "EARFCN\n")
Max59a1bf32016-04-15 16:04:46 +02002849{
2850 struct gsm_bts *bts = vty->index;
2851 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
Max0c1bc262016-04-20 12:06:06 +02002852 uint16_t arfcn = atoi(argv[0]);
Max59a1bf32016-04-15 16:04:46 +02002853 int r = osmo_earfcn_del(e, arfcn);
2854 if (r < 0) {
2855 vty_out(vty, "Unable to delete arfcn %u: %s%s", arfcn,
Max0c1bc262016-04-20 12:06:06 +02002856 strerror(-r), VTY_NEWLINE);
Max59a1bf32016-04-15 16:04:46 +02002857 return CMD_WARNING;
2858 }
2859
2860 return CMD_SUCCESS;
2861}
2862
Max26679e02016-04-20 15:57:13 +02002863DEFUN(cfg_bts_si2quater_uarfcn_add, cfg_bts_si2quater_uarfcn_add_cmd,
Max35697b92016-04-29 12:51:31 +02002864 "si2quater neighbor-list add uarfcn <0-16383> <0-511> <0-1>",
Max26679e02016-04-20 15:57:13 +02002865 "SI2quater Neighbor List\n"
2866 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
2867 "UARFCN of neighbor\n" "UARFCN of neighbor\n" "scrambling code\n"
2868 "diversity bit\n")
2869{
2870 struct gsm_bts *bts = vty->index;
2871 uint16_t arfcn = atoi(argv[0]), scramble = atoi(argv[1]);
2872
2873 switch(bts_uarfcn_add(bts, arfcn, scramble, atoi(argv[2]))) {
2874 case -ENOMEM:
2875 vty_out(vty, "Unable to add arfcn: max number of UARFCNs (%u) "
2876 "reached%s", MAX_EARFCN_LIST, VTY_NEWLINE);
Harald Weltea191dcd2016-11-26 15:06:37 +01002877 return CMD_WARNING;
Maxaafff962016-04-20 15:57:14 +02002878 case -ENOSPC:
2879 vty_out(vty, "Warning: not enough space in si2quater for a "
2880 "given arfcn%s", VTY_NEWLINE);
Harald Weltea191dcd2016-11-26 15:06:37 +01002881 return CMD_WARNING;
Max26679e02016-04-20 15:57:13 +02002882 case -EADDRINUSE:
2883 vty_out(vty, "Unable to add arfcn: (%u, %u) is already added%s",
2884 arfcn, scramble, VTY_NEWLINE);
2885 return CMD_WARNING;
2886 }
2887
2888 return CMD_SUCCESS;
2889}
2890
2891DEFUN(cfg_bts_si2quater_uarfcn_del, cfg_bts_si2quater_uarfcn_del_cmd,
Max35697b92016-04-29 12:51:31 +02002892 "si2quater neighbor-list del uarfcn <0-16383> <0-511>",
Max26679e02016-04-20 15:57:13 +02002893 "SI2quater Neighbor List\n"
2894 "SI2quater Neighbor List\n"
2895 "Delete from SI2quater manual neighbor list\n"
2896 "UARFCN of neighbor\n"
2897 "UARFCN\n"
2898 "scrambling code\n")
2899{
2900 struct gsm_bts *bts = vty->index;
2901
2902 if (bts_uarfcn_del(bts, atoi(argv[0]), atoi(argv[1])) < 0) {
2903 vty_out(vty, "Unable to delete uarfcn: pair not found%s",
2904 VTY_NEWLINE);
2905 return CMD_WARNING;
2906 }
2907
2908 return CMD_SUCCESS;
2909}
2910
Harald Welte64c07d22011-02-15 11:43:27 +01002911DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002912 "si5 neighbor-list (add|del) arfcn <0-1023>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002913 "SI5 Neighbor List\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002914 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
2915 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
2916 "ARFCN of neighbor\n")
2917{
2918 struct gsm_bts *bts = vty->index;
2919 struct bitvec *bv = &bts->si_common.si5_neigh_list;
2920 uint16_t arfcn = atoi(argv[1]);
2921
2922 if (!bts->neigh_list_manual_mode) {
2923 vty_out(vty, "%% Cannot configure neighbor list in "
2924 "automatic mode%s", VTY_NEWLINE);
2925 return CMD_WARNING;
2926 }
2927
2928 if (!strcmp(argv[0], "add"))
2929 bitvec_set_bit_pos(bv, arfcn, 1);
2930 else
2931 bitvec_set_bit_pos(bv, arfcn, 0);
2932
2933 return CMD_SUCCESS;
2934}
Harald Welte9fbff4a2010-07-30 11:50:09 +02002935
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02002936#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
2937
2938DEFUN(cfg_bts_excl_rf_lock,
2939 cfg_bts_excl_rf_lock_cmd,
2940 "rf-lock-exclude",
2941 EXCL_RFLOCK_STR)
2942{
2943 struct gsm_bts *bts = vty->index;
2944 bts->excl_from_rf_lock = 1;
2945 return CMD_SUCCESS;
2946}
2947
2948DEFUN(cfg_bts_no_excl_rf_lock,
2949 cfg_bts_no_excl_rf_lock_cmd,
2950 "no rf-lock-exclude",
2951 NO_STR EXCL_RFLOCK_STR)
2952{
2953 struct gsm_bts *bts = vty->index;
2954 bts->excl_from_rf_lock = 0;
2955 return CMD_SUCCESS;
2956}
2957
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01002958#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
2959
2960DEFUN(cfg_bts_force_comb_si,
2961 cfg_bts_force_comb_si_cmd,
2962 "force-combined-si",
2963 FORCE_COMB_SI_STR)
2964{
2965 struct gsm_bts *bts = vty->index;
2966 bts->force_combined_si = 1;
2967 return CMD_SUCCESS;
2968}
2969
2970DEFUN(cfg_bts_no_force_comb_si,
2971 cfg_bts_no_force_comb_si_cmd,
2972 "no force-combined-si",
2973 NO_STR FORCE_COMB_SI_STR)
2974{
2975 struct gsm_bts *bts = vty->index;
2976 bts->force_combined_si = 0;
2977 return CMD_SUCCESS;
2978}
2979
Andreas Eversberga83d5112013-12-07 18:32:28 +01002980static void _get_codec_from_arg(struct vty *vty, int argc, const char *argv[])
2981{
2982 struct gsm_bts *bts = vty->index;
2983 struct bts_codec_conf *codec = &bts->codec;
2984 int i;
2985
2986 codec->hr = 0;
2987 codec->efr = 0;
2988 codec->amr = 0;
2989 for (i = 0; i < argc; i++) {
2990 if (!strcmp(argv[i], "hr"))
2991 codec->hr = 1;
2992 if (!strcmp(argv[i], "efr"))
2993 codec->efr = 1;
2994 if (!strcmp(argv[i], "amr"))
2995 codec->amr = 1;
2996 }
2997}
2998
2999#define CODEC_PAR_STR " (hr|efr|amr)"
3000#define CODEC_HELP_STR "Half Rate\n" \
3001 "Enhanced Full Rate\nAdaptive Multirate\n"
3002
3003DEFUN(cfg_bts_codec0, cfg_bts_codec0_cmd,
3004 "codec-support fr",
3005 "Codec Support settings\nFullrate\n")
3006{
3007 _get_codec_from_arg(vty, 0, argv);
3008 return CMD_SUCCESS;
3009}
3010
3011DEFUN(cfg_bts_codec1, cfg_bts_codec1_cmd,
3012 "codec-support fr" CODEC_PAR_STR,
3013 "Codec Support settings\nFullrate\n"
3014 CODEC_HELP_STR)
3015{
3016 _get_codec_from_arg(vty, 1, argv);
3017 return CMD_SUCCESS;
3018}
3019
3020DEFUN(cfg_bts_codec2, cfg_bts_codec2_cmd,
3021 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR,
3022 "Codec Support settings\nFullrate\n"
3023 CODEC_HELP_STR CODEC_HELP_STR)
3024{
3025 _get_codec_from_arg(vty, 2, argv);
3026 return CMD_SUCCESS;
3027}
3028
3029DEFUN(cfg_bts_codec3, cfg_bts_codec3_cmd,
3030 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
3031 "Codec Support settings\nFullrate\n"
3032 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
3033{
3034 _get_codec_from_arg(vty, 3, argv);
3035 return CMD_SUCCESS;
3036}
3037
3038DEFUN(cfg_bts_codec4, cfg_bts_codec4_cmd,
3039 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
3040 "Codec Support settings\nFullrate\n"
3041 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
3042{
3043 _get_codec_from_arg(vty, 4, argv);
3044 return CMD_SUCCESS;
3045}
3046
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01003047DEFUN(cfg_bts_depends_on, cfg_bts_depends_on_cmd,
3048 "depends-on-bts <0-255>",
3049 "This BTS can only be started if another one is up\n" "BTS Number\n")
3050{
3051 struct gsm_bts *bts = vty->index;
3052 struct gsm_bts *other_bts;
3053 int dep = atoi(argv[0]);
3054
3055
3056 if (!is_ipaccess_bts(bts)) {
3057 vty_out(vty, "This feature is only available for IP systems.%s",
3058 VTY_NEWLINE);
3059 return CMD_WARNING;
3060 }
3061
3062 other_bts = gsm_bts_num(bts->network, dep);
3063 if (!other_bts || !is_ipaccess_bts(other_bts)) {
3064 vty_out(vty, "This feature is only available for IP systems.%s",
3065 VTY_NEWLINE);
3066 return CMD_WARNING;
3067 }
3068
3069 if (dep >= bts->nr) {
3070 vty_out(vty, "%%Need to depend on an already declared unit.%s",
3071 VTY_NEWLINE);
3072 return CMD_WARNING;
3073 }
3074
3075 bts_depend_mark(bts, dep);
3076 return CMD_SUCCESS;
3077}
3078
3079DEFUN(cfg_bts_no_depends_on, cfg_bts_no_depends_on_cmd,
3080 "depeneds-on-bts <0-255>",
3081 NO_STR "This BTS can only be started if another one is up\n"
3082 "BTS Number\n")
3083{
3084 struct gsm_bts *bts = vty->index;
3085 int dep = atoi(argv[0]);
3086
3087 bts_depend_clear(bts, dep);
3088 return CMD_SUCCESS;
3089}
3090
Andreas Eversberg73266522014-01-19 11:47:44 +01003091#define AMR_TEXT "Adaptive Multi Rate settings\n"
3092#define AMR_MODE_TEXT "Codec modes to use with AMR codec\n"
3093#define AMR_START_TEXT "Initial codec to use with AMR\n" \
3094 "Automatically\nFirst codec\nSecond codec\nThird codec\nFourth codec\n"
3095#define AMR_TH_TEXT "AMR threshold between codecs\nMS side\nBTS side\n"
3096#define AMR_HY_TEXT "AMR hysteresis between codecs\nMS side\nBTS side\n"
3097
3098static void get_amr_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3099{
3100 struct gsm_bts *bts = vty->index;
3101 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3102 struct gsm48_multi_rate_conf *mr_conf =
3103 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3104 int i;
3105
3106 mr->gsm48_ie[1] = 0;
3107 for (i = 0; i < argc; i++)
3108 mr->gsm48_ie[1] |= 1 << atoi(argv[i]);
3109 mr_conf->icmi = 0;
3110}
3111
3112static void get_amr_th_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3113{
3114 struct gsm_bts *bts = vty->index;
3115 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003116 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003117 int i;
3118
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003119 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3120 for (i = 0; i < argc - 1; i++)
3121 modes[i].threshold = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003122}
3123
3124static void get_amr_hy_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3125{
3126 struct gsm_bts *bts = vty->index;
3127 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003128 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003129 int i;
3130
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003131 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3132 for (i = 0; i < argc - 1; i++)
3133 modes[i].hysteresis = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003134}
3135
3136static void get_amr_start_from_arg(struct vty *vty, const char *argv[], int full)
3137{
3138 struct gsm_bts *bts = vty->index;
3139 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3140 struct gsm48_multi_rate_conf *mr_conf =
3141 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3142 int num = 0, i;
3143
3144 for (i = 0; i < ((full) ? 8 : 6); i++) {
3145 if ((mr->gsm48_ie[1] & (1 << i))) {
3146 num++;
3147 }
3148 }
3149
3150 if (argv[0][0] == 'a' || num == 0)
3151 mr_conf->icmi = 0;
3152 else {
3153 mr_conf->icmi = 1;
3154 if (num < atoi(argv[0]))
3155 mr_conf->smod = num - 1;
3156 else
3157 mr_conf->smod = atoi(argv[0]) - 1;
3158 }
3159}
3160
3161#define AMR_TCHF_PAR_STR " (0|1|2|3|4|5|6|7)"
3162#define AMR_TCHF_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n" \
3163 "10,2k\n12,2k\n"
3164
3165#define AMR_TCHH_PAR_STR " (0|1|2|3|4|5)"
3166#define AMR_TCHH_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n"
3167
3168#define AMR_TH_HELP_STR "Threshold between codec 1 and 2\n"
3169#define AMR_HY_HELP_STR "Hysteresis between codec 1 and 2\n"
3170
3171DEFUN(cfg_bts_amr_fr_modes1, cfg_bts_amr_fr_modes1_cmd,
3172 "amr tch-f modes" AMR_TCHF_PAR_STR,
3173 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3174 AMR_TCHF_HELP_STR)
3175{
3176 get_amr_from_arg(vty, 1, argv, 1);
3177 return CMD_SUCCESS;
3178}
3179
3180DEFUN(cfg_bts_amr_fr_modes2, cfg_bts_amr_fr_modes2_cmd,
3181 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3182 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3183 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3184{
3185 get_amr_from_arg(vty, 2, argv, 1);
3186 return CMD_SUCCESS;
3187}
3188
3189DEFUN(cfg_bts_amr_fr_modes3, cfg_bts_amr_fr_modes3_cmd,
3190 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3191 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3192 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3193{
3194 get_amr_from_arg(vty, 3, argv, 1);
3195 return CMD_SUCCESS;
3196}
3197
3198DEFUN(cfg_bts_amr_fr_modes4, cfg_bts_amr_fr_modes4_cmd,
3199 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3200 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3201 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3202{
3203 get_amr_from_arg(vty, 4, argv, 1);
3204 return CMD_SUCCESS;
3205}
3206
3207DEFUN(cfg_bts_amr_fr_start_mode, cfg_bts_amr_fr_start_mode_cmd,
3208 "amr tch-f start-mode (auto|1|2|3|4)",
3209 AMR_TEXT "Full Rate\n" AMR_START_TEXT)
3210{
3211 get_amr_start_from_arg(vty, argv, 1);
3212 return CMD_SUCCESS;
3213}
3214
3215DEFUN(cfg_bts_amr_fr_thres1, cfg_bts_amr_fr_thres1_cmd,
3216 "amr tch-f threshold (ms|bts) <0-63>",
3217 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3218 AMR_TH_HELP_STR)
3219{
3220 get_amr_th_from_arg(vty, 2, argv, 1);
3221 return CMD_SUCCESS;
3222}
3223
3224DEFUN(cfg_bts_amr_fr_thres2, cfg_bts_amr_fr_thres2_cmd,
3225 "amr tch-f threshold (ms|bts) <0-63> <0-63>",
3226 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3227 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3228{
3229 get_amr_th_from_arg(vty, 3, argv, 1);
3230 return CMD_SUCCESS;
3231}
3232
3233DEFUN(cfg_bts_amr_fr_thres3, cfg_bts_amr_fr_thres3_cmd,
3234 "amr tch-f threshold (ms|bts) <0-63> <0-63> <0-63>",
3235 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3236 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3237{
3238 get_amr_th_from_arg(vty, 4, argv, 1);
3239 return CMD_SUCCESS;
3240}
3241
3242DEFUN(cfg_bts_amr_fr_hyst1, cfg_bts_amr_fr_hyst1_cmd,
3243 "amr tch-f hysteresis (ms|bts) <0-15>",
3244 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3245 AMR_HY_HELP_STR)
3246{
3247 get_amr_hy_from_arg(vty, 2, argv, 1);
3248 return CMD_SUCCESS;
3249}
3250
3251DEFUN(cfg_bts_amr_fr_hyst2, cfg_bts_amr_fr_hyst2_cmd,
3252 "amr tch-f hysteresis (ms|bts) <0-15> <0-15>",
3253 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3254 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3255{
3256 get_amr_hy_from_arg(vty, 3, argv, 1);
3257 return CMD_SUCCESS;
3258}
3259
3260DEFUN(cfg_bts_amr_fr_hyst3, cfg_bts_amr_fr_hyst3_cmd,
3261 "amr tch-f hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3262 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3263 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3264{
3265 get_amr_hy_from_arg(vty, 4, argv, 1);
3266 return CMD_SUCCESS;
3267}
3268
3269DEFUN(cfg_bts_amr_hr_modes1, cfg_bts_amr_hr_modes1_cmd,
3270 "amr tch-h modes" AMR_TCHH_PAR_STR,
3271 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3272 AMR_TCHH_HELP_STR)
3273{
3274 get_amr_from_arg(vty, 1, argv, 0);
3275 return CMD_SUCCESS;
3276}
3277
3278DEFUN(cfg_bts_amr_hr_modes2, cfg_bts_amr_hr_modes2_cmd,
3279 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3280 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3281 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3282{
3283 get_amr_from_arg(vty, 2, argv, 0);
3284 return CMD_SUCCESS;
3285}
3286
3287DEFUN(cfg_bts_amr_hr_modes3, cfg_bts_amr_hr_modes3_cmd,
3288 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3289 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3290 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3291{
3292 get_amr_from_arg(vty, 3, argv, 0);
3293 return CMD_SUCCESS;
3294}
3295
3296DEFUN(cfg_bts_amr_hr_modes4, cfg_bts_amr_hr_modes4_cmd,
3297 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3298 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3299 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3300{
3301 get_amr_from_arg(vty, 4, argv, 0);
3302 return CMD_SUCCESS;
3303}
3304
3305DEFUN(cfg_bts_amr_hr_start_mode, cfg_bts_amr_hr_start_mode_cmd,
3306 "amr tch-h start-mode (auto|1|2|3|4)",
3307 AMR_TEXT "Half Rate\n" AMR_START_TEXT)
3308{
3309 get_amr_start_from_arg(vty, argv, 0);
3310 return CMD_SUCCESS;
3311}
3312
3313DEFUN(cfg_bts_amr_hr_thres1, cfg_bts_amr_hr_thres1_cmd,
3314 "amr tch-h threshold (ms|bts) <0-63>",
3315 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3316 AMR_TH_HELP_STR)
3317{
3318 get_amr_th_from_arg(vty, 2, argv, 0);
3319 return CMD_SUCCESS;
3320}
3321
3322DEFUN(cfg_bts_amr_hr_thres2, cfg_bts_amr_hr_thres2_cmd,
3323 "amr tch-h threshold (ms|bts) <0-63> <0-63>",
3324 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3325 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3326{
3327 get_amr_th_from_arg(vty, 3, argv, 0);
3328 return CMD_SUCCESS;
3329}
3330
3331DEFUN(cfg_bts_amr_hr_thres3, cfg_bts_amr_hr_thres3_cmd,
3332 "amr tch-h threshold (ms|bts) <0-63> <0-63> <0-63>",
3333 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3334 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3335{
3336 get_amr_th_from_arg(vty, 4, argv, 0);
3337 return CMD_SUCCESS;
3338}
3339
3340DEFUN(cfg_bts_amr_hr_hyst1, cfg_bts_amr_hr_hyst1_cmd,
3341 "amr tch-h hysteresis (ms|bts) <0-15>",
3342 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3343 AMR_HY_HELP_STR)
3344{
3345 get_amr_hy_from_arg(vty, 2, argv, 0);
3346 return CMD_SUCCESS;
3347}
3348
3349DEFUN(cfg_bts_amr_hr_hyst2, cfg_bts_amr_hr_hyst2_cmd,
3350 "amr tch-h hysteresis (ms|bts) <0-15> <0-15>",
3351 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3352 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3353{
3354 get_amr_hy_from_arg(vty, 3, argv, 0);
3355 return CMD_SUCCESS;
3356}
3357
3358DEFUN(cfg_bts_amr_hr_hyst3, cfg_bts_amr_hr_hyst3_cmd,
3359 "amr tch-h hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3360 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3361 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3362{
3363 get_amr_hy_from_arg(vty, 4, argv, 0);
3364 return CMD_SUCCESS;
3365}
3366
Harald Welte8f0ed552010-05-11 21:53:49 +02003367#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02003368
Harald Welte5258fc42009-03-28 19:07:53 +00003369/* per TRX configuration */
3370DEFUN(cfg_trx,
3371 cfg_trx_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02003372 "trx <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02003373 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00003374 "Select a TRX to configure")
3375{
3376 int trx_nr = atoi(argv[0]);
3377 struct gsm_bts *bts = vty->index;
3378 struct gsm_bts_trx *trx;
3379
Harald Weltee441d9c2009-06-21 16:17:15 +02003380 if (trx_nr > bts->num_trx) {
3381 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
3382 bts->num_trx, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00003383 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02003384 } else if (trx_nr == bts->num_trx) {
3385 /* we need to allocate a new one */
3386 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003387 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02003388 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003389
Harald Weltee441d9c2009-06-21 16:17:15 +02003390 if (!trx)
3391 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00003392
3393 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02003394 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00003395 vty->node = TRX_NODE;
3396
3397 return CMD_SUCCESS;
3398}
3399
3400DEFUN(cfg_trx_arfcn,
3401 cfg_trx_arfcn_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01003402 "arfcn <0-1023>",
Harald Welte13fe2192012-08-17 09:57:25 +02003403 "Set the ARFCN for this TRX\n"
3404 "Absolute Radio Frequency Channel Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003405{
3406 int arfcn = atoi(argv[0]);
3407 struct gsm_bts_trx *trx = vty->index;
3408
3409 /* FIXME: check if this ARFCN is supported by this TRX */
3410
3411 trx->arfcn = arfcn;
3412
3413 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
3414 /* FIXME: use OML layer to update the ARFCN */
3415 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
3416
3417 return CMD_SUCCESS;
3418}
3419
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003420DEFUN(cfg_trx_nominal_power,
3421 cfg_trx_nominal_power_cmd,
3422 "nominal power <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003423 "Nominal TRX RF Power in dBm\n"
3424 "Nominal TRX RF Power in dBm\n"
3425 "Nominal TRX RF Power in dBm\n")
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003426{
3427 struct gsm_bts_trx *trx = vty->index;
3428
3429 trx->nominal_power = atoi(argv[0]);
3430
3431 return CMD_SUCCESS;
3432}
3433
Harald Weltefcd24452009-06-20 18:15:19 +02003434DEFUN(cfg_trx_max_power_red,
3435 cfg_trx_max_power_red_cmd,
3436 "max_power_red <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003437 "Reduction of maximum BS RF Power (relative to nominal power)\n"
Harald Weltefcd24452009-06-20 18:15:19 +02003438 "Reduction of maximum BS RF Power in dB\n")
3439{
3440 int maxpwr_r = atoi(argv[0]);
3441 struct gsm_bts_trx *trx = vty->index;
Harald Welte61a83b22009-11-18 09:20:22 +01003442 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-06-20 18:15:19 +02003443
3444 /* FIXME: check if our BTS type supports more than 12 */
3445 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
3446 vty_out(vty, "%% Power %d dB is not in the valid range%s",
3447 maxpwr_r, VTY_NEWLINE);
3448 return CMD_WARNING;
3449 }
3450 if (maxpwr_r & 1) {
3451 vty_out(vty, "%% Power %d dB is not an even value%s",
3452 maxpwr_r, VTY_NEWLINE);
3453 return CMD_WARNING;
3454 }
3455
3456 trx->max_power_red = maxpwr_r;
3457
3458 /* FIXME: make sure we update this using OML */
3459
3460 return CMD_SUCCESS;
3461}
3462
Harald Welte42581822009-08-08 16:12:58 +02003463DEFUN(cfg_trx_rsl_e1,
3464 cfg_trx_rsl_e1_cmd,
3465 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003466 "RSL Parameters\n"
3467 "E1/T1 interface to be used for RSL\n"
3468 "E1/T1 interface to be used for RSL\n"
3469 "E1/T1 Line Number to be used for RSL\n"
3470 "E1/T1 Timeslot to be used for RSL\n"
3471 "E1/T1 Timeslot to be used for RSL\n"
3472 "E1/T1 Sub-slot to be used for RSL\n"
3473 "E1/T1 Sub-slot 0 is to be used for RSL\n"
3474 "E1/T1 Sub-slot 1 is to be used for RSL\n"
3475 "E1/T1 Sub-slot 2 is to be used for RSL\n"
3476 "E1/T1 Sub-slot 3 is to be used for RSL\n"
3477 "E1/T1 full timeslot is to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003478{
3479 struct gsm_bts_trx *trx = vty->index;
3480
3481 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
3482
3483 return CMD_SUCCESS;
3484}
3485
3486DEFUN(cfg_trx_rsl_e1_tei,
3487 cfg_trx_rsl_e1_tei_cmd,
3488 "rsl e1 tei <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003489 "RSL Parameters\n"
3490 "Set the TEI to be used for RSL\n"
3491 "Set the TEI to be used for RSL\n"
3492 "TEI to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003493{
3494 struct gsm_bts_trx *trx = vty->index;
3495
3496 trx->rsl_tei = atoi(argv[0]);
3497
3498 return CMD_SUCCESS;
3499}
3500
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003501DEFUN(cfg_trx_rf_locked,
3502 cfg_trx_rf_locked_cmd,
3503 "rf_locked (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003504 "Set or unset the RF Locking (Turn off RF of the TRX)\n"
3505 "TRX is NOT RF locked (active)\n"
3506 "TRX is RF locked (turned off)\n")
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003507{
3508 int locked = atoi(argv[0]);
3509 struct gsm_bts_trx *trx = vty->index;
3510
3511 gsm_trx_lock_rf(trx, locked);
3512 return CMD_SUCCESS;
3513}
Harald Welte42581822009-08-08 16:12:58 +02003514
Harald Welte5258fc42009-03-28 19:07:53 +00003515/* per TS configuration */
3516DEFUN(cfg_ts,
3517 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003518 "timeslot <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003519 "Select a Timeslot to configure\n"
3520 "Timeslot number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003521{
3522 int ts_nr = atoi(argv[0]);
3523 struct gsm_bts_trx *trx = vty->index;
3524 struct gsm_bts_trx_ts *ts;
3525
3526 if (ts_nr >= TRX_NR_TS) {
3527 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
3528 TRX_NR_TS, VTY_NEWLINE);
3529 return CMD_WARNING;
3530 }
3531
3532 ts = &trx->ts[ts_nr];
3533
3534 vty->index = ts;
3535 vty->node = TS_NODE;
3536
3537 return CMD_SUCCESS;
3538}
3539
Harald Weltea6fd58e2009-08-07 00:25:23 +02003540DEFUN(cfg_ts_pchan,
3541 cfg_ts_pchan_cmd,
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003542 "phys_chan_config PCHAN", /* dynamically generated! */
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003543 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003544{
3545 struct gsm_bts_trx_ts *ts = vty->index;
3546 int pchanc;
3547
3548 pchanc = gsm_pchan_parse(argv[0]);
3549 if (pchanc < 0)
3550 return CMD_WARNING;
3551
3552 ts->pchan = pchanc;
3553
3554 return CMD_SUCCESS;
3555}
3556
3557/* used for backwards compatibility with old config files that still
3558 * have uppercase pchan type names */
3559DEFUN_HIDDEN(cfg_ts_pchan_compat,
3560 cfg_ts_pchan_compat_cmd,
Harald Weltea6fd58e2009-08-07 00:25:23 +02003561 "phys_chan_config PCHAN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003562 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003563{
3564 struct gsm_bts_trx_ts *ts = vty->index;
3565 int pchanc;
3566
3567 pchanc = gsm_pchan_parse(argv[0]);
3568 if (pchanc < 0)
3569 return CMD_WARNING;
3570
3571 ts->pchan = pchanc;
3572
3573 return CMD_SUCCESS;
3574}
3575
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003576
3577
Harald Welte135a6482011-05-30 12:09:13 +02003578DEFUN(cfg_ts_tsc,
3579 cfg_ts_tsc_cmd,
3580 "training_sequence_code <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003581 "Training Sequence Code of the Timeslot\n" "TSC\n")
Harald Welte135a6482011-05-30 12:09:13 +02003582{
3583 struct gsm_bts_trx_ts *ts = vty->index;
3584
Harald Welte903aaea2014-01-19 17:10:50 +01003585 if (!gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_MULTI_TSC)) {
3586 vty_out(vty, "%% This BTS does not support a TSC != BCC, "
3587 "falling back to BCC%s", VTY_NEWLINE);
3588 ts->tsc = -1;
3589 return CMD_WARNING;
3590 }
3591
Harald Welte135a6482011-05-30 12:09:13 +02003592 ts->tsc = atoi(argv[0]);
3593
3594 return CMD_SUCCESS;
3595}
3596
Harald Weltea39b0f22010-06-14 22:26:10 +02003597#define HOPPING_STR "Configure frequency hopping\n"
3598
3599DEFUN(cfg_ts_hopping,
3600 cfg_ts_hopping_cmd,
3601 "hopping enabled (0|1)",
3602 HOPPING_STR "Enable or disable frequency hopping\n"
3603 "Disable frequency hopping\n" "Enable frequency hopping\n")
3604{
3605 struct gsm_bts_trx_ts *ts = vty->index;
Harald Weltec2fb3d02010-06-14 22:47:37 +02003606 int enabled = atoi(argv[0]);
Harald Weltea39b0f22010-06-14 22:26:10 +02003607
Harald Weltec2fb3d02010-06-14 22:47:37 +02003608 if (enabled && !gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_HOPPING)) {
3609 vty_out(vty, "BTS model does not support hopping%s",
3610 VTY_NEWLINE);
3611 return CMD_WARNING;
3612 }
3613
3614 ts->hopping.enabled = enabled;
Harald Weltea39b0f22010-06-14 22:26:10 +02003615
3616 return CMD_SUCCESS;
3617}
3618
Harald Welte6e0cd042009-09-12 13:05:33 +02003619DEFUN(cfg_ts_hsn,
3620 cfg_ts_hsn_cmd,
Harald Weltea39b0f22010-06-14 22:26:10 +02003621 "hopping sequence-number <0-63>",
3622 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003623 "Which hopping sequence to use for this channel\n"
3624 "Hopping Sequence Number (HSN)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003625{
3626 struct gsm_bts_trx_ts *ts = vty->index;
3627
3628 ts->hopping.hsn = atoi(argv[0]);
3629
3630 return CMD_SUCCESS;
3631}
3632
3633DEFUN(cfg_ts_maio,
3634 cfg_ts_maio_cmd,
3635 "hopping maio <0-63>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003636 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003637 "Which hopping MAIO to use for this channel\n"
3638 "Mobile Allocation Index Offset (MAIO)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003639{
3640 struct gsm_bts_trx_ts *ts = vty->index;
3641
3642 ts->hopping.maio = atoi(argv[0]);
3643
3644 return CMD_SUCCESS;
3645}
3646
3647DEFUN(cfg_ts_arfcn_add,
3648 cfg_ts_arfcn_add_cmd,
3649 "hopping arfcn add <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003650 HOPPING_STR "Configure hopping ARFCN list\n"
3651 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003652{
3653 struct gsm_bts_trx_ts *ts = vty->index;
3654 int arfcn = atoi(argv[0]);
3655
Harald Weltea39b0f22010-06-14 22:26:10 +02003656 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
3657
Harald Welte6e0cd042009-09-12 13:05:33 +02003658 return CMD_SUCCESS;
3659}
3660
3661DEFUN(cfg_ts_arfcn_del,
3662 cfg_ts_arfcn_del_cmd,
3663 "hopping arfcn del <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003664 HOPPING_STR "Configure hopping ARFCN list\n"
3665 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003666{
3667 struct gsm_bts_trx_ts *ts = vty->index;
3668 int arfcn = atoi(argv[0]);
3669
Harald Weltea39b0f22010-06-14 22:26:10 +02003670 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
3671
Harald Welte6e0cd042009-09-12 13:05:33 +02003672 return CMD_SUCCESS;
3673}
3674
Harald Weltea6fd58e2009-08-07 00:25:23 +02003675DEFUN(cfg_ts_e1_subslot,
3676 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003677 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003678 "E1/T1 channel connected to this on-air timeslot\n"
3679 "E1/T1 channel connected to this on-air timeslot\n"
3680 "E1/T1 line connected to this on-air timeslot\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02003681 "E1/T1 timeslot connected to this on-air timeslot\n"
3682 "E1/T1 timeslot connected to this on-air timeslot\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02003683 "E1/T1 sub-slot connected to this on-air timeslot\n"
3684 "E1/T1 sub-slot 0 connected to this on-air timeslot\n"
3685 "E1/T1 sub-slot 1 connected to this on-air timeslot\n"
3686 "E1/T1 sub-slot 2 connected to this on-air timeslot\n"
3687 "E1/T1 sub-slot 3 connected to this on-air timeslot\n"
3688 "Full E1/T1 timeslot connected to this on-air timeslot\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003689{
3690 struct gsm_bts_trx_ts *ts = vty->index;
3691
Harald Welte42581822009-08-08 16:12:58 +02003692 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003693
3694 return CMD_SUCCESS;
3695}
Harald Welte5258fc42009-03-28 19:07:53 +00003696
Harald Welte4f10c252010-05-16 21:47:13 +02003697void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
3698{
3699 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003700 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_TOTAL].current,
3701 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_NO_CHANNEL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003702 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003703 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003704 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RF_FAIL].current,
3705 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RLL_ERR].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003706 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003707 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003708 net->bsc_ctrs->ctr[BSC_CTR_PAGING_ATTEMPTED].current,
3709 net->bsc_ctrs->ctr[BSC_CTR_PAGING_COMPLETED].current,
3710 net->bsc_ctrs->ctr[BSC_CTR_PAGING_EXPIRED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003711 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003712 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003713 net->bsc_ctrs->ctr[BSC_CTR_BTS_OML_FAIL].current,
3714 net->bsc_ctrs->ctr[BSC_CTR_BTS_RSL_FAIL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003715 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003716}
3717
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003718DEFUN(drop_bts,
3719 drop_bts_cmd,
Holger Hans Peter Freyther0586b0f2010-04-11 12:46:45 +02003720 "drop bts connection <0-65535> (oml|rsl)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003721 "Debug/Simulation command to drop Abis/IP BTS\n"
3722 "Debug/Simulation command to drop Abis/IP BTS\n"
3723 "Debug/Simulation command to drop Abis/IP BTS\n"
3724 "BTS NR\n" "Drop OML Connection\n" "Drop RSL Connection\n")
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003725{
3726 struct gsm_network *gsmnet;
3727 struct gsm_bts_trx *trx;
3728 struct gsm_bts *bts;
3729 unsigned int bts_nr;
3730
3731 gsmnet = gsmnet_from_vty(vty);
3732
3733 bts_nr = atoi(argv[0]);
3734 if (bts_nr >= gsmnet->num_bts) {
3735 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3736 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3737 return CMD_WARNING;
3738 }
3739
3740 bts = gsm_bts_num(gsmnet, bts_nr);
3741 if (!bts) {
3742 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3743 return CMD_WARNING;
3744 }
3745
3746 if (!is_ipaccess_bts(bts)) {
3747 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
3748 return CMD_WARNING;
3749 }
3750
3751
3752 /* close all connections */
3753 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003754 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003755 } else if (strcmp(argv[1], "rsl") == 0) {
3756 /* close all rsl connections */
3757 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003758 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003759 }
3760 } else {
3761 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
3762 return CMD_WARNING;
3763 }
3764
3765 return CMD_SUCCESS;
3766}
3767
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01003768DEFUN(restart_bts, restart_bts_cmd,
3769 "restart-bts <0-65535>",
3770 "Restart ip.access nanoBTS through OML\n"
3771 "BTS Number\n")
3772{
3773 struct gsm_network *gsmnet;
3774 struct gsm_bts_trx *trx;
3775 struct gsm_bts *bts;
3776 unsigned int bts_nr;
3777
3778 gsmnet = gsmnet_from_vty(vty);
3779
3780 bts_nr = atoi(argv[0]);
3781 if (bts_nr >= gsmnet->num_bts) {
3782 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3783 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3784 return CMD_WARNING;
3785 }
3786
3787 bts = gsm_bts_num(gsmnet, bts_nr);
3788 if (!bts) {
3789 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3790 return CMD_WARNING;
3791 }
3792
3793 if (!is_ipaccess_bts(bts) || is_sysmobts_v2(bts)) {
3794 vty_out(vty, "This command only works for ipaccess nanoBTS.%s",
3795 VTY_NEWLINE);
3796 return CMD_WARNING;
3797 }
3798
3799 /* go from last TRX to c0 */
3800 llist_for_each_entry_reverse(trx, &bts->trx_list, list)
3801 abis_nm_ipaccess_restart(trx);
3802
3803 return CMD_SUCCESS;
3804}
3805
Harald Welte30f1f372014-12-28 15:00:45 +01003806DEFUN(smscb_cmd, smscb_cmd_cmd,
3807 "bts <0-255> smscb-command <1-4> HEXSTRING",
3808 "BTS related commands\n" "BTS Number\n"
3809 "SMS Cell Broadcast\n" "Last Valid Block\n"
3810 "Hex Encoded SMSCB message (up to 88 octets)\n")
3811{
3812 struct gsm_bts *bts;
3813 int bts_nr = atoi(argv[0]);
3814 int last_block = atoi(argv[1]);
3815 struct rsl_ie_cb_cmd_type cb_cmd;
3816 uint8_t buf[88];
3817 int rc;
3818
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +02003819 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
Harald Welte30f1f372014-12-28 15:00:45 +01003820 if (!bts) {
3821 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3822 return CMD_WARNING;
3823 }
3824 rc = osmo_hexparse(argv[2], buf, sizeof(buf));
3825 if (rc < 0 || rc > sizeof(buf)) {
3826 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
3827 return CMD_WARNING;
3828 }
3829
3830 cb_cmd.spare = 0;
3831 cb_cmd.def_bcast = 0;
3832 cb_cmd.command = RSL_CB_CMD_TYPE_NORMAL;
3833
3834 switch (last_block) {
3835 case 1:
3836 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_1;
3837 break;
3838 case 2:
3839 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_2;
3840 break;
3841 case 3:
3842 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_3;
3843 break;
3844 case 4:
3845 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_4;
3846 break;
3847 }
3848
3849 rsl_sms_cb_command(bts, RSL_CHAN_SDCCH4_ACCH, cb_cmd, buf, rc);
3850
3851 return CMD_SUCCESS;
3852}
3853
Harald Welte7fe00fb2017-05-27 14:09:50 +02003854/* resolve a gsm_bts_trx_ts basd on the given numeric identifiers */
Harald Welte645eb622017-05-27 15:52:58 +02003855static struct gsm_bts_trx_ts *vty_get_ts(struct vty *vty, const char *bts_str, const char *trx_str,
3856 const char *ts_str)
Harald Welte7fe00fb2017-05-27 14:09:50 +02003857{
Harald Welte645eb622017-05-27 15:52:58 +02003858 int bts_nr = atoi(bts_str);
3859 int trx_nr = atoi(trx_str);
3860 int ts_nr = atoi(ts_str);
Harald Welte7fe00fb2017-05-27 14:09:50 +02003861 struct gsm_bts *bts;
3862 struct gsm_bts_trx *trx;
3863 struct gsm_bts_trx_ts *ts;
3864
3865 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
3866 if (!bts) {
3867 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3868 return NULL;
3869 }
3870
3871 trx = gsm_bts_trx_num(bts, trx_nr);
3872 if (!trx) {
3873 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
3874 return NULL;
3875 }
3876
3877 ts = &trx->ts[ts_nr];
3878
3879 return ts;
3880}
Harald Welte30f1f372014-12-28 15:00:45 +01003881
Harald Welted0d2b0b2010-12-23 13:18:07 +01003882DEFUN(pdch_act, pdch_act_cmd,
3883 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
3884 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3885 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
3886 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
3887 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
3888{
Harald Welted0d2b0b2010-12-23 13:18:07 +01003889 struct gsm_bts_trx_ts *ts;
Harald Welted0d2b0b2010-12-23 13:18:07 +01003890 int activate;
3891
Harald Welte645eb622017-05-27 15:52:58 +02003892 ts = vty_get_ts(vty, argv[0], argv[1], argv[2]);
Harald Welte7fe00fb2017-05-27 14:09:50 +02003893 if (!ts)
Harald Welted0d2b0b2010-12-23 13:18:07 +01003894 return CMD_WARNING;
Harald Welted0d2b0b2010-12-23 13:18:07 +01003895
Harald Welte7fe00fb2017-05-27 14:09:50 +02003896 if (!is_ipaccess_bts(ts->trx->bts)) {
Harald Welted0d2b0b2010-12-23 13:18:07 +01003897 vty_out(vty, "%% This command only works for ipaccess BTS%s",
3898 VTY_NEWLINE);
3899 return CMD_WARNING;
3900 }
3901
Harald Welted0d2b0b2010-12-23 13:18:07 +01003902 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
3903 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
Harald Welte645eb622017-05-27 15:52:58 +02003904 "mode%s", ts->nr, VTY_NEWLINE);
Harald Welted0d2b0b2010-12-23 13:18:07 +01003905 return CMD_WARNING;
3906 }
3907
3908 if (!strcmp(argv[3], "activate"))
3909 activate = 1;
3910 else
3911 activate = 0;
3912
3913 rsl_ipacc_pdch_activate(ts, activate);
3914
3915 return CMD_SUCCESS;
3916
3917}
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003918
Harald Welte2abd5e12017-05-27 14:10:40 +02003919/* determine the logical channel type based on the physical channel type */
3920static int lchan_type_by_pchan(enum gsm_phys_chan_config pchan)
3921{
3922 switch (pchan) {
3923 case GSM_PCHAN_TCH_F:
3924 return GSM_LCHAN_TCH_F;
3925 case GSM_PCHAN_TCH_H:
3926 return GSM_LCHAN_TCH_H;
3927 case GSM_PCHAN_SDCCH8_SACCH8C:
3928 case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:
3929 case GSM_PCHAN_CCCH_SDCCH4:
3930 case GSM_PCHAN_CCCH_SDCCH4_CBCH:
3931 return GSM_LCHAN_SDCCH;
3932 default:
3933 return -1;
3934 }
3935}
3936
3937/* configure the lchan for a single AMR mode (as specified) */
3938static int lchan_set_single_amr_mode(struct gsm_lchan *lchan, uint8_t amr_mode)
3939{
3940 struct amr_multirate_conf mr;
3941 struct gsm48_multi_rate_conf *mr_conf;
3942 mr_conf = (struct gsm48_multi_rate_conf *) &mr.gsm48_ie;
3943
3944 if (amr_mode > 7)
3945 return -1;
3946
3947 memset(&mr, 0, sizeof(mr));
3948 mr_conf->ver = 1;
3949 /* bit-mask of supported modes, only one bit is set. Reflects
3950 * Figure 10.5.2.47a where there are no thershold and only a
3951 * single mode */
3952 mr.gsm48_ie[1] = 1 << amr_mode;
3953
3954 mr.ms_mode[0].mode = amr_mode;
3955 mr.bts_mode[0].mode = amr_mode;
3956
3957 /* encode this configuration into the lchan for both uplink and
3958 * downlink direction */
3959 gsm48_multirate_config(lchan->mr_ms_lv, &mr, mr.ms_mode);
3960 gsm48_multirate_config(lchan->mr_bts_lv, &mr, mr.bts_mode);
3961
3962 return 0;
3963}
3964
3965/* Debug/Measurement command to activate a given logical channel
3966 * manually in a given mode/codec. This is useful for receiver
3967 * performance testing (FER/RBER/...) */
3968DEFUN(lchan_act, lchan_act_cmd,
3969 "bts <0-255> trx <0-255> timeslot <0-7> sub-slot <0-7> (activate|deactivate) (hr|fr|efr|amr) [<0-7>]",
3970 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3971 "TRX Timeslot\n" "Timeslot Number\n" "Sub-Slot Number\n" "Sub-Slot Number\n"
3972 "Manual Channel Activation (e.g. for BER test)\n"
3973 "Manual Channel Deactivation (e.g. for BER test)\n"
3974 "Half-Rate v1\n" "Full-Rate\n" "Enhanced Full Rate\n" "Adaptive Multi-Rate\n" "AMR Mode\n")
3975{
3976 struct gsm_bts_trx_ts *ts;
3977 struct gsm_lchan *lchan;
3978 int ss_nr = atoi(argv[3]);
3979 const char *act_str = argv[4];
3980 const char *codec_str = argv[5];
3981 int activate;
3982
3983 ts = vty_get_ts(vty, argv[0], argv[1], argv[2]);
3984 if (!ts)
3985 return CMD_WARNING;
3986
3987 lchan = &ts->lchan[ss_nr];
3988
3989 if (!strcmp(act_str, "activate"))
3990 activate = 1;
3991 else
3992 activate = 0;
3993
3994 if (ss_nr >= ts_subslots(ts)) {
3995 vty_out(vty, "%% subslot %d >= permitted %d for physical channel %s%s",
3996 ss_nr, ts_subslots(ts), gsm_pchan_name(ts->pchan), VTY_NEWLINE);
3997 return CMD_WARNING;
3998 }
3999
4000 if (activate) {
4001 int lchan_t;
4002 if (lchan->state != LCHAN_S_NONE) {
4003 vty_out(vty, "%% Cannot activate: Channel busy!%s", VTY_NEWLINE);
4004 return CMD_WARNING;
4005 }
4006 lchan_t = lchan_type_by_pchan(ts->pchan);
4007 if (lchan_t < 0)
4008 return CMD_WARNING;
4009 /* configure the lchan */
4010 lchan->type = lchan_t;
4011 lchan->rsl_cmode = RSL_CMOD_SPD_SPEECH;
4012 if (!strcmp(codec_str, "hr") || !strcmp(codec_str, "fr"))
4013 lchan->tch_mode = GSM48_CMODE_SPEECH_V1;
4014 else if (!strcmp(codec_str, "efr"))
4015 lchan->tch_mode = GSM48_CMODE_SPEECH_EFR;
4016 else if (!strcmp(codec_str, "amr")) {
4017 int amr_mode;
4018 if (argc < 7) {
4019 vty_out(vty, "%% AMR requires specification of AMR mode%s", VTY_NEWLINE);
4020 return CMD_WARNING;
4021 }
4022 amr_mode = atoi(argv[6]);
4023 lchan->tch_mode = GSM48_CMODE_SPEECH_AMR;
4024 lchan_set_single_amr_mode(lchan, amr_mode);
4025 }
4026 vty_out(vty, "%% activating lchan %s%s", gsm_lchan_name(lchan), VTY_NEWLINE);
4027 rsl_chan_activate_lchan(lchan, RSL_ACT_TYPE_INITIAL, 0);
4028 rsl_ipacc_crcx(lchan);
Harald Welte2abd5e12017-05-27 14:10:40 +02004029 } else {
4030 rsl_direct_rf_release(lchan);
4031 }
4032
4033 return CMD_SUCCESS;
4034}
4035
Harald Welte3f86c522017-05-27 15:53:28 +02004036DEFUN(lchan_mdcx, lchan_mdcx_cmd,
4037 "bts <0-255> trx <0-255> timeslot <0-7> sub-slot <0-7> mdcx A.B.C.D <0-65535>",
4038 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
4039 "TRX Timeslot\n" "Timeslot Number\n" "Sub-Slot\n" "Sub-Slot Number\n"
4040 "Modify RTP Connection\n" "MGW IP Address\n" "MGW UDP Port\n")
4041{
4042 struct gsm_bts_trx_ts *ts;
4043 struct gsm_lchan *lchan;
4044 int ss_nr = atoi(argv[3]);
4045 int port = atoi(argv[5]);
4046 struct in_addr ia;
4047 inet_aton(argv[4], &ia);
4048
4049 ts = vty_get_ts(vty, argv[0], argv[1], argv[2]);
4050 if (!ts)
4051 return CMD_WARNING;
4052
4053 lchan = &ts->lchan[ss_nr];
4054
4055 if (ss_nr >= ts_subslots(ts)) {
4056 vty_out(vty, "%% subslot %d >= permitted %d for physical channel %s%s",
4057 ss_nr, ts_subslots(ts), gsm_pchan_name(ts->pchan), VTY_NEWLINE);
4058 return CMD_WARNING;
4059 }
4060
4061 vty_out(vty, "%% connecting RTP of %s to %s:%u%s", gsm_lchan_name(lchan),
4062 inet_ntoa(ia), port, VTY_NEWLINE);
4063 rsl_ipacc_mdcx(lchan, ntohl(ia.s_addr), port, 0);
4064 return CMD_SUCCESS;
4065}
Harald Weltedcccb182010-05-16 20:52:23 +02004066extern int bsc_vty_init_extra(void);
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02004067
Maxdb0e3802017-01-12 19:35:11 +01004068int bsc_vty_init(struct gsm_network *network)
Harald Welte68628e82009-03-10 12:17:57 +00004069{
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004070 cfg_ts_pchan_cmd.string =
4071 vty_cmd_string_from_valstr(tall_bsc_ctx,
4072 gsm_pchant_names,
4073 "phys_chan_config (", "|", ")",
4074 VTY_DO_LOWER);
4075 cfg_ts_pchan_cmd.doc =
4076 vty_cmd_string_from_valstr(tall_bsc_ctx,
4077 gsm_pchant_descs,
4078 "Physical Channel Combination\n",
4079 "\n", "", 0);
4080
Harald Weltee555c2b2012-08-17 13:02:12 +02004081 cfg_bts_type_cmd.string =
4082 vty_cmd_string_from_valstr(tall_bsc_ctx,
4083 bts_type_names,
4084 "type (", "|", ")",
4085 VTY_DO_LOWER);
4086 cfg_bts_type_cmd.doc =
4087 vty_cmd_string_from_valstr(tall_bsc_ctx,
4088 bts_type_descs,
4089 "BTS Vendor/Type\n",
4090 "\n", "", 0);
4091
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +02004092 common_cs_vty_init(network, config_write_net);
Harald Weltee555c2b2012-08-17 13:02:12 +02004093
Neels Hofmeyrea11bf82016-05-12 01:53:23 +02004094 install_element_ve(&bsc_show_net_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +00004095 install_element_ve(&show_bts_cmd);
4096 install_element_ve(&show_trx_cmd);
4097 install_element_ve(&show_ts_cmd);
4098 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08004099 install_element_ve(&show_lchan_summary_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00004100
Harald Welteb4d5b172010-05-12 16:10:35 +00004101 install_element_ve(&show_paging_cmd);
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01004102 install_element_ve(&show_paging_group_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00004103
Maxdb0e3802017-01-12 19:35:11 +01004104 logging_vty_add_cmds(NULL);
Jacob Erlbeck64630cc2015-10-26 16:25:37 +01004105 osmo_stats_vty_add_cmds();
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01004106
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01004107 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01004108 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-12-21 16:51:50 +01004109 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
4110 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
4111 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
4112 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
4113 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
4114 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01004115 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01004116 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
4117 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
4118 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
4119 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
4120 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
4121 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
4122 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
4123 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
4124 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltec9f499f2010-12-23 22:53:50 +01004125 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01004126 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08004127 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08004128 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02004129
4130 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02004131 install_node(&bts_node, config_write_bts);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004132 vty_install_default(BTS_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004133 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004134 install_element(BTS_NODE, &cfg_description_cmd);
4135 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02004136 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02004137 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Maxc08ee712016-05-11 12:45:13 +02004138 install_element(BTS_NODE, &cfg_bts_dtxu_cmd);
4139 install_element(BTS_NODE, &cfg_bts_dtxd_cmd);
4140 install_element(BTS_NODE, &cfg_bts_no_dtxu_cmd);
4141 install_element(BTS_NODE, &cfg_bts_no_dtxd_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00004142 install_element(BTS_NODE, &cfg_bts_lac_cmd);
4143 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004144 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00004145 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8b291802013-03-12 13:57:05 +01004146 install_element(BTS_NODE, &cfg_bts_rsl_ip_cmd);
Sylvain Munautc9519462011-10-17 14:04:55 +02004147 install_element(BTS_NODE, &cfg_bts_nokia_site_skip_reset_cmd);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01004148 install_element(BTS_NODE, &cfg_bts_nokia_site_no_loc_rel_cnf_cmd);
Sipos Csaba56e17662015-02-07 13:27:36 +01004149 install_element(BTS_NODE, &cfg_bts_nokia_site_bts_reset_timer_cnf_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02004150 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004151 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
4152 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte7a8fa412009-08-10 13:48:16 +02004153 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01004154 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
4155 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02004156 install_element(BTS_NODE, &cfg_bts_chan_desc_att_cmd);
4157 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_pa_mfrms_cmd);
4158 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_ag_blks_res_cmd);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08004159 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
4160 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02004161 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08004162 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Ivan Kluchnikov67920592013-09-16 13:13:04 +04004163 install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02004164 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02004165 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02004166 install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
Harald Welte73225282009-12-12 18:17:25 +01004167 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
4168 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaute0b06b02010-11-28 18:17:28 +01004169 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
4170 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
4171 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
4172 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
4173 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
4174 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01004175 install_element(BTS_NODE, &cfg_bts_radio_link_timeout_cmd);
Harald Welte4511d892010-04-18 15:51:20 +02004176 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
bhargava350533c2016-07-21 11:14:34 +05304177 install_element(BTS_NODE, &cfg_bts_gprs_11bit_rach_support_for_egprs_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02004178 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004179 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01004180 install_element(BTS_NODE, &cfg_bts_gprs_net_ctrl_ord_cmd);
Max292ec582016-07-28 11:55:37 +02004181 install_element(BTS_NODE, &cfg_bts_gprs_ctrl_ack_cmd);
4182 install_element(BTS_NODE, &cfg_no_bts_gprs_ctrl_ack_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004183 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02004184 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08004185 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004186 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-03-14 23:30:30 +08004187 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
4188 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
4189 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08004190 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welte9fbff4a2010-07-30 11:50:09 +02004191 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
4192 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welte42def722017-01-13 00:10:32 +01004193 install_element(BTS_NODE, &cfg_bts_early_cm_cmd);
Harald Welte32c09622011-01-11 23:44:56 +01004194 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
4195 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Welte64c07d22011-02-15 11:43:27 +01004196 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Max59a1bf32016-04-15 16:04:46 +02004197 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_add_cmd);
4198 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_del_cmd);
Max26679e02016-04-20 15:57:13 +02004199 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_add_cmd);
4200 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_del_cmd);
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02004201 install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
4202 install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01004203 install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
4204 install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
Andreas Eversberga83d5112013-12-07 18:32:28 +01004205 install_element(BTS_NODE, &cfg_bts_codec0_cmd);
4206 install_element(BTS_NODE, &cfg_bts_codec1_cmd);
4207 install_element(BTS_NODE, &cfg_bts_codec2_cmd);
4208 install_element(BTS_NODE, &cfg_bts_codec3_cmd);
4209 install_element(BTS_NODE, &cfg_bts_codec4_cmd);
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01004210 install_element(BTS_NODE, &cfg_bts_depends_on_cmd);
4211 install_element(BTS_NODE, &cfg_bts_no_depends_on_cmd);
Andreas Eversberg73266522014-01-19 11:47:44 +01004212 install_element(BTS_NODE, &cfg_bts_amr_fr_modes1_cmd);
4213 install_element(BTS_NODE, &cfg_bts_amr_fr_modes2_cmd);
4214 install_element(BTS_NODE, &cfg_bts_amr_fr_modes3_cmd);
4215 install_element(BTS_NODE, &cfg_bts_amr_fr_modes4_cmd);
4216 install_element(BTS_NODE, &cfg_bts_amr_fr_thres1_cmd);
4217 install_element(BTS_NODE, &cfg_bts_amr_fr_thres2_cmd);
4218 install_element(BTS_NODE, &cfg_bts_amr_fr_thres3_cmd);
4219 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst1_cmd);
4220 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst2_cmd);
4221 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst3_cmd);
4222 install_element(BTS_NODE, &cfg_bts_amr_fr_start_mode_cmd);
4223 install_element(BTS_NODE, &cfg_bts_amr_hr_modes1_cmd);
4224 install_element(BTS_NODE, &cfg_bts_amr_hr_modes2_cmd);
4225 install_element(BTS_NODE, &cfg_bts_amr_hr_modes3_cmd);
4226 install_element(BTS_NODE, &cfg_bts_amr_hr_modes4_cmd);
4227 install_element(BTS_NODE, &cfg_bts_amr_hr_thres1_cmd);
4228 install_element(BTS_NODE, &cfg_bts_amr_hr_thres2_cmd);
4229 install_element(BTS_NODE, &cfg_bts_amr_hr_thres3_cmd);
4230 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst1_cmd);
4231 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst2_cmd);
4232 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst3_cmd);
4233 install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004234
Harald Welte5258fc42009-03-28 19:07:53 +00004235 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004236 install_node(&trx_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004237 vty_install_default(TRX_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004238 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004239 install_element(TRX_NODE, &cfg_description_cmd);
4240 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)7b37d972009-12-27 20:56:38 +01004241 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02004242 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004243 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
4244 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01004245 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004246
Harald Welte5258fc42009-03-28 19:07:53 +00004247 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004248 install_node(&ts_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004249 vty_install_default(TS_NODE);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004250 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004251 install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);
Harald Welte135a6482011-05-30 12:09:13 +02004252 install_element(TS_NODE, &cfg_ts_tsc_cmd);
Harald Weltea39b0f22010-06-14 22:26:10 +02004253 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte6e0cd042009-09-12 13:05:33 +02004254 install_element(TS_NODE, &cfg_ts_hsn_cmd);
4255 install_element(TS_NODE, &cfg_ts_maio_cmd);
4256 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
4257 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004258 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004259
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004260 install_element(ENABLE_NODE, &drop_bts_cmd);
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01004261 install_element(ENABLE_NODE, &restart_bts_cmd);
Harald Welted0d2b0b2010-12-23 13:18:07 +01004262 install_element(ENABLE_NODE, &pdch_act_cmd);
Harald Welte2abd5e12017-05-27 14:10:40 +02004263 install_element(ENABLE_NODE, &lchan_act_cmd);
Harald Welte3f86c522017-05-27 15:53:28 +02004264 install_element(ENABLE_NODE, &lchan_mdcx_cmd);
Harald Welte30f1f372014-12-28 15:00:45 +01004265 install_element(ENABLE_NODE, &smscb_cmd_cmd);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004266
Harald Welte81c9b9c2010-05-31 16:40:40 +02004267 abis_nm_vty_init();
Harald Weltee1d5eca2011-02-12 14:42:59 +01004268 abis_om2k_vty_init();
Harald Welte3016d9f2011-02-05 13:54:41 +01004269 e1inp_vty_init();
Harald Welte42def722017-01-13 00:10:32 +01004270 osmo_fsm_vty_add_cmds();
Harald Welte81c9b9c2010-05-31 16:40:40 +02004271
Harald Weltedcccb182010-05-16 20:52:23 +02004272 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00004273
Harald Welte68628e82009-03-10 12:17:57 +00004274 return 0;
4275}