blob: 01ee4df2ce8f69beb56a1b84199f6019a1e79daf [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) {
Harald Welte1cd50582016-11-26 15:04:39 +01002748 vty_out(vty, "Unable to add arfcn %u: %s%s", arfcn, strerror(-r),
Max59a1bf32016-04-15 16:04:46 +02002749 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);
Harald Weltea191dcd2016-11-26 15:06:37 +01002802 return CMD_WARNING;
Maxaafff962016-04-20 15:57:14 +02002803 case -ENOSPC:
2804 vty_out(vty, "Warning: not enough space in si2quater for a "
2805 "given arfcn%s", VTY_NEWLINE);
Harald Weltea191dcd2016-11-26 15:06:37 +01002806 return CMD_WARNING;
Max26679e02016-04-20 15:57:13 +02002807 case -EADDRINUSE:
2808 vty_out(vty, "Unable to add arfcn: (%u, %u) is already added%s",
2809 arfcn, scramble, VTY_NEWLINE);
2810 return CMD_WARNING;
2811 }
2812
2813 return CMD_SUCCESS;
2814}
2815
2816DEFUN(cfg_bts_si2quater_uarfcn_del, cfg_bts_si2quater_uarfcn_del_cmd,
Max35697b92016-04-29 12:51:31 +02002817 "si2quater neighbor-list del uarfcn <0-16383> <0-511>",
Max26679e02016-04-20 15:57:13 +02002818 "SI2quater Neighbor List\n"
2819 "SI2quater Neighbor List\n"
2820 "Delete from SI2quater manual neighbor list\n"
2821 "UARFCN of neighbor\n"
2822 "UARFCN\n"
2823 "scrambling code\n")
2824{
2825 struct gsm_bts *bts = vty->index;
2826
2827 if (bts_uarfcn_del(bts, atoi(argv[0]), atoi(argv[1])) < 0) {
2828 vty_out(vty, "Unable to delete uarfcn: pair not found%s",
2829 VTY_NEWLINE);
2830 return CMD_WARNING;
2831 }
2832
2833 return CMD_SUCCESS;
2834}
2835
Harald Welte64c07d22011-02-15 11:43:27 +01002836DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002837 "si5 neighbor-list (add|del) arfcn <0-1023>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002838 "SI5 Neighbor List\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002839 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
2840 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
2841 "ARFCN of neighbor\n")
2842{
2843 struct gsm_bts *bts = vty->index;
2844 struct bitvec *bv = &bts->si_common.si5_neigh_list;
2845 uint16_t arfcn = atoi(argv[1]);
2846
2847 if (!bts->neigh_list_manual_mode) {
2848 vty_out(vty, "%% Cannot configure neighbor list in "
2849 "automatic mode%s", VTY_NEWLINE);
2850 return CMD_WARNING;
2851 }
2852
2853 if (!strcmp(argv[0], "add"))
2854 bitvec_set_bit_pos(bv, arfcn, 1);
2855 else
2856 bitvec_set_bit_pos(bv, arfcn, 0);
2857
2858 return CMD_SUCCESS;
2859}
Harald Welte9fbff4a2010-07-30 11:50:09 +02002860
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02002861#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
2862
2863DEFUN(cfg_bts_excl_rf_lock,
2864 cfg_bts_excl_rf_lock_cmd,
2865 "rf-lock-exclude",
2866 EXCL_RFLOCK_STR)
2867{
2868 struct gsm_bts *bts = vty->index;
2869 bts->excl_from_rf_lock = 1;
2870 return CMD_SUCCESS;
2871}
2872
2873DEFUN(cfg_bts_no_excl_rf_lock,
2874 cfg_bts_no_excl_rf_lock_cmd,
2875 "no rf-lock-exclude",
2876 NO_STR EXCL_RFLOCK_STR)
2877{
2878 struct gsm_bts *bts = vty->index;
2879 bts->excl_from_rf_lock = 0;
2880 return CMD_SUCCESS;
2881}
2882
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01002883#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
2884
2885DEFUN(cfg_bts_force_comb_si,
2886 cfg_bts_force_comb_si_cmd,
2887 "force-combined-si",
2888 FORCE_COMB_SI_STR)
2889{
2890 struct gsm_bts *bts = vty->index;
2891 bts->force_combined_si = 1;
2892 return CMD_SUCCESS;
2893}
2894
2895DEFUN(cfg_bts_no_force_comb_si,
2896 cfg_bts_no_force_comb_si_cmd,
2897 "no force-combined-si",
2898 NO_STR FORCE_COMB_SI_STR)
2899{
2900 struct gsm_bts *bts = vty->index;
2901 bts->force_combined_si = 0;
2902 return CMD_SUCCESS;
2903}
2904
Andreas Eversberga83d5112013-12-07 18:32:28 +01002905static void _get_codec_from_arg(struct vty *vty, int argc, const char *argv[])
2906{
2907 struct gsm_bts *bts = vty->index;
2908 struct bts_codec_conf *codec = &bts->codec;
2909 int i;
2910
2911 codec->hr = 0;
2912 codec->efr = 0;
2913 codec->amr = 0;
2914 for (i = 0; i < argc; i++) {
2915 if (!strcmp(argv[i], "hr"))
2916 codec->hr = 1;
2917 if (!strcmp(argv[i], "efr"))
2918 codec->efr = 1;
2919 if (!strcmp(argv[i], "amr"))
2920 codec->amr = 1;
2921 }
2922}
2923
2924#define CODEC_PAR_STR " (hr|efr|amr)"
2925#define CODEC_HELP_STR "Half Rate\n" \
2926 "Enhanced Full Rate\nAdaptive Multirate\n"
2927
2928DEFUN(cfg_bts_codec0, cfg_bts_codec0_cmd,
2929 "codec-support fr",
2930 "Codec Support settings\nFullrate\n")
2931{
2932 _get_codec_from_arg(vty, 0, argv);
2933 return CMD_SUCCESS;
2934}
2935
2936DEFUN(cfg_bts_codec1, cfg_bts_codec1_cmd,
2937 "codec-support fr" CODEC_PAR_STR,
2938 "Codec Support settings\nFullrate\n"
2939 CODEC_HELP_STR)
2940{
2941 _get_codec_from_arg(vty, 1, argv);
2942 return CMD_SUCCESS;
2943}
2944
2945DEFUN(cfg_bts_codec2, cfg_bts_codec2_cmd,
2946 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR,
2947 "Codec Support settings\nFullrate\n"
2948 CODEC_HELP_STR CODEC_HELP_STR)
2949{
2950 _get_codec_from_arg(vty, 2, argv);
2951 return CMD_SUCCESS;
2952}
2953
2954DEFUN(cfg_bts_codec3, cfg_bts_codec3_cmd,
2955 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
2956 "Codec Support settings\nFullrate\n"
2957 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
2958{
2959 _get_codec_from_arg(vty, 3, argv);
2960 return CMD_SUCCESS;
2961}
2962
2963DEFUN(cfg_bts_codec4, cfg_bts_codec4_cmd,
2964 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
2965 "Codec Support settings\nFullrate\n"
2966 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
2967{
2968 _get_codec_from_arg(vty, 4, argv);
2969 return CMD_SUCCESS;
2970}
2971
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01002972DEFUN(cfg_bts_depends_on, cfg_bts_depends_on_cmd,
2973 "depends-on-bts <0-255>",
2974 "This BTS can only be started if another one is up\n" "BTS Number\n")
2975{
2976 struct gsm_bts *bts = vty->index;
2977 struct gsm_bts *other_bts;
2978 int dep = atoi(argv[0]);
2979
2980
2981 if (!is_ipaccess_bts(bts)) {
2982 vty_out(vty, "This feature is only available for IP systems.%s",
2983 VTY_NEWLINE);
2984 return CMD_WARNING;
2985 }
2986
2987 other_bts = gsm_bts_num(bts->network, dep);
2988 if (!other_bts || !is_ipaccess_bts(other_bts)) {
2989 vty_out(vty, "This feature is only available for IP systems.%s",
2990 VTY_NEWLINE);
2991 return CMD_WARNING;
2992 }
2993
2994 if (dep >= bts->nr) {
2995 vty_out(vty, "%%Need to depend on an already declared unit.%s",
2996 VTY_NEWLINE);
2997 return CMD_WARNING;
2998 }
2999
3000 bts_depend_mark(bts, dep);
3001 return CMD_SUCCESS;
3002}
3003
3004DEFUN(cfg_bts_no_depends_on, cfg_bts_no_depends_on_cmd,
3005 "depeneds-on-bts <0-255>",
3006 NO_STR "This BTS can only be started if another one is up\n"
3007 "BTS Number\n")
3008{
3009 struct gsm_bts *bts = vty->index;
3010 int dep = atoi(argv[0]);
3011
3012 bts_depend_clear(bts, dep);
3013 return CMD_SUCCESS;
3014}
3015
Andreas Eversberg73266522014-01-19 11:47:44 +01003016#define AMR_TEXT "Adaptive Multi Rate settings\n"
3017#define AMR_MODE_TEXT "Codec modes to use with AMR codec\n"
3018#define AMR_START_TEXT "Initial codec to use with AMR\n" \
3019 "Automatically\nFirst codec\nSecond codec\nThird codec\nFourth codec\n"
3020#define AMR_TH_TEXT "AMR threshold between codecs\nMS side\nBTS side\n"
3021#define AMR_HY_TEXT "AMR hysteresis between codecs\nMS side\nBTS side\n"
3022
3023static void get_amr_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3024{
3025 struct gsm_bts *bts = vty->index;
3026 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3027 struct gsm48_multi_rate_conf *mr_conf =
3028 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3029 int i;
3030
3031 mr->gsm48_ie[1] = 0;
3032 for (i = 0; i < argc; i++)
3033 mr->gsm48_ie[1] |= 1 << atoi(argv[i]);
3034 mr_conf->icmi = 0;
3035}
3036
3037static void get_amr_th_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3038{
3039 struct gsm_bts *bts = vty->index;
3040 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003041 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003042 int i;
3043
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003044 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3045 for (i = 0; i < argc - 1; i++)
3046 modes[i].threshold = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003047}
3048
3049static void get_amr_hy_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3050{
3051 struct gsm_bts *bts = vty->index;
3052 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003053 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003054 int i;
3055
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003056 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3057 for (i = 0; i < argc - 1; i++)
3058 modes[i].hysteresis = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003059}
3060
3061static void get_amr_start_from_arg(struct vty *vty, const char *argv[], int full)
3062{
3063 struct gsm_bts *bts = vty->index;
3064 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3065 struct gsm48_multi_rate_conf *mr_conf =
3066 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3067 int num = 0, i;
3068
3069 for (i = 0; i < ((full) ? 8 : 6); i++) {
3070 if ((mr->gsm48_ie[1] & (1 << i))) {
3071 num++;
3072 }
3073 }
3074
3075 if (argv[0][0] == 'a' || num == 0)
3076 mr_conf->icmi = 0;
3077 else {
3078 mr_conf->icmi = 1;
3079 if (num < atoi(argv[0]))
3080 mr_conf->smod = num - 1;
3081 else
3082 mr_conf->smod = atoi(argv[0]) - 1;
3083 }
3084}
3085
3086#define AMR_TCHF_PAR_STR " (0|1|2|3|4|5|6|7)"
3087#define AMR_TCHF_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n" \
3088 "10,2k\n12,2k\n"
3089
3090#define AMR_TCHH_PAR_STR " (0|1|2|3|4|5)"
3091#define AMR_TCHH_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n"
3092
3093#define AMR_TH_HELP_STR "Threshold between codec 1 and 2\n"
3094#define AMR_HY_HELP_STR "Hysteresis between codec 1 and 2\n"
3095
3096DEFUN(cfg_bts_amr_fr_modes1, cfg_bts_amr_fr_modes1_cmd,
3097 "amr tch-f modes" AMR_TCHF_PAR_STR,
3098 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3099 AMR_TCHF_HELP_STR)
3100{
3101 get_amr_from_arg(vty, 1, argv, 1);
3102 return CMD_SUCCESS;
3103}
3104
3105DEFUN(cfg_bts_amr_fr_modes2, cfg_bts_amr_fr_modes2_cmd,
3106 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3107 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3108 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3109{
3110 get_amr_from_arg(vty, 2, argv, 1);
3111 return CMD_SUCCESS;
3112}
3113
3114DEFUN(cfg_bts_amr_fr_modes3, cfg_bts_amr_fr_modes3_cmd,
3115 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3116 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3117 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3118{
3119 get_amr_from_arg(vty, 3, argv, 1);
3120 return CMD_SUCCESS;
3121}
3122
3123DEFUN(cfg_bts_amr_fr_modes4, cfg_bts_amr_fr_modes4_cmd,
3124 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3125 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3126 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3127{
3128 get_amr_from_arg(vty, 4, argv, 1);
3129 return CMD_SUCCESS;
3130}
3131
3132DEFUN(cfg_bts_amr_fr_start_mode, cfg_bts_amr_fr_start_mode_cmd,
3133 "amr tch-f start-mode (auto|1|2|3|4)",
3134 AMR_TEXT "Full Rate\n" AMR_START_TEXT)
3135{
3136 get_amr_start_from_arg(vty, argv, 1);
3137 return CMD_SUCCESS;
3138}
3139
3140DEFUN(cfg_bts_amr_fr_thres1, cfg_bts_amr_fr_thres1_cmd,
3141 "amr tch-f threshold (ms|bts) <0-63>",
3142 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3143 AMR_TH_HELP_STR)
3144{
3145 get_amr_th_from_arg(vty, 2, argv, 1);
3146 return CMD_SUCCESS;
3147}
3148
3149DEFUN(cfg_bts_amr_fr_thres2, cfg_bts_amr_fr_thres2_cmd,
3150 "amr tch-f threshold (ms|bts) <0-63> <0-63>",
3151 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3152 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3153{
3154 get_amr_th_from_arg(vty, 3, argv, 1);
3155 return CMD_SUCCESS;
3156}
3157
3158DEFUN(cfg_bts_amr_fr_thres3, cfg_bts_amr_fr_thres3_cmd,
3159 "amr tch-f threshold (ms|bts) <0-63> <0-63> <0-63>",
3160 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3161 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3162{
3163 get_amr_th_from_arg(vty, 4, argv, 1);
3164 return CMD_SUCCESS;
3165}
3166
3167DEFUN(cfg_bts_amr_fr_hyst1, cfg_bts_amr_fr_hyst1_cmd,
3168 "amr tch-f hysteresis (ms|bts) <0-15>",
3169 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3170 AMR_HY_HELP_STR)
3171{
3172 get_amr_hy_from_arg(vty, 2, argv, 1);
3173 return CMD_SUCCESS;
3174}
3175
3176DEFUN(cfg_bts_amr_fr_hyst2, cfg_bts_amr_fr_hyst2_cmd,
3177 "amr tch-f hysteresis (ms|bts) <0-15> <0-15>",
3178 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3179 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3180{
3181 get_amr_hy_from_arg(vty, 3, argv, 1);
3182 return CMD_SUCCESS;
3183}
3184
3185DEFUN(cfg_bts_amr_fr_hyst3, cfg_bts_amr_fr_hyst3_cmd,
3186 "amr tch-f hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3187 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3188 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3189{
3190 get_amr_hy_from_arg(vty, 4, argv, 1);
3191 return CMD_SUCCESS;
3192}
3193
3194DEFUN(cfg_bts_amr_hr_modes1, cfg_bts_amr_hr_modes1_cmd,
3195 "amr tch-h modes" AMR_TCHH_PAR_STR,
3196 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3197 AMR_TCHH_HELP_STR)
3198{
3199 get_amr_from_arg(vty, 1, argv, 0);
3200 return CMD_SUCCESS;
3201}
3202
3203DEFUN(cfg_bts_amr_hr_modes2, cfg_bts_amr_hr_modes2_cmd,
3204 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3205 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3206 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3207{
3208 get_amr_from_arg(vty, 2, argv, 0);
3209 return CMD_SUCCESS;
3210}
3211
3212DEFUN(cfg_bts_amr_hr_modes3, cfg_bts_amr_hr_modes3_cmd,
3213 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3214 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3215 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3216{
3217 get_amr_from_arg(vty, 3, argv, 0);
3218 return CMD_SUCCESS;
3219}
3220
3221DEFUN(cfg_bts_amr_hr_modes4, cfg_bts_amr_hr_modes4_cmd,
3222 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3223 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3224 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3225{
3226 get_amr_from_arg(vty, 4, argv, 0);
3227 return CMD_SUCCESS;
3228}
3229
3230DEFUN(cfg_bts_amr_hr_start_mode, cfg_bts_amr_hr_start_mode_cmd,
3231 "amr tch-h start-mode (auto|1|2|3|4)",
3232 AMR_TEXT "Half Rate\n" AMR_START_TEXT)
3233{
3234 get_amr_start_from_arg(vty, argv, 0);
3235 return CMD_SUCCESS;
3236}
3237
3238DEFUN(cfg_bts_amr_hr_thres1, cfg_bts_amr_hr_thres1_cmd,
3239 "amr tch-h threshold (ms|bts) <0-63>",
3240 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3241 AMR_TH_HELP_STR)
3242{
3243 get_amr_th_from_arg(vty, 2, argv, 0);
3244 return CMD_SUCCESS;
3245}
3246
3247DEFUN(cfg_bts_amr_hr_thres2, cfg_bts_amr_hr_thres2_cmd,
3248 "amr tch-h threshold (ms|bts) <0-63> <0-63>",
3249 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3250 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3251{
3252 get_amr_th_from_arg(vty, 3, argv, 0);
3253 return CMD_SUCCESS;
3254}
3255
3256DEFUN(cfg_bts_amr_hr_thres3, cfg_bts_amr_hr_thres3_cmd,
3257 "amr tch-h threshold (ms|bts) <0-63> <0-63> <0-63>",
3258 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3259 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3260{
3261 get_amr_th_from_arg(vty, 4, argv, 0);
3262 return CMD_SUCCESS;
3263}
3264
3265DEFUN(cfg_bts_amr_hr_hyst1, cfg_bts_amr_hr_hyst1_cmd,
3266 "amr tch-h hysteresis (ms|bts) <0-15>",
3267 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3268 AMR_HY_HELP_STR)
3269{
3270 get_amr_hy_from_arg(vty, 2, argv, 0);
3271 return CMD_SUCCESS;
3272}
3273
3274DEFUN(cfg_bts_amr_hr_hyst2, cfg_bts_amr_hr_hyst2_cmd,
3275 "amr tch-h hysteresis (ms|bts) <0-15> <0-15>",
3276 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3277 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3278{
3279 get_amr_hy_from_arg(vty, 3, argv, 0);
3280 return CMD_SUCCESS;
3281}
3282
3283DEFUN(cfg_bts_amr_hr_hyst3, cfg_bts_amr_hr_hyst3_cmd,
3284 "amr tch-h hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3285 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3286 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3287{
3288 get_amr_hy_from_arg(vty, 4, argv, 0);
3289 return CMD_SUCCESS;
3290}
3291
Harald Welte8f0ed552010-05-11 21:53:49 +02003292#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02003293
Harald Welte5258fc42009-03-28 19:07:53 +00003294/* per TRX configuration */
3295DEFUN(cfg_trx,
3296 cfg_trx_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02003297 "trx <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02003298 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00003299 "Select a TRX to configure")
3300{
3301 int trx_nr = atoi(argv[0]);
3302 struct gsm_bts *bts = vty->index;
3303 struct gsm_bts_trx *trx;
3304
Harald Weltee441d9c2009-06-21 16:17:15 +02003305 if (trx_nr > bts->num_trx) {
3306 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
3307 bts->num_trx, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00003308 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02003309 } else if (trx_nr == bts->num_trx) {
3310 /* we need to allocate a new one */
3311 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003312 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02003313 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003314
Harald Weltee441d9c2009-06-21 16:17:15 +02003315 if (!trx)
3316 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00003317
3318 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02003319 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00003320 vty->node = TRX_NODE;
3321
3322 return CMD_SUCCESS;
3323}
3324
3325DEFUN(cfg_trx_arfcn,
3326 cfg_trx_arfcn_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01003327 "arfcn <0-1023>",
Harald Welte13fe2192012-08-17 09:57:25 +02003328 "Set the ARFCN for this TRX\n"
3329 "Absolute Radio Frequency Channel Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003330{
3331 int arfcn = atoi(argv[0]);
3332 struct gsm_bts_trx *trx = vty->index;
3333
3334 /* FIXME: check if this ARFCN is supported by this TRX */
3335
3336 trx->arfcn = arfcn;
3337
3338 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
3339 /* FIXME: use OML layer to update the ARFCN */
3340 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
3341
3342 return CMD_SUCCESS;
3343}
3344
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003345DEFUN(cfg_trx_nominal_power,
3346 cfg_trx_nominal_power_cmd,
3347 "nominal power <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003348 "Nominal TRX RF Power in dBm\n"
3349 "Nominal TRX RF Power in dBm\n"
3350 "Nominal TRX RF Power in dBm\n")
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003351{
3352 struct gsm_bts_trx *trx = vty->index;
3353
3354 trx->nominal_power = atoi(argv[0]);
3355
3356 return CMD_SUCCESS;
3357}
3358
Harald Weltefcd24452009-06-20 18:15:19 +02003359DEFUN(cfg_trx_max_power_red,
3360 cfg_trx_max_power_red_cmd,
3361 "max_power_red <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003362 "Reduction of maximum BS RF Power (relative to nominal power)\n"
Harald Weltefcd24452009-06-20 18:15:19 +02003363 "Reduction of maximum BS RF Power in dB\n")
3364{
3365 int maxpwr_r = atoi(argv[0]);
3366 struct gsm_bts_trx *trx = vty->index;
Harald Welte61a83b22009-11-18 09:20:22 +01003367 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-06-20 18:15:19 +02003368
3369 /* FIXME: check if our BTS type supports more than 12 */
3370 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
3371 vty_out(vty, "%% Power %d dB is not in the valid range%s",
3372 maxpwr_r, VTY_NEWLINE);
3373 return CMD_WARNING;
3374 }
3375 if (maxpwr_r & 1) {
3376 vty_out(vty, "%% Power %d dB is not an even value%s",
3377 maxpwr_r, VTY_NEWLINE);
3378 return CMD_WARNING;
3379 }
3380
3381 trx->max_power_red = maxpwr_r;
3382
3383 /* FIXME: make sure we update this using OML */
3384
3385 return CMD_SUCCESS;
3386}
3387
Harald Welte42581822009-08-08 16:12:58 +02003388DEFUN(cfg_trx_rsl_e1,
3389 cfg_trx_rsl_e1_cmd,
3390 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003391 "RSL Parameters\n"
3392 "E1/T1 interface to be used for RSL\n"
3393 "E1/T1 interface to be used for RSL\n"
3394 "E1/T1 Line Number to be used for RSL\n"
3395 "E1/T1 Timeslot to be used for RSL\n"
3396 "E1/T1 Timeslot to be used for RSL\n"
3397 "E1/T1 Sub-slot to be used for RSL\n"
3398 "E1/T1 Sub-slot 0 is to be used for RSL\n"
3399 "E1/T1 Sub-slot 1 is to be used for RSL\n"
3400 "E1/T1 Sub-slot 2 is to be used for RSL\n"
3401 "E1/T1 Sub-slot 3 is to be used for RSL\n"
3402 "E1/T1 full timeslot is to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003403{
3404 struct gsm_bts_trx *trx = vty->index;
3405
3406 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
3407
3408 return CMD_SUCCESS;
3409}
3410
3411DEFUN(cfg_trx_rsl_e1_tei,
3412 cfg_trx_rsl_e1_tei_cmd,
3413 "rsl e1 tei <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003414 "RSL Parameters\n"
3415 "Set the TEI to be used for RSL\n"
3416 "Set the TEI to be used for RSL\n"
3417 "TEI to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003418{
3419 struct gsm_bts_trx *trx = vty->index;
3420
3421 trx->rsl_tei = atoi(argv[0]);
3422
3423 return CMD_SUCCESS;
3424}
3425
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003426DEFUN(cfg_trx_rf_locked,
3427 cfg_trx_rf_locked_cmd,
3428 "rf_locked (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003429 "Set or unset the RF Locking (Turn off RF of the TRX)\n"
3430 "TRX is NOT RF locked (active)\n"
3431 "TRX is RF locked (turned off)\n")
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003432{
3433 int locked = atoi(argv[0]);
3434 struct gsm_bts_trx *trx = vty->index;
3435
3436 gsm_trx_lock_rf(trx, locked);
3437 return CMD_SUCCESS;
3438}
Harald Welte42581822009-08-08 16:12:58 +02003439
Harald Welte5258fc42009-03-28 19:07:53 +00003440/* per TS configuration */
3441DEFUN(cfg_ts,
3442 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003443 "timeslot <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003444 "Select a Timeslot to configure\n"
3445 "Timeslot number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003446{
3447 int ts_nr = atoi(argv[0]);
3448 struct gsm_bts_trx *trx = vty->index;
3449 struct gsm_bts_trx_ts *ts;
3450
3451 if (ts_nr >= TRX_NR_TS) {
3452 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
3453 TRX_NR_TS, VTY_NEWLINE);
3454 return CMD_WARNING;
3455 }
3456
3457 ts = &trx->ts[ts_nr];
3458
3459 vty->index = ts;
3460 vty->node = TS_NODE;
3461
3462 return CMD_SUCCESS;
3463}
3464
Harald Weltea6fd58e2009-08-07 00:25:23 +02003465DEFUN(cfg_ts_pchan,
3466 cfg_ts_pchan_cmd,
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003467 "phys_chan_config PCHAN", /* dynamically generated! */
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003468 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003469{
3470 struct gsm_bts_trx_ts *ts = vty->index;
3471 int pchanc;
3472
3473 pchanc = gsm_pchan_parse(argv[0]);
3474 if (pchanc < 0)
3475 return CMD_WARNING;
3476
3477 ts->pchan = pchanc;
3478
3479 return CMD_SUCCESS;
3480}
3481
3482/* used for backwards compatibility with old config files that still
3483 * have uppercase pchan type names */
3484DEFUN_HIDDEN(cfg_ts_pchan_compat,
3485 cfg_ts_pchan_compat_cmd,
Harald Weltea6fd58e2009-08-07 00:25:23 +02003486 "phys_chan_config PCHAN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003487 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003488{
3489 struct gsm_bts_trx_ts *ts = vty->index;
3490 int pchanc;
3491
3492 pchanc = gsm_pchan_parse(argv[0]);
3493 if (pchanc < 0)
3494 return CMD_WARNING;
3495
3496 ts->pchan = pchanc;
3497
3498 return CMD_SUCCESS;
3499}
3500
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003501
3502
Harald Welte135a6482011-05-30 12:09:13 +02003503DEFUN(cfg_ts_tsc,
3504 cfg_ts_tsc_cmd,
3505 "training_sequence_code <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003506 "Training Sequence Code of the Timeslot\n" "TSC\n")
Harald Welte135a6482011-05-30 12:09:13 +02003507{
3508 struct gsm_bts_trx_ts *ts = vty->index;
3509
Harald Welte903aaea2014-01-19 17:10:50 +01003510 if (!gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_MULTI_TSC)) {
3511 vty_out(vty, "%% This BTS does not support a TSC != BCC, "
3512 "falling back to BCC%s", VTY_NEWLINE);
3513 ts->tsc = -1;
3514 return CMD_WARNING;
3515 }
3516
Harald Welte135a6482011-05-30 12:09:13 +02003517 ts->tsc = atoi(argv[0]);
3518
3519 return CMD_SUCCESS;
3520}
3521
Harald Weltea39b0f22010-06-14 22:26:10 +02003522#define HOPPING_STR "Configure frequency hopping\n"
3523
3524DEFUN(cfg_ts_hopping,
3525 cfg_ts_hopping_cmd,
3526 "hopping enabled (0|1)",
3527 HOPPING_STR "Enable or disable frequency hopping\n"
3528 "Disable frequency hopping\n" "Enable frequency hopping\n")
3529{
3530 struct gsm_bts_trx_ts *ts = vty->index;
Harald Weltec2fb3d02010-06-14 22:47:37 +02003531 int enabled = atoi(argv[0]);
Harald Weltea39b0f22010-06-14 22:26:10 +02003532
Harald Weltec2fb3d02010-06-14 22:47:37 +02003533 if (enabled && !gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_HOPPING)) {
3534 vty_out(vty, "BTS model does not support hopping%s",
3535 VTY_NEWLINE);
3536 return CMD_WARNING;
3537 }
3538
3539 ts->hopping.enabled = enabled;
Harald Weltea39b0f22010-06-14 22:26:10 +02003540
3541 return CMD_SUCCESS;
3542}
3543
Harald Welte6e0cd042009-09-12 13:05:33 +02003544DEFUN(cfg_ts_hsn,
3545 cfg_ts_hsn_cmd,
Harald Weltea39b0f22010-06-14 22:26:10 +02003546 "hopping sequence-number <0-63>",
3547 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003548 "Which hopping sequence to use for this channel\n"
3549 "Hopping Sequence Number (HSN)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003550{
3551 struct gsm_bts_trx_ts *ts = vty->index;
3552
3553 ts->hopping.hsn = atoi(argv[0]);
3554
3555 return CMD_SUCCESS;
3556}
3557
3558DEFUN(cfg_ts_maio,
3559 cfg_ts_maio_cmd,
3560 "hopping maio <0-63>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003561 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003562 "Which hopping MAIO to use for this channel\n"
3563 "Mobile Allocation Index Offset (MAIO)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003564{
3565 struct gsm_bts_trx_ts *ts = vty->index;
3566
3567 ts->hopping.maio = atoi(argv[0]);
3568
3569 return CMD_SUCCESS;
3570}
3571
3572DEFUN(cfg_ts_arfcn_add,
3573 cfg_ts_arfcn_add_cmd,
3574 "hopping arfcn add <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003575 HOPPING_STR "Configure hopping ARFCN list\n"
3576 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003577{
3578 struct gsm_bts_trx_ts *ts = vty->index;
3579 int arfcn = atoi(argv[0]);
3580
Harald Weltea39b0f22010-06-14 22:26:10 +02003581 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
3582
Harald Welte6e0cd042009-09-12 13:05:33 +02003583 return CMD_SUCCESS;
3584}
3585
3586DEFUN(cfg_ts_arfcn_del,
3587 cfg_ts_arfcn_del_cmd,
3588 "hopping arfcn del <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003589 HOPPING_STR "Configure hopping ARFCN list\n"
3590 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003591{
3592 struct gsm_bts_trx_ts *ts = vty->index;
3593 int arfcn = atoi(argv[0]);
3594
Harald Weltea39b0f22010-06-14 22:26:10 +02003595 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
3596
Harald Welte6e0cd042009-09-12 13:05:33 +02003597 return CMD_SUCCESS;
3598}
3599
Harald Weltea6fd58e2009-08-07 00:25:23 +02003600DEFUN(cfg_ts_e1_subslot,
3601 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003602 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003603 "E1/T1 channel connected to this on-air timeslot\n"
3604 "E1/T1 channel connected to this on-air timeslot\n"
3605 "E1/T1 line connected to this on-air timeslot\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02003606 "E1/T1 timeslot connected to this on-air timeslot\n"
3607 "E1/T1 timeslot connected to this on-air timeslot\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02003608 "E1/T1 sub-slot connected to this on-air timeslot\n"
3609 "E1/T1 sub-slot 0 connected to this on-air timeslot\n"
3610 "E1/T1 sub-slot 1 connected to this on-air timeslot\n"
3611 "E1/T1 sub-slot 2 connected to this on-air timeslot\n"
3612 "E1/T1 sub-slot 3 connected to this on-air timeslot\n"
3613 "Full E1/T1 timeslot connected to this on-air timeslot\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003614{
3615 struct gsm_bts_trx_ts *ts = vty->index;
3616
Harald Welte42581822009-08-08 16:12:58 +02003617 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003618
3619 return CMD_SUCCESS;
3620}
Harald Welte5258fc42009-03-28 19:07:53 +00003621
Harald Welte4f10c252010-05-16 21:47:13 +02003622void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
3623{
3624 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003625 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_TOTAL].current,
3626 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_NO_CHANNEL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003627 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003628 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003629 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RF_FAIL].current,
3630 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RLL_ERR].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003631 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003632 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003633 net->bsc_ctrs->ctr[BSC_CTR_PAGING_ATTEMPTED].current,
3634 net->bsc_ctrs->ctr[BSC_CTR_PAGING_COMPLETED].current,
3635 net->bsc_ctrs->ctr[BSC_CTR_PAGING_EXPIRED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003636 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003637 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003638 net->bsc_ctrs->ctr[BSC_CTR_BTS_OML_FAIL].current,
3639 net->bsc_ctrs->ctr[BSC_CTR_BTS_RSL_FAIL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003640 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003641}
3642
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003643DEFUN(drop_bts,
3644 drop_bts_cmd,
Holger Hans Peter Freyther0586b0f2010-04-11 12:46:45 +02003645 "drop bts connection <0-65535> (oml|rsl)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003646 "Debug/Simulation command to drop Abis/IP BTS\n"
3647 "Debug/Simulation command to drop Abis/IP BTS\n"
3648 "Debug/Simulation command to drop Abis/IP BTS\n"
3649 "BTS NR\n" "Drop OML Connection\n" "Drop RSL Connection\n")
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003650{
3651 struct gsm_network *gsmnet;
3652 struct gsm_bts_trx *trx;
3653 struct gsm_bts *bts;
3654 unsigned int bts_nr;
3655
3656 gsmnet = gsmnet_from_vty(vty);
3657
3658 bts_nr = atoi(argv[0]);
3659 if (bts_nr >= gsmnet->num_bts) {
3660 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3661 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3662 return CMD_WARNING;
3663 }
3664
3665 bts = gsm_bts_num(gsmnet, bts_nr);
3666 if (!bts) {
3667 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3668 return CMD_WARNING;
3669 }
3670
3671 if (!is_ipaccess_bts(bts)) {
3672 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
3673 return CMD_WARNING;
3674 }
3675
3676
3677 /* close all connections */
3678 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003679 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003680 } else if (strcmp(argv[1], "rsl") == 0) {
3681 /* close all rsl connections */
3682 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003683 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003684 }
3685 } else {
3686 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
3687 return CMD_WARNING;
3688 }
3689
3690 return CMD_SUCCESS;
3691}
3692
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01003693DEFUN(restart_bts, restart_bts_cmd,
3694 "restart-bts <0-65535>",
3695 "Restart ip.access nanoBTS through OML\n"
3696 "BTS Number\n")
3697{
3698 struct gsm_network *gsmnet;
3699 struct gsm_bts_trx *trx;
3700 struct gsm_bts *bts;
3701 unsigned int bts_nr;
3702
3703 gsmnet = gsmnet_from_vty(vty);
3704
3705 bts_nr = atoi(argv[0]);
3706 if (bts_nr >= gsmnet->num_bts) {
3707 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3708 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3709 return CMD_WARNING;
3710 }
3711
3712 bts = gsm_bts_num(gsmnet, bts_nr);
3713 if (!bts) {
3714 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3715 return CMD_WARNING;
3716 }
3717
3718 if (!is_ipaccess_bts(bts) || is_sysmobts_v2(bts)) {
3719 vty_out(vty, "This command only works for ipaccess nanoBTS.%s",
3720 VTY_NEWLINE);
3721 return CMD_WARNING;
3722 }
3723
3724 /* go from last TRX to c0 */
3725 llist_for_each_entry_reverse(trx, &bts->trx_list, list)
3726 abis_nm_ipaccess_restart(trx);
3727
3728 return CMD_SUCCESS;
3729}
3730
Harald Welte30f1f372014-12-28 15:00:45 +01003731DEFUN(smscb_cmd, smscb_cmd_cmd,
3732 "bts <0-255> smscb-command <1-4> HEXSTRING",
3733 "BTS related commands\n" "BTS Number\n"
3734 "SMS Cell Broadcast\n" "Last Valid Block\n"
3735 "Hex Encoded SMSCB message (up to 88 octets)\n")
3736{
3737 struct gsm_bts *bts;
3738 int bts_nr = atoi(argv[0]);
3739 int last_block = atoi(argv[1]);
3740 struct rsl_ie_cb_cmd_type cb_cmd;
3741 uint8_t buf[88];
3742 int rc;
3743
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +02003744 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
Harald Welte30f1f372014-12-28 15:00:45 +01003745 if (!bts) {
3746 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3747 return CMD_WARNING;
3748 }
3749 rc = osmo_hexparse(argv[2], buf, sizeof(buf));
3750 if (rc < 0 || rc > sizeof(buf)) {
3751 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
3752 return CMD_WARNING;
3753 }
3754
3755 cb_cmd.spare = 0;
3756 cb_cmd.def_bcast = 0;
3757 cb_cmd.command = RSL_CB_CMD_TYPE_NORMAL;
3758
3759 switch (last_block) {
3760 case 1:
3761 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_1;
3762 break;
3763 case 2:
3764 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_2;
3765 break;
3766 case 3:
3767 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_3;
3768 break;
3769 case 4:
3770 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_4;
3771 break;
3772 }
3773
3774 rsl_sms_cb_command(bts, RSL_CHAN_SDCCH4_ACCH, cb_cmd, buf, rc);
3775
3776 return CMD_SUCCESS;
3777}
3778
3779
Harald Welted0d2b0b2010-12-23 13:18:07 +01003780DEFUN(pdch_act, pdch_act_cmd,
3781 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
3782 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3783 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
3784 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
3785 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
3786{
3787 struct gsm_bts *bts;
3788 struct gsm_bts_trx *trx;
3789 struct gsm_bts_trx_ts *ts;
3790 int bts_nr = atoi(argv[0]);
3791 int trx_nr = atoi(argv[1]);
3792 int ts_nr = atoi(argv[2]);
3793 int activate;
3794
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +02003795 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
Harald Welted0d2b0b2010-12-23 13:18:07 +01003796 if (!bts) {
3797 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3798 return CMD_WARNING;
3799 }
3800
3801 if (!is_ipaccess_bts(bts)) {
3802 vty_out(vty, "%% This command only works for ipaccess BTS%s",
3803 VTY_NEWLINE);
3804 return CMD_WARNING;
3805 }
3806
3807 trx = gsm_bts_trx_num(bts, trx_nr);
3808 if (!trx) {
3809 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
3810 return CMD_WARNING;
3811 }
3812
3813 ts = &trx->ts[ts_nr];
3814 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
3815 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
3816 "mode%s", ts_nr, VTY_NEWLINE);
3817 return CMD_WARNING;
3818 }
3819
3820 if (!strcmp(argv[3], "activate"))
3821 activate = 1;
3822 else
3823 activate = 0;
3824
3825 rsl_ipacc_pdch_activate(ts, activate);
3826
3827 return CMD_SUCCESS;
3828
3829}
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003830
Harald Weltedcccb182010-05-16 20:52:23 +02003831extern int bsc_vty_init_extra(void);
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02003832
Neels Hofmeyr43d86bf2016-05-10 13:40:19 +02003833int bsc_vty_init(const struct log_info *cat, struct gsm_network *network)
Harald Welte68628e82009-03-10 12:17:57 +00003834{
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003835 cfg_ts_pchan_cmd.string =
3836 vty_cmd_string_from_valstr(tall_bsc_ctx,
3837 gsm_pchant_names,
3838 "phys_chan_config (", "|", ")",
3839 VTY_DO_LOWER);
3840 cfg_ts_pchan_cmd.doc =
3841 vty_cmd_string_from_valstr(tall_bsc_ctx,
3842 gsm_pchant_descs,
3843 "Physical Channel Combination\n",
3844 "\n", "", 0);
3845
Harald Weltee555c2b2012-08-17 13:02:12 +02003846 cfg_bts_type_cmd.string =
3847 vty_cmd_string_from_valstr(tall_bsc_ctx,
3848 bts_type_names,
3849 "type (", "|", ")",
3850 VTY_DO_LOWER);
3851 cfg_bts_type_cmd.doc =
3852 vty_cmd_string_from_valstr(tall_bsc_ctx,
3853 bts_type_descs,
3854 "BTS Vendor/Type\n",
3855 "\n", "", 0);
3856
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +02003857 common_cs_vty_init(network, config_write_net);
Harald Weltee555c2b2012-08-17 13:02:12 +02003858
Neels Hofmeyrea11bf82016-05-12 01:53:23 +02003859 install_element_ve(&bsc_show_net_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +00003860 install_element_ve(&show_bts_cmd);
3861 install_element_ve(&show_trx_cmd);
3862 install_element_ve(&show_ts_cmd);
3863 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08003864 install_element_ve(&show_lchan_summary_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00003865
Harald Welteb4d5b172010-05-12 16:10:35 +00003866 install_element_ve(&show_paging_cmd);
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01003867 install_element_ve(&show_paging_group_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00003868
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01003869 logging_vty_add_cmds(cat);
Jacob Erlbeck64630cc2015-10-26 16:25:37 +01003870 osmo_stats_vty_add_cmds();
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01003871
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01003872 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01003873 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-12-21 16:51:50 +01003874 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
3875 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
3876 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
3877 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
3878 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
3879 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01003880 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01003881 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
3882 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
3883 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
3884 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
3885 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
3886 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
3887 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
3888 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
3889 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltec9f499f2010-12-23 22:53:50 +01003890 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01003891 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08003892 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08003893 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02003894
3895 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02003896 install_node(&bts_node, config_write_bts);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01003897 vty_install_default(BTS_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00003898 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02003899 install_element(BTS_NODE, &cfg_description_cmd);
3900 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02003901 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02003902 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Maxc08ee712016-05-11 12:45:13 +02003903 install_element(BTS_NODE, &cfg_bts_dtxu_cmd);
3904 install_element(BTS_NODE, &cfg_bts_dtxd_cmd);
3905 install_element(BTS_NODE, &cfg_bts_no_dtxu_cmd);
3906 install_element(BTS_NODE, &cfg_bts_no_dtxd_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00003907 install_element(BTS_NODE, &cfg_bts_lac_cmd);
3908 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02003909 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00003910 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8b291802013-03-12 13:57:05 +01003911 install_element(BTS_NODE, &cfg_bts_rsl_ip_cmd);
Sylvain Munautc9519462011-10-17 14:04:55 +02003912 install_element(BTS_NODE, &cfg_bts_nokia_site_skip_reset_cmd);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01003913 install_element(BTS_NODE, &cfg_bts_nokia_site_no_loc_rel_cnf_cmd);
Sipos Csaba56e17662015-02-07 13:27:36 +01003914 install_element(BTS_NODE, &cfg_bts_nokia_site_bts_reset_timer_cnf_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02003915 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-08-08 16:12:58 +02003916 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
3917 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte7a8fa412009-08-10 13:48:16 +02003918 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01003919 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
3920 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02003921 install_element(BTS_NODE, &cfg_bts_chan_desc_att_cmd);
3922 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_pa_mfrms_cmd);
3923 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_ag_blks_res_cmd);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08003924 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
3925 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02003926 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08003927 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Ivan Kluchnikov67920592013-09-16 13:13:04 +04003928 install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02003929 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02003930 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02003931 install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
Harald Welte73225282009-12-12 18:17:25 +01003932 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
3933 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaute0b06b02010-11-28 18:17:28 +01003934 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
3935 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
3936 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
3937 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
3938 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
3939 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01003940 install_element(BTS_NODE, &cfg_bts_radio_link_timeout_cmd);
Harald Welte4511d892010-04-18 15:51:20 +02003941 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
bhargava350533c2016-07-21 11:14:34 +05303942 install_element(BTS_NODE, &cfg_bts_gprs_11bit_rach_support_for_egprs_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02003943 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08003944 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01003945 install_element(BTS_NODE, &cfg_bts_gprs_net_ctrl_ord_cmd);
Max292ec582016-07-28 11:55:37 +02003946 install_element(BTS_NODE, &cfg_bts_gprs_ctrl_ack_cmd);
3947 install_element(BTS_NODE, &cfg_no_bts_gprs_ctrl_ack_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08003948 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02003949 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08003950 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08003951 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-03-14 23:30:30 +08003952 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
3953 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
3954 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08003955 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welte9fbff4a2010-07-30 11:50:09 +02003956 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
3957 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welte32c09622011-01-11 23:44:56 +01003958 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
3959 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Welte64c07d22011-02-15 11:43:27 +01003960 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Max59a1bf32016-04-15 16:04:46 +02003961 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_add_cmd);
3962 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_del_cmd);
Max26679e02016-04-20 15:57:13 +02003963 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_add_cmd);
3964 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_del_cmd);
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02003965 install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
3966 install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01003967 install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
3968 install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
Andreas Eversberga83d5112013-12-07 18:32:28 +01003969 install_element(BTS_NODE, &cfg_bts_codec0_cmd);
3970 install_element(BTS_NODE, &cfg_bts_codec1_cmd);
3971 install_element(BTS_NODE, &cfg_bts_codec2_cmd);
3972 install_element(BTS_NODE, &cfg_bts_codec3_cmd);
3973 install_element(BTS_NODE, &cfg_bts_codec4_cmd);
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01003974 install_element(BTS_NODE, &cfg_bts_depends_on_cmd);
3975 install_element(BTS_NODE, &cfg_bts_no_depends_on_cmd);
Andreas Eversberg73266522014-01-19 11:47:44 +01003976 install_element(BTS_NODE, &cfg_bts_amr_fr_modes1_cmd);
3977 install_element(BTS_NODE, &cfg_bts_amr_fr_modes2_cmd);
3978 install_element(BTS_NODE, &cfg_bts_amr_fr_modes3_cmd);
3979 install_element(BTS_NODE, &cfg_bts_amr_fr_modes4_cmd);
3980 install_element(BTS_NODE, &cfg_bts_amr_fr_thres1_cmd);
3981 install_element(BTS_NODE, &cfg_bts_amr_fr_thres2_cmd);
3982 install_element(BTS_NODE, &cfg_bts_amr_fr_thres3_cmd);
3983 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst1_cmd);
3984 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst2_cmd);
3985 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst3_cmd);
3986 install_element(BTS_NODE, &cfg_bts_amr_fr_start_mode_cmd);
3987 install_element(BTS_NODE, &cfg_bts_amr_hr_modes1_cmd);
3988 install_element(BTS_NODE, &cfg_bts_amr_hr_modes2_cmd);
3989 install_element(BTS_NODE, &cfg_bts_amr_hr_modes3_cmd);
3990 install_element(BTS_NODE, &cfg_bts_amr_hr_modes4_cmd);
3991 install_element(BTS_NODE, &cfg_bts_amr_hr_thres1_cmd);
3992 install_element(BTS_NODE, &cfg_bts_amr_hr_thres2_cmd);
3993 install_element(BTS_NODE, &cfg_bts_amr_hr_thres3_cmd);
3994 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst1_cmd);
3995 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst2_cmd);
3996 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst3_cmd);
3997 install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00003998
Harald Welte5258fc42009-03-28 19:07:53 +00003999 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004000 install_node(&trx_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004001 vty_install_default(TRX_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004002 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004003 install_element(TRX_NODE, &cfg_description_cmd);
4004 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)7b37d972009-12-27 20:56:38 +01004005 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02004006 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004007 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
4008 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01004009 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004010
Harald Welte5258fc42009-03-28 19:07:53 +00004011 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004012 install_node(&ts_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004013 vty_install_default(TS_NODE);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004014 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004015 install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);
Harald Welte135a6482011-05-30 12:09:13 +02004016 install_element(TS_NODE, &cfg_ts_tsc_cmd);
Harald Weltea39b0f22010-06-14 22:26:10 +02004017 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte6e0cd042009-09-12 13:05:33 +02004018 install_element(TS_NODE, &cfg_ts_hsn_cmd);
4019 install_element(TS_NODE, &cfg_ts_maio_cmd);
4020 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
4021 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004022 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004023
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004024 install_element(ENABLE_NODE, &drop_bts_cmd);
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01004025 install_element(ENABLE_NODE, &restart_bts_cmd);
Harald Welted0d2b0b2010-12-23 13:18:07 +01004026 install_element(ENABLE_NODE, &pdch_act_cmd);
Harald Welte30f1f372014-12-28 15:00:45 +01004027 install_element(ENABLE_NODE, &smscb_cmd_cmd);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004028
Harald Welte81c9b9c2010-05-31 16:40:40 +02004029 abis_nm_vty_init();
Harald Weltee1d5eca2011-02-12 14:42:59 +01004030 abis_om2k_vty_init();
Harald Welte3016d9f2011-02-05 13:54:41 +01004031 e1inp_vty_init();
Harald Welte81c9b9c2010-05-31 16:40:40 +02004032
Harald Weltedcccb182010-05-16 20:52:23 +02004033 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00004034
Harald Welte68628e82009-03-10 12:17:57 +00004035 return 0;
4036}