blob: 7afa8e1291102e9f1271346c3f93cf8f73540f27 [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
Neels Hofmeyr73983952016-05-10 13:29:33 +02001739DEFUN(cfg_net_timezone,
1740 cfg_net_timezone_cmd,
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001741 "timezone <-19-19> (0|15|30|45)",
Neels Hofmeyr73983952016-05-10 13:29:33 +02001742 "Set the Timezone Offset of the network\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001743 "Timezone offset (hours)\n"
1744 "Timezone offset (00 minutes)\n"
1745 "Timezone offset (15 minutes)\n"
1746 "Timezone offset (30 minutes)\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02001747 "Timezone offset (45 minutes)\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001748 )
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001749{
Neels Hofmeyr73983952016-05-10 13:29:33 +02001750 struct gsm_network *net = vty->index;
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001751 int tzhr = atoi(argv[0]);
1752 int tzmn = atoi(argv[1]);
1753
Neels Hofmeyr73983952016-05-10 13:29:33 +02001754 net->tz.hr = tzhr;
1755 net->tz.mn = tzmn;
1756 net->tz.dst = 0;
1757 net->tz.override = 1;
Jacob Erlbeck946d1412013-09-17 13:59:29 +02001758
1759 return CMD_SUCCESS;
1760}
1761
Neels Hofmeyr73983952016-05-10 13:29:33 +02001762DEFUN(cfg_net_timezone_dst,
1763 cfg_net_timezone_dst_cmd,
Jacob Erlbeck946d1412013-09-17 13:59:29 +02001764 "timezone <-19-19> (0|15|30|45) <0-2>",
Neels Hofmeyr73983952016-05-10 13:29:33 +02001765 "Set the Timezone Offset of the network\n"
Jacob Erlbeck946d1412013-09-17 13:59:29 +02001766 "Timezone offset (hours)\n"
1767 "Timezone offset (00 minutes)\n"
1768 "Timezone offset (15 minutes)\n"
1769 "Timezone offset (30 minutes)\n"
1770 "Timezone offset (45 minutes)\n"
1771 "DST offset (hours)\n"
1772 )
1773{
Neels Hofmeyr73983952016-05-10 13:29:33 +02001774 struct gsm_network *net = vty->index;
Jacob Erlbeck946d1412013-09-17 13:59:29 +02001775 int tzhr = atoi(argv[0]);
1776 int tzmn = atoi(argv[1]);
1777 int tzdst = atoi(argv[2]);
1778
Neels Hofmeyr73983952016-05-10 13:29:33 +02001779 net->tz.hr = tzhr;
1780 net->tz.mn = tzmn;
1781 net->tz.dst = tzdst;
1782 net->tz.override = 1;
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001783
1784 return CMD_SUCCESS;
1785}
1786
Neels Hofmeyr73983952016-05-10 13:29:33 +02001787DEFUN(cfg_net_no_timezone,
1788 cfg_net_no_timezone_cmd,
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001789 "no timezone",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001790 NO_STR
Neels Hofmeyr73983952016-05-10 13:29:33 +02001791 "Disable network timezone override, use system tz\n")
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001792{
Neels Hofmeyr73983952016-05-10 13:29:33 +02001793 struct gsm_network *net = vty->index;
Harald Welte45f91712012-07-08 16:48:11 +02001794
Neels Hofmeyr73983952016-05-10 13:29:33 +02001795 net->tz.override = 0;
Harald Welte45f91712012-07-08 16:48:11 +02001796
Gus Bourg1c5dd2c2011-12-02 10:18:17 +01001797 return CMD_SUCCESS;
1798}
Harald Welte78f2f502009-05-23 16:56:52 +00001799
Harald Welte4cc34222009-05-01 15:12:31 +00001800DEFUN(cfg_bts_unit_id,
1801 cfg_bts_unit_id_cmd,
Harald Welte07dc73d2009-08-07 13:27:09 +02001802 "ip.access unit_id <0-65534> <0-255>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001803 "Abis/IP specific options\n"
1804 "Set the IPA BTS Unit ID\n"
1805 "Unit ID (Site)\n"
1806 "Unit ID (BTS)\n")
Harald Welte4cc34222009-05-01 15:12:31 +00001807{
1808 struct gsm_bts *bts = vty->index;
1809 int site_id = atoi(argv[0]);
1810 int bts_id = atoi(argv[1]);
1811
Harald Welte07dc73d2009-08-07 13:27:09 +02001812 if (!is_ipaccess_bts(bts)) {
1813 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1814 return CMD_WARNING;
1815 }
1816
Harald Welte4cc34222009-05-01 15:12:31 +00001817 bts->ip_access.site_id = site_id;
1818 bts->ip_access.bts_id = bts_id;
1819
1820 return CMD_SUCCESS;
1821}
1822
Harald Welte8b291802013-03-12 13:57:05 +01001823DEFUN(cfg_bts_rsl_ip,
1824 cfg_bts_rsl_ip_cmd,
1825 "ip.access rsl-ip A.B.C.D",
1826 "Abis/IP specific options\n"
1827 "Set the IPA RSL IP Address of the BSC\n"
1828 "Destination IP address for RSL connection\n")
1829{
1830 struct gsm_bts *bts = vty->index;
1831 struct in_addr ia;
1832
1833 if (!is_ipaccess_bts(bts)) {
1834 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1835 return CMD_WARNING;
1836 }
1837
1838 inet_aton(argv[0], &ia);
1839 bts->ip_access.rsl_ip = ntohl(ia.s_addr);
1840
1841 return CMD_SUCCESS;
1842}
1843
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001844#define NOKIA_STR "Nokia *Site related commands\n"
Harald Welte8b291802013-03-12 13:57:05 +01001845
Sylvain Munautc9519462011-10-17 14:04:55 +02001846DEFUN(cfg_bts_nokia_site_skip_reset,
1847 cfg_bts_nokia_site_skip_reset_cmd,
1848 "nokia_site skip-reset (0|1)",
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001849 NOKIA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001850 "Skip the reset step during bootstrap process of this BTS\n"
1851 "Do NOT skip the reset\n" "Skip the reset\n")
Sylvain Munautc9519462011-10-17 14:04:55 +02001852{
1853 struct gsm_bts *bts = vty->index;
1854
1855 if (bts->type != GSM_BTS_TYPE_NOKIA_SITE) {
1856 vty_out(vty, "%% BTS is not of Nokia *Site type%s", VTY_NEWLINE);
1857 return CMD_WARNING;
1858 }
1859
1860 bts->nokia.skip_reset = atoi(argv[0]);
1861
1862 return CMD_SUCCESS;
1863}
1864
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001865DEFUN(cfg_bts_nokia_site_no_loc_rel_cnf,
1866 cfg_bts_nokia_site_no_loc_rel_cnf_cmd,
1867 "nokia_site no-local-rel-conf (0|1)",
1868 NOKIA_STR
1869 "Do not wait for RELease CONFirm message when releasing channel locally\n"
1870 "Wait for RELease CONFirm\n" "Do not wait for RELease CONFirm\n")
1871{
1872 struct gsm_bts *bts = vty->index;
1873
1874 if (!is_nokia_bts(bts)) {
1875 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1876 VTY_NEWLINE);
1877 return CMD_WARNING;
1878 }
1879
1880 bts->nokia.no_loc_rel_cnf = atoi(argv[0]);
1881
1882 return CMD_SUCCESS;
1883}
1884
Sipos Csaba56e17662015-02-07 13:27:36 +01001885DEFUN(cfg_bts_nokia_site_bts_reset_timer_cnf,
1886 cfg_bts_nokia_site_bts_reset_timer_cnf_cmd,
1887 "nokia_site bts-reset-timer <15-100>",
1888 NOKIA_STR
1889 "The amount of time (in sec.) between BTS_RESET is sent,\n"
1890 "and the BTS is being bootstrapped.\n")
1891{
1892 struct gsm_bts *bts = vty->index;
1893
1894 if (!is_nokia_bts(bts)) {
1895 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1896 VTY_NEWLINE);
1897 return CMD_WARNING;
1898 }
1899
1900 bts->nokia.bts_reset_timer_cnf = atoi(argv[0]);
1901
1902 return CMD_SUCCESS;
1903}
Harald Welte8f0ed552010-05-11 21:53:49 +02001904#define OML_STR "Organization & Maintenance Link\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001905#define IPA_STR "A-bis/IP Specific Options\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001906
Harald Welte8175e952009-10-20 00:22:00 +02001907DEFUN(cfg_bts_stream_id,
1908 cfg_bts_stream_id_cmd,
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001909 "oml ip.access stream_id <0-255> line E1_LINE",
Harald Welte8f0ed552010-05-11 21:53:49 +02001910 OML_STR IPA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001911 "Set the ip.access Stream ID of the OML link of this BTS\n"
1912 "Stream Identifier\n" "Virtual E1 Line Number\n" "Virtual E1 Line Number\n")
Harald Welte8175e952009-10-20 00:22:00 +02001913{
1914 struct gsm_bts *bts = vty->index;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001915 int stream_id = atoi(argv[0]), linenr = atoi(argv[1]);
Harald Welte8175e952009-10-20 00:22:00 +02001916
1917 if (!is_ipaccess_bts(bts)) {
1918 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1919 return CMD_WARNING;
1920 }
1921
1922 bts->oml_tei = stream_id;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001923 /* This is used by e1inp_bind_ops callback for each BTS model. */
1924 bts->oml_e1_link.e1_nr = linenr;
1925
1926 return CMD_SUCCESS;
1927}
1928
Harald Welted13e0cd2012-08-17 09:52:03 +02001929#define OML_E1_STR OML_STR "OML E1/T1 Configuration\n"
Harald Welte8175e952009-10-20 00:22:00 +02001930
Harald Welte42581822009-08-08 16:12:58 +02001931DEFUN(cfg_bts_oml_e1,
1932 cfg_bts_oml_e1_cmd,
1933 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welted13e0cd2012-08-17 09:52:03 +02001934 OML_E1_STR
1935 "E1/T1 line number to be used for OML\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001936 "E1/T1 line number to be used for OML\n"
1937 "E1/T1 timeslot to be used for OML\n"
1938 "E1/T1 timeslot to be used for OML\n"
1939 "E1/T1 sub-slot to be used for OML\n"
1940 "Use E1/T1 sub-slot 0\n"
1941 "Use E1/T1 sub-slot 1\n"
1942 "Use E1/T1 sub-slot 2\n"
1943 "Use E1/T1 sub-slot 3\n"
1944 "Use full E1 slot 3\n"
1945 )
Harald Welte42581822009-08-08 16:12:58 +02001946{
1947 struct gsm_bts *bts = vty->index;
1948
1949 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
1950
1951 return CMD_SUCCESS;
1952}
1953
1954
1955DEFUN(cfg_bts_oml_e1_tei,
1956 cfg_bts_oml_e1_tei_cmd,
1957 "oml e1 tei <0-63>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001958 OML_E1_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001959 "Set the TEI to be used for OML\n"
1960 "TEI Number\n")
Harald Welte42581822009-08-08 16:12:58 +02001961{
1962 struct gsm_bts *bts = vty->index;
1963
1964 bts->oml_tei = atoi(argv[0]);
1965
1966 return CMD_SUCCESS;
1967}
1968
Harald Welte7a8fa412009-08-10 13:48:16 +02001969DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1970 "channel allocator (ascending|descending)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001971 "Channnel Allocator\n" "Channel Allocator\n"
1972 "Allocate Timeslots and Transceivers in ascending order\n"
1973 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte7a8fa412009-08-10 13:48:16 +02001974{
1975 struct gsm_bts *bts = vty->index;
1976
1977 if (!strcmp(argv[0], "ascending"))
1978 bts->chan_alloc_reverse = 0;
1979 else
1980 bts->chan_alloc_reverse = 1;
1981
1982 return CMD_SUCCESS;
1983}
1984
Harald Welte8f0ed552010-05-11 21:53:49 +02001985#define RACH_STR "Random Access Control Channel\n"
1986
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001987DEFUN(cfg_bts_rach_tx_integer,
1988 cfg_bts_rach_tx_integer_cmd,
1989 "rach tx integer <0-15>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001990 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001991 "Set the raw tx integer value in RACH Control parameters IE\n"
1992 "Set the raw tx integer value in RACH Control parameters IE\n"
1993 "Raw tx integer value in RACH Control parameters IE\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001994{
1995 struct gsm_bts *bts = vty->index;
1996 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
1997 return CMD_SUCCESS;
1998}
1999
2000DEFUN(cfg_bts_rach_max_trans,
2001 cfg_bts_rach_max_trans_cmd,
2002 "rach max transmission (1|2|4|7)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002003 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002004 "Set the maximum number of RACH burst transmissions\n"
2005 "Set the maximum number of RACH burst transmissions\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02002006 "Maximum number of 1 RACH burst transmissions\n"
2007 "Maximum number of 2 RACH burst transmissions\n"
2008 "Maximum number of 4 RACH burst transmissions\n"
2009 "Maximum number of 7 RACH burst transmissions\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01002010{
2011 struct gsm_bts *bts = vty->index;
2012 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
2013 return CMD_SUCCESS;
2014}
2015
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02002016#define CD_STR "Channel Description\n"
2017
2018DEFUN(cfg_bts_chan_desc_att,
2019 cfg_bts_chan_desc_att_cmd,
2020 "channel-descrption attach (0|1)",
2021 CD_STR
2022 "Set if attachment is required\n"
2023 "Attachment is NOT required\n"
2024 "Attachment is required (standard)\n")
2025{
2026 struct gsm_bts *bts = vty->index;
2027 bts->si_common.chan_desc.att = atoi(argv[0]);
2028 return CMD_SUCCESS;
2029}
2030
2031DEFUN(cfg_bts_chan_desc_bs_pa_mfrms,
2032 cfg_bts_chan_desc_bs_pa_mfrms_cmd,
2033 "channel-descrption bs-pa-mfrms <2-9>",
2034 CD_STR
2035 "Set number of multiframe periods for paging groups\n"
2036 "Number of multiframe periods for paging groups\n")
2037{
2038 struct gsm_bts *bts = vty->index;
2039 int bs_pa_mfrms = atoi(argv[0]);
2040
2041 bts->si_common.chan_desc.bs_pa_mfrms = bs_pa_mfrms - 2;
2042 return CMD_SUCCESS;
2043}
2044
2045DEFUN(cfg_bts_chan_desc_bs_ag_blks_res,
2046 cfg_bts_chan_desc_bs_ag_blks_res_cmd,
2047 "channel-descrption bs-ag-blks-res <0-7>",
2048 CD_STR
2049 "Set number of blocks reserved for access grant\n"
2050 "Number of blocks reserved for access grant\n")
2051{
2052 struct gsm_bts *bts = vty->index;
2053 int bs_ag_blks_res = atoi(argv[0]);
2054
2055 bts->si_common.chan_desc.bs_ag_blks_res = bs_ag_blks_res;
2056 return CMD_SUCCESS;
2057}
2058
Harald Welte8f0ed552010-05-11 21:53:49 +02002059#define NM_STR "Network Management\n"
2060
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002061DEFUN(cfg_bts_rach_nm_b_thresh,
2062 cfg_bts_rach_nm_b_thresh_cmd,
2063 "rach nm busy threshold <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002064 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002065 "Set the NM Busy Threshold\n"
2066 "Set the NM Busy Threshold\n"
2067 "NM Busy Threshold in dB")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002068{
2069 struct gsm_bts *bts = vty->index;
2070 bts->rach_b_thresh = atoi(argv[0]);
2071 return CMD_SUCCESS;
2072}
2073
2074DEFUN(cfg_bts_rach_nm_ldavg,
2075 cfg_bts_rach_nm_ldavg_cmd,
2076 "rach nm load average <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002077 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002078 "Set the NM Loadaverage Slots value\n"
2079 "Set the NM Loadaverage Slots value\n"
2080 "NM Loadaverage Slots value\n")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002081{
2082 struct gsm_bts *bts = vty->index;
2083 bts->rach_ldavg_slots = atoi(argv[0]);
2084 return CMD_SUCCESS;
2085}
2086
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002087DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
2088 "cell barred (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002089 "Should this cell be barred from access?\n"
2090 "Should this cell be barred from access?\n"
2091 "Cell should NOT be barred\n"
2092 "Cell should be barred\n")
2093
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002094{
2095 struct gsm_bts *bts = vty->index;
2096
Harald Welte71355012009-12-21 23:08:18 +01002097 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002098
2099 return CMD_SUCCESS;
2100}
2101
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002102DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
2103 "rach emergency call allowed (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002104 RACH_STR
2105 "Should this cell allow emergency calls?\n"
2106 "Should this cell allow emergency calls?\n"
2107 "Should this cell allow emergency calls?\n"
2108 "Do NOT allow emergency calls\n"
2109 "Allow emergency calls\n")
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002110{
2111 struct gsm_bts *bts = vty->index;
2112
2113 if (atoi(argv[0]) == 0)
2114 bts->si_common.rach_control.t2 |= 0x4;
2115 else
2116 bts->si_common.rach_control.t2 &= ~0x4;
2117
2118 return CMD_SUCCESS;
2119}
2120
Ivan Kluchnikov67920592013-09-16 13:13:04 +04002121DEFUN(cfg_bts_rach_ac_class, cfg_bts_rach_ac_class_cmd,
2122 "rach access-control-class (0|1|2|3|4|5|6|7|8|9|11|12|13|14|15) (barred|allowed)",
2123 RACH_STR
2124 "Set access control class\n"
2125 "Access control class 0\n"
2126 "Access control class 1\n"
2127 "Access control class 2\n"
2128 "Access control class 3\n"
2129 "Access control class 4\n"
2130 "Access control class 5\n"
2131 "Access control class 6\n"
2132 "Access control class 7\n"
2133 "Access control class 8\n"
2134 "Access control class 9\n"
2135 "Access control class 11 for PLMN use\n"
2136 "Access control class 12 for security services\n"
2137 "Access control class 13 for public utilities (e.g. water/gas suppliers)\n"
2138 "Access control class 14 for emergency services\n"
2139 "Access control class 15 for PLMN staff\n"
2140 "barred to use access control class\n"
2141 "allowed to use access control class\n")
2142{
2143 struct gsm_bts *bts = vty->index;
2144
2145 uint8_t control_class;
2146 uint8_t allowed = 0;
2147
2148 if (strcmp(argv[1], "allowed") == 0)
2149 allowed = 1;
2150
2151 control_class = atoi(argv[0]);
2152 if (control_class < 8)
2153 if (allowed)
2154 bts->si_common.rach_control.t3 &= ~(0x1 << control_class);
2155 else
2156 bts->si_common.rach_control.t3 |= (0x1 << control_class);
2157 else
2158 if (allowed)
2159 bts->si_common.rach_control.t2 &= ~(0x1 << (control_class - 8));
2160 else
2161 bts->si_common.rach_control.t2 |= (0x1 << (control_class - 8));
2162
2163 return CMD_SUCCESS;
2164}
2165
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002166DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
2167 "ms max power <0-40>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002168 "MS Options\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02002169 "Maximum transmit power of the MS\n"
2170 "Maximum transmit power of the MS\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002171 "Maximum transmit power of the MS in dBm")
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002172{
2173 struct gsm_bts *bts = vty->index;
2174
2175 bts->ms_max_power = atoi(argv[0]);
2176
2177 return CMD_SUCCESS;
2178}
2179
Harald Weltecfaabbb2012-08-16 23:23:50 +02002180#define CELL_STR "Cell Parameters\n"
2181
Harald Welte73225282009-12-12 18:17:25 +01002182DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
2183 "cell reselection hysteresis <0-14>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002184 CELL_STR "Cell re-selection parameters\n"
2185 "Cell Re-Selection Hysteresis in dB\n"
Harald Welte73225282009-12-12 18:17:25 +01002186 "Cell Re-Selection Hysteresis in dB")
2187{
2188 struct gsm_bts *bts = vty->index;
2189
2190 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
2191
2192 return CMD_SUCCESS;
2193}
2194
2195DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
2196 "rxlev access min <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002197 "Minimum RxLev needed for cell access\n"
2198 "Minimum RxLev needed for cell access\n"
2199 "Minimum RxLev needed for cell access\n"
Harald Welte73225282009-12-12 18:17:25 +01002200 "Minimum RxLev needed for cell access (better than -110dBm)")
2201{
2202 struct gsm_bts *bts = vty->index;
2203
2204 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
2205
2206 return CMD_SUCCESS;
2207}
2208
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002209DEFUN(cfg_bts_cell_bar_qualify, cfg_bts_cell_bar_qualify_cmd,
2210 "cell bar qualify (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002211 CELL_STR "Cell Bar Qualify\n" "Cell Bar Qualify\n"
2212 "Set CBQ to 0\n" "Set CBQ to 1\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002213{
2214 struct gsm_bts *bts = vty->index;
2215
2216 bts->si_common.cell_ro_sel_par.present = 1;
2217 bts->si_common.cell_ro_sel_par.cbq = atoi(argv[0]);
2218
2219 return CMD_SUCCESS;
2220}
2221
2222DEFUN(cfg_bts_cell_resel_ofs, cfg_bts_cell_resel_ofs_cmd,
2223 "cell reselection offset <0-126>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002224 CELL_STR "Cell Re-Selection Parameters\n"
2225 "Cell Re-Selection Offset (CRO) in dB\n"
2226 "Cell Re-Selection Offset (CRO) in dB\n"
2227 )
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002228{
2229 struct gsm_bts *bts = vty->index;
2230
2231 bts->si_common.cell_ro_sel_par.present = 1;
2232 bts->si_common.cell_ro_sel_par.cell_resel_off = atoi(argv[0])/2;
2233
2234 return CMD_SUCCESS;
2235}
2236
2237DEFUN(cfg_bts_temp_ofs, cfg_bts_temp_ofs_cmd,
2238 "temporary offset <0-60>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002239 "Cell selection temporary negative offset\n"
2240 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002241 "Cell selection temporary negative offset in dB")
2242{
2243 struct gsm_bts *bts = vty->index;
2244
2245 bts->si_common.cell_ro_sel_par.present = 1;
2246 bts->si_common.cell_ro_sel_par.temp_offs = atoi(argv[0])/10;
2247
2248 return CMD_SUCCESS;
2249}
2250
2251DEFUN(cfg_bts_temp_ofs_inf, cfg_bts_temp_ofs_inf_cmd,
2252 "temporary offset infinite",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002253 "Cell selection temporary negative offset\n"
2254 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002255 "Sets cell selection temporary negative offset to infinity")
2256{
2257 struct gsm_bts *bts = vty->index;
2258
2259 bts->si_common.cell_ro_sel_par.present = 1;
2260 bts->si_common.cell_ro_sel_par.temp_offs = 7;
2261
2262 return CMD_SUCCESS;
2263}
2264
2265DEFUN(cfg_bts_penalty_time, cfg_bts_penalty_time_cmd,
2266 "penalty time <20-620>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002267 "Cell selection penalty time\n"
2268 "Cell selection penalty time\n"
2269 "Cell selection penalty time in seconds (by 20s increments)\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002270{
2271 struct gsm_bts *bts = vty->index;
2272
2273 bts->si_common.cell_ro_sel_par.present = 1;
2274 bts->si_common.cell_ro_sel_par.penalty_time = (atoi(argv[0])-20)/20;
2275
2276 return CMD_SUCCESS;
2277}
2278
2279DEFUN(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd,
2280 "penalty time reserved",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002281 "Cell selection penalty time\n"
2282 "Cell selection penalty time\n"
2283 "Set cell selection penalty time to reserved value 31, "
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002284 "(indicate that CELL_RESELECT_OFFSET is subtracted from C2 "
2285 "and TEMPORARY_OFFSET is ignored)")
2286{
2287 struct gsm_bts *bts = vty->index;
2288
2289 bts->si_common.cell_ro_sel_par.present = 1;
2290 bts->si_common.cell_ro_sel_par.penalty_time = 31;
2291
2292 return CMD_SUCCESS;
2293}
2294
Harald Welte (local)efc92312009-08-14 23:09:25 +02002295DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
Daniel Willmann4d62d632012-12-27 00:02:01 +01002296 "periodic location update <6-1530>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002297 "Periodic Location Updating Interval\n"
2298 "Periodic Location Updating Interval\n"
2299 "Periodic Location Updating Interval\n"
2300 "Periodic Location Updating Interval in Minutes\n")
Harald Welte (local)efc92312009-08-14 23:09:25 +02002301{
2302 struct gsm_bts *bts = vty->index;
2303
Dieter Spaard6613e02010-10-05 21:10:55 +02002304 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
Harald Welte (local)efc92312009-08-14 23:09:25 +02002305
2306 return CMD_SUCCESS;
2307}
2308
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002309DEFUN(cfg_bts_no_per_loc_upd, cfg_bts_no_per_loc_upd_cmd,
2310 "no periodic location update",
2311 NO_STR
2312 "Periodic Location Updating Interval\n"
2313 "Periodic Location Updating Interval\n"
2314 "Periodic Location Updating Interval\n")
2315{
2316 struct gsm_bts *bts = vty->index;
2317
2318 bts->si_common.chan_desc.t3212 = 0;
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01002319
2320 return CMD_SUCCESS;
2321}
2322
2323DEFUN(cfg_bts_radio_link_timeout, cfg_bts_radio_link_timeout_cmd,
2324 "radio-link-timeout <4-64>",
2325 "Radio link timeout criterion (BTS side)\n"
2326 "Radio link timeout value (lost SACCH block)\n")
2327{
2328 struct gsm_bts *bts = vty->index;
2329
2330 set_radio_link_timeout(&bts->si_common.cell_options, atoi(argv[0]));
2331
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002332 return CMD_SUCCESS;
2333}
2334
Harald Welte8f0ed552010-05-11 21:53:49 +02002335#define GPRS_TEXT "GPRS Packet Network\n"
2336
Harald Welteaf387632010-03-14 23:30:30 +08002337DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welte57ba7e32010-04-18 14:00:26 +02002338 "gprs cell bvci <2-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002339 GPRS_TEXT
2340 "GPRS Cell Settings\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002341 "GPRS BSSGP VC Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002342 "GPRS BSSGP VC Identifier")
2343{
2344 struct gsm_bts *bts = vty->index;
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 Welte97a282b2010-03-14 15:37:43 +08002351 bts->gprs.cell.bvci = atoi(argv[0]);
2352
2353 return CMD_SUCCESS;
2354}
2355
Harald Weltea5731cf2010-03-22 11:48:36 +08002356DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
2357 "gprs nsei <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002358 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002359 "GPRS NS Entity Identifier\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002360 "GPRS NS Entity Identifier")
2361{
2362 struct gsm_bts *bts = vty->index;
2363
Harald Welte4511d892010-04-18 15:51:20 +02002364 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltea5731cf2010-03-22 11:48:36 +08002365 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2366 return CMD_WARNING;
2367 }
2368
2369 bts->gprs.nse.nsei = atoi(argv[0]);
2370
2371 return CMD_SUCCESS;
2372}
2373
Harald Welte8f0ed552010-05-11 21:53:49 +02002374#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
2375 "NSVC Logical Number\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002376
Harald Welte97a282b2010-03-14 15:37:43 +08002377DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
2378 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002379 GPRS_TEXT NSVC_TEXT
2380 "NS Virtual Connection Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002381 "GPRS NS VC Identifier")
2382{
2383 struct gsm_bts *bts = vty->index;
2384 int idx = atoi(argv[0]);
2385
Harald Welte4511d892010-04-18 15:51:20 +02002386 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002387 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2388 return CMD_WARNING;
2389 }
2390
Harald Welte97a282b2010-03-14 15:37:43 +08002391 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
2392
2393 return CMD_SUCCESS;
2394}
2395
Harald Welteaf387632010-03-14 23:30:30 +08002396DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
2397 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002398 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002399 "GPRS NS Local UDP Port\n"
2400 "GPRS NS Local UDP Port\n"
2401 "GPRS NS Local UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002402 "GPRS NS Local UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002403{
2404 struct gsm_bts *bts = vty->index;
2405 int idx = atoi(argv[0]);
2406
Harald Welte4511d892010-04-18 15:51:20 +02002407 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002408 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2409 return CMD_WARNING;
2410 }
2411
Harald Welteaf387632010-03-14 23:30:30 +08002412 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
2413
2414 return CMD_SUCCESS;
2415}
2416
2417DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
2418 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002419 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002420 "GPRS NS Remote UDP Port\n"
2421 "GPRS NS Remote UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002422 "GPRS NS Remote UDP Port\n"
2423 "GPRS NS Remote UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002424{
2425 struct gsm_bts *bts = vty->index;
2426 int idx = atoi(argv[0]);
2427
Harald Welte4511d892010-04-18 15:51:20 +02002428 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002429 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2430 return CMD_WARNING;
2431 }
2432
Harald Welteaf387632010-03-14 23:30:30 +08002433 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
2434
2435 return CMD_SUCCESS;
2436}
2437
2438DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
2439 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte8f0ed552010-05-11 21:53:49 +02002440 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002441 "GPRS NS Remote IP Address\n"
2442 "GPRS NS Remote IP Address\n"
2443 "GPRS NS Remote IP Address\n")
Harald Welteaf387632010-03-14 23:30:30 +08002444{
2445 struct gsm_bts *bts = vty->index;
2446 int idx = atoi(argv[0]);
2447 struct in_addr ia;
2448
Harald Welte4511d892010-04-18 15:51:20 +02002449 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002450 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2451 return CMD_WARNING;
2452 }
2453
Harald Welteaf387632010-03-14 23:30:30 +08002454 inet_aton(argv[1], &ia);
2455 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
2456
2457 return CMD_SUCCESS;
2458}
2459
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002460DEFUN(cfg_bts_pag_free, cfg_bts_pag_free_cmd,
Harald Weltecfaabbb2012-08-16 23:23:50 +02002461 "paging free <-1-1024>",
2462 "Paging options\n"
2463 "Only page when having a certain amount of free slots\n"
2464 "amount of required free paging slots. -1 to disable\n")
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002465{
2466 struct gsm_bts *bts = vty->index;
2467
2468 bts->paging.free_chans_need = atoi(argv[0]);
2469 return CMD_SUCCESS;
2470}
2471
Harald Welte615e9562010-05-11 23:50:21 +02002472DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
2473 "gprs ns timer " NS_TIMERS " <0-255>",
2474 GPRS_TEXT "Network Service\n"
2475 "Network Service Timer\n"
2476 NS_TIMERS_HELP "Timer Value\n")
2477{
2478 struct gsm_bts *bts = vty->index;
2479 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
2480 int val = atoi(argv[1]);
2481
2482 if (bts->gprs.mode == BTS_GPRS_NONE) {
2483 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2484 return CMD_WARNING;
2485 }
2486
2487 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
2488 return CMD_WARNING;
2489
2490 bts->gprs.nse.timer[idx] = val;
2491
2492 return CMD_SUCCESS;
2493}
2494
2495#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 +02002496#define BSSGP_TIMERS_HELP \
2497 "Tbvc-block timeout\n" \
2498 "Tbvc-block retries\n" \
2499 "Tbvc-unblock retries\n" \
2500 "Tbvcc-reset timeout\n" \
2501 "Tbvc-reset retries\n" \
2502 "Tbvc-suspend timeout\n" \
2503 "Tbvc-suspend retries\n" \
2504 "Tbvc-resume timeout\n" \
2505 "Tbvc-resume retries\n" \
2506 "Tbvc-capa-update timeout\n" \
2507 "Tbvc-capa-update retries\n"
Harald Welte615e9562010-05-11 23:50:21 +02002508
2509DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
2510 "gprs cell timer " BSSGP_TIMERS " <0-255>",
2511 GPRS_TEXT "Cell / BSSGP\n"
2512 "Cell/BSSGP Timer\n"
2513 BSSGP_TIMERS_HELP "Timer Value\n")
2514{
2515 struct gsm_bts *bts = vty->index;
2516 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
2517 int val = atoi(argv[1]);
2518
2519 if (bts->gprs.mode == BTS_GPRS_NONE) {
2520 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2521 return CMD_WARNING;
2522 }
2523
2524 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
2525 return CMD_WARNING;
2526
2527 bts->gprs.cell.timer[idx] = val;
2528
2529 return CMD_SUCCESS;
2530}
2531
Harald Welte97a282b2010-03-14 15:37:43 +08002532DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
2533 "gprs routing area <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002534 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002535 "GPRS Routing Area Code\n"
2536 "GPRS Routing Area Code\n"
2537 "GPRS Routing Area Code\n")
Harald Welte97a282b2010-03-14 15:37:43 +08002538{
2539 struct gsm_bts *bts = vty->index;
2540
Harald Welte4511d892010-04-18 15:51:20 +02002541 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002542 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2543 return CMD_WARNING;
2544 }
2545
Harald Welte97a282b2010-03-14 15:37:43 +08002546 bts->gprs.rac = atoi(argv[0]);
2547
2548 return CMD_SUCCESS;
2549}
2550
Max292ec582016-07-28 11:55:37 +02002551DEFUN(cfg_bts_gprs_ctrl_ack, cfg_bts_gprs_ctrl_ack_cmd,
2552 "gprs control-ack-type-rach", GPRS_TEXT
2553 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2554 "four access bursts format instead of default RLC/MAC control block\n")
2555{
2556 struct gsm_bts *bts = vty->index;
2557
2558 if (bts->gprs.mode == BTS_GPRS_NONE) {
2559 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2560 return CMD_WARNING;
2561 }
2562
2563 bts->gprs.ctrl_ack_type_use_block = false;
2564
2565 return CMD_SUCCESS;
2566}
2567
2568DEFUN(cfg_no_bts_gprs_ctrl_ack, cfg_no_bts_gprs_ctrl_ack_cmd,
2569 "no gprs control-ack-type-rach", NO_STR GPRS_TEXT
2570 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2571 "four access bursts format instead of default RLC/MAC control block\n")
2572{
2573 struct gsm_bts *bts = vty->index;
2574
2575 if (bts->gprs.mode == BTS_GPRS_NONE) {
2576 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2577 return CMD_WARNING;
2578 }
2579
2580 bts->gprs.ctrl_ack_type_use_block = true;
2581
2582 return CMD_SUCCESS;
2583}
2584
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01002585DEFUN(cfg_bts_gprs_net_ctrl_ord, cfg_bts_gprs_net_ctrl_ord_cmd,
2586 "gprs network-control-order (nc0|nc1|nc2)",
2587 GPRS_TEXT
2588 "GPRS Network Control Order\n"
2589 "MS controlled cell re-selection, no measurement reporting\n"
2590 "MS controlled cell re-selection, MS sends measurement reports\n"
2591 "Network controlled cell re-selection, MS sends measurement reports\n")
2592{
2593 struct gsm_bts *bts = vty->index;
2594
2595 if (bts->gprs.mode == BTS_GPRS_NONE) {
2596 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2597 return CMD_WARNING;
2598 }
2599
2600 bts->gprs.net_ctrl_ord = atoi(argv[0] + 2);
2601
2602 return CMD_SUCCESS;
2603}
2604
Harald Welte4511d892010-04-18 15:51:20 +02002605DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
2606 "gprs mode (none|gprs|egprs)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002607 GPRS_TEXT
2608 "GPRS Mode for this BTS\n"
2609 "GPRS Disabled on this BTS\n"
2610 "GPRS Enabled on this BTS\n"
2611 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welteaf387632010-03-14 23:30:30 +08002612{
2613 struct gsm_bts *bts = vty->index;
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002614 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0], NULL);
Harald Welteaf387632010-03-14 23:30:30 +08002615
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002616 if (!bts_gprs_mode_is_compat(bts, mode)) {
Harald Weltef3d8e922010-06-14 22:44:42 +02002617 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2618 VTY_NEWLINE);
2619 return CMD_WARNING;
2620 }
2621
2622 bts->gprs.mode = mode;
Harald Welteaf387632010-03-14 23:30:30 +08002623
2624 return CMD_SUCCESS;
2625}
2626
bhargava350533c2016-07-21 11:14:34 +05302627DEFUN(cfg_bts_gprs_11bit_rach_support_for_egprs,
2628 cfg_bts_gprs_11bit_rach_support_for_egprs_cmd,
2629 "gprs 11bit_rach_support_for_egprs (0|1)",
2630 GPRS_TEXT "11 bit RACH options\n"
2631 "Disable 11 bit RACH for EGPRS\n"
2632 "Enable 11 bit RACH for EGPRS")
2633{
2634 struct gsm_bts *bts = vty->index;
2635
2636 bts->gprs.supports_egprs_11bit_rach = atoi(argv[0]);
2637
2638 if (bts->gprs.supports_egprs_11bit_rach > 1) {
2639 vty_out(vty, "Error in RACH type%s", VTY_NEWLINE);
2640 return CMD_WARNING;
2641 }
2642
2643 if ((bts->gprs.mode == BTS_GPRS_NONE) &&
2644 (bts->gprs.supports_egprs_11bit_rach == 1)) {
2645 vty_out(vty, "Error:gprs mode is none and 11bit rach is"
2646 " enabled%s", VTY_NEWLINE);
2647 return CMD_WARNING;
2648 }
2649
2650 return CMD_SUCCESS;
2651}
2652
Harald Welte9fbff4a2010-07-30 11:50:09 +02002653#define SI_TEXT "System Information Messages\n"
2654#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)"
2655#define SI_TYPE_HELP "System Information Type 1\n" \
2656 "System Information Type 2\n" \
2657 "System Information Type 3\n" \
2658 "System Information Type 4\n" \
2659 "System Information Type 5\n" \
2660 "System Information Type 6\n" \
2661 "System Information Type 7\n" \
2662 "System Information Type 8\n" \
2663 "System Information Type 9\n" \
2664 "System Information Type 10\n" \
2665 "System Information Type 13\n" \
2666 "System Information Type 16\n" \
2667 "System Information Type 17\n" \
2668 "System Information Type 18\n" \
2669 "System Information Type 19\n" \
2670 "System Information Type 20\n" \
2671 "System Information Type 2bis\n" \
2672 "System Information Type 2ter\n" \
2673 "System Information Type 2quater\n" \
2674 "System Information Type 5bis\n" \
2675 "System Information Type 5ter\n"
2676
2677DEFUN(cfg_bts_si_mode, cfg_bts_si_mode_cmd,
2678 "system-information " SI_TYPE_TEXT " mode (static|computed)",
2679 SI_TEXT SI_TYPE_HELP
2680 "System Information Mode\n"
2681 "Static user-specified\n"
2682 "Dynamic, BSC-computed\n")
2683{
2684 struct gsm_bts *bts = vty->index;
2685 int type;
2686
2687 type = get_string_value(osmo_sitype_strs, argv[0]);
2688 if (type < 0) {
2689 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2690 return CMD_WARNING;
2691 }
2692
2693 if (!strcmp(argv[1], "static"))
2694 bts->si_mode_static |= (1 << type);
2695 else
2696 bts->si_mode_static &= ~(1 << type);
2697
2698 return CMD_SUCCESS;
2699}
2700
2701DEFUN(cfg_bts_si_static, cfg_bts_si_static_cmd,
2702 "system-information " SI_TYPE_TEXT " static HEXSTRING",
2703 SI_TEXT SI_TYPE_HELP
2704 "Static System Information filling\n"
2705 "Static user-specified SI content in HEX notation\n")
2706{
2707 struct gsm_bts *bts = vty->index;
2708 int rc, type;
2709
2710 type = get_string_value(osmo_sitype_strs, argv[0]);
2711 if (type < 0) {
2712 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2713 return CMD_WARNING;
2714 }
2715
2716 if (!(bts->si_mode_static & (1 << type))) {
2717 vty_out(vty, "SI Type %s is not configured in static mode%s",
2718 get_value_string(osmo_sitype_strs, type), VTY_NEWLINE);
2719 return CMD_WARNING;
2720 }
2721
Harald Welte290aaed2010-07-30 11:53:18 +02002722 /* Fill buffer with padding pattern */
2723 memset(bts->si_buf[type], 0x2b, sizeof(bts->si_buf[type]));
2724
2725 /* Parse the user-specified SI in hex format, [partially] overwriting padding */
Pablo Neira Ayusoc0d17f22011-05-07 12:12:48 +02002726 rc = osmo_hexparse(argv[1], bts->si_buf[type], sizeof(bts->si_buf[0]));
Harald Welte9fbff4a2010-07-30 11:50:09 +02002727 if (rc < 0 || rc > sizeof(bts->si_buf[0])) {
2728 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
2729 return CMD_WARNING;
2730 }
2731
2732 /* Mark this SI as present */
2733 bts->si_valid |= (1 << type);
2734
2735 return CMD_SUCCESS;
2736}
2737
Harald Welte32c09622011-01-11 23:44:56 +01002738DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
Harald Welte64c07d22011-02-15 11:43:27 +01002739 "neighbor-list mode (automatic|manual|manual-si5)",
Harald Welte32c09622011-01-11 23:44:56 +01002740 "Neighbor List\n" "Mode of Neighbor List generation\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002741 "Automatically from all BTS in this OpenBSC\n" "Manual\n"
2742 "Manual with different lists for SI2 and SI5\n")
Harald Welte32c09622011-01-11 23:44:56 +01002743{
2744 struct gsm_bts *bts = vty->index;
Harald Welte64c07d22011-02-15 11:43:27 +01002745 int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
Harald Welte32c09622011-01-11 23:44:56 +01002746
Harald Welte64c07d22011-02-15 11:43:27 +01002747 switch (mode) {
2748 case NL_MODE_MANUAL_SI5SEP:
2749 case NL_MODE_MANUAL:
Harald Welte32c09622011-01-11 23:44:56 +01002750 /* make sure we clear the current list when switching to
2751 * manual mode */
2752 if (bts->neigh_list_manual_mode == 0)
2753 memset(&bts->si_common.data.neigh_list, 0,
2754 sizeof(bts->si_common.data.neigh_list));
Harald Welte64c07d22011-02-15 11:43:27 +01002755 break;
2756 default:
2757 break;
2758 }
2759
2760 bts->neigh_list_manual_mode = mode;
Harald Welte32c09622011-01-11 23:44:56 +01002761
2762 return CMD_SUCCESS;
2763}
2764
2765DEFUN(cfg_bts_neigh, cfg_bts_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002766 "neighbor-list (add|del) arfcn <0-1023>",
Harald Welte32c09622011-01-11 23:44:56 +01002767 "Neighbor List\n" "Add to manual neighbor list\n"
2768 "Delete from manual neighbor list\n" "ARFCN of neighbor\n"
2769 "ARFCN of neighbor\n")
2770{
2771 struct gsm_bts *bts = vty->index;
2772 struct bitvec *bv = &bts->si_common.neigh_list;
2773 uint16_t arfcn = atoi(argv[1]);
2774
2775 if (!bts->neigh_list_manual_mode) {
2776 vty_out(vty, "%% Cannot configure neighbor list in "
2777 "automatic mode%s", VTY_NEWLINE);
2778 return CMD_WARNING;
2779 }
2780
2781 if (!strcmp(argv[0], "add"))
2782 bitvec_set_bit_pos(bv, arfcn, 1);
2783 else
2784 bitvec_set_bit_pos(bv, arfcn, 0);
2785
2786 return CMD_SUCCESS;
2787}
2788
Max35697b92016-04-29 12:51:31 +02002789
Max59a1bf32016-04-15 16:04:46 +02002790DEFUN(cfg_bts_si2quater_neigh_add, cfg_bts_si2quater_neigh_add_cmd,
Max35697b92016-04-29 12:51:31 +02002791 "si2quater neighbor-list add earfcn <0-65535> threshold <0-31> "
2792 "[<0-7>]", "SI2quater Neighbor List\n"
Max59a1bf32016-04-15 16:04:46 +02002793 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
2794 "EARFCN of neighbor\n" "EARFCN of neighbor\n" "threshold high bits\n"
2795 "threshold high bits\n" "measurement bandwidth\n")
2796{
2797 struct gsm_bts *bts = vty->index;
2798 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
2799 uint16_t arfcn = atoi(argv[0]);
2800 uint8_t meas = OSMO_EARFCN_MEAS_INVALID, thresh = atoi(argv[1]);
2801 int r;
2802
2803 if (3 == argc)
2804 meas = atoi(argv[2]);
2805
2806 r = osmo_earfcn_add(e, arfcn, meas);
2807
2808 if (r < 0) {
2809 vty_out(vty, "Unable to add arfcn %u: %s%s", arfcn, strerror(r),
2810 VTY_NEWLINE);
2811 return CMD_WARNING;
2812 }
Maxaafff962016-04-20 15:57:14 +02002813 if (si2q_size_check(bts)) {
2814 if (e->thresh_hi && thresh != e->thresh_hi)
2815 vty_out(vty, "Warning: multiple thresholds are not "
2816 "supported, overriding previous threshold %u%s",
2817 e->thresh_hi, VTY_NEWLINE);
Max59a1bf32016-04-15 16:04:46 +02002818
Maxaafff962016-04-20 15:57:14 +02002819 e->thresh_hi = thresh;
2820 return CMD_SUCCESS;
2821 }
2822 vty_out(vty, "Warning: not enough space in si2quater for a given arfcn%s"
2823 , VTY_NEWLINE);
2824 osmo_earfcn_del(e, arfcn);
2825 return CMD_WARNING;
Max59a1bf32016-04-15 16:04:46 +02002826}
2827
2828DEFUN(cfg_bts_si2quater_neigh_del, cfg_bts_si2quater_neigh_del_cmd,
Max35697b92016-04-29 12:51:31 +02002829 "si2quater neighbor-list del earfcn <0-65535>",
Max59a1bf32016-04-15 16:04:46 +02002830 "SI2quater Neighbor List\n"
2831 "SI2quater Neighbor List\n"
2832 "Delete from SI2quater manual neighbor list\n"
Max36212f22016-04-20 12:06:05 +02002833 "EARFCN of neighbor\n"
2834 "EARFCN\n")
Max59a1bf32016-04-15 16:04:46 +02002835{
2836 struct gsm_bts *bts = vty->index;
2837 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
Max0c1bc262016-04-20 12:06:06 +02002838 uint16_t arfcn = atoi(argv[0]);
Max59a1bf32016-04-15 16:04:46 +02002839 int r = osmo_earfcn_del(e, arfcn);
2840 if (r < 0) {
2841 vty_out(vty, "Unable to delete arfcn %u: %s%s", arfcn,
Max0c1bc262016-04-20 12:06:06 +02002842 strerror(-r), VTY_NEWLINE);
Max59a1bf32016-04-15 16:04:46 +02002843 return CMD_WARNING;
2844 }
2845
2846 return CMD_SUCCESS;
2847}
2848
Max26679e02016-04-20 15:57:13 +02002849DEFUN(cfg_bts_si2quater_uarfcn_add, cfg_bts_si2quater_uarfcn_add_cmd,
Max35697b92016-04-29 12:51:31 +02002850 "si2quater neighbor-list add uarfcn <0-16383> <0-511> <0-1>",
Max26679e02016-04-20 15:57:13 +02002851 "SI2quater Neighbor List\n"
2852 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
2853 "UARFCN of neighbor\n" "UARFCN of neighbor\n" "scrambling code\n"
2854 "diversity bit\n")
2855{
2856 struct gsm_bts *bts = vty->index;
2857 uint16_t arfcn = atoi(argv[0]), scramble = atoi(argv[1]);
2858
2859 switch(bts_uarfcn_add(bts, arfcn, scramble, atoi(argv[2]))) {
2860 case -ENOMEM:
2861 vty_out(vty, "Unable to add arfcn: max number of UARFCNs (%u) "
2862 "reached%s", MAX_EARFCN_LIST, VTY_NEWLINE);
Maxaafff962016-04-20 15:57:14 +02002863 case -ENOSPC:
2864 vty_out(vty, "Warning: not enough space in si2quater for a "
2865 "given arfcn%s", VTY_NEWLINE);
Max26679e02016-04-20 15:57:13 +02002866 case -EADDRINUSE:
2867 vty_out(vty, "Unable to add arfcn: (%u, %u) is already added%s",
2868 arfcn, scramble, VTY_NEWLINE);
2869 return CMD_WARNING;
2870 }
2871
2872 return CMD_SUCCESS;
2873}
2874
2875DEFUN(cfg_bts_si2quater_uarfcn_del, cfg_bts_si2quater_uarfcn_del_cmd,
Max35697b92016-04-29 12:51:31 +02002876 "si2quater neighbor-list del uarfcn <0-16383> <0-511>",
Max26679e02016-04-20 15:57:13 +02002877 "SI2quater Neighbor List\n"
2878 "SI2quater Neighbor List\n"
2879 "Delete from SI2quater manual neighbor list\n"
2880 "UARFCN of neighbor\n"
2881 "UARFCN\n"
2882 "scrambling code\n")
2883{
2884 struct gsm_bts *bts = vty->index;
2885
2886 if (bts_uarfcn_del(bts, atoi(argv[0]), atoi(argv[1])) < 0) {
2887 vty_out(vty, "Unable to delete uarfcn: pair not found%s",
2888 VTY_NEWLINE);
2889 return CMD_WARNING;
2890 }
2891
2892 return CMD_SUCCESS;
2893}
2894
Harald Welte64c07d22011-02-15 11:43:27 +01002895DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002896 "si5 neighbor-list (add|del) arfcn <0-1023>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002897 "SI5 Neighbor List\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002898 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
2899 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
2900 "ARFCN of neighbor\n")
2901{
2902 struct gsm_bts *bts = vty->index;
2903 struct bitvec *bv = &bts->si_common.si5_neigh_list;
2904 uint16_t arfcn = atoi(argv[1]);
2905
2906 if (!bts->neigh_list_manual_mode) {
2907 vty_out(vty, "%% Cannot configure neighbor list in "
2908 "automatic mode%s", VTY_NEWLINE);
2909 return CMD_WARNING;
2910 }
2911
2912 if (!strcmp(argv[0], "add"))
2913 bitvec_set_bit_pos(bv, arfcn, 1);
2914 else
2915 bitvec_set_bit_pos(bv, arfcn, 0);
2916
2917 return CMD_SUCCESS;
2918}
Harald Welte9fbff4a2010-07-30 11:50:09 +02002919
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02002920#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
2921
2922DEFUN(cfg_bts_excl_rf_lock,
2923 cfg_bts_excl_rf_lock_cmd,
2924 "rf-lock-exclude",
2925 EXCL_RFLOCK_STR)
2926{
2927 struct gsm_bts *bts = vty->index;
2928 bts->excl_from_rf_lock = 1;
2929 return CMD_SUCCESS;
2930}
2931
2932DEFUN(cfg_bts_no_excl_rf_lock,
2933 cfg_bts_no_excl_rf_lock_cmd,
2934 "no rf-lock-exclude",
2935 NO_STR EXCL_RFLOCK_STR)
2936{
2937 struct gsm_bts *bts = vty->index;
2938 bts->excl_from_rf_lock = 0;
2939 return CMD_SUCCESS;
2940}
2941
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01002942#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
2943
2944DEFUN(cfg_bts_force_comb_si,
2945 cfg_bts_force_comb_si_cmd,
2946 "force-combined-si",
2947 FORCE_COMB_SI_STR)
2948{
2949 struct gsm_bts *bts = vty->index;
2950 bts->force_combined_si = 1;
2951 return CMD_SUCCESS;
2952}
2953
2954DEFUN(cfg_bts_no_force_comb_si,
2955 cfg_bts_no_force_comb_si_cmd,
2956 "no force-combined-si",
2957 NO_STR FORCE_COMB_SI_STR)
2958{
2959 struct gsm_bts *bts = vty->index;
2960 bts->force_combined_si = 0;
2961 return CMD_SUCCESS;
2962}
2963
Andreas Eversberga83d5112013-12-07 18:32:28 +01002964static void _get_codec_from_arg(struct vty *vty, int argc, const char *argv[])
2965{
2966 struct gsm_bts *bts = vty->index;
2967 struct bts_codec_conf *codec = &bts->codec;
2968 int i;
2969
2970 codec->hr = 0;
2971 codec->efr = 0;
2972 codec->amr = 0;
2973 for (i = 0; i < argc; i++) {
2974 if (!strcmp(argv[i], "hr"))
2975 codec->hr = 1;
2976 if (!strcmp(argv[i], "efr"))
2977 codec->efr = 1;
2978 if (!strcmp(argv[i], "amr"))
2979 codec->amr = 1;
2980 }
2981}
2982
2983#define CODEC_PAR_STR " (hr|efr|amr)"
2984#define CODEC_HELP_STR "Half Rate\n" \
2985 "Enhanced Full Rate\nAdaptive Multirate\n"
2986
2987DEFUN(cfg_bts_codec0, cfg_bts_codec0_cmd,
2988 "codec-support fr",
2989 "Codec Support settings\nFullrate\n")
2990{
2991 _get_codec_from_arg(vty, 0, argv);
2992 return CMD_SUCCESS;
2993}
2994
2995DEFUN(cfg_bts_codec1, cfg_bts_codec1_cmd,
2996 "codec-support fr" CODEC_PAR_STR,
2997 "Codec Support settings\nFullrate\n"
2998 CODEC_HELP_STR)
2999{
3000 _get_codec_from_arg(vty, 1, argv);
3001 return CMD_SUCCESS;
3002}
3003
3004DEFUN(cfg_bts_codec2, cfg_bts_codec2_cmd,
3005 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR,
3006 "Codec Support settings\nFullrate\n"
3007 CODEC_HELP_STR CODEC_HELP_STR)
3008{
3009 _get_codec_from_arg(vty, 2, argv);
3010 return CMD_SUCCESS;
3011}
3012
3013DEFUN(cfg_bts_codec3, cfg_bts_codec3_cmd,
3014 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
3015 "Codec Support settings\nFullrate\n"
3016 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
3017{
3018 _get_codec_from_arg(vty, 3, argv);
3019 return CMD_SUCCESS;
3020}
3021
3022DEFUN(cfg_bts_codec4, cfg_bts_codec4_cmd,
3023 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
3024 "Codec Support settings\nFullrate\n"
3025 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
3026{
3027 _get_codec_from_arg(vty, 4, argv);
3028 return CMD_SUCCESS;
3029}
3030
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01003031DEFUN(cfg_bts_depends_on, cfg_bts_depends_on_cmd,
3032 "depends-on-bts <0-255>",
3033 "This BTS can only be started if another one is up\n" "BTS Number\n")
3034{
3035 struct gsm_bts *bts = vty->index;
3036 struct gsm_bts *other_bts;
3037 int dep = atoi(argv[0]);
3038
3039
3040 if (!is_ipaccess_bts(bts)) {
3041 vty_out(vty, "This feature is only available for IP systems.%s",
3042 VTY_NEWLINE);
3043 return CMD_WARNING;
3044 }
3045
3046 other_bts = gsm_bts_num(bts->network, dep);
3047 if (!other_bts || !is_ipaccess_bts(other_bts)) {
3048 vty_out(vty, "This feature is only available for IP systems.%s",
3049 VTY_NEWLINE);
3050 return CMD_WARNING;
3051 }
3052
3053 if (dep >= bts->nr) {
3054 vty_out(vty, "%%Need to depend on an already declared unit.%s",
3055 VTY_NEWLINE);
3056 return CMD_WARNING;
3057 }
3058
3059 bts_depend_mark(bts, dep);
3060 return CMD_SUCCESS;
3061}
3062
3063DEFUN(cfg_bts_no_depends_on, cfg_bts_no_depends_on_cmd,
3064 "depeneds-on-bts <0-255>",
3065 NO_STR "This BTS can only be started if another one is up\n"
3066 "BTS Number\n")
3067{
3068 struct gsm_bts *bts = vty->index;
3069 int dep = atoi(argv[0]);
3070
3071 bts_depend_clear(bts, dep);
3072 return CMD_SUCCESS;
3073}
3074
Andreas Eversberg73266522014-01-19 11:47:44 +01003075#define AMR_TEXT "Adaptive Multi Rate settings\n"
3076#define AMR_MODE_TEXT "Codec modes to use with AMR codec\n"
3077#define AMR_START_TEXT "Initial codec to use with AMR\n" \
3078 "Automatically\nFirst codec\nSecond codec\nThird codec\nFourth codec\n"
3079#define AMR_TH_TEXT "AMR threshold between codecs\nMS side\nBTS side\n"
3080#define AMR_HY_TEXT "AMR hysteresis between codecs\nMS side\nBTS side\n"
3081
3082static void get_amr_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3083{
3084 struct gsm_bts *bts = vty->index;
3085 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3086 struct gsm48_multi_rate_conf *mr_conf =
3087 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3088 int i;
3089
3090 mr->gsm48_ie[1] = 0;
3091 for (i = 0; i < argc; i++)
3092 mr->gsm48_ie[1] |= 1 << atoi(argv[i]);
3093 mr_conf->icmi = 0;
3094}
3095
3096static void get_amr_th_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3097{
3098 struct gsm_bts *bts = vty->index;
3099 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003100 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003101 int i;
3102
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003103 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3104 for (i = 0; i < argc - 1; i++)
3105 modes[i].threshold = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003106}
3107
3108static void get_amr_hy_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3109{
3110 struct gsm_bts *bts = vty->index;
3111 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003112 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003113 int i;
3114
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003115 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3116 for (i = 0; i < argc - 1; i++)
3117 modes[i].hysteresis = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003118}
3119
3120static void get_amr_start_from_arg(struct vty *vty, const char *argv[], int full)
3121{
3122 struct gsm_bts *bts = vty->index;
3123 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3124 struct gsm48_multi_rate_conf *mr_conf =
3125 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3126 int num = 0, i;
3127
3128 for (i = 0; i < ((full) ? 8 : 6); i++) {
3129 if ((mr->gsm48_ie[1] & (1 << i))) {
3130 num++;
3131 }
3132 }
3133
3134 if (argv[0][0] == 'a' || num == 0)
3135 mr_conf->icmi = 0;
3136 else {
3137 mr_conf->icmi = 1;
3138 if (num < atoi(argv[0]))
3139 mr_conf->smod = num - 1;
3140 else
3141 mr_conf->smod = atoi(argv[0]) - 1;
3142 }
3143}
3144
3145#define AMR_TCHF_PAR_STR " (0|1|2|3|4|5|6|7)"
3146#define AMR_TCHF_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n" \
3147 "10,2k\n12,2k\n"
3148
3149#define AMR_TCHH_PAR_STR " (0|1|2|3|4|5)"
3150#define AMR_TCHH_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n"
3151
3152#define AMR_TH_HELP_STR "Threshold between codec 1 and 2\n"
3153#define AMR_HY_HELP_STR "Hysteresis between codec 1 and 2\n"
3154
3155DEFUN(cfg_bts_amr_fr_modes1, cfg_bts_amr_fr_modes1_cmd,
3156 "amr tch-f modes" AMR_TCHF_PAR_STR,
3157 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3158 AMR_TCHF_HELP_STR)
3159{
3160 get_amr_from_arg(vty, 1, argv, 1);
3161 return CMD_SUCCESS;
3162}
3163
3164DEFUN(cfg_bts_amr_fr_modes2, cfg_bts_amr_fr_modes2_cmd,
3165 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3166 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3167 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3168{
3169 get_amr_from_arg(vty, 2, argv, 1);
3170 return CMD_SUCCESS;
3171}
3172
3173DEFUN(cfg_bts_amr_fr_modes3, cfg_bts_amr_fr_modes3_cmd,
3174 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3175 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3176 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3177{
3178 get_amr_from_arg(vty, 3, argv, 1);
3179 return CMD_SUCCESS;
3180}
3181
3182DEFUN(cfg_bts_amr_fr_modes4, cfg_bts_amr_fr_modes4_cmd,
3183 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3184 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3185 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3186{
3187 get_amr_from_arg(vty, 4, argv, 1);
3188 return CMD_SUCCESS;
3189}
3190
3191DEFUN(cfg_bts_amr_fr_start_mode, cfg_bts_amr_fr_start_mode_cmd,
3192 "amr tch-f start-mode (auto|1|2|3|4)",
3193 AMR_TEXT "Full Rate\n" AMR_START_TEXT)
3194{
3195 get_amr_start_from_arg(vty, argv, 1);
3196 return CMD_SUCCESS;
3197}
3198
3199DEFUN(cfg_bts_amr_fr_thres1, cfg_bts_amr_fr_thres1_cmd,
3200 "amr tch-f threshold (ms|bts) <0-63>",
3201 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3202 AMR_TH_HELP_STR)
3203{
3204 get_amr_th_from_arg(vty, 2, argv, 1);
3205 return CMD_SUCCESS;
3206}
3207
3208DEFUN(cfg_bts_amr_fr_thres2, cfg_bts_amr_fr_thres2_cmd,
3209 "amr tch-f threshold (ms|bts) <0-63> <0-63>",
3210 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3211 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3212{
3213 get_amr_th_from_arg(vty, 3, argv, 1);
3214 return CMD_SUCCESS;
3215}
3216
3217DEFUN(cfg_bts_amr_fr_thres3, cfg_bts_amr_fr_thres3_cmd,
3218 "amr tch-f threshold (ms|bts) <0-63> <0-63> <0-63>",
3219 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3220 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3221{
3222 get_amr_th_from_arg(vty, 4, argv, 1);
3223 return CMD_SUCCESS;
3224}
3225
3226DEFUN(cfg_bts_amr_fr_hyst1, cfg_bts_amr_fr_hyst1_cmd,
3227 "amr tch-f hysteresis (ms|bts) <0-15>",
3228 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3229 AMR_HY_HELP_STR)
3230{
3231 get_amr_hy_from_arg(vty, 2, argv, 1);
3232 return CMD_SUCCESS;
3233}
3234
3235DEFUN(cfg_bts_amr_fr_hyst2, cfg_bts_amr_fr_hyst2_cmd,
3236 "amr tch-f hysteresis (ms|bts) <0-15> <0-15>",
3237 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3238 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3239{
3240 get_amr_hy_from_arg(vty, 3, argv, 1);
3241 return CMD_SUCCESS;
3242}
3243
3244DEFUN(cfg_bts_amr_fr_hyst3, cfg_bts_amr_fr_hyst3_cmd,
3245 "amr tch-f hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3246 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3247 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3248{
3249 get_amr_hy_from_arg(vty, 4, argv, 1);
3250 return CMD_SUCCESS;
3251}
3252
3253DEFUN(cfg_bts_amr_hr_modes1, cfg_bts_amr_hr_modes1_cmd,
3254 "amr tch-h modes" AMR_TCHH_PAR_STR,
3255 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3256 AMR_TCHH_HELP_STR)
3257{
3258 get_amr_from_arg(vty, 1, argv, 0);
3259 return CMD_SUCCESS;
3260}
3261
3262DEFUN(cfg_bts_amr_hr_modes2, cfg_bts_amr_hr_modes2_cmd,
3263 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3264 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3265 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3266{
3267 get_amr_from_arg(vty, 2, argv, 0);
3268 return CMD_SUCCESS;
3269}
3270
3271DEFUN(cfg_bts_amr_hr_modes3, cfg_bts_amr_hr_modes3_cmd,
3272 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3273 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3274 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3275{
3276 get_amr_from_arg(vty, 3, argv, 0);
3277 return CMD_SUCCESS;
3278}
3279
3280DEFUN(cfg_bts_amr_hr_modes4, cfg_bts_amr_hr_modes4_cmd,
3281 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3282 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3283 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3284{
3285 get_amr_from_arg(vty, 4, argv, 0);
3286 return CMD_SUCCESS;
3287}
3288
3289DEFUN(cfg_bts_amr_hr_start_mode, cfg_bts_amr_hr_start_mode_cmd,
3290 "amr tch-h start-mode (auto|1|2|3|4)",
3291 AMR_TEXT "Half Rate\n" AMR_START_TEXT)
3292{
3293 get_amr_start_from_arg(vty, argv, 0);
3294 return CMD_SUCCESS;
3295}
3296
3297DEFUN(cfg_bts_amr_hr_thres1, cfg_bts_amr_hr_thres1_cmd,
3298 "amr tch-h threshold (ms|bts) <0-63>",
3299 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3300 AMR_TH_HELP_STR)
3301{
3302 get_amr_th_from_arg(vty, 2, argv, 0);
3303 return CMD_SUCCESS;
3304}
3305
3306DEFUN(cfg_bts_amr_hr_thres2, cfg_bts_amr_hr_thres2_cmd,
3307 "amr tch-h threshold (ms|bts) <0-63> <0-63>",
3308 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3309 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3310{
3311 get_amr_th_from_arg(vty, 3, argv, 0);
3312 return CMD_SUCCESS;
3313}
3314
3315DEFUN(cfg_bts_amr_hr_thres3, cfg_bts_amr_hr_thres3_cmd,
3316 "amr tch-h threshold (ms|bts) <0-63> <0-63> <0-63>",
3317 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3318 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3319{
3320 get_amr_th_from_arg(vty, 4, argv, 0);
3321 return CMD_SUCCESS;
3322}
3323
3324DEFUN(cfg_bts_amr_hr_hyst1, cfg_bts_amr_hr_hyst1_cmd,
3325 "amr tch-h hysteresis (ms|bts) <0-15>",
3326 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3327 AMR_HY_HELP_STR)
3328{
3329 get_amr_hy_from_arg(vty, 2, argv, 0);
3330 return CMD_SUCCESS;
3331}
3332
3333DEFUN(cfg_bts_amr_hr_hyst2, cfg_bts_amr_hr_hyst2_cmd,
3334 "amr tch-h hysteresis (ms|bts) <0-15> <0-15>",
3335 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3336 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3337{
3338 get_amr_hy_from_arg(vty, 3, argv, 0);
3339 return CMD_SUCCESS;
3340}
3341
3342DEFUN(cfg_bts_amr_hr_hyst3, cfg_bts_amr_hr_hyst3_cmd,
3343 "amr tch-h hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3344 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3345 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3346{
3347 get_amr_hy_from_arg(vty, 4, argv, 0);
3348 return CMD_SUCCESS;
3349}
3350
Harald Welte8f0ed552010-05-11 21:53:49 +02003351#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02003352
Harald Welte5258fc42009-03-28 19:07:53 +00003353/* per TRX configuration */
3354DEFUN(cfg_trx,
3355 cfg_trx_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02003356 "trx <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02003357 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00003358 "Select a TRX to configure")
3359{
3360 int trx_nr = atoi(argv[0]);
3361 struct gsm_bts *bts = vty->index;
3362 struct gsm_bts_trx *trx;
3363
Harald Weltee441d9c2009-06-21 16:17:15 +02003364 if (trx_nr > bts->num_trx) {
3365 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
3366 bts->num_trx, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00003367 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02003368 } else if (trx_nr == bts->num_trx) {
3369 /* we need to allocate a new one */
3370 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003371 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02003372 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003373
Harald Weltee441d9c2009-06-21 16:17:15 +02003374 if (!trx)
3375 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00003376
3377 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02003378 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00003379 vty->node = TRX_NODE;
3380
3381 return CMD_SUCCESS;
3382}
3383
3384DEFUN(cfg_trx_arfcn,
3385 cfg_trx_arfcn_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01003386 "arfcn <0-1023>",
Harald Welte13fe2192012-08-17 09:57:25 +02003387 "Set the ARFCN for this TRX\n"
3388 "Absolute Radio Frequency Channel Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003389{
3390 int arfcn = atoi(argv[0]);
3391 struct gsm_bts_trx *trx = vty->index;
3392
3393 /* FIXME: check if this ARFCN is supported by this TRX */
3394
3395 trx->arfcn = arfcn;
3396
3397 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
3398 /* FIXME: use OML layer to update the ARFCN */
3399 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
3400
3401 return CMD_SUCCESS;
3402}
3403
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003404DEFUN(cfg_trx_nominal_power,
3405 cfg_trx_nominal_power_cmd,
3406 "nominal power <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003407 "Nominal TRX RF Power in dBm\n"
3408 "Nominal TRX RF Power in dBm\n"
3409 "Nominal TRX RF Power in dBm\n")
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003410{
3411 struct gsm_bts_trx *trx = vty->index;
3412
3413 trx->nominal_power = atoi(argv[0]);
3414
3415 return CMD_SUCCESS;
3416}
3417
Harald Weltefcd24452009-06-20 18:15:19 +02003418DEFUN(cfg_trx_max_power_red,
3419 cfg_trx_max_power_red_cmd,
3420 "max_power_red <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003421 "Reduction of maximum BS RF Power (relative to nominal power)\n"
Harald Weltefcd24452009-06-20 18:15:19 +02003422 "Reduction of maximum BS RF Power in dB\n")
3423{
3424 int maxpwr_r = atoi(argv[0]);
3425 struct gsm_bts_trx *trx = vty->index;
Harald Welte61a83b22009-11-18 09:20:22 +01003426 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-06-20 18:15:19 +02003427
3428 /* FIXME: check if our BTS type supports more than 12 */
3429 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
3430 vty_out(vty, "%% Power %d dB is not in the valid range%s",
3431 maxpwr_r, VTY_NEWLINE);
3432 return CMD_WARNING;
3433 }
3434 if (maxpwr_r & 1) {
3435 vty_out(vty, "%% Power %d dB is not an even value%s",
3436 maxpwr_r, VTY_NEWLINE);
3437 return CMD_WARNING;
3438 }
3439
3440 trx->max_power_red = maxpwr_r;
3441
3442 /* FIXME: make sure we update this using OML */
3443
3444 return CMD_SUCCESS;
3445}
3446
Harald Welte42581822009-08-08 16:12:58 +02003447DEFUN(cfg_trx_rsl_e1,
3448 cfg_trx_rsl_e1_cmd,
3449 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003450 "RSL Parameters\n"
3451 "E1/T1 interface to be used for RSL\n"
3452 "E1/T1 interface to be used for RSL\n"
3453 "E1/T1 Line Number to be used for RSL\n"
3454 "E1/T1 Timeslot to be used for RSL\n"
3455 "E1/T1 Timeslot to be used for RSL\n"
3456 "E1/T1 Sub-slot to be used for RSL\n"
3457 "E1/T1 Sub-slot 0 is to be used for RSL\n"
3458 "E1/T1 Sub-slot 1 is to be used for RSL\n"
3459 "E1/T1 Sub-slot 2 is to be used for RSL\n"
3460 "E1/T1 Sub-slot 3 is to be used for RSL\n"
3461 "E1/T1 full timeslot is to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003462{
3463 struct gsm_bts_trx *trx = vty->index;
3464
3465 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
3466
3467 return CMD_SUCCESS;
3468}
3469
3470DEFUN(cfg_trx_rsl_e1_tei,
3471 cfg_trx_rsl_e1_tei_cmd,
3472 "rsl e1 tei <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003473 "RSL Parameters\n"
3474 "Set the TEI to be used for RSL\n"
3475 "Set the TEI to be used for RSL\n"
3476 "TEI to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003477{
3478 struct gsm_bts_trx *trx = vty->index;
3479
3480 trx->rsl_tei = atoi(argv[0]);
3481
3482 return CMD_SUCCESS;
3483}
3484
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003485DEFUN(cfg_trx_rf_locked,
3486 cfg_trx_rf_locked_cmd,
3487 "rf_locked (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003488 "Set or unset the RF Locking (Turn off RF of the TRX)\n"
3489 "TRX is NOT RF locked (active)\n"
3490 "TRX is RF locked (turned off)\n")
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003491{
3492 int locked = atoi(argv[0]);
3493 struct gsm_bts_trx *trx = vty->index;
3494
3495 gsm_trx_lock_rf(trx, locked);
3496 return CMD_SUCCESS;
3497}
Harald Welte42581822009-08-08 16:12:58 +02003498
Harald Welte5258fc42009-03-28 19:07:53 +00003499/* per TS configuration */
3500DEFUN(cfg_ts,
3501 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003502 "timeslot <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003503 "Select a Timeslot to configure\n"
3504 "Timeslot number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003505{
3506 int ts_nr = atoi(argv[0]);
3507 struct gsm_bts_trx *trx = vty->index;
3508 struct gsm_bts_trx_ts *ts;
3509
3510 if (ts_nr >= TRX_NR_TS) {
3511 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
3512 TRX_NR_TS, VTY_NEWLINE);
3513 return CMD_WARNING;
3514 }
3515
3516 ts = &trx->ts[ts_nr];
3517
3518 vty->index = ts;
3519 vty->node = TS_NODE;
3520
3521 return CMD_SUCCESS;
3522}
3523
Harald Weltea6fd58e2009-08-07 00:25:23 +02003524DEFUN(cfg_ts_pchan,
3525 cfg_ts_pchan_cmd,
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003526 "phys_chan_config PCHAN", /* dynamically generated! */
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003527 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003528{
3529 struct gsm_bts_trx_ts *ts = vty->index;
3530 int pchanc;
3531
3532 pchanc = gsm_pchan_parse(argv[0]);
3533 if (pchanc < 0)
3534 return CMD_WARNING;
3535
3536 ts->pchan = pchanc;
3537
3538 return CMD_SUCCESS;
3539}
3540
3541/* used for backwards compatibility with old config files that still
3542 * have uppercase pchan type names */
3543DEFUN_HIDDEN(cfg_ts_pchan_compat,
3544 cfg_ts_pchan_compat_cmd,
Harald Weltea6fd58e2009-08-07 00:25:23 +02003545 "phys_chan_config PCHAN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003546 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003547{
3548 struct gsm_bts_trx_ts *ts = vty->index;
3549 int pchanc;
3550
3551 pchanc = gsm_pchan_parse(argv[0]);
3552 if (pchanc < 0)
3553 return CMD_WARNING;
3554
3555 ts->pchan = pchanc;
3556
3557 return CMD_SUCCESS;
3558}
3559
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003560
3561
Harald Welte135a6482011-05-30 12:09:13 +02003562DEFUN(cfg_ts_tsc,
3563 cfg_ts_tsc_cmd,
3564 "training_sequence_code <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003565 "Training Sequence Code of the Timeslot\n" "TSC\n")
Harald Welte135a6482011-05-30 12:09:13 +02003566{
3567 struct gsm_bts_trx_ts *ts = vty->index;
3568
Harald Welte903aaea2014-01-19 17:10:50 +01003569 if (!gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_MULTI_TSC)) {
3570 vty_out(vty, "%% This BTS does not support a TSC != BCC, "
3571 "falling back to BCC%s", VTY_NEWLINE);
3572 ts->tsc = -1;
3573 return CMD_WARNING;
3574 }
3575
Harald Welte135a6482011-05-30 12:09:13 +02003576 ts->tsc = atoi(argv[0]);
3577
3578 return CMD_SUCCESS;
3579}
3580
Harald Weltea39b0f22010-06-14 22:26:10 +02003581#define HOPPING_STR "Configure frequency hopping\n"
3582
3583DEFUN(cfg_ts_hopping,
3584 cfg_ts_hopping_cmd,
3585 "hopping enabled (0|1)",
3586 HOPPING_STR "Enable or disable frequency hopping\n"
3587 "Disable frequency hopping\n" "Enable frequency hopping\n")
3588{
3589 struct gsm_bts_trx_ts *ts = vty->index;
Harald Weltec2fb3d02010-06-14 22:47:37 +02003590 int enabled = atoi(argv[0]);
Harald Weltea39b0f22010-06-14 22:26:10 +02003591
Harald Weltec2fb3d02010-06-14 22:47:37 +02003592 if (enabled && !gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_HOPPING)) {
3593 vty_out(vty, "BTS model does not support hopping%s",
3594 VTY_NEWLINE);
3595 return CMD_WARNING;
3596 }
3597
3598 ts->hopping.enabled = enabled;
Harald Weltea39b0f22010-06-14 22:26:10 +02003599
3600 return CMD_SUCCESS;
3601}
3602
Harald Welte6e0cd042009-09-12 13:05:33 +02003603DEFUN(cfg_ts_hsn,
3604 cfg_ts_hsn_cmd,
Harald Weltea39b0f22010-06-14 22:26:10 +02003605 "hopping sequence-number <0-63>",
3606 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003607 "Which hopping sequence to use for this channel\n"
3608 "Hopping Sequence Number (HSN)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003609{
3610 struct gsm_bts_trx_ts *ts = vty->index;
3611
3612 ts->hopping.hsn = atoi(argv[0]);
3613
3614 return CMD_SUCCESS;
3615}
3616
3617DEFUN(cfg_ts_maio,
3618 cfg_ts_maio_cmd,
3619 "hopping maio <0-63>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003620 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003621 "Which hopping MAIO to use for this channel\n"
3622 "Mobile Allocation Index Offset (MAIO)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003623{
3624 struct gsm_bts_trx_ts *ts = vty->index;
3625
3626 ts->hopping.maio = atoi(argv[0]);
3627
3628 return CMD_SUCCESS;
3629}
3630
3631DEFUN(cfg_ts_arfcn_add,
3632 cfg_ts_arfcn_add_cmd,
3633 "hopping arfcn add <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003634 HOPPING_STR "Configure hopping ARFCN list\n"
3635 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003636{
3637 struct gsm_bts_trx_ts *ts = vty->index;
3638 int arfcn = atoi(argv[0]);
3639
Harald Weltea39b0f22010-06-14 22:26:10 +02003640 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
3641
Harald Welte6e0cd042009-09-12 13:05:33 +02003642 return CMD_SUCCESS;
3643}
3644
3645DEFUN(cfg_ts_arfcn_del,
3646 cfg_ts_arfcn_del_cmd,
3647 "hopping arfcn del <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003648 HOPPING_STR "Configure hopping ARFCN list\n"
3649 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003650{
3651 struct gsm_bts_trx_ts *ts = vty->index;
3652 int arfcn = atoi(argv[0]);
3653
Harald Weltea39b0f22010-06-14 22:26:10 +02003654 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
3655
Harald Welte6e0cd042009-09-12 13:05:33 +02003656 return CMD_SUCCESS;
3657}
3658
Harald Weltea6fd58e2009-08-07 00:25:23 +02003659DEFUN(cfg_ts_e1_subslot,
3660 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003661 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003662 "E1/T1 channel connected to this on-air timeslot\n"
3663 "E1/T1 channel connected to this on-air timeslot\n"
3664 "E1/T1 line connected to this on-air timeslot\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02003665 "E1/T1 timeslot connected to this on-air timeslot\n"
3666 "E1/T1 timeslot connected to this on-air timeslot\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02003667 "E1/T1 sub-slot connected to this on-air timeslot\n"
3668 "E1/T1 sub-slot 0 connected to this on-air timeslot\n"
3669 "E1/T1 sub-slot 1 connected to this on-air timeslot\n"
3670 "E1/T1 sub-slot 2 connected to this on-air timeslot\n"
3671 "E1/T1 sub-slot 3 connected to this on-air timeslot\n"
3672 "Full E1/T1 timeslot connected to this on-air timeslot\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003673{
3674 struct gsm_bts_trx_ts *ts = vty->index;
3675
Harald Welte42581822009-08-08 16:12:58 +02003676 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003677
3678 return CMD_SUCCESS;
3679}
Harald Welte5258fc42009-03-28 19:07:53 +00003680
Harald Welte4f10c252010-05-16 21:47:13 +02003681void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
3682{
3683 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003684 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_TOTAL].current,
3685 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_NO_CHANNEL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003686 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003687 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003688 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RF_FAIL].current,
3689 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RLL_ERR].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003690 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003691 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003692 net->bsc_ctrs->ctr[BSC_CTR_PAGING_ATTEMPTED].current,
3693 net->bsc_ctrs->ctr[BSC_CTR_PAGING_COMPLETED].current,
3694 net->bsc_ctrs->ctr[BSC_CTR_PAGING_EXPIRED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003695 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003696 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003697 net->bsc_ctrs->ctr[BSC_CTR_BTS_OML_FAIL].current,
3698 net->bsc_ctrs->ctr[BSC_CTR_BTS_RSL_FAIL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003699 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003700}
3701
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003702DEFUN(drop_bts,
3703 drop_bts_cmd,
Holger Hans Peter Freyther0586b0f2010-04-11 12:46:45 +02003704 "drop bts connection <0-65535> (oml|rsl)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003705 "Debug/Simulation command to drop Abis/IP BTS\n"
3706 "Debug/Simulation command to drop Abis/IP BTS\n"
3707 "Debug/Simulation command to drop Abis/IP BTS\n"
3708 "BTS NR\n" "Drop OML Connection\n" "Drop RSL Connection\n")
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003709{
3710 struct gsm_network *gsmnet;
3711 struct gsm_bts_trx *trx;
3712 struct gsm_bts *bts;
3713 unsigned int bts_nr;
3714
3715 gsmnet = gsmnet_from_vty(vty);
3716
3717 bts_nr = atoi(argv[0]);
3718 if (bts_nr >= gsmnet->num_bts) {
3719 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3720 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3721 return CMD_WARNING;
3722 }
3723
3724 bts = gsm_bts_num(gsmnet, bts_nr);
3725 if (!bts) {
3726 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3727 return CMD_WARNING;
3728 }
3729
3730 if (!is_ipaccess_bts(bts)) {
3731 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
3732 return CMD_WARNING;
3733 }
3734
3735
3736 /* close all connections */
3737 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003738 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003739 } else if (strcmp(argv[1], "rsl") == 0) {
3740 /* close all rsl connections */
3741 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003742 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003743 }
3744 } else {
3745 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
3746 return CMD_WARNING;
3747 }
3748
3749 return CMD_SUCCESS;
3750}
3751
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01003752DEFUN(restart_bts, restart_bts_cmd,
3753 "restart-bts <0-65535>",
3754 "Restart ip.access nanoBTS through OML\n"
3755 "BTS Number\n")
3756{
3757 struct gsm_network *gsmnet;
3758 struct gsm_bts_trx *trx;
3759 struct gsm_bts *bts;
3760 unsigned int bts_nr;
3761
3762 gsmnet = gsmnet_from_vty(vty);
3763
3764 bts_nr = atoi(argv[0]);
3765 if (bts_nr >= gsmnet->num_bts) {
3766 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3767 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3768 return CMD_WARNING;
3769 }
3770
3771 bts = gsm_bts_num(gsmnet, bts_nr);
3772 if (!bts) {
3773 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3774 return CMD_WARNING;
3775 }
3776
3777 if (!is_ipaccess_bts(bts) || is_sysmobts_v2(bts)) {
3778 vty_out(vty, "This command only works for ipaccess nanoBTS.%s",
3779 VTY_NEWLINE);
3780 return CMD_WARNING;
3781 }
3782
3783 /* go from last TRX to c0 */
3784 llist_for_each_entry_reverse(trx, &bts->trx_list, list)
3785 abis_nm_ipaccess_restart(trx);
3786
3787 return CMD_SUCCESS;
3788}
3789
Harald Welte30f1f372014-12-28 15:00:45 +01003790DEFUN(smscb_cmd, smscb_cmd_cmd,
3791 "bts <0-255> smscb-command <1-4> HEXSTRING",
3792 "BTS related commands\n" "BTS Number\n"
3793 "SMS Cell Broadcast\n" "Last Valid Block\n"
3794 "Hex Encoded SMSCB message (up to 88 octets)\n")
3795{
3796 struct gsm_bts *bts;
3797 int bts_nr = atoi(argv[0]);
3798 int last_block = atoi(argv[1]);
3799 struct rsl_ie_cb_cmd_type cb_cmd;
3800 uint8_t buf[88];
3801 int rc;
3802
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +02003803 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
Harald Welte30f1f372014-12-28 15:00:45 +01003804 if (!bts) {
3805 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3806 return CMD_WARNING;
3807 }
3808 rc = osmo_hexparse(argv[2], buf, sizeof(buf));
3809 if (rc < 0 || rc > sizeof(buf)) {
3810 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
3811 return CMD_WARNING;
3812 }
3813
3814 cb_cmd.spare = 0;
3815 cb_cmd.def_bcast = 0;
3816 cb_cmd.command = RSL_CB_CMD_TYPE_NORMAL;
3817
3818 switch (last_block) {
3819 case 1:
3820 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_1;
3821 break;
3822 case 2:
3823 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_2;
3824 break;
3825 case 3:
3826 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_3;
3827 break;
3828 case 4:
3829 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_4;
3830 break;
3831 }
3832
3833 rsl_sms_cb_command(bts, RSL_CHAN_SDCCH4_ACCH, cb_cmd, buf, rc);
3834
3835 return CMD_SUCCESS;
3836}
3837
3838
Harald Welted0d2b0b2010-12-23 13:18:07 +01003839DEFUN(pdch_act, pdch_act_cmd,
3840 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
3841 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3842 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
3843 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
3844 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
3845{
3846 struct gsm_bts *bts;
3847 struct gsm_bts_trx *trx;
3848 struct gsm_bts_trx_ts *ts;
3849 int bts_nr = atoi(argv[0]);
3850 int trx_nr = atoi(argv[1]);
3851 int ts_nr = atoi(argv[2]);
3852 int activate;
3853
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +02003854 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
Harald Welted0d2b0b2010-12-23 13:18:07 +01003855 if (!bts) {
3856 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3857 return CMD_WARNING;
3858 }
3859
3860 if (!is_ipaccess_bts(bts)) {
3861 vty_out(vty, "%% This command only works for ipaccess BTS%s",
3862 VTY_NEWLINE);
3863 return CMD_WARNING;
3864 }
3865
3866 trx = gsm_bts_trx_num(bts, trx_nr);
3867 if (!trx) {
3868 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
3869 return CMD_WARNING;
3870 }
3871
3872 ts = &trx->ts[ts_nr];
3873 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
3874 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
3875 "mode%s", ts_nr, VTY_NEWLINE);
3876 return CMD_WARNING;
3877 }
3878
3879 if (!strcmp(argv[3], "activate"))
3880 activate = 1;
3881 else
3882 activate = 0;
3883
3884 rsl_ipacc_pdch_activate(ts, activate);
3885
3886 return CMD_SUCCESS;
3887
3888}
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003889
Harald Weltedcccb182010-05-16 20:52:23 +02003890extern int bsc_vty_init_extra(void);
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02003891
Neels Hofmeyr43d86bf2016-05-10 13:40:19 +02003892int bsc_vty_init(const struct log_info *cat, struct gsm_network *network)
Harald Welte68628e82009-03-10 12:17:57 +00003893{
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003894 cfg_ts_pchan_cmd.string =
3895 vty_cmd_string_from_valstr(tall_bsc_ctx,
3896 gsm_pchant_names,
3897 "phys_chan_config (", "|", ")",
3898 VTY_DO_LOWER);
3899 cfg_ts_pchan_cmd.doc =
3900 vty_cmd_string_from_valstr(tall_bsc_ctx,
3901 gsm_pchant_descs,
3902 "Physical Channel Combination\n",
3903 "\n", "", 0);
3904
Harald Weltee555c2b2012-08-17 13:02:12 +02003905 cfg_bts_type_cmd.string =
3906 vty_cmd_string_from_valstr(tall_bsc_ctx,
3907 bts_type_names,
3908 "type (", "|", ")",
3909 VTY_DO_LOWER);
3910 cfg_bts_type_cmd.doc =
3911 vty_cmd_string_from_valstr(tall_bsc_ctx,
3912 bts_type_descs,
3913 "BTS Vendor/Type\n",
3914 "\n", "", 0);
3915
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +02003916 common_cs_vty_init(network, config_write_net);
Harald Weltee555c2b2012-08-17 13:02:12 +02003917
Neels Hofmeyrea11bf82016-05-12 01:53:23 +02003918 install_element_ve(&bsc_show_net_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +00003919 install_element_ve(&show_bts_cmd);
3920 install_element_ve(&show_trx_cmd);
3921 install_element_ve(&show_ts_cmd);
3922 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08003923 install_element_ve(&show_lchan_summary_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00003924
Harald Welteb4d5b172010-05-12 16:10:35 +00003925 install_element_ve(&show_paging_cmd);
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01003926 install_element_ve(&show_paging_group_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00003927
Pablo Neira Ayuso739a5662011-03-09 13:36:32 +01003928 logging_vty_add_cmds(cat);
Jacob Erlbeck64630cc2015-10-26 16:25:37 +01003929 osmo_stats_vty_add_cmds();
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01003930
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01003931 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01003932 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-12-21 16:51:50 +01003933 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
3934 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
3935 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
3936 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
3937 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
3938 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01003939 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01003940 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
3941 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
3942 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
3943 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
3944 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
3945 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
3946 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
3947 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
3948 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltec9f499f2010-12-23 22:53:50 +01003949 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01003950 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08003951 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08003952 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Neels Hofmeyr73983952016-05-10 13:29:33 +02003953 install_element(GSMNET_NODE, &cfg_net_timezone_cmd);
3954 install_element(GSMNET_NODE, &cfg_net_timezone_dst_cmd);
3955 install_element(GSMNET_NODE, &cfg_net_no_timezone_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02003956
3957 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02003958 install_node(&bts_node, config_write_bts);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01003959 vty_install_default(BTS_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00003960 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02003961 install_element(BTS_NODE, &cfg_description_cmd);
3962 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02003963 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02003964 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Maxc08ee712016-05-11 12:45:13 +02003965 install_element(BTS_NODE, &cfg_bts_dtxu_cmd);
3966 install_element(BTS_NODE, &cfg_bts_dtxd_cmd);
3967 install_element(BTS_NODE, &cfg_bts_no_dtxu_cmd);
3968 install_element(BTS_NODE, &cfg_bts_no_dtxd_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00003969 install_element(BTS_NODE, &cfg_bts_lac_cmd);
3970 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02003971 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00003972 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8b291802013-03-12 13:57:05 +01003973 install_element(BTS_NODE, &cfg_bts_rsl_ip_cmd);
Sylvain Munautc9519462011-10-17 14:04:55 +02003974 install_element(BTS_NODE, &cfg_bts_nokia_site_skip_reset_cmd);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01003975 install_element(BTS_NODE, &cfg_bts_nokia_site_no_loc_rel_cnf_cmd);
Sipos Csaba56e17662015-02-07 13:27:36 +01003976 install_element(BTS_NODE, &cfg_bts_nokia_site_bts_reset_timer_cnf_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02003977 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-08-08 16:12:58 +02003978 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
3979 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte7a8fa412009-08-10 13:48:16 +02003980 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01003981 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
3982 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02003983 install_element(BTS_NODE, &cfg_bts_chan_desc_att_cmd);
3984 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_pa_mfrms_cmd);
3985 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_ag_blks_res_cmd);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08003986 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
3987 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02003988 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08003989 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Ivan Kluchnikov67920592013-09-16 13:13:04 +04003990 install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02003991 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02003992 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02003993 install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
Harald Welte73225282009-12-12 18:17:25 +01003994 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
3995 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaute0b06b02010-11-28 18:17:28 +01003996 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
3997 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
3998 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
3999 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
4000 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
4001 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01004002 install_element(BTS_NODE, &cfg_bts_radio_link_timeout_cmd);
Harald Welte4511d892010-04-18 15:51:20 +02004003 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
bhargava350533c2016-07-21 11:14:34 +05304004 install_element(BTS_NODE, &cfg_bts_gprs_11bit_rach_support_for_egprs_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02004005 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004006 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01004007 install_element(BTS_NODE, &cfg_bts_gprs_net_ctrl_ord_cmd);
Max292ec582016-07-28 11:55:37 +02004008 install_element(BTS_NODE, &cfg_bts_gprs_ctrl_ack_cmd);
4009 install_element(BTS_NODE, &cfg_no_bts_gprs_ctrl_ack_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004010 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02004011 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08004012 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004013 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-03-14 23:30:30 +08004014 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
4015 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
4016 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08004017 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welte9fbff4a2010-07-30 11:50:09 +02004018 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
4019 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welte32c09622011-01-11 23:44:56 +01004020 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
4021 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Welte64c07d22011-02-15 11:43:27 +01004022 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Max59a1bf32016-04-15 16:04:46 +02004023 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_add_cmd);
4024 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_del_cmd);
Max26679e02016-04-20 15:57:13 +02004025 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_add_cmd);
4026 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_del_cmd);
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02004027 install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
4028 install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01004029 install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
4030 install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
Andreas Eversberga83d5112013-12-07 18:32:28 +01004031 install_element(BTS_NODE, &cfg_bts_codec0_cmd);
4032 install_element(BTS_NODE, &cfg_bts_codec1_cmd);
4033 install_element(BTS_NODE, &cfg_bts_codec2_cmd);
4034 install_element(BTS_NODE, &cfg_bts_codec3_cmd);
4035 install_element(BTS_NODE, &cfg_bts_codec4_cmd);
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01004036 install_element(BTS_NODE, &cfg_bts_depends_on_cmd);
4037 install_element(BTS_NODE, &cfg_bts_no_depends_on_cmd);
Andreas Eversberg73266522014-01-19 11:47:44 +01004038 install_element(BTS_NODE, &cfg_bts_amr_fr_modes1_cmd);
4039 install_element(BTS_NODE, &cfg_bts_amr_fr_modes2_cmd);
4040 install_element(BTS_NODE, &cfg_bts_amr_fr_modes3_cmd);
4041 install_element(BTS_NODE, &cfg_bts_amr_fr_modes4_cmd);
4042 install_element(BTS_NODE, &cfg_bts_amr_fr_thres1_cmd);
4043 install_element(BTS_NODE, &cfg_bts_amr_fr_thres2_cmd);
4044 install_element(BTS_NODE, &cfg_bts_amr_fr_thres3_cmd);
4045 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst1_cmd);
4046 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst2_cmd);
4047 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst3_cmd);
4048 install_element(BTS_NODE, &cfg_bts_amr_fr_start_mode_cmd);
4049 install_element(BTS_NODE, &cfg_bts_amr_hr_modes1_cmd);
4050 install_element(BTS_NODE, &cfg_bts_amr_hr_modes2_cmd);
4051 install_element(BTS_NODE, &cfg_bts_amr_hr_modes3_cmd);
4052 install_element(BTS_NODE, &cfg_bts_amr_hr_modes4_cmd);
4053 install_element(BTS_NODE, &cfg_bts_amr_hr_thres1_cmd);
4054 install_element(BTS_NODE, &cfg_bts_amr_hr_thres2_cmd);
4055 install_element(BTS_NODE, &cfg_bts_amr_hr_thres3_cmd);
4056 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst1_cmd);
4057 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst2_cmd);
4058 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst3_cmd);
4059 install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004060
Harald Welte5258fc42009-03-28 19:07:53 +00004061 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004062 install_node(&trx_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004063 vty_install_default(TRX_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004064 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004065 install_element(TRX_NODE, &cfg_description_cmd);
4066 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)7b37d972009-12-27 20:56:38 +01004067 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02004068 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004069 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
4070 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01004071 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004072
Harald Welte5258fc42009-03-28 19:07:53 +00004073 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004074 install_node(&ts_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004075 vty_install_default(TS_NODE);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004076 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004077 install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);
Harald Welte135a6482011-05-30 12:09:13 +02004078 install_element(TS_NODE, &cfg_ts_tsc_cmd);
Harald Weltea39b0f22010-06-14 22:26:10 +02004079 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte6e0cd042009-09-12 13:05:33 +02004080 install_element(TS_NODE, &cfg_ts_hsn_cmd);
4081 install_element(TS_NODE, &cfg_ts_maio_cmd);
4082 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
4083 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004084 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004085
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004086 install_element(ENABLE_NODE, &drop_bts_cmd);
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01004087 install_element(ENABLE_NODE, &restart_bts_cmd);
Harald Welted0d2b0b2010-12-23 13:18:07 +01004088 install_element(ENABLE_NODE, &pdch_act_cmd);
Harald Welte30f1f372014-12-28 15:00:45 +01004089 install_element(ENABLE_NODE, &smscb_cmd_cmd);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004090
Harald Welte81c9b9c2010-05-31 16:40:40 +02004091 abis_nm_vty_init();
Harald Weltee1d5eca2011-02-12 14:42:59 +01004092 abis_om2k_vty_init();
Harald Welte3016d9f2011-02-05 13:54:41 +01004093 e1inp_vty_init();
Harald Welte81c9b9c2010-05-31 16:40:40 +02004094
Harald Weltedcccb182010-05-16 20:52:23 +02004095 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00004096
Harald Welte68628e82009-03-10 12:17:57 +00004097 return 0;
4098}