blob: 0ee23907f42f80ff3076b75a0148792391f2b8bf [file] [log] [blame]
Harald Welte68628e82009-03-10 12:17:57 +00001/* OpenBSC interface to quagga VTY */
Harald Welteaf387632010-03-14 23:30:30 +08002/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
Harald Welte68628e82009-03-10 12:17:57 +00003 * All Rights Reserved
4 *
5 * This program is free software; you can redistribute it and/or modify
Harald Welte9af6ddf2011-01-01 15:25:50 +01006 * it under the terms of the GNU Affero General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
Harald Welte68628e82009-03-10 12:17:57 +00008 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Harald Welte9af6ddf2011-01-01 15:25:50 +010013 * GNU Affero General Public License for more details.
Harald Welte68628e82009-03-10 12:17:57 +000014 *
Harald Welte9af6ddf2011-01-01 15:25:50 +010015 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Harald Welte68628e82009-03-10 12:17:57 +000017 *
18 */
19
20#include <stdlib.h>
Maxc08ee712016-05-11 12:45:13 +020021#include <stdbool.h>
Harald Welte68628e82009-03-10 12:17:57 +000022#include <unistd.h>
Harald Welte68628e82009-03-10 12:17:57 +000023
Harald Welte4b037e42010-05-19 19:45:32 +020024#include <osmocom/vty/command.h>
25#include <osmocom/vty/buffer.h>
26#include <osmocom/vty/vty.h>
27#include <osmocom/vty/logging.h>
Jacob Erlbeck64630cc2015-10-26 16:25:37 +010028#include <osmocom/vty/stats.h>
Harald Welte4b037e42010-05-19 19:45:32 +020029#include <osmocom/vty/telnet_interface.h>
Harald Welte4ab9d7c2012-08-17 12:42:06 +020030#include <osmocom/vty/misc.h>
Maxc08ee712016-05-11 12:45:13 +020031#include <osmocom/gsm/protocol/gsm_04_08.h>
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +010032#include <osmocom/gsm/gsm0502.h>
33
Harald Welte68628e82009-03-10 12:17:57 +000034#include <arpa/inet.h>
35
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010036#include <osmocom/core/linuxlist.h>
Harald Welte68628e82009-03-10 12:17:57 +000037#include <openbsc/gsm_data.h>
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +020038#include <osmocom/abis/e1_input.h>
Harald Welte1bc77352009-03-10 19:47:51 +000039#include <openbsc/abis_nm.h>
Harald Welte4d54d0b2011-02-19 16:48:17 +010040#include <openbsc/abis_om2000.h>
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010041#include <osmocom/core/utils.h>
42#include <osmocom/gsm/gsm_utils.h>
Harald Weltecdc59ff2011-05-23 20:42:26 +020043#include <osmocom/gsm/abis_nm.h>
Harald Welteb908cb72009-12-22 13:09:29 +010044#include <openbsc/chan_alloc.h>
Harald Welte8387a492009-12-22 21:43:14 +010045#include <openbsc/meas_rep.h>
Harald Welte40f82892009-05-23 17:31:39 +000046#include <openbsc/db.h>
Holger Hans Peter Freyther3c712322010-04-06 11:55:37 +020047#include <openbsc/vty.h>
Harald Welteea34a4e2012-06-16 14:59:56 +080048#include <osmocom/gprs/gprs_ns.h>
Harald Welte9fbff4a2010-07-30 11:50:09 +020049#include <openbsc/system_information.h>
Harald Welte5bc61dc2010-05-16 22:02:16 +020050#include <openbsc/debug.h>
Holger Hans Peter Freyther85334f12010-11-09 17:00:42 +010051#include <openbsc/paging.h>
Harald Weltef7a2b192011-08-20 18:25:02 +020052#include <openbsc/ipaccess.h>
Harald Welted0d2b0b2010-12-23 13:18:07 +010053#include <openbsc/abis_rsl.h>
Neels Hofmeyra42855f2017-02-23 21:49:55 +010054#include <openbsc/bsc_msc_data.h>
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +010055#include <openbsc/osmo_bsc_rf.h>
Harald Welte8254cf72017-05-29 13:42:19 +020056#include <openbsc/pcu_if.h>
Harald Welte68628e82009-03-10 12:17:57 +000057
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +020058#include <openbsc/common_cs.h>
59
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +010060#include <inttypes.h>
61
Harald Weltec08e8be2011-03-04 13:53:51 +010062#include "../../bscconfig.h"
Harald Welte1353f962010-05-16 19:20:24 +020063
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +020064
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +020065#define LCHAN_NR_STR "Logical Channel Number\n"
66
67
Harald Welteea4647d2010-05-12 17:19:53 +000068/* FIXME: this should go to some common file */
69static const struct value_string gprs_ns_timer_strs[] = {
Harald Welte615e9562010-05-11 23:50:21 +020070 { 0, "tns-block" },
71 { 1, "tns-block-retries" },
72 { 2, "tns-reset" },
73 { 3, "tns-reset-retries" },
74 { 4, "tns-test" },
75 { 5, "tns-alive" },
76 { 6, "tns-alive-retries" },
77 { 0, NULL }
78};
79
Harald Welteea4647d2010-05-12 17:19:53 +000080static const struct value_string gprs_bssgp_cfg_strs[] = {
Harald Welte615e9562010-05-11 23:50:21 +020081 { 0, "blocking-timer" },
82 { 1, "blocking-retries" },
83 { 2, "unblocking-retries" },
84 { 3, "reset-timer" },
85 { 4, "reset-retries" },
86 { 5, "suspend-timer" },
87 { 6, "suspend-retries" },
88 { 7, "resume-timer" },
89 { 8, "resume-retries" },
90 { 9, "capability-update-timer" },
91 { 10, "capability-update-retries" },
92 { 0, NULL }
93};
94
Harald Welte64c07d22011-02-15 11:43:27 +010095static const struct value_string bts_neigh_mode_strs[] = {
96 { NL_MODE_AUTOMATIC, "automatic" },
97 { NL_MODE_MANUAL, "manual" },
98 { NL_MODE_MANUAL_SI5SEP, "manual-si5" },
99 { 0, NULL }
100};
101
Daniel Willmann7d109832012-05-14 18:43:23 +0200102const struct value_string bts_loc_fix_names[] = {
103 { BTS_LOC_FIX_INVALID, "invalid" },
104 { BTS_LOC_FIX_2D, "fix2d" },
105 { BTS_LOC_FIX_3D, "fix3d" },
106 { 0, NULL }
107};
108
Harald Welte68628e82009-03-10 12:17:57 +0000109struct cmd_node bts_node = {
110 BTS_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200111 "%s(config-net-bts)# ",
Harald Welte68628e82009-03-10 12:17:57 +0000112 1,
113};
114
115struct cmd_node trx_node = {
116 TRX_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200117 "%s(config-net-bts-trx)# ",
Harald Welte68628e82009-03-10 12:17:57 +0000118 1,
119};
120
121struct cmd_node ts_node = {
122 TS_NODE,
Harald Welte570ce242012-08-17 13:16:10 +0200123 "%s(config-net-bts-trx-ts)# ",
Harald Welte68628e82009-03-10 12:17:57 +0000124 1,
125};
126
127static int dummy_config_write(struct vty *v)
128{
129 return CMD_SUCCESS;
130}
131
132static void net_dump_nmstate(struct vty *vty, struct gsm_nm_state *nms)
133{
Harald Welte1304b352013-03-15 16:57:33 +0100134 vty_out(vty,"Oper '%s', Admin '%s', Avail '%s'%s",
135 abis_nm_opstate_name(nms->operational),
136 get_value_string(abis_nm_adm_state_names, nms->administrative),
Harald Welte867d9f32011-05-23 20:30:39 +0200137 abis_nm_avail_name(nms->availability), VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000138}
139
Harald Welteb908cb72009-12-22 13:09:29 +0100140static void dump_pchan_load_vty(struct vty *vty, char *prefix,
141 const struct pchan_load *pl)
142{
143 int i;
144
145 for (i = 0; i < ARRAY_SIZE(pl->pchan); i++) {
146 const struct load_counter *lc = &pl->pchan[i];
147 unsigned int percent;
148
149 if (lc->total == 0)
150 continue;
151
152 percent = (lc->used * 100) / lc->total;
153
154 vty_out(vty, "%s%20s: %3u%% (%u/%u)%s", prefix,
155 gsm_pchan_name(i), percent, lc->used, lc->total,
156 VTY_NEWLINE);
157 }
158}
159
Harald Welte68628e82009-03-10 12:17:57 +0000160static void net_dump_vty(struct vty *vty, struct gsm_network *net)
161{
Harald Welteb908cb72009-12-22 13:09:29 +0100162 struct pchan_load pl;
163
Harald Welteef235b52009-03-10 12:34:02 +0000164 vty_out(vty, "BSC is on Country Code %u, Network Code %u "
165 "and has %u BTS%s", net->country_code, net->network_code,
166 net->num_bts, VTY_NEWLINE);
Harald Welte1bc77352009-03-10 19:47:51 +0000167 vty_out(vty, " Long network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000168 net->name_long, VTY_NEWLINE);
Harald Welte1bc77352009-03-10 19:47:51 +0000169 vty_out(vty, " Short network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000170 net->name_short, VTY_NEWLINE);
Maxddee01f2016-05-24 14:23:27 +0200171 vty_out(vty, " Authentication policy: %s",
172 gsm_auth_policy_name(net->auth_policy));
173 if (net->authorized_reg_str)
174 vty_out(vty, ", authorized regexp: %s", net->authorized_reg_str);
175 vty_out(vty, "%s", VTY_NEWLINE);
Maxe6052c42016-06-30 10:25:49 +0200176 vty_out(vty, " Auto create subscriber: %s%s",
177 net->auto_create_subscr ? "yes" : "no", VTY_NEWLINE);
178 vty_out(vty, " Auto assign extension: %s%s",
179 net->auto_assign_exten ? "yes" : "no", VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100180 vty_out(vty, " Location updating reject cause: %u%s",
181 net->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900182 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
183 VTY_NEWLINE);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +0100184 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
185 VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800186 vty_out(vty, " Use TCH for Paging any: %d%s", net->pag_any_tch,
187 VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100188 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
189 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100190 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
191 VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100192 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
193 VTY_NEWLINE);
Harald Welteb908cb72009-12-22 13:09:29 +0100194 network_chan_load(&pl, net);
195 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
196 dump_pchan_load_vty(vty, " ", &pl);
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100197
198 /* show rf */
Holger Hans Peter Freythera9fae1a2014-02-08 12:12:03 +0100199 if (net->bsc_data)
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100200 vty_out(vty, " Last RF Command: %s%s",
Holger Hans Peter Freyther8ec49522011-08-15 15:53:00 +0200201 net->bsc_data->rf_ctrl->last_state_command,
Holger Hans Peter Freyther37ac4202011-02-24 14:19:14 +0100202 VTY_NEWLINE);
Holger Hans Peter Freythera9fae1a2014-02-08 12:12:03 +0100203 if (net->bsc_data)
Jacob Erlbeck779a7282013-09-11 10:46:57 +0200204 vty_out(vty, " Last RF Lock Command: %s%s",
205 net->bsc_data->rf_ctrl->last_rf_lock_ctrl_command,
206 VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000207}
208
Neels Hofmeyrea11bf82016-05-12 01:53:23 +0200209DEFUN(bsc_show_net, bsc_show_net_cmd, "show network",
Harald Welte68628e82009-03-10 12:17:57 +0000210 SHOW_STR "Display information about a GSM NETWORK\n")
211{
Harald Weltedcccb182010-05-16 20:52:23 +0200212 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000213 net_dump_vty(vty, net);
214
215 return CMD_SUCCESS;
216}
217
218static void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l)
219{
Harald Welteedb37782009-05-01 14:59:07 +0000220 struct e1inp_line *line;
221
222 if (!e1l) {
223 vty_out(vty, " None%s", VTY_NEWLINE);
224 return;
225 }
226
227 line = e1l->ts->line;
228
229 vty_out(vty, " E1 Line %u, Type %s: Timeslot %u, Mode %s%s",
230 line->num, line->driver->name, e1l->ts->num,
Harald Welte1bc77352009-03-10 19:47:51 +0000231 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
Harald Welteedb37782009-05-01 14:59:07 +0000232 vty_out(vty, " E1 TEI %u, SAPI %u%s",
Harald Welte68628e82009-03-10 12:17:57 +0000233 e1l->tei, e1l->sapi, VTY_NEWLINE);
234}
235
236static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
237{
Harald Welteb908cb72009-12-22 13:09:29 +0100238 struct pchan_load pl;
239
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200240 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Welte557c84e2015-11-20 10:50:24 +0100241 "BSIC %u (NCC=%u, BCC=%u) and %u TRX%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200242 bts->nr, btstype2str(bts->type), gsm_band_name(bts->band),
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200243 bts->cell_identity,
Harald Weltea2bbc5e2015-11-20 10:43:31 +0100244 bts->location_area_code, bts->bsic,
Harald Welte557c84e2015-11-20 10:50:24 +0100245 bts->bsic >> 3, bts->bsic & 7,
Harald Weltefcd24452009-06-20 18:15:19 +0200246 bts->num_trx, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200247 vty_out(vty, "Description: %s%s",
248 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Maxf9685c12017-03-23 12:01:07 +0100249 if (strnlen(bts->pcu_version, MAX_VERSION_LENGTH))
250 vty_out(vty, "PCU version %s connected%s", bts->pcu_version,
251 VTY_NEWLINE);
Harald Welte1d8dbc42009-12-12 15:38:16 +0100252 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100253 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte1d8dbc42009-12-12 15:38:16 +0100254 rxlev2dbm(bts->si_common.cell_sel_par.rxlev_acc_min),
255 VTY_NEWLINE);
256 vty_out(vty, "Cell Reselection Hysteresis: %u dBm%s",
Harald Welte73225282009-12-12 18:17:25 +0100257 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100258 vty_out(vty, "RACH TX-Integer: %u%s", bts->si_common.rach_control.tx_integer,
259 VTY_NEWLINE);
260 vty_out(vty, "RACH Max transmissions: %u%s",
261 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
262 VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100263 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200264 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +0200265 if (bts->dtxu != GSM48_DTX_SHALL_NOT_BE_USED)
266 vty_out(vty, "Uplink DTX: %s%s",
267 (bts->dtxu != GSM48_DTX_SHALL_BE_USED) ?
268 "enabled" : "forced", VTY_NEWLINE);
269 else
270 vty_out(vty, "Uplink DTX: not enabled%s", VTY_NEWLINE);
271 vty_out(vty, "Downlink DTX: %senabled%s", bts->dtxd ? "" : "not ",
272 VTY_NEWLINE);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +0200273 vty_out(vty, "Channel Description Attachment: %s%s",
274 (bts->si_common.chan_desc.att) ? "yes" : "no", VTY_NEWLINE);
275 vty_out(vty, "Channel Description BS-PA-MFRMS: %u%s",
276 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
277 vty_out(vty, "Channel Description BS-AG_BLKS-RES: %u%s",
278 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
Harald Welte9fbff4a2010-07-30 11:50:09 +0200279 vty_out(vty, "System Information present: 0x%08x, static: 0x%08x%s",
280 bts->si_valid, bts->si_mode_static, VTY_NEWLINE);
Harald Welte42def722017-01-13 00:10:32 +0100281 vty_out(vty, "Early Classmark Sending: %s%s",
282 bts->early_classmark_allowed ? "allowed" : "forbidden",
283 VTY_NEWLINE);
Harald Welte8254cf72017-05-29 13:42:19 +0200284 if (bts->pcu_sock_path)
285 vty_out(vty, "PCU Socket Path: %s%s", bts->pcu_sock_path, VTY_NEWLINE);
Harald Welte4cc34222009-05-01 15:12:31 +0000286 if (is_ipaccess_bts(bts))
Harald Welte8175e952009-10-20 00:22:00 +0200287 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte4cc34222009-05-01 15:12:31 +0000288 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte8175e952009-10-20 00:22:00 +0200289 bts->oml_tei, VTY_NEWLINE);
Sylvain Munautc9519462011-10-17 14:04:55 +0200290 else if (bts->type == GSM_BTS_TYPE_NOKIA_SITE)
291 vty_out(vty, " Skip Reset: %d%s",
292 bts->nokia.skip_reset, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000293 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200294 net_dump_nmstate(vty, &bts->mo.nm_state);
Harald Welte68628e82009-03-10 12:17:57 +0000295 vty_out(vty, " Site Mgr NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200296 net_dump_nmstate(vty, &bts->site_mgr.mo.nm_state);
Holger Hans Peter Freyther846d8dc2013-05-29 16:22:09 +0200297 vty_out(vty, " GPRS NSE: ");
298 net_dump_nmstate(vty, &bts->gprs.nse.mo.nm_state);
299 vty_out(vty, " GPRS CELL: ");
300 net_dump_nmstate(vty, &bts->gprs.cell.mo.nm_state);
301 vty_out(vty, " GPRS NSVC0: ");
302 net_dump_nmstate(vty, &bts->gprs.nsvc[0].mo.nm_state);
303 vty_out(vty, " GPRS NSVC1: ");
304 net_dump_nmstate(vty, &bts->gprs.nsvc[1].mo.nm_state);
Holger Hans Peter Freyther66e14cd2011-04-26 15:52:34 +0200305 vty_out(vty, " Paging: %u pending requests, %u free slots%s",
306 paging_pending_requests_nr(bts),
Harald Welte68628e82009-03-10 12:17:57 +0000307 bts->paging.available_slots, VTY_NEWLINE);
Holger Hans Peter Freytherd283db42010-11-25 16:28:45 +0100308 if (is_ipaccess_bts(bts)) {
309 vty_out(vty, " OML Link state: %s.%s",
310 bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);
311 } else {
Harald Welte8175e952009-10-20 00:22:00 +0200312 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
313 e1isl_dump_vty(vty, bts->oml_link);
314 }
Holger Hans Peter Freytherd283db42010-11-25 16:28:45 +0100315
316 /* FIXME: chan_desc */
Harald Welteb908cb72009-12-22 13:09:29 +0100317 memset(&pl, 0, sizeof(pl));
Neels Hofmeyr2afffd52016-09-25 17:01:20 +0200318 bts_chan_load(&pl, bts);
Harald Welteb908cb72009-12-22 13:09:29 +0100319 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
320 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte68628e82009-03-10 12:17:57 +0000321}
322
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100323DEFUN(show_bts, show_bts_cmd, "show bts [<0-255>]",
Harald Welte68628e82009-03-10 12:17:57 +0000324 SHOW_STR "Display information about a BTS\n"
325 "BTS number")
326{
Harald Weltedcccb182010-05-16 20:52:23 +0200327 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000328 int bts_nr;
329
330 if (argc != 0) {
331 /* use the BTS number that the user has specified */
332 bts_nr = atoi(argv[0]);
Harald Welte712ddbc2010-12-24 12:24:03 +0100333 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000334 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000335 VTY_NEWLINE);
336 return CMD_WARNING;
337 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200338 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000339 return CMD_SUCCESS;
340 }
341 /* print all BTS's */
342 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee441d9c2009-06-21 16:17:15 +0200343 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000344
345 return CMD_SUCCESS;
346}
347
Harald Welte42581822009-08-08 16:12:58 +0200348/* utility functions */
349static void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,
350 const char *ts, const char *ss)
351{
352 e1_link->e1_nr = atoi(line);
353 e1_link->e1_ts = atoi(ts);
354 if (!strcmp(ss, "full"))
355 e1_link->e1_ts_ss = 255;
356 else
357 e1_link->e1_ts_ss = atoi(ss);
358}
359
360static void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,
361 const char *prefix)
362{
363 if (!e1_link->e1_ts)
364 return;
365
366 if (e1_link->e1_ts_ss == 255)
367 vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",
368 prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);
369 else
370 vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",
371 prefix, e1_link->e1_nr, e1_link->e1_ts,
372 e1_link->e1_ts_ss, VTY_NEWLINE);
373}
374
375
Harald Welte67ce0732009-08-06 19:06:46 +0200376static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
377{
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100378 vty_out(vty, " timeslot %u%s", ts->nr, VTY_NEWLINE);
Harald Weltea2bbc5e2015-11-20 10:43:31 +0100379 if (ts->tsc != -1)
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100380 vty_out(vty, " training_sequence_code %u%s", ts->tsc, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200381 if (ts->pchan != GSM_PCHAN_NONE)
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100382 vty_out(vty, " phys_chan_config %s%s",
Harald Welte42581822009-08-08 16:12:58 +0200383 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100384 vty_out(vty, " hopping enabled %u%s",
Harald Weltea39b0f22010-06-14 22:26:10 +0200385 ts->hopping.enabled, VTY_NEWLINE);
386 if (ts->hopping.enabled) {
387 unsigned int i;
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100388 vty_out(vty, " hopping sequence-number %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200389 ts->hopping.hsn, VTY_NEWLINE);
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100390 vty_out(vty, " hopping maio %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200391 ts->hopping.maio, VTY_NEWLINE);
Harald Weltea39b0f22010-06-14 22:26:10 +0200392 for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {
393 if (!bitvec_get_bit_pos(&ts->hopping.arfcns, i))
394 continue;
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100395 vty_out(vty, " hopping arfcn add %u%s",
Harald Weltea39b0f22010-06-14 22:26:10 +0200396 i, VTY_NEWLINE);
397 }
Harald Welte127af342010-12-24 12:07:07 +0100398 }
Neels Hofmeyr9c4f1d62016-01-27 14:20:29 +0100399 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Welteface7ed2011-02-14 16:15:21 +0100400
401 if (ts->trx->bts->model->config_write_ts)
402 ts->trx->bts->model->config_write_ts(vty, ts);
Harald Welte67ce0732009-08-06 19:06:46 +0200403}
404
405static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
406{
407 int i;
408
Harald Welte5013b2a2009-08-07 13:29:14 +0200409 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200410 if (trx->description)
411 vty_out(vty, " description %s%s", trx->description,
412 VTY_NEWLINE);
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200413 vty_out(vty, " rf_locked %u%s",
Harald Welted64c0bc2011-05-30 12:07:53 +0200414 trx->mo.nm_state.administrative == NM_STATE_LOCKED ? 1 : 0,
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200415 VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200416 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)7b37d972009-12-27 20:56:38 +0100417 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200418 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200419 config_write_e1_link(vty, &trx->rsl_e1_link, " rsl ");
420 vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei, VTY_NEWLINE);
Harald Welte67ce0732009-08-06 19:06:46 +0200421
Harald Welteface7ed2011-02-14 16:15:21 +0100422 if (trx->bts->model->config_write_trx)
423 trx->bts->model->config_write_trx(vty, trx);
424
Harald Welte67ce0732009-08-06 19:06:46 +0200425 for (i = 0; i < TRX_NR_TS; i++)
426 config_write_ts_single(vty, &trx->ts[i]);
427}
428
Harald Welte615e9562010-05-11 23:50:21 +0200429static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
430{
431 unsigned int i;
432 vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
433 VTY_NEWLINE);
434 if (bts->gprs.mode == BTS_GPRS_NONE)
435 return;
436
bhargava350533c2016-07-21 11:14:34 +0530437 vty_out(vty, " gprs 11bit_rach_support_for_egprs %u%s",
438 bts->gprs.supports_egprs_11bit_rach, VTY_NEWLINE);
439
Harald Welte615e9562010-05-11 23:50:21 +0200440 vty_out(vty, " gprs routing area %u%s", bts->gprs.rac,
441 VTY_NEWLINE);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +0100442 vty_out(vty, " gprs network-control-order nc%u%s",
443 bts->gprs.net_ctrl_ord, VTY_NEWLINE);
Max292ec582016-07-28 11:55:37 +0200444 if (!bts->gprs.ctrl_ack_type_use_block)
445 vty_out(vty, " gprs control-ack-type-rach%s", VTY_NEWLINE);
Harald Welte615e9562010-05-11 23:50:21 +0200446 vty_out(vty, " gprs cell bvci %u%s", bts->gprs.cell.bvci,
447 VTY_NEWLINE);
448 for (i = 0; i < ARRAY_SIZE(bts->gprs.cell.timer); i++)
449 vty_out(vty, " gprs cell timer %s %u%s",
450 get_value_string(gprs_bssgp_cfg_strs, i),
451 bts->gprs.cell.timer[i], VTY_NEWLINE);
452 vty_out(vty, " gprs nsei %u%s", bts->gprs.nse.nsei,
453 VTY_NEWLINE);
454 for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)
455 vty_out(vty, " gprs ns timer %s %u%s",
456 get_value_string(gprs_ns_timer_strs, i),
457 bts->gprs.nse.timer[i], VTY_NEWLINE);
458 for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
459 struct gsm_bts_gprs_nsvc *nsvc =
460 &bts->gprs.nsvc[i];
461 struct in_addr ia;
462
463 ia.s_addr = htonl(nsvc->remote_ip);
464 vty_out(vty, " gprs nsvc %u nsvci %u%s", i,
465 nsvc->nsvci, VTY_NEWLINE);
466 vty_out(vty, " gprs nsvc %u local udp port %u%s", i,
467 nsvc->local_port, VTY_NEWLINE);
468 vty_out(vty, " gprs nsvc %u remote udp port %u%s", i,
469 nsvc->remote_port, VTY_NEWLINE);
470 vty_out(vty, " gprs nsvc %u remote ip %s%s", i,
471 inet_ntoa(ia), VTY_NEWLINE);
472 }
473}
474
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200475/* Write the model data if there is one */
476static void config_write_bts_model(struct vty *vty, struct gsm_bts *bts)
Harald Welte67ce0732009-08-06 19:06:46 +0200477{
478 struct gsm_bts_trx *trx;
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200479
480 if (!bts->model)
481 return;
482
483 if (bts->model->config_write_bts)
484 bts->model->config_write_bts(vty, bts);
485
486 llist_for_each_entry(trx, &bts->trx_list, list)
487 config_write_trx_single(vty, trx);
488}
489
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +0200490static void write_amr_modes(struct vty *vty, const char *prefix,
491 const char *name, struct amr_mode *modes, int num)
492{
493 int i;
494
495 vty_out(vty, " %s threshold %s", prefix, name);
496 for (i = 0; i < num - 1; i++)
497 vty_out(vty, " %d", modes[i].threshold);
498 vty_out(vty, "%s", VTY_NEWLINE);
499 vty_out(vty, " %s hysteresis %s", prefix, name);
500 for (i = 0; i < num - 1; i++)
501 vty_out(vty, " %d", modes[i].hysteresis);
502 vty_out(vty, "%s", VTY_NEWLINE);
503}
504
Andreas Eversberg73266522014-01-19 11:47:44 +0100505static void config_write_bts_amr(struct vty *vty, struct gsm_bts *bts,
506 struct amr_multirate_conf *mr, int full)
507{
508 struct gsm48_multi_rate_conf *mr_conf;
509 const char *prefix = (full) ? "amr tch-f" : "amr tch-h";
510 int i, num;
511
512 if (!(mr->gsm48_ie[1]))
513 return;
514
515 mr_conf = (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
516
517 num = 0;
518 vty_out(vty, " %s modes", prefix);
519 for (i = 0; i < ((full) ? 8 : 6); i++) {
520 if ((mr->gsm48_ie[1] & (1 << i))) {
521 vty_out(vty, " %d", i);
522 num++;
523 }
524 }
525 vty_out(vty, "%s", VTY_NEWLINE);
526 if (num > 4)
527 num = 4;
528 if (num > 1) {
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +0200529 write_amr_modes(vty, prefix, "ms", mr->ms_mode, num);
530 write_amr_modes(vty, prefix, "bts", mr->bts_mode, num);
Andreas Eversberg73266522014-01-19 11:47:44 +0100531 }
532 vty_out(vty, " %s start-mode ", prefix);
533 if (mr_conf->icmi) {
534 num = 0;
535 for (i = 0; i < ((full) ? 8 : 6) && num < 4; i++) {
536 if ((mr->gsm48_ie[1] & (1 << i)))
537 num++;
538 if (mr_conf->smod == num - 1) {
539 vty_out(vty, "%d%s", num, VTY_NEWLINE);
540 break;
541 }
542 }
543 } else
544 vty_out(vty, "auto%s", VTY_NEWLINE);
545}
546
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200547static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
548{
Harald Welte9fbff4a2010-07-30 11:50:09 +0200549 int i;
Max2c16bee2017-02-15 13:51:37 +0100550 uint8_t tmp;
Harald Welte67ce0732009-08-06 19:06:46 +0200551
Harald Welte5013b2a2009-08-07 13:29:14 +0200552 vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE);
553 vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200554 if (bts->description)
555 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200556 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freytherf926ed62009-11-19 16:38:49 +0100557 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200558 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte67ce0732009-08-06 19:06:46 +0200559 VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +0200560 if (bts->dtxu != GSM48_DTX_SHALL_NOT_BE_USED)
561 vty_out(vty, " dtx uplink%s%s",
562 (bts->dtxu != GSM48_DTX_SHALL_BE_USED) ? "" : " force",
563 VTY_NEWLINE);
564 if (bts->dtxd)
565 vty_out(vty, " dtx downlink%s", VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200566 vty_out(vty, " base_station_id_code %u%s", bts->bsic, VTY_NEWLINE);
Harald Welte (local)0e451d02009-08-13 10:14:26 +0200567 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100568 vty_out(vty, " cell reselection hysteresis %u%s",
569 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
570 vty_out(vty, " rxlev access min %u%s",
571 bts->si_common.cell_sel_par.rxlev_acc_min, VTY_NEWLINE);
Sylvain Munaute0b06b02010-11-28 18:17:28 +0100572
573 if (bts->si_common.cell_ro_sel_par.present) {
574 struct gsm48_si_selection_params *sp;
575 sp = &bts->si_common.cell_ro_sel_par;
576
577 if (sp->cbq)
578 vty_out(vty, " cell bar qualify %u%s",
579 sp->cbq, VTY_NEWLINE);
580
581 if (sp->cell_resel_off)
582 vty_out(vty, " cell reselection offset %u%s",
583 sp->cell_resel_off*2, VTY_NEWLINE);
584
585 if (sp->temp_offs == 7)
586 vty_out(vty, " temporary offset infinite%s",
587 VTY_NEWLINE);
588 else if (sp->temp_offs)
589 vty_out(vty, " temporary offset %u%s",
590 sp->temp_offs*10, VTY_NEWLINE);
591
592 if (sp->penalty_time == 31)
593 vty_out(vty, " penalty time reserved%s",
594 VTY_NEWLINE);
595 else if (sp->penalty_time)
596 vty_out(vty, " penalty time %u%s",
597 (sp->penalty_time*20)+20, VTY_NEWLINE);
598 }
599
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +0200600 /* Is periodic LU enabled or disabled? */
601 if (bts->si_common.chan_desc.t3212 == 0)
602 vty_out(vty, " no periodic location update%s", VTY_NEWLINE);
603 else
604 vty_out(vty, " periodic location update %u%s",
605 bts->si_common.chan_desc.t3212 * 6, VTY_NEWLINE);
606
Andreas Eversberg4d4944a2013-03-10 11:49:35 +0100607 vty_out(vty, " radio-link-timeout %d%s",
608 get_radio_link_timeout(&bts->si_common.cell_options),
609 VTY_NEWLINE);
Harald Welte7a8fa412009-08-10 13:48:16 +0200610 vty_out(vty, " channel allocator %s%s",
611 bts->chan_alloc_reverse ? "descending" : "ascending",
612 VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100613 vty_out(vty, " rach tx integer %u%s",
614 bts->si_common.rach_control.tx_integer, VTY_NEWLINE);
615 vty_out(vty, " rach max transmission %u%s",
616 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
617 VTY_NEWLINE);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800618
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +0200619 vty_out(vty, " channel-descrption attach %u%s",
620 bts->si_common.chan_desc.att, VTY_NEWLINE);
621 vty_out(vty, " channel-descrption bs-pa-mfrms %u%s",
622 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
623 vty_out(vty, " channel-descrption bs-ag-blks-res %u%s",
624 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
625
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800626 if (bts->rach_b_thresh != -1)
627 vty_out(vty, " rach nm busy threshold %u%s",
628 bts->rach_b_thresh, VTY_NEWLINE);
629 if (bts->rach_ldavg_slots != -1)
630 vty_out(vty, " rach nm load average %u%s",
631 bts->rach_ldavg_slots, VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100632 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200633 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +0800634 if ((bts->si_common.rach_control.t2 & 0x4) == 0)
635 vty_out(vty, " rach emergency call allowed 1%s", VTY_NEWLINE);
Ivan Kluchnikov67920592013-09-16 13:13:04 +0400636 if ((bts->si_common.rach_control.t3) != 0)
637 for (i = 0; i < 8; i++)
638 if (bts->si_common.rach_control.t3 & (0x1 << i))
639 vty_out(vty, " rach access-control-class %d barred%s", i, VTY_NEWLINE);
640 if ((bts->si_common.rach_control.t2 & 0xfb) != 0)
641 for (i = 0; i < 8; i++)
642 if ((i != 2) && (bts->si_common.rach_control.t2 & (0x1 << i)))
643 vty_out(vty, " rach access-control-class %d barred%s", i+8, VTY_NEWLINE);
Harald Welte9fbff4a2010-07-30 11:50:09 +0200644 for (i = SYSINFO_TYPE_1; i < _MAX_SYSINFO_TYPE; i++) {
645 if (bts->si_mode_static & (1 << i)) {
646 vty_out(vty, " system-information %s mode static%s",
647 get_value_string(osmo_sitype_strs, i), VTY_NEWLINE);
648 vty_out(vty, " system-information %s static %s%s",
649 get_value_string(osmo_sitype_strs, i),
Max6f0e50c2017-04-12 15:30:54 +0200650 osmo_hexdump_nospc(GSM_BTS_SI(bts, i), GSM_MACBLOCK_LEN),
Harald Welte9fbff4a2010-07-30 11:50:09 +0200651 VTY_NEWLINE);
652 }
653 }
Harald Welte42def722017-01-13 00:10:32 +0100654 vty_out(vty, " early-classmark-sending %s%s",
655 bts->early_classmark_allowed ? "allowed" : "forbidden", VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100656 switch (bts->type) {
657 case GSM_BTS_TYPE_NANOBTS:
Maxf9685c12017-03-23 12:01:07 +0100658 case GSM_BTS_TYPE_OSMOBTS:
Harald Welte5013b2a2009-08-07 13:29:14 +0200659 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Weltea6fd58e2009-08-07 00:25:23 +0200660 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte8b291802013-03-12 13:57:05 +0100661 if (bts->ip_access.rsl_ip) {
662 struct in_addr ia;
663 ia.s_addr = htonl(bts->ip_access.rsl_ip);
664 vty_out(vty, " ip.access rsl-ip %s%s", inet_ntoa(ia),
665 VTY_NEWLINE);
666 }
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +0200667 vty_out(vty, " oml ip.access stream_id %u line %u%s",
668 bts->oml_tei, bts->oml_e1_link.e1_nr, VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100669 break;
Sylvain Munautc9519462011-10-17 14:04:55 +0200670 case GSM_BTS_TYPE_NOKIA_SITE:
671 vty_out(vty, " nokia_site skip-reset %d%s", bts->nokia.skip_reset, VTY_NEWLINE);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +0100672 vty_out(vty, " nokia_site no-local-rel-conf %d%s",
673 bts->nokia.no_loc_rel_cnf, VTY_NEWLINE);
Sipos Csaba56e17662015-02-07 13:27:36 +0100674 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 +0100675 /* fall through: Nokia requires "oml e1" parameters also */
Harald Weltefd355a32011-03-04 13:41:31 +0100676 default:
Harald Welte42581822009-08-08 16:12:58 +0200677 config_write_e1_link(vty, &bts->oml_e1_link, " oml ");
678 vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE);
Harald Weltefd355a32011-03-04 13:41:31 +0100679 break;
Harald Welte42581822009-08-08 16:12:58 +0200680 }
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +0800681
682 /* if we have a limit, write it */
683 if (bts->paging.free_chans_need >= 0)
684 vty_out(vty, " paging free %d%s", bts->paging.free_chans_need, VTY_NEWLINE);
685
Harald Welte32c09622011-01-11 23:44:56 +0100686 vty_out(vty, " neighbor-list mode %s%s",
Harald Welte64c07d22011-02-15 11:43:27 +0100687 get_value_string(bts_neigh_mode_strs, bts->neigh_list_manual_mode), VTY_NEWLINE);
688 if (bts->neigh_list_manual_mode != NL_MODE_AUTOMATIC) {
Harald Welte32c09622011-01-11 23:44:56 +0100689 for (i = 0; i < 1024; i++) {
690 if (bitvec_get_bit_pos(&bts->si_common.neigh_list, i))
691 vty_out(vty, " neighbor-list add arfcn %u%s",
692 i, VTY_NEWLINE);
693 }
694 }
Harald Welte64c07d22011-02-15 11:43:27 +0100695 if (bts->neigh_list_manual_mode == NL_MODE_MANUAL_SI5SEP) {
696 for (i = 0; i < 1024; i++) {
697 if (bitvec_get_bit_pos(&bts->si_common.si5_neigh_list, i))
698 vty_out(vty, " si5 neighbor-list add arfcn %u%s",
699 i, VTY_NEWLINE);
700 }
701 }
Harald Welte32c09622011-01-11 23:44:56 +0100702
Max59a1bf32016-04-15 16:04:46 +0200703 for (i = 0; i < MAX_EARFCN_LIST; i++) {
Max2c16bee2017-02-15 13:51:37 +0100704 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
705 if (e->arfcn[i] != OSMO_EARFCN_INVALID) {
706 vty_out(vty, " si2quater neighbor-list add earfcn %u "
707 "thresh-hi %u", e->arfcn[i], e->thresh_hi);
708
709 vty_out(vty, " thresh-lo %u",
710 e->thresh_lo_valid ? e->thresh_lo : 32);
711
712 vty_out(vty, " prio %u",
713 e->prio_valid ? e->prio : 8);
714
715 vty_out(vty, " qrxlv %u",
716 e->qrxlm_valid ? e->qrxlm : 32);
717
718 tmp = e->meas_bw[i];
719 vty_out(vty, " meas %u",
720 (tmp != OSMO_EARFCN_MEAS_INVALID) ? tmp : 8);
Max59a1bf32016-04-15 16:04:46 +0200721
722 vty_out(vty, "%s", VTY_NEWLINE);
723 }
724 }
725
Max26679e02016-04-20 15:57:13 +0200726 for (i = 0; i < bts->si_common.uarfcn_length; i++) {
727 vty_out(vty, " si2quater neighbor-list add uarfcn %u %u %u%s",
728 bts->si_common.data.uarfcn_list[i],
729 bts->si_common.data.scramble_list[i] & ~(1 << 9),
730 (bts->si_common.data.scramble_list[i] >> 9) & 1,
731 VTY_NEWLINE);
732 }
733
Andreas Eversberga83d5112013-12-07 18:32:28 +0100734 vty_out(vty, " codec-support fr");
735 if (bts->codec.hr)
736 vty_out(vty, " hr");
737 if (bts->codec.efr)
738 vty_out(vty, " efr");
739 if (bts->codec.amr)
740 vty_out(vty, " amr");
741 vty_out(vty, "%s", VTY_NEWLINE);
742
Andreas Eversberg73266522014-01-19 11:47:44 +0100743 config_write_bts_amr(vty, bts, &bts->mr_full, 1);
744 config_write_bts_amr(vty, bts, &bts->mr_half, 0);
745
Harald Welte615e9562010-05-11 23:50:21 +0200746 config_write_bts_gprs(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200747
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +0200748 if (bts->excl_from_rf_lock)
749 vty_out(vty, " rf-lock-exclude%s", VTY_NEWLINE);
750
Jacob Erlbeck65d114f2014-01-16 11:02:14 +0100751 vty_out(vty, " %sforce-combined-si%s",
752 bts->force_combined_si ? "" : "no ", VTY_NEWLINE);
753
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +0100754 for (i = 0; i < ARRAY_SIZE(bts->depends_on); ++i) {
755 int j;
756
757 if (bts->depends_on[i] == 0)
758 continue;
759
760 for (j = 0; j < sizeof(bts->depends_on[i]) * 8; ++j) {
761 int bts_nr;
762
763 if ((bts->depends_on[i] & (1<<j)) == 0)
764 continue;
765
766 bts_nr = (i * sizeof(bts->depends_on[i]) * 8) + j;
767 vty_out(vty, " depends-on-bts %d%s", bts_nr, VTY_NEWLINE);
768 }
769 }
Harald Welte8254cf72017-05-29 13:42:19 +0200770 if (bts->pcu_sock_path)
771 vty_out(vty, " pcu-socket %s%s", bts->pcu_sock_path, VTY_NEWLINE);
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +0100772
Holger Hans Peter Freythercd40fb42013-09-15 17:23:34 +0200773 config_write_bts_model(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200774}
775
776static int config_write_bts(struct vty *v)
777{
Harald Weltedcccb182010-05-16 20:52:23 +0200778 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte67ce0732009-08-06 19:06:46 +0200779 struct gsm_bts *bts;
780
781 llist_for_each_entry(bts, &gsmnet->bts_list, list)
782 config_write_bts_single(v, bts);
783
784 return CMD_SUCCESS;
785}
786
Harald Welte5013b2a2009-08-07 13:29:14 +0200787static int config_write_net(struct vty *vty)
788{
Harald Weltedcccb182010-05-16 20:52:23 +0200789 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
790
Harald Welte5013b2a2009-08-07 13:29:14 +0200791 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200792 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200793 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200794 vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE);
795 vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE);
Harald Welte (local)69de3972009-08-12 14:42:23 +0200796 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Maxddee01f2016-05-24 14:23:27 +0200797 if (gsmnet->authorized_reg_str)
798 vty_out(vty, " authorized-regexp %s%s", gsmnet->authorized_reg_str, VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100799 vty_out(vty, " location updating reject cause %u%s",
800 gsmnet->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900801 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freytherd54c3372009-11-19 16:37:48 +0100802 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800803 vty_out(vty, " paging any use tch %d%s", gsmnet->pag_any_tch, VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100804 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
805 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100806 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100807 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Welteb720bd32009-12-21 16:51:50 +0100808 vty_out(vty, " handover window rxlev averaging %u%s",
809 gsmnet->handover.win_rxlev_avg, VTY_NEWLINE);
810 vty_out(vty, " handover window rxqual averaging %u%s",
811 gsmnet->handover.win_rxqual_avg, VTY_NEWLINE);
812 vty_out(vty, " handover window rxlev neighbor averaging %u%s",
813 gsmnet->handover.win_rxlev_avg_neigh, VTY_NEWLINE);
814 vty_out(vty, " handover power budget interval %u%s",
815 gsmnet->handover.pwr_interval, VTY_NEWLINE);
816 vty_out(vty, " handover power budget hysteresis %u%s",
817 gsmnet->handover.pwr_hysteresis, VTY_NEWLINE);
818 vty_out(vty, " handover maximum distance %u%s",
819 gsmnet->handover.max_distance, VTY_NEWLINE);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +0100820 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100821 vty_out(vty, " timer t3103 %u%s", gsmnet->T3103, VTY_NEWLINE);
822 vty_out(vty, " timer t3105 %u%s", gsmnet->T3105, VTY_NEWLINE);
823 vty_out(vty, " timer t3107 %u%s", gsmnet->T3107, VTY_NEWLINE);
824 vty_out(vty, " timer t3109 %u%s", gsmnet->T3109, VTY_NEWLINE);
825 vty_out(vty, " timer t3111 %u%s", gsmnet->T3111, VTY_NEWLINE);
826 vty_out(vty, " timer t3113 %u%s", gsmnet->T3113, VTY_NEWLINE);
827 vty_out(vty, " timer t3115 %u%s", gsmnet->T3115, VTY_NEWLINE);
828 vty_out(vty, " timer t3117 %u%s", gsmnet->T3117, VTY_NEWLINE);
829 vty_out(vty, " timer t3119 %u%s", gsmnet->T3119, VTY_NEWLINE);
Harald Welte2862dca2010-12-23 14:39:29 +0100830 vty_out(vty, " timer t3122 %u%s", gsmnet->T3122, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100831 vty_out(vty, " timer t3141 %u%s", gsmnet->T3141, VTY_NEWLINE);
Vadim Yanitskiy7f3724e2017-03-31 23:27:44 +0700832 vty_out(vty, " dyn_ts_allow_tch_f %d%s",
833 gsmnet->dyn_ts_allow_tch_f ? 1 : 0, VTY_NEWLINE);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +0100834 vty_out(vty, " subscriber-keep-in-ram %d%s",
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100835 gsmnet->subscr_group->keep_subscr, VTY_NEWLINE);
Neels Hofmeyr73983952016-05-10 13:29:33 +0200836 if (gsmnet->tz.override != 0) {
837 if (gsmnet->tz.dst)
838 vty_out(vty, " timezone %d %d %d%s",
839 gsmnet->tz.hr, gsmnet->tz.mn, gsmnet->tz.dst,
840 VTY_NEWLINE);
841 else
842 vty_out(vty, " timezone %d %d%s",
843 gsmnet->tz.hr, gsmnet->tz.mn, VTY_NEWLINE);
844 }
Harald Welte5013b2a2009-08-07 13:29:14 +0200845
846 return CMD_SUCCESS;
847}
Harald Welte67ce0732009-08-06 19:06:46 +0200848
Harald Welte68628e82009-03-10 12:17:57 +0000849static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx)
850{
851 vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
852 trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200853 vty_out(vty, "Description: %s%s",
854 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Weltefcd24452009-06-20 18:15:19 +0200855 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte42581822009-08-08 16:12:58 +0200856 "resulting BS power: %d dBm%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200857 trx->nominal_power, trx->max_power_red,
Harald Welte42581822009-08-08 16:12:58 +0200858 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000859 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200860 net_dump_nmstate(vty, &trx->mo.nm_state);
Harald Welte68628e82009-03-10 12:17:57 +0000861 vty_out(vty, " Baseband Transceiver NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200862 net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);
Harald Welte8175e952009-10-20 00:22:00 +0200863 if (is_ipaccess_bts(trx->bts)) {
864 vty_out(vty, " ip.access stream ID: 0x%02x%s",
865 trx->rsl_tei, VTY_NEWLINE);
866 } else {
867 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
868 e1isl_dump_vty(vty, trx->rsl_link);
869 }
Harald Welte68628e82009-03-10 12:17:57 +0000870}
871
872DEFUN(show_trx,
873 show_trx_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100874 "show trx [<0-255>] [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200875 SHOW_STR "Display information about a TRX\n"
876 "BTS Number\n"
877 "TRX Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000878{
Harald Weltedcccb182010-05-16 20:52:23 +0200879 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000880 struct gsm_bts *bts = NULL;
881 struct gsm_bts_trx *trx;
882 int bts_nr, trx_nr;
883
884 if (argc >= 1) {
885 /* use the BTS number that the user has specified */
886 bts_nr = atoi(argv[0]);
887 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000888 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000889 VTY_NEWLINE);
890 return CMD_WARNING;
891 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200892 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000893 }
894 if (argc >= 2) {
895 trx_nr = atoi(argv[1]);
896 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000897 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000898 VTY_NEWLINE);
899 return CMD_WARNING;
900 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200901 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000902 trx_dump_vty(vty, trx);
903 return CMD_SUCCESS;
904 }
905 if (bts) {
906 /* print all TRX in this BTS */
907 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200908 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000909 trx_dump_vty(vty, trx);
910 }
911 return CMD_SUCCESS;
912 }
913
914 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200915 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000916 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200917 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000918 trx_dump_vty(vty, trx);
919 }
920 }
921
922 return CMD_SUCCESS;
923}
924
Harald Welte67ce0732009-08-06 19:06:46 +0200925
Harald Welte68628e82009-03-10 12:17:57 +0000926static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
927{
Harald Welte135a6482011-05-30 12:09:13 +0200928 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, phys cfg %s, TSC %u",
Harald Welte026b4ca2010-12-24 12:12:10 +0100929 ts->trx->bts->nr, ts->trx->nr, ts->nr,
Harald Welte1fe24122014-01-19 17:18:21 +0100930 gsm_pchan_name(ts->pchan), gsm_ts_tsc(ts));
Harald Weltecd103a92010-12-24 12:14:52 +0100931 if (ts->pchan == GSM_PCHAN_TCH_F_PDCH)
Harald Welteb29cea12010-12-24 12:26:13 +0100932 vty_out(vty, " (%s mode)",
Neels Hofmeyr2ebacce2016-06-14 14:08:35 +0200933 ts->flags & TS_F_PDCH_ACTIVE ? "PDCH" : "TCH/F");
Harald Weltecd103a92010-12-24 12:14:52 +0100934 vty_out(vty, "%s", VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000935 vty_out(vty, " NM State: ");
Harald Welted64c0bc2011-05-30 12:07:53 +0200936 net_dump_nmstate(vty, &ts->mo.nm_state);
Harald Welte2c828992009-12-02 01:56:49 +0530937 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welteef235b52009-03-10 12:34:02 +0000938 vty_out(vty, " E1 Line %u, Timeslot %u, Subslot %u%s",
939 ts->e1_link.e1_nr, ts->e1_link.e1_ts,
940 ts->e1_link.e1_ts_ss, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000941}
942
943DEFUN(show_ts,
944 show_ts_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +0100945 "show timeslot [<0-255>] [<0-255>] [<0-7>]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200946 SHOW_STR "Display information about a TS\n"
947 "BTS Number\n" "TRX Number\n" "Timeslot Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000948{
Harald Weltedcccb182010-05-16 20:52:23 +0200949 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte274d0152010-12-24 12:05:03 +0100950 struct gsm_bts *bts = NULL;
951 struct gsm_bts_trx *trx = NULL;
952 struct gsm_bts_trx_ts *ts = NULL;
Harald Welte68628e82009-03-10 12:17:57 +0000953 int bts_nr, trx_nr, ts_nr;
954
955 if (argc >= 1) {
956 /* use the BTS number that the user has specified */
957 bts_nr = atoi(argv[0]);
958 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000959 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000960 VTY_NEWLINE);
961 return CMD_WARNING;
962 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200963 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000964 }
965 if (argc >= 2) {
966 trx_nr = atoi(argv[1]);
967 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000968 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000969 VTY_NEWLINE);
970 return CMD_WARNING;
971 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200972 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000973 }
974 if (argc >= 3) {
975 ts_nr = atoi(argv[2]);
976 if (ts_nr >= TRX_NR_TS) {
Harald Welte1bc77352009-03-10 19:47:51 +0000977 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
Harald Welte68628e82009-03-10 12:17:57 +0000978 VTY_NEWLINE);
979 return CMD_WARNING;
980 }
Harald Welte274d0152010-12-24 12:05:03 +0100981 /* Fully Specified: print and exit */
Harald Welte68628e82009-03-10 12:17:57 +0000982 ts = &trx->ts[ts_nr];
983 ts_dump_vty(vty, ts);
984 return CMD_SUCCESS;
985 }
Harald Welte274d0152010-12-24 12:05:03 +0100986
987 if (bts && trx) {
988 /* Iterate over all TS in this TRX */
989 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
990 ts = &trx->ts[ts_nr];
991 ts_dump_vty(vty, ts);
992 }
993 } else if (bts) {
994 /* Iterate over all TRX in this BTS, TS in each TRX */
Harald Welte68628e82009-03-10 12:17:57 +0000995 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200996 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000997 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
998 ts = &trx->ts[ts_nr];
999 ts_dump_vty(vty, ts);
1000 }
1001 }
Harald Welte274d0152010-12-24 12:05:03 +01001002 } else {
1003 /* Iterate over all BTS, TRX in each BTS, TS in each TRX */
1004 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
1005 bts = gsm_bts_num(net, bts_nr);
1006 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
1007 trx = gsm_bts_trx_num(bts, trx_nr);
1008 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
1009 ts = &trx->ts[ts_nr];
1010 ts_dump_vty(vty, ts);
1011 }
1012 }
1013 }
Harald Welte68628e82009-03-10 12:17:57 +00001014 }
1015
1016 return CMD_SUCCESS;
1017}
1018
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +01001019static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte68628e82009-03-10 12:17:57 +00001020{
Harald Weltefcd24452009-06-20 18:15:19 +02001021 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte40f82892009-05-23 17:31:39 +00001022 subscr->authorized, VTY_NEWLINE);
Holger Hans Peter Freyther7f180e82013-12-12 15:45:41 +01001023 if (strlen(subscr->name))
Harald Welte1bc77352009-03-10 19:47:51 +00001024 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
Holger Hans Peter Freytherbd30cd32014-04-04 11:53:18 +02001025 if (strlen(subscr->extension))
Harald Welte68628e82009-03-10 12:17:57 +00001026 vty_out(vty, " Extension: %s%s", subscr->extension,
1027 VTY_NEWLINE);
Holger Hans Peter Freyther5ccd0152013-07-14 08:38:24 +02001028 vty_out(vty, " IMSI: %s%s", subscr->imsi, VTY_NEWLINE);
Holger Hans Peter Freyther22230252009-08-19 12:53:57 +02001029 if (subscr->tmsi != GSM_RESERVED_TMSI)
1030 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte731fd912009-08-15 03:24:51 +02001031 VTY_NEWLINE);
Sylvain Munautaf292642009-12-27 19:29:28 +01001032
Harald Welte (local)15920de2009-08-14 20:27:16 +02001033 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +00001034}
1035
Neels Hofmeyr6d804b12017-02-18 22:20:46 +01001036static void bsc_subscr_dump_vty(struct vty *vty, struct bsc_subscr *bsub)
1037{
1038 if (strlen(bsub->imsi))
1039 vty_out(vty, " IMSI: %s%s", bsub->imsi, VTY_NEWLINE);
1040 if (bsub->tmsi != GSM_RESERVED_TMSI)
1041 vty_out(vty, " TMSI: 0x%08x%s", bsub->tmsi,
1042 VTY_NEWLINE);
1043 vty_out(vty, " Use count: %d%s", bsub->use_count, VTY_NEWLINE);
1044}
1045
Harald Welte8387a492009-12-22 21:43:14 +01001046static void meas_rep_dump_uni_vty(struct vty *vty,
1047 struct gsm_meas_rep_unidir *mru,
1048 const char *prefix,
1049 const char *dir)
1050{
1051 vty_out(vty, "%s RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",
1052 prefix, dir, rxlev2dbm(mru->full.rx_lev),
1053 dir, rxlev2dbm(mru->sub.rx_lev));
1054 vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",
1055 dir, mru->full.rx_qual, dir, mru->sub.rx_qual,
1056 VTY_NEWLINE);
1057}
1058
1059static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,
1060 const char *prefix)
1061{
1062 vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);
1063 vty_out(vty, "%s Flags: %s%s%s%s%s", prefix,
1064 mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",
1065 mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",
1066 mr->flags & MEAS_REP_F_FPC ? "FPC " : "",
1067 mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",
1068 VTY_NEWLINE);
1069 if (mr->flags & MEAS_REP_F_MS_TO)
Max11e4e412017-04-20 13:07:58 +02001070 vty_out(vty, "%s MS Timing Offset: %d%s", prefix, mr->ms_timing_offset, VTY_NEWLINE);
Harald Welte8387a492009-12-22 21:43:14 +01001071 if (mr->flags & MEAS_REP_F_MS_L1)
1072 vty_out(vty, "%s L1 MS Power: %u dBm, Timing Advance: %u%s",
1073 prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);
1074 if (mr->flags & MEAS_REP_F_DL_VALID)
1075 meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");
1076 meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");
1077}
1078
Harald Welte0a8cf322015-12-05 17:22:49 +01001079/* FIXME: move this to libosmogsm */
1080static const struct value_string gsm48_cmode_names[] = {
1081 { GSM48_CMODE_SIGN, "signalling" },
1082 { GSM48_CMODE_SPEECH_V1, "FR or HR" },
1083 { GSM48_CMODE_SPEECH_EFR, "EFR" },
1084 { GSM48_CMODE_SPEECH_AMR, "AMR" },
1085 { GSM48_CMODE_DATA_14k5, "CSD(14k5)" },
1086 { GSM48_CMODE_DATA_12k0, "CSD(12k0)" },
1087 { GSM48_CMODE_DATA_6k0, "CSD(6k0)" },
1088 { GSM48_CMODE_DATA_3k6, "CSD(3k6)" },
1089 { 0, NULL }
1090};
1091
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001092/* call vty_out() to print a string like " as TCH/H" for dynamic timeslots.
1093 * Don't do anything if the ts is not dynamic. */
1094static void vty_out_dyn_ts_status(struct vty *vty, struct gsm_bts_trx_ts *ts)
1095{
1096 switch (ts->pchan) {
1097 case GSM_PCHAN_TCH_F_TCH_H_PDCH:
1098 if (ts->dyn.pchan_is == ts->dyn.pchan_want)
1099 vty_out(vty, " as %s",
1100 gsm_pchan_name(ts->dyn.pchan_is));
1101 else
1102 vty_out(vty, " switching %s -> %s",
1103 gsm_pchan_name(ts->dyn.pchan_is),
1104 gsm_pchan_name(ts->dyn.pchan_want));
1105 break;
1106 case GSM_PCHAN_TCH_F_PDCH:
1107 if ((ts->flags & TS_F_PDCH_PENDING_MASK) == 0)
1108 vty_out(vty, " as %s",
1109 (ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
1110 : "TCH/F");
1111 else
1112 vty_out(vty, " switching %s -> %s",
1113 (ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
1114 : "TCH/F",
1115 (ts->flags & TS_F_PDCH_ACT_PENDING)? "PDCH"
1116 : "TCH/F");
1117 break;
1118 default:
1119 /* no dyn ts */
1120 break;
1121 }
1122}
1123
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001124static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte68628e82009-03-10 12:17:57 +00001125{
Harald Welte8387a492009-12-22 21:43:14 +01001126 int idx;
1127
Harald Welte85bded82010-12-24 12:22:34 +01001128 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",
1129 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
1130 lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001131 /* show dyn TS details, if applicable */
1132 switch (lchan->ts->pchan) {
1133 case GSM_PCHAN_TCH_F_TCH_H_PDCH:
1134 vty_out(vty, " Osmocom Dyn TS:");
1135 vty_out_dyn_ts_status(vty, lchan->ts);
1136 vty_out(vty, VTY_NEWLINE);
1137 break;
1138 case GSM_PCHAN_TCH_F_PDCH:
1139 vty_out(vty, " IPACC Dyn PDCH TS:");
1140 vty_out_dyn_ts_status(vty, lchan->ts);
1141 vty_out(vty, VTY_NEWLINE);
1142 break;
1143 default:
1144 /* no dyn ts */
1145 break;
1146 }
Holger Hans Peter Freyther454140e2014-12-28 12:08:28 +01001147 vty_out(vty, " Connection: %u, State: %s%s%s%s",
Holger Hans Peter Freyther40494552010-06-28 17:09:29 +08001148 lchan->conn ? 1: 0,
Holger Hans Peter Freyther454140e2014-12-28 12:08:28 +01001149 gsm_lchans_name(lchan->state),
1150 lchan->state == LCHAN_S_BROKEN ? " Error reason: " : "",
1151 lchan->state == LCHAN_S_BROKEN ? lchan->broken_reason : "",
1152 VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +01001153 vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s",
1154 lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
1155 - lchan->bs_power*2,
1156 ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),
1157 VTY_NEWLINE);
Harald Welte0a8cf322015-12-05 17:22:49 +01001158 vty_out(vty, " Channel Mode / Codec: %s%s",
1159 get_value_string(gsm48_cmode_names, lchan->tch_mode),
1160 VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +08001161 if (lchan->conn && lchan->conn->subscr) {
Harald Welte68628e82009-03-10 12:17:57 +00001162 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +08001163 subscr_dump_vty(vty, lchan->conn->subscr);
Harald Welte68628e82009-03-10 12:17:57 +00001164 } else
1165 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte2c828992009-12-02 01:56:49 +05301166 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
1167 struct in_addr ia;
Holger Hans Peter Freyther54fa7992010-04-07 15:39:16 +02001168 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte2c828992009-12-02 01:56:49 +05301169 vty_out(vty, " Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",
1170 inet_ntoa(ia), lchan->abis_ip.bound_port,
1171 lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,
1172 VTY_NEWLINE);
1173 }
Harald Welte8387a492009-12-22 21:43:14 +01001174
1175 /* we want to report the last measurement report */
1176 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1177 lchan->meas_rep_idx, 1);
1178 meas_rep_dump_vty(vty, &lchan->meas_rep[idx], " ");
Harald Welte68628e82009-03-10 12:17:57 +00001179}
1180
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001181static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
1182{
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +08001183 struct gsm_meas_rep *mr;
1184 int idx;
1185
1186 /* we want to report the last measurement report */
1187 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1188 lchan->meas_rep_idx, 1);
1189 mr = &lchan->meas_rep[idx];
1190
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001191 vty_out(vty, "BTS %u, TRX %u, Timeslot %u %s",
Harald Welte85bded82010-12-24 12:22:34 +01001192 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
Neels Hofmeyrb7480122016-11-02 14:28:15 +01001193 gsm_pchan_name(lchan->ts->pchan));
1194 vty_out_dyn_ts_status(vty, lchan->ts);
1195 vty_out(vty, ", Lchan %u, Type %s, State %s - "
1196 "L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
Neels Hofmeyrefedf802016-06-14 01:31:38 +02001197 lchan->nr,
1198 gsm_lchant_name(lchan->type), gsm_lchans_name(lchan->state),
1199 mr->ms_l1.pwr,
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +08001200 rxlev2dbm(mr->dl.full.rx_lev),
1201 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001202 VTY_NEWLINE);
1203}
1204
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001205
1206static int dump_lchan_trx_ts(struct gsm_bts_trx_ts *ts, struct vty *vty,
1207 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1208{
1209 int lchan_nr;
1210 for (lchan_nr = 0; lchan_nr < TS_MAX_LCHAN; lchan_nr++) {
1211 struct gsm_lchan *lchan = &ts->lchan[lchan_nr];
1212 if ((lchan->type == GSM_LCHAN_NONE) && (lchan->state == LCHAN_S_NONE))
1213 continue;
1214 dump_cb(vty, lchan);
1215 }
1216
1217 return CMD_SUCCESS;
1218}
1219
1220static int dump_lchan_trx(struct gsm_bts_trx *trx, struct vty *vty,
1221 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1222{
1223 int ts_nr;
1224
1225 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
1226 struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
1227 dump_lchan_trx_ts(ts, vty, dump_cb);
1228 }
1229
1230 return CMD_SUCCESS;
1231}
1232
1233static int dump_lchan_bts(struct gsm_bts *bts, struct vty *vty,
1234 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1235{
1236 int trx_nr;
1237
1238 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
1239 struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, trx_nr);
1240 dump_lchan_trx(trx, vty, dump_cb);
1241 }
1242
1243 return CMD_SUCCESS;
1244}
1245
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001246static int lchan_summary(struct vty *vty, int argc, const char **argv,
1247 void (*dump_cb)(struct vty *, struct gsm_lchan *))
Harald Welte68628e82009-03-10 12:17:57 +00001248{
Harald Weltedcccb182010-05-16 20:52:23 +02001249 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +00001250 struct gsm_bts *bts;
1251 struct gsm_bts_trx *trx;
1252 struct gsm_bts_trx_ts *ts;
1253 struct gsm_lchan *lchan;
1254 int bts_nr, trx_nr, ts_nr, lchan_nr;
1255
1256 if (argc >= 1) {
1257 /* use the BTS number that the user has specified */
1258 bts_nr = atoi(argv[0]);
1259 if (bts_nr >= net->num_bts) {
1260 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1261 VTY_NEWLINE);
1262 return CMD_WARNING;
1263 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001264 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001265
1266 if (argc == 1)
1267 return dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001268 }
1269 if (argc >= 2) {
1270 trx_nr = atoi(argv[1]);
1271 if (trx_nr >= bts->num_trx) {
1272 vty_out(vty, "%% can't find TRX %s%s", argv[1],
1273 VTY_NEWLINE);
1274 return CMD_WARNING;
1275 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001276 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001277
1278 if (argc == 2)
1279 return dump_lchan_trx(trx, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001280 }
1281 if (argc >= 3) {
1282 ts_nr = atoi(argv[2]);
1283 if (ts_nr >= TRX_NR_TS) {
1284 vty_out(vty, "%% can't find TS %s%s", argv[2],
1285 VTY_NEWLINE);
1286 return CMD_WARNING;
1287 }
1288 ts = &trx->ts[ts_nr];
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001289
1290 if (argc == 3)
1291 return dump_lchan_trx_ts(ts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001292 }
1293 if (argc >= 4) {
1294 lchan_nr = atoi(argv[3]);
1295 if (lchan_nr >= TS_MAX_LCHAN) {
1296 vty_out(vty, "%% can't find LCHAN %s%s", argv[3],
1297 VTY_NEWLINE);
1298 return CMD_WARNING;
1299 }
1300 lchan = &ts->lchan[lchan_nr];
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001301 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +00001302 return CMD_SUCCESS;
1303 }
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001304
1305
Harald Welte68628e82009-03-10 12:17:57 +00001306 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001307 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther7173f632011-12-27 16:34:12 +01001308 dump_lchan_bts(bts, vty, dump_cb);
Harald Welte68628e82009-03-10 12:17:57 +00001309 }
1310
1311 return CMD_SUCCESS;
1312}
1313
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001314
1315DEFUN(show_lchan,
1316 show_lchan_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001317 "show lchan [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001318 SHOW_STR "Display information about a logical channel\n"
1319 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001320 LCHAN_NR_STR)
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +08001321
1322{
1323 return lchan_summary(vty, argc, argv, lchan_dump_full_vty);
1324}
1325
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001326DEFUN(show_lchan_summary,
1327 show_lchan_summary_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001328 "show lchan summary [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001329 SHOW_STR "Display information about a logical channel\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001330 "Short summary\n"
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001331 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001332 LCHAN_NR_STR)
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001333{
1334 return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
1335}
1336
Harald Weltebe4b7302009-05-23 16:59:33 +00001337static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
Harald Weltef5025b62009-03-28 16:55:11 +00001338{
1339 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
Neels Hofmeyr6d804b12017-02-18 22:20:46 +01001340 bsc_subscr_dump_vty(vty, pag->bsub);
Harald Weltef5025b62009-03-28 16:55:11 +00001341}
1342
Harald Weltebe4b7302009-05-23 16:59:33 +00001343static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
Harald Weltef5025b62009-03-28 16:55:11 +00001344{
1345 struct gsm_paging_request *pag;
1346
Holger Hans Peter Freyther9b5192b2013-03-03 11:03:17 +01001347 if (!bts->paging.bts)
1348 return;
1349
Harald Weltef5025b62009-03-28 16:55:11 +00001350 llist_for_each_entry(pag, &bts->paging.pending_requests, entry)
1351 paging_dump_vty(vty, pag);
1352}
1353
1354DEFUN(show_paging,
1355 show_paging_cmd,
Sylvain Munaut39c31de2012-12-28 12:15:11 +01001356 "show paging [<0-255>]",
Harald Welte8f0ed552010-05-11 21:53:49 +02001357 SHOW_STR "Display information about paging reuqests of a BTS\n"
1358 "BTS Number\n")
Harald Weltef5025b62009-03-28 16:55:11 +00001359{
Harald Weltedcccb182010-05-16 20:52:23 +02001360 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Weltef5025b62009-03-28 16:55:11 +00001361 struct gsm_bts *bts;
1362 int bts_nr;
1363
1364 if (argc >= 1) {
1365 /* use the BTS number that the user has specified */
1366 bts_nr = atoi(argv[0]);
1367 if (bts_nr >= net->num_bts) {
1368 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1369 VTY_NEWLINE);
1370 return CMD_WARNING;
1371 }
Harald Weltee441d9c2009-06-21 16:17:15 +02001372 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001373 bts_paging_dump_vty(vty, bts);
1374
1375 return CMD_SUCCESS;
1376 }
1377 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001378 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001379 bts_paging_dump_vty(vty, bts);
1380 }
1381
1382 return CMD_SUCCESS;
1383}
1384
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01001385DEFUN(show_paging_group,
1386 show_paging_group_cmd,
1387 "show paging-group <0-255> IMSI",
1388 SHOW_STR "Display the paging group\n"
1389 "BTS Number\n" "IMSI\n")
1390{
1391 struct gsm_network *net = gsmnet_from_vty(vty);
1392 struct gsm_bts *bts;
1393 unsigned int page_group;
1394 int bts_nr = atoi(argv[0]);
1395
1396 if (bts_nr >= net->num_bts) {
1397 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1398 return CMD_WARNING;
1399 }
1400
1401 bts = gsm_bts_num(net, bts_nr);
1402 if (!bts) {
1403 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1404 return CMD_WARNING;
1405 }
1406
1407 page_group = gsm0502_calc_paging_group(&bts->si_common.chan_desc,
1408 str_to_imsi(argv[1]));
1409 vty_out(vty, "%%Paging group for IMSI %" PRIu64 " on BTS #%d is %u%s",
1410 str_to_imsi(argv[1]), bts->nr,
1411 page_group, VTY_NEWLINE);
1412 return CMD_SUCCESS;
1413}
1414
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001415DEFUN(cfg_net_neci,
1416 cfg_net_neci_cmd,
1417 "neci (0|1)",
Harald Welte28326062010-05-14 20:05:17 +02001418 "New Establish Cause Indication\n"
1419 "Don't set the NECI bit\n" "Set the NECI bit\n")
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001420{
Harald Weltedcccb182010-05-16 20:52:23 +02001421 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1422
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001423 gsmnet->neci = atoi(argv[0]);
Holger Hans Peter Freyther78891072010-09-06 09:36:02 +08001424 gsm_net_update_ctype(gsmnet);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001425 return CMD_SUCCESS;
1426}
1427
Harald Welte8f0ed552010-05-11 21:53:49 +02001428#define HANDOVER_STR "Handover Options\n"
1429
Harald Weltebc814502009-12-19 21:41:52 +01001430DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1431 "handover (0|1)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001432 HANDOVER_STR
1433 "Don't perform in-call handover\n"
1434 "Perform in-call handover\n")
Harald Weltebc814502009-12-19 21:41:52 +01001435{
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001436 int enable = atoi(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001437 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001438
1439 if (enable && ipacc_rtp_direct) {
Harald Weltefe03f0d2009-12-20 13:51:01 +01001440 vty_out(vty, "%% Cannot enable handover unless RTP Proxy mode "
1441 "is enabled by using the -P command line option%s",
1442 VTY_NEWLINE);
1443 return CMD_WARNING;
1444 }
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001445 gsmnet->handover.active = enable;
Harald Weltebc814502009-12-19 21:41:52 +01001446
1447 return CMD_SUCCESS;
1448}
1449
Harald Welte8f0ed552010-05-11 21:53:49 +02001450#define HO_WIN_STR HANDOVER_STR "Measurement Window\n"
1451#define HO_WIN_RXLEV_STR HO_WIN_STR "Received Level Averaging\n"
1452#define HO_WIN_RXQUAL_STR HO_WIN_STR "Received Quality Averaging\n"
1453#define HO_PBUDGET_STR HANDOVER_STR "Power Budget\n"
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001454#define HO_AVG_COUNT_STR "Amount to use for Averaging\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001455
Harald Welteb720bd32009-12-21 16:51:50 +01001456DEFUN(cfg_net_ho_win_rxlev_avg, cfg_net_ho_win_rxlev_avg_cmd,
1457 "handover window rxlev averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001458 HO_WIN_RXLEV_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001459 "How many RxLev measurements are used for averaging\n"
1460 HO_AVG_COUNT_STR)
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.win_rxlev_avg = atoi(argv[0]);
1464 return CMD_SUCCESS;
1465}
1466
1467DEFUN(cfg_net_ho_win_rxqual_avg, cfg_net_ho_win_rxqual_avg_cmd,
1468 "handover window rxqual averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001469 HO_WIN_RXQUAL_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001470 "How many RxQual measurements are used for averaging\n"
1471 HO_AVG_COUNT_STR)
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.win_rxqual_avg = atoi(argv[0]);
1475 return CMD_SUCCESS;
1476}
1477
1478DEFUN(cfg_net_ho_win_rxlev_neigh_avg, cfg_net_ho_win_rxlev_avg_neigh_cmd,
1479 "handover window rxlev neighbor averaging <1-10>",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001480 HO_WIN_RXLEV_STR "Neighbor\n"
1481 "How many RxQual measurements are used for averaging\n"
1482 HO_AVG_COUNT_STR)
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.win_rxlev_avg_neigh = atoi(argv[0]);
1486 return CMD_SUCCESS;
1487}
1488
1489DEFUN(cfg_net_ho_pwr_interval, cfg_net_ho_pwr_interval_cmd,
1490 "handover power budget interval <1-99>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001491 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001492 "How often to check if we have a better cell (SACCH frames)\n"
1493 "Interval\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001494{
Harald Weltedcccb182010-05-16 20:52:23 +02001495 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001496 gsmnet->handover.pwr_interval = atoi(argv[0]);
1497 return CMD_SUCCESS;
1498}
1499
1500DEFUN(cfg_net_ho_pwr_hysteresis, cfg_net_ho_pwr_hysteresis_cmd,
1501 "handover power budget hysteresis <0-999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001502 HO_PBUDGET_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001503 "How many dB does a neighbor to be stronger to become a HO candidate\n"
1504 "Hysteresis\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001505{
Harald Weltedcccb182010-05-16 20:52:23 +02001506 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001507 gsmnet->handover.pwr_hysteresis = atoi(argv[0]);
1508 return CMD_SUCCESS;
1509}
1510
1511DEFUN(cfg_net_ho_max_distance, cfg_net_ho_max_distance_cmd,
1512 "handover maximum distance <0-9999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001513 HANDOVER_STR
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001514 "How big is the maximum timing advance before HO is forced\n"
1515 "Distance\n" "Number\n")
Harald Welteb720bd32009-12-21 16:51:50 +01001516{
Harald Weltedcccb182010-05-16 20:52:23 +02001517 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001518 gsmnet->handover.max_distance = atoi(argv[0]);
1519 return CMD_SUCCESS;
1520}
Harald Weltebc814502009-12-19 21:41:52 +01001521
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001522DEFUN(cfg_net_pag_any_tch,
1523 cfg_net_pag_any_tch_cmd,
1524 "paging any use tch (0|1)",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001525 "Assign a TCH when receiving a Paging Any request\n"
1526 "Any Channel\n" "Use\n" "TCH\n"
1527 "Do not use TCH for Paging Request Any\n"
1528 "Do use TCH for Paging Request Any\n")
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001529{
Holger Hans Peter Freytherb0e88b82010-09-06 10:09:19 +08001530 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08001531 gsmnet->pag_any_tch = atoi(argv[0]);
1532 gsm_net_update_ctype(gsmnet);
1533 return CMD_SUCCESS;
1534}
1535
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001536#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001537 DEFUN(cfg_net_T##number, \
1538 cfg_net_T##number##_cmd, \
1539 "timer t" #number " <0-65535>", \
Harald Welte8f0ed552010-05-11 21:53:49 +02001540 "Configure GSM Timers\n" \
Holger Hans Peter Freyther5dd295f2014-04-11 19:30:27 +02001541 doc "Timer Value in seconds\n") \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001542{ \
Harald Weltedcccb182010-05-16 20:52:23 +02001543 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001544 int value = atoi(argv[0]); \
1545 \
1546 if (value < 0 || value > 65535) { \
1547 vty_out(vty, "Timer value %s out of range.%s", \
1548 argv[0], VTY_NEWLINE); \
1549 return CMD_WARNING; \
1550 } \
1551 \
1552 gsmnet->T##number = value; \
1553 return CMD_SUCCESS; \
1554}
1555
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001556DECLARE_TIMER(3101, "Set the timeout value for IMMEDIATE ASSIGNMENT.\n")
1557DECLARE_TIMER(3103, "Set the timeout value for HANDOVER.\n")
Harald Welte67161f22012-06-03 13:01:47 +02001558DECLARE_TIMER(3105, "Set the timer for repetition of PHYSICAL INFORMATION.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001559DECLARE_TIMER(3107, "Currently not used.\n")
Holger Hans Peter Freytherb3489392011-12-28 16:21:05 +01001560DECLARE_TIMER(3109, "Set the RSL SACCH deactivation timeout.\n")
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001561DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.\n")
1562DECLARE_TIMER(3113, "Set the time to try paging a subscriber.\n")
1563DECLARE_TIMER(3115, "Currently not used.\n")
1564DECLARE_TIMER(3117, "Currently not used.\n")
1565DECLARE_TIMER(3119, "Currently not used.\n")
1566DECLARE_TIMER(3122, "Waiting time (seconds) after IMM ASS REJECT\n")
1567DECLARE_TIMER(3141, "Currently not used.\n")
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001568
Maxc08ee712016-05-11 12:45:13 +02001569DEFUN_DEPRECATED(cfg_net_dtx,
1570 cfg_net_dtx_cmd,
1571 "dtx-used (0|1)",
1572 ".HIDDEN\n""Obsolete\n""Obsolete\n")
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001573{
Maxc08ee712016-05-11 12:45:13 +02001574 vty_out(vty, "%% 'dtx-used' is now deprecated: use dtx * "
1575 "configuration options of BTS instead%s", VTY_NEWLINE);
1576 return CMD_SUCCESS;
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08001577}
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001578
Harald Welte5258fc42009-03-28 19:07:53 +00001579/* per-BTS configuration */
1580DEFUN(cfg_bts,
1581 cfg_bts_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02001582 "bts <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001583 "Select a BTS to configure\n"
1584 "BTS Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001585{
Harald Weltedcccb182010-05-16 20:52:23 +02001586 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte5258fc42009-03-28 19:07:53 +00001587 int bts_nr = atoi(argv[0]);
1588 struct gsm_bts *bts;
1589
Harald Weltee441d9c2009-06-21 16:17:15 +02001590 if (bts_nr > gsmnet->num_bts) {
1591 vty_out(vty, "%% The next unused BTS number is %u%s",
1592 gsmnet->num_bts, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00001593 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02001594 } else if (bts_nr == gsmnet->num_bts) {
1595 /* allocate a new one */
Harald Welte3300c012011-06-05 13:31:33 +02001596 bts = gsm_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,
Harald Weltea2bbc5e2015-11-20 10:43:31 +01001597 HARDCODED_BSIC);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02001598 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02001599 bts = gsm_bts_num(gsmnet, bts_nr);
1600
Daniel Willmannf15c2762010-01-11 13:43:07 +01001601 if (!bts) {
1602 vty_out(vty, "%% Unable to allocate BTS %u%s",
1603 gsmnet->num_bts, VTY_NEWLINE);
Harald Weltee441d9c2009-06-21 16:17:15 +02001604 return CMD_WARNING;
Daniel Willmannf15c2762010-01-11 13:43:07 +01001605 }
Harald Welte5258fc42009-03-28 19:07:53 +00001606
1607 vty->index = bts;
Harald Welte197dea92010-05-14 17:59:53 +02001608 vty->index_sub = &bts->description;
Harald Welte5258fc42009-03-28 19:07:53 +00001609 vty->node = BTS_NODE;
1610
1611 return CMD_SUCCESS;
1612}
1613
1614DEFUN(cfg_bts_type,
1615 cfg_bts_type_cmd,
Harald Weltee555c2b2012-08-17 13:02:12 +02001616 "type TYPE", /* dynamically created */
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001617 "Set the BTS type\n" "Type\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001618{
1619 struct gsm_bts *bts = vty->index;
Harald Welte39315c42010-01-10 18:01:52 +01001620 int rc;
Harald Welte5258fc42009-03-28 19:07:53 +00001621
Max7507aef2017-04-10 13:59:14 +02001622 rc = gsm_set_bts_type(bts, str2btstype(argv[0]));
Harald Welte39315c42010-01-10 18:01:52 +01001623 if (rc < 0)
1624 return CMD_WARNING;
Harald Welte8175e952009-10-20 00:22:00 +02001625
Harald Welte5258fc42009-03-28 19:07:53 +00001626 return CMD_SUCCESS;
1627}
1628
Harald Weltefcd24452009-06-20 18:15:19 +02001629DEFUN(cfg_bts_band,
1630 cfg_bts_band_cmd,
1631 "band BAND",
Holger Hans Peter Freyther08542562011-10-03 23:42:06 +02001632 "Set the frequency band of this BTS\n" "Frequency band\n")
Harald Weltefcd24452009-06-20 18:15:19 +02001633{
1634 struct gsm_bts *bts = vty->index;
Harald Welte42581822009-08-08 16:12:58 +02001635 int band = gsm_band_parse(argv[0]);
Harald Weltefcd24452009-06-20 18:15:19 +02001636
1637 if (band < 0) {
1638 vty_out(vty, "%% BAND %d is not a valid GSM band%s",
1639 band, VTY_NEWLINE);
1640 return CMD_WARNING;
1641 }
1642
1643 bts->band = band;
1644
1645 return CMD_SUCCESS;
1646}
1647
Maxc08ee712016-05-11 12:45:13 +02001648DEFUN(cfg_bts_dtxu, cfg_bts_dtxu_cmd, "dtx uplink [force]",
1649 "Configure discontinuous transmission\n"
1650 "Enable Uplink DTX for this BTS\n"
1651 "MS 'shall' use DTXu instead of 'may' use (might not be supported by "
1652 "older phones).\n")
1653{
1654 struct gsm_bts *bts = vty->index;
1655
1656 bts->dtxu = (argc > 0) ? GSM48_DTX_SHALL_BE_USED : GSM48_DTX_MAY_BE_USED;
Max60795282016-06-06 11:30:57 +02001657 if (!is_ipaccess_bts(bts))
1658 vty_out(vty, "%% DTX enabled on non-IP BTS: this configuration "
1659 "neither supported nor tested!%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +02001660 return CMD_SUCCESS;
1661}
1662
1663DEFUN(cfg_bts_no_dtxu, cfg_bts_no_dtxu_cmd, "no dtx uplink",
1664 NO_STR
1665 "Configure discontinuous transmission\n"
1666 "Disable Uplink DTX for this BTS\n")
1667{
1668 struct gsm_bts *bts = vty->index;
1669
1670 bts->dtxu = GSM48_DTX_SHALL_NOT_BE_USED;
1671
1672 return CMD_SUCCESS;
1673}
1674
1675DEFUN(cfg_bts_dtxd, cfg_bts_dtxd_cmd, "dtx downlink",
1676 "Configure discontinuous transmission\n"
1677 "Enable Downlink DTX for this BTS\n")
1678{
1679 struct gsm_bts *bts = vty->index;
1680
1681 bts->dtxd = true;
Max60795282016-06-06 11:30:57 +02001682 if (!is_ipaccess_bts(bts))
1683 vty_out(vty, "%% DTX enabled on non-IP BTS: this configuration "
1684 "neither supported nor tested!%s", VTY_NEWLINE);
Maxc08ee712016-05-11 12:45:13 +02001685 return CMD_SUCCESS;
1686}
1687
1688DEFUN(cfg_bts_no_dtxd, cfg_bts_no_dtxd_cmd, "no dtx downlink",
1689 NO_STR
1690 "Configure discontinuous transmission\n"
1691 "Disable Downlink DTX for this BTS\n")
1692{
1693 struct gsm_bts *bts = vty->index;
1694
1695 bts->dtxd = false;
1696
1697 return CMD_SUCCESS;
1698}
1699
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001700DEFUN(cfg_bts_ci,
1701 cfg_bts_ci_cmd,
1702 "cell_identity <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001703 "Set the Cell identity of this BTS\n" "Cell Identity\n")
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001704{
1705 struct gsm_bts *bts = vty->index;
1706 int ci = atoi(argv[0]);
1707
1708 if (ci < 0 || ci > 0xffff) {
1709 vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s",
1710 ci, VTY_NEWLINE);
1711 return CMD_WARNING;
1712 }
1713 bts->cell_identity = ci;
1714
1715 return CMD_SUCCESS;
1716}
1717
Harald Welte5258fc42009-03-28 19:07:53 +00001718DEFUN(cfg_bts_lac,
1719 cfg_bts_lac_cmd,
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001720 "location_area_code <0-65535>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001721 "Set the Location Area Code (LAC) of this BTS\n" "LAC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001722{
1723 struct gsm_bts *bts = vty->index;
1724 int lac = atoi(argv[0]);
1725
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001726 if (lac < 0 || lac > 0xffff) {
1727 vty_out(vty, "%% LAC %d is not in the valid range (0-65535)%s",
Harald Welte5258fc42009-03-28 19:07:53 +00001728 lac, VTY_NEWLINE);
1729 return CMD_WARNING;
1730 }
Holger Hans Peter Freythere48b9562009-10-01 04:07:15 +02001731
1732 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
1733 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
1734 lac, VTY_NEWLINE);
1735 return CMD_WARNING;
1736 }
1737
Harald Welte5258fc42009-03-28 19:07:53 +00001738 bts->location_area_code = lac;
1739
1740 return CMD_SUCCESS;
1741}
1742
Harald Weltea43f7892009-12-01 18:04:30 +05301743
Harald Weltea2bbc5e2015-11-20 10:43:31 +01001744/* compatibility wrapper for old config files */
1745DEFUN_HIDDEN(cfg_bts_tsc,
Harald Welte5258fc42009-03-28 19:07:53 +00001746 cfg_bts_tsc_cmd,
Harald Weltec513ded2012-05-31 10:57:08 +02001747 "training_sequence_code <0-7>",
Holger Hans Peter Freyther64c17fa2012-07-21 00:27:10 +02001748 "Set the Training Sequence Code (TSC) of this BTS\n" "TSC\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001749{
Harald Welte5258fc42009-03-28 19:07:53 +00001750 return CMD_SUCCESS;
1751}
1752
Harald Welte78f2f502009-05-23 16:56:52 +00001753DEFUN(cfg_bts_bsic,
1754 cfg_bts_bsic_cmd,
1755 "base_station_id_code <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001756 "Set the Base Station Identity Code (BSIC) of this BTS\n"
1757 "BSIC of this BTS\n")
Harald Welte78f2f502009-05-23 16:56:52 +00001758{
1759 struct gsm_bts *bts = vty->index;
1760 int bsic = atoi(argv[0]);
1761
1762 if (bsic < 0 || bsic > 0x3f) {
Harald Welte42581822009-08-08 16:12:58 +02001763 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte78f2f502009-05-23 16:56:52 +00001764 bsic, VTY_NEWLINE);
1765 return CMD_WARNING;
1766 }
1767 bts->bsic = bsic;
1768
1769 return CMD_SUCCESS;
1770}
1771
Harald Welte4cc34222009-05-01 15:12:31 +00001772DEFUN(cfg_bts_unit_id,
1773 cfg_bts_unit_id_cmd,
Harald Welte07dc73d2009-08-07 13:27:09 +02001774 "ip.access unit_id <0-65534> <0-255>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02001775 "Abis/IP specific options\n"
1776 "Set the IPA BTS Unit ID\n"
1777 "Unit ID (Site)\n"
1778 "Unit ID (BTS)\n")
Harald Welte4cc34222009-05-01 15:12:31 +00001779{
1780 struct gsm_bts *bts = vty->index;
1781 int site_id = atoi(argv[0]);
1782 int bts_id = atoi(argv[1]);
1783
Harald Welte07dc73d2009-08-07 13:27:09 +02001784 if (!is_ipaccess_bts(bts)) {
1785 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1786 return CMD_WARNING;
1787 }
1788
Harald Welte4cc34222009-05-01 15:12:31 +00001789 bts->ip_access.site_id = site_id;
1790 bts->ip_access.bts_id = bts_id;
1791
1792 return CMD_SUCCESS;
1793}
1794
Harald Welte8b291802013-03-12 13:57:05 +01001795DEFUN(cfg_bts_rsl_ip,
1796 cfg_bts_rsl_ip_cmd,
1797 "ip.access rsl-ip A.B.C.D",
1798 "Abis/IP specific options\n"
1799 "Set the IPA RSL IP Address of the BSC\n"
1800 "Destination IP address for RSL connection\n")
1801{
1802 struct gsm_bts *bts = vty->index;
1803 struct in_addr ia;
1804
1805 if (!is_ipaccess_bts(bts)) {
1806 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1807 return CMD_WARNING;
1808 }
1809
1810 inet_aton(argv[0], &ia);
1811 bts->ip_access.rsl_ip = ntohl(ia.s_addr);
1812
1813 return CMD_SUCCESS;
1814}
1815
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001816#define NOKIA_STR "Nokia *Site related commands\n"
Harald Welte8b291802013-03-12 13:57:05 +01001817
Sylvain Munautc9519462011-10-17 14:04:55 +02001818DEFUN(cfg_bts_nokia_site_skip_reset,
1819 cfg_bts_nokia_site_skip_reset_cmd,
1820 "nokia_site skip-reset (0|1)",
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001821 NOKIA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001822 "Skip the reset step during bootstrap process of this BTS\n"
1823 "Do NOT skip the reset\n" "Skip the reset\n")
Sylvain Munautc9519462011-10-17 14:04:55 +02001824{
1825 struct gsm_bts *bts = vty->index;
1826
1827 if (bts->type != GSM_BTS_TYPE_NOKIA_SITE) {
1828 vty_out(vty, "%% BTS is not of Nokia *Site type%s", VTY_NEWLINE);
1829 return CMD_WARNING;
1830 }
1831
1832 bts->nokia.skip_reset = atoi(argv[0]);
1833
1834 return CMD_SUCCESS;
1835}
1836
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01001837DEFUN(cfg_bts_nokia_site_no_loc_rel_cnf,
1838 cfg_bts_nokia_site_no_loc_rel_cnf_cmd,
1839 "nokia_site no-local-rel-conf (0|1)",
1840 NOKIA_STR
1841 "Do not wait for RELease CONFirm message when releasing channel locally\n"
1842 "Wait for RELease CONFirm\n" "Do not wait for RELease CONFirm\n")
1843{
1844 struct gsm_bts *bts = vty->index;
1845
1846 if (!is_nokia_bts(bts)) {
1847 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1848 VTY_NEWLINE);
1849 return CMD_WARNING;
1850 }
1851
1852 bts->nokia.no_loc_rel_cnf = atoi(argv[0]);
1853
1854 return CMD_SUCCESS;
1855}
1856
Sipos Csaba56e17662015-02-07 13:27:36 +01001857DEFUN(cfg_bts_nokia_site_bts_reset_timer_cnf,
1858 cfg_bts_nokia_site_bts_reset_timer_cnf_cmd,
1859 "nokia_site bts-reset-timer <15-100>",
1860 NOKIA_STR
1861 "The amount of time (in sec.) between BTS_RESET is sent,\n"
1862 "and the BTS is being bootstrapped.\n")
1863{
1864 struct gsm_bts *bts = vty->index;
1865
1866 if (!is_nokia_bts(bts)) {
1867 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1868 VTY_NEWLINE);
1869 return CMD_WARNING;
1870 }
1871
1872 bts->nokia.bts_reset_timer_cnf = atoi(argv[0]);
1873
1874 return CMD_SUCCESS;
1875}
Harald Welte8f0ed552010-05-11 21:53:49 +02001876#define OML_STR "Organization & Maintenance Link\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001877#define IPA_STR "A-bis/IP Specific Options\n"
Harald Welte8f0ed552010-05-11 21:53:49 +02001878
Harald Welte8175e952009-10-20 00:22:00 +02001879DEFUN(cfg_bts_stream_id,
1880 cfg_bts_stream_id_cmd,
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001881 "oml ip.access stream_id <0-255> line E1_LINE",
Harald Welte8f0ed552010-05-11 21:53:49 +02001882 OML_STR IPA_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001883 "Set the ip.access Stream ID of the OML link of this BTS\n"
1884 "Stream Identifier\n" "Virtual E1 Line Number\n" "Virtual E1 Line Number\n")
Harald Welte8175e952009-10-20 00:22:00 +02001885{
1886 struct gsm_bts *bts = vty->index;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001887 int stream_id = atoi(argv[0]), linenr = atoi(argv[1]);
Harald Welte8175e952009-10-20 00:22:00 +02001888
1889 if (!is_ipaccess_bts(bts)) {
1890 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1891 return CMD_WARNING;
1892 }
1893
1894 bts->oml_tei = stream_id;
Pablo Neira Ayusoed5cacb2011-08-17 22:44:07 +02001895 /* This is used by e1inp_bind_ops callback for each BTS model. */
1896 bts->oml_e1_link.e1_nr = linenr;
1897
1898 return CMD_SUCCESS;
1899}
1900
Harald Welted13e0cd2012-08-17 09:52:03 +02001901#define OML_E1_STR OML_STR "OML E1/T1 Configuration\n"
Harald Welte8175e952009-10-20 00:22:00 +02001902
Harald Welte42581822009-08-08 16:12:58 +02001903DEFUN(cfg_bts_oml_e1,
1904 cfg_bts_oml_e1_cmd,
1905 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welted13e0cd2012-08-17 09:52:03 +02001906 OML_E1_STR
1907 "E1/T1 line number to be used for OML\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02001908 "E1/T1 line number to be used for OML\n"
1909 "E1/T1 timeslot to be used for OML\n"
1910 "E1/T1 timeslot to be used for OML\n"
1911 "E1/T1 sub-slot to be used for OML\n"
1912 "Use E1/T1 sub-slot 0\n"
1913 "Use E1/T1 sub-slot 1\n"
1914 "Use E1/T1 sub-slot 2\n"
1915 "Use E1/T1 sub-slot 3\n"
1916 "Use full E1 slot 3\n"
1917 )
Harald Welte42581822009-08-08 16:12:58 +02001918{
1919 struct gsm_bts *bts = vty->index;
1920
1921 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
1922
1923 return CMD_SUCCESS;
1924}
1925
1926
1927DEFUN(cfg_bts_oml_e1_tei,
1928 cfg_bts_oml_e1_tei_cmd,
1929 "oml e1 tei <0-63>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001930 OML_E1_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001931 "Set the TEI to be used for OML\n"
1932 "TEI Number\n")
Harald Welte42581822009-08-08 16:12:58 +02001933{
1934 struct gsm_bts *bts = vty->index;
1935
1936 bts->oml_tei = atoi(argv[0]);
1937
1938 return CMD_SUCCESS;
1939}
1940
Harald Welte7a8fa412009-08-10 13:48:16 +02001941DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1942 "channel allocator (ascending|descending)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001943 "Channnel Allocator\n" "Channel Allocator\n"
1944 "Allocate Timeslots and Transceivers in ascending order\n"
1945 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte7a8fa412009-08-10 13:48:16 +02001946{
1947 struct gsm_bts *bts = vty->index;
1948
1949 if (!strcmp(argv[0], "ascending"))
1950 bts->chan_alloc_reverse = 0;
1951 else
1952 bts->chan_alloc_reverse = 1;
1953
1954 return CMD_SUCCESS;
1955}
1956
Harald Welte8f0ed552010-05-11 21:53:49 +02001957#define RACH_STR "Random Access Control Channel\n"
1958
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001959DEFUN(cfg_bts_rach_tx_integer,
1960 cfg_bts_rach_tx_integer_cmd,
1961 "rach tx integer <0-15>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001962 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001963 "Set the raw tx integer value in RACH Control parameters IE\n"
1964 "Set the raw tx integer value in RACH Control parameters IE\n"
1965 "Raw tx integer value in RACH Control parameters IE\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001966{
1967 struct gsm_bts *bts = vty->index;
1968 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
1969 return CMD_SUCCESS;
1970}
1971
1972DEFUN(cfg_bts_rach_max_trans,
1973 cfg_bts_rach_max_trans_cmd,
1974 "rach max transmission (1|2|4|7)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001975 RACH_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02001976 "Set the maximum number of RACH burst transmissions\n"
1977 "Set the maximum number of RACH burst transmissions\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02001978 "Maximum number of 1 RACH burst transmissions\n"
1979 "Maximum number of 2 RACH burst transmissions\n"
1980 "Maximum number of 4 RACH burst transmissions\n"
1981 "Maximum number of 7 RACH burst transmissions\n")
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001982{
1983 struct gsm_bts *bts = vty->index;
1984 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
1985 return CMD_SUCCESS;
1986}
1987
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02001988#define CD_STR "Channel Description\n"
1989
1990DEFUN(cfg_bts_chan_desc_att,
1991 cfg_bts_chan_desc_att_cmd,
1992 "channel-descrption attach (0|1)",
1993 CD_STR
1994 "Set if attachment is required\n"
1995 "Attachment is NOT required\n"
1996 "Attachment is required (standard)\n")
1997{
1998 struct gsm_bts *bts = vty->index;
1999 bts->si_common.chan_desc.att = atoi(argv[0]);
2000 return CMD_SUCCESS;
2001}
2002
2003DEFUN(cfg_bts_chan_desc_bs_pa_mfrms,
2004 cfg_bts_chan_desc_bs_pa_mfrms_cmd,
2005 "channel-descrption bs-pa-mfrms <2-9>",
2006 CD_STR
2007 "Set number of multiframe periods for paging groups\n"
2008 "Number of multiframe periods for paging groups\n")
2009{
2010 struct gsm_bts *bts = vty->index;
2011 int bs_pa_mfrms = atoi(argv[0]);
2012
2013 bts->si_common.chan_desc.bs_pa_mfrms = bs_pa_mfrms - 2;
2014 return CMD_SUCCESS;
2015}
2016
2017DEFUN(cfg_bts_chan_desc_bs_ag_blks_res,
2018 cfg_bts_chan_desc_bs_ag_blks_res_cmd,
2019 "channel-descrption bs-ag-blks-res <0-7>",
2020 CD_STR
2021 "Set number of blocks reserved for access grant\n"
2022 "Number of blocks reserved for access grant\n")
2023{
2024 struct gsm_bts *bts = vty->index;
2025 int bs_ag_blks_res = atoi(argv[0]);
2026
2027 bts->si_common.chan_desc.bs_ag_blks_res = bs_ag_blks_res;
2028 return CMD_SUCCESS;
2029}
2030
Harald Welte8f0ed552010-05-11 21:53:49 +02002031#define NM_STR "Network Management\n"
2032
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002033DEFUN(cfg_bts_rach_nm_b_thresh,
2034 cfg_bts_rach_nm_b_thresh_cmd,
2035 "rach nm busy threshold <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002036 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002037 "Set the NM Busy Threshold\n"
2038 "Set the NM Busy Threshold\n"
2039 "NM Busy Threshold in dB")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002040{
2041 struct gsm_bts *bts = vty->index;
2042 bts->rach_b_thresh = atoi(argv[0]);
2043 return CMD_SUCCESS;
2044}
2045
2046DEFUN(cfg_bts_rach_nm_ldavg,
2047 cfg_bts_rach_nm_ldavg_cmd,
2048 "rach nm load average <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002049 RACH_STR NM_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02002050 "Set the NM Loadaverage Slots value\n"
2051 "Set the NM Loadaverage Slots value\n"
2052 "NM Loadaverage Slots value\n")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002053{
2054 struct gsm_bts *bts = vty->index;
2055 bts->rach_ldavg_slots = atoi(argv[0]);
2056 return CMD_SUCCESS;
2057}
2058
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002059DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
2060 "cell barred (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002061 "Should this cell be barred from access?\n"
2062 "Should this cell be barred from access?\n"
2063 "Cell should NOT be barred\n"
2064 "Cell should be barred\n")
2065
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002066{
2067 struct gsm_bts *bts = vty->index;
2068
Harald Welte71355012009-12-21 23:08:18 +01002069 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002070
2071 return CMD_SUCCESS;
2072}
2073
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002074DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
2075 "rach emergency call allowed (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002076 RACH_STR
2077 "Should this cell allow emergency calls?\n"
2078 "Should this cell allow emergency calls?\n"
2079 "Should this cell allow emergency calls?\n"
2080 "Do NOT allow emergency calls\n"
2081 "Allow emergency calls\n")
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002082{
2083 struct gsm_bts *bts = vty->index;
2084
2085 if (atoi(argv[0]) == 0)
2086 bts->si_common.rach_control.t2 |= 0x4;
2087 else
2088 bts->si_common.rach_control.t2 &= ~0x4;
2089
2090 return CMD_SUCCESS;
2091}
2092
Ivan Kluchnikov67920592013-09-16 13:13:04 +04002093DEFUN(cfg_bts_rach_ac_class, cfg_bts_rach_ac_class_cmd,
2094 "rach access-control-class (0|1|2|3|4|5|6|7|8|9|11|12|13|14|15) (barred|allowed)",
2095 RACH_STR
2096 "Set access control class\n"
2097 "Access control class 0\n"
2098 "Access control class 1\n"
2099 "Access control class 2\n"
2100 "Access control class 3\n"
2101 "Access control class 4\n"
2102 "Access control class 5\n"
2103 "Access control class 6\n"
2104 "Access control class 7\n"
2105 "Access control class 8\n"
2106 "Access control class 9\n"
2107 "Access control class 11 for PLMN use\n"
2108 "Access control class 12 for security services\n"
2109 "Access control class 13 for public utilities (e.g. water/gas suppliers)\n"
2110 "Access control class 14 for emergency services\n"
2111 "Access control class 15 for PLMN staff\n"
2112 "barred to use access control class\n"
2113 "allowed to use access control class\n")
2114{
2115 struct gsm_bts *bts = vty->index;
2116
2117 uint8_t control_class;
2118 uint8_t allowed = 0;
2119
2120 if (strcmp(argv[1], "allowed") == 0)
2121 allowed = 1;
2122
2123 control_class = atoi(argv[0]);
2124 if (control_class < 8)
2125 if (allowed)
2126 bts->si_common.rach_control.t3 &= ~(0x1 << control_class);
2127 else
2128 bts->si_common.rach_control.t3 |= (0x1 << control_class);
2129 else
2130 if (allowed)
2131 bts->si_common.rach_control.t2 &= ~(0x1 << (control_class - 8));
2132 else
2133 bts->si_common.rach_control.t2 |= (0x1 << (control_class - 8));
2134
2135 return CMD_SUCCESS;
2136}
2137
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002138DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
2139 "ms max power <0-40>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002140 "MS Options\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02002141 "Maximum transmit power of the MS\n"
2142 "Maximum transmit power of the MS\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002143 "Maximum transmit power of the MS in dBm")
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002144{
2145 struct gsm_bts *bts = vty->index;
2146
2147 bts->ms_max_power = atoi(argv[0]);
2148
2149 return CMD_SUCCESS;
2150}
2151
Harald Weltecfaabbb2012-08-16 23:23:50 +02002152#define CELL_STR "Cell Parameters\n"
2153
Harald Welte73225282009-12-12 18:17:25 +01002154DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
2155 "cell reselection hysteresis <0-14>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002156 CELL_STR "Cell re-selection parameters\n"
2157 "Cell Re-Selection Hysteresis in dB\n"
Harald Welte73225282009-12-12 18:17:25 +01002158 "Cell Re-Selection Hysteresis in dB")
2159{
2160 struct gsm_bts *bts = vty->index;
2161
2162 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
2163
2164 return CMD_SUCCESS;
2165}
2166
2167DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
2168 "rxlev access min <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002169 "Minimum RxLev needed for cell access\n"
2170 "Minimum RxLev needed for cell access\n"
2171 "Minimum RxLev needed for cell access\n"
Harald Welte73225282009-12-12 18:17:25 +01002172 "Minimum RxLev needed for cell access (better than -110dBm)")
2173{
2174 struct gsm_bts *bts = vty->index;
2175
2176 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
2177
2178 return CMD_SUCCESS;
2179}
2180
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002181DEFUN(cfg_bts_cell_bar_qualify, cfg_bts_cell_bar_qualify_cmd,
2182 "cell bar qualify (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002183 CELL_STR "Cell Bar Qualify\n" "Cell Bar Qualify\n"
2184 "Set CBQ to 0\n" "Set CBQ to 1\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002185{
2186 struct gsm_bts *bts = vty->index;
2187
2188 bts->si_common.cell_ro_sel_par.present = 1;
2189 bts->si_common.cell_ro_sel_par.cbq = atoi(argv[0]);
2190
2191 return CMD_SUCCESS;
2192}
2193
2194DEFUN(cfg_bts_cell_resel_ofs, cfg_bts_cell_resel_ofs_cmd,
2195 "cell reselection offset <0-126>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002196 CELL_STR "Cell Re-Selection Parameters\n"
2197 "Cell Re-Selection Offset (CRO) in dB\n"
2198 "Cell Re-Selection Offset (CRO) in dB\n"
2199 )
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002200{
2201 struct gsm_bts *bts = vty->index;
2202
2203 bts->si_common.cell_ro_sel_par.present = 1;
2204 bts->si_common.cell_ro_sel_par.cell_resel_off = atoi(argv[0])/2;
2205
2206 return CMD_SUCCESS;
2207}
2208
2209DEFUN(cfg_bts_temp_ofs, cfg_bts_temp_ofs_cmd,
2210 "temporary offset <0-60>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002211 "Cell selection temporary negative offset\n"
2212 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002213 "Cell selection temporary negative offset in dB")
2214{
2215 struct gsm_bts *bts = vty->index;
2216
2217 bts->si_common.cell_ro_sel_par.present = 1;
2218 bts->si_common.cell_ro_sel_par.temp_offs = atoi(argv[0])/10;
2219
2220 return CMD_SUCCESS;
2221}
2222
2223DEFUN(cfg_bts_temp_ofs_inf, cfg_bts_temp_ofs_inf_cmd,
2224 "temporary offset infinite",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002225 "Cell selection temporary negative offset\n"
2226 "Cell selection temporary negative offset\n"
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002227 "Sets cell selection temporary negative offset to infinity")
2228{
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.temp_offs = 7;
2233
2234 return CMD_SUCCESS;
2235}
2236
2237DEFUN(cfg_bts_penalty_time, cfg_bts_penalty_time_cmd,
2238 "penalty time <20-620>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002239 "Cell selection penalty time\n"
2240 "Cell selection penalty time\n"
2241 "Cell selection penalty time in seconds (by 20s increments)\n")
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002242{
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.penalty_time = (atoi(argv[0])-20)/20;
2247
2248 return CMD_SUCCESS;
2249}
2250
2251DEFUN(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd,
2252 "penalty time reserved",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002253 "Cell selection penalty time\n"
2254 "Cell selection penalty time\n"
2255 "Set cell selection penalty time to reserved value 31, "
Sylvain Munaute0b06b02010-11-28 18:17:28 +01002256 "(indicate that CELL_RESELECT_OFFSET is subtracted from C2 "
2257 "and TEMPORARY_OFFSET is ignored)")
2258{
2259 struct gsm_bts *bts = vty->index;
2260
2261 bts->si_common.cell_ro_sel_par.present = 1;
2262 bts->si_common.cell_ro_sel_par.penalty_time = 31;
2263
2264 return CMD_SUCCESS;
2265}
2266
Harald Welte (local)efc92312009-08-14 23:09:25 +02002267DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
Daniel Willmann4d62d632012-12-27 00:02:01 +01002268 "periodic location update <6-1530>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002269 "Periodic Location Updating Interval\n"
2270 "Periodic Location Updating Interval\n"
2271 "Periodic Location Updating Interval\n"
2272 "Periodic Location Updating Interval in Minutes\n")
Harald Welte (local)efc92312009-08-14 23:09:25 +02002273{
2274 struct gsm_bts *bts = vty->index;
2275
Dieter Spaard6613e02010-10-05 21:10:55 +02002276 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
Harald Welte (local)efc92312009-08-14 23:09:25 +02002277
2278 return CMD_SUCCESS;
2279}
2280
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002281DEFUN(cfg_bts_no_per_loc_upd, cfg_bts_no_per_loc_upd_cmd,
2282 "no periodic location update",
2283 NO_STR
2284 "Periodic Location Updating Interval\n"
2285 "Periodic Location Updating Interval\n"
2286 "Periodic Location Updating Interval\n")
2287{
2288 struct gsm_bts *bts = vty->index;
2289
2290 bts->si_common.chan_desc.t3212 = 0;
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01002291
2292 return CMD_SUCCESS;
2293}
2294
2295DEFUN(cfg_bts_radio_link_timeout, cfg_bts_radio_link_timeout_cmd,
2296 "radio-link-timeout <4-64>",
2297 "Radio link timeout criterion (BTS side)\n"
2298 "Radio link timeout value (lost SACCH block)\n")
2299{
2300 struct gsm_bts *bts = vty->index;
2301
2302 set_radio_link_timeout(&bts->si_common.cell_options, atoi(argv[0]));
2303
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02002304 return CMD_SUCCESS;
2305}
2306
Harald Welte8f0ed552010-05-11 21:53:49 +02002307#define GPRS_TEXT "GPRS Packet Network\n"
2308
Harald Welteaf387632010-03-14 23:30:30 +08002309DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welte57ba7e32010-04-18 14:00:26 +02002310 "gprs cell bvci <2-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002311 GPRS_TEXT
2312 "GPRS Cell Settings\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02002313 "GPRS BSSGP VC Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002314 "GPRS BSSGP VC Identifier")
2315{
2316 struct gsm_bts *bts = vty->index;
2317
Harald Welte4511d892010-04-18 15:51:20 +02002318 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002319 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2320 return CMD_WARNING;
2321 }
2322
Harald Welte97a282b2010-03-14 15:37:43 +08002323 bts->gprs.cell.bvci = atoi(argv[0]);
2324
2325 return CMD_SUCCESS;
2326}
2327
Harald Weltea5731cf2010-03-22 11:48:36 +08002328DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
2329 "gprs nsei <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002330 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002331 "GPRS NS Entity Identifier\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002332 "GPRS NS Entity Identifier")
2333{
2334 struct gsm_bts *bts = vty->index;
2335
Harald Welte4511d892010-04-18 15:51:20 +02002336 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltea5731cf2010-03-22 11:48:36 +08002337 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2338 return CMD_WARNING;
2339 }
2340
2341 bts->gprs.nse.nsei = atoi(argv[0]);
2342
2343 return CMD_SUCCESS;
2344}
2345
Harald Welte8f0ed552010-05-11 21:53:49 +02002346#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
2347 "NSVC Logical Number\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08002348
Harald Welte97a282b2010-03-14 15:37:43 +08002349DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
2350 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002351 GPRS_TEXT NSVC_TEXT
2352 "NS Virtual Connection Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08002353 "GPRS NS VC Identifier")
2354{
2355 struct gsm_bts *bts = vty->index;
2356 int idx = atoi(argv[0]);
2357
Harald Welte4511d892010-04-18 15:51:20 +02002358 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002359 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2360 return CMD_WARNING;
2361 }
2362
Harald Welte97a282b2010-03-14 15:37:43 +08002363 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
2364
2365 return CMD_SUCCESS;
2366}
2367
Harald Welteaf387632010-03-14 23:30:30 +08002368DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
2369 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002370 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002371 "GPRS NS Local UDP Port\n"
2372 "GPRS NS Local UDP Port\n"
2373 "GPRS NS Local UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002374 "GPRS NS Local UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002375{
2376 struct gsm_bts *bts = vty->index;
2377 int idx = atoi(argv[0]);
2378
Harald Welte4511d892010-04-18 15:51:20 +02002379 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002380 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2381 return CMD_WARNING;
2382 }
2383
Harald Welteaf387632010-03-14 23:30:30 +08002384 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
2385
2386 return CMD_SUCCESS;
2387}
2388
2389DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
2390 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002391 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002392 "GPRS NS Remote UDP Port\n"
2393 "GPRS NS Remote UDP Port\n"
Harald Welte13fe2192012-08-17 09:57:25 +02002394 "GPRS NS Remote UDP Port\n"
2395 "GPRS NS Remote UDP Port Number\n")
Harald Welteaf387632010-03-14 23:30:30 +08002396{
2397 struct gsm_bts *bts = vty->index;
2398 int idx = atoi(argv[0]);
2399
Harald Welte4511d892010-04-18 15:51:20 +02002400 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002401 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2402 return CMD_WARNING;
2403 }
2404
Harald Welteaf387632010-03-14 23:30:30 +08002405 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
2406
2407 return CMD_SUCCESS;
2408}
2409
2410DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
2411 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte8f0ed552010-05-11 21:53:49 +02002412 GPRS_TEXT NSVC_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002413 "GPRS NS Remote IP Address\n"
2414 "GPRS NS Remote IP Address\n"
2415 "GPRS NS Remote IP Address\n")
Harald Welteaf387632010-03-14 23:30:30 +08002416{
2417 struct gsm_bts *bts = vty->index;
2418 int idx = atoi(argv[0]);
2419 struct in_addr ia;
2420
Harald Welte4511d892010-04-18 15:51:20 +02002421 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002422 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2423 return CMD_WARNING;
2424 }
2425
Harald Welteaf387632010-03-14 23:30:30 +08002426 inet_aton(argv[1], &ia);
2427 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
2428
2429 return CMD_SUCCESS;
2430}
2431
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002432DEFUN(cfg_bts_pag_free, cfg_bts_pag_free_cmd,
Harald Weltecfaabbb2012-08-16 23:23:50 +02002433 "paging free <-1-1024>",
2434 "Paging options\n"
2435 "Only page when having a certain amount of free slots\n"
2436 "amount of required free paging slots. -1 to disable\n")
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08002437{
2438 struct gsm_bts *bts = vty->index;
2439
2440 bts->paging.free_chans_need = atoi(argv[0]);
2441 return CMD_SUCCESS;
2442}
2443
Harald Welte615e9562010-05-11 23:50:21 +02002444DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
2445 "gprs ns timer " NS_TIMERS " <0-255>",
2446 GPRS_TEXT "Network Service\n"
2447 "Network Service Timer\n"
2448 NS_TIMERS_HELP "Timer Value\n")
2449{
2450 struct gsm_bts *bts = vty->index;
2451 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
2452 int val = atoi(argv[1]);
2453
2454 if (bts->gprs.mode == BTS_GPRS_NONE) {
2455 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2456 return CMD_WARNING;
2457 }
2458
2459 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
2460 return CMD_WARNING;
2461
2462 bts->gprs.nse.timer[idx] = val;
2463
2464 return CMD_SUCCESS;
2465}
2466
2467#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 +02002468#define BSSGP_TIMERS_HELP \
2469 "Tbvc-block timeout\n" \
2470 "Tbvc-block retries\n" \
2471 "Tbvc-unblock retries\n" \
2472 "Tbvcc-reset timeout\n" \
2473 "Tbvc-reset retries\n" \
2474 "Tbvc-suspend timeout\n" \
2475 "Tbvc-suspend retries\n" \
2476 "Tbvc-resume timeout\n" \
2477 "Tbvc-resume retries\n" \
2478 "Tbvc-capa-update timeout\n" \
2479 "Tbvc-capa-update retries\n"
Harald Welte615e9562010-05-11 23:50:21 +02002480
2481DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
2482 "gprs cell timer " BSSGP_TIMERS " <0-255>",
2483 GPRS_TEXT "Cell / BSSGP\n"
2484 "Cell/BSSGP Timer\n"
2485 BSSGP_TIMERS_HELP "Timer Value\n")
2486{
2487 struct gsm_bts *bts = vty->index;
2488 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
2489 int val = atoi(argv[1]);
2490
2491 if (bts->gprs.mode == BTS_GPRS_NONE) {
2492 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2493 return CMD_WARNING;
2494 }
2495
2496 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
2497 return CMD_WARNING;
2498
2499 bts->gprs.cell.timer[idx] = val;
2500
2501 return CMD_SUCCESS;
2502}
2503
Harald Welte97a282b2010-03-14 15:37:43 +08002504DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
2505 "gprs routing area <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002506 GPRS_TEXT
Harald Weltecfaabbb2012-08-16 23:23:50 +02002507 "GPRS Routing Area Code\n"
2508 "GPRS Routing Area Code\n"
2509 "GPRS Routing Area Code\n")
Harald Welte97a282b2010-03-14 15:37:43 +08002510{
2511 struct gsm_bts *bts = vty->index;
2512
Harald Welte4511d892010-04-18 15:51:20 +02002513 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08002514 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2515 return CMD_WARNING;
2516 }
2517
Harald Welte97a282b2010-03-14 15:37:43 +08002518 bts->gprs.rac = atoi(argv[0]);
2519
2520 return CMD_SUCCESS;
2521}
2522
Max292ec582016-07-28 11:55:37 +02002523DEFUN(cfg_bts_gprs_ctrl_ack, cfg_bts_gprs_ctrl_ack_cmd,
2524 "gprs control-ack-type-rach", GPRS_TEXT
2525 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2526 "four access bursts format instead of default RLC/MAC control block\n")
2527{
2528 struct gsm_bts *bts = vty->index;
2529
2530 if (bts->gprs.mode == BTS_GPRS_NONE) {
2531 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2532 return CMD_WARNING;
2533 }
2534
2535 bts->gprs.ctrl_ack_type_use_block = false;
2536
2537 return CMD_SUCCESS;
2538}
2539
2540DEFUN(cfg_no_bts_gprs_ctrl_ack, cfg_no_bts_gprs_ctrl_ack_cmd,
2541 "no gprs control-ack-type-rach", NO_STR GPRS_TEXT
2542 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2543 "four access bursts format instead of default RLC/MAC control block\n")
2544{
2545 struct gsm_bts *bts = vty->index;
2546
2547 if (bts->gprs.mode == BTS_GPRS_NONE) {
2548 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2549 return CMD_WARNING;
2550 }
2551
2552 bts->gprs.ctrl_ack_type_use_block = true;
2553
2554 return CMD_SUCCESS;
2555}
2556
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01002557DEFUN(cfg_bts_gprs_net_ctrl_ord, cfg_bts_gprs_net_ctrl_ord_cmd,
2558 "gprs network-control-order (nc0|nc1|nc2)",
2559 GPRS_TEXT
2560 "GPRS Network Control Order\n"
2561 "MS controlled cell re-selection, no measurement reporting\n"
2562 "MS controlled cell re-selection, MS sends measurement reports\n"
2563 "Network controlled cell re-selection, MS sends measurement reports\n")
2564{
2565 struct gsm_bts *bts = vty->index;
2566
2567 if (bts->gprs.mode == BTS_GPRS_NONE) {
2568 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2569 return CMD_WARNING;
2570 }
2571
2572 bts->gprs.net_ctrl_ord = atoi(argv[0] + 2);
2573
2574 return CMD_SUCCESS;
2575}
2576
Harald Welte4511d892010-04-18 15:51:20 +02002577DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
2578 "gprs mode (none|gprs|egprs)",
Harald Welte8f0ed552010-05-11 21:53:49 +02002579 GPRS_TEXT
2580 "GPRS Mode for this BTS\n"
2581 "GPRS Disabled on this BTS\n"
2582 "GPRS Enabled on this BTS\n"
2583 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welteaf387632010-03-14 23:30:30 +08002584{
2585 struct gsm_bts *bts = vty->index;
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002586 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0], NULL);
Harald Welteaf387632010-03-14 23:30:30 +08002587
Holger Hans Peter Freyther4e13a8f2015-01-31 22:16:00 +01002588 if (!bts_gprs_mode_is_compat(bts, mode)) {
Harald Weltef3d8e922010-06-14 22:44:42 +02002589 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2590 VTY_NEWLINE);
2591 return CMD_WARNING;
2592 }
2593
2594 bts->gprs.mode = mode;
Harald Welteaf387632010-03-14 23:30:30 +08002595
2596 return CMD_SUCCESS;
2597}
2598
bhargava350533c2016-07-21 11:14:34 +05302599DEFUN(cfg_bts_gprs_11bit_rach_support_for_egprs,
2600 cfg_bts_gprs_11bit_rach_support_for_egprs_cmd,
2601 "gprs 11bit_rach_support_for_egprs (0|1)",
2602 GPRS_TEXT "11 bit RACH options\n"
2603 "Disable 11 bit RACH for EGPRS\n"
2604 "Enable 11 bit RACH for EGPRS")
2605{
2606 struct gsm_bts *bts = vty->index;
2607
2608 bts->gprs.supports_egprs_11bit_rach = atoi(argv[0]);
2609
2610 if (bts->gprs.supports_egprs_11bit_rach > 1) {
2611 vty_out(vty, "Error in RACH type%s", VTY_NEWLINE);
2612 return CMD_WARNING;
2613 }
2614
2615 if ((bts->gprs.mode == BTS_GPRS_NONE) &&
2616 (bts->gprs.supports_egprs_11bit_rach == 1)) {
2617 vty_out(vty, "Error:gprs mode is none and 11bit rach is"
2618 " enabled%s", VTY_NEWLINE);
2619 return CMD_WARNING;
2620 }
2621
2622 return CMD_SUCCESS;
2623}
2624
Harald Welte9fbff4a2010-07-30 11:50:09 +02002625#define SI_TEXT "System Information Messages\n"
2626#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)"
2627#define SI_TYPE_HELP "System Information Type 1\n" \
2628 "System Information Type 2\n" \
2629 "System Information Type 3\n" \
2630 "System Information Type 4\n" \
2631 "System Information Type 5\n" \
2632 "System Information Type 6\n" \
2633 "System Information Type 7\n" \
2634 "System Information Type 8\n" \
2635 "System Information Type 9\n" \
2636 "System Information Type 10\n" \
2637 "System Information Type 13\n" \
2638 "System Information Type 16\n" \
2639 "System Information Type 17\n" \
2640 "System Information Type 18\n" \
2641 "System Information Type 19\n" \
2642 "System Information Type 20\n" \
2643 "System Information Type 2bis\n" \
2644 "System Information Type 2ter\n" \
2645 "System Information Type 2quater\n" \
2646 "System Information Type 5bis\n" \
2647 "System Information Type 5ter\n"
2648
2649DEFUN(cfg_bts_si_mode, cfg_bts_si_mode_cmd,
2650 "system-information " SI_TYPE_TEXT " mode (static|computed)",
2651 SI_TEXT SI_TYPE_HELP
2652 "System Information Mode\n"
2653 "Static user-specified\n"
2654 "Dynamic, BSC-computed\n")
2655{
2656 struct gsm_bts *bts = vty->index;
2657 int type;
2658
2659 type = get_string_value(osmo_sitype_strs, argv[0]);
2660 if (type < 0) {
2661 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2662 return CMD_WARNING;
2663 }
2664
2665 if (!strcmp(argv[1], "static"))
2666 bts->si_mode_static |= (1 << type);
2667 else
2668 bts->si_mode_static &= ~(1 << type);
2669
2670 return CMD_SUCCESS;
2671}
2672
2673DEFUN(cfg_bts_si_static, cfg_bts_si_static_cmd,
2674 "system-information " SI_TYPE_TEXT " static HEXSTRING",
2675 SI_TEXT SI_TYPE_HELP
2676 "Static System Information filling\n"
2677 "Static user-specified SI content in HEX notation\n")
2678{
2679 struct gsm_bts *bts = vty->index;
2680 int rc, type;
2681
2682 type = get_string_value(osmo_sitype_strs, argv[0]);
2683 if (type < 0) {
2684 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2685 return CMD_WARNING;
2686 }
2687
2688 if (!(bts->si_mode_static & (1 << type))) {
2689 vty_out(vty, "SI Type %s is not configured in static mode%s",
2690 get_value_string(osmo_sitype_strs, type), VTY_NEWLINE);
2691 return CMD_WARNING;
2692 }
2693
Harald Welte290aaed2010-07-30 11:53:18 +02002694 /* Fill buffer with padding pattern */
Max6f0e50c2017-04-12 15:30:54 +02002695 memset(GSM_BTS_SI(bts, type), 0x2b, GSM_MACBLOCK_LEN);
Harald Welte290aaed2010-07-30 11:53:18 +02002696
2697 /* Parse the user-specified SI in hex format, [partially] overwriting padding */
Max6f0e50c2017-04-12 15:30:54 +02002698 rc = osmo_hexparse(argv[1], GSM_BTS_SI(bts, type), GSM_MACBLOCK_LEN);
2699 if (rc < 0 || rc > GSM_MACBLOCK_LEN) {
Harald Welte9fbff4a2010-07-30 11:50:09 +02002700 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
2701 return CMD_WARNING;
2702 }
2703
2704 /* Mark this SI as present */
2705 bts->si_valid |= (1 << type);
2706
2707 return CMD_SUCCESS;
2708}
2709
Harald Welte42def722017-01-13 00:10:32 +01002710DEFUN(cfg_bts_early_cm, cfg_bts_early_cm_cmd,
2711 "early-classmark-sending (allowed|forbidden)",
2712 "Early Classmark Sending\n"
2713 "Early Classmark Sending is allowed\n"
2714 "Early Classmark Sending is forbidden\n")
2715{
2716 struct gsm_bts *bts = vty->index;
Harald Welte42def722017-01-13 00:10:32 +01002717
2718 if (!strcmp(argv[0], "allowed"))
2719 bts->early_classmark_allowed = true;
2720 else
2721 bts->early_classmark_allowed = false;
2722
2723 return CMD_SUCCESS;
2724}
2725
Harald Welte32c09622011-01-11 23:44:56 +01002726DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
Harald Welte64c07d22011-02-15 11:43:27 +01002727 "neighbor-list mode (automatic|manual|manual-si5)",
Harald Welte32c09622011-01-11 23:44:56 +01002728 "Neighbor List\n" "Mode of Neighbor List generation\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002729 "Automatically from all BTS in this OpenBSC\n" "Manual\n"
2730 "Manual with different lists for SI2 and SI5\n")
Harald Welte32c09622011-01-11 23:44:56 +01002731{
2732 struct gsm_bts *bts = vty->index;
Harald Welte64c07d22011-02-15 11:43:27 +01002733 int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
Harald Welte32c09622011-01-11 23:44:56 +01002734
Harald Welte64c07d22011-02-15 11:43:27 +01002735 switch (mode) {
2736 case NL_MODE_MANUAL_SI5SEP:
2737 case NL_MODE_MANUAL:
Harald Welte32c09622011-01-11 23:44:56 +01002738 /* make sure we clear the current list when switching to
2739 * manual mode */
2740 if (bts->neigh_list_manual_mode == 0)
2741 memset(&bts->si_common.data.neigh_list, 0,
2742 sizeof(bts->si_common.data.neigh_list));
Harald Welte64c07d22011-02-15 11:43:27 +01002743 break;
2744 default:
2745 break;
2746 }
2747
2748 bts->neigh_list_manual_mode = mode;
Harald Welte32c09622011-01-11 23:44:56 +01002749
2750 return CMD_SUCCESS;
2751}
2752
2753DEFUN(cfg_bts_neigh, cfg_bts_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002754 "neighbor-list (add|del) arfcn <0-1023>",
Harald Welte32c09622011-01-11 23:44:56 +01002755 "Neighbor List\n" "Add to manual neighbor list\n"
2756 "Delete from manual neighbor list\n" "ARFCN of neighbor\n"
2757 "ARFCN of neighbor\n")
2758{
2759 struct gsm_bts *bts = vty->index;
2760 struct bitvec *bv = &bts->si_common.neigh_list;
2761 uint16_t arfcn = atoi(argv[1]);
2762
2763 if (!bts->neigh_list_manual_mode) {
2764 vty_out(vty, "%% Cannot configure neighbor list in "
2765 "automatic mode%s", VTY_NEWLINE);
2766 return CMD_WARNING;
2767 }
2768
2769 if (!strcmp(argv[0], "add"))
2770 bitvec_set_bit_pos(bv, arfcn, 1);
2771 else
2772 bitvec_set_bit_pos(bv, arfcn, 0);
2773
2774 return CMD_SUCCESS;
2775}
2776
Max59a1bf32016-04-15 16:04:46 +02002777DEFUN(cfg_bts_si2quater_neigh_add, cfg_bts_si2quater_neigh_add_cmd,
Max2c16bee2017-02-15 13:51:37 +01002778 "si2quater neighbor-list add earfcn <0-65535> thresh-hi <0-31> "
2779 "thresh-lo <0-32> prio <0-8> qrxlv <0-32> meas <0-8>",
2780 "SI2quater Neighbor List\n" "SI2quater Neighbor List\n"
2781 "Add to manual SI2quater neighbor list\n"
2782 "EARFCN of neighbor\n" "EARFCN of neighbor\n"
2783 "threshold high bits\n" "threshold high bits\n"
2784 "threshold low bits\n" "threshold low bits (32 means NA)\n"
2785 "priority\n" "priority (8 means NA)\n"
2786 "QRXLEVMIN\n" "QRXLEVMIN (32 means NA)\n"
2787 "measurement bandwidth\n" "measurement bandwidth (8 means NA)\n")
Max59a1bf32016-04-15 16:04:46 +02002788{
2789 struct gsm_bts *bts = vty->index;
2790 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
2791 uint16_t arfcn = atoi(argv[0]);
Max2c16bee2017-02-15 13:51:37 +01002792 uint8_t thresh_hi = atoi(argv[1]), thresh_lo = atoi(argv[2]),
2793 prio = atoi(argv[3]), qrx = atoi(argv[4]), meas = atoi(argv[5]);
2794 int r = osmo_earfcn_add(e, arfcn,
2795 (meas < 8) ? meas : OSMO_EARFCN_MEAS_INVALID);
Max59a1bf32016-04-15 16:04:46 +02002796
2797 if (r < 0) {
Max2c16bee2017-02-15 13:51:37 +01002798 vty_out(vty, "Unable to add ARFCN %u: %s%s", arfcn, strerror(-r),
Max59a1bf32016-04-15 16:04:46 +02002799 VTY_NEWLINE);
2800 return CMD_WARNING;
2801 }
2802
Max2c16bee2017-02-15 13:51:37 +01002803 if (e->thresh_hi && thresh_hi != e->thresh_hi)
2804 vty_out(vty, "Warning: multiple threshold-high are not "
2805 "supported, overriding previous threshold %u%s",
2806 e->thresh_hi, VTY_NEWLINE);
2807
2808 e->thresh_hi = thresh_hi;
2809
2810 if (thresh_lo != 32) {
2811 if (e->thresh_lo_valid && e->thresh_lo != thresh_lo)
2812 vty_out(vty, "Warning: multiple threshold-low are not "
2813 "supported, overriding previous threshold %u%s",
2814 e->thresh_lo, VTY_NEWLINE);
2815 e->thresh_lo = thresh_lo;
2816 e->thresh_lo_valid = true;
Maxaafff962016-04-20 15:57:14 +02002817 }
Max2c16bee2017-02-15 13:51:37 +01002818
2819 if (qrx != 32) {
2820 if (e->qrxlm_valid && e->qrxlm != qrx)
2821 vty_out(vty, "Warning: multiple QRXLEVMIN are not "
2822 "supported, overriding previous value %u%s",
2823 e->qrxlm, VTY_NEWLINE);
2824 e->qrxlm = qrx;
2825 e->qrxlm_valid = true;
2826 }
2827
2828 if (prio != 8) {
2829 if (e->prio_valid && e->prio != prio)
2830 vty_out(vty, "Warning: multiple priorities are not "
2831 "supported, overriding previous value %u%s",
2832 e->prio, VTY_NEWLINE);
2833 e->prio = prio;
2834 e->prio_valid = true;
2835 }
2836
Maxf39d03a2017-05-12 17:00:30 +02002837 if (si2q_num(bts) < 2) /* FIXME: use SI2Q_MAX_NUM */
Max2c16bee2017-02-15 13:51:37 +01002838 return CMD_SUCCESS;
2839
Maxf39d03a2017-05-12 17:00:30 +02002840 vty_out(vty, "Warning: not enough space in SI2quater (%u/%u used) for a given EARFCN %u%s",
2841 bts->si2q_count, 2, arfcn, VTY_NEWLINE); /* FIXME: use SI2Q_MAX_NUM */
Maxaafff962016-04-20 15:57:14 +02002842 osmo_earfcn_del(e, arfcn);
Max2c16bee2017-02-15 13:51:37 +01002843
Maxaafff962016-04-20 15:57:14 +02002844 return CMD_WARNING;
Max59a1bf32016-04-15 16:04:46 +02002845}
2846
2847DEFUN(cfg_bts_si2quater_neigh_del, cfg_bts_si2quater_neigh_del_cmd,
Max35697b92016-04-29 12:51:31 +02002848 "si2quater neighbor-list del earfcn <0-65535>",
Max59a1bf32016-04-15 16:04:46 +02002849 "SI2quater Neighbor List\n"
2850 "SI2quater Neighbor List\n"
2851 "Delete from SI2quater manual neighbor list\n"
Max36212f22016-04-20 12:06:05 +02002852 "EARFCN of neighbor\n"
2853 "EARFCN\n")
Max59a1bf32016-04-15 16:04:46 +02002854{
2855 struct gsm_bts *bts = vty->index;
2856 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
Max0c1bc262016-04-20 12:06:06 +02002857 uint16_t arfcn = atoi(argv[0]);
Max59a1bf32016-04-15 16:04:46 +02002858 int r = osmo_earfcn_del(e, arfcn);
2859 if (r < 0) {
2860 vty_out(vty, "Unable to delete arfcn %u: %s%s", arfcn,
Max0c1bc262016-04-20 12:06:06 +02002861 strerror(-r), VTY_NEWLINE);
Max59a1bf32016-04-15 16:04:46 +02002862 return CMD_WARNING;
2863 }
2864
2865 return CMD_SUCCESS;
2866}
2867
Max26679e02016-04-20 15:57:13 +02002868DEFUN(cfg_bts_si2quater_uarfcn_add, cfg_bts_si2quater_uarfcn_add_cmd,
Max35697b92016-04-29 12:51:31 +02002869 "si2quater neighbor-list add uarfcn <0-16383> <0-511> <0-1>",
Max26679e02016-04-20 15:57:13 +02002870 "SI2quater Neighbor List\n"
2871 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
2872 "UARFCN of neighbor\n" "UARFCN of neighbor\n" "scrambling code\n"
2873 "diversity bit\n")
2874{
2875 struct gsm_bts *bts = vty->index;
2876 uint16_t arfcn = atoi(argv[0]), scramble = atoi(argv[1]);
2877
2878 switch(bts_uarfcn_add(bts, arfcn, scramble, atoi(argv[2]))) {
2879 case -ENOMEM:
2880 vty_out(vty, "Unable to add arfcn: max number of UARFCNs (%u) "
2881 "reached%s", MAX_EARFCN_LIST, VTY_NEWLINE);
Harald Weltea191dcd2016-11-26 15:06:37 +01002882 return CMD_WARNING;
Maxaafff962016-04-20 15:57:14 +02002883 case -ENOSPC:
2884 vty_out(vty, "Warning: not enough space in si2quater for a "
2885 "given arfcn%s", VTY_NEWLINE);
Harald Weltea191dcd2016-11-26 15:06:37 +01002886 return CMD_WARNING;
Max26679e02016-04-20 15:57:13 +02002887 case -EADDRINUSE:
2888 vty_out(vty, "Unable to add arfcn: (%u, %u) is already added%s",
2889 arfcn, scramble, VTY_NEWLINE);
2890 return CMD_WARNING;
2891 }
2892
2893 return CMD_SUCCESS;
2894}
2895
2896DEFUN(cfg_bts_si2quater_uarfcn_del, cfg_bts_si2quater_uarfcn_del_cmd,
Max35697b92016-04-29 12:51:31 +02002897 "si2quater neighbor-list del uarfcn <0-16383> <0-511>",
Max26679e02016-04-20 15:57:13 +02002898 "SI2quater Neighbor List\n"
2899 "SI2quater Neighbor List\n"
2900 "Delete from SI2quater manual neighbor list\n"
2901 "UARFCN of neighbor\n"
2902 "UARFCN\n"
2903 "scrambling code\n")
2904{
2905 struct gsm_bts *bts = vty->index;
2906
2907 if (bts_uarfcn_del(bts, atoi(argv[0]), atoi(argv[1])) < 0) {
2908 vty_out(vty, "Unable to delete uarfcn: pair not found%s",
2909 VTY_NEWLINE);
2910 return CMD_WARNING;
2911 }
2912
2913 return CMD_SUCCESS;
2914}
2915
Harald Welte64c07d22011-02-15 11:43:27 +01002916DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002917 "si5 neighbor-list (add|del) arfcn <0-1023>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002918 "SI5 Neighbor List\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002919 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
2920 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
2921 "ARFCN of neighbor\n")
2922{
2923 struct gsm_bts *bts = vty->index;
2924 struct bitvec *bv = &bts->si_common.si5_neigh_list;
2925 uint16_t arfcn = atoi(argv[1]);
2926
2927 if (!bts->neigh_list_manual_mode) {
2928 vty_out(vty, "%% Cannot configure neighbor list in "
2929 "automatic mode%s", VTY_NEWLINE);
2930 return CMD_WARNING;
2931 }
2932
2933 if (!strcmp(argv[0], "add"))
2934 bitvec_set_bit_pos(bv, arfcn, 1);
2935 else
2936 bitvec_set_bit_pos(bv, arfcn, 0);
2937
2938 return CMD_SUCCESS;
2939}
Harald Welte9fbff4a2010-07-30 11:50:09 +02002940
Harald Welte8254cf72017-05-29 13:42:19 +02002941DEFUN(cfg_bts_pcu_sock, cfg_bts_pcu_sock_cmd,
2942 "pcu-socket PATH",
2943 "PCU Socket Path for using OsmoPCU co-located with BSC (legacy BTS)\n"
2944 "Path in the file system for the unix-domain PCU socket\n")
2945{
2946 struct gsm_bts *bts = vty->index;
2947 int rc;
2948
2949 bsc_replace_string(bts, &bts->pcu_sock_path, argv[0]);
2950 pcu_sock_exit(bts);
2951 rc = pcu_sock_init(bts->pcu_sock_path, bts);
2952 if (rc < 0) {
2953 vty_out(vty, "%% Error creating PCU socket `%s' for BTS %u%s",
2954 bts->pcu_sock_path, bts->nr, VTY_NEWLINE);
2955 return CMD_WARNING;
2956 }
2957
2958 return CMD_SUCCESS;
2959}
2960
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02002961#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
2962
2963DEFUN(cfg_bts_excl_rf_lock,
2964 cfg_bts_excl_rf_lock_cmd,
2965 "rf-lock-exclude",
2966 EXCL_RFLOCK_STR)
2967{
2968 struct gsm_bts *bts = vty->index;
2969 bts->excl_from_rf_lock = 1;
2970 return CMD_SUCCESS;
2971}
2972
2973DEFUN(cfg_bts_no_excl_rf_lock,
2974 cfg_bts_no_excl_rf_lock_cmd,
2975 "no rf-lock-exclude",
2976 NO_STR EXCL_RFLOCK_STR)
2977{
2978 struct gsm_bts *bts = vty->index;
2979 bts->excl_from_rf_lock = 0;
2980 return CMD_SUCCESS;
2981}
2982
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01002983#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
2984
2985DEFUN(cfg_bts_force_comb_si,
2986 cfg_bts_force_comb_si_cmd,
2987 "force-combined-si",
2988 FORCE_COMB_SI_STR)
2989{
2990 struct gsm_bts *bts = vty->index;
2991 bts->force_combined_si = 1;
2992 return CMD_SUCCESS;
2993}
2994
2995DEFUN(cfg_bts_no_force_comb_si,
2996 cfg_bts_no_force_comb_si_cmd,
2997 "no force-combined-si",
2998 NO_STR FORCE_COMB_SI_STR)
2999{
3000 struct gsm_bts *bts = vty->index;
3001 bts->force_combined_si = 0;
3002 return CMD_SUCCESS;
3003}
3004
Andreas Eversberga83d5112013-12-07 18:32:28 +01003005static void _get_codec_from_arg(struct vty *vty, int argc, const char *argv[])
3006{
3007 struct gsm_bts *bts = vty->index;
3008 struct bts_codec_conf *codec = &bts->codec;
3009 int i;
3010
3011 codec->hr = 0;
3012 codec->efr = 0;
3013 codec->amr = 0;
3014 for (i = 0; i < argc; i++) {
3015 if (!strcmp(argv[i], "hr"))
3016 codec->hr = 1;
3017 if (!strcmp(argv[i], "efr"))
3018 codec->efr = 1;
3019 if (!strcmp(argv[i], "amr"))
3020 codec->amr = 1;
3021 }
3022}
3023
3024#define CODEC_PAR_STR " (hr|efr|amr)"
3025#define CODEC_HELP_STR "Half Rate\n" \
3026 "Enhanced Full Rate\nAdaptive Multirate\n"
3027
3028DEFUN(cfg_bts_codec0, cfg_bts_codec0_cmd,
3029 "codec-support fr",
3030 "Codec Support settings\nFullrate\n")
3031{
3032 _get_codec_from_arg(vty, 0, argv);
3033 return CMD_SUCCESS;
3034}
3035
3036DEFUN(cfg_bts_codec1, cfg_bts_codec1_cmd,
3037 "codec-support fr" CODEC_PAR_STR,
3038 "Codec Support settings\nFullrate\n"
3039 CODEC_HELP_STR)
3040{
3041 _get_codec_from_arg(vty, 1, argv);
3042 return CMD_SUCCESS;
3043}
3044
3045DEFUN(cfg_bts_codec2, cfg_bts_codec2_cmd,
3046 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR,
3047 "Codec Support settings\nFullrate\n"
3048 CODEC_HELP_STR CODEC_HELP_STR)
3049{
3050 _get_codec_from_arg(vty, 2, argv);
3051 return CMD_SUCCESS;
3052}
3053
3054DEFUN(cfg_bts_codec3, cfg_bts_codec3_cmd,
3055 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
3056 "Codec Support settings\nFullrate\n"
3057 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
3058{
3059 _get_codec_from_arg(vty, 3, argv);
3060 return CMD_SUCCESS;
3061}
3062
3063DEFUN(cfg_bts_codec4, cfg_bts_codec4_cmd,
3064 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
3065 "Codec Support settings\nFullrate\n"
3066 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
3067{
3068 _get_codec_from_arg(vty, 4, argv);
3069 return CMD_SUCCESS;
3070}
3071
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01003072DEFUN(cfg_bts_depends_on, cfg_bts_depends_on_cmd,
3073 "depends-on-bts <0-255>",
3074 "This BTS can only be started if another one is up\n" "BTS Number\n")
3075{
3076 struct gsm_bts *bts = vty->index;
3077 struct gsm_bts *other_bts;
3078 int dep = atoi(argv[0]);
3079
3080
3081 if (!is_ipaccess_bts(bts)) {
3082 vty_out(vty, "This feature is only available for IP systems.%s",
3083 VTY_NEWLINE);
3084 return CMD_WARNING;
3085 }
3086
3087 other_bts = gsm_bts_num(bts->network, dep);
3088 if (!other_bts || !is_ipaccess_bts(other_bts)) {
3089 vty_out(vty, "This feature is only available for IP systems.%s",
3090 VTY_NEWLINE);
3091 return CMD_WARNING;
3092 }
3093
3094 if (dep >= bts->nr) {
3095 vty_out(vty, "%%Need to depend on an already declared unit.%s",
3096 VTY_NEWLINE);
3097 return CMD_WARNING;
3098 }
3099
3100 bts_depend_mark(bts, dep);
3101 return CMD_SUCCESS;
3102}
3103
3104DEFUN(cfg_bts_no_depends_on, cfg_bts_no_depends_on_cmd,
3105 "depeneds-on-bts <0-255>",
3106 NO_STR "This BTS can only be started if another one is up\n"
3107 "BTS Number\n")
3108{
3109 struct gsm_bts *bts = vty->index;
3110 int dep = atoi(argv[0]);
3111
3112 bts_depend_clear(bts, dep);
3113 return CMD_SUCCESS;
3114}
3115
Andreas Eversberg73266522014-01-19 11:47:44 +01003116#define AMR_TEXT "Adaptive Multi Rate settings\n"
3117#define AMR_MODE_TEXT "Codec modes to use with AMR codec\n"
3118#define AMR_START_TEXT "Initial codec to use with AMR\n" \
3119 "Automatically\nFirst codec\nSecond codec\nThird codec\nFourth codec\n"
3120#define AMR_TH_TEXT "AMR threshold between codecs\nMS side\nBTS side\n"
3121#define AMR_HY_TEXT "AMR hysteresis between codecs\nMS side\nBTS side\n"
3122
3123static void get_amr_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3124{
3125 struct gsm_bts *bts = vty->index;
3126 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3127 struct gsm48_multi_rate_conf *mr_conf =
3128 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3129 int i;
3130
3131 mr->gsm48_ie[1] = 0;
3132 for (i = 0; i < argc; i++)
3133 mr->gsm48_ie[1] |= 1 << atoi(argv[i]);
3134 mr_conf->icmi = 0;
3135}
3136
3137static void get_amr_th_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3138{
3139 struct gsm_bts *bts = vty->index;
3140 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003141 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003142 int i;
3143
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003144 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3145 for (i = 0; i < argc - 1; i++)
3146 modes[i].threshold = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003147}
3148
3149static void get_amr_hy_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3150{
3151 struct gsm_bts *bts = vty->index;
3152 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003153 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003154 int i;
3155
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003156 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3157 for (i = 0; i < argc - 1; i++)
3158 modes[i].hysteresis = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003159}
3160
3161static void get_amr_start_from_arg(struct vty *vty, const char *argv[], int full)
3162{
3163 struct gsm_bts *bts = vty->index;
3164 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3165 struct gsm48_multi_rate_conf *mr_conf =
3166 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3167 int num = 0, i;
3168
3169 for (i = 0; i < ((full) ? 8 : 6); i++) {
3170 if ((mr->gsm48_ie[1] & (1 << i))) {
3171 num++;
3172 }
3173 }
3174
3175 if (argv[0][0] == 'a' || num == 0)
3176 mr_conf->icmi = 0;
3177 else {
3178 mr_conf->icmi = 1;
3179 if (num < atoi(argv[0]))
3180 mr_conf->smod = num - 1;
3181 else
3182 mr_conf->smod = atoi(argv[0]) - 1;
3183 }
3184}
3185
3186#define AMR_TCHF_PAR_STR " (0|1|2|3|4|5|6|7)"
3187#define AMR_TCHF_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n" \
3188 "10,2k\n12,2k\n"
3189
3190#define AMR_TCHH_PAR_STR " (0|1|2|3|4|5)"
3191#define AMR_TCHH_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n"
3192
3193#define AMR_TH_HELP_STR "Threshold between codec 1 and 2\n"
3194#define AMR_HY_HELP_STR "Hysteresis between codec 1 and 2\n"
3195
3196DEFUN(cfg_bts_amr_fr_modes1, cfg_bts_amr_fr_modes1_cmd,
3197 "amr tch-f modes" AMR_TCHF_PAR_STR,
3198 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3199 AMR_TCHF_HELP_STR)
3200{
3201 get_amr_from_arg(vty, 1, argv, 1);
3202 return CMD_SUCCESS;
3203}
3204
3205DEFUN(cfg_bts_amr_fr_modes2, cfg_bts_amr_fr_modes2_cmd,
3206 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3207 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3208 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3209{
3210 get_amr_from_arg(vty, 2, argv, 1);
3211 return CMD_SUCCESS;
3212}
3213
3214DEFUN(cfg_bts_amr_fr_modes3, cfg_bts_amr_fr_modes3_cmd,
3215 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3216 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3217 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3218{
3219 get_amr_from_arg(vty, 3, argv, 1);
3220 return CMD_SUCCESS;
3221}
3222
3223DEFUN(cfg_bts_amr_fr_modes4, cfg_bts_amr_fr_modes4_cmd,
3224 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3225 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3226 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3227{
3228 get_amr_from_arg(vty, 4, argv, 1);
3229 return CMD_SUCCESS;
3230}
3231
3232DEFUN(cfg_bts_amr_fr_start_mode, cfg_bts_amr_fr_start_mode_cmd,
3233 "amr tch-f start-mode (auto|1|2|3|4)",
3234 AMR_TEXT "Full Rate\n" AMR_START_TEXT)
3235{
3236 get_amr_start_from_arg(vty, argv, 1);
3237 return CMD_SUCCESS;
3238}
3239
3240DEFUN(cfg_bts_amr_fr_thres1, cfg_bts_amr_fr_thres1_cmd,
3241 "amr tch-f threshold (ms|bts) <0-63>",
3242 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3243 AMR_TH_HELP_STR)
3244{
3245 get_amr_th_from_arg(vty, 2, argv, 1);
3246 return CMD_SUCCESS;
3247}
3248
3249DEFUN(cfg_bts_amr_fr_thres2, cfg_bts_amr_fr_thres2_cmd,
3250 "amr tch-f threshold (ms|bts) <0-63> <0-63>",
3251 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3252 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3253{
3254 get_amr_th_from_arg(vty, 3, argv, 1);
3255 return CMD_SUCCESS;
3256}
3257
3258DEFUN(cfg_bts_amr_fr_thres3, cfg_bts_amr_fr_thres3_cmd,
3259 "amr tch-f threshold (ms|bts) <0-63> <0-63> <0-63>",
3260 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3261 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3262{
3263 get_amr_th_from_arg(vty, 4, argv, 1);
3264 return CMD_SUCCESS;
3265}
3266
3267DEFUN(cfg_bts_amr_fr_hyst1, cfg_bts_amr_fr_hyst1_cmd,
3268 "amr tch-f hysteresis (ms|bts) <0-15>",
3269 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3270 AMR_HY_HELP_STR)
3271{
3272 get_amr_hy_from_arg(vty, 2, argv, 1);
3273 return CMD_SUCCESS;
3274}
3275
3276DEFUN(cfg_bts_amr_fr_hyst2, cfg_bts_amr_fr_hyst2_cmd,
3277 "amr tch-f hysteresis (ms|bts) <0-15> <0-15>",
3278 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3279 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3280{
3281 get_amr_hy_from_arg(vty, 3, argv, 1);
3282 return CMD_SUCCESS;
3283}
3284
3285DEFUN(cfg_bts_amr_fr_hyst3, cfg_bts_amr_fr_hyst3_cmd,
3286 "amr tch-f hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3287 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3288 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3289{
3290 get_amr_hy_from_arg(vty, 4, argv, 1);
3291 return CMD_SUCCESS;
3292}
3293
3294DEFUN(cfg_bts_amr_hr_modes1, cfg_bts_amr_hr_modes1_cmd,
3295 "amr tch-h modes" AMR_TCHH_PAR_STR,
3296 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3297 AMR_TCHH_HELP_STR)
3298{
3299 get_amr_from_arg(vty, 1, argv, 0);
3300 return CMD_SUCCESS;
3301}
3302
3303DEFUN(cfg_bts_amr_hr_modes2, cfg_bts_amr_hr_modes2_cmd,
3304 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3305 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3306 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3307{
3308 get_amr_from_arg(vty, 2, argv, 0);
3309 return CMD_SUCCESS;
3310}
3311
3312DEFUN(cfg_bts_amr_hr_modes3, cfg_bts_amr_hr_modes3_cmd,
3313 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3314 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3315 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3316{
3317 get_amr_from_arg(vty, 3, argv, 0);
3318 return CMD_SUCCESS;
3319}
3320
3321DEFUN(cfg_bts_amr_hr_modes4, cfg_bts_amr_hr_modes4_cmd,
3322 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3323 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3324 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3325{
3326 get_amr_from_arg(vty, 4, argv, 0);
3327 return CMD_SUCCESS;
3328}
3329
3330DEFUN(cfg_bts_amr_hr_start_mode, cfg_bts_amr_hr_start_mode_cmd,
3331 "amr tch-h start-mode (auto|1|2|3|4)",
3332 AMR_TEXT "Half Rate\n" AMR_START_TEXT)
3333{
3334 get_amr_start_from_arg(vty, argv, 0);
3335 return CMD_SUCCESS;
3336}
3337
3338DEFUN(cfg_bts_amr_hr_thres1, cfg_bts_amr_hr_thres1_cmd,
3339 "amr tch-h threshold (ms|bts) <0-63>",
3340 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3341 AMR_TH_HELP_STR)
3342{
3343 get_amr_th_from_arg(vty, 2, argv, 0);
3344 return CMD_SUCCESS;
3345}
3346
3347DEFUN(cfg_bts_amr_hr_thres2, cfg_bts_amr_hr_thres2_cmd,
3348 "amr tch-h threshold (ms|bts) <0-63> <0-63>",
3349 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3350 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3351{
3352 get_amr_th_from_arg(vty, 3, argv, 0);
3353 return CMD_SUCCESS;
3354}
3355
3356DEFUN(cfg_bts_amr_hr_thres3, cfg_bts_amr_hr_thres3_cmd,
3357 "amr tch-h threshold (ms|bts) <0-63> <0-63> <0-63>",
3358 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3359 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3360{
3361 get_amr_th_from_arg(vty, 4, argv, 0);
3362 return CMD_SUCCESS;
3363}
3364
3365DEFUN(cfg_bts_amr_hr_hyst1, cfg_bts_amr_hr_hyst1_cmd,
3366 "amr tch-h hysteresis (ms|bts) <0-15>",
3367 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3368 AMR_HY_HELP_STR)
3369{
3370 get_amr_hy_from_arg(vty, 2, argv, 0);
3371 return CMD_SUCCESS;
3372}
3373
3374DEFUN(cfg_bts_amr_hr_hyst2, cfg_bts_amr_hr_hyst2_cmd,
3375 "amr tch-h hysteresis (ms|bts) <0-15> <0-15>",
3376 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3377 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3378{
3379 get_amr_hy_from_arg(vty, 3, argv, 0);
3380 return CMD_SUCCESS;
3381}
3382
3383DEFUN(cfg_bts_amr_hr_hyst3, cfg_bts_amr_hr_hyst3_cmd,
3384 "amr tch-h hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3385 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3386 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3387{
3388 get_amr_hy_from_arg(vty, 4, argv, 0);
3389 return CMD_SUCCESS;
3390}
3391
Harald Welte8f0ed552010-05-11 21:53:49 +02003392#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02003393
Harald Welte5258fc42009-03-28 19:07:53 +00003394/* per TRX configuration */
3395DEFUN(cfg_trx,
3396 cfg_trx_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02003397 "trx <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02003398 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00003399 "Select a TRX to configure")
3400{
3401 int trx_nr = atoi(argv[0]);
3402 struct gsm_bts *bts = vty->index;
3403 struct gsm_bts_trx *trx;
3404
Harald Weltee441d9c2009-06-21 16:17:15 +02003405 if (trx_nr > bts->num_trx) {
3406 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
3407 bts->num_trx, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00003408 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02003409 } else if (trx_nr == bts->num_trx) {
3410 /* we need to allocate a new one */
3411 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003412 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02003413 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003414
Harald Weltee441d9c2009-06-21 16:17:15 +02003415 if (!trx)
3416 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00003417
3418 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02003419 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00003420 vty->node = TRX_NODE;
3421
3422 return CMD_SUCCESS;
3423}
3424
3425DEFUN(cfg_trx_arfcn,
3426 cfg_trx_arfcn_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01003427 "arfcn <0-1023>",
Harald Welte13fe2192012-08-17 09:57:25 +02003428 "Set the ARFCN for this TRX\n"
3429 "Absolute Radio Frequency Channel Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003430{
3431 int arfcn = atoi(argv[0]);
3432 struct gsm_bts_trx *trx = vty->index;
3433
3434 /* FIXME: check if this ARFCN is supported by this TRX */
3435
3436 trx->arfcn = arfcn;
3437
3438 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
3439 /* FIXME: use OML layer to update the ARFCN */
3440 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
3441
3442 return CMD_SUCCESS;
3443}
3444
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003445DEFUN(cfg_trx_nominal_power,
3446 cfg_trx_nominal_power_cmd,
3447 "nominal power <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003448 "Nominal TRX RF Power in dBm\n"
3449 "Nominal TRX RF Power in dBm\n"
3450 "Nominal TRX RF Power in dBm\n")
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003451{
3452 struct gsm_bts_trx *trx = vty->index;
3453
3454 trx->nominal_power = atoi(argv[0]);
3455
3456 return CMD_SUCCESS;
3457}
3458
Harald Weltefcd24452009-06-20 18:15:19 +02003459DEFUN(cfg_trx_max_power_red,
3460 cfg_trx_max_power_red_cmd,
3461 "max_power_red <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003462 "Reduction of maximum BS RF Power (relative to nominal power)\n"
Harald Weltefcd24452009-06-20 18:15:19 +02003463 "Reduction of maximum BS RF Power in dB\n")
3464{
3465 int maxpwr_r = atoi(argv[0]);
3466 struct gsm_bts_trx *trx = vty->index;
Harald Welte61a83b22009-11-18 09:20:22 +01003467 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-06-20 18:15:19 +02003468
3469 /* FIXME: check if our BTS type supports more than 12 */
3470 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
3471 vty_out(vty, "%% Power %d dB is not in the valid range%s",
3472 maxpwr_r, VTY_NEWLINE);
3473 return CMD_WARNING;
3474 }
3475 if (maxpwr_r & 1) {
3476 vty_out(vty, "%% Power %d dB is not an even value%s",
3477 maxpwr_r, VTY_NEWLINE);
3478 return CMD_WARNING;
3479 }
3480
3481 trx->max_power_red = maxpwr_r;
3482
3483 /* FIXME: make sure we update this using OML */
3484
3485 return CMD_SUCCESS;
3486}
3487
Harald Welte42581822009-08-08 16:12:58 +02003488DEFUN(cfg_trx_rsl_e1,
3489 cfg_trx_rsl_e1_cmd,
3490 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003491 "RSL Parameters\n"
3492 "E1/T1 interface to be used for RSL\n"
3493 "E1/T1 interface to be used for RSL\n"
3494 "E1/T1 Line Number to be used for RSL\n"
3495 "E1/T1 Timeslot to be used for RSL\n"
3496 "E1/T1 Timeslot to be used for RSL\n"
3497 "E1/T1 Sub-slot to be used for RSL\n"
3498 "E1/T1 Sub-slot 0 is to be used for RSL\n"
3499 "E1/T1 Sub-slot 1 is to be used for RSL\n"
3500 "E1/T1 Sub-slot 2 is to be used for RSL\n"
3501 "E1/T1 Sub-slot 3 is to be used for RSL\n"
3502 "E1/T1 full timeslot is to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003503{
3504 struct gsm_bts_trx *trx = vty->index;
3505
3506 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
3507
3508 return CMD_SUCCESS;
3509}
3510
3511DEFUN(cfg_trx_rsl_e1_tei,
3512 cfg_trx_rsl_e1_tei_cmd,
3513 "rsl e1 tei <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003514 "RSL Parameters\n"
3515 "Set the TEI to be used for RSL\n"
3516 "Set the TEI to be used for RSL\n"
3517 "TEI to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003518{
3519 struct gsm_bts_trx *trx = vty->index;
3520
3521 trx->rsl_tei = atoi(argv[0]);
3522
3523 return CMD_SUCCESS;
3524}
3525
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003526DEFUN(cfg_trx_rf_locked,
3527 cfg_trx_rf_locked_cmd,
3528 "rf_locked (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003529 "Set or unset the RF Locking (Turn off RF of the TRX)\n"
3530 "TRX is NOT RF locked (active)\n"
3531 "TRX is RF locked (turned off)\n")
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003532{
3533 int locked = atoi(argv[0]);
3534 struct gsm_bts_trx *trx = vty->index;
3535
3536 gsm_trx_lock_rf(trx, locked);
3537 return CMD_SUCCESS;
3538}
Harald Welte42581822009-08-08 16:12:58 +02003539
Harald Welte5258fc42009-03-28 19:07:53 +00003540/* per TS configuration */
3541DEFUN(cfg_ts,
3542 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003543 "timeslot <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003544 "Select a Timeslot to configure\n"
3545 "Timeslot number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003546{
3547 int ts_nr = atoi(argv[0]);
3548 struct gsm_bts_trx *trx = vty->index;
3549 struct gsm_bts_trx_ts *ts;
3550
3551 if (ts_nr >= TRX_NR_TS) {
3552 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
3553 TRX_NR_TS, VTY_NEWLINE);
3554 return CMD_WARNING;
3555 }
3556
3557 ts = &trx->ts[ts_nr];
3558
3559 vty->index = ts;
3560 vty->node = TS_NODE;
3561
3562 return CMD_SUCCESS;
3563}
3564
Harald Weltea6fd58e2009-08-07 00:25:23 +02003565DEFUN(cfg_ts_pchan,
3566 cfg_ts_pchan_cmd,
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003567 "phys_chan_config PCHAN", /* dynamically generated! */
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003568 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003569{
3570 struct gsm_bts_trx_ts *ts = vty->index;
3571 int pchanc;
3572
3573 pchanc = gsm_pchan_parse(argv[0]);
3574 if (pchanc < 0)
3575 return CMD_WARNING;
3576
3577 ts->pchan = pchanc;
3578
3579 return CMD_SUCCESS;
3580}
3581
3582/* used for backwards compatibility with old config files that still
3583 * have uppercase pchan type names */
3584DEFUN_HIDDEN(cfg_ts_pchan_compat,
3585 cfg_ts_pchan_compat_cmd,
Harald Weltea6fd58e2009-08-07 00:25:23 +02003586 "phys_chan_config PCHAN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003587 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003588{
3589 struct gsm_bts_trx_ts *ts = vty->index;
3590 int pchanc;
3591
3592 pchanc = gsm_pchan_parse(argv[0]);
3593 if (pchanc < 0)
3594 return CMD_WARNING;
3595
3596 ts->pchan = pchanc;
3597
3598 return CMD_SUCCESS;
3599}
3600
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003601
3602
Harald Welte135a6482011-05-30 12:09:13 +02003603DEFUN(cfg_ts_tsc,
3604 cfg_ts_tsc_cmd,
3605 "training_sequence_code <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003606 "Training Sequence Code of the Timeslot\n" "TSC\n")
Harald Welte135a6482011-05-30 12:09:13 +02003607{
3608 struct gsm_bts_trx_ts *ts = vty->index;
3609
Max71d082b2017-05-30 15:03:38 +02003610 if (!gsm_btsmodel_has_feature(ts->trx->bts->model, BTS_FEAT_MULTI_TSC)) {
Harald Welte903aaea2014-01-19 17:10:50 +01003611 vty_out(vty, "%% This BTS does not support a TSC != BCC, "
3612 "falling back to BCC%s", VTY_NEWLINE);
3613 ts->tsc = -1;
3614 return CMD_WARNING;
3615 }
3616
Harald Welte135a6482011-05-30 12:09:13 +02003617 ts->tsc = atoi(argv[0]);
3618
3619 return CMD_SUCCESS;
3620}
3621
Harald Weltea39b0f22010-06-14 22:26:10 +02003622#define HOPPING_STR "Configure frequency hopping\n"
3623
3624DEFUN(cfg_ts_hopping,
3625 cfg_ts_hopping_cmd,
3626 "hopping enabled (0|1)",
3627 HOPPING_STR "Enable or disable frequency hopping\n"
3628 "Disable frequency hopping\n" "Enable frequency hopping\n")
3629{
3630 struct gsm_bts_trx_ts *ts = vty->index;
Harald Weltec2fb3d02010-06-14 22:47:37 +02003631 int enabled = atoi(argv[0]);
Harald Weltea39b0f22010-06-14 22:26:10 +02003632
Max71d082b2017-05-30 15:03:38 +02003633 if (enabled && !gsm_btsmodel_has_feature(ts->trx->bts->model, BTS_FEAT_HOPPING)) {
Harald Weltec2fb3d02010-06-14 22:47:37 +02003634 vty_out(vty, "BTS model does not support hopping%s",
3635 VTY_NEWLINE);
3636 return CMD_WARNING;
3637 }
3638
3639 ts->hopping.enabled = enabled;
Harald Weltea39b0f22010-06-14 22:26:10 +02003640
3641 return CMD_SUCCESS;
3642}
3643
Harald Welte6e0cd042009-09-12 13:05:33 +02003644DEFUN(cfg_ts_hsn,
3645 cfg_ts_hsn_cmd,
Harald Weltea39b0f22010-06-14 22:26:10 +02003646 "hopping sequence-number <0-63>",
3647 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003648 "Which hopping sequence to use for this channel\n"
3649 "Hopping Sequence Number (HSN)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003650{
3651 struct gsm_bts_trx_ts *ts = vty->index;
3652
3653 ts->hopping.hsn = atoi(argv[0]);
3654
3655 return CMD_SUCCESS;
3656}
3657
3658DEFUN(cfg_ts_maio,
3659 cfg_ts_maio_cmd,
3660 "hopping maio <0-63>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003661 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003662 "Which hopping MAIO to use for this channel\n"
3663 "Mobile Allocation Index Offset (MAIO)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003664{
3665 struct gsm_bts_trx_ts *ts = vty->index;
3666
3667 ts->hopping.maio = atoi(argv[0]);
3668
3669 return CMD_SUCCESS;
3670}
3671
3672DEFUN(cfg_ts_arfcn_add,
3673 cfg_ts_arfcn_add_cmd,
3674 "hopping arfcn add <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003675 HOPPING_STR "Configure hopping ARFCN list\n"
3676 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003677{
3678 struct gsm_bts_trx_ts *ts = vty->index;
3679 int arfcn = atoi(argv[0]);
3680
Harald Weltea39b0f22010-06-14 22:26:10 +02003681 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
3682
Harald Welte6e0cd042009-09-12 13:05:33 +02003683 return CMD_SUCCESS;
3684}
3685
3686DEFUN(cfg_ts_arfcn_del,
3687 cfg_ts_arfcn_del_cmd,
3688 "hopping arfcn del <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003689 HOPPING_STR "Configure hopping ARFCN list\n"
3690 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003691{
3692 struct gsm_bts_trx_ts *ts = vty->index;
3693 int arfcn = atoi(argv[0]);
3694
Harald Weltea39b0f22010-06-14 22:26:10 +02003695 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
3696
Harald Welte6e0cd042009-09-12 13:05:33 +02003697 return CMD_SUCCESS;
3698}
3699
Harald Weltea6fd58e2009-08-07 00:25:23 +02003700DEFUN(cfg_ts_e1_subslot,
3701 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003702 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003703 "E1/T1 channel connected to this on-air timeslot\n"
3704 "E1/T1 channel connected to this on-air timeslot\n"
3705 "E1/T1 line connected to this on-air timeslot\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02003706 "E1/T1 timeslot connected to this on-air timeslot\n"
3707 "E1/T1 timeslot connected to this on-air timeslot\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02003708 "E1/T1 sub-slot connected to this on-air timeslot\n"
3709 "E1/T1 sub-slot 0 connected to this on-air timeslot\n"
3710 "E1/T1 sub-slot 1 connected to this on-air timeslot\n"
3711 "E1/T1 sub-slot 2 connected to this on-air timeslot\n"
3712 "E1/T1 sub-slot 3 connected to this on-air timeslot\n"
3713 "Full E1/T1 timeslot connected to this on-air timeslot\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003714{
3715 struct gsm_bts_trx_ts *ts = vty->index;
3716
Harald Welte42581822009-08-08 16:12:58 +02003717 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003718
3719 return CMD_SUCCESS;
3720}
Harald Welte5258fc42009-03-28 19:07:53 +00003721
Harald Welte4f10c252010-05-16 21:47:13 +02003722void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
3723{
3724 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003725 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_TOTAL].current,
3726 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_NO_CHANNEL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003727 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003728 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003729 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RF_FAIL].current,
3730 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RLL_ERR].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003731 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003732 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003733 net->bsc_ctrs->ctr[BSC_CTR_PAGING_ATTEMPTED].current,
3734 net->bsc_ctrs->ctr[BSC_CTR_PAGING_COMPLETED].current,
3735 net->bsc_ctrs->ctr[BSC_CTR_PAGING_EXPIRED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003736 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003737 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003738 net->bsc_ctrs->ctr[BSC_CTR_BTS_OML_FAIL].current,
3739 net->bsc_ctrs->ctr[BSC_CTR_BTS_RSL_FAIL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003740 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003741}
3742
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003743DEFUN(drop_bts,
3744 drop_bts_cmd,
Holger Hans Peter Freyther0586b0f2010-04-11 12:46:45 +02003745 "drop bts connection <0-65535> (oml|rsl)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003746 "Debug/Simulation command to drop Abis/IP BTS\n"
3747 "Debug/Simulation command to drop Abis/IP BTS\n"
3748 "Debug/Simulation command to drop Abis/IP BTS\n"
3749 "BTS NR\n" "Drop OML Connection\n" "Drop RSL Connection\n")
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003750{
3751 struct gsm_network *gsmnet;
3752 struct gsm_bts_trx *trx;
3753 struct gsm_bts *bts;
3754 unsigned int bts_nr;
3755
3756 gsmnet = gsmnet_from_vty(vty);
3757
3758 bts_nr = atoi(argv[0]);
3759 if (bts_nr >= gsmnet->num_bts) {
3760 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3761 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3762 return CMD_WARNING;
3763 }
3764
3765 bts = gsm_bts_num(gsmnet, bts_nr);
3766 if (!bts) {
3767 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3768 return CMD_WARNING;
3769 }
3770
3771 if (!is_ipaccess_bts(bts)) {
3772 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
3773 return CMD_WARNING;
3774 }
3775
3776
3777 /* close all connections */
3778 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003779 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003780 } else if (strcmp(argv[1], "rsl") == 0) {
3781 /* close all rsl connections */
3782 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003783 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003784 }
3785 } else {
3786 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
3787 return CMD_WARNING;
3788 }
3789
3790 return CMD_SUCCESS;
3791}
3792
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01003793DEFUN(restart_bts, restart_bts_cmd,
3794 "restart-bts <0-65535>",
3795 "Restart ip.access nanoBTS through OML\n"
3796 "BTS Number\n")
3797{
3798 struct gsm_network *gsmnet;
3799 struct gsm_bts_trx *trx;
3800 struct gsm_bts *bts;
3801 unsigned int bts_nr;
3802
3803 gsmnet = gsmnet_from_vty(vty);
3804
3805 bts_nr = atoi(argv[0]);
3806 if (bts_nr >= gsmnet->num_bts) {
3807 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3808 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3809 return CMD_WARNING;
3810 }
3811
3812 bts = gsm_bts_num(gsmnet, bts_nr);
3813 if (!bts) {
3814 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3815 return CMD_WARNING;
3816 }
3817
3818 if (!is_ipaccess_bts(bts) || is_sysmobts_v2(bts)) {
3819 vty_out(vty, "This command only works for ipaccess nanoBTS.%s",
3820 VTY_NEWLINE);
3821 return CMD_WARNING;
3822 }
3823
3824 /* go from last TRX to c0 */
3825 llist_for_each_entry_reverse(trx, &bts->trx_list, list)
3826 abis_nm_ipaccess_restart(trx);
3827
3828 return CMD_SUCCESS;
3829}
3830
Harald Welte30f1f372014-12-28 15:00:45 +01003831DEFUN(smscb_cmd, smscb_cmd_cmd,
3832 "bts <0-255> smscb-command <1-4> HEXSTRING",
3833 "BTS related commands\n" "BTS Number\n"
3834 "SMS Cell Broadcast\n" "Last Valid Block\n"
3835 "Hex Encoded SMSCB message (up to 88 octets)\n")
3836{
3837 struct gsm_bts *bts;
3838 int bts_nr = atoi(argv[0]);
3839 int last_block = atoi(argv[1]);
3840 struct rsl_ie_cb_cmd_type cb_cmd;
3841 uint8_t buf[88];
3842 int rc;
3843
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +02003844 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
Harald Welte30f1f372014-12-28 15:00:45 +01003845 if (!bts) {
3846 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3847 return CMD_WARNING;
3848 }
3849 rc = osmo_hexparse(argv[2], buf, sizeof(buf));
3850 if (rc < 0 || rc > sizeof(buf)) {
3851 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
3852 return CMD_WARNING;
3853 }
3854
3855 cb_cmd.spare = 0;
3856 cb_cmd.def_bcast = 0;
3857 cb_cmd.command = RSL_CB_CMD_TYPE_NORMAL;
3858
3859 switch (last_block) {
3860 case 1:
3861 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_1;
3862 break;
3863 case 2:
3864 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_2;
3865 break;
3866 case 3:
3867 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_3;
3868 break;
3869 case 4:
3870 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_4;
3871 break;
3872 }
3873
3874 rsl_sms_cb_command(bts, RSL_CHAN_SDCCH4_ACCH, cb_cmd, buf, rc);
3875
3876 return CMD_SUCCESS;
3877}
3878
Harald Welte7fe00fb2017-05-27 14:09:50 +02003879/* resolve a gsm_bts_trx_ts basd on the given numeric identifiers */
Harald Welte645eb622017-05-27 15:52:58 +02003880static struct gsm_bts_trx_ts *vty_get_ts(struct vty *vty, const char *bts_str, const char *trx_str,
3881 const char *ts_str)
Harald Welte7fe00fb2017-05-27 14:09:50 +02003882{
Harald Welte645eb622017-05-27 15:52:58 +02003883 int bts_nr = atoi(bts_str);
3884 int trx_nr = atoi(trx_str);
3885 int ts_nr = atoi(ts_str);
Harald Welte7fe00fb2017-05-27 14:09:50 +02003886 struct gsm_bts *bts;
3887 struct gsm_bts_trx *trx;
3888 struct gsm_bts_trx_ts *ts;
3889
3890 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
3891 if (!bts) {
3892 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3893 return NULL;
3894 }
3895
3896 trx = gsm_bts_trx_num(bts, trx_nr);
3897 if (!trx) {
3898 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
3899 return NULL;
3900 }
3901
3902 ts = &trx->ts[ts_nr];
3903
3904 return ts;
3905}
Harald Welte30f1f372014-12-28 15:00:45 +01003906
Harald Welted0d2b0b2010-12-23 13:18:07 +01003907DEFUN(pdch_act, pdch_act_cmd,
3908 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
3909 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3910 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
3911 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
3912 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
3913{
Harald Welted0d2b0b2010-12-23 13:18:07 +01003914 struct gsm_bts_trx_ts *ts;
Harald Welted0d2b0b2010-12-23 13:18:07 +01003915 int activate;
3916
Harald Welte645eb622017-05-27 15:52:58 +02003917 ts = vty_get_ts(vty, argv[0], argv[1], argv[2]);
Harald Welte7fe00fb2017-05-27 14:09:50 +02003918 if (!ts)
Harald Welted0d2b0b2010-12-23 13:18:07 +01003919 return CMD_WARNING;
Harald Welted0d2b0b2010-12-23 13:18:07 +01003920
Harald Welte7fe00fb2017-05-27 14:09:50 +02003921 if (!is_ipaccess_bts(ts->trx->bts)) {
Harald Welted0d2b0b2010-12-23 13:18:07 +01003922 vty_out(vty, "%% This command only works for ipaccess BTS%s",
3923 VTY_NEWLINE);
3924 return CMD_WARNING;
3925 }
3926
Harald Welted0d2b0b2010-12-23 13:18:07 +01003927 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
3928 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
Harald Welte645eb622017-05-27 15:52:58 +02003929 "mode%s", ts->nr, VTY_NEWLINE);
Harald Welted0d2b0b2010-12-23 13:18:07 +01003930 return CMD_WARNING;
3931 }
3932
3933 if (!strcmp(argv[3], "activate"))
3934 activate = 1;
3935 else
3936 activate = 0;
3937
3938 rsl_ipacc_pdch_activate(ts, activate);
3939
3940 return CMD_SUCCESS;
3941
3942}
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003943
Harald Welte2abd5e12017-05-27 14:10:40 +02003944/* determine the logical channel type based on the physical channel type */
3945static int lchan_type_by_pchan(enum gsm_phys_chan_config pchan)
3946{
3947 switch (pchan) {
3948 case GSM_PCHAN_TCH_F:
3949 return GSM_LCHAN_TCH_F;
3950 case GSM_PCHAN_TCH_H:
3951 return GSM_LCHAN_TCH_H;
3952 case GSM_PCHAN_SDCCH8_SACCH8C:
3953 case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:
3954 case GSM_PCHAN_CCCH_SDCCH4:
3955 case GSM_PCHAN_CCCH_SDCCH4_CBCH:
3956 return GSM_LCHAN_SDCCH;
3957 default:
3958 return -1;
3959 }
3960}
3961
3962/* configure the lchan for a single AMR mode (as specified) */
3963static int lchan_set_single_amr_mode(struct gsm_lchan *lchan, uint8_t amr_mode)
3964{
3965 struct amr_multirate_conf mr;
3966 struct gsm48_multi_rate_conf *mr_conf;
3967 mr_conf = (struct gsm48_multi_rate_conf *) &mr.gsm48_ie;
3968
3969 if (amr_mode > 7)
3970 return -1;
3971
3972 memset(&mr, 0, sizeof(mr));
3973 mr_conf->ver = 1;
3974 /* bit-mask of supported modes, only one bit is set. Reflects
3975 * Figure 10.5.2.47a where there are no thershold and only a
3976 * single mode */
3977 mr.gsm48_ie[1] = 1 << amr_mode;
3978
3979 mr.ms_mode[0].mode = amr_mode;
3980 mr.bts_mode[0].mode = amr_mode;
3981
3982 /* encode this configuration into the lchan for both uplink and
3983 * downlink direction */
3984 gsm48_multirate_config(lchan->mr_ms_lv, &mr, mr.ms_mode);
3985 gsm48_multirate_config(lchan->mr_bts_lv, &mr, mr.bts_mode);
3986
3987 return 0;
3988}
3989
3990/* Debug/Measurement command to activate a given logical channel
3991 * manually in a given mode/codec. This is useful for receiver
3992 * performance testing (FER/RBER/...) */
3993DEFUN(lchan_act, lchan_act_cmd,
3994 "bts <0-255> trx <0-255> timeslot <0-7> sub-slot <0-7> (activate|deactivate) (hr|fr|efr|amr) [<0-7>]",
3995 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3996 "TRX Timeslot\n" "Timeslot Number\n" "Sub-Slot Number\n" "Sub-Slot Number\n"
3997 "Manual Channel Activation (e.g. for BER test)\n"
3998 "Manual Channel Deactivation (e.g. for BER test)\n"
3999 "Half-Rate v1\n" "Full-Rate\n" "Enhanced Full Rate\n" "Adaptive Multi-Rate\n" "AMR Mode\n")
4000{
4001 struct gsm_bts_trx_ts *ts;
4002 struct gsm_lchan *lchan;
4003 int ss_nr = atoi(argv[3]);
4004 const char *act_str = argv[4];
4005 const char *codec_str = argv[5];
4006 int activate;
4007
4008 ts = vty_get_ts(vty, argv[0], argv[1], argv[2]);
4009 if (!ts)
4010 return CMD_WARNING;
4011
4012 lchan = &ts->lchan[ss_nr];
4013
4014 if (!strcmp(act_str, "activate"))
4015 activate = 1;
4016 else
4017 activate = 0;
4018
4019 if (ss_nr >= ts_subslots(ts)) {
4020 vty_out(vty, "%% subslot %d >= permitted %d for physical channel %s%s",
4021 ss_nr, ts_subslots(ts), gsm_pchan_name(ts->pchan), VTY_NEWLINE);
4022 return CMD_WARNING;
4023 }
4024
4025 if (activate) {
4026 int lchan_t;
4027 if (lchan->state != LCHAN_S_NONE) {
4028 vty_out(vty, "%% Cannot activate: Channel busy!%s", VTY_NEWLINE);
4029 return CMD_WARNING;
4030 }
4031 lchan_t = lchan_type_by_pchan(ts->pchan);
4032 if (lchan_t < 0)
4033 return CMD_WARNING;
4034 /* configure the lchan */
4035 lchan->type = lchan_t;
4036 lchan->rsl_cmode = RSL_CMOD_SPD_SPEECH;
4037 if (!strcmp(codec_str, "hr") || !strcmp(codec_str, "fr"))
4038 lchan->tch_mode = GSM48_CMODE_SPEECH_V1;
4039 else if (!strcmp(codec_str, "efr"))
4040 lchan->tch_mode = GSM48_CMODE_SPEECH_EFR;
4041 else if (!strcmp(codec_str, "amr")) {
4042 int amr_mode;
4043 if (argc < 7) {
4044 vty_out(vty, "%% AMR requires specification of AMR mode%s", VTY_NEWLINE);
4045 return CMD_WARNING;
4046 }
4047 amr_mode = atoi(argv[6]);
4048 lchan->tch_mode = GSM48_CMODE_SPEECH_AMR;
4049 lchan_set_single_amr_mode(lchan, amr_mode);
4050 }
4051 vty_out(vty, "%% activating lchan %s%s", gsm_lchan_name(lchan), VTY_NEWLINE);
4052 rsl_chan_activate_lchan(lchan, RSL_ACT_TYPE_INITIAL, 0);
4053 rsl_ipacc_crcx(lchan);
Harald Welte2abd5e12017-05-27 14:10:40 +02004054 } else {
4055 rsl_direct_rf_release(lchan);
4056 }
4057
4058 return CMD_SUCCESS;
4059}
4060
Harald Welte3f86c522017-05-27 15:53:28 +02004061DEFUN(lchan_mdcx, lchan_mdcx_cmd,
4062 "bts <0-255> trx <0-255> timeslot <0-7> sub-slot <0-7> mdcx A.B.C.D <0-65535>",
4063 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
4064 "TRX Timeslot\n" "Timeslot Number\n" "Sub-Slot\n" "Sub-Slot Number\n"
4065 "Modify RTP Connection\n" "MGW IP Address\n" "MGW UDP Port\n")
4066{
4067 struct gsm_bts_trx_ts *ts;
4068 struct gsm_lchan *lchan;
4069 int ss_nr = atoi(argv[3]);
4070 int port = atoi(argv[5]);
4071 struct in_addr ia;
4072 inet_aton(argv[4], &ia);
4073
4074 ts = vty_get_ts(vty, argv[0], argv[1], argv[2]);
4075 if (!ts)
4076 return CMD_WARNING;
4077
4078 lchan = &ts->lchan[ss_nr];
4079
4080 if (ss_nr >= ts_subslots(ts)) {
4081 vty_out(vty, "%% subslot %d >= permitted %d for physical channel %s%s",
4082 ss_nr, ts_subslots(ts), gsm_pchan_name(ts->pchan), VTY_NEWLINE);
4083 return CMD_WARNING;
4084 }
4085
4086 vty_out(vty, "%% connecting RTP of %s to %s:%u%s", gsm_lchan_name(lchan),
4087 inet_ntoa(ia), port, VTY_NEWLINE);
4088 rsl_ipacc_mdcx(lchan, ntohl(ia.s_addr), port, 0);
4089 return CMD_SUCCESS;
4090}
Harald Weltedcccb182010-05-16 20:52:23 +02004091extern int bsc_vty_init_extra(void);
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02004092
Maxdb0e3802017-01-12 19:35:11 +01004093int bsc_vty_init(struct gsm_network *network)
Harald Welte68628e82009-03-10 12:17:57 +00004094{
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004095 cfg_ts_pchan_cmd.string =
4096 vty_cmd_string_from_valstr(tall_bsc_ctx,
4097 gsm_pchant_names,
4098 "phys_chan_config (", "|", ")",
4099 VTY_DO_LOWER);
4100 cfg_ts_pchan_cmd.doc =
4101 vty_cmd_string_from_valstr(tall_bsc_ctx,
4102 gsm_pchant_descs,
4103 "Physical Channel Combination\n",
4104 "\n", "", 0);
4105
Harald Weltee555c2b2012-08-17 13:02:12 +02004106 cfg_bts_type_cmd.string =
4107 vty_cmd_string_from_valstr(tall_bsc_ctx,
4108 bts_type_names,
4109 "type (", "|", ")",
4110 VTY_DO_LOWER);
4111 cfg_bts_type_cmd.doc =
4112 vty_cmd_string_from_valstr(tall_bsc_ctx,
4113 bts_type_descs,
4114 "BTS Vendor/Type\n",
4115 "\n", "", 0);
4116
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +02004117 common_cs_vty_init(network, config_write_net);
Harald Weltee555c2b2012-08-17 13:02:12 +02004118
Neels Hofmeyrea11bf82016-05-12 01:53:23 +02004119 install_element_ve(&bsc_show_net_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +00004120 install_element_ve(&show_bts_cmd);
4121 install_element_ve(&show_trx_cmd);
4122 install_element_ve(&show_ts_cmd);
4123 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08004124 install_element_ve(&show_lchan_summary_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00004125
Harald Welteb4d5b172010-05-12 16:10:35 +00004126 install_element_ve(&show_paging_cmd);
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01004127 install_element_ve(&show_paging_group_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00004128
Maxdb0e3802017-01-12 19:35:11 +01004129 logging_vty_add_cmds(NULL);
Jacob Erlbeck64630cc2015-10-26 16:25:37 +01004130 osmo_stats_vty_add_cmds();
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01004131
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01004132 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01004133 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-12-21 16:51:50 +01004134 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
4135 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
4136 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
4137 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
4138 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
4139 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01004140 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01004141 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
4142 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
4143 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
4144 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
4145 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
4146 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
4147 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
4148 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
4149 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltec9f499f2010-12-23 22:53:50 +01004150 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01004151 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08004152 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08004153 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02004154
4155 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02004156 install_node(&bts_node, config_write_bts);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004157 vty_install_default(BTS_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004158 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004159 install_element(BTS_NODE, &cfg_description_cmd);
4160 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02004161 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02004162 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Maxc08ee712016-05-11 12:45:13 +02004163 install_element(BTS_NODE, &cfg_bts_dtxu_cmd);
4164 install_element(BTS_NODE, &cfg_bts_dtxd_cmd);
4165 install_element(BTS_NODE, &cfg_bts_no_dtxu_cmd);
4166 install_element(BTS_NODE, &cfg_bts_no_dtxd_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00004167 install_element(BTS_NODE, &cfg_bts_lac_cmd);
4168 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004169 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00004170 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8b291802013-03-12 13:57:05 +01004171 install_element(BTS_NODE, &cfg_bts_rsl_ip_cmd);
Sylvain Munautc9519462011-10-17 14:04:55 +02004172 install_element(BTS_NODE, &cfg_bts_nokia_site_skip_reset_cmd);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01004173 install_element(BTS_NODE, &cfg_bts_nokia_site_no_loc_rel_cnf_cmd);
Sipos Csaba56e17662015-02-07 13:27:36 +01004174 install_element(BTS_NODE, &cfg_bts_nokia_site_bts_reset_timer_cnf_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02004175 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004176 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
4177 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte7a8fa412009-08-10 13:48:16 +02004178 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01004179 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
4180 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02004181 install_element(BTS_NODE, &cfg_bts_chan_desc_att_cmd);
4182 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_pa_mfrms_cmd);
4183 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_ag_blks_res_cmd);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08004184 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
4185 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02004186 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08004187 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Ivan Kluchnikov67920592013-09-16 13:13:04 +04004188 install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02004189 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02004190 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02004191 install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
Harald Welte73225282009-12-12 18:17:25 +01004192 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
4193 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaute0b06b02010-11-28 18:17:28 +01004194 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
4195 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
4196 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
4197 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
4198 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
4199 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01004200 install_element(BTS_NODE, &cfg_bts_radio_link_timeout_cmd);
Harald Welte4511d892010-04-18 15:51:20 +02004201 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
bhargava350533c2016-07-21 11:14:34 +05304202 install_element(BTS_NODE, &cfg_bts_gprs_11bit_rach_support_for_egprs_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02004203 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004204 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01004205 install_element(BTS_NODE, &cfg_bts_gprs_net_ctrl_ord_cmd);
Max292ec582016-07-28 11:55:37 +02004206 install_element(BTS_NODE, &cfg_bts_gprs_ctrl_ack_cmd);
4207 install_element(BTS_NODE, &cfg_no_bts_gprs_ctrl_ack_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004208 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02004209 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08004210 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004211 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-03-14 23:30:30 +08004212 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
4213 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
4214 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08004215 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welte9fbff4a2010-07-30 11:50:09 +02004216 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
4217 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welte42def722017-01-13 00:10:32 +01004218 install_element(BTS_NODE, &cfg_bts_early_cm_cmd);
Harald Welte32c09622011-01-11 23:44:56 +01004219 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
4220 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Welte64c07d22011-02-15 11:43:27 +01004221 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Max59a1bf32016-04-15 16:04:46 +02004222 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_add_cmd);
4223 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_del_cmd);
Max26679e02016-04-20 15:57:13 +02004224 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_add_cmd);
4225 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_del_cmd);
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02004226 install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
4227 install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01004228 install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
4229 install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
Andreas Eversberga83d5112013-12-07 18:32:28 +01004230 install_element(BTS_NODE, &cfg_bts_codec0_cmd);
4231 install_element(BTS_NODE, &cfg_bts_codec1_cmd);
4232 install_element(BTS_NODE, &cfg_bts_codec2_cmd);
4233 install_element(BTS_NODE, &cfg_bts_codec3_cmd);
4234 install_element(BTS_NODE, &cfg_bts_codec4_cmd);
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01004235 install_element(BTS_NODE, &cfg_bts_depends_on_cmd);
4236 install_element(BTS_NODE, &cfg_bts_no_depends_on_cmd);
Andreas Eversberg73266522014-01-19 11:47:44 +01004237 install_element(BTS_NODE, &cfg_bts_amr_fr_modes1_cmd);
4238 install_element(BTS_NODE, &cfg_bts_amr_fr_modes2_cmd);
4239 install_element(BTS_NODE, &cfg_bts_amr_fr_modes3_cmd);
4240 install_element(BTS_NODE, &cfg_bts_amr_fr_modes4_cmd);
4241 install_element(BTS_NODE, &cfg_bts_amr_fr_thres1_cmd);
4242 install_element(BTS_NODE, &cfg_bts_amr_fr_thres2_cmd);
4243 install_element(BTS_NODE, &cfg_bts_amr_fr_thres3_cmd);
4244 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst1_cmd);
4245 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst2_cmd);
4246 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst3_cmd);
4247 install_element(BTS_NODE, &cfg_bts_amr_fr_start_mode_cmd);
4248 install_element(BTS_NODE, &cfg_bts_amr_hr_modes1_cmd);
4249 install_element(BTS_NODE, &cfg_bts_amr_hr_modes2_cmd);
4250 install_element(BTS_NODE, &cfg_bts_amr_hr_modes3_cmd);
4251 install_element(BTS_NODE, &cfg_bts_amr_hr_modes4_cmd);
4252 install_element(BTS_NODE, &cfg_bts_amr_hr_thres1_cmd);
4253 install_element(BTS_NODE, &cfg_bts_amr_hr_thres2_cmd);
4254 install_element(BTS_NODE, &cfg_bts_amr_hr_thres3_cmd);
4255 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst1_cmd);
4256 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst2_cmd);
4257 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst3_cmd);
4258 install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd);
Harald Welte8254cf72017-05-29 13:42:19 +02004259 install_element(BTS_NODE, &cfg_bts_pcu_sock_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004260
Harald Welte5258fc42009-03-28 19:07:53 +00004261 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004262 install_node(&trx_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004263 vty_install_default(TRX_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004264 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004265 install_element(TRX_NODE, &cfg_description_cmd);
4266 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)7b37d972009-12-27 20:56:38 +01004267 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02004268 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004269 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
4270 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01004271 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004272
Harald Welte5258fc42009-03-28 19:07:53 +00004273 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004274 install_node(&ts_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004275 vty_install_default(TS_NODE);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004276 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004277 install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);
Harald Welte135a6482011-05-30 12:09:13 +02004278 install_element(TS_NODE, &cfg_ts_tsc_cmd);
Harald Weltea39b0f22010-06-14 22:26:10 +02004279 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte6e0cd042009-09-12 13:05:33 +02004280 install_element(TS_NODE, &cfg_ts_hsn_cmd);
4281 install_element(TS_NODE, &cfg_ts_maio_cmd);
4282 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
4283 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004284 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004285
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004286 install_element(ENABLE_NODE, &drop_bts_cmd);
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01004287 install_element(ENABLE_NODE, &restart_bts_cmd);
Harald Welted0d2b0b2010-12-23 13:18:07 +01004288 install_element(ENABLE_NODE, &pdch_act_cmd);
Harald Welte2abd5e12017-05-27 14:10:40 +02004289 install_element(ENABLE_NODE, &lchan_act_cmd);
Harald Welte3f86c522017-05-27 15:53:28 +02004290 install_element(ENABLE_NODE, &lchan_mdcx_cmd);
Harald Welte30f1f372014-12-28 15:00:45 +01004291 install_element(ENABLE_NODE, &smscb_cmd_cmd);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004292
Harald Welte81c9b9c2010-05-31 16:40:40 +02004293 abis_nm_vty_init();
Harald Weltee1d5eca2011-02-12 14:42:59 +01004294 abis_om2k_vty_init();
Harald Welte3016d9f2011-02-05 13:54:41 +01004295 e1inp_vty_init();
Harald Welte42def722017-01-13 00:10:32 +01004296 osmo_fsm_vty_add_cmds();
Harald Welte81c9b9c2010-05-31 16:40:40 +02004297
Harald Weltedcccb182010-05-16 20:52:23 +02004298 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00004299
Harald Welte68628e82009-03-10 12:17:57 +00004300 return 0;
4301}