blob: b9519b4d07d0a58fe58ed462e77048d88319b308 [file] [log] [blame]
Harald Welte68628e82009-03-10 12:17:57 +00001/* OpenBSC interface to quagga VTY */
Harald Welteaf387632010-03-14 23:30:30 +08002/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
Harald Welte68628e82009-03-10 12:17:57 +00003 * All Rights Reserved
4 *
5 * This program is free software; you can redistribute it and/or modify
Harald Welte9af6ddf2011-01-01 15:25:50 +01006 * it under the terms of the GNU Affero General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
Harald Welte68628e82009-03-10 12:17:57 +00008 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Harald Welte9af6ddf2011-01-01 15:25:50 +010013 * GNU Affero General Public License for more details.
Harald Welte68628e82009-03-10 12:17:57 +000014 *
Harald Welte9af6ddf2011-01-01 15:25:50 +010015 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Harald Welte68628e82009-03-10 12:17:57 +000017 *
18 */
19
20#include <stdlib.h>
Maxc08ee712016-05-11 12:45:13 +020021#include <stdbool.h>
Harald Welte68628e82009-03-10 12:17:57 +000022#include <unistd.h>
Harald Welte68628e82009-03-10 12:17:57 +000023
Harald Welte4b037e42010-05-19 19:45:32 +020024#include <osmocom/vty/command.h>
25#include <osmocom/vty/buffer.h>
26#include <osmocom/vty/vty.h>
27#include <osmocom/vty/logging.h>
Jacob Erlbeck64630cc2015-10-26 16:25:37 +010028#include <osmocom/vty/stats.h>
Harald Welte4b037e42010-05-19 19:45:32 +020029#include <osmocom/vty/telnet_interface.h>
Harald Welte4ab9d7c2012-08-17 12:42:06 +020030#include <osmocom/vty/misc.h>
Maxc08ee712016-05-11 12:45:13 +020031#include <osmocom/gsm/protocol/gsm_04_08.h>
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +010032#include <osmocom/gsm/gsm0502.h>
33
Harald Welte68628e82009-03-10 12:17:57 +000034#include <arpa/inet.h>
35
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010036#include <osmocom/core/linuxlist.h>
Harald Welte68628e82009-03-10 12:17:57 +000037#include <openbsc/gsm_data.h>
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +020038#include <osmocom/abis/e1_input.h>
Harald Welte1bc77352009-03-10 19:47:51 +000039#include <openbsc/abis_nm.h>
Harald Welte4d54d0b2011-02-19 16:48:17 +010040#include <openbsc/abis_om2000.h>
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010041#include <osmocom/core/utils.h>
42#include <osmocom/gsm/gsm_utils.h>
Harald Weltecdc59ff2011-05-23 20:42:26 +020043#include <osmocom/gsm/abis_nm.h>
Harald Welteb908cb72009-12-22 13:09:29 +010044#include <openbsc/chan_alloc.h>
Harald Welte8387a492009-12-22 21:43:14 +010045#include <openbsc/meas_rep.h>
Harald Welte40f82892009-05-23 17:31:39 +000046#include <openbsc/db.h>
Holger Hans Peter Freyther3c712322010-04-06 11:55:37 +020047#include <openbsc/vty.h>
Harald Welteea34a4e2012-06-16 14:59:56 +080048#include <osmocom/gprs/gprs_ns.h>
Harald Welte9fbff4a2010-07-30 11:50:09 +020049#include <openbsc/system_information.h>
Harald Welte5bc61dc2010-05-16 22:02:16 +020050#include <openbsc/debug.h>
Holger Hans Peter Freyther85334f12010-11-09 17:00:42 +010051#include <openbsc/paging.h>
Harald Weltef7a2b192011-08-20 18:25:02 +020052#include <openbsc/ipaccess.h>
Harald Welted0d2b0b2010-12-23 13:18:07 +010053#include <openbsc/abis_rsl.h>
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +010054#include <openbsc/osmo_msc_data.h>
55#include <openbsc/osmo_bsc_rf.h>
Harald Welte68628e82009-03-10 12:17:57 +000056
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);
Harald Welte1d8dbc42009-12-12 15:38:16 +0100248 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100249 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte1d8dbc42009-12-12 15:38:16 +0100250 rxlev2dbm(bts->si_common.cell_sel_par.rxlev_acc_min),
251 VTY_NEWLINE);
252 vty_out(vty, "Cell Reselection Hysteresis: %u dBm%s",
Harald Welte73225282009-12-12 18:17:25 +0100253 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100254 vty_out(vty, "RACH TX-Integer: %u%s", bts->si_common.rach_control.tx_integer,
255 VTY_NEWLINE);
256 vty_out(vty, "RACH Max transmissions: %u%s",
257 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
258 VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100259 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200260 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +0200261 if (bts->dtxu != GSM48_DTX_SHALL_NOT_BE_USED)
262 vty_out(vty, "Uplink DTX: %s%s",
263 (bts->dtxu != GSM48_DTX_SHALL_BE_USED) ?
264 "enabled" : "forced", VTY_NEWLINE);
265 else
266 vty_out(vty, "Uplink DTX: not enabled%s", VTY_NEWLINE);
267 vty_out(vty, "Downlink DTX: %senabled%s", bts->dtxd ? "" : "not ",
268 VTY_NEWLINE);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +0200269 vty_out(vty, "Channel Description Attachment: %s%s",
270 (bts->si_common.chan_desc.att) ? "yes" : "no", VTY_NEWLINE);
271 vty_out(vty, "Channel Description BS-PA-MFRMS: %u%s",
272 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
273 vty_out(vty, "Channel Description BS-AG_BLKS-RES: %u%s",
274 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
Harald Welte9fbff4a2010-07-30 11:50:09 +0200275 vty_out(vty, "System Information present: 0x%08x, static: 0x%08x%s",
276 bts->si_valid, bts->si_mode_static, VTY_NEWLINE);
Harald Welte4cc34222009-05-01 15:12:31 +0000277 if (is_ipaccess_bts(bts))
Harald Welte8175e952009-10-20 00:22:00 +0200278 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte4cc34222009-05-01 15:12:31 +0000279 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte8175e952009-10-20 00:22:00 +0200280 bts->oml_tei, VTY_NEWLINE);
Sylvain Munautc9519462011-10-17 14:04:55 +0200281 else if (bts->type == GSM_BTS_TYPE_NOKIA_SITE)
282 vty_out(vty, " Skip Reset: %d%s",
283 bts->nokia.skip_reset, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000284 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200285 net_dump_nmstate(vty, &bts->mo.nm_state);
Harald Welte68628e82009-03-10 12:17:57 +0000286 vty_out(vty, " Site Mgr NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200287 net_dump_nmstate(vty, &bts->site_mgr.mo.nm_state);
Holger Hans Peter Freyther846d8dc2013-05-29 16:22:09 +0200288 vty_out(vty, " GPRS NSE: ");
289 net_dump_nmstate(vty, &bts->gprs.nse.mo.nm_state);
290 vty_out(vty, " GPRS CELL: ");
291 net_dump_nmstate(vty, &bts->gprs.cell.mo.nm_state);
292 vty_out(vty, " GPRS NSVC0: ");
293 net_dump_nmstate(vty, &bts->gprs.nsvc[0].mo.nm_state);
294 vty_out(vty, " GPRS NSVC1: ");
295 net_dump_nmstate(vty, &bts->gprs.nsvc[1].mo.nm_state);
Holger Hans Peter Freyther66e14cd2011-04-26 15:52:34 +0200296 vty_out(vty, " Paging: %u pending requests, %u free slots%s",
297 paging_pending_requests_nr(bts),
Harald Welte68628e82009-03-10 12:17:57 +0000298 bts->paging.available_slots, VTY_NEWLINE);
Holger Hans Peter Freytherd283db42010-11-25 16:28:45 +0100299 if (is_ipaccess_bts(bts)) {
300 vty_out(vty, " OML Link state: %s.%s",
301 bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);
302 } else {
Harald Welte8175e952009-10-20 00:22:00 +0200303 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
304 e1isl_dump_vty(vty, bts->oml_link);
305 }
Holger Hans Peter Freytherd283db42010-11-25 16:28:45 +0100306
307 /* FIXME: chan_desc */
Harald Welteb908cb72009-12-22 13:09:29 +0100308 memset(&pl, 0, sizeof(pl));
Neels Hofmeyr2afffd52016-09-25 17:01:20 +0200309 bts_chan_load(&pl, bts);
Harald Welteb908cb72009-12-22 13:09:29 +0100310 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
311 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte68628e82009-03-10 12:17:57 +0000312}
313
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100314DEFUN(show_bts, show_bts_cmd, "show bts [<0-255>]",
Harald Welte68628e82009-03-10 12:17:57 +0000315 SHOW_STR "Display information about a BTS\n"
316 "BTS number")
317{
Harald Weltedcccb182010-05-16 20:52:23 +0200318 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000319 int bts_nr;
320
321 if (argc != 0) {
322 /* use the BTS number that the user has specified */
323 bts_nr = atoi(argv[0]);
Harald Welte712ddbc2010-12-24 12:24:03 +0100324 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000325 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000326 VTY_NEWLINE);
327 return CMD_WARNING;
328 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200329 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000330 return CMD_SUCCESS;
331 }
332 /* print all BTS's */
333 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee441d9c2009-06-21 16:17:15 +0200334 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000335
336 return CMD_SUCCESS;
337}
338
Harald Welte42581822009-08-08 16:12:58 +0200339/* utility functions */
340static void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,
341 const char *ts, const char *ss)
342{
343 e1_link->e1_nr = atoi(line);
344 e1_link->e1_ts = atoi(ts);
345 if (!strcmp(ss, "full"))
346 e1_link->e1_ts_ss = 255;
347 else
348 e1_link->e1_ts_ss = atoi(ss);
349}
350
351static void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,
352 const char *prefix)
353{
354 if (!e1_link->e1_ts)
355 return;
356
357 if (e1_link->e1_ts_ss == 255)
358 vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",
359 prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);
360 else
361 vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",
362 prefix, e1_link->e1_nr, e1_link->e1_ts,
363 e1_link->e1_ts_ss, VTY_NEWLINE);
364}
365
366
Harald Welte67ce0732009-08-06 19:06:46 +0200367static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
368{
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100369 vty_out(vty, " timeslot %u%s", ts->nr, VTY_NEWLINE);
Harald Weltea2bbc5e2015-11-20 10:43:31 +0100370 if (ts->tsc != -1)
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100371 vty_out(vty, " training_sequence_code %u%s", ts->tsc, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200372 if (ts->pchan != GSM_PCHAN_NONE)
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100373 vty_out(vty, " phys_chan_config %s%s",
Harald Welte42581822009-08-08 16:12:58 +0200374 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100375 vty_out(vty, " hopping enabled %u%s",
Harald Weltea39b0f22010-06-14 22:26:10 +0200376 ts->hopping.enabled, VTY_NEWLINE);
377 if (ts->hopping.enabled) {
378 unsigned int i;
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100379 vty_out(vty, " hopping sequence-number %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200380 ts->hopping.hsn, VTY_NEWLINE);
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100381 vty_out(vty, " hopping maio %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200382 ts->hopping.maio, VTY_NEWLINE);
Harald Weltea39b0f22010-06-14 22:26:10 +0200383 for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {
384 if (!bitvec_get_bit_pos(&ts->hopping.arfcns, i))
385 continue;
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100386 vty_out(vty, " hopping arfcn add %u%s",
Harald Weltea39b0f22010-06-14 22:26:10 +0200387 i, VTY_NEWLINE);
388 }
Harald Welte127af342010-12-24 12:07:07 +0100389 }
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100390 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Welteface7ed2011-02-14 16:15:21 +0100391
392 if (ts->trx->bts->model->config_write_ts)
393 ts->trx->bts->model->config_write_ts(vty, ts);
Harald Welte67ce0732009-08-06 19:06:46 +0200394}
395
396static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
397{
398 int i;
399
Harald Welte5013b2a2009-08-07 13:29:14 +0200400 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200401 if (trx->description)
402 vty_out(vty, " description %s%s", trx->description,
403 VTY_NEWLINE);
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200404 vty_out(vty, " rf_locked %u%s",
Harald Welted64c0bc2011-05-30 12:07:53 +0200405 trx->mo.nm_state.administrative == NM_STATE_LOCKED ? 1 : 0,
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200406 VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200407 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)7b37d972009-12-27 20:56:38 +0100408 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200409 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200410 config_write_e1_link(vty, &trx->rsl_e1_link, " rsl ");
411 vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei, VTY_NEWLINE);
Harald Welte67ce0732009-08-06 19:06:46 +0200412
Harald Welteface7ed2011-02-14 16:15:21 +0100413 if (trx->bts->model->config_write_trx)
414 trx->bts->model->config_write_trx(vty, trx);
415
Harald Welte67ce0732009-08-06 19:06:46 +0200416 for (i = 0; i < TRX_NR_TS; i++)
417 config_write_ts_single(vty, &trx->ts[i]);
418}
419
Harald Welte615e9562010-05-11 23:50:21 +0200420static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
421{
422 unsigned int i;
423 vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
424 VTY_NEWLINE);
425 if (bts->gprs.mode == BTS_GPRS_NONE)
426 return;
427
bhargava350533c2016-07-21 11:14:34 +0530428 vty_out(vty, " gprs 11bit_rach_support_for_egprs %u%s",
429 bts->gprs.supports_egprs_11bit_rach, VTY_NEWLINE);
430
Harald Welte615e9562010-05-11 23:50:21 +0200431 vty_out(vty, " gprs routing area %u%s", bts->gprs.rac,
432 VTY_NEWLINE);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +0100433 vty_out(vty, " gprs network-control-order nc%u%s",
434 bts->gprs.net_ctrl_ord, VTY_NEWLINE);
Max292ec582016-07-28 11:55:37 +0200435 if (!bts->gprs.ctrl_ack_type_use_block)
436 vty_out(vty, " gprs control-ack-type-rach%s", VTY_NEWLINE);
Harald Welte615e9562010-05-11 23:50:21 +0200437 vty_out(vty, " gprs cell bvci %u%s", bts->gprs.cell.bvci,
438 VTY_NEWLINE);
439 for (i = 0; i < ARRAY_SIZE(bts->gprs.cell.timer); i++)
440 vty_out(vty, " gprs cell timer %s %u%s",
441 get_value_string(gprs_bssgp_cfg_strs, i),
442 bts->gprs.cell.timer[i], VTY_NEWLINE);
443 vty_out(vty, " gprs nsei %u%s", bts->gprs.nse.nsei,
444 VTY_NEWLINE);
445 for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)
446 vty_out(vty, " gprs ns timer %s %u%s",
447 get_value_string(gprs_ns_timer_strs, i),
448 bts->gprs.nse.timer[i], VTY_NEWLINE);
449 for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
450 struct gsm_bts_gprs_nsvc *nsvc =
451 &bts->gprs.nsvc[i];
452 struct in_addr ia;
453
454 ia.s_addr = htonl(nsvc->remote_ip);
455 vty_out(vty, " gprs nsvc %u nsvci %u%s", i,
456 nsvc->nsvci, VTY_NEWLINE);
457 vty_out(vty, " gprs nsvc %u local udp port %u%s", i,
458 nsvc->local_port, VTY_NEWLINE);
459 vty_out(vty, " gprs nsvc %u remote udp port %u%s", i,
460 nsvc->remote_port, VTY_NEWLINE);
461 vty_out(vty, " gprs nsvc %u remote ip %s%s", i,
462 inet_ntoa(ia), VTY_NEWLINE);
463 }
464}
465
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200466/* Write the model data if there is one */
467static void config_write_bts_model(struct vty *vty, struct gsm_bts *bts)
Harald Welte67ce0732009-08-06 19:06:46 +0200468{
469 struct gsm_bts_trx *trx;
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200470
471 if (!bts->model)
472 return;
473
474 if (bts->model->config_write_bts)
475 bts->model->config_write_bts(vty, bts);
476
477 llist_for_each_entry(trx, &bts->trx_list, list)
478 config_write_trx_single(vty, trx);
479}
480
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +0200481static void write_amr_modes(struct vty *vty, const char *prefix,
482 const char *name, struct amr_mode *modes, int num)
483{
484 int i;
485
486 vty_out(vty, " %s threshold %s", prefix, name);
487 for (i = 0; i < num - 1; i++)
488 vty_out(vty, " %d", modes[i].threshold);
489 vty_out(vty, "%s", VTY_NEWLINE);
490 vty_out(vty, " %s hysteresis %s", prefix, name);
491 for (i = 0; i < num - 1; i++)
492 vty_out(vty, " %d", modes[i].hysteresis);
493 vty_out(vty, "%s", VTY_NEWLINE);
494}
495
Andreas Eversberg73266522014-01-19 11:47:44 +0100496static void config_write_bts_amr(struct vty *vty, struct gsm_bts *bts,
497 struct amr_multirate_conf *mr, int full)
498{
499 struct gsm48_multi_rate_conf *mr_conf;
500 const char *prefix = (full) ? "amr tch-f" : "amr tch-h";
501 int i, num;
502
503 if (!(mr->gsm48_ie[1]))
504 return;
505
506 mr_conf = (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
507
508 num = 0;
509 vty_out(vty, " %s modes", prefix);
510 for (i = 0; i < ((full) ? 8 : 6); i++) {
511 if ((mr->gsm48_ie[1] & (1 << i))) {
512 vty_out(vty, " %d", i);
513 num++;
514 }
515 }
516 vty_out(vty, "%s", VTY_NEWLINE);
517 if (num > 4)
518 num = 4;
519 if (num > 1) {
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +0200520 write_amr_modes(vty, prefix, "ms", mr->ms_mode, num);
521 write_amr_modes(vty, prefix, "bts", mr->bts_mode, num);
Andreas Eversberg73266522014-01-19 11:47:44 +0100522 }
523 vty_out(vty, " %s start-mode ", prefix);
524 if (mr_conf->icmi) {
525 num = 0;
526 for (i = 0; i < ((full) ? 8 : 6) && num < 4; i++) {
527 if ((mr->gsm48_ie[1] & (1 << i)))
528 num++;
529 if (mr_conf->smod == num - 1) {
530 vty_out(vty, "%d%s", num, VTY_NEWLINE);
531 break;
532 }
533 }
534 } else
535 vty_out(vty, "auto%s", VTY_NEWLINE);
536}
537
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200538static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
539{
Harald Welte9fbff4a2010-07-30 11:50:09 +0200540 int i;
Harald Welte67ce0732009-08-06 19:06:46 +0200541
Harald Welte5013b2a2009-08-07 13:29:14 +0200542 vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE);
543 vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200544 if (bts->description)
545 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200546 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freytherf926ed62009-11-19 16:38:49 +0100547 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200548 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte67ce0732009-08-06 19:06:46 +0200549 VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +0200550 if (bts->dtxu != GSM48_DTX_SHALL_NOT_BE_USED)
551 vty_out(vty, " dtx uplink%s%s",
552 (bts->dtxu != GSM48_DTX_SHALL_BE_USED) ? "" : " force",
553 VTY_NEWLINE);
554 if (bts->dtxd)
555 vty_out(vty, " dtx downlink%s", VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200556 vty_out(vty, " base_station_id_code %u%s", bts->bsic, VTY_NEWLINE);
Harald Welte (local)0e451d02009-08-13 10:14:26 +0200557 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100558 vty_out(vty, " cell reselection hysteresis %u%s",
559 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
560 vty_out(vty, " rxlev access min %u%s",
561 bts->si_common.cell_sel_par.rxlev_acc_min, VTY_NEWLINE);
Sylvain Munaute0b06b02010-11-28 18:17:28 +0100562
563 if (bts->si_common.cell_ro_sel_par.present) {
564 struct gsm48_si_selection_params *sp;
565 sp = &bts->si_common.cell_ro_sel_par;
566
567 if (sp->cbq)
568 vty_out(vty, " cell bar qualify %u%s",
569 sp->cbq, VTY_NEWLINE);
570
571 if (sp->cell_resel_off)
572 vty_out(vty, " cell reselection offset %u%s",
573 sp->cell_resel_off*2, VTY_NEWLINE);
574
575 if (sp->temp_offs == 7)
576 vty_out(vty, " temporary offset infinite%s",
577 VTY_NEWLINE);
578 else if (sp->temp_offs)
579 vty_out(vty, " temporary offset %u%s",
580 sp->temp_offs*10, VTY_NEWLINE);
581
582 if (sp->penalty_time == 31)
583 vty_out(vty, " penalty time reserved%s",
584 VTY_NEWLINE);
585 else if (sp->penalty_time)
586 vty_out(vty, " penalty time %u%s",
587 (sp->penalty_time*20)+20, VTY_NEWLINE);
588 }
589
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +0200590 /* Is periodic LU enabled or disabled? */
591 if (bts->si_common.chan_desc.t3212 == 0)
592 vty_out(vty, " no periodic location update%s", VTY_NEWLINE);
593 else
594 vty_out(vty, " periodic location update %u%s",
595 bts->si_common.chan_desc.t3212 * 6, VTY_NEWLINE);
596
Andreas Eversberg4d4944a2013-03-10 11:49:35 +0100597 vty_out(vty, " radio-link-timeout %d%s",
598 get_radio_link_timeout(&bts->si_common.cell_options),
599 VTY_NEWLINE);
Harald Welte7a8fa412009-08-10 13:48:16 +0200600 vty_out(vty, " channel allocator %s%s",
601 bts->chan_alloc_reverse ? "descending" : "ascending",
602 VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100603 vty_out(vty, " rach tx integer %u%s",
604 bts->si_common.rach_control.tx_integer, VTY_NEWLINE);
605 vty_out(vty, " rach max transmission %u%s",
606 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
607 VTY_NEWLINE);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800608
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +0200609 vty_out(vty, " channel-descrption attach %u%s",
610 bts->si_common.chan_desc.att, VTY_NEWLINE);
611 vty_out(vty, " channel-descrption bs-pa-mfrms %u%s",
612 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
613 vty_out(vty, " channel-descrption bs-ag-blks-res %u%s",
614 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
615
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800616 if (bts->rach_b_thresh != -1)
617 vty_out(vty, " rach nm busy threshold %u%s",
618 bts->rach_b_thresh, VTY_NEWLINE);
619 if (bts->rach_ldavg_slots != -1)
620 vty_out(vty, " rach nm load average %u%s",
621 bts->rach_ldavg_slots, VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100622 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200623 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +0800624 if ((bts->si_common.rach_control.t2 & 0x4) == 0)
625 vty_out(vty, " rach emergency call allowed 1%s", VTY_NEWLINE);
Ivan Kluchnikov67920592013-09-16 13:13:04 +0400626 if ((bts->si_common.rach_control.t3) != 0)
627 for (i = 0; i < 8; i++)
628 if (bts->si_common.rach_control.t3 & (0x1 << i))
629 vty_out(vty, " rach access-control-class %d barred%s", i, VTY_NEWLINE);
630 if ((bts->si_common.rach_control.t2 & 0xfb) != 0)
631 for (i = 0; i < 8; i++)
632 if ((i != 2) && (bts->si_common.rach_control.t2 & (0x1 << i)))
633 vty_out(vty, " rach access-control-class %d barred%s", i+8, VTY_NEWLINE);
Harald Welte9fbff4a2010-07-30 11:50:09 +0200634 for (i = SYSINFO_TYPE_1; i < _MAX_SYSINFO_TYPE; i++) {
635 if (bts->si_mode_static & (1 << i)) {
636 vty_out(vty, " system-information %s mode static%s",
637 get_value_string(osmo_sitype_strs, i), VTY_NEWLINE);
638 vty_out(vty, " system-information %s static %s%s",
639 get_value_string(osmo_sitype_strs, i),
Sylvain Munaut63ef2152011-11-13 23:05:23 +0100640 osmo_hexdump_nospc(bts->si_buf[i], sizeof(bts->si_buf[i])),
Harald Welte9fbff4a2010-07-30 11:50:09 +0200641 VTY_NEWLINE);
642 }
643 }
Harald Weltefd355a32011-03-04 13:41:31 +0100644 switch (bts->type) {
645 case GSM_BTS_TYPE_NANOBTS:
Harald Weltef383aa12012-07-02 19:51:55 +0200646 case GSM_BTS_TYPE_OSMO_SYSMO:
Harald Welte5013b2a2009-08-07 13:29:14 +0200647 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Weltea6fd58e2009-08-07 00:25:23 +0200648 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte8b291802013-03-12 13:57:05 +0100649 if (bts->ip_access.rsl_ip) {
650 struct in_addr ia;
651 ia.s_addr = htonl(bts->ip_access.rsl_ip);
652 vty_out(vty, " ip.access rsl-ip %s%s", inet_ntoa(ia),
653 VTY_NEWLINE);
654 }
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +0200655 vty_out(vty, " oml ip.access stream_id %u line %u%s",
656 bts->oml_tei, bts->oml_e1_link.e1_nr, VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100657 break;
Sylvain Munautc9519462011-10-17 14:04:55 +0200658 case GSM_BTS_TYPE_NOKIA_SITE:
659 vty_out(vty, " nokia_site skip-reset %d%s", bts->nokia.skip_reset, VTY_NEWLINE);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +0100660 vty_out(vty, " nokia_site no-local-rel-conf %d%s",
661 bts->nokia.no_loc_rel_cnf, VTY_NEWLINE);
Sipos Csaba56e17662015-02-07 13:27:36 +0100662 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 +0100663 /* fall through: Nokia requires "oml e1" parameters also */
Harald Weltefd355a32011-03-04 13:41:31 +0100664 default:
Harald Welte42581822009-08-08 16:12:58 +0200665 config_write_e1_link(vty, &bts->oml_e1_link, " oml ");
666 vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100667 break;
Harald Welte42581822009-08-08 16:12:58 +0200668 }
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +0800669
670 /* if we have a limit, write it */
671 if (bts->paging.free_chans_need >= 0)
672 vty_out(vty, " paging free %d%s", bts->paging.free_chans_need, VTY_NEWLINE);
673
Harald Welte32c09622011-01-11 23:44:56 +0100674 vty_out(vty, " neighbor-list mode %s%s",
Harald Welte64c07d22011-02-15 11:43:27 +0100675 get_value_string(bts_neigh_mode_strs, bts->neigh_list_manual_mode), VTY_NEWLINE);
676 if (bts->neigh_list_manual_mode != NL_MODE_AUTOMATIC) {
Harald Welte32c09622011-01-11 23:44:56 +0100677 for (i = 0; i < 1024; i++) {
678 if (bitvec_get_bit_pos(&bts->si_common.neigh_list, i))
679 vty_out(vty, " neighbor-list add arfcn %u%s",
680 i, VTY_NEWLINE);
681 }
682 }
Harald Welte64c07d22011-02-15 11:43:27 +0100683 if (bts->neigh_list_manual_mode == NL_MODE_MANUAL_SI5SEP) {
684 for (i = 0; i < 1024; i++) {
685 if (bitvec_get_bit_pos(&bts->si_common.si5_neigh_list, i))
686 vty_out(vty, " si5 neighbor-list add arfcn %u%s",
687 i, VTY_NEWLINE);
688 }
689 }
Harald Welte32c09622011-01-11 23:44:56 +0100690
Max59a1bf32016-04-15 16:04:46 +0200691 for (i = 0; i < MAX_EARFCN_LIST; i++) {
692 if (bts->si_common.si2quater_neigh_list.arfcn[i] !=
693 OSMO_EARFCN_INVALID) {
694 vty_out(vty, " si2quater neighbor-list add earfcn %u threshold %u",
695 bts->si_common.si2quater_neigh_list.arfcn[i],
696 bts->si_common.si2quater_neigh_list.thresh_hi);
697 if (bts->si_common.si2quater_neigh_list.meas_bw[i] !=
698 OSMO_EARFCN_MEAS_INVALID)
699 vty_out(vty, " %u",
700 bts->si_common.si2quater_neigh_list.meas_bw[i]);
701
702 vty_out(vty, "%s", VTY_NEWLINE);
703 }
704 }
705
Max26679e02016-04-20 15:57:13 +0200706 for (i = 0; i < bts->si_common.uarfcn_length; i++) {
707 vty_out(vty, " si2quater neighbor-list add uarfcn %u %u %u%s",
708 bts->si_common.data.uarfcn_list[i],
709 bts->si_common.data.scramble_list[i] & ~(1 << 9),
710 (bts->si_common.data.scramble_list[i] >> 9) & 1,
711 VTY_NEWLINE);
712 }
713
Andreas Eversberga83d5112013-12-07 18:32:28 +0100714 vty_out(vty, " codec-support fr");
715 if (bts->codec.hr)
716 vty_out(vty, " hr");
717 if (bts->codec.efr)
718 vty_out(vty, " efr");
719 if (bts->codec.amr)
720 vty_out(vty, " amr");
721 vty_out(vty, "%s", VTY_NEWLINE);
722
Andreas Eversberg73266522014-01-19 11:47:44 +0100723 config_write_bts_amr(vty, bts, &bts->mr_full, 1);
724 config_write_bts_amr(vty, bts, &bts->mr_half, 0);
725
Harald Welte615e9562010-05-11 23:50:21 +0200726 config_write_bts_gprs(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200727
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +0200728 if (bts->excl_from_rf_lock)
729 vty_out(vty, " rf-lock-exclude%s", VTY_NEWLINE);
730
Jacob Erlbeck65d114f2014-01-16 11:02:14 +0100731 vty_out(vty, " %sforce-combined-si%s",
732 bts->force_combined_si ? "" : "no ", VTY_NEWLINE);
733
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +0100734 for (i = 0; i < ARRAY_SIZE(bts->depends_on); ++i) {
735 int j;
736
737 if (bts->depends_on[i] == 0)
738 continue;
739
740 for (j = 0; j < sizeof(bts->depends_on[i]) * 8; ++j) {
741 int bts_nr;
742
743 if ((bts->depends_on[i] & (1<<j)) == 0)
744 continue;
745
746 bts_nr = (i * sizeof(bts->depends_on[i]) * 8) + j;
747 vty_out(vty, " depends-on-bts %d%s", bts_nr, VTY_NEWLINE);
748 }
749 }
750
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200751 config_write_bts_model(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200752}
753
754static int config_write_bts(struct vty *v)
755{
Harald Weltedcccb182010-05-16 20:52:23 +0200756 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte67ce0732009-08-06 19:06:46 +0200757 struct gsm_bts *bts;
758
759 llist_for_each_entry(bts, &gsmnet->bts_list, list)
760 config_write_bts_single(v, bts);
761
762 return CMD_SUCCESS;
763}
764
Harald Welte5013b2a2009-08-07 13:29:14 +0200765static int config_write_net(struct vty *vty)
766{
Harald Weltedcccb182010-05-16 20:52:23 +0200767 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
768
Harald Welte5013b2a2009-08-07 13:29:14 +0200769 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200770 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200771 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200772 vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE);
773 vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE);
Harald Welte (local)69de3972009-08-12 14:42:23 +0200774 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Maxddee01f2016-05-24 14:23:27 +0200775 if (gsmnet->authorized_reg_str)
776 vty_out(vty, " authorized-regexp %s%s", gsmnet->authorized_reg_str, VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100777 vty_out(vty, " location updating reject cause %u%s",
778 gsmnet->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900779 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freytherd54c3372009-11-19 16:37:48 +0100780 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800781 vty_out(vty, " paging any use tch %d%s", gsmnet->pag_any_tch, VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100782 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
783 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100784 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100785 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Welteb720bd32009-12-21 16:51:50 +0100786 vty_out(vty, " handover window rxlev averaging %u%s",
787 gsmnet->handover.win_rxlev_avg, VTY_NEWLINE);
788 vty_out(vty, " handover window rxqual averaging %u%s",
789 gsmnet->handover.win_rxqual_avg, VTY_NEWLINE);
790 vty_out(vty, " handover window rxlev neighbor averaging %u%s",
791 gsmnet->handover.win_rxlev_avg_neigh, VTY_NEWLINE);
792 vty_out(vty, " handover power budget interval %u%s",
793 gsmnet->handover.pwr_interval, VTY_NEWLINE);
794 vty_out(vty, " handover power budget hysteresis %u%s",
795 gsmnet->handover.pwr_hysteresis, VTY_NEWLINE);
796 vty_out(vty, " handover maximum distance %u%s",
797 gsmnet->handover.max_distance, VTY_NEWLINE);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +0100798 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100799 vty_out(vty, " timer t3103 %u%s", gsmnet->T3103, VTY_NEWLINE);
800 vty_out(vty, " timer t3105 %u%s", gsmnet->T3105, VTY_NEWLINE);
801 vty_out(vty, " timer t3107 %u%s", gsmnet->T3107, VTY_NEWLINE);
802 vty_out(vty, " timer t3109 %u%s", gsmnet->T3109, VTY_NEWLINE);
803 vty_out(vty, " timer t3111 %u%s", gsmnet->T3111, VTY_NEWLINE);
804 vty_out(vty, " timer t3113 %u%s", gsmnet->T3113, VTY_NEWLINE);
805 vty_out(vty, " timer t3115 %u%s", gsmnet->T3115, VTY_NEWLINE);
806 vty_out(vty, " timer t3117 %u%s", gsmnet->T3117, VTY_NEWLINE);
807 vty_out(vty, " timer t3119 %u%s", gsmnet->T3119, VTY_NEWLINE);
Harald Welte2862dca2010-12-23 14:39:29 +0100808 vty_out(vty, " timer t3122 %u%s", gsmnet->T3122, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100809 vty_out(vty, " timer t3141 %u%s", gsmnet->T3141, VTY_NEWLINE);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +0100810 vty_out(vty, " subscriber-keep-in-ram %d%s",
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100811 gsmnet->subscr_group->keep_subscr, VTY_NEWLINE);
Neels Hofmeyr73983952016-05-10 13:29:33 +0200812 if (gsmnet->tz.override != 0) {
813 if (gsmnet->tz.dst)
814 vty_out(vty, " timezone %d %d %d%s",
815 gsmnet->tz.hr, gsmnet->tz.mn, gsmnet->tz.dst,
816 VTY_NEWLINE);
817 else
818 vty_out(vty, " timezone %d %d%s",
819 gsmnet->tz.hr, gsmnet->tz.mn, VTY_NEWLINE);
820 }
Harald Welte5013b2a2009-08-07 13:29:14 +0200821
822 return CMD_SUCCESS;
823}
Harald Welte67ce0732009-08-06 19:06:46 +0200824
Harald Welte68628e82009-03-10 12:17:57 +0000825static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx)
826{
827 vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
828 trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200829 vty_out(vty, "Description: %s%s",
830 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Weltefcd24452009-06-20 18:15:19 +0200831 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte42581822009-08-08 16:12:58 +0200832 "resulting BS power: %d dBm%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200833 trx->nominal_power, trx->max_power_red,
Harald Welte42581822009-08-08 16:12:58 +0200834 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000835 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200836 net_dump_nmstate(vty, &trx->mo.nm_state);
Harald Welte68628e82009-03-10 12:17:57 +0000837 vty_out(vty, " Baseband Transceiver NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200838 net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);
Harald Welte8175e952009-10-20 00:22:00 +0200839 if (is_ipaccess_bts(trx->bts)) {
840 vty_out(vty, " ip.access stream ID: 0x%02x%s",
841 trx->rsl_tei, VTY_NEWLINE);
842 } else {
843 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
844 e1isl_dump_vty(vty, trx->rsl_link);
845 }
Harald Welte68628e82009-03-10 12:17:57 +0000846}
847
848DEFUN(show_trx,
849 show_trx_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100850 "show trx [<0-255>] [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200851 SHOW_STR "Display information about a TRX\n"
852 "BTS Number\n"
853 "TRX Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000854{
Harald Weltedcccb182010-05-16 20:52:23 +0200855 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000856 struct gsm_bts *bts = NULL;
857 struct gsm_bts_trx *trx;
858 int bts_nr, trx_nr;
859
860 if (argc >= 1) {
861 /* use the BTS number that the user has specified */
862 bts_nr = atoi(argv[0]);
863 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000864 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000865 VTY_NEWLINE);
866 return CMD_WARNING;
867 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200868 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000869 }
870 if (argc >= 2) {
871 trx_nr = atoi(argv[1]);
872 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000873 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000874 VTY_NEWLINE);
875 return CMD_WARNING;
876 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200877 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000878 trx_dump_vty(vty, trx);
879 return CMD_SUCCESS;
880 }
881 if (bts) {
882 /* print all TRX in this BTS */
883 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200884 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000885 trx_dump_vty(vty, trx);
886 }
887 return CMD_SUCCESS;
888 }
889
890 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200891 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000892 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200893 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000894 trx_dump_vty(vty, trx);
895 }
896 }
897
898 return CMD_SUCCESS;
899}
900
Harald Welte67ce0732009-08-06 19:06:46 +0200901
Harald Welte68628e82009-03-10 12:17:57 +0000902static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
903{
Harald Welte135a6482011-05-30 12:09:13 +0200904 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, phys cfg %s, TSC %u",
Harald Welte026b4ca2010-12-24 12:12:10 +0100905 ts->trx->bts->nr, ts->trx->nr, ts->nr,
Harald Welte1fe24122014-01-19 17:18:21 +0100906 gsm_pchan_name(ts->pchan), gsm_ts_tsc(ts));
Harald Weltecd103a92010-12-24 12:14:52 +0100907 if (ts->pchan == GSM_PCHAN_TCH_F_PDCH)
Harald Welteb29cea12010-12-24 12:26:13 +0100908 vty_out(vty, " (%s mode)",
Neels Hofmeyr2ebacce2016-06-14 14:08:35 +0200909 ts->flags & TS_F_PDCH_ACTIVE ? "PDCH" : "TCH/F");
Harald Weltecd103a92010-12-24 12:14:52 +0100910 vty_out(vty, "%s", VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000911 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200912 net_dump_nmstate(vty, &ts->mo.nm_state);
Harald Welte2c828992009-12-02 01:56:49 +0530913 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welteef235b52009-03-10 12:34:02 +0000914 vty_out(vty, " E1 Line %u, Timeslot %u, Subslot %u%s",
915 ts->e1_link.e1_nr, ts->e1_link.e1_ts,
916 ts->e1_link.e1_ts_ss, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000917}
918
919DEFUN(show_ts,
920 show_ts_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100921 "show timeslot [<0-255>] [<0-255>] [<0-7>]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200922 SHOW_STR "Display information about a TS\n"
923 "BTS Number\n" "TRX Number\n" "Timeslot Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000924{
Harald Weltedcccb182010-05-16 20:52:23 +0200925 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte274d0152010-12-24 12:05:03 +0100926 struct gsm_bts *bts = NULL;
927 struct gsm_bts_trx *trx = NULL;
928 struct gsm_bts_trx_ts *ts = NULL;
Harald Welte68628e82009-03-10 12:17:57 +0000929 int bts_nr, trx_nr, ts_nr;
930
931 if (argc >= 1) {
932 /* use the BTS number that the user has specified */
933 bts_nr = atoi(argv[0]);
934 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000935 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000936 VTY_NEWLINE);
937 return CMD_WARNING;
938 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200939 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000940 }
941 if (argc >= 2) {
942 trx_nr = atoi(argv[1]);
943 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000944 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000945 VTY_NEWLINE);
946 return CMD_WARNING;
947 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200948 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000949 }
950 if (argc >= 3) {
951 ts_nr = atoi(argv[2]);
952 if (ts_nr >= TRX_NR_TS) {
Harald Welte1bc77352009-03-10 19:47:51 +0000953 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
Harald Welte68628e82009-03-10 12:17:57 +0000954 VTY_NEWLINE);
955 return CMD_WARNING;
956 }
Harald Welte274d0152010-12-24 12:05:03 +0100957 /* Fully Specified: print and exit */
Harald Welte68628e82009-03-10 12:17:57 +0000958 ts = &trx->ts[ts_nr];
959 ts_dump_vty(vty, ts);
960 return CMD_SUCCESS;
961 }
Harald Welte274d0152010-12-24 12:05:03 +0100962
963 if (bts && trx) {
964 /* Iterate over all TS in this TRX */
965 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
966 ts = &trx->ts[ts_nr];
967 ts_dump_vty(vty, ts);
968 }
969 } else if (bts) {
970 /* Iterate over all TRX in this BTS, TS in each TRX */
Harald Welte68628e82009-03-10 12:17:57 +0000971 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200972 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000973 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
974 ts = &trx->ts[ts_nr];
975 ts_dump_vty(vty, ts);
976 }
977 }
Harald Welte274d0152010-12-24 12:05:03 +0100978 } else {
979 /* Iterate over all BTS, TRX in each BTS, TS in each TRX */
980 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
981 bts = gsm_bts_num(net, bts_nr);
982 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
983 trx = gsm_bts_trx_num(bts, trx_nr);
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 }
989 }
Harald Welte68628e82009-03-10 12:17:57 +0000990 }
991
992 return CMD_SUCCESS;
993}
994
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100995static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte68628e82009-03-10 12:17:57 +0000996{
Harald Weltefcd24452009-06-20 18:15:19 +0200997 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte40f82892009-05-23 17:31:39 +0000998 subscr->authorized, VTY_NEWLINE);
Holger Hans Peter Freyther7f180e82013-12-12 15:45:41 +0100999 if (strlen(subscr->name))
Harald Welte1bc77352009-03-10 19:47:51 +00001000 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
Holger Hans Peter Freytherbd30cd32014-04-04 11:53:18 +02001001 if (strlen(subscr->extension))
Harald Welte68628e82009-03-10 12:17:57 +00001002 vty_out(vty, " Extension: %s%s", subscr->extension,
1003 VTY_NEWLINE);
Holger Hans Peter Freyther5ccd0152013-07-14 08:38:24 +02001004 vty_out(vty, " IMSI: %s%s", subscr->imsi, VTY_NEWLINE);
Holger Hans Peter Freyther22230252009-08-19 12:53:57 +02001005 if (subscr->tmsi != GSM_RESERVED_TMSI)
1006 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte731fd912009-08-15 03:24:51 +02001007 VTY_NEWLINE);
Sylvain Munautaf292642009-12-27 19:29:28 +01001008
Harald Welte (local)15920de2009-08-14 20:27:16 +02001009 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +00001010}
1011
Harald Welte8387a492009-12-22 21:43:14 +01001012static void meas_rep_dump_uni_vty(struct vty *vty,
1013 struct gsm_meas_rep_unidir *mru,
1014 const char *prefix,
1015 const char *dir)
1016{
1017 vty_out(vty, "%s RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",
1018 prefix, dir, rxlev2dbm(mru->full.rx_lev),
1019 dir, rxlev2dbm(mru->sub.rx_lev));
1020 vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",
1021 dir, mru->full.rx_qual, dir, mru->sub.rx_qual,
1022 VTY_NEWLINE);
1023}
1024
1025static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,
1026 const char *prefix)
1027{
1028 vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);
1029 vty_out(vty, "%s Flags: %s%s%s%s%s", prefix,
1030 mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",
1031 mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",
1032 mr->flags & MEAS_REP_F_FPC ? "FPC " : "",
1033 mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",
1034 VTY_NEWLINE);
1035 if (mr->flags & MEAS_REP_F_MS_TO)
1036 vty_out(vty, "%s MS Timing Offset: %u%s", prefix,
1037 mr->ms_timing_offset, VTY_NEWLINE);
1038 if (mr->flags & MEAS_REP_F_MS_L1)
1039 vty_out(vty, "%s L1 MS Power: %u dBm, Timing Advance: %u%s",
1040 prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);
1041 if (mr->flags & MEAS_REP_F_DL_VALID)
1042 meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");
1043 meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");
1044}
1045
Harald Welte0a8cf322015-12-05 17:22:49 +01001046/* FIXME: move this to libosmogsm */
1047static const struct value_string gsm48_cmode_names[] = {
1048 { GSM48_CMODE_SIGN, "signalling" },
1049 { GSM48_CMODE_SPEECH_V1, "FR or HR" },
1050 { GSM48_CMODE_SPEECH_EFR, "EFR" },
1051 { GSM48_CMODE_SPEECH_AMR, "AMR" },
1052 { GSM48_CMODE_DATA_14k5, "CSD(14k5)" },
1053 { GSM48_CMODE_DATA_12k0, "CSD(12k0)" },
1054 { GSM48_CMODE_DATA_6k0, "CSD(6k0)" },
1055 { GSM48_CMODE_DATA_3k6, "CSD(3k6)" },
1056 { 0, NULL }
1057};
1058
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001059/* call vty_out() to print a string like " as TCH/H" for dynamic timeslots.
1060 * Don't do anything if the ts is not dynamic. */
1061static void vty_out_dyn_ts_status(struct vty *vty, struct gsm_bts_trx_ts *ts)
1062{
1063 switch (ts->pchan) {
1064 case GSM_PCHAN_TCH_F_TCH_H_PDCH:
1065 if (ts->dyn.pchan_is == ts->dyn.pchan_want)
1066 vty_out(vty, " as %s",
1067 gsm_pchan_name(ts->dyn.pchan_is));
1068 else
1069 vty_out(vty, " switching %s -> %s",
1070 gsm_pchan_name(ts->dyn.pchan_is),
1071 gsm_pchan_name(ts->dyn.pchan_want));
1072 break;
1073 case GSM_PCHAN_TCH_F_PDCH:
1074 if ((ts->flags & TS_F_PDCH_PENDING_MASK) == 0)
1075 vty_out(vty, " as %s",
1076 (ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
1077 : "TCH/F");
1078 else
1079 vty_out(vty, " switching %s -> %s",
1080 (ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
1081 : "TCH/F",
1082 (ts->flags & TS_F_PDCH_ACT_PENDING)? "PDCH"
1083 : "TCH/F");
1084 break;
1085 default:
1086 /* no dyn ts */
1087 break;
1088 }
1089}
1090
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001091static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte68628e82009-03-10 12:17:57 +00001092{
Harald Welte8387a492009-12-22 21:43:14 +01001093 int idx;
1094
Harald Welte85bded82010-12-24 12:22:34 +01001095 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",
1096 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
1097 lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001098 /* show dyn TS details, if applicable */
1099 switch (lchan->ts->pchan) {
1100 case GSM_PCHAN_TCH_F_TCH_H_PDCH:
1101 vty_out(vty, " Osmocom Dyn TS:");
1102 vty_out_dyn_ts_status(vty, lchan->ts);
1103 vty_out(vty, VTY_NEWLINE);
1104 break;
1105 case GSM_PCHAN_TCH_F_PDCH:
1106 vty_out(vty, " IPACC Dyn PDCH TS:");
1107 vty_out_dyn_ts_status(vty, lchan->ts);
1108 vty_out(vty, VTY_NEWLINE);
1109 break;
1110 default:
1111 /* no dyn ts */
1112 break;
1113 }
Holger Hans Peter Freyther454140e2014-12-28 12:08:28 +01001114 vty_out(vty, " Connection: %u, State: %s%s%s%s",
Holger Hans Peter Freyther40494552010-06-28 17:09:29 +08001115 lchan->conn ? 1: 0,
Holger Hans Peter Freyther454140e2014-12-28 12:08:28 +01001116 gsm_lchans_name(lchan->state),
1117 lchan->state == LCHAN_S_BROKEN ? " Error reason: " : "",
1118 lchan->state == LCHAN_S_BROKEN ? lchan->broken_reason : "",
1119 VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +01001120 vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s",
1121 lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
1122 - lchan->bs_power*2,
1123 ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),
1124 VTY_NEWLINE);
Harald Welte0a8cf322015-12-05 17:22:49 +01001125 vty_out(vty, " Channel Mode / Codec: %s%s",
1126 get_value_string(gsm48_cmode_names, lchan->tch_mode),
1127 VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +08001128 if (lchan->conn && lchan->conn->subscr) {
Harald Welte68628e82009-03-10 12:17:57 +00001129 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +08001130 subscr_dump_vty(vty, lchan->conn->subscr);
Harald Welte68628e82009-03-10 12:17:57 +00001131 } else
1132 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte2c828992009-12-02 01:56:49 +05301133 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
1134 struct in_addr ia;
Holger Hans Peter Freyther54fa7992010-04-07 15:39:16 +02001135 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte2c828992009-12-02 01:56:49 +05301136 vty_out(vty, " Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",
1137 inet_ntoa(ia), lchan->abis_ip.bound_port,
1138 lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,
1139 VTY_NEWLINE);
1140 }
Harald Welte8387a492009-12-22 21:43:14 +01001141
1142 /* we want to report the last measurement report */
1143 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1144 lchan->meas_rep_idx, 1);
1145 meas_rep_dump_vty(vty, &lchan->meas_rep[idx], " ");
Harald Welte68628e82009-03-10 12:17:57 +00001146}
1147
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001148static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
1149{
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +08001150 struct gsm_meas_rep *mr;
1151 int idx;
1152
1153 /* we want to report the last measurement report */
1154 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1155 lchan->meas_rep_idx, 1);
1156 mr = &lchan->meas_rep[idx];
1157
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001158 vty_out(vty, "BTS %u, TRX %u, Timeslot %u %s",
Harald Welte85bded82010-12-24 12:22:34 +01001159 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001160 gsm_pchan_name(lchan->ts->pchan));
1161 vty_out_dyn_ts_status(vty, lchan->ts);
1162 vty_out(vty, ", Lchan %u, Type %s, State %s - "
1163 "L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
Neels Hofmeyrefedf802016-06-14 01:31:38 +02001164 lchan->nr,
1165 gsm_lchant_name(lchan->type), gsm_lchans_name(lchan->state),
1166 mr->ms_l1.pwr,
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +08001167 rxlev2dbm(mr->dl.full.rx_lev),
1168 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001169 VTY_NEWLINE);
1170}
1171
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001172
1173static int dump_lchan_trx_ts(struct gsm_bts_trx_ts *ts, struct vty *vty,
1174 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1175{
1176 int lchan_nr;
1177 for (lchan_nr = 0; lchan_nr < TS_MAX_LCHAN; lchan_nr++) {
1178 struct gsm_lchan *lchan = &ts->lchan[lchan_nr];
1179 if ((lchan->type == GSM_LCHAN_NONE) && (lchan->state == LCHAN_S_NONE))
1180 continue;
1181 dump_cb(vty, lchan);
1182 }
1183
1184 return CMD_SUCCESS;
1185}
1186
1187static int dump_lchan_trx(struct gsm_bts_trx *trx, struct vty *vty,
1188 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1189{
1190 int ts_nr;
1191
1192 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
1193 struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
1194 dump_lchan_trx_ts(ts, vty, dump_cb);
1195 }
1196
1197 return CMD_SUCCESS;
1198}
1199
1200static int dump_lchan_bts(struct gsm_bts *bts, struct vty *vty,
1201 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1202{
1203 int trx_nr;
1204
1205 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
1206 struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, trx_nr);
1207 dump_lchan_trx(trx, vty, dump_cb);
1208 }
1209
1210 return CMD_SUCCESS;
1211}
1212
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001213static int lchan_summary(struct vty *vty, int argc, const char **argv,
1214 void (*dump_cb)(struct vty *, struct gsm_lchan *))
Harald Welte68628e82009-03-10 12:17:57 +00001215{
Harald Weltedcccb182010-05-16 20:52:23 +02001216 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +00001217 struct gsm_bts *bts;
1218 struct gsm_bts_trx *trx;
1219 struct gsm_bts_trx_ts *ts;
1220 struct gsm_lchan *lchan;
1221 int bts_nr, trx_nr, ts_nr, lchan_nr;
1222
1223 if (argc >= 1) {
1224 /* use the BTS number that the user has specified */
1225 bts_nr = atoi(argv[0]);
1226 if (bts_nr >= net->num_bts) {
1227 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1228 VTY_NEWLINE);
1229 return CMD_WARNING;
1230 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001231 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001232
1233 if (argc == 1)
1234 return dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001235 }
1236 if (argc >= 2) {
1237 trx_nr = atoi(argv[1]);
1238 if (trx_nr >= bts->num_trx) {
1239 vty_out(vty, "%% can't find TRX %s%s", argv[1],
1240 VTY_NEWLINE);
1241 return CMD_WARNING;
1242 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001243 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001244
1245 if (argc == 2)
1246 return dump_lchan_trx(trx, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001247 }
1248 if (argc >= 3) {
1249 ts_nr = atoi(argv[2]);
1250 if (ts_nr >= TRX_NR_TS) {
1251 vty_out(vty, "%% can't find TS %s%s", argv[2],
1252 VTY_NEWLINE);
1253 return CMD_WARNING;
1254 }
1255 ts = &trx->ts[ts_nr];
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001256
1257 if (argc == 3)
1258 return dump_lchan_trx_ts(ts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001259 }
1260 if (argc >= 4) {
1261 lchan_nr = atoi(argv[3]);
1262 if (lchan_nr >= TS_MAX_LCHAN) {
1263 vty_out(vty, "%% can't find LCHAN %s%s", argv[3],
1264 VTY_NEWLINE);
1265 return CMD_WARNING;
1266 }
1267 lchan = &ts->lchan[lchan_nr];
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001268 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +00001269 return CMD_SUCCESS;
1270 }
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001271
1272
Harald Welte68628e82009-03-10 12:17:57 +00001273 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001274 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001275 dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001276 }
1277
1278 return CMD_SUCCESS;
1279}
1280
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001281
1282DEFUN(show_lchan,
1283 show_lchan_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001284 "show lchan [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001285 SHOW_STR "Display information about a logical channel\n"
1286 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001287 LCHAN_NR_STR)
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001288
1289{
1290 return lchan_summary(vty, argc, argv, lchan_dump_full_vty);
1291}
1292
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001293DEFUN(show_lchan_summary,
1294 show_lchan_summary_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001295 "show lchan summary [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001296 SHOW_STR "Display information about a logical channel\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001297 "Short summary\n"
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001298 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001299 LCHAN_NR_STR)
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001300{
1301 return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
1302}
1303
Harald Weltebe4b7302009-05-23 16:59:33 +00001304static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
Harald Weltef5025b62009-03-28 16:55:11 +00001305{
1306 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
1307 subscr_dump_vty(vty, pag->subscr);
1308}
1309
Harald Weltebe4b7302009-05-23 16:59:33 +00001310static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
Harald Weltef5025b62009-03-28 16:55:11 +00001311{
1312 struct gsm_paging_request *pag;
1313
Holger Hans Peter Freyther9b5192b2013-03-03 11:03:17 +01001314 if (!bts->paging.bts)
1315 return;
1316
Harald Weltef5025b62009-03-28 16:55:11 +00001317 llist_for_each_entry(pag, &bts->paging.pending_requests, entry)
1318 paging_dump_vty(vty, pag);
1319}
1320
1321DEFUN(show_paging,
1322 show_paging_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001323 "show paging [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +02001324 SHOW_STR "Display information about paging reuqests of a BTS\n"
1325 "BTS Number\n")
Harald Weltef5025b62009-03-28 16:55:11 +00001326{
Harald Weltedcccb182010-05-16 20:52:23 +02001327 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Weltef5025b62009-03-28 16:55:11 +00001328 struct gsm_bts *bts;
1329 int bts_nr;
1330
1331 if (argc >= 1) {
1332 /* use the BTS number that the user has specified */
1333 bts_nr = atoi(argv[0]);
1334 if (bts_nr >= net->num_bts) {
1335 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1336 VTY_NEWLINE);
1337 return CMD_WARNING;
1338 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001339 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001340 bts_paging_dump_vty(vty, bts);
1341
1342 return CMD_SUCCESS;
1343 }
1344 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001345 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001346 bts_paging_dump_vty(vty, bts);
1347 }
1348
1349 return CMD_SUCCESS;
1350}
1351
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01001352DEFUN(show_paging_group,
1353 show_paging_group_cmd,
1354 "show paging-group <0-255> IMSI",
1355 SHOW_STR "Display the paging group\n"
1356 "BTS Number\n" "IMSI\n")
1357{
1358 struct gsm_network *net = gsmnet_from_vty(vty);
1359 struct gsm_bts *bts;
1360 unsigned int page_group;
1361 int bts_nr = atoi(argv[0]);
1362
1363 if (bts_nr >= net->num_bts) {
1364 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1365 return CMD_WARNING;
1366 }
1367
1368 bts = gsm_bts_num(net, bts_nr);
1369 if (!bts) {
1370 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1371 return CMD_WARNING;
1372 }
1373
1374 page_group = gsm0502_calc_paging_group(&bts->si_common.chan_desc,
1375 str_to_imsi(argv[1]));
1376 vty_out(vty, "%%Paging group for IMSI %" PRIu64 " on BTS #%d is %u%s",
1377 str_to_imsi(argv[1]), bts->nr,
1378 page_group, VTY_NEWLINE);
1379 return CMD_SUCCESS;
1380}
1381
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001382DEFUN(cfg_net_neci,
1383 cfg_net_neci_cmd,
1384 "neci (0|1)",
Harald Welte28326062010-05-14 20:05:17 +02001385 "New Establish Cause Indication\n"
1386 "Don't set the NECI bit\n" "Set the NECI bit\n")
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001387{
Harald Weltedcccb182010-05-16 20:52:23 +02001388 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1389
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001390 gsmnet->neci = atoi(argv[0]);
Holger Hans Peter Freyther78891072010-09-06 09:36:02 +08001391 gsm_net_update_ctype(gsmnet);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001392 return CMD_SUCCESS;
1393}
1394
Harald Welte8f0ed552010-05-11 21:53:49 +02001395#define HANDOVER_STR "Handover Options\n"
1396
Harald Weltebc814502009-12-19 21:41:52 +01001397DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1398 "handover (0|1)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001399 HANDOVER_STR
1400 "Don't perform in-call handover\n"
1401 "Perform in-call handover\n")
Harald Weltebc814502009-12-19 21:41:52 +01001402{
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001403 int enable = atoi(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001404 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001405
1406 if (enable && ipacc_rtp_direct) {
Harald Weltefe03f0d2009-12-20 13:51:01 +01001407 vty_out(vty, "%% Cannot enable handover unless RTP Proxy mode "
1408 "is enabled by using the -P command line option%s",
1409 VTY_NEWLINE);
1410 return CMD_WARNING;
1411 }
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001412 gsmnet->handover.active = enable;
Harald Weltebc814502009-12-19 21:41:52 +01001413
1414 return CMD_SUCCESS;
1415}
1416
Harald Welte8f0ed552010-05-11 21:53:49 +02001417#define HO_WIN_STR HANDOVER_STR "Measurement Window\n"
1418#define HO_WIN_RXLEV_STR HO_WIN_STR "Received Level Averaging\n"
1419#define HO_WIN_RXQUAL_STR HO_WIN_STR "Received Quality Averaging\n"
1420#define HO_PBUDGET_STR HANDOVER_STR "Power Budget\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001421#define HO_AVG_COUNT_STR "Amount to use for Averaging\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001422
Harald Welteb720bd32009-12-21 16:51:50 +01001423DEFUN(cfg_net_ho_win_rxlev_avg, cfg_net_ho_win_rxlev_avg_cmd,
1424 "handover window rxlev averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001425 HO_WIN_RXLEV_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001426 "How many RxLev measurements are used for averaging\n"
1427 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001428{
Harald Weltedcccb182010-05-16 20:52:23 +02001429 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001430 gsmnet->handover.win_rxlev_avg = atoi(argv[0]);
1431 return CMD_SUCCESS;
1432}
1433
1434DEFUN(cfg_net_ho_win_rxqual_avg, cfg_net_ho_win_rxqual_avg_cmd,
1435 "handover window rxqual averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001436 HO_WIN_RXQUAL_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001437 "How many RxQual measurements are used for averaging\n"
1438 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001439{
Harald Weltedcccb182010-05-16 20:52:23 +02001440 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001441 gsmnet->handover.win_rxqual_avg = atoi(argv[0]);
1442 return CMD_SUCCESS;
1443}
1444
1445DEFUN(cfg_net_ho_win_rxlev_neigh_avg, cfg_net_ho_win_rxlev_avg_neigh_cmd,
1446 "handover window rxlev neighbor averaging <1-10>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001447 HO_WIN_RXLEV_STR "Neighbor\n"
1448 "How many RxQual measurements are used for averaging\n"
1449 HO_AVG_COUNT_STR)
Harald Welteb720bd32009-12-21 16:51:50 +01001450{
Harald Weltedcccb182010-05-16 20:52:23 +02001451 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001452 gsmnet->handover.win_rxlev_avg_neigh = atoi(argv[0]);
1453 return CMD_SUCCESS;
1454}
1455
1456DEFUN(cfg_net_ho_pwr_interval, cfg_net_ho_pwr_interval_cmd,
1457 "handover power budget interval <1-99>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001458 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001459 "How often to check if we have a better cell (SACCH frames)\n"
1460 "Interval\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001461{
Harald Weltedcccb182010-05-16 20:52:23 +02001462 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001463 gsmnet->handover.pwr_interval = atoi(argv[0]);
1464 return CMD_SUCCESS;
1465}
1466
1467DEFUN(cfg_net_ho_pwr_hysteresis, cfg_net_ho_pwr_hysteresis_cmd,
1468 "handover power budget hysteresis <0-999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001469 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001470 "How many dB does a neighbor to be stronger to become a HO candidate\n"
1471 "Hysteresis\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001472{
Harald Weltedcccb182010-05-16 20:52:23 +02001473 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001474 gsmnet->handover.pwr_hysteresis = atoi(argv[0]);
1475 return CMD_SUCCESS;
1476}
1477
1478DEFUN(cfg_net_ho_max_distance, cfg_net_ho_max_distance_cmd,
1479 "handover maximum distance <0-9999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001480 HANDOVER_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001481 "How big is the maximum timing advance before HO is forced\n"
1482 "Distance\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001483{
Harald Weltedcccb182010-05-16 20:52:23 +02001484 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001485 gsmnet->handover.max_distance = atoi(argv[0]);
1486 return CMD_SUCCESS;
1487}
Harald Weltebc814502009-12-19 21:41:52 +01001488
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001489DEFUN(cfg_net_pag_any_tch,
1490 cfg_net_pag_any_tch_cmd,
1491 "paging any use tch (0|1)",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001492 "Assign a TCH when receiving a Paging Any request\n"
1493 "Any Channel\n" "Use\n" "TCH\n"
1494 "Do not use TCH for Paging Request Any\n"
1495 "Do use TCH for Paging Request Any\n")
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001496{
Holger Hans Peter Freytherb0e88b82010-09-06 10:09:19 +08001497 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001498 gsmnet->pag_any_tch = atoi(argv[0]);
1499 gsm_net_update_ctype(gsmnet);
1500 return CMD_SUCCESS;
1501}
1502
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001503#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001504 DEFUN(cfg_net_T##number, \
1505 cfg_net_T##number##_cmd, \
1506 "timer t" #number " <0-65535>", \
Harald Welte8f0ed552010-05-11 21:53:49 +02001507 "Configure GSM Timers\n" \
Holger Hans Peter Freyther5dd295f2014-04-11 19:30:27 +02001508 doc "Timer Value in seconds\n") \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001509{ \
Harald Weltedcccb182010-05-16 20:52:23 +02001510 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001511 int value = atoi(argv[0]); \
1512 \
1513 if (value < 0 || value > 65535) { \
1514 vty_out(vty, "Timer value %s out of range.%s", \
1515 argv[0], VTY_NEWLINE); \
1516 return CMD_WARNING; \
1517 } \
1518 \
1519 gsmnet->T##number = value; \
1520 return CMD_SUCCESS; \
1521}
1522
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001523DECLARE_TIMER(3101, "Set the timeout value for IMMEDIATE ASSIGNMENT.\n")
1524DECLARE_TIMER(3103, "Set the timeout value for HANDOVER.\n")
Harald Welte67161f22012-06-03 13:01:47 +02001525DECLARE_TIMER(3105, "Set the timer for repetition of PHYSICAL INFORMATION.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001526DECLARE_TIMER(3107, "Currently not used.\n")
Holger Hans Peter Freytherb3489392011-12-28 16:21:05 +01001527DECLARE_TIMER(3109, "Set the RSL SACCH deactivation timeout.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001528DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.\n")
1529DECLARE_TIMER(3113, "Set the time to try paging a subscriber.\n")
1530DECLARE_TIMER(3115, "Currently not used.\n")
1531DECLARE_TIMER(3117, "Currently not used.\n")
1532DECLARE_TIMER(3119, "Currently not used.\n")
1533DECLARE_TIMER(3122, "Waiting time (seconds) after IMM ASS REJECT\n")
1534DECLARE_TIMER(3141, "Currently not used.\n")
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001535
Maxc08ee712016-05-11 12:45:13 +02001536DEFUN_DEPRECATED(cfg_net_dtx,
1537 cfg_net_dtx_cmd,
1538 "dtx-used (0|1)",
1539 ".HIDDEN\n""Obsolete\n""Obsolete\n")
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001540{
Maxc08ee712016-05-11 12:45:13 +02001541 vty_out(vty, "%% 'dtx-used' is now deprecated: use dtx * "
1542 "configuration options of BTS instead%s", VTY_NEWLINE);
1543 return CMD_SUCCESS;
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001544}
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001545
Harald Welte5258fc42009-03-28 19:07:53 +00001546/* per-BTS configuration */
1547DEFUN(cfg_bts,
1548 cfg_bts_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02001549 "bts <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001550 "Select a BTS to configure\n"
1551 "BTS Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001552{
Harald Weltedcccb182010-05-16 20:52:23 +02001553 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte5258fc42009-03-28 19:07:53 +00001554 int bts_nr = atoi(argv[0]);
1555 struct gsm_bts *bts;
1556
Harald Weltee441d9c2009-06-21 16:17:15 +02001557 if (bts_nr > gsmnet->num_bts) {
1558 vty_out(vty, "%% The next unused BTS number is %u%s",
1559 gsmnet->num_bts, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00001560 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02001561 } else if (bts_nr == gsmnet->num_bts) {
1562 /* allocate a new one */
Harald Welte3300c012011-06-05 13:31:33 +02001563 bts = gsm_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,
Harald Weltea2bbc5e2015-11-20 10:43:31 +01001564 HARDCODED_BSIC);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02001565 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02001566 bts = gsm_bts_num(gsmnet, bts_nr);
1567
Daniel Willmannf15c2762010-01-11 13:43:07 +01001568 if (!bts) {
1569 vty_out(vty, "%% Unable to allocate BTS %u%s",
1570 gsmnet->num_bts, VTY_NEWLINE);
Harald Weltee441d9c2009-06-21 16:17:15 +02001571 return CMD_WARNING;
Daniel Willmannf15c2762010-01-11 13:43:07 +01001572 }
Harald Welte5258fc42009-03-28 19:07:53 +00001573
1574 vty->index = bts;
Harald Welte197dea92010-05-14 17:59:53 +02001575 vty->index_sub = &bts->description;
Harald Welte5258fc42009-03-28 19:07:53 +00001576 vty->node = BTS_NODE;
1577
1578 return CMD_SUCCESS;
1579}
1580
1581DEFUN(cfg_bts_type,
1582 cfg_bts_type_cmd,
Harald Weltee555c2b2012-08-17 13:02:12 +02001583 "type TYPE", /* dynamically created */
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001584 "Set the BTS type\n" "Type\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001585{
1586 struct gsm_bts *bts = vty->index;
Harald Welte39315c42010-01-10 18:01:52 +01001587 int rc;
Harald Welte5258fc42009-03-28 19:07:53 +00001588
Harald Welte39315c42010-01-10 18:01:52 +01001589 rc = gsm_set_bts_type(bts, parse_btstype(argv[0]));
1590 if (rc < 0)
1591 return CMD_WARNING;
Harald Welte8175e952009-10-20 00:22:00 +02001592
Harald Welte5258fc42009-03-28 19:07:53 +00001593 return CMD_SUCCESS;
1594}
1595
Harald Weltefcd24452009-06-20 18:15:19 +02001596DEFUN(cfg_bts_band,
1597 cfg_bts_band_cmd,
1598 "band BAND",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001599 "Set the frequency band of this BTS\n" "Frequency band\n")
Harald Weltefcd24452009-06-20 18:15:19 +02001600{
1601 struct gsm_bts *bts = vty->index;
Harald Welte42581822009-08-08 16:12:58 +02001602 int band = gsm_band_parse(argv[0]);
Harald Weltefcd24452009-06-20 18:15:19 +02001603
1604 if (band < 0) {
1605 vty_out(vty, "%% BAND %d is not a valid GSM band%s",
1606 band, VTY_NEWLINE);
1607 return CMD_WARNING;
1608 }
1609
1610 bts->band = band;
1611
1612 return CMD_SUCCESS;
1613}
1614
Maxc08ee712016-05-11 12:45:13 +02001615DEFUN(cfg_bts_dtxu, cfg_bts_dtxu_cmd, "dtx uplink [force]",
1616 "Configure discontinuous transmission\n"
1617 "Enable Uplink DTX for this BTS\n"
1618 "MS 'shall' use DTXu instead of 'may' use (might not be supported by "
1619 "older phones).\n")
1620{
1621 struct gsm_bts *bts = vty->index;
1622
1623 bts->dtxu = (argc > 0) ? GSM48_DTX_SHALL_BE_USED : GSM48_DTX_MAY_BE_USED;
Max60795282016-06-06 11:30:57 +02001624 if (!is_ipaccess_bts(bts))
1625 vty_out(vty, "%% DTX enabled on non-IP BTS: this configuration "
1626 "neither supported nor tested!%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +02001627 return CMD_SUCCESS;
1628}
1629
1630DEFUN(cfg_bts_no_dtxu, cfg_bts_no_dtxu_cmd, "no dtx uplink",
1631 NO_STR
1632 "Configure discontinuous transmission\n"
1633 "Disable Uplink DTX for this BTS\n")
1634{
1635 struct gsm_bts *bts = vty->index;
1636
1637 bts->dtxu = GSM48_DTX_SHALL_NOT_BE_USED;
1638
1639 return CMD_SUCCESS;
1640}
1641
1642DEFUN(cfg_bts_dtxd, cfg_bts_dtxd_cmd, "dtx downlink",
1643 "Configure discontinuous transmission\n"
1644 "Enable Downlink DTX for this BTS\n")
1645{
1646 struct gsm_bts *bts = vty->index;
1647
1648 bts->dtxd = true;
Max60795282016-06-06 11:30:57 +02001649 if (!is_ipaccess_bts(bts))
1650 vty_out(vty, "%% DTX enabled on non-IP BTS: this configuration "
1651 "neither supported nor tested!%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +02001652 return CMD_SUCCESS;
1653}
1654
1655DEFUN(cfg_bts_no_dtxd, cfg_bts_no_dtxd_cmd, "no dtx downlink",
1656 NO_STR
1657 "Configure discontinuous transmission\n"
1658 "Disable Downlink DTX for this BTS\n")
1659{
1660 struct gsm_bts *bts = vty->index;
1661
1662 bts->dtxd = false;
1663
1664 return CMD_SUCCESS;
1665}
1666
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001667DEFUN(cfg_bts_ci,
1668 cfg_bts_ci_cmd,
1669 "cell_identity <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001670 "Set the Cell identity of this BTS\n" "Cell Identity\n")
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001671{
1672 struct gsm_bts *bts = vty->index;
1673 int ci = atoi(argv[0]);
1674
1675 if (ci < 0 || ci > 0xffff) {
1676 vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s",
1677 ci, VTY_NEWLINE);
1678 return CMD_WARNING;
1679 }
1680 bts->cell_identity = ci;
1681
1682 return CMD_SUCCESS;
1683}
1684
Harald Welte5258fc42009-03-28 19:07:53 +00001685DEFUN(cfg_bts_lac,
1686 cfg_bts_lac_cmd,
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001687 "location_area_code <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001688 "Set the Location Area Code (LAC) of this BTS\n" "LAC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001689{
1690 struct gsm_bts *bts = vty->index;
1691 int lac = atoi(argv[0]);
1692
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001693 if (lac < 0 || lac > 0xffff) {
1694 vty_out(vty, "%% LAC %d is not in the valid range (0-65535)%s",
Harald Welte5258fc42009-03-28 19:07:53 +00001695 lac, VTY_NEWLINE);
1696 return CMD_WARNING;
1697 }
Holger Hans Peter Freythere48b9562009-10-01 04:07:15 +02001698
1699 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
1700 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
1701 lac, VTY_NEWLINE);
1702 return CMD_WARNING;
1703 }
1704
Harald Welte5258fc42009-03-28 19:07:53 +00001705 bts->location_area_code = lac;
1706
1707 return CMD_SUCCESS;
1708}
1709
Harald Weltea43f7892009-12-01 18:04:30 +05301710
Harald Weltea2bbc5e2015-11-20 10:43:31 +01001711/* compatibility wrapper for old config files */
1712DEFUN_HIDDEN(cfg_bts_tsc,
Harald Welte5258fc42009-03-28 19:07:53 +00001713 cfg_bts_tsc_cmd,
Harald Weltec513ded2012-05-31 10:57:08 +02001714 "training_sequence_code <0-7>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001715 "Set the Training Sequence Code (TSC) of this BTS\n" "TSC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001716{
Harald Welte5258fc42009-03-28 19:07:53 +00001717 return CMD_SUCCESS;
1718}
1719
Harald Welte78f2f502009-05-23 16:56:52 +00001720DEFUN(cfg_bts_bsic,
1721 cfg_bts_bsic_cmd,
1722 "base_station_id_code <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001723 "Set the Base Station Identity Code (BSIC) of this BTS\n"
1724 "BSIC of this BTS\n")
Harald Welte78f2f502009-05-23 16:56:52 +00001725{
1726 struct gsm_bts *bts = vty->index;
1727 int bsic = atoi(argv[0]);
1728
1729 if (bsic < 0 || bsic > 0x3f) {
Harald Welte42581822009-08-08 16:12:58 +02001730 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte78f2f502009-05-23 16:56:52 +00001731 bsic, VTY_NEWLINE);
1732 return CMD_WARNING;
1733 }
1734 bts->bsic = bsic;
1735
1736 return CMD_SUCCESS;
1737}
1738
Harald Welte4cc34222009-05-01 15:12:31 +00001739DEFUN(cfg_bts_unit_id,
1740 cfg_bts_unit_id_cmd,
Harald Welte07dc73d2009-08-07 13:27:09 +02001741 "ip.access unit_id <0-65534> <0-255>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001742 "Abis/IP specific options\n"
1743 "Set the IPA BTS Unit ID\n"
1744 "Unit ID (Site)\n"
1745 "Unit ID (BTS)\n")
Harald Welte4cc34222009-05-01 15:12:31 +00001746{
1747 struct gsm_bts *bts = vty->index;
1748 int site_id = atoi(argv[0]);
1749 int bts_id = atoi(argv[1]);
1750
Harald Welte07dc73d2009-08-07 13:27:09 +02001751 if (!is_ipaccess_bts(bts)) {
1752 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1753 return CMD_WARNING;
1754 }
1755
Harald Welte4cc34222009-05-01 15:12:31 +00001756 bts->ip_access.site_id = site_id;
1757 bts->ip_access.bts_id = bts_id;
1758
1759 return CMD_SUCCESS;
1760}
1761
Harald Welte8b291802013-03-12 13:57:05 +01001762DEFUN(cfg_bts_rsl_ip,
1763 cfg_bts_rsl_ip_cmd,
1764 "ip.access rsl-ip A.B.C.D",
1765 "Abis/IP specific options\n"
1766 "Set the IPA RSL IP Address of the BSC\n"
1767 "Destination IP address for RSL connection\n")
1768{
1769 struct gsm_bts *bts = vty->index;
1770 struct in_addr ia;
1771
1772 if (!is_ipaccess_bts(bts)) {
1773 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1774 return CMD_WARNING;
1775 }
1776
1777 inet_aton(argv[0], &ia);
1778 bts->ip_access.rsl_ip = ntohl(ia.s_addr);
1779
1780 return CMD_SUCCESS;
1781}
1782
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001783#define NOKIA_STR "Nokia *Site related commands\n"
Harald Welte8b291802013-03-12 13:57:05 +01001784
Sylvain Munautc9519462011-10-17 14:04:55 +02001785DEFUN(cfg_bts_nokia_site_skip_reset,
1786 cfg_bts_nokia_site_skip_reset_cmd,
1787 "nokia_site skip-reset (0|1)",
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001788 NOKIA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001789 "Skip the reset step during bootstrap process of this BTS\n"
1790 "Do NOT skip the reset\n" "Skip the reset\n")
Sylvain Munautc9519462011-10-17 14:04:55 +02001791{
1792 struct gsm_bts *bts = vty->index;
1793
1794 if (bts->type != GSM_BTS_TYPE_NOKIA_SITE) {
1795 vty_out(vty, "%% BTS is not of Nokia *Site type%s", VTY_NEWLINE);
1796 return CMD_WARNING;
1797 }
1798
1799 bts->nokia.skip_reset = atoi(argv[0]);
1800
1801 return CMD_SUCCESS;
1802}
1803
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001804DEFUN(cfg_bts_nokia_site_no_loc_rel_cnf,
1805 cfg_bts_nokia_site_no_loc_rel_cnf_cmd,
1806 "nokia_site no-local-rel-conf (0|1)",
1807 NOKIA_STR
1808 "Do not wait for RELease CONFirm message when releasing channel locally\n"
1809 "Wait for RELease CONFirm\n" "Do not wait for RELease CONFirm\n")
1810{
1811 struct gsm_bts *bts = vty->index;
1812
1813 if (!is_nokia_bts(bts)) {
1814 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1815 VTY_NEWLINE);
1816 return CMD_WARNING;
1817 }
1818
1819 bts->nokia.no_loc_rel_cnf = atoi(argv[0]);
1820
1821 return CMD_SUCCESS;
1822}
1823
Sipos Csaba56e17662015-02-07 13:27:36 +01001824DEFUN(cfg_bts_nokia_site_bts_reset_timer_cnf,
1825 cfg_bts_nokia_site_bts_reset_timer_cnf_cmd,
1826 "nokia_site bts-reset-timer <15-100>",
1827 NOKIA_STR
1828 "The amount of time (in sec.) between BTS_RESET is sent,\n"
1829 "and the BTS is being bootstrapped.\n")
1830{
1831 struct gsm_bts *bts = vty->index;
1832
1833 if (!is_nokia_bts(bts)) {
1834 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1835 VTY_NEWLINE);
1836 return CMD_WARNING;
1837 }
1838
1839 bts->nokia.bts_reset_timer_cnf = atoi(argv[0]);
1840
1841 return CMD_SUCCESS;
1842}
Harald Welte8f0ed552010-05-11 21:53:49 +02001843#define OML_STR "Organization & Maintenance Link\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001844#define IPA_STR "A-bis/IP Specific Options\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001845
Harald Welte8175e952009-10-20 00:22:00 +02001846DEFUN(cfg_bts_stream_id,
1847 cfg_bts_stream_id_cmd,
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001848 "oml ip.access stream_id <0-255> line E1_LINE",
Harald Welte8f0ed552010-05-11 21:53:49 +02001849 OML_STR IPA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001850 "Set the ip.access Stream ID of the OML link of this BTS\n"
1851 "Stream Identifier\n" "Virtual E1 Line Number\n" "Virtual E1 Line Number\n")
Harald Welte8175e952009-10-20 00:22:00 +02001852{
1853 struct gsm_bts *bts = vty->index;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001854 int stream_id = atoi(argv[0]), linenr = atoi(argv[1]);
Harald Welte8175e952009-10-20 00:22:00 +02001855
1856 if (!is_ipaccess_bts(bts)) {
1857 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1858 return CMD_WARNING;
1859 }
1860
1861 bts->oml_tei = stream_id;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001862 /* This is used by e1inp_bind_ops callback for each BTS model. */
1863 bts->oml_e1_link.e1_nr = linenr;
1864
1865 return CMD_SUCCESS;
1866}
1867
Harald Welted13e0cd2012-08-17 09:52:03 +02001868#define OML_E1_STR OML_STR "OML E1/T1 Configuration\n"
Harald Welte8175e952009-10-20 00:22:00 +02001869
Harald Welte42581822009-08-08 16:12:58 +02001870DEFUN(cfg_bts_oml_e1,
1871 cfg_bts_oml_e1_cmd,
1872 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welted13e0cd2012-08-17 09:52:03 +02001873 OML_E1_STR
1874 "E1/T1 line number to be used for OML\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001875 "E1/T1 line number to be used for OML\n"
1876 "E1/T1 timeslot to be used for OML\n"
1877 "E1/T1 timeslot to be used for OML\n"
1878 "E1/T1 sub-slot to be used for OML\n"
1879 "Use E1/T1 sub-slot 0\n"
1880 "Use E1/T1 sub-slot 1\n"
1881 "Use E1/T1 sub-slot 2\n"
1882 "Use E1/T1 sub-slot 3\n"
1883 "Use full E1 slot 3\n"
1884 )
Harald Welte42581822009-08-08 16:12:58 +02001885{
1886 struct gsm_bts *bts = vty->index;
1887
1888 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
1889
1890 return CMD_SUCCESS;
1891}
1892
1893
1894DEFUN(cfg_bts_oml_e1_tei,
1895 cfg_bts_oml_e1_tei_cmd,
1896 "oml e1 tei <0-63>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001897 OML_E1_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001898 "Set the TEI to be used for OML\n"
1899 "TEI Number\n")
Harald Welte42581822009-08-08 16:12:58 +02001900{
1901 struct gsm_bts *bts = vty->index;
1902
1903 bts->oml_tei = atoi(argv[0]);
1904
1905 return CMD_SUCCESS;
1906}
1907
Harald Welte7a8fa412009-08-10 13:48:16 +02001908DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1909 "channel allocator (ascending|descending)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001910 "Channnel Allocator\n" "Channel Allocator\n"
1911 "Allocate Timeslots and Transceivers in ascending order\n"
1912 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte7a8fa412009-08-10 13:48:16 +02001913{
1914 struct gsm_bts *bts = vty->index;
1915
1916 if (!strcmp(argv[0], "ascending"))
1917 bts->chan_alloc_reverse = 0;
1918 else
1919 bts->chan_alloc_reverse = 1;
1920
1921 return CMD_SUCCESS;
1922}
1923
Harald Welte8f0ed552010-05-11 21:53:49 +02001924#define RACH_STR "Random Access Control Channel\n"
1925
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001926DEFUN(cfg_bts_rach_tx_integer,
1927 cfg_bts_rach_tx_integer_cmd,
1928 "rach tx integer <0-15>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001929 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001930 "Set the raw tx integer value in RACH Control parameters IE\n"
1931 "Set the raw tx integer value in RACH Control parameters IE\n"
1932 "Raw tx integer value in RACH Control parameters IE\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001933{
1934 struct gsm_bts *bts = vty->index;
1935 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
1936 return CMD_SUCCESS;
1937}
1938
1939DEFUN(cfg_bts_rach_max_trans,
1940 cfg_bts_rach_max_trans_cmd,
1941 "rach max transmission (1|2|4|7)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001942 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001943 "Set the maximum number of RACH burst transmissions\n"
1944 "Set the maximum number of RACH burst transmissions\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02001945 "Maximum number of 1 RACH burst transmissions\n"
1946 "Maximum number of 2 RACH burst transmissions\n"
1947 "Maximum number of 4 RACH burst transmissions\n"
1948 "Maximum number of 7 RACH burst transmissions\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001949{
1950 struct gsm_bts *bts = vty->index;
1951 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
1952 return CMD_SUCCESS;
1953}
1954
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02001955#define CD_STR "Channel Description\n"
1956
1957DEFUN(cfg_bts_chan_desc_att,
1958 cfg_bts_chan_desc_att_cmd,
1959 "channel-descrption attach (0|1)",
1960 CD_STR
1961 "Set if attachment is required\n"
1962 "Attachment is NOT required\n"
1963 "Attachment is required (standard)\n")
1964{
1965 struct gsm_bts *bts = vty->index;
1966 bts->si_common.chan_desc.att = atoi(argv[0]);
1967 return CMD_SUCCESS;
1968}
1969
1970DEFUN(cfg_bts_chan_desc_bs_pa_mfrms,
1971 cfg_bts_chan_desc_bs_pa_mfrms_cmd,
1972 "channel-descrption bs-pa-mfrms <2-9>",
1973 CD_STR
1974 "Set number of multiframe periods for paging groups\n"
1975 "Number of multiframe periods for paging groups\n")
1976{
1977 struct gsm_bts *bts = vty->index;
1978 int bs_pa_mfrms = atoi(argv[0]);
1979
1980 bts->si_common.chan_desc.bs_pa_mfrms = bs_pa_mfrms - 2;
1981 return CMD_SUCCESS;
1982}
1983
1984DEFUN(cfg_bts_chan_desc_bs_ag_blks_res,
1985 cfg_bts_chan_desc_bs_ag_blks_res_cmd,
1986 "channel-descrption bs-ag-blks-res <0-7>",
1987 CD_STR
1988 "Set number of blocks reserved for access grant\n"
1989 "Number of blocks reserved for access grant\n")
1990{
1991 struct gsm_bts *bts = vty->index;
1992 int bs_ag_blks_res = atoi(argv[0]);
1993
1994 bts->si_common.chan_desc.bs_ag_blks_res = bs_ag_blks_res;
1995 return CMD_SUCCESS;
1996}
1997
Harald Welte8f0ed552010-05-11 21:53:49 +02001998#define NM_STR "Network Management\n"
1999
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002000DEFUN(cfg_bts_rach_nm_b_thresh,
2001 cfg_bts_rach_nm_b_thresh_cmd,
2002 "rach nm busy threshold <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002003 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002004 "Set the NM Busy Threshold\n"
2005 "Set the NM Busy Threshold\n"
2006 "NM Busy Threshold in dB")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002007{
2008 struct gsm_bts *bts = vty->index;
2009 bts->rach_b_thresh = atoi(argv[0]);
2010 return CMD_SUCCESS;
2011}
2012
2013DEFUN(cfg_bts_rach_nm_ldavg,
2014 cfg_bts_rach_nm_ldavg_cmd,
2015 "rach nm load average <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002016 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002017 "Set the NM Loadaverage Slots value\n"
2018 "Set the NM Loadaverage Slots value\n"
2019 "NM Loadaverage Slots value\n")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002020{
2021 struct gsm_bts *bts = vty->index;
2022 bts->rach_ldavg_slots = atoi(argv[0]);
2023 return CMD_SUCCESS;
2024}
2025
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002026DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
2027 "cell barred (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002028 "Should this cell be barred from access?\n"
2029 "Should this cell be barred from access?\n"
2030 "Cell should NOT be barred\n"
2031 "Cell should be barred\n")
2032
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002033{
2034 struct gsm_bts *bts = vty->index;
2035
Harald Welte71355012009-12-21 23:08:18 +01002036 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002037
2038 return CMD_SUCCESS;
2039}
2040
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002041DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
2042 "rach emergency call allowed (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002043 RACH_STR
2044 "Should this cell allow emergency calls?\n"
2045 "Should this cell allow emergency calls?\n"
2046 "Should this cell allow emergency calls?\n"
2047 "Do NOT allow emergency calls\n"
2048 "Allow emergency calls\n")
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002049{
2050 struct gsm_bts *bts = vty->index;
2051
2052 if (atoi(argv[0]) == 0)
2053 bts->si_common.rach_control.t2 |= 0x4;
2054 else
2055 bts->si_common.rach_control.t2 &= ~0x4;
2056
2057 return CMD_SUCCESS;
2058}
2059
Ivan Kluchnikov67920592013-09-16 13:13:04 +04002060DEFUN(cfg_bts_rach_ac_class, cfg_bts_rach_ac_class_cmd,
2061 "rach access-control-class (0|1|2|3|4|5|6|7|8|9|11|12|13|14|15) (barred|allowed)",
2062 RACH_STR
2063 "Set access control class\n"
2064 "Access control class 0\n"
2065 "Access control class 1\n"
2066 "Access control class 2\n"
2067 "Access control class 3\n"
2068 "Access control class 4\n"
2069 "Access control class 5\n"
2070 "Access control class 6\n"
2071 "Access control class 7\n"
2072 "Access control class 8\n"
2073 "Access control class 9\n"
2074 "Access control class 11 for PLMN use\n"
2075 "Access control class 12 for security services\n"
2076 "Access control class 13 for public utilities (e.g. water/gas suppliers)\n"
2077 "Access control class 14 for emergency services\n"
2078 "Access control class 15 for PLMN staff\n"
2079 "barred to use access control class\n"
2080 "allowed to use access control class\n")
2081{
2082 struct gsm_bts *bts = vty->index;
2083
2084 uint8_t control_class;
2085 uint8_t allowed = 0;
2086
2087 if (strcmp(argv[1], "allowed") == 0)
2088 allowed = 1;
2089
2090 control_class = atoi(argv[0]);
2091 if (control_class < 8)
2092 if (allowed)
2093 bts->si_common.rach_control.t3 &= ~(0x1 << control_class);
2094 else
2095 bts->si_common.rach_control.t3 |= (0x1 << control_class);
2096 else
2097 if (allowed)
2098 bts->si_common.rach_control.t2 &= ~(0x1 << (control_class - 8));
2099 else
2100 bts->si_common.rach_control.t2 |= (0x1 << (control_class - 8));
2101
2102 return CMD_SUCCESS;
2103}
2104
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002105DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
2106 "ms max power <0-40>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002107 "MS Options\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02002108 "Maximum transmit power of the MS\n"
2109 "Maximum transmit power of the MS\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002110 "Maximum transmit power of the MS in dBm")
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002111{
2112 struct gsm_bts *bts = vty->index;
2113
2114 bts->ms_max_power = atoi(argv[0]);
2115
2116 return CMD_SUCCESS;
2117}
2118
Harald Weltecfaabbb2012-08-16 23:23:50 +02002119#define CELL_STR "Cell Parameters\n"
2120
Harald Welte73225282009-12-12 18:17:25 +01002121DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
2122 "cell reselection hysteresis <0-14>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002123 CELL_STR "Cell re-selection parameters\n"
2124 "Cell Re-Selection Hysteresis in dB\n"
Harald Welte73225282009-12-12 18:17:25 +01002125 "Cell Re-Selection Hysteresis in dB")
2126{
2127 struct gsm_bts *bts = vty->index;
2128
2129 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
2130
2131 return CMD_SUCCESS;
2132}
2133
2134DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
2135 "rxlev access min <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002136 "Minimum RxLev needed for cell access\n"
2137 "Minimum RxLev needed for cell access\n"
2138 "Minimum RxLev needed for cell access\n"
Harald Welte73225282009-12-12 18:17:25 +01002139 "Minimum RxLev needed for cell access (better than -110dBm)")
2140{
2141 struct gsm_bts *bts = vty->index;
2142
2143 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
2144
2145 return CMD_SUCCESS;
2146}
2147
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002148DEFUN(cfg_bts_cell_bar_qualify, cfg_bts_cell_bar_qualify_cmd,
2149 "cell bar qualify (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002150 CELL_STR "Cell Bar Qualify\n" "Cell Bar Qualify\n"
2151 "Set CBQ to 0\n" "Set CBQ to 1\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002152{
2153 struct gsm_bts *bts = vty->index;
2154
2155 bts->si_common.cell_ro_sel_par.present = 1;
2156 bts->si_common.cell_ro_sel_par.cbq = atoi(argv[0]);
2157
2158 return CMD_SUCCESS;
2159}
2160
2161DEFUN(cfg_bts_cell_resel_ofs, cfg_bts_cell_resel_ofs_cmd,
2162 "cell reselection offset <0-126>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002163 CELL_STR "Cell Re-Selection Parameters\n"
2164 "Cell Re-Selection Offset (CRO) in dB\n"
2165 "Cell Re-Selection Offset (CRO) in dB\n"
2166 )
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002167{
2168 struct gsm_bts *bts = vty->index;
2169
2170 bts->si_common.cell_ro_sel_par.present = 1;
2171 bts->si_common.cell_ro_sel_par.cell_resel_off = atoi(argv[0])/2;
2172
2173 return CMD_SUCCESS;
2174}
2175
2176DEFUN(cfg_bts_temp_ofs, cfg_bts_temp_ofs_cmd,
2177 "temporary offset <0-60>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002178 "Cell selection temporary negative offset\n"
2179 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002180 "Cell selection temporary negative offset in dB")
2181{
2182 struct gsm_bts *bts = vty->index;
2183
2184 bts->si_common.cell_ro_sel_par.present = 1;
2185 bts->si_common.cell_ro_sel_par.temp_offs = atoi(argv[0])/10;
2186
2187 return CMD_SUCCESS;
2188}
2189
2190DEFUN(cfg_bts_temp_ofs_inf, cfg_bts_temp_ofs_inf_cmd,
2191 "temporary offset infinite",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002192 "Cell selection temporary negative offset\n"
2193 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002194 "Sets cell selection temporary negative offset to infinity")
2195{
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.temp_offs = 7;
2200
2201 return CMD_SUCCESS;
2202}
2203
2204DEFUN(cfg_bts_penalty_time, cfg_bts_penalty_time_cmd,
2205 "penalty time <20-620>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002206 "Cell selection penalty time\n"
2207 "Cell selection penalty time\n"
2208 "Cell selection penalty time in seconds (by 20s increments)\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002209{
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.penalty_time = (atoi(argv[0])-20)/20;
2214
2215 return CMD_SUCCESS;
2216}
2217
2218DEFUN(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd,
2219 "penalty time reserved",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002220 "Cell selection penalty time\n"
2221 "Cell selection penalty time\n"
2222 "Set cell selection penalty time to reserved value 31, "
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002223 "(indicate that CELL_RESELECT_OFFSET is subtracted from C2 "
2224 "and TEMPORARY_OFFSET is ignored)")
2225{
2226 struct gsm_bts *bts = vty->index;
2227
2228 bts->si_common.cell_ro_sel_par.present = 1;
2229 bts->si_common.cell_ro_sel_par.penalty_time = 31;
2230
2231 return CMD_SUCCESS;
2232}
2233
Harald Welte (local)efc92312009-08-14 23:09:25 +02002234DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
Daniel Willmann4d62d632012-12-27 00:02:01 +01002235 "periodic location update <6-1530>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002236 "Periodic Location Updating Interval\n"
2237 "Periodic Location Updating Interval\n"
2238 "Periodic Location Updating Interval\n"
2239 "Periodic Location Updating Interval in Minutes\n")
Harald Welte (local)efc92312009-08-14 23:09:25 +02002240{
2241 struct gsm_bts *bts = vty->index;
2242
Dieter Spaard6613e02010-10-05 21:10:55 +02002243 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
Harald Welte (local)efc92312009-08-14 23:09:25 +02002244
2245 return CMD_SUCCESS;
2246}
2247
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002248DEFUN(cfg_bts_no_per_loc_upd, cfg_bts_no_per_loc_upd_cmd,
2249 "no periodic location update",
2250 NO_STR
2251 "Periodic Location Updating Interval\n"
2252 "Periodic Location Updating Interval\n"
2253 "Periodic Location Updating Interval\n")
2254{
2255 struct gsm_bts *bts = vty->index;
2256
2257 bts->si_common.chan_desc.t3212 = 0;
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01002258
2259 return CMD_SUCCESS;
2260}
2261
2262DEFUN(cfg_bts_radio_link_timeout, cfg_bts_radio_link_timeout_cmd,
2263 "radio-link-timeout <4-64>",
2264 "Radio link timeout criterion (BTS side)\n"
2265 "Radio link timeout value (lost SACCH block)\n")
2266{
2267 struct gsm_bts *bts = vty->index;
2268
2269 set_radio_link_timeout(&bts->si_common.cell_options, atoi(argv[0]));
2270
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002271 return CMD_SUCCESS;
2272}
2273
Harald Welte8f0ed552010-05-11 21:53:49 +02002274#define GPRS_TEXT "GPRS Packet Network\n"
2275
Harald Welteaf387632010-03-14 23:30:30 +08002276DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welte57ba7e32010-04-18 14:00:26 +02002277 "gprs cell bvci <2-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002278 GPRS_TEXT
2279 "GPRS Cell Settings\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002280 "GPRS BSSGP VC Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002281 "GPRS BSSGP VC Identifier")
2282{
2283 struct gsm_bts *bts = vty->index;
2284
Harald Welte4511d892010-04-18 15:51:20 +02002285 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002286 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2287 return CMD_WARNING;
2288 }
2289
Harald Welte97a282b2010-03-14 15:37:43 +08002290 bts->gprs.cell.bvci = atoi(argv[0]);
2291
2292 return CMD_SUCCESS;
2293}
2294
Harald Weltea5731cf2010-03-22 11:48:36 +08002295DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
2296 "gprs nsei <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002297 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002298 "GPRS NS Entity Identifier\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002299 "GPRS NS Entity Identifier")
2300{
2301 struct gsm_bts *bts = vty->index;
2302
Harald Welte4511d892010-04-18 15:51:20 +02002303 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltea5731cf2010-03-22 11:48:36 +08002304 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2305 return CMD_WARNING;
2306 }
2307
2308 bts->gprs.nse.nsei = atoi(argv[0]);
2309
2310 return CMD_SUCCESS;
2311}
2312
Harald Welte8f0ed552010-05-11 21:53:49 +02002313#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
2314 "NSVC Logical Number\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002315
Harald Welte97a282b2010-03-14 15:37:43 +08002316DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
2317 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002318 GPRS_TEXT NSVC_TEXT
2319 "NS Virtual Connection Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002320 "GPRS NS VC Identifier")
2321{
2322 struct gsm_bts *bts = vty->index;
2323 int idx = atoi(argv[0]);
2324
Harald Welte4511d892010-04-18 15:51:20 +02002325 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002326 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2327 return CMD_WARNING;
2328 }
2329
Harald Welte97a282b2010-03-14 15:37:43 +08002330 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
2331
2332 return CMD_SUCCESS;
2333}
2334
Harald Welteaf387632010-03-14 23:30:30 +08002335DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
2336 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002337 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002338 "GPRS NS Local UDP Port\n"
2339 "GPRS NS Local UDP Port\n"
2340 "GPRS NS Local UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002341 "GPRS NS Local UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002342{
2343 struct gsm_bts *bts = vty->index;
2344 int idx = atoi(argv[0]);
2345
Harald Welte4511d892010-04-18 15:51:20 +02002346 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002347 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2348 return CMD_WARNING;
2349 }
2350
Harald Welteaf387632010-03-14 23:30:30 +08002351 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
2352
2353 return CMD_SUCCESS;
2354}
2355
2356DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
2357 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002358 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002359 "GPRS NS Remote UDP Port\n"
2360 "GPRS NS Remote UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002361 "GPRS NS Remote UDP Port\n"
2362 "GPRS NS Remote UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002363{
2364 struct gsm_bts *bts = vty->index;
2365 int idx = atoi(argv[0]);
2366
Harald Welte4511d892010-04-18 15:51:20 +02002367 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002368 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2369 return CMD_WARNING;
2370 }
2371
Harald Welteaf387632010-03-14 23:30:30 +08002372 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
2373
2374 return CMD_SUCCESS;
2375}
2376
2377DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
2378 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte8f0ed552010-05-11 21:53:49 +02002379 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002380 "GPRS NS Remote IP Address\n"
2381 "GPRS NS Remote IP Address\n"
2382 "GPRS NS Remote IP Address\n")
Harald Welteaf387632010-03-14 23:30:30 +08002383{
2384 struct gsm_bts *bts = vty->index;
2385 int idx = atoi(argv[0]);
2386 struct in_addr ia;
2387
Harald Welte4511d892010-04-18 15:51:20 +02002388 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002389 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2390 return CMD_WARNING;
2391 }
2392
Harald Welteaf387632010-03-14 23:30:30 +08002393 inet_aton(argv[1], &ia);
2394 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
2395
2396 return CMD_SUCCESS;
2397}
2398
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002399DEFUN(cfg_bts_pag_free, cfg_bts_pag_free_cmd,
Harald Weltecfaabbb2012-08-16 23:23:50 +02002400 "paging free <-1-1024>",
2401 "Paging options\n"
2402 "Only page when having a certain amount of free slots\n"
2403 "amount of required free paging slots. -1 to disable\n")
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002404{
2405 struct gsm_bts *bts = vty->index;
2406
2407 bts->paging.free_chans_need = atoi(argv[0]);
2408 return CMD_SUCCESS;
2409}
2410
Harald Welte615e9562010-05-11 23:50:21 +02002411DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
2412 "gprs ns timer " NS_TIMERS " <0-255>",
2413 GPRS_TEXT "Network Service\n"
2414 "Network Service Timer\n"
2415 NS_TIMERS_HELP "Timer Value\n")
2416{
2417 struct gsm_bts *bts = vty->index;
2418 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
2419 int val = atoi(argv[1]);
2420
2421 if (bts->gprs.mode == BTS_GPRS_NONE) {
2422 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2423 return CMD_WARNING;
2424 }
2425
2426 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
2427 return CMD_WARNING;
2428
2429 bts->gprs.nse.timer[idx] = val;
2430
2431 return CMD_SUCCESS;
2432}
2433
2434#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 +02002435#define BSSGP_TIMERS_HELP \
2436 "Tbvc-block timeout\n" \
2437 "Tbvc-block retries\n" \
2438 "Tbvc-unblock retries\n" \
2439 "Tbvcc-reset timeout\n" \
2440 "Tbvc-reset retries\n" \
2441 "Tbvc-suspend timeout\n" \
2442 "Tbvc-suspend retries\n" \
2443 "Tbvc-resume timeout\n" \
2444 "Tbvc-resume retries\n" \
2445 "Tbvc-capa-update timeout\n" \
2446 "Tbvc-capa-update retries\n"
Harald Welte615e9562010-05-11 23:50:21 +02002447
2448DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
2449 "gprs cell timer " BSSGP_TIMERS " <0-255>",
2450 GPRS_TEXT "Cell / BSSGP\n"
2451 "Cell/BSSGP Timer\n"
2452 BSSGP_TIMERS_HELP "Timer Value\n")
2453{
2454 struct gsm_bts *bts = vty->index;
2455 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
2456 int val = atoi(argv[1]);
2457
2458 if (bts->gprs.mode == BTS_GPRS_NONE) {
2459 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2460 return CMD_WARNING;
2461 }
2462
2463 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
2464 return CMD_WARNING;
2465
2466 bts->gprs.cell.timer[idx] = val;
2467
2468 return CMD_SUCCESS;
2469}
2470
Harald Welte97a282b2010-03-14 15:37:43 +08002471DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
2472 "gprs routing area <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002473 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002474 "GPRS Routing Area Code\n"
2475 "GPRS Routing Area Code\n"
2476 "GPRS Routing Area Code\n")
Harald Welte97a282b2010-03-14 15:37:43 +08002477{
2478 struct gsm_bts *bts = vty->index;
2479
Harald Welte4511d892010-04-18 15:51:20 +02002480 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002481 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2482 return CMD_WARNING;
2483 }
2484
Harald Welte97a282b2010-03-14 15:37:43 +08002485 bts->gprs.rac = atoi(argv[0]);
2486
2487 return CMD_SUCCESS;
2488}
2489
Max292ec582016-07-28 11:55:37 +02002490DEFUN(cfg_bts_gprs_ctrl_ack, cfg_bts_gprs_ctrl_ack_cmd,
2491 "gprs control-ack-type-rach", GPRS_TEXT
2492 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2493 "four access bursts format instead of default RLC/MAC control block\n")
2494{
2495 struct gsm_bts *bts = vty->index;
2496
2497 if (bts->gprs.mode == BTS_GPRS_NONE) {
2498 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2499 return CMD_WARNING;
2500 }
2501
2502 bts->gprs.ctrl_ack_type_use_block = false;
2503
2504 return CMD_SUCCESS;
2505}
2506
2507DEFUN(cfg_no_bts_gprs_ctrl_ack, cfg_no_bts_gprs_ctrl_ack_cmd,
2508 "no gprs control-ack-type-rach", NO_STR GPRS_TEXT
2509 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2510 "four access bursts format instead of default RLC/MAC control block\n")
2511{
2512 struct gsm_bts *bts = vty->index;
2513
2514 if (bts->gprs.mode == BTS_GPRS_NONE) {
2515 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2516 return CMD_WARNING;
2517 }
2518
2519 bts->gprs.ctrl_ack_type_use_block = true;
2520
2521 return CMD_SUCCESS;
2522}
2523
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01002524DEFUN(cfg_bts_gprs_net_ctrl_ord, cfg_bts_gprs_net_ctrl_ord_cmd,
2525 "gprs network-control-order (nc0|nc1|nc2)",
2526 GPRS_TEXT
2527 "GPRS Network Control Order\n"
2528 "MS controlled cell re-selection, no measurement reporting\n"
2529 "MS controlled cell re-selection, MS sends measurement reports\n"
2530 "Network controlled cell re-selection, MS sends measurement reports\n")
2531{
2532 struct gsm_bts *bts = vty->index;
2533
2534 if (bts->gprs.mode == BTS_GPRS_NONE) {
2535 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2536 return CMD_WARNING;
2537 }
2538
2539 bts->gprs.net_ctrl_ord = atoi(argv[0] + 2);
2540
2541 return CMD_SUCCESS;
2542}
2543
Harald Welte4511d892010-04-18 15:51:20 +02002544DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
2545 "gprs mode (none|gprs|egprs)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002546 GPRS_TEXT
2547 "GPRS Mode for this BTS\n"
2548 "GPRS Disabled on this BTS\n"
2549 "GPRS Enabled on this BTS\n"
2550 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welteaf387632010-03-14 23:30:30 +08002551{
2552 struct gsm_bts *bts = vty->index;
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002553 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0], NULL);
Harald Welteaf387632010-03-14 23:30:30 +08002554
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002555 if (!bts_gprs_mode_is_compat(bts, mode)) {
Harald Weltef3d8e922010-06-14 22:44:42 +02002556 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2557 VTY_NEWLINE);
2558 return CMD_WARNING;
2559 }
2560
2561 bts->gprs.mode = mode;
Harald Welteaf387632010-03-14 23:30:30 +08002562
2563 return CMD_SUCCESS;
2564}
2565
bhargava350533c2016-07-21 11:14:34 +05302566DEFUN(cfg_bts_gprs_11bit_rach_support_for_egprs,
2567 cfg_bts_gprs_11bit_rach_support_for_egprs_cmd,
2568 "gprs 11bit_rach_support_for_egprs (0|1)",
2569 GPRS_TEXT "11 bit RACH options\n"
2570 "Disable 11 bit RACH for EGPRS\n"
2571 "Enable 11 bit RACH for EGPRS")
2572{
2573 struct gsm_bts *bts = vty->index;
2574
2575 bts->gprs.supports_egprs_11bit_rach = atoi(argv[0]);
2576
2577 if (bts->gprs.supports_egprs_11bit_rach > 1) {
2578 vty_out(vty, "Error in RACH type%s", VTY_NEWLINE);
2579 return CMD_WARNING;
2580 }
2581
2582 if ((bts->gprs.mode == BTS_GPRS_NONE) &&
2583 (bts->gprs.supports_egprs_11bit_rach == 1)) {
2584 vty_out(vty, "Error:gprs mode is none and 11bit rach is"
2585 " enabled%s", VTY_NEWLINE);
2586 return CMD_WARNING;
2587 }
2588
2589 return CMD_SUCCESS;
2590}
2591
Harald Welte9fbff4a2010-07-30 11:50:09 +02002592#define SI_TEXT "System Information Messages\n"
2593#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)"
2594#define SI_TYPE_HELP "System Information Type 1\n" \
2595 "System Information Type 2\n" \
2596 "System Information Type 3\n" \
2597 "System Information Type 4\n" \
2598 "System Information Type 5\n" \
2599 "System Information Type 6\n" \
2600 "System Information Type 7\n" \
2601 "System Information Type 8\n" \
2602 "System Information Type 9\n" \
2603 "System Information Type 10\n" \
2604 "System Information Type 13\n" \
2605 "System Information Type 16\n" \
2606 "System Information Type 17\n" \
2607 "System Information Type 18\n" \
2608 "System Information Type 19\n" \
2609 "System Information Type 20\n" \
2610 "System Information Type 2bis\n" \
2611 "System Information Type 2ter\n" \
2612 "System Information Type 2quater\n" \
2613 "System Information Type 5bis\n" \
2614 "System Information Type 5ter\n"
2615
2616DEFUN(cfg_bts_si_mode, cfg_bts_si_mode_cmd,
2617 "system-information " SI_TYPE_TEXT " mode (static|computed)",
2618 SI_TEXT SI_TYPE_HELP
2619 "System Information Mode\n"
2620 "Static user-specified\n"
2621 "Dynamic, BSC-computed\n")
2622{
2623 struct gsm_bts *bts = vty->index;
2624 int type;
2625
2626 type = get_string_value(osmo_sitype_strs, argv[0]);
2627 if (type < 0) {
2628 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2629 return CMD_WARNING;
2630 }
2631
2632 if (!strcmp(argv[1], "static"))
2633 bts->si_mode_static |= (1 << type);
2634 else
2635 bts->si_mode_static &= ~(1 << type);
2636
2637 return CMD_SUCCESS;
2638}
2639
2640DEFUN(cfg_bts_si_static, cfg_bts_si_static_cmd,
2641 "system-information " SI_TYPE_TEXT " static HEXSTRING",
2642 SI_TEXT SI_TYPE_HELP
2643 "Static System Information filling\n"
2644 "Static user-specified SI content in HEX notation\n")
2645{
2646 struct gsm_bts *bts = vty->index;
2647 int rc, type;
2648
2649 type = get_string_value(osmo_sitype_strs, argv[0]);
2650 if (type < 0) {
2651 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2652 return CMD_WARNING;
2653 }
2654
2655 if (!(bts->si_mode_static & (1 << type))) {
2656 vty_out(vty, "SI Type %s is not configured in static mode%s",
2657 get_value_string(osmo_sitype_strs, type), VTY_NEWLINE);
2658 return CMD_WARNING;
2659 }
2660
Harald Welte290aaed2010-07-30 11:53:18 +02002661 /* Fill buffer with padding pattern */
2662 memset(bts->si_buf[type], 0x2b, sizeof(bts->si_buf[type]));
2663
2664 /* Parse the user-specified SI in hex format, [partially] overwriting padding */
Pablo Neira Ayusoc0d17f22011-05-07 12:12:48 +02002665 rc = osmo_hexparse(argv[1], bts->si_buf[type], sizeof(bts->si_buf[0]));
Harald Welte9fbff4a2010-07-30 11:50:09 +02002666 if (rc < 0 || rc > sizeof(bts->si_buf[0])) {
2667 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
2668 return CMD_WARNING;
2669 }
2670
2671 /* Mark this SI as present */
2672 bts->si_valid |= (1 << type);
2673
2674 return CMD_SUCCESS;
2675}
2676
Harald Welte32c09622011-01-11 23:44:56 +01002677DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
Harald Welte64c07d22011-02-15 11:43:27 +01002678 "neighbor-list mode (automatic|manual|manual-si5)",
Harald Welte32c09622011-01-11 23:44:56 +01002679 "Neighbor List\n" "Mode of Neighbor List generation\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002680 "Automatically from all BTS in this OpenBSC\n" "Manual\n"
2681 "Manual with different lists for SI2 and SI5\n")
Harald Welte32c09622011-01-11 23:44:56 +01002682{
2683 struct gsm_bts *bts = vty->index;
Harald Welte64c07d22011-02-15 11:43:27 +01002684 int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
Harald Welte32c09622011-01-11 23:44:56 +01002685
Harald Welte64c07d22011-02-15 11:43:27 +01002686 switch (mode) {
2687 case NL_MODE_MANUAL_SI5SEP:
2688 case NL_MODE_MANUAL:
Harald Welte32c09622011-01-11 23:44:56 +01002689 /* make sure we clear the current list when switching to
2690 * manual mode */
2691 if (bts->neigh_list_manual_mode == 0)
2692 memset(&bts->si_common.data.neigh_list, 0,
2693 sizeof(bts->si_common.data.neigh_list));
Harald Welte64c07d22011-02-15 11:43:27 +01002694 break;
2695 default:
2696 break;
2697 }
2698
2699 bts->neigh_list_manual_mode = mode;
Harald Welte32c09622011-01-11 23:44:56 +01002700
2701 return CMD_SUCCESS;
2702}
2703
2704DEFUN(cfg_bts_neigh, cfg_bts_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002705 "neighbor-list (add|del) arfcn <0-1023>",
Harald Welte32c09622011-01-11 23:44:56 +01002706 "Neighbor List\n" "Add to manual neighbor list\n"
2707 "Delete from manual neighbor list\n" "ARFCN of neighbor\n"
2708 "ARFCN of neighbor\n")
2709{
2710 struct gsm_bts *bts = vty->index;
2711 struct bitvec *bv = &bts->si_common.neigh_list;
2712 uint16_t arfcn = atoi(argv[1]);
2713
2714 if (!bts->neigh_list_manual_mode) {
2715 vty_out(vty, "%% Cannot configure neighbor list in "
2716 "automatic mode%s", VTY_NEWLINE);
2717 return CMD_WARNING;
2718 }
2719
2720 if (!strcmp(argv[0], "add"))
2721 bitvec_set_bit_pos(bv, arfcn, 1);
2722 else
2723 bitvec_set_bit_pos(bv, arfcn, 0);
2724
2725 return CMD_SUCCESS;
2726}
2727
Max35697b92016-04-29 12:51:31 +02002728
Max59a1bf32016-04-15 16:04:46 +02002729DEFUN(cfg_bts_si2quater_neigh_add, cfg_bts_si2quater_neigh_add_cmd,
Max35697b92016-04-29 12:51:31 +02002730 "si2quater neighbor-list add earfcn <0-65535> threshold <0-31> "
2731 "[<0-7>]", "SI2quater Neighbor List\n"
Max59a1bf32016-04-15 16:04:46 +02002732 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
2733 "EARFCN of neighbor\n" "EARFCN of neighbor\n" "threshold high bits\n"
2734 "threshold high bits\n" "measurement bandwidth\n")
2735{
2736 struct gsm_bts *bts = vty->index;
2737 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
2738 uint16_t arfcn = atoi(argv[0]);
2739 uint8_t meas = OSMO_EARFCN_MEAS_INVALID, thresh = atoi(argv[1]);
2740 int r;
2741
2742 if (3 == argc)
2743 meas = atoi(argv[2]);
2744
2745 r = osmo_earfcn_add(e, arfcn, meas);
2746
2747 if (r < 0) {
2748 vty_out(vty, "Unable to add arfcn %u: %s%s", arfcn, strerror(r),
2749 VTY_NEWLINE);
2750 return CMD_WARNING;
2751 }
Maxaafff962016-04-20 15:57:14 +02002752 if (si2q_size_check(bts)) {
2753 if (e->thresh_hi && thresh != e->thresh_hi)
2754 vty_out(vty, "Warning: multiple thresholds are not "
2755 "supported, overriding previous threshold %u%s",
2756 e->thresh_hi, VTY_NEWLINE);
Max59a1bf32016-04-15 16:04:46 +02002757
Maxaafff962016-04-20 15:57:14 +02002758 e->thresh_hi = thresh;
2759 return CMD_SUCCESS;
2760 }
2761 vty_out(vty, "Warning: not enough space in si2quater for a given arfcn%s"
2762 , VTY_NEWLINE);
2763 osmo_earfcn_del(e, arfcn);
2764 return CMD_WARNING;
Max59a1bf32016-04-15 16:04:46 +02002765}
2766
2767DEFUN(cfg_bts_si2quater_neigh_del, cfg_bts_si2quater_neigh_del_cmd,
Max35697b92016-04-29 12:51:31 +02002768 "si2quater neighbor-list del earfcn <0-65535>",
Max59a1bf32016-04-15 16:04:46 +02002769 "SI2quater Neighbor List\n"
2770 "SI2quater Neighbor List\n"
2771 "Delete from SI2quater manual neighbor list\n"
Max36212f22016-04-20 12:06:05 +02002772 "EARFCN of neighbor\n"
2773 "EARFCN\n")
Max59a1bf32016-04-15 16:04:46 +02002774{
2775 struct gsm_bts *bts = vty->index;
2776 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
Max0c1bc262016-04-20 12:06:06 +02002777 uint16_t arfcn = atoi(argv[0]);
Max59a1bf32016-04-15 16:04:46 +02002778 int r = osmo_earfcn_del(e, arfcn);
2779 if (r < 0) {
2780 vty_out(vty, "Unable to delete arfcn %u: %s%s", arfcn,
Max0c1bc262016-04-20 12:06:06 +02002781 strerror(-r), VTY_NEWLINE);
Max59a1bf32016-04-15 16:04:46 +02002782 return CMD_WARNING;
2783 }
2784
2785 return CMD_SUCCESS;
2786}
2787
Max26679e02016-04-20 15:57:13 +02002788DEFUN(cfg_bts_si2quater_uarfcn_add, cfg_bts_si2quater_uarfcn_add_cmd,
Max35697b92016-04-29 12:51:31 +02002789 "si2quater neighbor-list add uarfcn <0-16383> <0-511> <0-1>",
Max26679e02016-04-20 15:57:13 +02002790 "SI2quater Neighbor List\n"
2791 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
2792 "UARFCN of neighbor\n" "UARFCN of neighbor\n" "scrambling code\n"
2793 "diversity bit\n")
2794{
2795 struct gsm_bts *bts = vty->index;
2796 uint16_t arfcn = atoi(argv[0]), scramble = atoi(argv[1]);
2797
2798 switch(bts_uarfcn_add(bts, arfcn, scramble, atoi(argv[2]))) {
2799 case -ENOMEM:
2800 vty_out(vty, "Unable to add arfcn: max number of UARFCNs (%u) "
2801 "reached%s", MAX_EARFCN_LIST, VTY_NEWLINE);
Maxaafff962016-04-20 15:57:14 +02002802 case -ENOSPC:
2803 vty_out(vty, "Warning: not enough space in si2quater for a "
2804 "given arfcn%s", VTY_NEWLINE);
Max26679e02016-04-20 15:57:13 +02002805 case -EADDRINUSE:
2806 vty_out(vty, "Unable to add arfcn: (%u, %u) is already added%s",
2807 arfcn, scramble, VTY_NEWLINE);
2808 return CMD_WARNING;
2809 }
2810
2811 return CMD_SUCCESS;
2812}
2813
2814DEFUN(cfg_bts_si2quater_uarfcn_del, cfg_bts_si2quater_uarfcn_del_cmd,
Max35697b92016-04-29 12:51:31 +02002815 "si2quater neighbor-list del uarfcn <0-16383> <0-511>",
Max26679e02016-04-20 15:57:13 +02002816 "SI2quater Neighbor List\n"
2817 "SI2quater Neighbor List\n"
2818 "Delete from SI2quater manual neighbor list\n"
2819 "UARFCN of neighbor\n"
2820 "UARFCN\n"
2821 "scrambling code\n")
2822{
2823 struct gsm_bts *bts = vty->index;
2824
2825 if (bts_uarfcn_del(bts, atoi(argv[0]), atoi(argv[1])) < 0) {
2826 vty_out(vty, "Unable to delete uarfcn: pair not found%s",
2827 VTY_NEWLINE);
2828 return CMD_WARNING;
2829 }
2830
2831 return CMD_SUCCESS;
2832}
2833
Harald Welte64c07d22011-02-15 11:43:27 +01002834DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002835 "si5 neighbor-list (add|del) arfcn <0-1023>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002836 "SI5 Neighbor List\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002837 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
2838 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
2839 "ARFCN of neighbor\n")
2840{
2841 struct gsm_bts *bts = vty->index;
2842 struct bitvec *bv = &bts->si_common.si5_neigh_list;
2843 uint16_t arfcn = atoi(argv[1]);
2844
2845 if (!bts->neigh_list_manual_mode) {
2846 vty_out(vty, "%% Cannot configure neighbor list in "
2847 "automatic mode%s", VTY_NEWLINE);
2848 return CMD_WARNING;
2849 }
2850
2851 if (!strcmp(argv[0], "add"))
2852 bitvec_set_bit_pos(bv, arfcn, 1);
2853 else
2854 bitvec_set_bit_pos(bv, arfcn, 0);
2855
2856 return CMD_SUCCESS;
2857}
Harald Welte9fbff4a2010-07-30 11:50:09 +02002858
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02002859#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
2860
2861DEFUN(cfg_bts_excl_rf_lock,
2862 cfg_bts_excl_rf_lock_cmd,
2863 "rf-lock-exclude",
2864 EXCL_RFLOCK_STR)
2865{
2866 struct gsm_bts *bts = vty->index;
2867 bts->excl_from_rf_lock = 1;
2868 return CMD_SUCCESS;
2869}
2870
2871DEFUN(cfg_bts_no_excl_rf_lock,
2872 cfg_bts_no_excl_rf_lock_cmd,
2873 "no rf-lock-exclude",
2874 NO_STR EXCL_RFLOCK_STR)
2875{
2876 struct gsm_bts *bts = vty->index;
2877 bts->excl_from_rf_lock = 0;
2878 return CMD_SUCCESS;
2879}
2880
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01002881#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
2882
2883DEFUN(cfg_bts_force_comb_si,
2884 cfg_bts_force_comb_si_cmd,
2885 "force-combined-si",
2886 FORCE_COMB_SI_STR)
2887{
2888 struct gsm_bts *bts = vty->index;
2889 bts->force_combined_si = 1;
2890 return CMD_SUCCESS;
2891}
2892
2893DEFUN(cfg_bts_no_force_comb_si,
2894 cfg_bts_no_force_comb_si_cmd,
2895 "no force-combined-si",
2896 NO_STR FORCE_COMB_SI_STR)
2897{
2898 struct gsm_bts *bts = vty->index;
2899 bts->force_combined_si = 0;
2900 return CMD_SUCCESS;
2901}
2902
Andreas Eversberga83d5112013-12-07 18:32:28 +01002903static void _get_codec_from_arg(struct vty *vty, int argc, const char *argv[])
2904{
2905 struct gsm_bts *bts = vty->index;
2906 struct bts_codec_conf *codec = &bts->codec;
2907 int i;
2908
2909 codec->hr = 0;
2910 codec->efr = 0;
2911 codec->amr = 0;
2912 for (i = 0; i < argc; i++) {
2913 if (!strcmp(argv[i], "hr"))
2914 codec->hr = 1;
2915 if (!strcmp(argv[i], "efr"))
2916 codec->efr = 1;
2917 if (!strcmp(argv[i], "amr"))
2918 codec->amr = 1;
2919 }
2920}
2921
2922#define CODEC_PAR_STR " (hr|efr|amr)"
2923#define CODEC_HELP_STR "Half Rate\n" \
2924 "Enhanced Full Rate\nAdaptive Multirate\n"
2925
2926DEFUN(cfg_bts_codec0, cfg_bts_codec0_cmd,
2927 "codec-support fr",
2928 "Codec Support settings\nFullrate\n")
2929{
2930 _get_codec_from_arg(vty, 0, argv);
2931 return CMD_SUCCESS;
2932}
2933
2934DEFUN(cfg_bts_codec1, cfg_bts_codec1_cmd,
2935 "codec-support fr" CODEC_PAR_STR,
2936 "Codec Support settings\nFullrate\n"
2937 CODEC_HELP_STR)
2938{
2939 _get_codec_from_arg(vty, 1, argv);
2940 return CMD_SUCCESS;
2941}
2942
2943DEFUN(cfg_bts_codec2, cfg_bts_codec2_cmd,
2944 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR,
2945 "Codec Support settings\nFullrate\n"
2946 CODEC_HELP_STR CODEC_HELP_STR)
2947{
2948 _get_codec_from_arg(vty, 2, argv);
2949 return CMD_SUCCESS;
2950}
2951
2952DEFUN(cfg_bts_codec3, cfg_bts_codec3_cmd,
2953 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
2954 "Codec Support settings\nFullrate\n"
2955 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
2956{
2957 _get_codec_from_arg(vty, 3, argv);
2958 return CMD_SUCCESS;
2959}
2960
2961DEFUN(cfg_bts_codec4, cfg_bts_codec4_cmd,
2962 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
2963 "Codec Support settings\nFullrate\n"
2964 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
2965{
2966 _get_codec_from_arg(vty, 4, argv);
2967 return CMD_SUCCESS;
2968}
2969
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01002970DEFUN(cfg_bts_depends_on, cfg_bts_depends_on_cmd,
2971 "depends-on-bts <0-255>",
2972 "This BTS can only be started if another one is up\n" "BTS Number\n")
2973{
2974 struct gsm_bts *bts = vty->index;
2975 struct gsm_bts *other_bts;
2976 int dep = atoi(argv[0]);
2977
2978
2979 if (!is_ipaccess_bts(bts)) {
2980 vty_out(vty, "This feature is only available for IP systems.%s",
2981 VTY_NEWLINE);
2982 return CMD_WARNING;
2983 }
2984
2985 other_bts = gsm_bts_num(bts->network, dep);
2986 if (!other_bts || !is_ipaccess_bts(other_bts)) {
2987 vty_out(vty, "This feature is only available for IP systems.%s",
2988 VTY_NEWLINE);
2989 return CMD_WARNING;
2990 }
2991
2992 if (dep >= bts->nr) {
2993 vty_out(vty, "%%Need to depend on an already declared unit.%s",
2994 VTY_NEWLINE);
2995 return CMD_WARNING;
2996 }
2997
2998 bts_depend_mark(bts, dep);
2999 return CMD_SUCCESS;
3000}
3001
3002DEFUN(cfg_bts_no_depends_on, cfg_bts_no_depends_on_cmd,
3003 "depeneds-on-bts <0-255>",
3004 NO_STR "This BTS can only be started if another one is up\n"
3005 "BTS Number\n")
3006{
3007 struct gsm_bts *bts = vty->index;
3008 int dep = atoi(argv[0]);
3009
3010 bts_depend_clear(bts, dep);
3011 return CMD_SUCCESS;
3012}
3013
Andreas Eversberg73266522014-01-19 11:47:44 +01003014#define AMR_TEXT "Adaptive Multi Rate settings\n"
3015#define AMR_MODE_TEXT "Codec modes to use with AMR codec\n"
3016#define AMR_START_TEXT "Initial codec to use with AMR\n" \
3017 "Automatically\nFirst codec\nSecond codec\nThird codec\nFourth codec\n"
3018#define AMR_TH_TEXT "AMR threshold between codecs\nMS side\nBTS side\n"
3019#define AMR_HY_TEXT "AMR hysteresis between codecs\nMS side\nBTS side\n"
3020
3021static void get_amr_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3022{
3023 struct gsm_bts *bts = vty->index;
3024 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3025 struct gsm48_multi_rate_conf *mr_conf =
3026 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3027 int i;
3028
3029 mr->gsm48_ie[1] = 0;
3030 for (i = 0; i < argc; i++)
3031 mr->gsm48_ie[1] |= 1 << atoi(argv[i]);
3032 mr_conf->icmi = 0;
3033}
3034
3035static void get_amr_th_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3036{
3037 struct gsm_bts *bts = vty->index;
3038 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003039 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003040 int i;
3041
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003042 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3043 for (i = 0; i < argc - 1; i++)
3044 modes[i].threshold = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003045}
3046
3047static void get_amr_hy_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3048{
3049 struct gsm_bts *bts = vty->index;
3050 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003051 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003052 int i;
3053
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003054 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3055 for (i = 0; i < argc - 1; i++)
3056 modes[i].hysteresis = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003057}
3058
3059static void get_amr_start_from_arg(struct vty *vty, const char *argv[], int full)
3060{
3061 struct gsm_bts *bts = vty->index;
3062 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3063 struct gsm48_multi_rate_conf *mr_conf =
3064 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3065 int num = 0, i;
3066
3067 for (i = 0; i < ((full) ? 8 : 6); i++) {
3068 if ((mr->gsm48_ie[1] & (1 << i))) {
3069 num++;
3070 }
3071 }
3072
3073 if (argv[0][0] == 'a' || num == 0)
3074 mr_conf->icmi = 0;
3075 else {
3076 mr_conf->icmi = 1;
3077 if (num < atoi(argv[0]))
3078 mr_conf->smod = num - 1;
3079 else
3080 mr_conf->smod = atoi(argv[0]) - 1;
3081 }
3082}
3083
3084#define AMR_TCHF_PAR_STR " (0|1|2|3|4|5|6|7)"
3085#define AMR_TCHF_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n" \
3086 "10,2k\n12,2k\n"
3087
3088#define AMR_TCHH_PAR_STR " (0|1|2|3|4|5)"
3089#define AMR_TCHH_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n"
3090
3091#define AMR_TH_HELP_STR "Threshold between codec 1 and 2\n"
3092#define AMR_HY_HELP_STR "Hysteresis between codec 1 and 2\n"
3093
3094DEFUN(cfg_bts_amr_fr_modes1, cfg_bts_amr_fr_modes1_cmd,
3095 "amr tch-f modes" AMR_TCHF_PAR_STR,
3096 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3097 AMR_TCHF_HELP_STR)
3098{
3099 get_amr_from_arg(vty, 1, argv, 1);
3100 return CMD_SUCCESS;
3101}
3102
3103DEFUN(cfg_bts_amr_fr_modes2, cfg_bts_amr_fr_modes2_cmd,
3104 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3105 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3106 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3107{
3108 get_amr_from_arg(vty, 2, argv, 1);
3109 return CMD_SUCCESS;
3110}
3111
3112DEFUN(cfg_bts_amr_fr_modes3, cfg_bts_amr_fr_modes3_cmd,
3113 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3114 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3115 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3116{
3117 get_amr_from_arg(vty, 3, argv, 1);
3118 return CMD_SUCCESS;
3119}
3120
3121DEFUN(cfg_bts_amr_fr_modes4, cfg_bts_amr_fr_modes4_cmd,
3122 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3123 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3124 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3125{
3126 get_amr_from_arg(vty, 4, argv, 1);
3127 return CMD_SUCCESS;
3128}
3129
3130DEFUN(cfg_bts_amr_fr_start_mode, cfg_bts_amr_fr_start_mode_cmd,
3131 "amr tch-f start-mode (auto|1|2|3|4)",
3132 AMR_TEXT "Full Rate\n" AMR_START_TEXT)
3133{
3134 get_amr_start_from_arg(vty, argv, 1);
3135 return CMD_SUCCESS;
3136}
3137
3138DEFUN(cfg_bts_amr_fr_thres1, cfg_bts_amr_fr_thres1_cmd,
3139 "amr tch-f threshold (ms|bts) <0-63>",
3140 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3141 AMR_TH_HELP_STR)
3142{
3143 get_amr_th_from_arg(vty, 2, argv, 1);
3144 return CMD_SUCCESS;
3145}
3146
3147DEFUN(cfg_bts_amr_fr_thres2, cfg_bts_amr_fr_thres2_cmd,
3148 "amr tch-f threshold (ms|bts) <0-63> <0-63>",
3149 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3150 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3151{
3152 get_amr_th_from_arg(vty, 3, argv, 1);
3153 return CMD_SUCCESS;
3154}
3155
3156DEFUN(cfg_bts_amr_fr_thres3, cfg_bts_amr_fr_thres3_cmd,
3157 "amr tch-f threshold (ms|bts) <0-63> <0-63> <0-63>",
3158 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3159 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3160{
3161 get_amr_th_from_arg(vty, 4, argv, 1);
3162 return CMD_SUCCESS;
3163}
3164
3165DEFUN(cfg_bts_amr_fr_hyst1, cfg_bts_amr_fr_hyst1_cmd,
3166 "amr tch-f hysteresis (ms|bts) <0-15>",
3167 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3168 AMR_HY_HELP_STR)
3169{
3170 get_amr_hy_from_arg(vty, 2, argv, 1);
3171 return CMD_SUCCESS;
3172}
3173
3174DEFUN(cfg_bts_amr_fr_hyst2, cfg_bts_amr_fr_hyst2_cmd,
3175 "amr tch-f hysteresis (ms|bts) <0-15> <0-15>",
3176 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3177 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3178{
3179 get_amr_hy_from_arg(vty, 3, argv, 1);
3180 return CMD_SUCCESS;
3181}
3182
3183DEFUN(cfg_bts_amr_fr_hyst3, cfg_bts_amr_fr_hyst3_cmd,
3184 "amr tch-f hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3185 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3186 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3187{
3188 get_amr_hy_from_arg(vty, 4, argv, 1);
3189 return CMD_SUCCESS;
3190}
3191
3192DEFUN(cfg_bts_amr_hr_modes1, cfg_bts_amr_hr_modes1_cmd,
3193 "amr tch-h modes" AMR_TCHH_PAR_STR,
3194 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3195 AMR_TCHH_HELP_STR)
3196{
3197 get_amr_from_arg(vty, 1, argv, 0);
3198 return CMD_SUCCESS;
3199}
3200
3201DEFUN(cfg_bts_amr_hr_modes2, cfg_bts_amr_hr_modes2_cmd,
3202 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3203 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3204 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3205{
3206 get_amr_from_arg(vty, 2, argv, 0);
3207 return CMD_SUCCESS;
3208}
3209
3210DEFUN(cfg_bts_amr_hr_modes3, cfg_bts_amr_hr_modes3_cmd,
3211 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3212 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3213 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3214{
3215 get_amr_from_arg(vty, 3, argv, 0);
3216 return CMD_SUCCESS;
3217}
3218
3219DEFUN(cfg_bts_amr_hr_modes4, cfg_bts_amr_hr_modes4_cmd,
3220 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3221 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3222 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3223{
3224 get_amr_from_arg(vty, 4, argv, 0);
3225 return CMD_SUCCESS;
3226}
3227
3228DEFUN(cfg_bts_amr_hr_start_mode, cfg_bts_amr_hr_start_mode_cmd,
3229 "amr tch-h start-mode (auto|1|2|3|4)",
3230 AMR_TEXT "Half Rate\n" AMR_START_TEXT)
3231{
3232 get_amr_start_from_arg(vty, argv, 0);
3233 return CMD_SUCCESS;
3234}
3235
3236DEFUN(cfg_bts_amr_hr_thres1, cfg_bts_amr_hr_thres1_cmd,
3237 "amr tch-h threshold (ms|bts) <0-63>",
3238 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3239 AMR_TH_HELP_STR)
3240{
3241 get_amr_th_from_arg(vty, 2, argv, 0);
3242 return CMD_SUCCESS;
3243}
3244
3245DEFUN(cfg_bts_amr_hr_thres2, cfg_bts_amr_hr_thres2_cmd,
3246 "amr tch-h threshold (ms|bts) <0-63> <0-63>",
3247 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3248 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3249{
3250 get_amr_th_from_arg(vty, 3, argv, 0);
3251 return CMD_SUCCESS;
3252}
3253
3254DEFUN(cfg_bts_amr_hr_thres3, cfg_bts_amr_hr_thres3_cmd,
3255 "amr tch-h threshold (ms|bts) <0-63> <0-63> <0-63>",
3256 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3257 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3258{
3259 get_amr_th_from_arg(vty, 4, argv, 0);
3260 return CMD_SUCCESS;
3261}
3262
3263DEFUN(cfg_bts_amr_hr_hyst1, cfg_bts_amr_hr_hyst1_cmd,
3264 "amr tch-h hysteresis (ms|bts) <0-15>",
3265 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3266 AMR_HY_HELP_STR)
3267{
3268 get_amr_hy_from_arg(vty, 2, argv, 0);
3269 return CMD_SUCCESS;
3270}
3271
3272DEFUN(cfg_bts_amr_hr_hyst2, cfg_bts_amr_hr_hyst2_cmd,
3273 "amr tch-h hysteresis (ms|bts) <0-15> <0-15>",
3274 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3275 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3276{
3277 get_amr_hy_from_arg(vty, 3, argv, 0);
3278 return CMD_SUCCESS;
3279}
3280
3281DEFUN(cfg_bts_amr_hr_hyst3, cfg_bts_amr_hr_hyst3_cmd,
3282 "amr tch-h hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3283 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3284 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3285{
3286 get_amr_hy_from_arg(vty, 4, argv, 0);
3287 return CMD_SUCCESS;
3288}
3289
Harald Welte8f0ed552010-05-11 21:53:49 +02003290#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02003291
Harald Welte5258fc42009-03-28 19:07:53 +00003292/* per TRX configuration */
3293DEFUN(cfg_trx,
3294 cfg_trx_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02003295 "trx <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02003296 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00003297 "Select a TRX to configure")
3298{
3299 int trx_nr = atoi(argv[0]);
3300 struct gsm_bts *bts = vty->index;
3301 struct gsm_bts_trx *trx;
3302
Harald Weltee441d9c2009-06-21 16:17:15 +02003303 if (trx_nr > bts->num_trx) {
3304 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
3305 bts->num_trx, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00003306 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02003307 } else if (trx_nr == bts->num_trx) {
3308 /* we need to allocate a new one */
3309 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003310 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02003311 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003312
Harald Weltee441d9c2009-06-21 16:17:15 +02003313 if (!trx)
3314 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00003315
3316 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02003317 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00003318 vty->node = TRX_NODE;
3319
3320 return CMD_SUCCESS;
3321}
3322
3323DEFUN(cfg_trx_arfcn,
3324 cfg_trx_arfcn_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01003325 "arfcn <0-1023>",
Harald Welte13fe2192012-08-17 09:57:25 +02003326 "Set the ARFCN for this TRX\n"
3327 "Absolute Radio Frequency Channel Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003328{
3329 int arfcn = atoi(argv[0]);
3330 struct gsm_bts_trx *trx = vty->index;
3331
3332 /* FIXME: check if this ARFCN is supported by this TRX */
3333
3334 trx->arfcn = arfcn;
3335
3336 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
3337 /* FIXME: use OML layer to update the ARFCN */
3338 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
3339
3340 return CMD_SUCCESS;
3341}
3342
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003343DEFUN(cfg_trx_nominal_power,
3344 cfg_trx_nominal_power_cmd,
3345 "nominal power <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003346 "Nominal TRX RF Power in dBm\n"
3347 "Nominal TRX RF Power in dBm\n"
3348 "Nominal TRX RF Power in dBm\n")
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003349{
3350 struct gsm_bts_trx *trx = vty->index;
3351
3352 trx->nominal_power = atoi(argv[0]);
3353
3354 return CMD_SUCCESS;
3355}
3356
Harald Weltefcd24452009-06-20 18:15:19 +02003357DEFUN(cfg_trx_max_power_red,
3358 cfg_trx_max_power_red_cmd,
3359 "max_power_red <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003360 "Reduction of maximum BS RF Power (relative to nominal power)\n"
Harald Weltefcd24452009-06-20 18:15:19 +02003361 "Reduction of maximum BS RF Power in dB\n")
3362{
3363 int maxpwr_r = atoi(argv[0]);
3364 struct gsm_bts_trx *trx = vty->index;
Harald Welte61a83b22009-11-18 09:20:22 +01003365 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-06-20 18:15:19 +02003366
3367 /* FIXME: check if our BTS type supports more than 12 */
3368 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
3369 vty_out(vty, "%% Power %d dB is not in the valid range%s",
3370 maxpwr_r, VTY_NEWLINE);
3371 return CMD_WARNING;
3372 }
3373 if (maxpwr_r & 1) {
3374 vty_out(vty, "%% Power %d dB is not an even value%s",
3375 maxpwr_r, VTY_NEWLINE);
3376 return CMD_WARNING;
3377 }
3378
3379 trx->max_power_red = maxpwr_r;
3380
3381 /* FIXME: make sure we update this using OML */
3382
3383 return CMD_SUCCESS;
3384}
3385
Harald Welte42581822009-08-08 16:12:58 +02003386DEFUN(cfg_trx_rsl_e1,
3387 cfg_trx_rsl_e1_cmd,
3388 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003389 "RSL Parameters\n"
3390 "E1/T1 interface to be used for RSL\n"
3391 "E1/T1 interface to be used for RSL\n"
3392 "E1/T1 Line Number to be used for RSL\n"
3393 "E1/T1 Timeslot to be used for RSL\n"
3394 "E1/T1 Timeslot to be used for RSL\n"
3395 "E1/T1 Sub-slot to be used for RSL\n"
3396 "E1/T1 Sub-slot 0 is to be used for RSL\n"
3397 "E1/T1 Sub-slot 1 is to be used for RSL\n"
3398 "E1/T1 Sub-slot 2 is to be used for RSL\n"
3399 "E1/T1 Sub-slot 3 is to be used for RSL\n"
3400 "E1/T1 full timeslot is to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003401{
3402 struct gsm_bts_trx *trx = vty->index;
3403
3404 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
3405
3406 return CMD_SUCCESS;
3407}
3408
3409DEFUN(cfg_trx_rsl_e1_tei,
3410 cfg_trx_rsl_e1_tei_cmd,
3411 "rsl e1 tei <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003412 "RSL Parameters\n"
3413 "Set the TEI to be used for RSL\n"
3414 "Set the TEI to be used for RSL\n"
3415 "TEI to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003416{
3417 struct gsm_bts_trx *trx = vty->index;
3418
3419 trx->rsl_tei = atoi(argv[0]);
3420
3421 return CMD_SUCCESS;
3422}
3423
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003424DEFUN(cfg_trx_rf_locked,
3425 cfg_trx_rf_locked_cmd,
3426 "rf_locked (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003427 "Set or unset the RF Locking (Turn off RF of the TRX)\n"
3428 "TRX is NOT RF locked (active)\n"
3429 "TRX is RF locked (turned off)\n")
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003430{
3431 int locked = atoi(argv[0]);
3432 struct gsm_bts_trx *trx = vty->index;
3433
3434 gsm_trx_lock_rf(trx, locked);
3435 return CMD_SUCCESS;
3436}
Harald Welte42581822009-08-08 16:12:58 +02003437
Harald Welte5258fc42009-03-28 19:07:53 +00003438/* per TS configuration */
3439DEFUN(cfg_ts,
3440 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003441 "timeslot <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003442 "Select a Timeslot to configure\n"
3443 "Timeslot number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003444{
3445 int ts_nr = atoi(argv[0]);
3446 struct gsm_bts_trx *trx = vty->index;
3447 struct gsm_bts_trx_ts *ts;
3448
3449 if (ts_nr >= TRX_NR_TS) {
3450 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
3451 TRX_NR_TS, VTY_NEWLINE);
3452 return CMD_WARNING;
3453 }
3454
3455 ts = &trx->ts[ts_nr];
3456
3457 vty->index = ts;
3458 vty->node = TS_NODE;
3459
3460 return CMD_SUCCESS;
3461}
3462
Harald Weltea6fd58e2009-08-07 00:25:23 +02003463DEFUN(cfg_ts_pchan,
3464 cfg_ts_pchan_cmd,
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003465 "phys_chan_config PCHAN", /* dynamically generated! */
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003466 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003467{
3468 struct gsm_bts_trx_ts *ts = vty->index;
3469 int pchanc;
3470
3471 pchanc = gsm_pchan_parse(argv[0]);
3472 if (pchanc < 0)
3473 return CMD_WARNING;
3474
3475 ts->pchan = pchanc;
3476
3477 return CMD_SUCCESS;
3478}
3479
3480/* used for backwards compatibility with old config files that still
3481 * have uppercase pchan type names */
3482DEFUN_HIDDEN(cfg_ts_pchan_compat,
3483 cfg_ts_pchan_compat_cmd,
Harald Weltea6fd58e2009-08-07 00:25:23 +02003484 "phys_chan_config PCHAN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003485 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003486{
3487 struct gsm_bts_trx_ts *ts = vty->index;
3488 int pchanc;
3489
3490 pchanc = gsm_pchan_parse(argv[0]);
3491 if (pchanc < 0)
3492 return CMD_WARNING;
3493
3494 ts->pchan = pchanc;
3495
3496 return CMD_SUCCESS;
3497}
3498
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003499
3500
Harald Welte135a6482011-05-30 12:09:13 +02003501DEFUN(cfg_ts_tsc,
3502 cfg_ts_tsc_cmd,
3503 "training_sequence_code <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003504 "Training Sequence Code of the Timeslot\n" "TSC\n")
Harald Welte135a6482011-05-30 12:09:13 +02003505{
3506 struct gsm_bts_trx_ts *ts = vty->index;
3507
Harald Welte903aaea2014-01-19 17:10:50 +01003508 if (!gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_MULTI_TSC)) {
3509 vty_out(vty, "%% This BTS does not support a TSC != BCC, "
3510 "falling back to BCC%s", VTY_NEWLINE);
3511 ts->tsc = -1;
3512 return CMD_WARNING;
3513 }
3514
Harald Welte135a6482011-05-30 12:09:13 +02003515 ts->tsc = atoi(argv[0]);
3516
3517 return CMD_SUCCESS;
3518}
3519
Harald Weltea39b0f22010-06-14 22:26:10 +02003520#define HOPPING_STR "Configure frequency hopping\n"
3521
3522DEFUN(cfg_ts_hopping,
3523 cfg_ts_hopping_cmd,
3524 "hopping enabled (0|1)",
3525 HOPPING_STR "Enable or disable frequency hopping\n"
3526 "Disable frequency hopping\n" "Enable frequency hopping\n")
3527{
3528 struct gsm_bts_trx_ts *ts = vty->index;
Harald Weltec2fb3d02010-06-14 22:47:37 +02003529 int enabled = atoi(argv[0]);
Harald Weltea39b0f22010-06-14 22:26:10 +02003530
Harald Weltec2fb3d02010-06-14 22:47:37 +02003531 if (enabled && !gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_HOPPING)) {
3532 vty_out(vty, "BTS model does not support hopping%s",
3533 VTY_NEWLINE);
3534 return CMD_WARNING;
3535 }
3536
3537 ts->hopping.enabled = enabled;
Harald Weltea39b0f22010-06-14 22:26:10 +02003538
3539 return CMD_SUCCESS;
3540}
3541
Harald Welte6e0cd042009-09-12 13:05:33 +02003542DEFUN(cfg_ts_hsn,
3543 cfg_ts_hsn_cmd,
Harald Weltea39b0f22010-06-14 22:26:10 +02003544 "hopping sequence-number <0-63>",
3545 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003546 "Which hopping sequence to use for this channel\n"
3547 "Hopping Sequence Number (HSN)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003548{
3549 struct gsm_bts_trx_ts *ts = vty->index;
3550
3551 ts->hopping.hsn = atoi(argv[0]);
3552
3553 return CMD_SUCCESS;
3554}
3555
3556DEFUN(cfg_ts_maio,
3557 cfg_ts_maio_cmd,
3558 "hopping maio <0-63>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003559 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003560 "Which hopping MAIO to use for this channel\n"
3561 "Mobile Allocation Index Offset (MAIO)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003562{
3563 struct gsm_bts_trx_ts *ts = vty->index;
3564
3565 ts->hopping.maio = atoi(argv[0]);
3566
3567 return CMD_SUCCESS;
3568}
3569
3570DEFUN(cfg_ts_arfcn_add,
3571 cfg_ts_arfcn_add_cmd,
3572 "hopping arfcn add <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003573 HOPPING_STR "Configure hopping ARFCN list\n"
3574 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003575{
3576 struct gsm_bts_trx_ts *ts = vty->index;
3577 int arfcn = atoi(argv[0]);
3578
Harald Weltea39b0f22010-06-14 22:26:10 +02003579 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
3580
Harald Welte6e0cd042009-09-12 13:05:33 +02003581 return CMD_SUCCESS;
3582}
3583
3584DEFUN(cfg_ts_arfcn_del,
3585 cfg_ts_arfcn_del_cmd,
3586 "hopping arfcn del <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003587 HOPPING_STR "Configure hopping ARFCN list\n"
3588 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003589{
3590 struct gsm_bts_trx_ts *ts = vty->index;
3591 int arfcn = atoi(argv[0]);
3592
Harald Weltea39b0f22010-06-14 22:26:10 +02003593 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
3594
Harald Welte6e0cd042009-09-12 13:05:33 +02003595 return CMD_SUCCESS;
3596}
3597
Harald Weltea6fd58e2009-08-07 00:25:23 +02003598DEFUN(cfg_ts_e1_subslot,
3599 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003600 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003601 "E1/T1 channel connected to this on-air timeslot\n"
3602 "E1/T1 channel connected to this on-air timeslot\n"
3603 "E1/T1 line connected to this on-air timeslot\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02003604 "E1/T1 timeslot connected to this on-air timeslot\n"
3605 "E1/T1 timeslot connected to this on-air timeslot\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02003606 "E1/T1 sub-slot connected to this on-air timeslot\n"
3607 "E1/T1 sub-slot 0 connected to this on-air timeslot\n"
3608 "E1/T1 sub-slot 1 connected to this on-air timeslot\n"
3609 "E1/T1 sub-slot 2 connected to this on-air timeslot\n"
3610 "E1/T1 sub-slot 3 connected to this on-air timeslot\n"
3611 "Full E1/T1 timeslot connected to this on-air timeslot\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003612{
3613 struct gsm_bts_trx_ts *ts = vty->index;
3614
Harald Welte42581822009-08-08 16:12:58 +02003615 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003616
3617 return CMD_SUCCESS;
3618}
Harald Welte5258fc42009-03-28 19:07:53 +00003619
Harald Welte4f10c252010-05-16 21:47:13 +02003620void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
3621{
3622 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003623 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_TOTAL].current,
3624 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_NO_CHANNEL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003625 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003626 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003627 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RF_FAIL].current,
3628 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RLL_ERR].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003629 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003630 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003631 net->bsc_ctrs->ctr[BSC_CTR_PAGING_ATTEMPTED].current,
3632 net->bsc_ctrs->ctr[BSC_CTR_PAGING_COMPLETED].current,
3633 net->bsc_ctrs->ctr[BSC_CTR_PAGING_EXPIRED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003634 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003635 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003636 net->bsc_ctrs->ctr[BSC_CTR_BTS_OML_FAIL].current,
3637 net->bsc_ctrs->ctr[BSC_CTR_BTS_RSL_FAIL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003638 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003639}
3640
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003641DEFUN(drop_bts,
3642 drop_bts_cmd,
Holger Hans Peter Freyther0586b0f2010-04-11 12:46:45 +02003643 "drop bts connection <0-65535> (oml|rsl)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003644 "Debug/Simulation command to drop Abis/IP BTS\n"
3645 "Debug/Simulation command to drop Abis/IP BTS\n"
3646 "Debug/Simulation command to drop Abis/IP BTS\n"
3647 "BTS NR\n" "Drop OML Connection\n" "Drop RSL Connection\n")
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003648{
3649 struct gsm_network *gsmnet;
3650 struct gsm_bts_trx *trx;
3651 struct gsm_bts *bts;
3652 unsigned int bts_nr;
3653
3654 gsmnet = gsmnet_from_vty(vty);
3655
3656 bts_nr = atoi(argv[0]);
3657 if (bts_nr >= gsmnet->num_bts) {
3658 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3659 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3660 return CMD_WARNING;
3661 }
3662
3663 bts = gsm_bts_num(gsmnet, bts_nr);
3664 if (!bts) {
3665 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3666 return CMD_WARNING;
3667 }
3668
3669 if (!is_ipaccess_bts(bts)) {
3670 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
3671 return CMD_WARNING;
3672 }
3673
3674
3675 /* close all connections */
3676 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003677 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003678 } else if (strcmp(argv[1], "rsl") == 0) {
3679 /* close all rsl connections */
3680 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003681 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003682 }
3683 } else {
3684 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
3685 return CMD_WARNING;
3686 }
3687
3688 return CMD_SUCCESS;
3689}
3690
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01003691DEFUN(restart_bts, restart_bts_cmd,
3692 "restart-bts <0-65535>",
3693 "Restart ip.access nanoBTS through OML\n"
3694 "BTS Number\n")
3695{
3696 struct gsm_network *gsmnet;
3697 struct gsm_bts_trx *trx;
3698 struct gsm_bts *bts;
3699 unsigned int bts_nr;
3700
3701 gsmnet = gsmnet_from_vty(vty);
3702
3703 bts_nr = atoi(argv[0]);
3704 if (bts_nr >= gsmnet->num_bts) {
3705 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3706 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3707 return CMD_WARNING;
3708 }
3709
3710 bts = gsm_bts_num(gsmnet, bts_nr);
3711 if (!bts) {
3712 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3713 return CMD_WARNING;
3714 }
3715
3716 if (!is_ipaccess_bts(bts) || is_sysmobts_v2(bts)) {
3717 vty_out(vty, "This command only works for ipaccess nanoBTS.%s",
3718 VTY_NEWLINE);
3719 return CMD_WARNING;
3720 }
3721
3722 /* go from last TRX to c0 */
3723 llist_for_each_entry_reverse(trx, &bts->trx_list, list)
3724 abis_nm_ipaccess_restart(trx);
3725
3726 return CMD_SUCCESS;
3727}
3728
Harald Welte30f1f372014-12-28 15:00:45 +01003729DEFUN(smscb_cmd, smscb_cmd_cmd,
3730 "bts <0-255> smscb-command <1-4> HEXSTRING",
3731 "BTS related commands\n" "BTS Number\n"
3732 "SMS Cell Broadcast\n" "Last Valid Block\n"
3733 "Hex Encoded SMSCB message (up to 88 octets)\n")
3734{
3735 struct gsm_bts *bts;
3736 int bts_nr = atoi(argv[0]);
3737 int last_block = atoi(argv[1]);
3738 struct rsl_ie_cb_cmd_type cb_cmd;
3739 uint8_t buf[88];
3740 int rc;
3741
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +02003742 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
Harald Welte30f1f372014-12-28 15:00:45 +01003743 if (!bts) {
3744 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3745 return CMD_WARNING;
3746 }
3747 rc = osmo_hexparse(argv[2], buf, sizeof(buf));
3748 if (rc < 0 || rc > sizeof(buf)) {
3749 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
3750 return CMD_WARNING;
3751 }
3752
3753 cb_cmd.spare = 0;
3754 cb_cmd.def_bcast = 0;
3755 cb_cmd.command = RSL_CB_CMD_TYPE_NORMAL;
3756
3757 switch (last_block) {
3758 case 1:
3759 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_1;
3760 break;
3761 case 2:
3762 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_2;
3763 break;
3764 case 3:
3765 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_3;
3766 break;
3767 case 4:
3768 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_4;
3769 break;
3770 }
3771
3772 rsl_sms_cb_command(bts, RSL_CHAN_SDCCH4_ACCH, cb_cmd, buf, rc);
3773
3774 return CMD_SUCCESS;
3775}
3776
3777
Harald Welted0d2b0b2010-12-23 13:18:07 +01003778DEFUN(pdch_act, pdch_act_cmd,
3779 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
3780 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3781 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
3782 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
3783 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
3784{
3785 struct gsm_bts *bts;
3786 struct gsm_bts_trx *trx;
3787 struct gsm_bts_trx_ts *ts;
3788 int bts_nr = atoi(argv[0]);
3789 int trx_nr = atoi(argv[1]);
3790 int ts_nr = atoi(argv[2]);
3791 int activate;
3792
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +02003793 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
Harald Welted0d2b0b2010-12-23 13:18:07 +01003794 if (!bts) {
3795 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3796 return CMD_WARNING;
3797 }
3798
3799 if (!is_ipaccess_bts(bts)) {
3800 vty_out(vty, "%% This command only works for ipaccess BTS%s",
3801 VTY_NEWLINE);
3802 return CMD_WARNING;
3803 }
3804
3805 trx = gsm_bts_trx_num(bts, trx_nr);
3806 if (!trx) {
3807 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
3808 return CMD_WARNING;
3809 }
3810
3811 ts = &trx->ts[ts_nr];
3812 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
3813 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
3814 "mode%s", ts_nr, VTY_NEWLINE);
3815 return CMD_WARNING;
3816 }
3817
3818 if (!strcmp(argv[3], "activate"))
3819 activate = 1;
3820 else
3821 activate = 0;
3822
3823 rsl_ipacc_pdch_activate(ts, activate);
3824
3825 return CMD_SUCCESS;
3826
3827}
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003828
Harald Weltedcccb182010-05-16 20:52:23 +02003829extern int bsc_vty_init_extra(void);
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02003830
Neels Hofmeyr43d86bf2016-05-10 13:40:19 +02003831int bsc_vty_init(const struct log_info *cat, struct gsm_network *network)
Harald Welte68628e82009-03-10 12:17:57 +00003832{
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003833 cfg_ts_pchan_cmd.string =
3834 vty_cmd_string_from_valstr(tall_bsc_ctx,
3835 gsm_pchant_names,
3836 "phys_chan_config (", "|", ")",
3837 VTY_DO_LOWER);
3838 cfg_ts_pchan_cmd.doc =
3839 vty_cmd_string_from_valstr(tall_bsc_ctx,
3840 gsm_pchant_descs,
3841 "Physical Channel Combination\n",
3842 "\n", "", 0);
3843
Harald Weltee555c2b2012-08-17 13:02:12 +02003844 cfg_bts_type_cmd.string =
3845 vty_cmd_string_from_valstr(tall_bsc_ctx,
3846 bts_type_names,
3847 "type (", "|", ")",
3848 VTY_DO_LOWER);
3849 cfg_bts_type_cmd.doc =
3850 vty_cmd_string_from_valstr(tall_bsc_ctx,
3851 bts_type_descs,
3852 "BTS Vendor/Type\n",
3853 "\n", "", 0);
3854
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +02003855 common_cs_vty_init(network, config_write_net);
Harald Weltee555c2b2012-08-17 13:02:12 +02003856
Neels Hofmeyrea11bf82016-05-12 01:53:23 +02003857 install_element_ve(&bsc_show_net_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +00003858 install_element_ve(&show_bts_cmd);
3859 install_element_ve(&show_trx_cmd);
3860 install_element_ve(&show_ts_cmd);
3861 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08003862 install_element_ve(&show_lchan_summary_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00003863
Harald Welteb4d5b172010-05-12 16:10:35 +00003864 install_element_ve(&show_paging_cmd);
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01003865 install_element_ve(&show_paging_group_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00003866
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01003867 logging_vty_add_cmds(cat);
Jacob Erlbeck64630cc2015-10-26 16:25:37 +01003868 osmo_stats_vty_add_cmds();
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01003869
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01003870 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01003871 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-12-21 16:51:50 +01003872 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
3873 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
3874 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
3875 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
3876 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
3877 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01003878 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01003879 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
3880 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
3881 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
3882 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
3883 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
3884 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
3885 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
3886 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
3887 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltec9f499f2010-12-23 22:53:50 +01003888 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01003889 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08003890 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08003891 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02003892
3893 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02003894 install_node(&bts_node, config_write_bts);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01003895 vty_install_default(BTS_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00003896 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02003897 install_element(BTS_NODE, &cfg_description_cmd);
3898 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02003899 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02003900 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Maxc08ee712016-05-11 12:45:13 +02003901 install_element(BTS_NODE, &cfg_bts_dtxu_cmd);
3902 install_element(BTS_NODE, &cfg_bts_dtxd_cmd);
3903 install_element(BTS_NODE, &cfg_bts_no_dtxu_cmd);
3904 install_element(BTS_NODE, &cfg_bts_no_dtxd_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00003905 install_element(BTS_NODE, &cfg_bts_lac_cmd);
3906 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02003907 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00003908 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8b291802013-03-12 13:57:05 +01003909 install_element(BTS_NODE, &cfg_bts_rsl_ip_cmd);
Sylvain Munautc9519462011-10-17 14:04:55 +02003910 install_element(BTS_NODE, &cfg_bts_nokia_site_skip_reset_cmd);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01003911 install_element(BTS_NODE, &cfg_bts_nokia_site_no_loc_rel_cnf_cmd);
Sipos Csaba56e17662015-02-07 13:27:36 +01003912 install_element(BTS_NODE, &cfg_bts_nokia_site_bts_reset_timer_cnf_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02003913 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-08-08 16:12:58 +02003914 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
3915 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte7a8fa412009-08-10 13:48:16 +02003916 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01003917 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
3918 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02003919 install_element(BTS_NODE, &cfg_bts_chan_desc_att_cmd);
3920 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_pa_mfrms_cmd);
3921 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_ag_blks_res_cmd);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08003922 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
3923 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02003924 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08003925 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Ivan Kluchnikov67920592013-09-16 13:13:04 +04003926 install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02003927 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02003928 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02003929 install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
Harald Welte73225282009-12-12 18:17:25 +01003930 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
3931 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaute0b06b02010-11-28 18:17:28 +01003932 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
3933 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
3934 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
3935 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
3936 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
3937 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01003938 install_element(BTS_NODE, &cfg_bts_radio_link_timeout_cmd);
Harald Welte4511d892010-04-18 15:51:20 +02003939 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
bhargava350533c2016-07-21 11:14:34 +05303940 install_element(BTS_NODE, &cfg_bts_gprs_11bit_rach_support_for_egprs_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02003941 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08003942 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01003943 install_element(BTS_NODE, &cfg_bts_gprs_net_ctrl_ord_cmd);
Max292ec582016-07-28 11:55:37 +02003944 install_element(BTS_NODE, &cfg_bts_gprs_ctrl_ack_cmd);
3945 install_element(BTS_NODE, &cfg_no_bts_gprs_ctrl_ack_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08003946 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02003947 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08003948 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08003949 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-03-14 23:30:30 +08003950 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
3951 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
3952 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08003953 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welte9fbff4a2010-07-30 11:50:09 +02003954 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
3955 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welte32c09622011-01-11 23:44:56 +01003956 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
3957 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Welte64c07d22011-02-15 11:43:27 +01003958 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Max59a1bf32016-04-15 16:04:46 +02003959 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_add_cmd);
3960 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_del_cmd);
Max26679e02016-04-20 15:57:13 +02003961 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_add_cmd);
3962 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_del_cmd);
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02003963 install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
3964 install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01003965 install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
3966 install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
Andreas Eversberga83d5112013-12-07 18:32:28 +01003967 install_element(BTS_NODE, &cfg_bts_codec0_cmd);
3968 install_element(BTS_NODE, &cfg_bts_codec1_cmd);
3969 install_element(BTS_NODE, &cfg_bts_codec2_cmd);
3970 install_element(BTS_NODE, &cfg_bts_codec3_cmd);
3971 install_element(BTS_NODE, &cfg_bts_codec4_cmd);
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01003972 install_element(BTS_NODE, &cfg_bts_depends_on_cmd);
3973 install_element(BTS_NODE, &cfg_bts_no_depends_on_cmd);
Andreas Eversberg73266522014-01-19 11:47:44 +01003974 install_element(BTS_NODE, &cfg_bts_amr_fr_modes1_cmd);
3975 install_element(BTS_NODE, &cfg_bts_amr_fr_modes2_cmd);
3976 install_element(BTS_NODE, &cfg_bts_amr_fr_modes3_cmd);
3977 install_element(BTS_NODE, &cfg_bts_amr_fr_modes4_cmd);
3978 install_element(BTS_NODE, &cfg_bts_amr_fr_thres1_cmd);
3979 install_element(BTS_NODE, &cfg_bts_amr_fr_thres2_cmd);
3980 install_element(BTS_NODE, &cfg_bts_amr_fr_thres3_cmd);
3981 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst1_cmd);
3982 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst2_cmd);
3983 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst3_cmd);
3984 install_element(BTS_NODE, &cfg_bts_amr_fr_start_mode_cmd);
3985 install_element(BTS_NODE, &cfg_bts_amr_hr_modes1_cmd);
3986 install_element(BTS_NODE, &cfg_bts_amr_hr_modes2_cmd);
3987 install_element(BTS_NODE, &cfg_bts_amr_hr_modes3_cmd);
3988 install_element(BTS_NODE, &cfg_bts_amr_hr_modes4_cmd);
3989 install_element(BTS_NODE, &cfg_bts_amr_hr_thres1_cmd);
3990 install_element(BTS_NODE, &cfg_bts_amr_hr_thres2_cmd);
3991 install_element(BTS_NODE, &cfg_bts_amr_hr_thres3_cmd);
3992 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst1_cmd);
3993 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst2_cmd);
3994 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst3_cmd);
3995 install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003996
Harald Welte5258fc42009-03-28 19:07:53 +00003997 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003998 install_node(&trx_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01003999 vty_install_default(TRX_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004000 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004001 install_element(TRX_NODE, &cfg_description_cmd);
4002 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)7b37d972009-12-27 20:56:38 +01004003 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02004004 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004005 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
4006 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01004007 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004008
Harald Welte5258fc42009-03-28 19:07:53 +00004009 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004010 install_node(&ts_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004011 vty_install_default(TS_NODE);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004012 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004013 install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);
Harald Welte135a6482011-05-30 12:09:13 +02004014 install_element(TS_NODE, &cfg_ts_tsc_cmd);
Harald Weltea39b0f22010-06-14 22:26:10 +02004015 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte6e0cd042009-09-12 13:05:33 +02004016 install_element(TS_NODE, &cfg_ts_hsn_cmd);
4017 install_element(TS_NODE, &cfg_ts_maio_cmd);
4018 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
4019 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004020 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004021
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004022 install_element(ENABLE_NODE, &drop_bts_cmd);
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01004023 install_element(ENABLE_NODE, &restart_bts_cmd);
Harald Welted0d2b0b2010-12-23 13:18:07 +01004024 install_element(ENABLE_NODE, &pdch_act_cmd);
Harald Welte30f1f372014-12-28 15:00:45 +01004025 install_element(ENABLE_NODE, &smscb_cmd_cmd);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004026
Harald Welte81c9b9c2010-05-31 16:40:40 +02004027 abis_nm_vty_init();
Harald Weltee1d5eca2011-02-12 14:42:59 +01004028 abis_om2k_vty_init();
Harald Welte3016d9f2011-02-05 13:54:41 +01004029 e1inp_vty_init();
Harald Welte81c9b9c2010-05-31 16:40:40 +02004030
Harald Weltedcccb182010-05-16 20:52:23 +02004031 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00004032
Harald Welte68628e82009-03-10 12:17:57 +00004033 return 0;
4034}