blob: 2fc39ab4c85bb9ca8231d8e0a4cb0db9e6663831 [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
Max70fdd242017-06-15 15:10:53 +02002777/* help text should be kept in sync with EARFCN_*_INVALID defines */
Max59a1bf32016-04-15 16:04:46 +02002778DEFUN(cfg_bts_si2quater_neigh_add, cfg_bts_si2quater_neigh_add_cmd,
Max2c16bee2017-02-15 13:51:37 +01002779 "si2quater neighbor-list add earfcn <0-65535> thresh-hi <0-31> "
2780 "thresh-lo <0-32> prio <0-8> qrxlv <0-32> meas <0-8>",
2781 "SI2quater Neighbor List\n" "SI2quater Neighbor List\n"
2782 "Add to manual SI2quater neighbor list\n"
2783 "EARFCN of neighbor\n" "EARFCN of neighbor\n"
2784 "threshold high bits\n" "threshold high bits\n"
2785 "threshold low bits\n" "threshold low bits (32 means NA)\n"
2786 "priority\n" "priority (8 means NA)\n"
2787 "QRXLEVMIN\n" "QRXLEVMIN (32 means NA)\n"
2788 "measurement bandwidth\n" "measurement bandwidth (8 means NA)\n")
Max59a1bf32016-04-15 16:04:46 +02002789{
2790 struct gsm_bts *bts = vty->index;
2791 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
2792 uint16_t arfcn = atoi(argv[0]);
Max2c16bee2017-02-15 13:51:37 +01002793 uint8_t thresh_hi = atoi(argv[1]), thresh_lo = atoi(argv[2]),
2794 prio = atoi(argv[3]), qrx = atoi(argv[4]), meas = atoi(argv[5]);
Max70fdd242017-06-15 15:10:53 +02002795 int r = bts_earfcn_add(bts, arfcn, thresh_hi, thresh_lo, prio, qrx, meas);
Max59a1bf32016-04-15 16:04:46 +02002796
Max70fdd242017-06-15 15:10:53 +02002797 switch (r) {
2798 case 1:
2799 vty_out(vty, "Warning: multiple threshold-high are not supported, overriding with %u%s",
2800 thresh_hi, VTY_NEWLINE);
2801 break;
2802 case EARFCN_THRESH_LOW_INVALID:
2803 vty_out(vty, "Warning: multiple threshold-low are not supported, overriding with %u%s",
2804 thresh_lo, VTY_NEWLINE);
2805 break;
2806 case EARFCN_QRXLV_INVALID + 1:
2807 vty_out(vty, "Warning: multiple QRXLEVMIN are not supported, overriding with %u%s",
2808 qrx, VTY_NEWLINE);
2809 break;
2810 case EARFCN_PRIO_INVALID:
2811 vty_out(vty, "Warning: multiple priorities are not supported, overriding with %u%s",
2812 prio, VTY_NEWLINE);
2813 break;
2814 default:
2815 if (r < 0) {
2816 vty_out(vty, "Unable to add ARFCN %u: %s%s", arfcn, strerror(-r), VTY_NEWLINE);
2817 return CMD_WARNING;
2818 }
Max59a1bf32016-04-15 16:04:46 +02002819 }
2820
Max70fdd242017-06-15 15:10:53 +02002821 if (si2q_num(bts) <= SI2Q_MAX_NUM)
Max2c16bee2017-02-15 13:51:37 +01002822 return CMD_SUCCESS;
2823
Maxf39d03a2017-05-12 17:00:30 +02002824 vty_out(vty, "Warning: not enough space in SI2quater (%u/%u used) for a given EARFCN %u%s",
Max70fdd242017-06-15 15:10:53 +02002825 bts->si2q_count, SI2Q_MAX_NUM, arfcn, VTY_NEWLINE);
Maxaafff962016-04-20 15:57:14 +02002826 osmo_earfcn_del(e, arfcn);
Max2c16bee2017-02-15 13:51:37 +01002827
Maxaafff962016-04-20 15:57:14 +02002828 return CMD_WARNING;
Max59a1bf32016-04-15 16:04:46 +02002829}
2830
2831DEFUN(cfg_bts_si2quater_neigh_del, cfg_bts_si2quater_neigh_del_cmd,
Max35697b92016-04-29 12:51:31 +02002832 "si2quater neighbor-list del earfcn <0-65535>",
Max59a1bf32016-04-15 16:04:46 +02002833 "SI2quater Neighbor List\n"
2834 "SI2quater Neighbor List\n"
2835 "Delete from SI2quater manual neighbor list\n"
Max36212f22016-04-20 12:06:05 +02002836 "EARFCN of neighbor\n"
2837 "EARFCN\n")
Max59a1bf32016-04-15 16:04:46 +02002838{
2839 struct gsm_bts *bts = vty->index;
2840 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
Max0c1bc262016-04-20 12:06:06 +02002841 uint16_t arfcn = atoi(argv[0]);
Max59a1bf32016-04-15 16:04:46 +02002842 int r = osmo_earfcn_del(e, arfcn);
2843 if (r < 0) {
2844 vty_out(vty, "Unable to delete arfcn %u: %s%s", arfcn,
Max0c1bc262016-04-20 12:06:06 +02002845 strerror(-r), VTY_NEWLINE);
Max59a1bf32016-04-15 16:04:46 +02002846 return CMD_WARNING;
2847 }
2848
2849 return CMD_SUCCESS;
2850}
2851
Max26679e02016-04-20 15:57:13 +02002852DEFUN(cfg_bts_si2quater_uarfcn_add, cfg_bts_si2quater_uarfcn_add_cmd,
Max35697b92016-04-29 12:51:31 +02002853 "si2quater neighbor-list add uarfcn <0-16383> <0-511> <0-1>",
Max26679e02016-04-20 15:57:13 +02002854 "SI2quater Neighbor List\n"
2855 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
2856 "UARFCN of neighbor\n" "UARFCN of neighbor\n" "scrambling code\n"
2857 "diversity bit\n")
2858{
2859 struct gsm_bts *bts = vty->index;
2860 uint16_t arfcn = atoi(argv[0]), scramble = atoi(argv[1]);
2861
2862 switch(bts_uarfcn_add(bts, arfcn, scramble, atoi(argv[2]))) {
2863 case -ENOMEM:
Max70fdd242017-06-15 15:10:53 +02002864 vty_out(vty, "Unable to add UARFCN: max number of UARFCNs (%u) reached%s", MAX_EARFCN_LIST, VTY_NEWLINE);
Harald Weltea191dcd2016-11-26 15:06:37 +01002865 return CMD_WARNING;
Maxaafff962016-04-20 15:57:14 +02002866 case -ENOSPC:
Max70fdd242017-06-15 15:10:53 +02002867 vty_out(vty, "Warning: not enough space in SI2quater for a given UARFCN (%u, %u)%s",
2868 arfcn, scramble, VTY_NEWLINE);
Harald Weltea191dcd2016-11-26 15:06:37 +01002869 return CMD_WARNING;
Max26679e02016-04-20 15:57:13 +02002870 case -EADDRINUSE:
Max70fdd242017-06-15 15:10:53 +02002871 vty_out(vty, "Unable to add UARFCN: (%u, %u) is already added%s", arfcn, scramble, VTY_NEWLINE);
Max26679e02016-04-20 15:57:13 +02002872 return CMD_WARNING;
2873 }
2874
2875 return CMD_SUCCESS;
2876}
2877
2878DEFUN(cfg_bts_si2quater_uarfcn_del, cfg_bts_si2quater_uarfcn_del_cmd,
Max35697b92016-04-29 12:51:31 +02002879 "si2quater neighbor-list del uarfcn <0-16383> <0-511>",
Max26679e02016-04-20 15:57:13 +02002880 "SI2quater Neighbor List\n"
2881 "SI2quater Neighbor List\n"
2882 "Delete from SI2quater manual neighbor list\n"
2883 "UARFCN of neighbor\n"
2884 "UARFCN\n"
2885 "scrambling code\n")
2886{
2887 struct gsm_bts *bts = vty->index;
2888
2889 if (bts_uarfcn_del(bts, atoi(argv[0]), atoi(argv[1])) < 0) {
2890 vty_out(vty, "Unable to delete uarfcn: pair not found%s",
2891 VTY_NEWLINE);
2892 return CMD_WARNING;
2893 }
2894
2895 return CMD_SUCCESS;
2896}
2897
Harald Welte64c07d22011-02-15 11:43:27 +01002898DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01002899 "si5 neighbor-list (add|del) arfcn <0-1023>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02002900 "SI5 Neighbor List\n"
Harald Welte64c07d22011-02-15 11:43:27 +01002901 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
2902 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
2903 "ARFCN of neighbor\n")
2904{
2905 struct gsm_bts *bts = vty->index;
2906 struct bitvec *bv = &bts->si_common.si5_neigh_list;
2907 uint16_t arfcn = atoi(argv[1]);
2908
2909 if (!bts->neigh_list_manual_mode) {
2910 vty_out(vty, "%% Cannot configure neighbor list in "
2911 "automatic mode%s", VTY_NEWLINE);
2912 return CMD_WARNING;
2913 }
2914
2915 if (!strcmp(argv[0], "add"))
2916 bitvec_set_bit_pos(bv, arfcn, 1);
2917 else
2918 bitvec_set_bit_pos(bv, arfcn, 0);
2919
2920 return CMD_SUCCESS;
2921}
Harald Welte9fbff4a2010-07-30 11:50:09 +02002922
Harald Welte8254cf72017-05-29 13:42:19 +02002923DEFUN(cfg_bts_pcu_sock, cfg_bts_pcu_sock_cmd,
2924 "pcu-socket PATH",
2925 "PCU Socket Path for using OsmoPCU co-located with BSC (legacy BTS)\n"
2926 "Path in the file system for the unix-domain PCU socket\n")
2927{
2928 struct gsm_bts *bts = vty->index;
2929 int rc;
2930
Harald Welte4a824ca2017-05-29 13:54:27 +02002931 osmo_talloc_replace_string(bts, &bts->pcu_sock_path, argv[0]);
Harald Welte8254cf72017-05-29 13:42:19 +02002932 pcu_sock_exit(bts);
2933 rc = pcu_sock_init(bts->pcu_sock_path, bts);
2934 if (rc < 0) {
2935 vty_out(vty, "%% Error creating PCU socket `%s' for BTS %u%s",
2936 bts->pcu_sock_path, bts->nr, VTY_NEWLINE);
2937 return CMD_WARNING;
2938 }
2939
2940 return CMD_SUCCESS;
2941}
2942
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02002943#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
2944
2945DEFUN(cfg_bts_excl_rf_lock,
2946 cfg_bts_excl_rf_lock_cmd,
2947 "rf-lock-exclude",
2948 EXCL_RFLOCK_STR)
2949{
2950 struct gsm_bts *bts = vty->index;
2951 bts->excl_from_rf_lock = 1;
2952 return CMD_SUCCESS;
2953}
2954
2955DEFUN(cfg_bts_no_excl_rf_lock,
2956 cfg_bts_no_excl_rf_lock_cmd,
2957 "no rf-lock-exclude",
2958 NO_STR EXCL_RFLOCK_STR)
2959{
2960 struct gsm_bts *bts = vty->index;
2961 bts->excl_from_rf_lock = 0;
2962 return CMD_SUCCESS;
2963}
2964
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01002965#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
2966
2967DEFUN(cfg_bts_force_comb_si,
2968 cfg_bts_force_comb_si_cmd,
2969 "force-combined-si",
2970 FORCE_COMB_SI_STR)
2971{
2972 struct gsm_bts *bts = vty->index;
2973 bts->force_combined_si = 1;
2974 return CMD_SUCCESS;
2975}
2976
2977DEFUN(cfg_bts_no_force_comb_si,
2978 cfg_bts_no_force_comb_si_cmd,
2979 "no force-combined-si",
2980 NO_STR FORCE_COMB_SI_STR)
2981{
2982 struct gsm_bts *bts = vty->index;
2983 bts->force_combined_si = 0;
2984 return CMD_SUCCESS;
2985}
2986
Andreas Eversberga83d5112013-12-07 18:32:28 +01002987static void _get_codec_from_arg(struct vty *vty, int argc, const char *argv[])
2988{
2989 struct gsm_bts *bts = vty->index;
2990 struct bts_codec_conf *codec = &bts->codec;
2991 int i;
2992
2993 codec->hr = 0;
2994 codec->efr = 0;
2995 codec->amr = 0;
2996 for (i = 0; i < argc; i++) {
2997 if (!strcmp(argv[i], "hr"))
2998 codec->hr = 1;
2999 if (!strcmp(argv[i], "efr"))
3000 codec->efr = 1;
3001 if (!strcmp(argv[i], "amr"))
3002 codec->amr = 1;
3003 }
3004}
3005
3006#define CODEC_PAR_STR " (hr|efr|amr)"
3007#define CODEC_HELP_STR "Half Rate\n" \
3008 "Enhanced Full Rate\nAdaptive Multirate\n"
3009
3010DEFUN(cfg_bts_codec0, cfg_bts_codec0_cmd,
3011 "codec-support fr",
3012 "Codec Support settings\nFullrate\n")
3013{
3014 _get_codec_from_arg(vty, 0, argv);
3015 return CMD_SUCCESS;
3016}
3017
3018DEFUN(cfg_bts_codec1, cfg_bts_codec1_cmd,
3019 "codec-support fr" CODEC_PAR_STR,
3020 "Codec Support settings\nFullrate\n"
3021 CODEC_HELP_STR)
3022{
3023 _get_codec_from_arg(vty, 1, argv);
3024 return CMD_SUCCESS;
3025}
3026
3027DEFUN(cfg_bts_codec2, cfg_bts_codec2_cmd,
3028 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR,
3029 "Codec Support settings\nFullrate\n"
3030 CODEC_HELP_STR CODEC_HELP_STR)
3031{
3032 _get_codec_from_arg(vty, 2, argv);
3033 return CMD_SUCCESS;
3034}
3035
3036DEFUN(cfg_bts_codec3, cfg_bts_codec3_cmd,
3037 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
3038 "Codec Support settings\nFullrate\n"
3039 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
3040{
3041 _get_codec_from_arg(vty, 3, argv);
3042 return CMD_SUCCESS;
3043}
3044
3045DEFUN(cfg_bts_codec4, cfg_bts_codec4_cmd,
3046 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
3047 "Codec Support settings\nFullrate\n"
3048 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
3049{
3050 _get_codec_from_arg(vty, 4, argv);
3051 return CMD_SUCCESS;
3052}
3053
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01003054DEFUN(cfg_bts_depends_on, cfg_bts_depends_on_cmd,
3055 "depends-on-bts <0-255>",
3056 "This BTS can only be started if another one is up\n" "BTS Number\n")
3057{
3058 struct gsm_bts *bts = vty->index;
3059 struct gsm_bts *other_bts;
3060 int dep = atoi(argv[0]);
3061
3062
3063 if (!is_ipaccess_bts(bts)) {
3064 vty_out(vty, "This feature is only available for IP systems.%s",
3065 VTY_NEWLINE);
3066 return CMD_WARNING;
3067 }
3068
3069 other_bts = gsm_bts_num(bts->network, dep);
3070 if (!other_bts || !is_ipaccess_bts(other_bts)) {
3071 vty_out(vty, "This feature is only available for IP systems.%s",
3072 VTY_NEWLINE);
3073 return CMD_WARNING;
3074 }
3075
3076 if (dep >= bts->nr) {
3077 vty_out(vty, "%%Need to depend on an already declared unit.%s",
3078 VTY_NEWLINE);
3079 return CMD_WARNING;
3080 }
3081
3082 bts_depend_mark(bts, dep);
3083 return CMD_SUCCESS;
3084}
3085
3086DEFUN(cfg_bts_no_depends_on, cfg_bts_no_depends_on_cmd,
3087 "depeneds-on-bts <0-255>",
3088 NO_STR "This BTS can only be started if another one is up\n"
3089 "BTS Number\n")
3090{
3091 struct gsm_bts *bts = vty->index;
3092 int dep = atoi(argv[0]);
3093
3094 bts_depend_clear(bts, dep);
3095 return CMD_SUCCESS;
3096}
3097
Andreas Eversberg73266522014-01-19 11:47:44 +01003098#define AMR_TEXT "Adaptive Multi Rate settings\n"
3099#define AMR_MODE_TEXT "Codec modes to use with AMR codec\n"
3100#define AMR_START_TEXT "Initial codec to use with AMR\n" \
3101 "Automatically\nFirst codec\nSecond codec\nThird codec\nFourth codec\n"
3102#define AMR_TH_TEXT "AMR threshold between codecs\nMS side\nBTS side\n"
3103#define AMR_HY_TEXT "AMR hysteresis between codecs\nMS side\nBTS side\n"
3104
3105static void get_amr_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3106{
3107 struct gsm_bts *bts = vty->index;
3108 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3109 struct gsm48_multi_rate_conf *mr_conf =
3110 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3111 int i;
3112
3113 mr->gsm48_ie[1] = 0;
3114 for (i = 0; i < argc; i++)
3115 mr->gsm48_ie[1] |= 1 << atoi(argv[i]);
3116 mr_conf->icmi = 0;
3117}
3118
3119static void get_amr_th_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3120{
3121 struct gsm_bts *bts = vty->index;
3122 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003123 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003124 int i;
3125
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003126 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3127 for (i = 0; i < argc - 1; i++)
3128 modes[i].threshold = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003129}
3130
3131static void get_amr_hy_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3132{
3133 struct gsm_bts *bts = vty->index;
3134 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003135 struct amr_mode *modes;
Andreas Eversberg73266522014-01-19 11:47:44 +01003136 int i;
3137
Holger Hans Peter Freythera174a472015-09-24 11:39:38 +02003138 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3139 for (i = 0; i < argc - 1; i++)
3140 modes[i].hysteresis = atoi(argv[i + 1]);
Andreas Eversberg73266522014-01-19 11:47:44 +01003141}
3142
3143static void get_amr_start_from_arg(struct vty *vty, const char *argv[], int full)
3144{
3145 struct gsm_bts *bts = vty->index;
3146 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3147 struct gsm48_multi_rate_conf *mr_conf =
3148 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3149 int num = 0, i;
3150
3151 for (i = 0; i < ((full) ? 8 : 6); i++) {
3152 if ((mr->gsm48_ie[1] & (1 << i))) {
3153 num++;
3154 }
3155 }
3156
3157 if (argv[0][0] == 'a' || num == 0)
3158 mr_conf->icmi = 0;
3159 else {
3160 mr_conf->icmi = 1;
3161 if (num < atoi(argv[0]))
3162 mr_conf->smod = num - 1;
3163 else
3164 mr_conf->smod = atoi(argv[0]) - 1;
3165 }
3166}
3167
3168#define AMR_TCHF_PAR_STR " (0|1|2|3|4|5|6|7)"
3169#define AMR_TCHF_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n" \
3170 "10,2k\n12,2k\n"
3171
3172#define AMR_TCHH_PAR_STR " (0|1|2|3|4|5)"
3173#define AMR_TCHH_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n"
3174
3175#define AMR_TH_HELP_STR "Threshold between codec 1 and 2\n"
3176#define AMR_HY_HELP_STR "Hysteresis between codec 1 and 2\n"
3177
3178DEFUN(cfg_bts_amr_fr_modes1, cfg_bts_amr_fr_modes1_cmd,
3179 "amr tch-f modes" AMR_TCHF_PAR_STR,
3180 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3181 AMR_TCHF_HELP_STR)
3182{
3183 get_amr_from_arg(vty, 1, argv, 1);
3184 return CMD_SUCCESS;
3185}
3186
3187DEFUN(cfg_bts_amr_fr_modes2, cfg_bts_amr_fr_modes2_cmd,
3188 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3189 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3190 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3191{
3192 get_amr_from_arg(vty, 2, argv, 1);
3193 return CMD_SUCCESS;
3194}
3195
3196DEFUN(cfg_bts_amr_fr_modes3, cfg_bts_amr_fr_modes3_cmd,
3197 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3198 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3199 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3200{
3201 get_amr_from_arg(vty, 3, argv, 1);
3202 return CMD_SUCCESS;
3203}
3204
3205DEFUN(cfg_bts_amr_fr_modes4, cfg_bts_amr_fr_modes4_cmd,
3206 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR 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 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3209{
3210 get_amr_from_arg(vty, 4, argv, 1);
3211 return CMD_SUCCESS;
3212}
3213
3214DEFUN(cfg_bts_amr_fr_start_mode, cfg_bts_amr_fr_start_mode_cmd,
3215 "amr tch-f start-mode (auto|1|2|3|4)",
3216 AMR_TEXT "Full Rate\n" AMR_START_TEXT)
3217{
3218 get_amr_start_from_arg(vty, argv, 1);
3219 return CMD_SUCCESS;
3220}
3221
3222DEFUN(cfg_bts_amr_fr_thres1, cfg_bts_amr_fr_thres1_cmd,
3223 "amr tch-f threshold (ms|bts) <0-63>",
3224 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3225 AMR_TH_HELP_STR)
3226{
3227 get_amr_th_from_arg(vty, 2, argv, 1);
3228 return CMD_SUCCESS;
3229}
3230
3231DEFUN(cfg_bts_amr_fr_thres2, cfg_bts_amr_fr_thres2_cmd,
3232 "amr tch-f threshold (ms|bts) <0-63> <0-63>",
3233 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3234 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3235{
3236 get_amr_th_from_arg(vty, 3, argv, 1);
3237 return CMD_SUCCESS;
3238}
3239
3240DEFUN(cfg_bts_amr_fr_thres3, cfg_bts_amr_fr_thres3_cmd,
3241 "amr tch-f threshold (ms|bts) <0-63> <0-63> <0-63>",
3242 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3243 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3244{
3245 get_amr_th_from_arg(vty, 4, argv, 1);
3246 return CMD_SUCCESS;
3247}
3248
3249DEFUN(cfg_bts_amr_fr_hyst1, cfg_bts_amr_fr_hyst1_cmd,
3250 "amr tch-f hysteresis (ms|bts) <0-15>",
3251 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3252 AMR_HY_HELP_STR)
3253{
3254 get_amr_hy_from_arg(vty, 2, argv, 1);
3255 return CMD_SUCCESS;
3256}
3257
3258DEFUN(cfg_bts_amr_fr_hyst2, cfg_bts_amr_fr_hyst2_cmd,
3259 "amr tch-f hysteresis (ms|bts) <0-15> <0-15>",
3260 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3261 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3262{
3263 get_amr_hy_from_arg(vty, 3, argv, 1);
3264 return CMD_SUCCESS;
3265}
3266
3267DEFUN(cfg_bts_amr_fr_hyst3, cfg_bts_amr_fr_hyst3_cmd,
3268 "amr tch-f hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3269 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3270 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3271{
3272 get_amr_hy_from_arg(vty, 4, argv, 1);
3273 return CMD_SUCCESS;
3274}
3275
3276DEFUN(cfg_bts_amr_hr_modes1, cfg_bts_amr_hr_modes1_cmd,
3277 "amr tch-h modes" AMR_TCHH_PAR_STR,
3278 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3279 AMR_TCHH_HELP_STR)
3280{
3281 get_amr_from_arg(vty, 1, argv, 0);
3282 return CMD_SUCCESS;
3283}
3284
3285DEFUN(cfg_bts_amr_hr_modes2, cfg_bts_amr_hr_modes2_cmd,
3286 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3287 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3288 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3289{
3290 get_amr_from_arg(vty, 2, argv, 0);
3291 return CMD_SUCCESS;
3292}
3293
3294DEFUN(cfg_bts_amr_hr_modes3, cfg_bts_amr_hr_modes3_cmd,
3295 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3296 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3297 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3298{
3299 get_amr_from_arg(vty, 3, argv, 0);
3300 return CMD_SUCCESS;
3301}
3302
3303DEFUN(cfg_bts_amr_hr_modes4, cfg_bts_amr_hr_modes4_cmd,
3304 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR 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 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3307{
3308 get_amr_from_arg(vty, 4, argv, 0);
3309 return CMD_SUCCESS;
3310}
3311
3312DEFUN(cfg_bts_amr_hr_start_mode, cfg_bts_amr_hr_start_mode_cmd,
3313 "amr tch-h start-mode (auto|1|2|3|4)",
3314 AMR_TEXT "Half Rate\n" AMR_START_TEXT)
3315{
3316 get_amr_start_from_arg(vty, argv, 0);
3317 return CMD_SUCCESS;
3318}
3319
3320DEFUN(cfg_bts_amr_hr_thres1, cfg_bts_amr_hr_thres1_cmd,
3321 "amr tch-h threshold (ms|bts) <0-63>",
3322 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3323 AMR_TH_HELP_STR)
3324{
3325 get_amr_th_from_arg(vty, 2, argv, 0);
3326 return CMD_SUCCESS;
3327}
3328
3329DEFUN(cfg_bts_amr_hr_thres2, cfg_bts_amr_hr_thres2_cmd,
3330 "amr tch-h threshold (ms|bts) <0-63> <0-63>",
3331 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3332 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3333{
3334 get_amr_th_from_arg(vty, 3, argv, 0);
3335 return CMD_SUCCESS;
3336}
3337
3338DEFUN(cfg_bts_amr_hr_thres3, cfg_bts_amr_hr_thres3_cmd,
3339 "amr tch-h threshold (ms|bts) <0-63> <0-63> <0-63>",
3340 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3341 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3342{
3343 get_amr_th_from_arg(vty, 4, argv, 0);
3344 return CMD_SUCCESS;
3345}
3346
3347DEFUN(cfg_bts_amr_hr_hyst1, cfg_bts_amr_hr_hyst1_cmd,
3348 "amr tch-h hysteresis (ms|bts) <0-15>",
3349 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3350 AMR_HY_HELP_STR)
3351{
3352 get_amr_hy_from_arg(vty, 2, argv, 0);
3353 return CMD_SUCCESS;
3354}
3355
3356DEFUN(cfg_bts_amr_hr_hyst2, cfg_bts_amr_hr_hyst2_cmd,
3357 "amr tch-h hysteresis (ms|bts) <0-15> <0-15>",
3358 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3359 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3360{
3361 get_amr_hy_from_arg(vty, 3, argv, 0);
3362 return CMD_SUCCESS;
3363}
3364
3365DEFUN(cfg_bts_amr_hr_hyst3, cfg_bts_amr_hr_hyst3_cmd,
3366 "amr tch-h hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3367 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3368 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3369{
3370 get_amr_hy_from_arg(vty, 4, argv, 0);
3371 return CMD_SUCCESS;
3372}
3373
Harald Welte8f0ed552010-05-11 21:53:49 +02003374#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02003375
Harald Welte5258fc42009-03-28 19:07:53 +00003376/* per TRX configuration */
3377DEFUN(cfg_trx,
3378 cfg_trx_cmd,
Harald Welte57e07242012-08-17 12:50:14 +02003379 "trx <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02003380 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00003381 "Select a TRX to configure")
3382{
3383 int trx_nr = atoi(argv[0]);
3384 struct gsm_bts *bts = vty->index;
3385 struct gsm_bts_trx *trx;
3386
Harald Weltee441d9c2009-06-21 16:17:15 +02003387 if (trx_nr > bts->num_trx) {
3388 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
3389 bts->num_trx, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00003390 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02003391 } else if (trx_nr == bts->num_trx) {
3392 /* we need to allocate a new one */
3393 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003394 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02003395 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02003396
Harald Weltee441d9c2009-06-21 16:17:15 +02003397 if (!trx)
3398 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00003399
3400 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02003401 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00003402 vty->node = TRX_NODE;
3403
3404 return CMD_SUCCESS;
3405}
3406
3407DEFUN(cfg_trx_arfcn,
3408 cfg_trx_arfcn_cmd,
Harald Welte1fe73a12012-01-29 13:24:12 +01003409 "arfcn <0-1023>",
Harald Welte13fe2192012-08-17 09:57:25 +02003410 "Set the ARFCN for this TRX\n"
3411 "Absolute Radio Frequency Channel Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003412{
3413 int arfcn = atoi(argv[0]);
3414 struct gsm_bts_trx *trx = vty->index;
3415
3416 /* FIXME: check if this ARFCN is supported by this TRX */
3417
3418 trx->arfcn = arfcn;
3419
3420 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
3421 /* FIXME: use OML layer to update the ARFCN */
3422 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
3423
3424 return CMD_SUCCESS;
3425}
3426
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003427DEFUN(cfg_trx_nominal_power,
3428 cfg_trx_nominal_power_cmd,
3429 "nominal power <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003430 "Nominal TRX RF Power in dBm\n"
3431 "Nominal TRX RF Power in dBm\n"
3432 "Nominal TRX RF Power in dBm\n")
Harald Welte (local)7b37d972009-12-27 20:56:38 +01003433{
3434 struct gsm_bts_trx *trx = vty->index;
3435
3436 trx->nominal_power = atoi(argv[0]);
3437
3438 return CMD_SUCCESS;
3439}
3440
Harald Weltefcd24452009-06-20 18:15:19 +02003441DEFUN(cfg_trx_max_power_red,
3442 cfg_trx_max_power_red_cmd,
3443 "max_power_red <0-100>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003444 "Reduction of maximum BS RF Power (relative to nominal power)\n"
Harald Weltefcd24452009-06-20 18:15:19 +02003445 "Reduction of maximum BS RF Power in dB\n")
3446{
3447 int maxpwr_r = atoi(argv[0]);
3448 struct gsm_bts_trx *trx = vty->index;
Harald Welte61a83b22009-11-18 09:20:22 +01003449 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-06-20 18:15:19 +02003450
3451 /* FIXME: check if our BTS type supports more than 12 */
3452 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
3453 vty_out(vty, "%% Power %d dB is not in the valid range%s",
3454 maxpwr_r, VTY_NEWLINE);
3455 return CMD_WARNING;
3456 }
3457 if (maxpwr_r & 1) {
3458 vty_out(vty, "%% Power %d dB is not an even value%s",
3459 maxpwr_r, VTY_NEWLINE);
3460 return CMD_WARNING;
3461 }
3462
3463 trx->max_power_red = maxpwr_r;
3464
3465 /* FIXME: make sure we update this using OML */
3466
3467 return CMD_SUCCESS;
3468}
3469
Harald Welte42581822009-08-08 16:12:58 +02003470DEFUN(cfg_trx_rsl_e1,
3471 cfg_trx_rsl_e1_cmd,
3472 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003473 "RSL Parameters\n"
3474 "E1/T1 interface to be used for RSL\n"
3475 "E1/T1 interface to be used for RSL\n"
3476 "E1/T1 Line Number to be used for RSL\n"
3477 "E1/T1 Timeslot to be used for RSL\n"
3478 "E1/T1 Timeslot to be used for RSL\n"
3479 "E1/T1 Sub-slot to be used for RSL\n"
3480 "E1/T1 Sub-slot 0 is to be used for RSL\n"
3481 "E1/T1 Sub-slot 1 is to be used for RSL\n"
3482 "E1/T1 Sub-slot 2 is to be used for RSL\n"
3483 "E1/T1 Sub-slot 3 is to be used for RSL\n"
3484 "E1/T1 full timeslot is to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003485{
3486 struct gsm_bts_trx *trx = vty->index;
3487
3488 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
3489
3490 return CMD_SUCCESS;
3491}
3492
3493DEFUN(cfg_trx_rsl_e1_tei,
3494 cfg_trx_rsl_e1_tei_cmd,
3495 "rsl e1 tei <0-63>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003496 "RSL Parameters\n"
3497 "Set the TEI to be used for RSL\n"
3498 "Set the TEI to be used for RSL\n"
3499 "TEI to be used for RSL\n")
Harald Welte42581822009-08-08 16:12:58 +02003500{
3501 struct gsm_bts_trx *trx = vty->index;
3502
3503 trx->rsl_tei = atoi(argv[0]);
3504
3505 return CMD_SUCCESS;
3506}
3507
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003508DEFUN(cfg_trx_rf_locked,
3509 cfg_trx_rf_locked_cmd,
3510 "rf_locked (0|1)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003511 "Set or unset the RF Locking (Turn off RF of the TRX)\n"
3512 "TRX is NOT RF locked (active)\n"
3513 "TRX is RF locked (turned off)\n")
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01003514{
3515 int locked = atoi(argv[0]);
3516 struct gsm_bts_trx *trx = vty->index;
3517
3518 gsm_trx_lock_rf(trx, locked);
3519 return CMD_SUCCESS;
3520}
Harald Welte42581822009-08-08 16:12:58 +02003521
Harald Welte5258fc42009-03-28 19:07:53 +00003522/* per TS configuration */
3523DEFUN(cfg_ts,
3524 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003525 "timeslot <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003526 "Select a Timeslot to configure\n"
3527 "Timeslot number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00003528{
3529 int ts_nr = atoi(argv[0]);
3530 struct gsm_bts_trx *trx = vty->index;
3531 struct gsm_bts_trx_ts *ts;
3532
3533 if (ts_nr >= TRX_NR_TS) {
3534 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
3535 TRX_NR_TS, VTY_NEWLINE);
3536 return CMD_WARNING;
3537 }
3538
3539 ts = &trx->ts[ts_nr];
3540
3541 vty->index = ts;
3542 vty->node = TS_NODE;
3543
3544 return CMD_SUCCESS;
3545}
3546
Harald Weltea6fd58e2009-08-07 00:25:23 +02003547DEFUN(cfg_ts_pchan,
3548 cfg_ts_pchan_cmd,
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003549 "phys_chan_config PCHAN", /* dynamically generated! */
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003550 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003551{
3552 struct gsm_bts_trx_ts *ts = vty->index;
3553 int pchanc;
3554
3555 pchanc = gsm_pchan_parse(argv[0]);
3556 if (pchanc < 0)
3557 return CMD_WARNING;
3558
3559 ts->pchan = pchanc;
3560
3561 return CMD_SUCCESS;
3562}
3563
3564/* used for backwards compatibility with old config files that still
3565 * have uppercase pchan type names */
3566DEFUN_HIDDEN(cfg_ts_pchan_compat,
3567 cfg_ts_pchan_compat_cmd,
Harald Weltea6fd58e2009-08-07 00:25:23 +02003568 "phys_chan_config PCHAN",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +01003569 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003570{
3571 struct gsm_bts_trx_ts *ts = vty->index;
3572 int pchanc;
3573
3574 pchanc = gsm_pchan_parse(argv[0]);
3575 if (pchanc < 0)
3576 return CMD_WARNING;
3577
3578 ts->pchan = pchanc;
3579
3580 return CMD_SUCCESS;
3581}
3582
Harald Welte4ab9d7c2012-08-17 12:42:06 +02003583
3584
Harald Welte135a6482011-05-30 12:09:13 +02003585DEFUN(cfg_ts_tsc,
3586 cfg_ts_tsc_cmd,
3587 "training_sequence_code <0-7>",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003588 "Training Sequence Code of the Timeslot\n" "TSC\n")
Harald Welte135a6482011-05-30 12:09:13 +02003589{
3590 struct gsm_bts_trx_ts *ts = vty->index;
3591
Max71d082b2017-05-30 15:03:38 +02003592 if (!gsm_btsmodel_has_feature(ts->trx->bts->model, BTS_FEAT_MULTI_TSC)) {
Harald Welte903aaea2014-01-19 17:10:50 +01003593 vty_out(vty, "%% This BTS does not support a TSC != BCC, "
3594 "falling back to BCC%s", VTY_NEWLINE);
3595 ts->tsc = -1;
3596 return CMD_WARNING;
3597 }
3598
Harald Welte135a6482011-05-30 12:09:13 +02003599 ts->tsc = atoi(argv[0]);
3600
3601 return CMD_SUCCESS;
3602}
3603
Harald Weltea39b0f22010-06-14 22:26:10 +02003604#define HOPPING_STR "Configure frequency hopping\n"
3605
3606DEFUN(cfg_ts_hopping,
3607 cfg_ts_hopping_cmd,
3608 "hopping enabled (0|1)",
3609 HOPPING_STR "Enable or disable frequency hopping\n"
3610 "Disable frequency hopping\n" "Enable frequency hopping\n")
3611{
3612 struct gsm_bts_trx_ts *ts = vty->index;
Harald Weltec2fb3d02010-06-14 22:47:37 +02003613 int enabled = atoi(argv[0]);
Harald Weltea39b0f22010-06-14 22:26:10 +02003614
Max71d082b2017-05-30 15:03:38 +02003615 if (enabled && !gsm_btsmodel_has_feature(ts->trx->bts->model, BTS_FEAT_HOPPING)) {
Harald Weltec2fb3d02010-06-14 22:47:37 +02003616 vty_out(vty, "BTS model does not support hopping%s",
3617 VTY_NEWLINE);
3618 return CMD_WARNING;
3619 }
3620
3621 ts->hopping.enabled = enabled;
Harald Weltea39b0f22010-06-14 22:26:10 +02003622
3623 return CMD_SUCCESS;
3624}
3625
Harald Welte6e0cd042009-09-12 13:05:33 +02003626DEFUN(cfg_ts_hsn,
3627 cfg_ts_hsn_cmd,
Harald Weltea39b0f22010-06-14 22:26:10 +02003628 "hopping sequence-number <0-63>",
3629 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003630 "Which hopping sequence to use for this channel\n"
3631 "Hopping Sequence Number (HSN)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003632{
3633 struct gsm_bts_trx_ts *ts = vty->index;
3634
3635 ts->hopping.hsn = atoi(argv[0]);
3636
3637 return CMD_SUCCESS;
3638}
3639
3640DEFUN(cfg_ts_maio,
3641 cfg_ts_maio_cmd,
3642 "hopping maio <0-63>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003643 HOPPING_STR
Harald Weltecfaabbb2012-08-16 23:23:50 +02003644 "Which hopping MAIO to use for this channel\n"
3645 "Mobile Allocation Index Offset (MAIO)\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003646{
3647 struct gsm_bts_trx_ts *ts = vty->index;
3648
3649 ts->hopping.maio = atoi(argv[0]);
3650
3651 return CMD_SUCCESS;
3652}
3653
3654DEFUN(cfg_ts_arfcn_add,
3655 cfg_ts_arfcn_add_cmd,
3656 "hopping arfcn add <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003657 HOPPING_STR "Configure hopping ARFCN list\n"
3658 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003659{
3660 struct gsm_bts_trx_ts *ts = vty->index;
3661 int arfcn = atoi(argv[0]);
3662
Harald Weltea39b0f22010-06-14 22:26:10 +02003663 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
3664
Harald Welte6e0cd042009-09-12 13:05:33 +02003665 return CMD_SUCCESS;
3666}
3667
3668DEFUN(cfg_ts_arfcn_del,
3669 cfg_ts_arfcn_del_cmd,
3670 "hopping arfcn del <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02003671 HOPPING_STR "Configure hopping ARFCN list\n"
3672 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02003673{
3674 struct gsm_bts_trx_ts *ts = vty->index;
3675 int arfcn = atoi(argv[0]);
3676
Harald Weltea39b0f22010-06-14 22:26:10 +02003677 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
3678
Harald Welte6e0cd042009-09-12 13:05:33 +02003679 return CMD_SUCCESS;
3680}
3681
Harald Weltea6fd58e2009-08-07 00:25:23 +02003682DEFUN(cfg_ts_e1_subslot,
3683 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02003684 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003685 "E1/T1 channel connected to this on-air timeslot\n"
3686 "E1/T1 channel connected to this on-air timeslot\n"
3687 "E1/T1 line connected to this on-air timeslot\n"
Harald Welted13e0cd2012-08-17 09:52:03 +02003688 "E1/T1 timeslot connected to this on-air timeslot\n"
3689 "E1/T1 timeslot connected to this on-air timeslot\n"
Harald Weltecfaabbb2012-08-16 23:23:50 +02003690 "E1/T1 sub-slot connected to this on-air timeslot\n"
3691 "E1/T1 sub-slot 0 connected to this on-air timeslot\n"
3692 "E1/T1 sub-slot 1 connected to this on-air timeslot\n"
3693 "E1/T1 sub-slot 2 connected to this on-air timeslot\n"
3694 "E1/T1 sub-slot 3 connected to this on-air timeslot\n"
3695 "Full E1/T1 timeslot connected to this on-air timeslot\n")
Harald Weltea6fd58e2009-08-07 00:25:23 +02003696{
3697 struct gsm_bts_trx_ts *ts = vty->index;
3698
Harald Welte42581822009-08-08 16:12:58 +02003699 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02003700
3701 return CMD_SUCCESS;
3702}
Harald Welte5258fc42009-03-28 19:07:53 +00003703
Harald Welte4f10c252010-05-16 21:47:13 +02003704void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
3705{
3706 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003707 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_TOTAL].current,
3708 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_NO_CHANNEL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003709 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003710 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003711 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RF_FAIL].current,
3712 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RLL_ERR].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003713 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003714 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003715 net->bsc_ctrs->ctr[BSC_CTR_PAGING_ATTEMPTED].current,
3716 net->bsc_ctrs->ctr[BSC_CTR_PAGING_COMPLETED].current,
3717 net->bsc_ctrs->ctr[BSC_CTR_PAGING_EXPIRED].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003718 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003719 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
Alexander Couzensb847a212016-08-02 11:34:11 +02003720 net->bsc_ctrs->ctr[BSC_CTR_BTS_OML_FAIL].current,
3721 net->bsc_ctrs->ctr[BSC_CTR_BTS_RSL_FAIL].current,
Alexander Couzens20423ea2016-07-12 15:42:02 +02003722 VTY_NEWLINE);
Harald Welte4f10c252010-05-16 21:47:13 +02003723}
3724
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003725DEFUN(drop_bts,
3726 drop_bts_cmd,
Holger Hans Peter Freyther0586b0f2010-04-11 12:46:45 +02003727 "drop bts connection <0-65535> (oml|rsl)",
Harald Weltecfaabbb2012-08-16 23:23:50 +02003728 "Debug/Simulation command to drop Abis/IP BTS\n"
3729 "Debug/Simulation command to drop Abis/IP BTS\n"
3730 "Debug/Simulation command to drop Abis/IP BTS\n"
3731 "BTS NR\n" "Drop OML Connection\n" "Drop RSL Connection\n")
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003732{
3733 struct gsm_network *gsmnet;
3734 struct gsm_bts_trx *trx;
3735 struct gsm_bts *bts;
3736 unsigned int bts_nr;
3737
3738 gsmnet = gsmnet_from_vty(vty);
3739
3740 bts_nr = atoi(argv[0]);
3741 if (bts_nr >= gsmnet->num_bts) {
3742 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3743 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3744 return CMD_WARNING;
3745 }
3746
3747 bts = gsm_bts_num(gsmnet, bts_nr);
3748 if (!bts) {
3749 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3750 return CMD_WARNING;
3751 }
3752
3753 if (!is_ipaccess_bts(bts)) {
3754 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
3755 return CMD_WARNING;
3756 }
3757
3758
3759 /* close all connections */
3760 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003761 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003762 } else if (strcmp(argv[1], "rsl") == 0) {
3763 /* close all rsl connections */
3764 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +01003765 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003766 }
3767 } else {
3768 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
3769 return CMD_WARNING;
3770 }
3771
3772 return CMD_SUCCESS;
3773}
3774
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01003775DEFUN(restart_bts, restart_bts_cmd,
3776 "restart-bts <0-65535>",
3777 "Restart ip.access nanoBTS through OML\n"
3778 "BTS Number\n")
3779{
3780 struct gsm_network *gsmnet;
3781 struct gsm_bts_trx *trx;
3782 struct gsm_bts *bts;
3783 unsigned int bts_nr;
3784
3785 gsmnet = gsmnet_from_vty(vty);
3786
3787 bts_nr = atoi(argv[0]);
3788 if (bts_nr >= gsmnet->num_bts) {
3789 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3790 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3791 return CMD_WARNING;
3792 }
3793
3794 bts = gsm_bts_num(gsmnet, bts_nr);
3795 if (!bts) {
3796 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3797 return CMD_WARNING;
3798 }
3799
3800 if (!is_ipaccess_bts(bts) || is_sysmobts_v2(bts)) {
3801 vty_out(vty, "This command only works for ipaccess nanoBTS.%s",
3802 VTY_NEWLINE);
3803 return CMD_WARNING;
3804 }
3805
3806 /* go from last TRX to c0 */
3807 llist_for_each_entry_reverse(trx, &bts->trx_list, list)
3808 abis_nm_ipaccess_restart(trx);
3809
3810 return CMD_SUCCESS;
3811}
3812
Harald Welte30f1f372014-12-28 15:00:45 +01003813DEFUN(smscb_cmd, smscb_cmd_cmd,
3814 "bts <0-255> smscb-command <1-4> HEXSTRING",
3815 "BTS related commands\n" "BTS Number\n"
3816 "SMS Cell Broadcast\n" "Last Valid Block\n"
3817 "Hex Encoded SMSCB message (up to 88 octets)\n")
3818{
3819 struct gsm_bts *bts;
3820 int bts_nr = atoi(argv[0]);
3821 int last_block = atoi(argv[1]);
3822 struct rsl_ie_cb_cmd_type cb_cmd;
3823 uint8_t buf[88];
3824 int rc;
3825
Neels Hofmeyrb90eabf2016-05-11 18:48:39 +02003826 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
Harald Welte30f1f372014-12-28 15:00:45 +01003827 if (!bts) {
3828 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3829 return CMD_WARNING;
3830 }
3831 rc = osmo_hexparse(argv[2], buf, sizeof(buf));
3832 if (rc < 0 || rc > sizeof(buf)) {
3833 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
3834 return CMD_WARNING;
3835 }
3836
3837 cb_cmd.spare = 0;
3838 cb_cmd.def_bcast = 0;
3839 cb_cmd.command = RSL_CB_CMD_TYPE_NORMAL;
3840
3841 switch (last_block) {
3842 case 1:
3843 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_1;
3844 break;
3845 case 2:
3846 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_2;
3847 break;
3848 case 3:
3849 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_3;
3850 break;
3851 case 4:
3852 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_4;
3853 break;
3854 }
3855
3856 rsl_sms_cb_command(bts, RSL_CHAN_SDCCH4_ACCH, cb_cmd, buf, rc);
3857
3858 return CMD_SUCCESS;
3859}
3860
Harald Welte7fe00fb2017-05-27 14:09:50 +02003861/* resolve a gsm_bts_trx_ts basd on the given numeric identifiers */
Harald Welte645eb622017-05-27 15:52:58 +02003862static struct gsm_bts_trx_ts *vty_get_ts(struct vty *vty, const char *bts_str, const char *trx_str,
3863 const char *ts_str)
Harald Welte7fe00fb2017-05-27 14:09:50 +02003864{
Harald Welte645eb622017-05-27 15:52:58 +02003865 int bts_nr = atoi(bts_str);
3866 int trx_nr = atoi(trx_str);
3867 int ts_nr = atoi(ts_str);
Harald Welte7fe00fb2017-05-27 14:09:50 +02003868 struct gsm_bts *bts;
3869 struct gsm_bts_trx *trx;
3870 struct gsm_bts_trx_ts *ts;
3871
3872 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
3873 if (!bts) {
3874 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3875 return NULL;
3876 }
3877
3878 trx = gsm_bts_trx_num(bts, trx_nr);
3879 if (!trx) {
3880 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
3881 return NULL;
3882 }
3883
3884 ts = &trx->ts[ts_nr];
3885
3886 return ts;
3887}
Harald Welte30f1f372014-12-28 15:00:45 +01003888
Harald Welted0d2b0b2010-12-23 13:18:07 +01003889DEFUN(pdch_act, pdch_act_cmd,
3890 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
3891 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3892 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
3893 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
3894 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
3895{
Harald Welted0d2b0b2010-12-23 13:18:07 +01003896 struct gsm_bts_trx_ts *ts;
Harald Welted0d2b0b2010-12-23 13:18:07 +01003897 int activate;
3898
Harald Welte645eb622017-05-27 15:52:58 +02003899 ts = vty_get_ts(vty, argv[0], argv[1], argv[2]);
Harald Welte7fe00fb2017-05-27 14:09:50 +02003900 if (!ts)
Harald Welted0d2b0b2010-12-23 13:18:07 +01003901 return CMD_WARNING;
Harald Welted0d2b0b2010-12-23 13:18:07 +01003902
Harald Welte7fe00fb2017-05-27 14:09:50 +02003903 if (!is_ipaccess_bts(ts->trx->bts)) {
Harald Welted0d2b0b2010-12-23 13:18:07 +01003904 vty_out(vty, "%% This command only works for ipaccess BTS%s",
3905 VTY_NEWLINE);
3906 return CMD_WARNING;
3907 }
3908
Harald Welted0d2b0b2010-12-23 13:18:07 +01003909 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
3910 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
Harald Welte645eb622017-05-27 15:52:58 +02003911 "mode%s", ts->nr, VTY_NEWLINE);
Harald Welted0d2b0b2010-12-23 13:18:07 +01003912 return CMD_WARNING;
3913 }
3914
3915 if (!strcmp(argv[3], "activate"))
3916 activate = 1;
3917 else
3918 activate = 0;
3919
3920 rsl_ipacc_pdch_activate(ts, activate);
3921
3922 return CMD_SUCCESS;
3923
3924}
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02003925
Harald Welte2abd5e12017-05-27 14:10:40 +02003926/* determine the logical channel type based on the physical channel type */
3927static int lchan_type_by_pchan(enum gsm_phys_chan_config pchan)
3928{
3929 switch (pchan) {
3930 case GSM_PCHAN_TCH_F:
3931 return GSM_LCHAN_TCH_F;
3932 case GSM_PCHAN_TCH_H:
3933 return GSM_LCHAN_TCH_H;
3934 case GSM_PCHAN_SDCCH8_SACCH8C:
3935 case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:
3936 case GSM_PCHAN_CCCH_SDCCH4:
3937 case GSM_PCHAN_CCCH_SDCCH4_CBCH:
3938 return GSM_LCHAN_SDCCH;
3939 default:
3940 return -1;
3941 }
3942}
3943
3944/* configure the lchan for a single AMR mode (as specified) */
3945static int lchan_set_single_amr_mode(struct gsm_lchan *lchan, uint8_t amr_mode)
3946{
3947 struct amr_multirate_conf mr;
3948 struct gsm48_multi_rate_conf *mr_conf;
3949 mr_conf = (struct gsm48_multi_rate_conf *) &mr.gsm48_ie;
3950
3951 if (amr_mode > 7)
3952 return -1;
3953
3954 memset(&mr, 0, sizeof(mr));
3955 mr_conf->ver = 1;
3956 /* bit-mask of supported modes, only one bit is set. Reflects
3957 * Figure 10.5.2.47a where there are no thershold and only a
3958 * single mode */
3959 mr.gsm48_ie[1] = 1 << amr_mode;
3960
3961 mr.ms_mode[0].mode = amr_mode;
3962 mr.bts_mode[0].mode = amr_mode;
3963
3964 /* encode this configuration into the lchan for both uplink and
3965 * downlink direction */
3966 gsm48_multirate_config(lchan->mr_ms_lv, &mr, mr.ms_mode);
3967 gsm48_multirate_config(lchan->mr_bts_lv, &mr, mr.bts_mode);
3968
3969 return 0;
3970}
3971
3972/* Debug/Measurement command to activate a given logical channel
3973 * manually in a given mode/codec. This is useful for receiver
3974 * performance testing (FER/RBER/...) */
3975DEFUN(lchan_act, lchan_act_cmd,
3976 "bts <0-255> trx <0-255> timeslot <0-7> sub-slot <0-7> (activate|deactivate) (hr|fr|efr|amr) [<0-7>]",
3977 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3978 "TRX Timeslot\n" "Timeslot Number\n" "Sub-Slot Number\n" "Sub-Slot Number\n"
3979 "Manual Channel Activation (e.g. for BER test)\n"
3980 "Manual Channel Deactivation (e.g. for BER test)\n"
3981 "Half-Rate v1\n" "Full-Rate\n" "Enhanced Full Rate\n" "Adaptive Multi-Rate\n" "AMR Mode\n")
3982{
3983 struct gsm_bts_trx_ts *ts;
3984 struct gsm_lchan *lchan;
3985 int ss_nr = atoi(argv[3]);
3986 const char *act_str = argv[4];
3987 const char *codec_str = argv[5];
3988 int activate;
3989
3990 ts = vty_get_ts(vty, argv[0], argv[1], argv[2]);
3991 if (!ts)
3992 return CMD_WARNING;
3993
3994 lchan = &ts->lchan[ss_nr];
3995
3996 if (!strcmp(act_str, "activate"))
3997 activate = 1;
3998 else
3999 activate = 0;
4000
4001 if (ss_nr >= ts_subslots(ts)) {
4002 vty_out(vty, "%% subslot %d >= permitted %d for physical channel %s%s",
4003 ss_nr, ts_subslots(ts), gsm_pchan_name(ts->pchan), VTY_NEWLINE);
4004 return CMD_WARNING;
4005 }
4006
4007 if (activate) {
4008 int lchan_t;
4009 if (lchan->state != LCHAN_S_NONE) {
4010 vty_out(vty, "%% Cannot activate: Channel busy!%s", VTY_NEWLINE);
4011 return CMD_WARNING;
4012 }
4013 lchan_t = lchan_type_by_pchan(ts->pchan);
4014 if (lchan_t < 0)
4015 return CMD_WARNING;
4016 /* configure the lchan */
4017 lchan->type = lchan_t;
4018 lchan->rsl_cmode = RSL_CMOD_SPD_SPEECH;
4019 if (!strcmp(codec_str, "hr") || !strcmp(codec_str, "fr"))
4020 lchan->tch_mode = GSM48_CMODE_SPEECH_V1;
4021 else if (!strcmp(codec_str, "efr"))
4022 lchan->tch_mode = GSM48_CMODE_SPEECH_EFR;
4023 else if (!strcmp(codec_str, "amr")) {
4024 int amr_mode;
4025 if (argc < 7) {
4026 vty_out(vty, "%% AMR requires specification of AMR mode%s", VTY_NEWLINE);
4027 return CMD_WARNING;
4028 }
4029 amr_mode = atoi(argv[6]);
4030 lchan->tch_mode = GSM48_CMODE_SPEECH_AMR;
4031 lchan_set_single_amr_mode(lchan, amr_mode);
4032 }
4033 vty_out(vty, "%% activating lchan %s%s", gsm_lchan_name(lchan), VTY_NEWLINE);
4034 rsl_chan_activate_lchan(lchan, RSL_ACT_TYPE_INITIAL, 0);
4035 rsl_ipacc_crcx(lchan);
Harald Welte2abd5e12017-05-27 14:10:40 +02004036 } else {
4037 rsl_direct_rf_release(lchan);
4038 }
4039
4040 return CMD_SUCCESS;
4041}
4042
Harald Welte3f86c522017-05-27 15:53:28 +02004043DEFUN(lchan_mdcx, lchan_mdcx_cmd,
4044 "bts <0-255> trx <0-255> timeslot <0-7> sub-slot <0-7> mdcx A.B.C.D <0-65535>",
4045 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
4046 "TRX Timeslot\n" "Timeslot Number\n" "Sub-Slot\n" "Sub-Slot Number\n"
4047 "Modify RTP Connection\n" "MGW IP Address\n" "MGW UDP Port\n")
4048{
4049 struct gsm_bts_trx_ts *ts;
4050 struct gsm_lchan *lchan;
4051 int ss_nr = atoi(argv[3]);
4052 int port = atoi(argv[5]);
4053 struct in_addr ia;
4054 inet_aton(argv[4], &ia);
4055
4056 ts = vty_get_ts(vty, argv[0], argv[1], argv[2]);
4057 if (!ts)
4058 return CMD_WARNING;
4059
4060 lchan = &ts->lchan[ss_nr];
4061
4062 if (ss_nr >= ts_subslots(ts)) {
4063 vty_out(vty, "%% subslot %d >= permitted %d for physical channel %s%s",
4064 ss_nr, ts_subslots(ts), gsm_pchan_name(ts->pchan), VTY_NEWLINE);
4065 return CMD_WARNING;
4066 }
4067
4068 vty_out(vty, "%% connecting RTP of %s to %s:%u%s", gsm_lchan_name(lchan),
4069 inet_ntoa(ia), port, VTY_NEWLINE);
4070 rsl_ipacc_mdcx(lchan, ntohl(ia.s_addr), port, 0);
4071 return CMD_SUCCESS;
4072}
Harald Weltedcccb182010-05-16 20:52:23 +02004073extern int bsc_vty_init_extra(void);
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02004074
Maxdb0e3802017-01-12 19:35:11 +01004075int bsc_vty_init(struct gsm_network *network)
Harald Welte68628e82009-03-10 12:17:57 +00004076{
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004077 cfg_ts_pchan_cmd.string =
4078 vty_cmd_string_from_valstr(tall_bsc_ctx,
4079 gsm_pchant_names,
4080 "phys_chan_config (", "|", ")",
4081 VTY_DO_LOWER);
4082 cfg_ts_pchan_cmd.doc =
4083 vty_cmd_string_from_valstr(tall_bsc_ctx,
4084 gsm_pchant_descs,
4085 "Physical Channel Combination\n",
4086 "\n", "", 0);
4087
Harald Weltee555c2b2012-08-17 13:02:12 +02004088 cfg_bts_type_cmd.string =
4089 vty_cmd_string_from_valstr(tall_bsc_ctx,
4090 bts_type_names,
4091 "type (", "|", ")",
4092 VTY_DO_LOWER);
4093 cfg_bts_type_cmd.doc =
4094 vty_cmd_string_from_valstr(tall_bsc_ctx,
4095 bts_type_descs,
4096 "BTS Vendor/Type\n",
4097 "\n", "", 0);
4098
Neels Hofmeyr06d39fd2016-05-12 01:16:58 +02004099 common_cs_vty_init(network, config_write_net);
Harald Weltee555c2b2012-08-17 13:02:12 +02004100
Neels Hofmeyrea11bf82016-05-12 01:53:23 +02004101 install_element_ve(&bsc_show_net_cmd);
Harald Welteb4d5b172010-05-12 16:10:35 +00004102 install_element_ve(&show_bts_cmd);
4103 install_element_ve(&show_trx_cmd);
4104 install_element_ve(&show_ts_cmd);
4105 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08004106 install_element_ve(&show_lchan_summary_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00004107
Harald Welteb4d5b172010-05-12 16:10:35 +00004108 install_element_ve(&show_paging_cmd);
Holger Hans Peter Freytherec37bb22013-02-05 09:39:09 +01004109 install_element_ve(&show_paging_group_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00004110
Maxdb0e3802017-01-12 19:35:11 +01004111 logging_vty_add_cmds(NULL);
Jacob Erlbeck64630cc2015-10-26 16:25:37 +01004112 osmo_stats_vty_add_cmds();
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01004113
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01004114 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01004115 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-12-21 16:51:50 +01004116 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
4117 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
4118 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
4119 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
4120 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
4121 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01004122 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01004123 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
4124 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
4125 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
4126 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
4127 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
4128 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
4129 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
4130 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
4131 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltec9f499f2010-12-23 22:53:50 +01004132 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01004133 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08004134 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08004135 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02004136
4137 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02004138 install_node(&bts_node, config_write_bts);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004139 vty_install_default(BTS_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004140 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004141 install_element(BTS_NODE, &cfg_description_cmd);
4142 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02004143 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02004144 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Maxc08ee712016-05-11 12:45:13 +02004145 install_element(BTS_NODE, &cfg_bts_dtxu_cmd);
4146 install_element(BTS_NODE, &cfg_bts_dtxd_cmd);
4147 install_element(BTS_NODE, &cfg_bts_no_dtxu_cmd);
4148 install_element(BTS_NODE, &cfg_bts_no_dtxd_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00004149 install_element(BTS_NODE, &cfg_bts_lac_cmd);
4150 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004151 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00004152 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8b291802013-03-12 13:57:05 +01004153 install_element(BTS_NODE, &cfg_bts_rsl_ip_cmd);
Sylvain Munautc9519462011-10-17 14:04:55 +02004154 install_element(BTS_NODE, &cfg_bts_nokia_site_skip_reset_cmd);
Andreas Eversberg7d8fa342013-12-05 13:25:06 +01004155 install_element(BTS_NODE, &cfg_bts_nokia_site_no_loc_rel_cnf_cmd);
Sipos Csaba56e17662015-02-07 13:27:36 +01004156 install_element(BTS_NODE, &cfg_bts_nokia_site_bts_reset_timer_cnf_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02004157 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004158 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
4159 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte7a8fa412009-08-10 13:48:16 +02004160 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01004161 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
4162 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Andreas Eversberg2ee7ecd2012-10-13 07:27:47 +02004163 install_element(BTS_NODE, &cfg_bts_chan_desc_att_cmd);
4164 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_pa_mfrms_cmd);
4165 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_ag_blks_res_cmd);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08004166 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
4167 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02004168 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08004169 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Ivan Kluchnikov67920592013-09-16 13:13:04 +04004170 install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02004171 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02004172 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Holger Hans Peter Freytherc63f6f12013-07-27 21:07:57 +02004173 install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
Harald Welte73225282009-12-12 18:17:25 +01004174 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
4175 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaute0b06b02010-11-28 18:17:28 +01004176 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
4177 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
4178 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
4179 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
4180 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
4181 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Andreas Eversberg4d4944a2013-03-10 11:49:35 +01004182 install_element(BTS_NODE, &cfg_bts_radio_link_timeout_cmd);
Harald Welte4511d892010-04-18 15:51:20 +02004183 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
bhargava350533c2016-07-21 11:14:34 +05304184 install_element(BTS_NODE, &cfg_bts_gprs_11bit_rach_support_for_egprs_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02004185 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004186 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
Andreas Eversberg0c8f9ca2013-03-16 16:31:26 +01004187 install_element(BTS_NODE, &cfg_bts_gprs_net_ctrl_ord_cmd);
Max292ec582016-07-28 11:55:37 +02004188 install_element(BTS_NODE, &cfg_bts_gprs_ctrl_ack_cmd);
4189 install_element(BTS_NODE, &cfg_no_bts_gprs_ctrl_ack_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004190 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02004191 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08004192 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08004193 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-03-14 23:30:30 +08004194 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
4195 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
4196 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freythere66bf1f2010-09-06 10:11:25 +08004197 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welte9fbff4a2010-07-30 11:50:09 +02004198 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
4199 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welte42def722017-01-13 00:10:32 +01004200 install_element(BTS_NODE, &cfg_bts_early_cm_cmd);
Harald Welte32c09622011-01-11 23:44:56 +01004201 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
4202 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Welte64c07d22011-02-15 11:43:27 +01004203 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Max59a1bf32016-04-15 16:04:46 +02004204 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_add_cmd);
4205 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_del_cmd);
Max26679e02016-04-20 15:57:13 +02004206 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_add_cmd);
4207 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_del_cmd);
Holger Hans Peter Freythere30d40d2012-07-20 10:27:31 +02004208 install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
4209 install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
Jacob Erlbeck65d114f2014-01-16 11:02:14 +01004210 install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
4211 install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
Andreas Eversberga83d5112013-12-07 18:32:28 +01004212 install_element(BTS_NODE, &cfg_bts_codec0_cmd);
4213 install_element(BTS_NODE, &cfg_bts_codec1_cmd);
4214 install_element(BTS_NODE, &cfg_bts_codec2_cmd);
4215 install_element(BTS_NODE, &cfg_bts_codec3_cmd);
4216 install_element(BTS_NODE, &cfg_bts_codec4_cmd);
Holger Hans Peter Freytherc22930e2014-12-17 14:46:17 +01004217 install_element(BTS_NODE, &cfg_bts_depends_on_cmd);
4218 install_element(BTS_NODE, &cfg_bts_no_depends_on_cmd);
Andreas Eversberg73266522014-01-19 11:47:44 +01004219 install_element(BTS_NODE, &cfg_bts_amr_fr_modes1_cmd);
4220 install_element(BTS_NODE, &cfg_bts_amr_fr_modes2_cmd);
4221 install_element(BTS_NODE, &cfg_bts_amr_fr_modes3_cmd);
4222 install_element(BTS_NODE, &cfg_bts_amr_fr_modes4_cmd);
4223 install_element(BTS_NODE, &cfg_bts_amr_fr_thres1_cmd);
4224 install_element(BTS_NODE, &cfg_bts_amr_fr_thres2_cmd);
4225 install_element(BTS_NODE, &cfg_bts_amr_fr_thres3_cmd);
4226 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst1_cmd);
4227 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst2_cmd);
4228 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst3_cmd);
4229 install_element(BTS_NODE, &cfg_bts_amr_fr_start_mode_cmd);
4230 install_element(BTS_NODE, &cfg_bts_amr_hr_modes1_cmd);
4231 install_element(BTS_NODE, &cfg_bts_amr_hr_modes2_cmd);
4232 install_element(BTS_NODE, &cfg_bts_amr_hr_modes3_cmd);
4233 install_element(BTS_NODE, &cfg_bts_amr_hr_modes4_cmd);
4234 install_element(BTS_NODE, &cfg_bts_amr_hr_thres1_cmd);
4235 install_element(BTS_NODE, &cfg_bts_amr_hr_thres2_cmd);
4236 install_element(BTS_NODE, &cfg_bts_amr_hr_thres3_cmd);
4237 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst1_cmd);
4238 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst2_cmd);
4239 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst3_cmd);
4240 install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd);
Harald Welte8254cf72017-05-29 13:42:19 +02004241 install_element(BTS_NODE, &cfg_bts_pcu_sock_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004242
Harald Welte5258fc42009-03-28 19:07:53 +00004243 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004244 install_node(&trx_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004245 vty_install_default(TRX_NODE);
Harald Welte5258fc42009-03-28 19:07:53 +00004246 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02004247 install_element(TRX_NODE, &cfg_description_cmd);
4248 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)7b37d972009-12-27 20:56:38 +01004249 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02004250 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-08-08 16:12:58 +02004251 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
4252 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01004253 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004254
Harald Welte5258fc42009-03-28 19:07:53 +00004255 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004256 install_node(&ts_node, dummy_config_write);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01004257 vty_install_default(TS_NODE);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004258 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Welte4ab9d7c2012-08-17 12:42:06 +02004259 install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);
Harald Welte135a6482011-05-30 12:09:13 +02004260 install_element(TS_NODE, &cfg_ts_tsc_cmd);
Harald Weltea39b0f22010-06-14 22:26:10 +02004261 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte6e0cd042009-09-12 13:05:33 +02004262 install_element(TS_NODE, &cfg_ts_hsn_cmd);
4263 install_element(TS_NODE, &cfg_ts_maio_cmd);
4264 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
4265 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02004266 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00004267
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004268 install_element(ENABLE_NODE, &drop_bts_cmd);
Holger Hans Peter Freyther740e65f2016-03-16 13:45:23 +01004269 install_element(ENABLE_NODE, &restart_bts_cmd);
Harald Welted0d2b0b2010-12-23 13:18:07 +01004270 install_element(ENABLE_NODE, &pdch_act_cmd);
Harald Welte2abd5e12017-05-27 14:10:40 +02004271 install_element(ENABLE_NODE, &lchan_act_cmd);
Harald Welte3f86c522017-05-27 15:53:28 +02004272 install_element(ENABLE_NODE, &lchan_mdcx_cmd);
Harald Welte30f1f372014-12-28 15:00:45 +01004273 install_element(ENABLE_NODE, &smscb_cmd_cmd);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02004274
Harald Welte81c9b9c2010-05-31 16:40:40 +02004275 abis_nm_vty_init();
Harald Weltee1d5eca2011-02-12 14:42:59 +01004276 abis_om2k_vty_init();
Harald Welte3016d9f2011-02-05 13:54:41 +01004277 e1inp_vty_init();
Harald Welte42def722017-01-13 00:10:32 +01004278 osmo_fsm_vty_add_cmds();
Harald Welte81c9b9c2010-05-31 16:40:40 +02004279
Harald Weltedcccb182010-05-16 20:52:23 +02004280 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00004281
Harald Welte68628e82009-03-10 12:17:57 +00004282 return 0;
4283}