blob: 01ee4df2ce8f69beb56a1b84199f6019a1e79daf [file] [log] [blame]
Harald Welte59b04682009-06-10 05:40:52 +08001/* OpenBSC interface to quagga VTY */
Harald Welte410575a2010-03-14 23:30:30 +08002/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
Harald Welte59b04682009-06-10 05:40:52 +08003 * All Rights Reserved
4 *
5 * This program is free software; you can redistribute it and/or modify
Harald Welte0e3e88e2011-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 Welte59b04682009-06-10 05:40:52 +08008 * (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 Welte0e3e88e2011-01-01 15:25:50 +010013 * GNU Affero General Public License for more details.
Harald Welte59b04682009-06-10 05:40:52 +080014 *
Harald Welte0e3e88e2011-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 Welte59b04682009-06-10 05:40:52 +080017 *
18 */
19
20#include <stdlib.h>
Max3d94aca2016-05-11 12:45:13 +020021#include <stdbool.h>
Harald Welte59b04682009-06-10 05:40:52 +080022#include <unistd.h>
Harald Welte59b04682009-06-10 05:40:52 +080023
Harald Weltebd9591f2010-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 Erlbeck63fac682015-10-26 16:25:37 +010028#include <osmocom/vty/stats.h>
Harald Weltebd9591f2010-05-19 19:45:32 +020029#include <osmocom/vty/telnet_interface.h>
Harald Welte2addf852012-08-17 12:42:06 +020030#include <osmocom/vty/misc.h>
Max3d94aca2016-05-11 12:45:13 +020031#include <osmocom/gsm/protocol/gsm_04_08.h>
Holger Hans Peter Freyther35e6fbb2013-02-05 09:39:09 +010032#include <osmocom/gsm/gsm0502.h>
33
Harald Welte59b04682009-06-10 05:40:52 +080034#include <arpa/inet.h>
35
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +010036#include <osmocom/core/linuxlist.h>
Harald Welte59b04682009-06-10 05:40:52 +080037#include <openbsc/gsm_data.h>
Pablo Neira Ayuso42e41df2011-08-17 22:44:07 +020038#include <osmocom/abis/e1_input.h>
Harald Welte59b04682009-06-10 05:40:52 +080039#include <openbsc/abis_nm.h>
Harald Welte30f93fb2011-02-19 16:48:17 +010040#include <openbsc/abis_om2000.h>
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +010041#include <osmocom/core/utils.h>
42#include <osmocom/gsm/gsm_utils.h>
Harald Welte73e69942011-05-23 20:42:26 +020043#include <osmocom/gsm/abis_nm.h>
Harald Weltefe96f382009-12-22 13:09:29 +010044#include <openbsc/chan_alloc.h>
Harald Welte44007742009-12-22 21:43:14 +010045#include <openbsc/meas_rep.h>
Harald Welte59b04682009-06-10 05:40:52 +080046#include <openbsc/db.h>
Holger Hans Peter Freytherb70d45b2010-04-06 11:55:37 +020047#include <openbsc/vty.h>
Harald Weltecfb6b282012-06-16 14:59:56 +080048#include <osmocom/gprs/gprs_ns.h>
Harald Welted8acf142010-07-30 11:50:09 +020049#include <openbsc/system_information.h>
Harald Welte682ee5f2010-05-16 22:02:16 +020050#include <openbsc/debug.h>
Holger Hans Peter Freyther25176f12010-11-09 17:00:42 +010051#include <openbsc/paging.h>
Harald Welte64fcd772011-08-20 18:25:02 +020052#include <openbsc/ipaccess.h>
Harald Welte5213e992010-12-23 13:18:07 +010053#include <openbsc/abis_rsl.h>
Holger Hans Peter Freytherd0146922011-02-24 14:19:14 +010054#include <openbsc/osmo_msc_data.h>
55#include <openbsc/osmo_bsc_rf.h>
Harald Welte59b04682009-06-10 05:40:52 +080056
Neels Hofmeyrbfe27272016-05-12 01:16:58 +020057#include <openbsc/common_cs.h>
58
Holger Hans Peter Freyther35e6fbb2013-02-05 09:39:09 +010059#include <inttypes.h>
60
Harald Welted9dea592011-03-04 13:53:51 +010061#include "../../bscconfig.h"
Harald Welte10c29f62010-05-16 19:20:24 +020062
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +020063
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +020064#define LCHAN_NR_STR "Logical Channel Number\n"
65
66
Harald Welted6b62e32010-05-12 17:19:53 +000067/* FIXME: this should go to some common file */
68static const struct value_string gprs_ns_timer_strs[] = {
Harald Weltea9251762010-05-11 23:50:21 +020069 { 0, "tns-block" },
70 { 1, "tns-block-retries" },
71 { 2, "tns-reset" },
72 { 3, "tns-reset-retries" },
73 { 4, "tns-test" },
74 { 5, "tns-alive" },
75 { 6, "tns-alive-retries" },
76 { 0, NULL }
77};
78
Harald Welted6b62e32010-05-12 17:19:53 +000079static const struct value_string gprs_bssgp_cfg_strs[] = {
Harald Weltea9251762010-05-11 23:50:21 +020080 { 0, "blocking-timer" },
81 { 1, "blocking-retries" },
82 { 2, "unblocking-retries" },
83 { 3, "reset-timer" },
84 { 4, "reset-retries" },
85 { 5, "suspend-timer" },
86 { 6, "suspend-retries" },
87 { 7, "resume-timer" },
88 { 8, "resume-retries" },
89 { 9, "capability-update-timer" },
90 { 10, "capability-update-retries" },
91 { 0, NULL }
92};
93
Harald Weltef989b782011-02-15 11:43:27 +010094static const struct value_string bts_neigh_mode_strs[] = {
95 { NL_MODE_AUTOMATIC, "automatic" },
96 { NL_MODE_MANUAL, "manual" },
97 { NL_MODE_MANUAL_SI5SEP, "manual-si5" },
98 { 0, NULL }
99};
100
Daniel Willmann2c9540c2012-05-14 18:43:23 +0200101const struct value_string bts_loc_fix_names[] = {
102 { BTS_LOC_FIX_INVALID, "invalid" },
103 { BTS_LOC_FIX_2D, "fix2d" },
104 { BTS_LOC_FIX_3D, "fix3d" },
105 { 0, NULL }
106};
107
Harald Welte59b04682009-06-10 05:40:52 +0800108struct cmd_node bts_node = {
109 BTS_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +0200110 "%s(config-net-bts)# ",
Harald Welte59b04682009-06-10 05:40:52 +0800111 1,
112};
113
114struct cmd_node trx_node = {
115 TRX_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +0200116 "%s(config-net-bts-trx)# ",
Harald Welte59b04682009-06-10 05:40:52 +0800117 1,
118};
119
120struct cmd_node ts_node = {
121 TS_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +0200122 "%s(config-net-bts-trx-ts)# ",
Harald Welte59b04682009-06-10 05:40:52 +0800123 1,
124};
125
Harald Welte59b04682009-06-10 05:40:52 +0800126static int dummy_config_write(struct vty *v)
127{
128 return CMD_SUCCESS;
129}
130
131static void net_dump_nmstate(struct vty *vty, struct gsm_nm_state *nms)
132{
Harald Weltee7b751c2013-03-15 16:57:33 +0100133 vty_out(vty,"Oper '%s', Admin '%s', Avail '%s'%s",
134 abis_nm_opstate_name(nms->operational),
135 get_value_string(abis_nm_adm_state_names, nms->administrative),
Harald Welte306a8892011-05-23 20:30:39 +0200136 abis_nm_avail_name(nms->availability), VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800137}
138
Harald Weltefe96f382009-12-22 13:09:29 +0100139static void dump_pchan_load_vty(struct vty *vty, char *prefix,
140 const struct pchan_load *pl)
141{
142 int i;
143
144 for (i = 0; i < ARRAY_SIZE(pl->pchan); i++) {
145 const struct load_counter *lc = &pl->pchan[i];
146 unsigned int percent;
147
148 if (lc->total == 0)
149 continue;
150
151 percent = (lc->used * 100) / lc->total;
152
153 vty_out(vty, "%s%20s: %3u%% (%u/%u)%s", prefix,
154 gsm_pchan_name(i), percent, lc->used, lc->total,
155 VTY_NEWLINE);
156 }
157}
158
Harald Welte59b04682009-06-10 05:40:52 +0800159static void net_dump_vty(struct vty *vty, struct gsm_network *net)
160{
Harald Weltefe96f382009-12-22 13:09:29 +0100161 struct pchan_load pl;
162
Harald Welte59b04682009-06-10 05:40:52 +0800163 vty_out(vty, "BSC is on Country Code %u, Network Code %u "
164 "and has %u BTS%s", net->country_code, net->network_code,
165 net->num_bts, VTY_NEWLINE);
166 vty_out(vty, " Long network name: '%s'%s",
167 net->name_long, VTY_NEWLINE);
168 vty_out(vty, " Short network name: '%s'%s",
169 net->name_short, VTY_NEWLINE);
Max0a378ba2016-05-24 14:23:27 +0200170 vty_out(vty, " Authentication policy: %s",
171 gsm_auth_policy_name(net->auth_policy));
172 if (net->authorized_reg_str)
173 vty_out(vty, ", authorized regexp: %s", net->authorized_reg_str);
174 vty_out(vty, "%s", VTY_NEWLINE);
Max58726412016-06-30 10:25:49 +0200175 vty_out(vty, " Auto create subscriber: %s%s",
176 net->auto_create_subscr ? "yes" : "no", VTY_NEWLINE);
177 vty_out(vty, " Auto assign extension: %s%s",
178 net->auto_assign_exten ? "yes" : "no", VTY_NEWLINE);
Harald Welte59936d72009-11-18 20:33:19 +0100179 vty_out(vty, " Location updating reject cause: %u%s",
180 net->reject_cause, VTY_NEWLINE);
Harald Weltecca253a2009-08-30 15:47:06 +0900181 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
182 VTY_NEWLINE);
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +0100183 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
184 VTY_NEWLINE);
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +0800185 vty_out(vty, " Use TCH for Paging any: %d%s", net->pag_any_tch,
186 VTY_NEWLINE);
Harald Welte52af1952009-12-13 10:53:12 +0100187 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
188 VTY_NEWLINE);
Harald Weltea310f3e2009-12-14 09:00:24 +0100189 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
190 VTY_NEWLINE);
Harald Welte0af9c9f2009-12-19 21:41:52 +0100191 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
192 VTY_NEWLINE);
Harald Weltefe96f382009-12-22 13:09:29 +0100193 network_chan_load(&pl, net);
194 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
195 dump_pchan_load_vty(vty, " ", &pl);
Holger Hans Peter Freytherd0146922011-02-24 14:19:14 +0100196
197 /* show rf */
Holger Hans Peter Freytherab25ee42014-02-08 12:12:03 +0100198 if (net->bsc_data)
Holger Hans Peter Freytherd0146922011-02-24 14:19:14 +0100199 vty_out(vty, " Last RF Command: %s%s",
Holger Hans Peter Freyther4d614172011-08-15 15:53:00 +0200200 net->bsc_data->rf_ctrl->last_state_command,
Holger Hans Peter Freytherd0146922011-02-24 14:19:14 +0100201 VTY_NEWLINE);
Holger Hans Peter Freytherab25ee42014-02-08 12:12:03 +0100202 if (net->bsc_data)
Jacob Erlbeckdcce8e82013-09-11 10:46:57 +0200203 vty_out(vty, " Last RF Lock Command: %s%s",
204 net->bsc_data->rf_ctrl->last_rf_lock_ctrl_command,
205 VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800206}
207
Neels Hofmeyrd416b482016-05-12 01:53:23 +0200208DEFUN(bsc_show_net, bsc_show_net_cmd, "show network",
Harald Welte59b04682009-06-10 05:40:52 +0800209 SHOW_STR "Display information about a GSM NETWORK\n")
210{
Harald Welte40152872010-05-16 20:52:23 +0200211 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800212 net_dump_vty(vty, net);
213
214 return CMD_SUCCESS;
215}
216
217static void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l)
218{
219 struct e1inp_line *line;
220
221 if (!e1l) {
222 vty_out(vty, " None%s", VTY_NEWLINE);
223 return;
224 }
225
226 line = e1l->ts->line;
227
228 vty_out(vty, " E1 Line %u, Type %s: Timeslot %u, Mode %s%s",
229 line->num, line->driver->name, e1l->ts->num,
230 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
231 vty_out(vty, " E1 TEI %u, SAPI %u%s",
232 e1l->tei, e1l->sapi, VTY_NEWLINE);
233}
234
235static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
236{
Harald Weltefe96f382009-12-22 13:09:29 +0100237 struct pchan_load pl;
238
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +0200239 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Welte4d4a2a22015-11-20 10:50:24 +0100240 "BSIC %u (NCC=%u, BCC=%u) and %u TRX%s",
Harald Welte91afe4c2009-06-20 18:15:19 +0200241 bts->nr, btstype2str(bts->type), gsm_band_name(bts->band),
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +0200242 bts->cell_identity,
Harald Welte7bb55f32015-11-20 10:43:31 +0100243 bts->location_area_code, bts->bsic,
Harald Welte4d4a2a22015-11-20 10:50:24 +0100244 bts->bsic >> 3, bts->bsic & 7,
Harald Welte91afe4c2009-06-20 18:15:19 +0200245 bts->num_trx, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200246 vty_out(vty, "Description: %s%s",
247 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Harald Welte8e9d1792009-12-12 15:38:16 +0100248 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +0100249 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte8e9d1792009-12-12 15:38:16 +0100250 rxlev2dbm(bts->si_common.cell_sel_par.rxlev_acc_min),
251 VTY_NEWLINE);
252 vty_out(vty, "Cell Reselection Hysteresis: %u dBm%s",
Harald Welteb761bf82009-12-12 18:17:25 +0100253 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +0100254 vty_out(vty, "RACH TX-Integer: %u%s", bts->si_common.rach_control.tx_integer,
255 VTY_NEWLINE);
256 vty_out(vty, "RACH Max transmissions: %u%s",
257 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
258 VTY_NEWLINE);
Harald Welte8c973ba2009-12-21 23:08:18 +0100259 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)e19be3f2009-08-12 13:28:23 +0200260 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Max3d94aca2016-05-11 12:45:13 +0200261 if (bts->dtxu != GSM48_DTX_SHALL_NOT_BE_USED)
262 vty_out(vty, "Uplink DTX: %s%s",
263 (bts->dtxu != GSM48_DTX_SHALL_BE_USED) ?
264 "enabled" : "forced", VTY_NEWLINE);
265 else
266 vty_out(vty, "Uplink DTX: not enabled%s", VTY_NEWLINE);
267 vty_out(vty, "Downlink DTX: %senabled%s", bts->dtxd ? "" : "not ",
268 VTY_NEWLINE);
Andreas Eversberg14e12f22012-10-13 07:27:47 +0200269 vty_out(vty, "Channel Description Attachment: %s%s",
270 (bts->si_common.chan_desc.att) ? "yes" : "no", VTY_NEWLINE);
271 vty_out(vty, "Channel Description BS-PA-MFRMS: %u%s",
272 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
273 vty_out(vty, "Channel Description BS-AG_BLKS-RES: %u%s",
274 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
Harald Welted8acf142010-07-30 11:50:09 +0200275 vty_out(vty, "System Information present: 0x%08x, static: 0x%08x%s",
276 bts->si_valid, bts->si_mode_static, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800277 if (is_ipaccess_bts(bts))
Harald Welte25572872009-10-20 00:22:00 +0200278 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte59b04682009-06-10 05:40:52 +0800279 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte25572872009-10-20 00:22:00 +0200280 bts->oml_tei, VTY_NEWLINE);
Sylvain Munautcb8e8432011-10-17 14:04:55 +0200281 else if (bts->type == GSM_BTS_TYPE_NOKIA_SITE)
282 vty_out(vty, " Skip Reset: %d%s",
283 bts->nokia.skip_reset, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800284 vty_out(vty, " NM State: ");
Harald Welte69f6f812011-05-30 12:07:53 +0200285 net_dump_nmstate(vty, &bts->mo.nm_state);
Harald Welte59b04682009-06-10 05:40:52 +0800286 vty_out(vty, " Site Mgr NM State: ");
Harald Welte69f6f812011-05-30 12:07:53 +0200287 net_dump_nmstate(vty, &bts->site_mgr.mo.nm_state);
Holger Hans Peter Freyther03d80af2013-05-29 16:22:09 +0200288 vty_out(vty, " GPRS NSE: ");
289 net_dump_nmstate(vty, &bts->gprs.nse.mo.nm_state);
290 vty_out(vty, " GPRS CELL: ");
291 net_dump_nmstate(vty, &bts->gprs.cell.mo.nm_state);
292 vty_out(vty, " GPRS NSVC0: ");
293 net_dump_nmstate(vty, &bts->gprs.nsvc[0].mo.nm_state);
294 vty_out(vty, " GPRS NSVC1: ");
295 net_dump_nmstate(vty, &bts->gprs.nsvc[1].mo.nm_state);
Holger Hans Peter Freyther914ff192011-04-26 15:52:34 +0200296 vty_out(vty, " Paging: %u pending requests, %u free slots%s",
297 paging_pending_requests_nr(bts),
Harald Welte59b04682009-06-10 05:40:52 +0800298 bts->paging.available_slots, VTY_NEWLINE);
Holger Hans Peter Freytherb5c79c92010-11-25 16:28:45 +0100299 if (is_ipaccess_bts(bts)) {
300 vty_out(vty, " OML Link state: %s.%s",
301 bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);
302 } else {
Harald Welte25572872009-10-20 00:22:00 +0200303 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
304 e1isl_dump_vty(vty, bts->oml_link);
305 }
Holger Hans Peter Freytherb5c79c92010-11-25 16:28:45 +0100306
307 /* FIXME: chan_desc */
Harald Weltefe96f382009-12-22 13:09:29 +0100308 memset(&pl, 0, sizeof(pl));
Neels Hofmeyr7c0b45b2016-09-25 17:01:20 +0200309 bts_chan_load(&pl, bts);
Harald Weltefe96f382009-12-22 13:09:29 +0100310 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
311 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte59b04682009-06-10 05:40:52 +0800312}
313
Sylvain Munaut1ad96282012-12-28 12:15:11 +0100314DEFUN(show_bts, show_bts_cmd, "show bts [<0-255>]",
Harald Welte59b04682009-06-10 05:40:52 +0800315 SHOW_STR "Display information about a BTS\n"
316 "BTS number")
317{
Harald Welte40152872010-05-16 20:52:23 +0200318 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800319 int bts_nr;
320
321 if (argc != 0) {
322 /* use the BTS number that the user has specified */
323 bts_nr = atoi(argv[0]);
Harald Welteda5db862010-12-24 12:24:03 +0100324 if (bts_nr >= net->num_bts) {
Harald Welte59b04682009-06-10 05:40:52 +0800325 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
326 VTY_NEWLINE);
327 return CMD_WARNING;
328 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200329 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte59b04682009-06-10 05:40:52 +0800330 return CMD_SUCCESS;
331 }
332 /* print all BTS's */
333 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee712a5f2009-06-21 16:17:15 +0200334 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte59b04682009-06-10 05:40:52 +0800335
336 return CMD_SUCCESS;
337}
338
Harald Welte62868882009-08-08 16:12:58 +0200339/* utility functions */
340static void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,
341 const char *ts, const char *ss)
342{
343 e1_link->e1_nr = atoi(line);
344 e1_link->e1_ts = atoi(ts);
345 if (!strcmp(ss, "full"))
346 e1_link->e1_ts_ss = 255;
347 else
348 e1_link->e1_ts_ss = atoi(ss);
349}
350
351static void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,
352 const char *prefix)
353{
354 if (!e1_link->e1_ts)
355 return;
356
357 if (e1_link->e1_ts_ss == 255)
358 vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",
359 prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);
360 else
361 vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",
362 prefix, e1_link->e1_nr, e1_link->e1_ts,
363 e1_link->e1_ts_ss, VTY_NEWLINE);
364}
365
366
Harald Welte97ceef92009-08-06 19:06:46 +0200367static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
368{
Neels Hofmeyr0aec2f92016-01-27 14:20:29 +0100369 vty_out(vty, " timeslot %u%s", ts->nr, VTY_NEWLINE);
Harald Welte7bb55f32015-11-20 10:43:31 +0100370 if (ts->tsc != -1)
Neels Hofmeyr0aec2f92016-01-27 14:20:29 +0100371 vty_out(vty, " training_sequence_code %u%s", ts->tsc, VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200372 if (ts->pchan != GSM_PCHAN_NONE)
Neels Hofmeyr0aec2f92016-01-27 14:20:29 +0100373 vty_out(vty, " phys_chan_config %s%s",
Harald Welte62868882009-08-08 16:12:58 +0200374 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
Neels Hofmeyr0aec2f92016-01-27 14:20:29 +0100375 vty_out(vty, " hopping enabled %u%s",
Harald Weltea42a93f2010-06-14 22:26:10 +0200376 ts->hopping.enabled, VTY_NEWLINE);
377 if (ts->hopping.enabled) {
378 unsigned int i;
Neels Hofmeyr0aec2f92016-01-27 14:20:29 +0100379 vty_out(vty, " hopping sequence-number %u%s",
Harald Welte67104d12009-09-12 13:05:33 +0200380 ts->hopping.hsn, VTY_NEWLINE);
Neels Hofmeyr0aec2f92016-01-27 14:20:29 +0100381 vty_out(vty, " hopping maio %u%s",
Harald Welte67104d12009-09-12 13:05:33 +0200382 ts->hopping.maio, VTY_NEWLINE);
Harald Weltea42a93f2010-06-14 22:26:10 +0200383 for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {
384 if (!bitvec_get_bit_pos(&ts->hopping.arfcns, i))
385 continue;
Neels Hofmeyr0aec2f92016-01-27 14:20:29 +0100386 vty_out(vty, " hopping arfcn add %u%s",
Harald Weltea42a93f2010-06-14 22:26:10 +0200387 i, VTY_NEWLINE);
388 }
Harald Welteff598092010-12-24 12:07:07 +0100389 }
Neels Hofmeyr0aec2f92016-01-27 14:20:29 +0100390 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Weltec02789e2011-02-14 16:15:21 +0100391
392 if (ts->trx->bts->model->config_write_ts)
393 ts->trx->bts->model->config_write_ts(vty, ts);
Harald Welte97ceef92009-08-06 19:06:46 +0200394}
395
396static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
397{
398 int i;
399
Harald Weltee87eb462009-08-07 13:29:14 +0200400 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200401 if (trx->description)
402 vty_out(vty, " description %s%s", trx->description,
403 VTY_NEWLINE);
Holger Hans Peter Freyther32be2aa2010-04-17 06:42:07 +0200404 vty_out(vty, " rf_locked %u%s",
Harald Welte69f6f812011-05-30 12:07:53 +0200405 trx->mo.nm_state.administrative == NM_STATE_LOCKED ? 1 : 0,
Holger Hans Peter Freyther32be2aa2010-04-17 06:42:07 +0200406 VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200407 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)b709bfe2009-12-27 20:56:38 +0100408 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200409 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200410 config_write_e1_link(vty, &trx->rsl_e1_link, " rsl ");
411 vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei, VTY_NEWLINE);
Harald Welte97ceef92009-08-06 19:06:46 +0200412
Harald Weltec02789e2011-02-14 16:15:21 +0100413 if (trx->bts->model->config_write_trx)
414 trx->bts->model->config_write_trx(vty, trx);
415
Harald Welte97ceef92009-08-06 19:06:46 +0200416 for (i = 0; i < TRX_NR_TS; i++)
417 config_write_ts_single(vty, &trx->ts[i]);
418}
419
Harald Weltea9251762010-05-11 23:50:21 +0200420static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
421{
422 unsigned int i;
423 vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
424 VTY_NEWLINE);
425 if (bts->gprs.mode == BTS_GPRS_NONE)
426 return;
427
bhargava612722c2016-07-21 11:14:34 +0530428 vty_out(vty, " gprs 11bit_rach_support_for_egprs %u%s",
429 bts->gprs.supports_egprs_11bit_rach, VTY_NEWLINE);
430
Harald Weltea9251762010-05-11 23:50:21 +0200431 vty_out(vty, " gprs routing area %u%s", bts->gprs.rac,
432 VTY_NEWLINE);
Andreas Eversberga4fa21c2013-03-16 16:31:26 +0100433 vty_out(vty, " gprs network-control-order nc%u%s",
434 bts->gprs.net_ctrl_ord, VTY_NEWLINE);
Max88bdcd42016-07-28 11:55:37 +0200435 if (!bts->gprs.ctrl_ack_type_use_block)
436 vty_out(vty, " gprs control-ack-type-rach%s", VTY_NEWLINE);
Harald Weltea9251762010-05-11 23:50:21 +0200437 vty_out(vty, " gprs cell bvci %u%s", bts->gprs.cell.bvci,
438 VTY_NEWLINE);
439 for (i = 0; i < ARRAY_SIZE(bts->gprs.cell.timer); i++)
440 vty_out(vty, " gprs cell timer %s %u%s",
441 get_value_string(gprs_bssgp_cfg_strs, i),
442 bts->gprs.cell.timer[i], VTY_NEWLINE);
443 vty_out(vty, " gprs nsei %u%s", bts->gprs.nse.nsei,
444 VTY_NEWLINE);
445 for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)
446 vty_out(vty, " gprs ns timer %s %u%s",
447 get_value_string(gprs_ns_timer_strs, i),
448 bts->gprs.nse.timer[i], VTY_NEWLINE);
449 for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
450 struct gsm_bts_gprs_nsvc *nsvc =
451 &bts->gprs.nsvc[i];
452 struct in_addr ia;
453
454 ia.s_addr = htonl(nsvc->remote_ip);
455 vty_out(vty, " gprs nsvc %u nsvci %u%s", i,
456 nsvc->nsvci, VTY_NEWLINE);
457 vty_out(vty, " gprs nsvc %u local udp port %u%s", i,
458 nsvc->local_port, VTY_NEWLINE);
459 vty_out(vty, " gprs nsvc %u remote udp port %u%s", i,
460 nsvc->remote_port, VTY_NEWLINE);
461 vty_out(vty, " gprs nsvc %u remote ip %s%s", i,
462 inet_ntoa(ia), VTY_NEWLINE);
463 }
464}
465
Holger Hans Peter Freyther38c56672013-09-15 17:23:34 +0200466/* Write the model data if there is one */
467static void config_write_bts_model(struct vty *vty, struct gsm_bts *bts)
Harald Welte97ceef92009-08-06 19:06:46 +0200468{
469 struct gsm_bts_trx *trx;
Holger Hans Peter Freyther38c56672013-09-15 17:23:34 +0200470
471 if (!bts->model)
472 return;
473
474 if (bts->model->config_write_bts)
475 bts->model->config_write_bts(vty, bts);
476
477 llist_for_each_entry(trx, &bts->trx_list, list)
478 config_write_trx_single(vty, trx);
479}
480
Holger Hans Peter Freyther8083cc92015-09-24 11:39:38 +0200481static void write_amr_modes(struct vty *vty, const char *prefix,
482 const char *name, struct amr_mode *modes, int num)
483{
484 int i;
485
486 vty_out(vty, " %s threshold %s", prefix, name);
487 for (i = 0; i < num - 1; i++)
488 vty_out(vty, " %d", modes[i].threshold);
489 vty_out(vty, "%s", VTY_NEWLINE);
490 vty_out(vty, " %s hysteresis %s", prefix, name);
491 for (i = 0; i < num - 1; i++)
492 vty_out(vty, " %d", modes[i].hysteresis);
493 vty_out(vty, "%s", VTY_NEWLINE);
494}
495
Andreas Eversbergfa163e82014-01-19 11:47:44 +0100496static void config_write_bts_amr(struct vty *vty, struct gsm_bts *bts,
497 struct amr_multirate_conf *mr, int full)
498{
499 struct gsm48_multi_rate_conf *mr_conf;
500 const char *prefix = (full) ? "amr tch-f" : "amr tch-h";
501 int i, num;
502
503 if (!(mr->gsm48_ie[1]))
504 return;
505
506 mr_conf = (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
507
508 num = 0;
509 vty_out(vty, " %s modes", prefix);
510 for (i = 0; i < ((full) ? 8 : 6); i++) {
511 if ((mr->gsm48_ie[1] & (1 << i))) {
512 vty_out(vty, " %d", i);
513 num++;
514 }
515 }
516 vty_out(vty, "%s", VTY_NEWLINE);
517 if (num > 4)
518 num = 4;
519 if (num > 1) {
Holger Hans Peter Freyther8083cc92015-09-24 11:39:38 +0200520 write_amr_modes(vty, prefix, "ms", mr->ms_mode, num);
521 write_amr_modes(vty, prefix, "bts", mr->bts_mode, num);
Andreas Eversbergfa163e82014-01-19 11:47:44 +0100522 }
523 vty_out(vty, " %s start-mode ", prefix);
524 if (mr_conf->icmi) {
525 num = 0;
526 for (i = 0; i < ((full) ? 8 : 6) && num < 4; i++) {
527 if ((mr->gsm48_ie[1] & (1 << i)))
528 num++;
529 if (mr_conf->smod == num - 1) {
530 vty_out(vty, "%d%s", num, VTY_NEWLINE);
531 break;
532 }
533 }
534 } else
535 vty_out(vty, "auto%s", VTY_NEWLINE);
536}
537
Holger Hans Peter Freyther38c56672013-09-15 17:23:34 +0200538static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
539{
Harald Welted8acf142010-07-30 11:50:09 +0200540 int i;
Harald Welte97ceef92009-08-06 19:06:46 +0200541
Harald Weltee87eb462009-08-07 13:29:14 +0200542 vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE);
543 vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200544 if (bts->description)
545 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200546 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freyther6d82b7c2009-11-19 16:38:49 +0100547 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200548 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte97ceef92009-08-06 19:06:46 +0200549 VTY_NEWLINE);
Max3d94aca2016-05-11 12:45:13 +0200550 if (bts->dtxu != GSM48_DTX_SHALL_NOT_BE_USED)
551 vty_out(vty, " dtx uplink%s%s",
552 (bts->dtxu != GSM48_DTX_SHALL_BE_USED) ? "" : " force",
553 VTY_NEWLINE);
554 if (bts->dtxd)
555 vty_out(vty, " dtx downlink%s", VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200556 vty_out(vty, " base_station_id_code %u%s", bts->bsic, VTY_NEWLINE);
Harald Welte (local)cbd46102009-08-13 10:14:26 +0200557 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +0100558 vty_out(vty, " cell reselection hysteresis %u%s",
559 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
560 vty_out(vty, " rxlev access min %u%s",
561 bts->si_common.cell_sel_par.rxlev_acc_min, VTY_NEWLINE);
Sylvain Munaut00d71462010-11-28 18:17:28 +0100562
563 if (bts->si_common.cell_ro_sel_par.present) {
564 struct gsm48_si_selection_params *sp;
565 sp = &bts->si_common.cell_ro_sel_par;
566
567 if (sp->cbq)
568 vty_out(vty, " cell bar qualify %u%s",
569 sp->cbq, VTY_NEWLINE);
570
571 if (sp->cell_resel_off)
572 vty_out(vty, " cell reselection offset %u%s",
573 sp->cell_resel_off*2, VTY_NEWLINE);
574
575 if (sp->temp_offs == 7)
576 vty_out(vty, " temporary offset infinite%s",
577 VTY_NEWLINE);
578 else if (sp->temp_offs)
579 vty_out(vty, " temporary offset %u%s",
580 sp->temp_offs*10, VTY_NEWLINE);
581
582 if (sp->penalty_time == 31)
583 vty_out(vty, " penalty time reserved%s",
584 VTY_NEWLINE);
585 else if (sp->penalty_time)
586 vty_out(vty, " penalty time %u%s",
587 (sp->penalty_time*20)+20, VTY_NEWLINE);
588 }
589
Holger Hans Peter Freyther2fb8ebf2013-07-27 21:07:57 +0200590 /* Is periodic LU enabled or disabled? */
591 if (bts->si_common.chan_desc.t3212 == 0)
592 vty_out(vty, " no periodic location update%s", VTY_NEWLINE);
593 else
594 vty_out(vty, " periodic location update %u%s",
595 bts->si_common.chan_desc.t3212 * 6, VTY_NEWLINE);
596
Andreas Eversbergf9248d92013-03-10 11:49:35 +0100597 vty_out(vty, " radio-link-timeout %d%s",
598 get_radio_link_timeout(&bts->si_common.cell_options),
599 VTY_NEWLINE);
Harald Welte3e774612009-08-10 13:48:16 +0200600 vty_out(vty, " channel allocator %s%s",
601 bts->chan_alloc_reverse ? "descending" : "ascending",
602 VTY_NEWLINE);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +0100603 vty_out(vty, " rach tx integer %u%s",
604 bts->si_common.rach_control.tx_integer, VTY_NEWLINE);
605 vty_out(vty, " rach max transmission %u%s",
606 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
607 VTY_NEWLINE);
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +0800608
Andreas Eversberg14e12f22012-10-13 07:27:47 +0200609 vty_out(vty, " channel-descrption attach %u%s",
610 bts->si_common.chan_desc.att, VTY_NEWLINE);
611 vty_out(vty, " channel-descrption bs-pa-mfrms %u%s",
612 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
613 vty_out(vty, " channel-descrption bs-ag-blks-res %u%s",
614 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
615
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +0800616 if (bts->rach_b_thresh != -1)
617 vty_out(vty, " rach nm busy threshold %u%s",
618 bts->rach_b_thresh, VTY_NEWLINE);
619 if (bts->rach_ldavg_slots != -1)
620 vty_out(vty, " rach nm load average %u%s",
621 bts->rach_ldavg_slots, VTY_NEWLINE);
Harald Welte8c973ba2009-12-21 23:08:18 +0100622 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)e19be3f2009-08-12 13:28:23 +0200623 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +0800624 if ((bts->si_common.rach_control.t2 & 0x4) == 0)
625 vty_out(vty, " rach emergency call allowed 1%s", VTY_NEWLINE);
Ivan Kluchnikov80d58432013-09-16 13:13:04 +0400626 if ((bts->si_common.rach_control.t3) != 0)
627 for (i = 0; i < 8; i++)
628 if (bts->si_common.rach_control.t3 & (0x1 << i))
629 vty_out(vty, " rach access-control-class %d barred%s", i, VTY_NEWLINE);
630 if ((bts->si_common.rach_control.t2 & 0xfb) != 0)
631 for (i = 0; i < 8; i++)
632 if ((i != 2) && (bts->si_common.rach_control.t2 & (0x1 << i)))
633 vty_out(vty, " rach access-control-class %d barred%s", i+8, VTY_NEWLINE);
Harald Welted8acf142010-07-30 11:50:09 +0200634 for (i = SYSINFO_TYPE_1; i < _MAX_SYSINFO_TYPE; i++) {
635 if (bts->si_mode_static & (1 << i)) {
636 vty_out(vty, " system-information %s mode static%s",
637 get_value_string(osmo_sitype_strs, i), VTY_NEWLINE);
638 vty_out(vty, " system-information %s static %s%s",
639 get_value_string(osmo_sitype_strs, i),
Sylvain Munaut79eae142011-11-13 23:05:23 +0100640 osmo_hexdump_nospc(bts->si_buf[i], sizeof(bts->si_buf[i])),
Harald Welted8acf142010-07-30 11:50:09 +0200641 VTY_NEWLINE);
642 }
643 }
Harald Welte08011e22011-03-04 13:41:31 +0100644 switch (bts->type) {
645 case GSM_BTS_TYPE_NANOBTS:
Harald Welte35ac0e42012-07-02 19:51:55 +0200646 case GSM_BTS_TYPE_OSMO_SYSMO:
Harald Weltee87eb462009-08-07 13:29:14 +0200647 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Welte3ffe1b32009-08-07 00:25:23 +0200648 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte8b3c5952013-03-12 13:57:05 +0100649 if (bts->ip_access.rsl_ip) {
650 struct in_addr ia;
651 ia.s_addr = htonl(bts->ip_access.rsl_ip);
652 vty_out(vty, " ip.access rsl-ip %s%s", inet_ntoa(ia),
653 VTY_NEWLINE);
654 }
Pablo Neira Ayuso42e41df2011-08-17 22:44:07 +0200655 vty_out(vty, " oml ip.access stream_id %u line %u%s",
656 bts->oml_tei, bts->oml_e1_link.e1_nr, VTY_NEWLINE);
Harald Welte08011e22011-03-04 13:41:31 +0100657 break;
Sylvain Munautcb8e8432011-10-17 14:04:55 +0200658 case GSM_BTS_TYPE_NOKIA_SITE:
659 vty_out(vty, " nokia_site skip-reset %d%s", bts->nokia.skip_reset, VTY_NEWLINE);
Andreas Eversbergac27b952013-12-05 13:25:06 +0100660 vty_out(vty, " nokia_site no-local-rel-conf %d%s",
661 bts->nokia.no_loc_rel_cnf, VTY_NEWLINE);
Sipos Csabadef87b42015-02-07 13:27:36 +0100662 vty_out(vty, " nokia_site bts-reset-timer %d%s", bts->nokia.bts_reset_timer_cnf, VTY_NEWLINE);
Andreas Eversbergc3daa0f2013-12-05 16:02:37 +0100663 /* fall through: Nokia requires "oml e1" parameters also */
Harald Welte08011e22011-03-04 13:41:31 +0100664 default:
Harald Welte62868882009-08-08 16:12:58 +0200665 config_write_e1_link(vty, &bts->oml_e1_link, " oml ");
666 vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE);
Harald Welte08011e22011-03-04 13:41:31 +0100667 break;
Harald Welte62868882009-08-08 16:12:58 +0200668 }
Holger Hans Peter Freyther3112f672010-09-06 10:11:25 +0800669
670 /* if we have a limit, write it */
671 if (bts->paging.free_chans_need >= 0)
672 vty_out(vty, " paging free %d%s", bts->paging.free_chans_need, VTY_NEWLINE);
673
Harald Welteca46eff2011-01-11 23:44:56 +0100674 vty_out(vty, " neighbor-list mode %s%s",
Harald Weltef989b782011-02-15 11:43:27 +0100675 get_value_string(bts_neigh_mode_strs, bts->neigh_list_manual_mode), VTY_NEWLINE);
676 if (bts->neigh_list_manual_mode != NL_MODE_AUTOMATIC) {
Harald Welteca46eff2011-01-11 23:44:56 +0100677 for (i = 0; i < 1024; i++) {
678 if (bitvec_get_bit_pos(&bts->si_common.neigh_list, i))
679 vty_out(vty, " neighbor-list add arfcn %u%s",
680 i, VTY_NEWLINE);
681 }
682 }
Harald Weltef989b782011-02-15 11:43:27 +0100683 if (bts->neigh_list_manual_mode == NL_MODE_MANUAL_SI5SEP) {
684 for (i = 0; i < 1024; i++) {
685 if (bitvec_get_bit_pos(&bts->si_common.si5_neigh_list, i))
686 vty_out(vty, " si5 neighbor-list add arfcn %u%s",
687 i, VTY_NEWLINE);
688 }
689 }
Harald Welteca46eff2011-01-11 23:44:56 +0100690
Max88ddcaa2016-04-15 16:04:46 +0200691 for (i = 0; i < MAX_EARFCN_LIST; i++) {
692 if (bts->si_common.si2quater_neigh_list.arfcn[i] !=
693 OSMO_EARFCN_INVALID) {
694 vty_out(vty, " si2quater neighbor-list add earfcn %u threshold %u",
695 bts->si_common.si2quater_neigh_list.arfcn[i],
696 bts->si_common.si2quater_neigh_list.thresh_hi);
697 if (bts->si_common.si2quater_neigh_list.meas_bw[i] !=
698 OSMO_EARFCN_MEAS_INVALID)
699 vty_out(vty, " %u",
700 bts->si_common.si2quater_neigh_list.meas_bw[i]);
701
702 vty_out(vty, "%s", VTY_NEWLINE);
703 }
704 }
705
Maxeaf196c2016-04-20 15:57:13 +0200706 for (i = 0; i < bts->si_common.uarfcn_length; i++) {
707 vty_out(vty, " si2quater neighbor-list add uarfcn %u %u %u%s",
708 bts->si_common.data.uarfcn_list[i],
709 bts->si_common.data.scramble_list[i] & ~(1 << 9),
710 (bts->si_common.data.scramble_list[i] >> 9) & 1,
711 VTY_NEWLINE);
712 }
713
Andreas Eversberg976493b2013-12-07 18:32:28 +0100714 vty_out(vty, " codec-support fr");
715 if (bts->codec.hr)
716 vty_out(vty, " hr");
717 if (bts->codec.efr)
718 vty_out(vty, " efr");
719 if (bts->codec.amr)
720 vty_out(vty, " amr");
721 vty_out(vty, "%s", VTY_NEWLINE);
722
Andreas Eversbergfa163e82014-01-19 11:47:44 +0100723 config_write_bts_amr(vty, bts, &bts->mr_full, 1);
724 config_write_bts_amr(vty, bts, &bts->mr_half, 0);
725
Harald Weltea9251762010-05-11 23:50:21 +0200726 config_write_bts_gprs(vty, bts);
Harald Welte97ceef92009-08-06 19:06:46 +0200727
Holger Hans Peter Freyther10799162012-07-20 10:27:31 +0200728 if (bts->excl_from_rf_lock)
729 vty_out(vty, " rf-lock-exclude%s", VTY_NEWLINE);
730
Jacob Erlbeck8f8e5bf2014-01-16 11:02:14 +0100731 vty_out(vty, " %sforce-combined-si%s",
732 bts->force_combined_si ? "" : "no ", VTY_NEWLINE);
733
Holger Hans Peter Freyther15152612014-12-17 14:46:17 +0100734 for (i = 0; i < ARRAY_SIZE(bts->depends_on); ++i) {
735 int j;
736
737 if (bts->depends_on[i] == 0)
738 continue;
739
740 for (j = 0; j < sizeof(bts->depends_on[i]) * 8; ++j) {
741 int bts_nr;
742
743 if ((bts->depends_on[i] & (1<<j)) == 0)
744 continue;
745
746 bts_nr = (i * sizeof(bts->depends_on[i]) * 8) + j;
747 vty_out(vty, " depends-on-bts %d%s", bts_nr, VTY_NEWLINE);
748 }
749 }
750
Holger Hans Peter Freyther38c56672013-09-15 17:23:34 +0200751 config_write_bts_model(vty, bts);
Harald Welte97ceef92009-08-06 19:06:46 +0200752}
753
754static int config_write_bts(struct vty *v)
755{
Harald Welte40152872010-05-16 20:52:23 +0200756 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte97ceef92009-08-06 19:06:46 +0200757 struct gsm_bts *bts;
758
759 llist_for_each_entry(bts, &gsmnet->bts_list, list)
760 config_write_bts_single(v, bts);
761
762 return CMD_SUCCESS;
763}
764
Harald Weltee87eb462009-08-07 13:29:14 +0200765static int config_write_net(struct vty *vty)
766{
Harald Welte40152872010-05-16 20:52:23 +0200767 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
768
Harald Weltee87eb462009-08-07 13:29:14 +0200769 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200770 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200771 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200772 vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE);
773 vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +0200774 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Max0a378ba2016-05-24 14:23:27 +0200775 if (gsmnet->authorized_reg_str)
776 vty_out(vty, " authorized-regexp %s%s", gsmnet->authorized_reg_str, VTY_NEWLINE);
Harald Welte59936d72009-11-18 20:33:19 +0100777 vty_out(vty, " location updating reject cause %u%s",
778 gsmnet->reject_cause, VTY_NEWLINE);
Harald Weltecca253a2009-08-30 15:47:06 +0900779 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freyther6b4f5462009-11-19 16:37:48 +0100780 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +0800781 vty_out(vty, " paging any use tch %d%s", gsmnet->pag_any_tch, VTY_NEWLINE);
Harald Welte52af1952009-12-13 10:53:12 +0100782 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
783 VTY_NEWLINE);
Harald Weltea310f3e2009-12-14 09:00:24 +0100784 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Welte0af9c9f2009-12-19 21:41:52 +0100785 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Weltea8062f12009-12-21 16:51:50 +0100786 vty_out(vty, " handover window rxlev averaging %u%s",
787 gsmnet->handover.win_rxlev_avg, VTY_NEWLINE);
788 vty_out(vty, " handover window rxqual averaging %u%s",
789 gsmnet->handover.win_rxqual_avg, VTY_NEWLINE);
790 vty_out(vty, " handover window rxlev neighbor averaging %u%s",
791 gsmnet->handover.win_rxlev_avg_neigh, VTY_NEWLINE);
792 vty_out(vty, " handover power budget interval %u%s",
793 gsmnet->handover.pwr_interval, VTY_NEWLINE);
794 vty_out(vty, " handover power budget hysteresis %u%s",
795 gsmnet->handover.pwr_hysteresis, VTY_NEWLINE);
796 vty_out(vty, " handover maximum distance %u%s",
797 gsmnet->handover.max_distance, VTY_NEWLINE);
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +0100798 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +0100799 vty_out(vty, " timer t3103 %u%s", gsmnet->T3103, VTY_NEWLINE);
800 vty_out(vty, " timer t3105 %u%s", gsmnet->T3105, VTY_NEWLINE);
801 vty_out(vty, " timer t3107 %u%s", gsmnet->T3107, VTY_NEWLINE);
802 vty_out(vty, " timer t3109 %u%s", gsmnet->T3109, VTY_NEWLINE);
803 vty_out(vty, " timer t3111 %u%s", gsmnet->T3111, VTY_NEWLINE);
804 vty_out(vty, " timer t3113 %u%s", gsmnet->T3113, VTY_NEWLINE);
805 vty_out(vty, " timer t3115 %u%s", gsmnet->T3115, VTY_NEWLINE);
806 vty_out(vty, " timer t3117 %u%s", gsmnet->T3117, VTY_NEWLINE);
807 vty_out(vty, " timer t3119 %u%s", gsmnet->T3119, VTY_NEWLINE);
Harald Weltea00fdd72010-12-23 14:39:29 +0100808 vty_out(vty, " timer t3122 %u%s", gsmnet->T3122, VTY_NEWLINE);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +0100809 vty_out(vty, " timer t3141 %u%s", gsmnet->T3141, VTY_NEWLINE);
Holger Hans Peter Freyther68b21e12010-12-22 16:26:04 +0100810 vty_out(vty, " subscriber-keep-in-ram %d%s",
Jacob Erlbeckda8770b2014-12-03 09:28:24 +0100811 gsmnet->subscr_group->keep_subscr, VTY_NEWLINE);
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200812 if (gsmnet->tz.override != 0) {
813 if (gsmnet->tz.dst)
814 vty_out(vty, " timezone %d %d %d%s",
815 gsmnet->tz.hr, gsmnet->tz.mn, gsmnet->tz.dst,
816 VTY_NEWLINE);
817 else
818 vty_out(vty, " timezone %d %d%s",
819 gsmnet->tz.hr, gsmnet->tz.mn, VTY_NEWLINE);
820 }
Harald Weltee87eb462009-08-07 13:29:14 +0200821
822 return CMD_SUCCESS;
823}
Harald Welte97ceef92009-08-06 19:06:46 +0200824
Harald Welte59b04682009-06-10 05:40:52 +0800825static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx)
826{
827 vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
828 trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200829 vty_out(vty, "Description: %s%s",
830 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Welte91afe4c2009-06-20 18:15:19 +0200831 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte62868882009-08-08 16:12:58 +0200832 "resulting BS power: %d dBm%s",
Harald Welte91afe4c2009-06-20 18:15:19 +0200833 trx->nominal_power, trx->max_power_red,
Harald Welte62868882009-08-08 16:12:58 +0200834 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800835 vty_out(vty, " NM State: ");
Harald Welte69f6f812011-05-30 12:07:53 +0200836 net_dump_nmstate(vty, &trx->mo.nm_state);
Harald Welte59b04682009-06-10 05:40:52 +0800837 vty_out(vty, " Baseband Transceiver NM State: ");
Harald Welte69f6f812011-05-30 12:07:53 +0200838 net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);
Harald Welte25572872009-10-20 00:22:00 +0200839 if (is_ipaccess_bts(trx->bts)) {
840 vty_out(vty, " ip.access stream ID: 0x%02x%s",
841 trx->rsl_tei, VTY_NEWLINE);
842 } else {
843 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
844 e1isl_dump_vty(vty, trx->rsl_link);
845 }
Harald Welte59b04682009-06-10 05:40:52 +0800846}
847
848DEFUN(show_trx,
849 show_trx_cmd,
Sylvain Munaut1ad96282012-12-28 12:15:11 +0100850 "show trx [<0-255>] [<0-255>]",
Harald Welte9e002452010-05-11 21:53:49 +0200851 SHOW_STR "Display information about a TRX\n"
852 "BTS Number\n"
853 "TRX Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800854{
Harald Welte40152872010-05-16 20:52:23 +0200855 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800856 struct gsm_bts *bts = NULL;
857 struct gsm_bts_trx *trx;
858 int bts_nr, trx_nr;
859
860 if (argc >= 1) {
861 /* use the BTS number that the user has specified */
862 bts_nr = atoi(argv[0]);
863 if (bts_nr >= net->num_bts) {
864 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
865 VTY_NEWLINE);
866 return CMD_WARNING;
867 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200868 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800869 }
870 if (argc >= 2) {
871 trx_nr = atoi(argv[1]);
872 if (trx_nr >= bts->num_trx) {
873 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
874 VTY_NEWLINE);
875 return CMD_WARNING;
876 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200877 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800878 trx_dump_vty(vty, trx);
879 return CMD_SUCCESS;
880 }
881 if (bts) {
882 /* print all TRX in this BTS */
883 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200884 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800885 trx_dump_vty(vty, trx);
886 }
887 return CMD_SUCCESS;
888 }
889
890 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200891 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800892 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200893 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800894 trx_dump_vty(vty, trx);
895 }
896 }
897
898 return CMD_SUCCESS;
899}
900
Harald Welte97ceef92009-08-06 19:06:46 +0200901
Harald Welte59b04682009-06-10 05:40:52 +0800902static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
903{
Harald Welte85771a42011-05-30 12:09:13 +0200904 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, phys cfg %s, TSC %u",
Harald Weltee3bd0c02010-12-24 12:12:10 +0100905 ts->trx->bts->nr, ts->trx->nr, ts->nr,
Harald Welte025e6c92014-01-19 17:18:21 +0100906 gsm_pchan_name(ts->pchan), gsm_ts_tsc(ts));
Harald Welte98d2bb82010-12-24 12:14:52 +0100907 if (ts->pchan == GSM_PCHAN_TCH_F_PDCH)
Harald Welte81c2ed32010-12-24 12:26:13 +0100908 vty_out(vty, " (%s mode)",
Neels Hofmeyr5a3c23c2016-06-14 14:08:35 +0200909 ts->flags & TS_F_PDCH_ACTIVE ? "PDCH" : "TCH/F");
Harald Welte98d2bb82010-12-24 12:14:52 +0100910 vty_out(vty, "%s", VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800911 vty_out(vty, " NM State: ");
Harald Welte69f6f812011-05-30 12:07:53 +0200912 net_dump_nmstate(vty, &ts->mo.nm_state);
Harald Welte87504212009-12-02 01:56:49 +0530913 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welte59b04682009-06-10 05:40:52 +0800914 vty_out(vty, " E1 Line %u, Timeslot %u, Subslot %u%s",
915 ts->e1_link.e1_nr, ts->e1_link.e1_ts,
916 ts->e1_link.e1_ts_ss, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800917}
918
919DEFUN(show_ts,
920 show_ts_cmd,
Sylvain Munaut1ad96282012-12-28 12:15:11 +0100921 "show timeslot [<0-255>] [<0-255>] [<0-7>]",
Harald Welte9e002452010-05-11 21:53:49 +0200922 SHOW_STR "Display information about a TS\n"
923 "BTS Number\n" "TRX Number\n" "Timeslot Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800924{
Harald Welte40152872010-05-16 20:52:23 +0200925 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte06868382010-12-24 12:05:03 +0100926 struct gsm_bts *bts = NULL;
927 struct gsm_bts_trx *trx = NULL;
928 struct gsm_bts_trx_ts *ts = NULL;
Harald Welte59b04682009-06-10 05:40:52 +0800929 int bts_nr, trx_nr, ts_nr;
930
931 if (argc >= 1) {
932 /* use the BTS number that the user has specified */
933 bts_nr = atoi(argv[0]);
934 if (bts_nr >= net->num_bts) {
935 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
936 VTY_NEWLINE);
937 return CMD_WARNING;
938 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200939 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800940 }
941 if (argc >= 2) {
942 trx_nr = atoi(argv[1]);
943 if (trx_nr >= bts->num_trx) {
944 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
945 VTY_NEWLINE);
946 return CMD_WARNING;
947 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200948 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800949 }
950 if (argc >= 3) {
951 ts_nr = atoi(argv[2]);
952 if (ts_nr >= TRX_NR_TS) {
953 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
954 VTY_NEWLINE);
955 return CMD_WARNING;
956 }
Harald Welte06868382010-12-24 12:05:03 +0100957 /* Fully Specified: print and exit */
Harald Welte59b04682009-06-10 05:40:52 +0800958 ts = &trx->ts[ts_nr];
959 ts_dump_vty(vty, ts);
960 return CMD_SUCCESS;
961 }
Harald Welte06868382010-12-24 12:05:03 +0100962
963 if (bts && trx) {
964 /* Iterate over all TS in this TRX */
965 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
966 ts = &trx->ts[ts_nr];
967 ts_dump_vty(vty, ts);
968 }
969 } else if (bts) {
970 /* Iterate over all TRX in this BTS, TS in each TRX */
Harald Welte59b04682009-06-10 05:40:52 +0800971 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200972 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800973 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
974 ts = &trx->ts[ts_nr];
975 ts_dump_vty(vty, ts);
976 }
977 }
Harald Welte06868382010-12-24 12:05:03 +0100978 } else {
979 /* Iterate over all BTS, TRX in each BTS, TS in each TRX */
980 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
981 bts = gsm_bts_num(net, bts_nr);
982 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
983 trx = gsm_bts_trx_num(bts, trx_nr);
984 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
985 ts = &trx->ts[ts_nr];
986 ts_dump_vty(vty, ts);
987 }
988 }
989 }
Harald Welte59b04682009-06-10 05:40:52 +0800990 }
991
992 return CMD_SUCCESS;
993}
994
Holger Hans Peter Freyther1dd0a1b2010-01-06 06:00:40 +0100995static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte59b04682009-06-10 05:40:52 +0800996{
Harald Welte91afe4c2009-06-20 18:15:19 +0200997 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte59b04682009-06-10 05:40:52 +0800998 subscr->authorized, VTY_NEWLINE);
Holger Hans Peter Freyther7d552fc2013-12-12 15:45:41 +0100999 if (strlen(subscr->name))
Harald Welte59b04682009-06-10 05:40:52 +08001000 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
Holger Hans Peter Freyther4fcba8e2014-04-04 11:53:18 +02001001 if (strlen(subscr->extension))
Harald Welte59b04682009-06-10 05:40:52 +08001002 vty_out(vty, " Extension: %s%s", subscr->extension,
1003 VTY_NEWLINE);
Holger Hans Peter Freytherb0be39b2013-07-14 08:38:24 +02001004 vty_out(vty, " IMSI: %s%s", subscr->imsi, VTY_NEWLINE);
Holger Hans Peter Freythercd8bacf2009-08-19 12:53:57 +02001005 if (subscr->tmsi != GSM_RESERVED_TMSI)
1006 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte270c06c2009-08-15 03:24:51 +02001007 VTY_NEWLINE);
Sylvain Munaute5863a22009-12-27 19:29:28 +01001008
Harald Welte (local)02d5efa2009-08-14 20:27:16 +02001009 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +08001010}
1011
Harald Welte44007742009-12-22 21:43:14 +01001012static void meas_rep_dump_uni_vty(struct vty *vty,
1013 struct gsm_meas_rep_unidir *mru,
1014 const char *prefix,
1015 const char *dir)
1016{
1017 vty_out(vty, "%s RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",
1018 prefix, dir, rxlev2dbm(mru->full.rx_lev),
1019 dir, rxlev2dbm(mru->sub.rx_lev));
1020 vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",
1021 dir, mru->full.rx_qual, dir, mru->sub.rx_qual,
1022 VTY_NEWLINE);
1023}
1024
1025static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,
1026 const char *prefix)
1027{
1028 vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);
1029 vty_out(vty, "%s Flags: %s%s%s%s%s", prefix,
1030 mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",
1031 mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",
1032 mr->flags & MEAS_REP_F_FPC ? "FPC " : "",
1033 mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",
1034 VTY_NEWLINE);
1035 if (mr->flags & MEAS_REP_F_MS_TO)
1036 vty_out(vty, "%s MS Timing Offset: %u%s", prefix,
1037 mr->ms_timing_offset, VTY_NEWLINE);
1038 if (mr->flags & MEAS_REP_F_MS_L1)
1039 vty_out(vty, "%s L1 MS Power: %u dBm, Timing Advance: %u%s",
1040 prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);
1041 if (mr->flags & MEAS_REP_F_DL_VALID)
1042 meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");
1043 meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");
1044}
1045
Harald Weltee9db0242015-12-05 17:22:49 +01001046/* FIXME: move this to libosmogsm */
1047static const struct value_string gsm48_cmode_names[] = {
1048 { GSM48_CMODE_SIGN, "signalling" },
1049 { GSM48_CMODE_SPEECH_V1, "FR or HR" },
1050 { GSM48_CMODE_SPEECH_EFR, "EFR" },
1051 { GSM48_CMODE_SPEECH_AMR, "AMR" },
1052 { GSM48_CMODE_DATA_14k5, "CSD(14k5)" },
1053 { GSM48_CMODE_DATA_12k0, "CSD(12k0)" },
1054 { GSM48_CMODE_DATA_6k0, "CSD(6k0)" },
1055 { GSM48_CMODE_DATA_3k6, "CSD(3k6)" },
1056 { 0, NULL }
1057};
1058
Neels Hofmeyra7488ae2016-11-02 14:28:15 +01001059/* call vty_out() to print a string like " as TCH/H" for dynamic timeslots.
1060 * Don't do anything if the ts is not dynamic. */
1061static void vty_out_dyn_ts_status(struct vty *vty, struct gsm_bts_trx_ts *ts)
1062{
1063 switch (ts->pchan) {
1064 case GSM_PCHAN_TCH_F_TCH_H_PDCH:
1065 if (ts->dyn.pchan_is == ts->dyn.pchan_want)
1066 vty_out(vty, " as %s",
1067 gsm_pchan_name(ts->dyn.pchan_is));
1068 else
1069 vty_out(vty, " switching %s -> %s",
1070 gsm_pchan_name(ts->dyn.pchan_is),
1071 gsm_pchan_name(ts->dyn.pchan_want));
1072 break;
1073 case GSM_PCHAN_TCH_F_PDCH:
1074 if ((ts->flags & TS_F_PDCH_PENDING_MASK) == 0)
1075 vty_out(vty, " as %s",
1076 (ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
1077 : "TCH/F");
1078 else
1079 vty_out(vty, " switching %s -> %s",
1080 (ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
1081 : "TCH/F",
1082 (ts->flags & TS_F_PDCH_ACT_PENDING)? "PDCH"
1083 : "TCH/F");
1084 break;
1085 default:
1086 /* no dyn ts */
1087 break;
1088 }
1089}
1090
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +08001091static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte59b04682009-06-10 05:40:52 +08001092{
Harald Welte44007742009-12-22 21:43:14 +01001093 int idx;
1094
Harald Weltef62dad62010-12-24 12:22:34 +01001095 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",
1096 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
1097 lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);
Neels Hofmeyra7488ae2016-11-02 14:28:15 +01001098 /* show dyn TS details, if applicable */
1099 switch (lchan->ts->pchan) {
1100 case GSM_PCHAN_TCH_F_TCH_H_PDCH:
1101 vty_out(vty, " Osmocom Dyn TS:");
1102 vty_out_dyn_ts_status(vty, lchan->ts);
1103 vty_out(vty, VTY_NEWLINE);
1104 break;
1105 case GSM_PCHAN_TCH_F_PDCH:
1106 vty_out(vty, " IPACC Dyn PDCH TS:");
1107 vty_out_dyn_ts_status(vty, lchan->ts);
1108 vty_out(vty, VTY_NEWLINE);
1109 break;
1110 default:
1111 /* no dyn ts */
1112 break;
1113 }
Holger Hans Peter Freyther960adfe2014-12-28 12:08:28 +01001114 vty_out(vty, " Connection: %u, State: %s%s%s%s",
Holger Hans Peter Freyther6e5c50f2010-06-28 17:09:29 +08001115 lchan->conn ? 1: 0,
Holger Hans Peter Freyther960adfe2014-12-28 12:08:28 +01001116 gsm_lchans_name(lchan->state),
1117 lchan->state == LCHAN_S_BROKEN ? " Error reason: " : "",
1118 lchan->state == LCHAN_S_BROKEN ? lchan->broken_reason : "",
1119 VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +01001120 vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s",
1121 lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
1122 - lchan->bs_power*2,
1123 ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),
1124 VTY_NEWLINE);
Harald Weltee9db0242015-12-05 17:22:49 +01001125 vty_out(vty, " Channel Mode / Codec: %s%s",
1126 get_value_string(gsm48_cmode_names, lchan->tch_mode),
1127 VTY_NEWLINE);
Holger Hans Peter Freyther1a95fa82010-06-28 15:47:12 +08001128 if (lchan->conn && lchan->conn->subscr) {
Harald Welte59b04682009-06-10 05:40:52 +08001129 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther1a95fa82010-06-28 15:47:12 +08001130 subscr_dump_vty(vty, lchan->conn->subscr);
Harald Welte59b04682009-06-10 05:40:52 +08001131 } else
1132 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte87504212009-12-02 01:56:49 +05301133 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
1134 struct in_addr ia;
Holger Hans Peter Freythercec1ec52010-04-07 15:39:16 +02001135 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte87504212009-12-02 01:56:49 +05301136 vty_out(vty, " Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",
1137 inet_ntoa(ia), lchan->abis_ip.bound_port,
1138 lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,
1139 VTY_NEWLINE);
1140 }
Harald Welte44007742009-12-22 21:43:14 +01001141
1142 /* we want to report the last measurement report */
1143 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1144 lchan->meas_rep_idx, 1);
1145 meas_rep_dump_vty(vty, &lchan->meas_rep[idx], " ");
Harald Welte59b04682009-06-10 05:40:52 +08001146}
1147
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08001148static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
1149{
Holger Hans Peter Freythercf13a922010-05-14 01:57:02 +08001150 struct gsm_meas_rep *mr;
1151 int idx;
1152
1153 /* we want to report the last measurement report */
1154 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
1155 lchan->meas_rep_idx, 1);
1156 mr = &lchan->meas_rep[idx];
1157
Neels Hofmeyra7488ae2016-11-02 14:28:15 +01001158 vty_out(vty, "BTS %u, TRX %u, Timeslot %u %s",
Harald Weltef62dad62010-12-24 12:22:34 +01001159 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
Neels Hofmeyra7488ae2016-11-02 14:28:15 +01001160 gsm_pchan_name(lchan->ts->pchan));
1161 vty_out_dyn_ts_status(vty, lchan->ts);
1162 vty_out(vty, ", Lchan %u, Type %s, State %s - "
1163 "L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
Neels Hofmeyr73208e02016-06-14 01:31:38 +02001164 lchan->nr,
1165 gsm_lchant_name(lchan->type), gsm_lchans_name(lchan->state),
1166 mr->ms_l1.pwr,
Holger Hans Peter Freythercf13a922010-05-14 01:57:02 +08001167 rxlev2dbm(mr->dl.full.rx_lev),
1168 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08001169 VTY_NEWLINE);
1170}
1171
Holger Hans Peter Freyther86bbcbd2011-12-27 16:34:12 +01001172
1173static int dump_lchan_trx_ts(struct gsm_bts_trx_ts *ts, struct vty *vty,
1174 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1175{
1176 int lchan_nr;
1177 for (lchan_nr = 0; lchan_nr < TS_MAX_LCHAN; lchan_nr++) {
1178 struct gsm_lchan *lchan = &ts->lchan[lchan_nr];
1179 if ((lchan->type == GSM_LCHAN_NONE) && (lchan->state == LCHAN_S_NONE))
1180 continue;
1181 dump_cb(vty, lchan);
1182 }
1183
1184 return CMD_SUCCESS;
1185}
1186
1187static int dump_lchan_trx(struct gsm_bts_trx *trx, struct vty *vty,
1188 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1189{
1190 int ts_nr;
1191
1192 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
1193 struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
1194 dump_lchan_trx_ts(ts, vty, dump_cb);
1195 }
1196
1197 return CMD_SUCCESS;
1198}
1199
1200static int dump_lchan_bts(struct gsm_bts *bts, struct vty *vty,
1201 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1202{
1203 int trx_nr;
1204
1205 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
1206 struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, trx_nr);
1207 dump_lchan_trx(trx, vty, dump_cb);
1208 }
1209
1210 return CMD_SUCCESS;
1211}
1212
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +08001213static int lchan_summary(struct vty *vty, int argc, const char **argv,
1214 void (*dump_cb)(struct vty *, struct gsm_lchan *))
Harald Welte59b04682009-06-10 05:40:52 +08001215{
Harald Welte40152872010-05-16 20:52:23 +02001216 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +08001217 struct gsm_bts *bts;
1218 struct gsm_bts_trx *trx;
1219 struct gsm_bts_trx_ts *ts;
1220 struct gsm_lchan *lchan;
1221 int bts_nr, trx_nr, ts_nr, lchan_nr;
1222
1223 if (argc >= 1) {
1224 /* use the BTS number that the user has specified */
1225 bts_nr = atoi(argv[0]);
1226 if (bts_nr >= net->num_bts) {
1227 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1228 VTY_NEWLINE);
1229 return CMD_WARNING;
1230 }
Harald Weltee712a5f2009-06-21 16:17:15 +02001231 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther86bbcbd2011-12-27 16:34:12 +01001232
1233 if (argc == 1)
1234 return dump_lchan_bts(bts, vty, dump_cb);
Harald Welte59b04682009-06-10 05:40:52 +08001235 }
1236 if (argc >= 2) {
1237 trx_nr = atoi(argv[1]);
1238 if (trx_nr >= bts->num_trx) {
1239 vty_out(vty, "%% can't find TRX %s%s", argv[1],
1240 VTY_NEWLINE);
1241 return CMD_WARNING;
1242 }
Harald Weltee712a5f2009-06-21 16:17:15 +02001243 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther86bbcbd2011-12-27 16:34:12 +01001244
1245 if (argc == 2)
1246 return dump_lchan_trx(trx, vty, dump_cb);
Harald Welte59b04682009-06-10 05:40:52 +08001247 }
1248 if (argc >= 3) {
1249 ts_nr = atoi(argv[2]);
1250 if (ts_nr >= TRX_NR_TS) {
1251 vty_out(vty, "%% can't find TS %s%s", argv[2],
1252 VTY_NEWLINE);
1253 return CMD_WARNING;
1254 }
1255 ts = &trx->ts[ts_nr];
Holger Hans Peter Freyther86bbcbd2011-12-27 16:34:12 +01001256
1257 if (argc == 3)
1258 return dump_lchan_trx_ts(ts, vty, dump_cb);
Harald Welte59b04682009-06-10 05:40:52 +08001259 }
1260 if (argc >= 4) {
1261 lchan_nr = atoi(argv[3]);
1262 if (lchan_nr >= TS_MAX_LCHAN) {
1263 vty_out(vty, "%% can't find LCHAN %s%s", argv[3],
1264 VTY_NEWLINE);
1265 return CMD_WARNING;
1266 }
1267 lchan = &ts->lchan[lchan_nr];
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +08001268 dump_cb(vty, lchan);
Harald Welte59b04682009-06-10 05:40:52 +08001269 return CMD_SUCCESS;
1270 }
Holger Hans Peter Freyther86bbcbd2011-12-27 16:34:12 +01001271
1272
Harald Welte59b04682009-06-10 05:40:52 +08001273 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +02001274 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther86bbcbd2011-12-27 16:34:12 +01001275 dump_lchan_bts(bts, vty, dump_cb);
Harald Welte59b04682009-06-10 05:40:52 +08001276 }
1277
1278 return CMD_SUCCESS;
1279}
1280
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +08001281
1282DEFUN(show_lchan,
1283 show_lchan_cmd,
Sylvain Munaut1ad96282012-12-28 12:15:11 +01001284 "show lchan [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +08001285 SHOW_STR "Display information about a logical channel\n"
1286 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001287 LCHAN_NR_STR)
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +08001288
1289{
1290 return lchan_summary(vty, argc, argv, lchan_dump_full_vty);
1291}
1292
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08001293DEFUN(show_lchan_summary,
1294 show_lchan_summary_cmd,
Sylvain Munaut1ad96282012-12-28 12:15:11 +01001295 "show lchan summary [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08001296 SHOW_STR "Display information about a logical channel\n"
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001297 "Short summary\n"
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08001298 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001299 LCHAN_NR_STR)
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08001300{
1301 return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
1302}
1303
Harald Welte59b04682009-06-10 05:40:52 +08001304static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
1305{
1306 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
1307 subscr_dump_vty(vty, pag->subscr);
1308}
1309
1310static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
1311{
1312 struct gsm_paging_request *pag;
1313
Holger Hans Peter Freyther9372d9c2013-03-03 11:03:17 +01001314 if (!bts->paging.bts)
1315 return;
1316
Harald Welte59b04682009-06-10 05:40:52 +08001317 llist_for_each_entry(pag, &bts->paging.pending_requests, entry)
1318 paging_dump_vty(vty, pag);
1319}
1320
1321DEFUN(show_paging,
1322 show_paging_cmd,
Sylvain Munaut1ad96282012-12-28 12:15:11 +01001323 "show paging [<0-255>]",
Harald Welte9e002452010-05-11 21:53:49 +02001324 SHOW_STR "Display information about paging reuqests of a BTS\n"
1325 "BTS Number\n")
Harald Welte59b04682009-06-10 05:40:52 +08001326{
Harald Welte40152872010-05-16 20:52:23 +02001327 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +08001328 struct gsm_bts *bts;
1329 int bts_nr;
1330
1331 if (argc >= 1) {
1332 /* use the BTS number that the user has specified */
1333 bts_nr = atoi(argv[0]);
1334 if (bts_nr >= net->num_bts) {
1335 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1336 VTY_NEWLINE);
1337 return CMD_WARNING;
1338 }
Harald Weltee712a5f2009-06-21 16:17:15 +02001339 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +08001340 bts_paging_dump_vty(vty, bts);
1341
1342 return CMD_SUCCESS;
1343 }
1344 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +02001345 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +08001346 bts_paging_dump_vty(vty, bts);
1347 }
1348
1349 return CMD_SUCCESS;
1350}
1351
Holger Hans Peter Freyther35e6fbb2013-02-05 09:39:09 +01001352DEFUN(show_paging_group,
1353 show_paging_group_cmd,
1354 "show paging-group <0-255> IMSI",
1355 SHOW_STR "Display the paging group\n"
1356 "BTS Number\n" "IMSI\n")
1357{
1358 struct gsm_network *net = gsmnet_from_vty(vty);
1359 struct gsm_bts *bts;
1360 unsigned int page_group;
1361 int bts_nr = atoi(argv[0]);
1362
1363 if (bts_nr >= net->num_bts) {
1364 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1365 return CMD_WARNING;
1366 }
1367
1368 bts = gsm_bts_num(net, bts_nr);
1369 if (!bts) {
1370 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1371 return CMD_WARNING;
1372 }
1373
1374 page_group = gsm0502_calc_paging_group(&bts->si_common.chan_desc,
1375 str_to_imsi(argv[1]));
1376 vty_out(vty, "%%Paging group for IMSI %" PRIu64 " on BTS #%d is %u%s",
1377 str_to_imsi(argv[1]), bts->nr,
1378 page_group, VTY_NEWLINE);
1379 return CMD_SUCCESS;
1380}
1381
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001382DEFUN(cfg_net_neci,
1383 cfg_net_neci_cmd,
1384 "neci (0|1)",
Harald Welte18ce31c2010-05-14 20:05:17 +02001385 "New Establish Cause Indication\n"
1386 "Don't set the NECI bit\n" "Set the NECI bit\n")
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001387{
Harald Welte40152872010-05-16 20:52:23 +02001388 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1389
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001390 gsmnet->neci = atoi(argv[0]);
Holger Hans Peter Freytherf0f37f12010-09-06 09:36:02 +08001391 gsm_net_update_ctype(gsmnet);
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001392 return CMD_SUCCESS;
1393}
1394
Harald Welte9e002452010-05-11 21:53:49 +02001395#define HANDOVER_STR "Handover Options\n"
1396
Harald Welte0af9c9f2009-12-19 21:41:52 +01001397DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1398 "handover (0|1)",
Harald Welte9e002452010-05-11 21:53:49 +02001399 HANDOVER_STR
1400 "Don't perform in-call handover\n"
1401 "Perform in-call handover\n")
Harald Welte0af9c9f2009-12-19 21:41:52 +01001402{
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001403 int enable = atoi(argv[0]);
Harald Welte40152872010-05-16 20:52:23 +02001404 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001405
1406 if (enable && ipacc_rtp_direct) {
Harald Welteaa2c3032009-12-20 13:51:01 +01001407 vty_out(vty, "%% Cannot enable handover unless RTP Proxy mode "
1408 "is enabled by using the -P command line option%s",
1409 VTY_NEWLINE);
1410 return CMD_WARNING;
1411 }
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001412 gsmnet->handover.active = enable;
Harald Welte0af9c9f2009-12-19 21:41:52 +01001413
1414 return CMD_SUCCESS;
1415}
1416
Harald Welte9e002452010-05-11 21:53:49 +02001417#define HO_WIN_STR HANDOVER_STR "Measurement Window\n"
1418#define HO_WIN_RXLEV_STR HO_WIN_STR "Received Level Averaging\n"
1419#define HO_WIN_RXQUAL_STR HO_WIN_STR "Received Quality Averaging\n"
1420#define HO_PBUDGET_STR HANDOVER_STR "Power Budget\n"
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001421#define HO_AVG_COUNT_STR "Amount to use for Averaging\n"
Harald Welte9e002452010-05-11 21:53:49 +02001422
Harald Weltea8062f12009-12-21 16:51:50 +01001423DEFUN(cfg_net_ho_win_rxlev_avg, cfg_net_ho_win_rxlev_avg_cmd,
1424 "handover window rxlev averaging <1-10>",
Harald Welte9e002452010-05-11 21:53:49 +02001425 HO_WIN_RXLEV_STR
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001426 "How many RxLev measurements are used for averaging\n"
1427 HO_AVG_COUNT_STR)
Harald Weltea8062f12009-12-21 16:51:50 +01001428{
Harald Welte40152872010-05-16 20:52:23 +02001429 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001430 gsmnet->handover.win_rxlev_avg = atoi(argv[0]);
1431 return CMD_SUCCESS;
1432}
1433
1434DEFUN(cfg_net_ho_win_rxqual_avg, cfg_net_ho_win_rxqual_avg_cmd,
1435 "handover window rxqual averaging <1-10>",
Harald Welte9e002452010-05-11 21:53:49 +02001436 HO_WIN_RXQUAL_STR
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001437 "How many RxQual measurements are used for averaging\n"
1438 HO_AVG_COUNT_STR)
Harald Weltea8062f12009-12-21 16:51:50 +01001439{
Harald Welte40152872010-05-16 20:52:23 +02001440 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001441 gsmnet->handover.win_rxqual_avg = atoi(argv[0]);
1442 return CMD_SUCCESS;
1443}
1444
1445DEFUN(cfg_net_ho_win_rxlev_neigh_avg, cfg_net_ho_win_rxlev_avg_neigh_cmd,
1446 "handover window rxlev neighbor averaging <1-10>",
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001447 HO_WIN_RXLEV_STR "Neighbor\n"
1448 "How many RxQual measurements are used for averaging\n"
1449 HO_AVG_COUNT_STR)
Harald Weltea8062f12009-12-21 16:51:50 +01001450{
Harald Welte40152872010-05-16 20:52:23 +02001451 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001452 gsmnet->handover.win_rxlev_avg_neigh = atoi(argv[0]);
1453 return CMD_SUCCESS;
1454}
1455
1456DEFUN(cfg_net_ho_pwr_interval, cfg_net_ho_pwr_interval_cmd,
1457 "handover power budget interval <1-99>",
Harald Welte9e002452010-05-11 21:53:49 +02001458 HO_PBUDGET_STR
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001459 "How often to check if we have a better cell (SACCH frames)\n"
1460 "Interval\n" "Number\n")
Harald Weltea8062f12009-12-21 16:51:50 +01001461{
Harald Welte40152872010-05-16 20:52:23 +02001462 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001463 gsmnet->handover.pwr_interval = atoi(argv[0]);
1464 return CMD_SUCCESS;
1465}
1466
1467DEFUN(cfg_net_ho_pwr_hysteresis, cfg_net_ho_pwr_hysteresis_cmd,
1468 "handover power budget hysteresis <0-999>",
Harald Welte9e002452010-05-11 21:53:49 +02001469 HO_PBUDGET_STR
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001470 "How many dB does a neighbor to be stronger to become a HO candidate\n"
1471 "Hysteresis\n" "Number\n")
Harald Weltea8062f12009-12-21 16:51:50 +01001472{
Harald Welte40152872010-05-16 20:52:23 +02001473 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001474 gsmnet->handover.pwr_hysteresis = atoi(argv[0]);
1475 return CMD_SUCCESS;
1476}
1477
1478DEFUN(cfg_net_ho_max_distance, cfg_net_ho_max_distance_cmd,
1479 "handover maximum distance <0-9999>",
Harald Welte9e002452010-05-11 21:53:49 +02001480 HANDOVER_STR
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001481 "How big is the maximum timing advance before HO is forced\n"
1482 "Distance\n" "Number\n")
Harald Weltea8062f12009-12-21 16:51:50 +01001483{
Harald Welte40152872010-05-16 20:52:23 +02001484 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001485 gsmnet->handover.max_distance = atoi(argv[0]);
1486 return CMD_SUCCESS;
1487}
Harald Welte0af9c9f2009-12-19 21:41:52 +01001488
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +08001489DEFUN(cfg_net_pag_any_tch,
1490 cfg_net_pag_any_tch_cmd,
1491 "paging any use tch (0|1)",
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001492 "Assign a TCH when receiving a Paging Any request\n"
1493 "Any Channel\n" "Use\n" "TCH\n"
1494 "Do not use TCH for Paging Request Any\n"
1495 "Do use TCH for Paging Request Any\n")
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +08001496{
Holger Hans Peter Freytherc5628882010-09-06 10:09:19 +08001497 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +08001498 gsmnet->pag_any_tch = atoi(argv[0]);
1499 gsm_net_update_ctype(gsmnet);
1500 return CMD_SUCCESS;
1501}
1502
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001503#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001504 DEFUN(cfg_net_T##number, \
1505 cfg_net_T##number##_cmd, \
1506 "timer t" #number " <0-65535>", \
Harald Welte9e002452010-05-11 21:53:49 +02001507 "Configure GSM Timers\n" \
Holger Hans Peter Freyther18dd1a32014-04-11 19:30:27 +02001508 doc "Timer Value in seconds\n") \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001509{ \
Harald Welte40152872010-05-16 20:52:23 +02001510 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001511 int value = atoi(argv[0]); \
1512 \
1513 if (value < 0 || value > 65535) { \
1514 vty_out(vty, "Timer value %s out of range.%s", \
1515 argv[0], VTY_NEWLINE); \
1516 return CMD_WARNING; \
1517 } \
1518 \
1519 gsmnet->T##number = value; \
1520 return CMD_SUCCESS; \
1521}
1522
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001523DECLARE_TIMER(3101, "Set the timeout value for IMMEDIATE ASSIGNMENT.\n")
1524DECLARE_TIMER(3103, "Set the timeout value for HANDOVER.\n")
Harald Welte9b77f612012-06-03 13:01:47 +02001525DECLARE_TIMER(3105, "Set the timer for repetition of PHYSICAL INFORMATION.\n")
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001526DECLARE_TIMER(3107, "Currently not used.\n")
Holger Hans Peter Freyther969a4052011-12-28 16:21:05 +01001527DECLARE_TIMER(3109, "Set the RSL SACCH deactivation timeout.\n")
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001528DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.\n")
1529DECLARE_TIMER(3113, "Set the time to try paging a subscriber.\n")
1530DECLARE_TIMER(3115, "Currently not used.\n")
1531DECLARE_TIMER(3117, "Currently not used.\n")
1532DECLARE_TIMER(3119, "Currently not used.\n")
1533DECLARE_TIMER(3122, "Waiting time (seconds) after IMM ASS REJECT\n")
1534DECLARE_TIMER(3141, "Currently not used.\n")
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001535
Max3d94aca2016-05-11 12:45:13 +02001536DEFUN_DEPRECATED(cfg_net_dtx,
1537 cfg_net_dtx_cmd,
1538 "dtx-used (0|1)",
1539 ".HIDDEN\n""Obsolete\n""Obsolete\n")
Holger Hans Peter Freyther21d63ff2010-09-06 09:25:48 +08001540{
Max3d94aca2016-05-11 12:45:13 +02001541 vty_out(vty, "%% 'dtx-used' is now deprecated: use dtx * "
1542 "configuration options of BTS instead%s", VTY_NEWLINE);
1543 return CMD_SUCCESS;
Holger Hans Peter Freyther21d63ff2010-09-06 09:25:48 +08001544}
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001545
Harald Welte59b04682009-06-10 05:40:52 +08001546/* per-BTS configuration */
1547DEFUN(cfg_bts,
1548 cfg_bts_cmd,
Harald Welte2af06cb2012-08-17 12:50:14 +02001549 "bts <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02001550 "Select a BTS to configure\n"
1551 "BTS Number\n")
Harald Welte59b04682009-06-10 05:40:52 +08001552{
Harald Welte40152872010-05-16 20:52:23 +02001553 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +08001554 int bts_nr = atoi(argv[0]);
1555 struct gsm_bts *bts;
1556
Harald Weltee712a5f2009-06-21 16:17:15 +02001557 if (bts_nr > gsmnet->num_bts) {
1558 vty_out(vty, "%% The next unused BTS number is %u%s",
1559 gsmnet->num_bts, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +08001560 return CMD_WARNING;
Harald Weltee712a5f2009-06-21 16:17:15 +02001561 } else if (bts_nr == gsmnet->num_bts) {
1562 /* allocate a new one */
Harald Weltec7881282011-06-05 13:31:33 +02001563 bts = gsm_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,
Harald Welte7bb55f32015-11-20 10:43:31 +01001564 HARDCODED_BSIC);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02001565 } else
Harald Weltee712a5f2009-06-21 16:17:15 +02001566 bts = gsm_bts_num(gsmnet, bts_nr);
1567
Daniel Willmann580085f2010-01-11 13:43:07 +01001568 if (!bts) {
1569 vty_out(vty, "%% Unable to allocate BTS %u%s",
1570 gsmnet->num_bts, VTY_NEWLINE);
Harald Weltee712a5f2009-06-21 16:17:15 +02001571 return CMD_WARNING;
Daniel Willmann580085f2010-01-11 13:43:07 +01001572 }
Harald Welte59b04682009-06-10 05:40:52 +08001573
1574 vty->index = bts;
Harald Welte8791dac2010-05-14 17:59:53 +02001575 vty->index_sub = &bts->description;
Harald Welte59b04682009-06-10 05:40:52 +08001576 vty->node = BTS_NODE;
1577
1578 return CMD_SUCCESS;
1579}
1580
1581DEFUN(cfg_bts_type,
1582 cfg_bts_type_cmd,
Harald Welte85a77b12012-08-17 13:02:12 +02001583 "type TYPE", /* dynamically created */
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001584 "Set the BTS type\n" "Type\n")
Harald Welte59b04682009-06-10 05:40:52 +08001585{
1586 struct gsm_bts *bts = vty->index;
Harald Welte59698fb2010-01-10 18:01:52 +01001587 int rc;
Harald Welte59b04682009-06-10 05:40:52 +08001588
Harald Welte59698fb2010-01-10 18:01:52 +01001589 rc = gsm_set_bts_type(bts, parse_btstype(argv[0]));
1590 if (rc < 0)
1591 return CMD_WARNING;
Harald Welte25572872009-10-20 00:22:00 +02001592
Harald Welte59b04682009-06-10 05:40:52 +08001593 return CMD_SUCCESS;
1594}
1595
Harald Welte91afe4c2009-06-20 18:15:19 +02001596DEFUN(cfg_bts_band,
1597 cfg_bts_band_cmd,
1598 "band BAND",
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001599 "Set the frequency band of this BTS\n" "Frequency band\n")
Harald Welte91afe4c2009-06-20 18:15:19 +02001600{
1601 struct gsm_bts *bts = vty->index;
Harald Welte62868882009-08-08 16:12:58 +02001602 int band = gsm_band_parse(argv[0]);
Harald Welte91afe4c2009-06-20 18:15:19 +02001603
1604 if (band < 0) {
1605 vty_out(vty, "%% BAND %d is not a valid GSM band%s",
1606 band, VTY_NEWLINE);
1607 return CMD_WARNING;
1608 }
1609
1610 bts->band = band;
1611
1612 return CMD_SUCCESS;
1613}
1614
Max3d94aca2016-05-11 12:45:13 +02001615DEFUN(cfg_bts_dtxu, cfg_bts_dtxu_cmd, "dtx uplink [force]",
1616 "Configure discontinuous transmission\n"
1617 "Enable Uplink DTX for this BTS\n"
1618 "MS 'shall' use DTXu instead of 'may' use (might not be supported by "
1619 "older phones).\n")
1620{
1621 struct gsm_bts *bts = vty->index;
1622
1623 bts->dtxu = (argc > 0) ? GSM48_DTX_SHALL_BE_USED : GSM48_DTX_MAY_BE_USED;
Max032beff2016-06-06 11:30:57 +02001624 if (!is_ipaccess_bts(bts))
1625 vty_out(vty, "%% DTX enabled on non-IP BTS: this configuration "
1626 "neither supported nor tested!%s", VTY_NEWLINE);
Max3d94aca2016-05-11 12:45:13 +02001627 return CMD_SUCCESS;
1628}
1629
1630DEFUN(cfg_bts_no_dtxu, cfg_bts_no_dtxu_cmd, "no dtx uplink",
1631 NO_STR
1632 "Configure discontinuous transmission\n"
1633 "Disable Uplink DTX for this BTS\n")
1634{
1635 struct gsm_bts *bts = vty->index;
1636
1637 bts->dtxu = GSM48_DTX_SHALL_NOT_BE_USED;
1638
1639 return CMD_SUCCESS;
1640}
1641
1642DEFUN(cfg_bts_dtxd, cfg_bts_dtxd_cmd, "dtx downlink",
1643 "Configure discontinuous transmission\n"
1644 "Enable Downlink DTX for this BTS\n")
1645{
1646 struct gsm_bts *bts = vty->index;
1647
1648 bts->dtxd = true;
Max032beff2016-06-06 11:30:57 +02001649 if (!is_ipaccess_bts(bts))
1650 vty_out(vty, "%% DTX enabled on non-IP BTS: this configuration "
1651 "neither supported nor tested!%s", VTY_NEWLINE);
Max3d94aca2016-05-11 12:45:13 +02001652 return CMD_SUCCESS;
1653}
1654
1655DEFUN(cfg_bts_no_dtxd, cfg_bts_no_dtxd_cmd, "no dtx downlink",
1656 NO_STR
1657 "Configure discontinuous transmission\n"
1658 "Disable Downlink DTX for this BTS\n")
1659{
1660 struct gsm_bts *bts = vty->index;
1661
1662 bts->dtxd = false;
1663
1664 return CMD_SUCCESS;
1665}
1666
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +02001667DEFUN(cfg_bts_ci,
1668 cfg_bts_ci_cmd,
1669 "cell_identity <0-65535>",
Holger Hans Peter Freyther29844222012-07-21 00:27:10 +02001670 "Set the Cell identity of this BTS\n" "Cell Identity\n")
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +02001671{
1672 struct gsm_bts *bts = vty->index;
1673 int ci = atoi(argv[0]);
1674
1675 if (ci < 0 || ci > 0xffff) {
1676 vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s",
1677 ci, VTY_NEWLINE);
1678 return CMD_WARNING;
1679 }
1680 bts->cell_identity = ci;
1681
1682 return CMD_SUCCESS;
1683}
1684
Harald Welte59b04682009-06-10 05:40:52 +08001685DEFUN(cfg_bts_lac,
1686 cfg_bts_lac_cmd,
Holger Hans Peter Freyther54a22832009-09-29 14:02:33 +02001687 "location_area_code <0-65535>",
Holger Hans Peter Freyther29844222012-07-21 00:27:10 +02001688 "Set the Location Area Code (LAC) of this BTS\n" "LAC\n")
Harald Welte59b04682009-06-10 05:40:52 +08001689{
1690 struct gsm_bts *bts = vty->index;
1691 int lac = atoi(argv[0]);
1692
Holger Hans Peter Freyther54a22832009-09-29 14:02:33 +02001693 if (lac < 0 || lac > 0xffff) {
1694 vty_out(vty, "%% LAC %d is not in the valid range (0-65535)%s",
Harald Welte59b04682009-06-10 05:40:52 +08001695 lac, VTY_NEWLINE);
1696 return CMD_WARNING;
1697 }
Holger Hans Peter Freyther6c6ab862009-10-01 04:07:15 +02001698
1699 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
1700 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
1701 lac, VTY_NEWLINE);
1702 return CMD_WARNING;
1703 }
1704
Harald Welte59b04682009-06-10 05:40:52 +08001705 bts->location_area_code = lac;
1706
1707 return CMD_SUCCESS;
1708}
1709
Harald Weltea54a2bb2009-12-01 18:04:30 +05301710
Harald Welte7bb55f32015-11-20 10:43:31 +01001711/* compatibility wrapper for old config files */
1712DEFUN_HIDDEN(cfg_bts_tsc,
Harald Welte59b04682009-06-10 05:40:52 +08001713 cfg_bts_tsc_cmd,
Harald Weltede896da2012-05-31 10:57:08 +02001714 "training_sequence_code <0-7>",
Holger Hans Peter Freyther29844222012-07-21 00:27:10 +02001715 "Set the Training Sequence Code (TSC) of this BTS\n" "TSC\n")
Harald Welte59b04682009-06-10 05:40:52 +08001716{
Harald Welte59b04682009-06-10 05:40:52 +08001717 return CMD_SUCCESS;
1718}
1719
1720DEFUN(cfg_bts_bsic,
1721 cfg_bts_bsic_cmd,
1722 "base_station_id_code <0-63>",
Harald Welte557f3992012-08-16 23:23:50 +02001723 "Set the Base Station Identity Code (BSIC) of this BTS\n"
1724 "BSIC of this BTS\n")
Harald Welte59b04682009-06-10 05:40:52 +08001725{
1726 struct gsm_bts *bts = vty->index;
1727 int bsic = atoi(argv[0]);
1728
1729 if (bsic < 0 || bsic > 0x3f) {
Harald Welte62868882009-08-08 16:12:58 +02001730 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte59b04682009-06-10 05:40:52 +08001731 bsic, VTY_NEWLINE);
1732 return CMD_WARNING;
1733 }
1734 bts->bsic = bsic;
1735
1736 return CMD_SUCCESS;
1737}
1738
Harald Welte59b04682009-06-10 05:40:52 +08001739DEFUN(cfg_bts_unit_id,
1740 cfg_bts_unit_id_cmd,
Harald Weltef515aa02009-08-07 13:27:09 +02001741 "ip.access unit_id <0-65534> <0-255>",
Harald Welte557f3992012-08-16 23:23:50 +02001742 "Abis/IP specific options\n"
1743 "Set the IPA BTS Unit ID\n"
1744 "Unit ID (Site)\n"
1745 "Unit ID (BTS)\n")
Harald Welte59b04682009-06-10 05:40:52 +08001746{
1747 struct gsm_bts *bts = vty->index;
1748 int site_id = atoi(argv[0]);
1749 int bts_id = atoi(argv[1]);
1750
Harald Weltef515aa02009-08-07 13:27:09 +02001751 if (!is_ipaccess_bts(bts)) {
1752 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1753 return CMD_WARNING;
1754 }
1755
Harald Welte59b04682009-06-10 05:40:52 +08001756 bts->ip_access.site_id = site_id;
1757 bts->ip_access.bts_id = bts_id;
1758
1759 return CMD_SUCCESS;
1760}
1761
Harald Welte8b3c5952013-03-12 13:57:05 +01001762DEFUN(cfg_bts_rsl_ip,
1763 cfg_bts_rsl_ip_cmd,
1764 "ip.access rsl-ip A.B.C.D",
1765 "Abis/IP specific options\n"
1766 "Set the IPA RSL IP Address of the BSC\n"
1767 "Destination IP address for RSL connection\n")
1768{
1769 struct gsm_bts *bts = vty->index;
1770 struct in_addr ia;
1771
1772 if (!is_ipaccess_bts(bts)) {
1773 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1774 return CMD_WARNING;
1775 }
1776
1777 inet_aton(argv[0], &ia);
1778 bts->ip_access.rsl_ip = ntohl(ia.s_addr);
1779
1780 return CMD_SUCCESS;
1781}
1782
Andreas Eversbergac27b952013-12-05 13:25:06 +01001783#define NOKIA_STR "Nokia *Site related commands\n"
Harald Welte8b3c5952013-03-12 13:57:05 +01001784
Sylvain Munautcb8e8432011-10-17 14:04:55 +02001785DEFUN(cfg_bts_nokia_site_skip_reset,
1786 cfg_bts_nokia_site_skip_reset_cmd,
1787 "nokia_site skip-reset (0|1)",
Andreas Eversbergac27b952013-12-05 13:25:06 +01001788 NOKIA_STR
Harald Welte557f3992012-08-16 23:23:50 +02001789 "Skip the reset step during bootstrap process of this BTS\n"
1790 "Do NOT skip the reset\n" "Skip the reset\n")
Sylvain Munautcb8e8432011-10-17 14:04:55 +02001791{
1792 struct gsm_bts *bts = vty->index;
1793
1794 if (bts->type != GSM_BTS_TYPE_NOKIA_SITE) {
1795 vty_out(vty, "%% BTS is not of Nokia *Site type%s", VTY_NEWLINE);
1796 return CMD_WARNING;
1797 }
1798
1799 bts->nokia.skip_reset = atoi(argv[0]);
1800
1801 return CMD_SUCCESS;
1802}
1803
Andreas Eversbergac27b952013-12-05 13:25:06 +01001804DEFUN(cfg_bts_nokia_site_no_loc_rel_cnf,
1805 cfg_bts_nokia_site_no_loc_rel_cnf_cmd,
1806 "nokia_site no-local-rel-conf (0|1)",
1807 NOKIA_STR
1808 "Do not wait for RELease CONFirm message when releasing channel locally\n"
1809 "Wait for RELease CONFirm\n" "Do not wait for RELease CONFirm\n")
1810{
1811 struct gsm_bts *bts = vty->index;
1812
1813 if (!is_nokia_bts(bts)) {
1814 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1815 VTY_NEWLINE);
1816 return CMD_WARNING;
1817 }
1818
1819 bts->nokia.no_loc_rel_cnf = atoi(argv[0]);
1820
1821 return CMD_SUCCESS;
1822}
1823
Sipos Csabadef87b42015-02-07 13:27:36 +01001824DEFUN(cfg_bts_nokia_site_bts_reset_timer_cnf,
1825 cfg_bts_nokia_site_bts_reset_timer_cnf_cmd,
1826 "nokia_site bts-reset-timer <15-100>",
1827 NOKIA_STR
1828 "The amount of time (in sec.) between BTS_RESET is sent,\n"
1829 "and the BTS is being bootstrapped.\n")
1830{
1831 struct gsm_bts *bts = vty->index;
1832
1833 if (!is_nokia_bts(bts)) {
1834 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1835 VTY_NEWLINE);
1836 return CMD_WARNING;
1837 }
1838
1839 bts->nokia.bts_reset_timer_cnf = atoi(argv[0]);
1840
1841 return CMD_SUCCESS;
1842}
Harald Welte9e002452010-05-11 21:53:49 +02001843#define OML_STR "Organization & Maintenance Link\n"
Harald Welte557f3992012-08-16 23:23:50 +02001844#define IPA_STR "A-bis/IP Specific Options\n"
Harald Welte9e002452010-05-11 21:53:49 +02001845
Harald Welte25572872009-10-20 00:22:00 +02001846DEFUN(cfg_bts_stream_id,
1847 cfg_bts_stream_id_cmd,
Pablo Neira Ayuso42e41df2011-08-17 22:44:07 +02001848 "oml ip.access stream_id <0-255> line E1_LINE",
Harald Welte9e002452010-05-11 21:53:49 +02001849 OML_STR IPA_STR
Harald Welte557f3992012-08-16 23:23:50 +02001850 "Set the ip.access Stream ID of the OML link of this BTS\n"
1851 "Stream Identifier\n" "Virtual E1 Line Number\n" "Virtual E1 Line Number\n")
Harald Welte25572872009-10-20 00:22:00 +02001852{
1853 struct gsm_bts *bts = vty->index;
Pablo Neira Ayuso42e41df2011-08-17 22:44:07 +02001854 int stream_id = atoi(argv[0]), linenr = atoi(argv[1]);
Harald Welte25572872009-10-20 00:22:00 +02001855
1856 if (!is_ipaccess_bts(bts)) {
1857 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1858 return CMD_WARNING;
1859 }
1860
1861 bts->oml_tei = stream_id;
Pablo Neira Ayuso42e41df2011-08-17 22:44:07 +02001862 /* This is used by e1inp_bind_ops callback for each BTS model. */
1863 bts->oml_e1_link.e1_nr = linenr;
1864
1865 return CMD_SUCCESS;
1866}
1867
Harald Weltefa2015f2012-08-17 09:52:03 +02001868#define OML_E1_STR OML_STR "OML E1/T1 Configuration\n"
Harald Welte25572872009-10-20 00:22:00 +02001869
Harald Welte62868882009-08-08 16:12:58 +02001870DEFUN(cfg_bts_oml_e1,
1871 cfg_bts_oml_e1_cmd,
1872 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltefa2015f2012-08-17 09:52:03 +02001873 OML_E1_STR
1874 "E1/T1 line number to be used for OML\n"
Harald Welte557f3992012-08-16 23:23:50 +02001875 "E1/T1 line number to be used for OML\n"
1876 "E1/T1 timeslot to be used for OML\n"
1877 "E1/T1 timeslot to be used for OML\n"
1878 "E1/T1 sub-slot to be used for OML\n"
1879 "Use E1/T1 sub-slot 0\n"
1880 "Use E1/T1 sub-slot 1\n"
1881 "Use E1/T1 sub-slot 2\n"
1882 "Use E1/T1 sub-slot 3\n"
1883 "Use full E1 slot 3\n"
1884 )
Harald Welte62868882009-08-08 16:12:58 +02001885{
1886 struct gsm_bts *bts = vty->index;
1887
1888 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
1889
1890 return CMD_SUCCESS;
1891}
1892
1893
1894DEFUN(cfg_bts_oml_e1_tei,
1895 cfg_bts_oml_e1_tei_cmd,
1896 "oml e1 tei <0-63>",
Harald Welte9e002452010-05-11 21:53:49 +02001897 OML_E1_STR
Harald Welte557f3992012-08-16 23:23:50 +02001898 "Set the TEI to be used for OML\n"
1899 "TEI Number\n")
Harald Welte62868882009-08-08 16:12:58 +02001900{
1901 struct gsm_bts *bts = vty->index;
1902
1903 bts->oml_tei = atoi(argv[0]);
1904
1905 return CMD_SUCCESS;
1906}
1907
Harald Welte3e774612009-08-10 13:48:16 +02001908DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1909 "channel allocator (ascending|descending)",
Harald Welte9e002452010-05-11 21:53:49 +02001910 "Channnel Allocator\n" "Channel Allocator\n"
1911 "Allocate Timeslots and Transceivers in ascending order\n"
1912 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte3e774612009-08-10 13:48:16 +02001913{
1914 struct gsm_bts *bts = vty->index;
1915
1916 if (!strcmp(argv[0], "ascending"))
1917 bts->chan_alloc_reverse = 0;
1918 else
1919 bts->chan_alloc_reverse = 1;
1920
1921 return CMD_SUCCESS;
1922}
1923
Harald Welte9e002452010-05-11 21:53:49 +02001924#define RACH_STR "Random Access Control Channel\n"
1925
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01001926DEFUN(cfg_bts_rach_tx_integer,
1927 cfg_bts_rach_tx_integer_cmd,
1928 "rach tx integer <0-15>",
Harald Welte9e002452010-05-11 21:53:49 +02001929 RACH_STR
Harald Welte557f3992012-08-16 23:23:50 +02001930 "Set the raw tx integer value in RACH Control parameters IE\n"
1931 "Set the raw tx integer value in RACH Control parameters IE\n"
1932 "Raw tx integer value in RACH Control parameters IE\n")
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01001933{
1934 struct gsm_bts *bts = vty->index;
1935 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
1936 return CMD_SUCCESS;
1937}
1938
1939DEFUN(cfg_bts_rach_max_trans,
1940 cfg_bts_rach_max_trans_cmd,
1941 "rach max transmission (1|2|4|7)",
Harald Welte9e002452010-05-11 21:53:49 +02001942 RACH_STR
Harald Welte557f3992012-08-16 23:23:50 +02001943 "Set the maximum number of RACH burst transmissions\n"
1944 "Set the maximum number of RACH burst transmissions\n"
Harald Weltefa2015f2012-08-17 09:52:03 +02001945 "Maximum number of 1 RACH burst transmissions\n"
1946 "Maximum number of 2 RACH burst transmissions\n"
1947 "Maximum number of 4 RACH burst transmissions\n"
1948 "Maximum number of 7 RACH burst transmissions\n")
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01001949{
1950 struct gsm_bts *bts = vty->index;
1951 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
1952 return CMD_SUCCESS;
1953}
1954
Andreas Eversberg14e12f22012-10-13 07:27:47 +02001955#define CD_STR "Channel Description\n"
1956
1957DEFUN(cfg_bts_chan_desc_att,
1958 cfg_bts_chan_desc_att_cmd,
1959 "channel-descrption attach (0|1)",
1960 CD_STR
1961 "Set if attachment is required\n"
1962 "Attachment is NOT required\n"
1963 "Attachment is required (standard)\n")
1964{
1965 struct gsm_bts *bts = vty->index;
1966 bts->si_common.chan_desc.att = atoi(argv[0]);
1967 return CMD_SUCCESS;
1968}
1969
1970DEFUN(cfg_bts_chan_desc_bs_pa_mfrms,
1971 cfg_bts_chan_desc_bs_pa_mfrms_cmd,
1972 "channel-descrption bs-pa-mfrms <2-9>",
1973 CD_STR
1974 "Set number of multiframe periods for paging groups\n"
1975 "Number of multiframe periods for paging groups\n")
1976{
1977 struct gsm_bts *bts = vty->index;
1978 int bs_pa_mfrms = atoi(argv[0]);
1979
1980 bts->si_common.chan_desc.bs_pa_mfrms = bs_pa_mfrms - 2;
1981 return CMD_SUCCESS;
1982}
1983
1984DEFUN(cfg_bts_chan_desc_bs_ag_blks_res,
1985 cfg_bts_chan_desc_bs_ag_blks_res_cmd,
1986 "channel-descrption bs-ag-blks-res <0-7>",
1987 CD_STR
1988 "Set number of blocks reserved for access grant\n"
1989 "Number of blocks reserved for access grant\n")
1990{
1991 struct gsm_bts *bts = vty->index;
1992 int bs_ag_blks_res = atoi(argv[0]);
1993
1994 bts->si_common.chan_desc.bs_ag_blks_res = bs_ag_blks_res;
1995 return CMD_SUCCESS;
1996}
1997
Harald Welte9e002452010-05-11 21:53:49 +02001998#define NM_STR "Network Management\n"
1999
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08002000DEFUN(cfg_bts_rach_nm_b_thresh,
2001 cfg_bts_rach_nm_b_thresh_cmd,
2002 "rach nm busy threshold <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02002003 RACH_STR NM_STR
Harald Welte557f3992012-08-16 23:23:50 +02002004 "Set the NM Busy Threshold\n"
2005 "Set the NM Busy Threshold\n"
2006 "NM Busy Threshold in dB")
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08002007{
2008 struct gsm_bts *bts = vty->index;
2009 bts->rach_b_thresh = atoi(argv[0]);
2010 return CMD_SUCCESS;
2011}
2012
2013DEFUN(cfg_bts_rach_nm_ldavg,
2014 cfg_bts_rach_nm_ldavg_cmd,
2015 "rach nm load average <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02002016 RACH_STR NM_STR
Harald Welte557f3992012-08-16 23:23:50 +02002017 "Set the NM Loadaverage Slots value\n"
2018 "Set the NM Loadaverage Slots value\n"
2019 "NM Loadaverage Slots value\n")
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08002020{
2021 struct gsm_bts *bts = vty->index;
2022 bts->rach_ldavg_slots = atoi(argv[0]);
2023 return CMD_SUCCESS;
2024}
2025
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02002026DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
2027 "cell barred (0|1)",
Harald Welte557f3992012-08-16 23:23:50 +02002028 "Should this cell be barred from access?\n"
2029 "Should this cell be barred from access?\n"
2030 "Cell should NOT be barred\n"
2031 "Cell should be barred\n")
2032
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02002033{
2034 struct gsm_bts *bts = vty->index;
2035
Harald Welte8c973ba2009-12-21 23:08:18 +01002036 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02002037
2038 return CMD_SUCCESS;
2039}
2040
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +08002041DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
2042 "rach emergency call allowed (0|1)",
Harald Welte557f3992012-08-16 23:23:50 +02002043 RACH_STR
2044 "Should this cell allow emergency calls?\n"
2045 "Should this cell allow emergency calls?\n"
2046 "Should this cell allow emergency calls?\n"
2047 "Do NOT allow emergency calls\n"
2048 "Allow emergency calls\n")
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +08002049{
2050 struct gsm_bts *bts = vty->index;
2051
2052 if (atoi(argv[0]) == 0)
2053 bts->si_common.rach_control.t2 |= 0x4;
2054 else
2055 bts->si_common.rach_control.t2 &= ~0x4;
2056
2057 return CMD_SUCCESS;
2058}
2059
Ivan Kluchnikov80d58432013-09-16 13:13:04 +04002060DEFUN(cfg_bts_rach_ac_class, cfg_bts_rach_ac_class_cmd,
2061 "rach access-control-class (0|1|2|3|4|5|6|7|8|9|11|12|13|14|15) (barred|allowed)",
2062 RACH_STR
2063 "Set access control class\n"
2064 "Access control class 0\n"
2065 "Access control class 1\n"
2066 "Access control class 2\n"
2067 "Access control class 3\n"
2068 "Access control class 4\n"
2069 "Access control class 5\n"
2070 "Access control class 6\n"
2071 "Access control class 7\n"
2072 "Access control class 8\n"
2073 "Access control class 9\n"
2074 "Access control class 11 for PLMN use\n"
2075 "Access control class 12 for security services\n"
2076 "Access control class 13 for public utilities (e.g. water/gas suppliers)\n"
2077 "Access control class 14 for emergency services\n"
2078 "Access control class 15 for PLMN staff\n"
2079 "barred to use access control class\n"
2080 "allowed to use access control class\n")
2081{
2082 struct gsm_bts *bts = vty->index;
2083
2084 uint8_t control_class;
2085 uint8_t allowed = 0;
2086
2087 if (strcmp(argv[1], "allowed") == 0)
2088 allowed = 1;
2089
2090 control_class = atoi(argv[0]);
2091 if (control_class < 8)
2092 if (allowed)
2093 bts->si_common.rach_control.t3 &= ~(0x1 << control_class);
2094 else
2095 bts->si_common.rach_control.t3 |= (0x1 << control_class);
2096 else
2097 if (allowed)
2098 bts->si_common.rach_control.t2 &= ~(0x1 << (control_class - 8));
2099 else
2100 bts->si_common.rach_control.t2 |= (0x1 << (control_class - 8));
2101
2102 return CMD_SUCCESS;
2103}
2104
Harald Welte (local)cbd46102009-08-13 10:14:26 +02002105DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
2106 "ms max power <0-40>",
Harald Welte557f3992012-08-16 23:23:50 +02002107 "MS Options\n"
Harald Weltefa2015f2012-08-17 09:52:03 +02002108 "Maximum transmit power of the MS\n"
2109 "Maximum transmit power of the MS\n"
Harald Welte557f3992012-08-16 23:23:50 +02002110 "Maximum transmit power of the MS in dBm")
Harald Welte (local)cbd46102009-08-13 10:14:26 +02002111{
2112 struct gsm_bts *bts = vty->index;
2113
2114 bts->ms_max_power = atoi(argv[0]);
2115
2116 return CMD_SUCCESS;
2117}
2118
Harald Welte557f3992012-08-16 23:23:50 +02002119#define CELL_STR "Cell Parameters\n"
2120
Harald Welteb761bf82009-12-12 18:17:25 +01002121DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
2122 "cell reselection hysteresis <0-14>",
Harald Welte557f3992012-08-16 23:23:50 +02002123 CELL_STR "Cell re-selection parameters\n"
2124 "Cell Re-Selection Hysteresis in dB\n"
Harald Welteb761bf82009-12-12 18:17:25 +01002125 "Cell Re-Selection Hysteresis in dB")
2126{
2127 struct gsm_bts *bts = vty->index;
2128
2129 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
2130
2131 return CMD_SUCCESS;
2132}
2133
2134DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
2135 "rxlev access min <0-63>",
Harald Welte557f3992012-08-16 23:23:50 +02002136 "Minimum RxLev needed for cell access\n"
2137 "Minimum RxLev needed for cell access\n"
2138 "Minimum RxLev needed for cell access\n"
Harald Welteb761bf82009-12-12 18:17:25 +01002139 "Minimum RxLev needed for cell access (better than -110dBm)")
2140{
2141 struct gsm_bts *bts = vty->index;
2142
2143 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
2144
2145 return CMD_SUCCESS;
2146}
2147
Sylvain Munaut00d71462010-11-28 18:17:28 +01002148DEFUN(cfg_bts_cell_bar_qualify, cfg_bts_cell_bar_qualify_cmd,
2149 "cell bar qualify (0|1)",
Harald Welte557f3992012-08-16 23:23:50 +02002150 CELL_STR "Cell Bar Qualify\n" "Cell Bar Qualify\n"
2151 "Set CBQ to 0\n" "Set CBQ to 1\n")
Sylvain Munaut00d71462010-11-28 18:17:28 +01002152{
2153 struct gsm_bts *bts = vty->index;
2154
2155 bts->si_common.cell_ro_sel_par.present = 1;
2156 bts->si_common.cell_ro_sel_par.cbq = atoi(argv[0]);
2157
2158 return CMD_SUCCESS;
2159}
2160
2161DEFUN(cfg_bts_cell_resel_ofs, cfg_bts_cell_resel_ofs_cmd,
2162 "cell reselection offset <0-126>",
Harald Welte557f3992012-08-16 23:23:50 +02002163 CELL_STR "Cell Re-Selection Parameters\n"
2164 "Cell Re-Selection Offset (CRO) in dB\n"
2165 "Cell Re-Selection Offset (CRO) in dB\n"
2166 )
Sylvain Munaut00d71462010-11-28 18:17:28 +01002167{
2168 struct gsm_bts *bts = vty->index;
2169
2170 bts->si_common.cell_ro_sel_par.present = 1;
2171 bts->si_common.cell_ro_sel_par.cell_resel_off = atoi(argv[0])/2;
2172
2173 return CMD_SUCCESS;
2174}
2175
2176DEFUN(cfg_bts_temp_ofs, cfg_bts_temp_ofs_cmd,
2177 "temporary offset <0-60>",
Harald Welte557f3992012-08-16 23:23:50 +02002178 "Cell selection temporary negative offset\n"
2179 "Cell selection temporary negative offset\n"
Sylvain Munaut00d71462010-11-28 18:17:28 +01002180 "Cell selection temporary negative offset in dB")
2181{
2182 struct gsm_bts *bts = vty->index;
2183
2184 bts->si_common.cell_ro_sel_par.present = 1;
2185 bts->si_common.cell_ro_sel_par.temp_offs = atoi(argv[0])/10;
2186
2187 return CMD_SUCCESS;
2188}
2189
2190DEFUN(cfg_bts_temp_ofs_inf, cfg_bts_temp_ofs_inf_cmd,
2191 "temporary offset infinite",
Harald Welte557f3992012-08-16 23:23:50 +02002192 "Cell selection temporary negative offset\n"
2193 "Cell selection temporary negative offset\n"
Sylvain Munaut00d71462010-11-28 18:17:28 +01002194 "Sets cell selection temporary negative offset to infinity")
2195{
2196 struct gsm_bts *bts = vty->index;
2197
2198 bts->si_common.cell_ro_sel_par.present = 1;
2199 bts->si_common.cell_ro_sel_par.temp_offs = 7;
2200
2201 return CMD_SUCCESS;
2202}
2203
2204DEFUN(cfg_bts_penalty_time, cfg_bts_penalty_time_cmd,
2205 "penalty time <20-620>",
Harald Welte557f3992012-08-16 23:23:50 +02002206 "Cell selection penalty time\n"
2207 "Cell selection penalty time\n"
2208 "Cell selection penalty time in seconds (by 20s increments)\n")
Sylvain Munaut00d71462010-11-28 18:17:28 +01002209{
2210 struct gsm_bts *bts = vty->index;
2211
2212 bts->si_common.cell_ro_sel_par.present = 1;
2213 bts->si_common.cell_ro_sel_par.penalty_time = (atoi(argv[0])-20)/20;
2214
2215 return CMD_SUCCESS;
2216}
2217
2218DEFUN(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd,
2219 "penalty time reserved",
Harald Welte557f3992012-08-16 23:23:50 +02002220 "Cell selection penalty time\n"
2221 "Cell selection penalty time\n"
2222 "Set cell selection penalty time to reserved value 31, "
Sylvain Munaut00d71462010-11-28 18:17:28 +01002223 "(indicate that CELL_RESELECT_OFFSET is subtracted from C2 "
2224 "and TEMPORARY_OFFSET is ignored)")
2225{
2226 struct gsm_bts *bts = vty->index;
2227
2228 bts->si_common.cell_ro_sel_par.present = 1;
2229 bts->si_common.cell_ro_sel_par.penalty_time = 31;
2230
2231 return CMD_SUCCESS;
2232}
2233
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02002234DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
Daniel Willmann3e7db9e2012-12-27 00:02:01 +01002235 "periodic location update <6-1530>",
Harald Welte557f3992012-08-16 23:23:50 +02002236 "Periodic Location Updating Interval\n"
2237 "Periodic Location Updating Interval\n"
2238 "Periodic Location Updating Interval\n"
2239 "Periodic Location Updating Interval in Minutes\n")
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02002240{
2241 struct gsm_bts *bts = vty->index;
2242
Dieter Spaarb0f746d2010-10-05 21:10:55 +02002243 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02002244
2245 return CMD_SUCCESS;
2246}
2247
Holger Hans Peter Freyther2fb8ebf2013-07-27 21:07:57 +02002248DEFUN(cfg_bts_no_per_loc_upd, cfg_bts_no_per_loc_upd_cmd,
2249 "no periodic location update",
2250 NO_STR
2251 "Periodic Location Updating Interval\n"
2252 "Periodic Location Updating Interval\n"
2253 "Periodic Location Updating Interval\n")
2254{
2255 struct gsm_bts *bts = vty->index;
2256
2257 bts->si_common.chan_desc.t3212 = 0;
Andreas Eversbergf9248d92013-03-10 11:49:35 +01002258
2259 return CMD_SUCCESS;
2260}
2261
2262DEFUN(cfg_bts_radio_link_timeout, cfg_bts_radio_link_timeout_cmd,
2263 "radio-link-timeout <4-64>",
2264 "Radio link timeout criterion (BTS side)\n"
2265 "Radio link timeout value (lost SACCH block)\n")
2266{
2267 struct gsm_bts *bts = vty->index;
2268
2269 set_radio_link_timeout(&bts->si_common.cell_options, atoi(argv[0]));
2270
Holger Hans Peter Freyther2fb8ebf2013-07-27 21:07:57 +02002271 return CMD_SUCCESS;
2272}
2273
Harald Welte9e002452010-05-11 21:53:49 +02002274#define GPRS_TEXT "GPRS Packet Network\n"
2275
Harald Welte410575a2010-03-14 23:30:30 +08002276DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welteb42fe342010-04-18 14:00:26 +02002277 "gprs cell bvci <2-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02002278 GPRS_TEXT
2279 "GPRS Cell Settings\n"
Harald Welte557f3992012-08-16 23:23:50 +02002280 "GPRS BSSGP VC Identifier\n"
Harald Welte3055e332010-03-14 15:37:43 +08002281 "GPRS BSSGP VC Identifier")
2282{
2283 struct gsm_bts *bts = vty->index;
2284
Harald Weltecb20b7a2010-04-18 15:51:20 +02002285 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002286 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2287 return CMD_WARNING;
2288 }
2289
Harald Welte3055e332010-03-14 15:37:43 +08002290 bts->gprs.cell.bvci = atoi(argv[0]);
2291
2292 return CMD_SUCCESS;
2293}
2294
Harald Welte4a048c52010-03-22 11:48:36 +08002295DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
2296 "gprs nsei <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02002297 GPRS_TEXT
Harald Welte557f3992012-08-16 23:23:50 +02002298 "GPRS NS Entity Identifier\n"
Harald Welte4a048c52010-03-22 11:48:36 +08002299 "GPRS NS Entity Identifier")
2300{
2301 struct gsm_bts *bts = vty->index;
2302
Harald Weltecb20b7a2010-04-18 15:51:20 +02002303 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte4a048c52010-03-22 11:48:36 +08002304 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2305 return CMD_WARNING;
2306 }
2307
2308 bts->gprs.nse.nsei = atoi(argv[0]);
2309
2310 return CMD_SUCCESS;
2311}
2312
Harald Welte9e002452010-05-11 21:53:49 +02002313#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
2314 "NSVC Logical Number\n"
Harald Welte4a048c52010-03-22 11:48:36 +08002315
Harald Welte3055e332010-03-14 15:37:43 +08002316DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
2317 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02002318 GPRS_TEXT NSVC_TEXT
2319 "NS Virtual Connection Identifier\n"
Harald Welte3055e332010-03-14 15:37:43 +08002320 "GPRS NS VC Identifier")
2321{
2322 struct gsm_bts *bts = vty->index;
2323 int idx = atoi(argv[0]);
2324
Harald Weltecb20b7a2010-04-18 15:51:20 +02002325 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002326 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2327 return CMD_WARNING;
2328 }
2329
Harald Welte3055e332010-03-14 15:37:43 +08002330 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
2331
2332 return CMD_SUCCESS;
2333}
2334
Harald Welte410575a2010-03-14 23:30:30 +08002335DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
2336 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02002337 GPRS_TEXT NSVC_TEXT
Harald Welte557f3992012-08-16 23:23:50 +02002338 "GPRS NS Local UDP Port\n"
2339 "GPRS NS Local UDP Port\n"
2340 "GPRS NS Local UDP Port\n"
Harald Welte764c8e12012-08-17 09:57:25 +02002341 "GPRS NS Local UDP Port Number\n")
Harald Welte410575a2010-03-14 23:30:30 +08002342{
2343 struct gsm_bts *bts = vty->index;
2344 int idx = atoi(argv[0]);
2345
Harald Weltecb20b7a2010-04-18 15:51:20 +02002346 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002347 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2348 return CMD_WARNING;
2349 }
2350
Harald Welte410575a2010-03-14 23:30:30 +08002351 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
2352
2353 return CMD_SUCCESS;
2354}
2355
2356DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
2357 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02002358 GPRS_TEXT NSVC_TEXT
Harald Welte557f3992012-08-16 23:23:50 +02002359 "GPRS NS Remote UDP Port\n"
2360 "GPRS NS Remote UDP Port\n"
Harald Welte764c8e12012-08-17 09:57:25 +02002361 "GPRS NS Remote UDP Port\n"
2362 "GPRS NS Remote UDP Port Number\n")
Harald Welte410575a2010-03-14 23:30:30 +08002363{
2364 struct gsm_bts *bts = vty->index;
2365 int idx = atoi(argv[0]);
2366
Harald Weltecb20b7a2010-04-18 15:51:20 +02002367 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002368 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2369 return CMD_WARNING;
2370 }
2371
Harald Welte410575a2010-03-14 23:30:30 +08002372 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
2373
2374 return CMD_SUCCESS;
2375}
2376
2377DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
2378 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte9e002452010-05-11 21:53:49 +02002379 GPRS_TEXT NSVC_TEXT
Harald Welte557f3992012-08-16 23:23:50 +02002380 "GPRS NS Remote IP Address\n"
2381 "GPRS NS Remote IP Address\n"
2382 "GPRS NS Remote IP Address\n")
Harald Welte410575a2010-03-14 23:30:30 +08002383{
2384 struct gsm_bts *bts = vty->index;
2385 int idx = atoi(argv[0]);
2386 struct in_addr ia;
2387
Harald Weltecb20b7a2010-04-18 15:51:20 +02002388 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002389 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2390 return CMD_WARNING;
2391 }
2392
Harald Welte410575a2010-03-14 23:30:30 +08002393 inet_aton(argv[1], &ia);
2394 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
2395
2396 return CMD_SUCCESS;
2397}
2398
Holger Hans Peter Freyther3112f672010-09-06 10:11:25 +08002399DEFUN(cfg_bts_pag_free, cfg_bts_pag_free_cmd,
Harald Welte557f3992012-08-16 23:23:50 +02002400 "paging free <-1-1024>",
2401 "Paging options\n"
2402 "Only page when having a certain amount of free slots\n"
2403 "amount of required free paging slots. -1 to disable\n")
Holger Hans Peter Freyther3112f672010-09-06 10:11:25 +08002404{
2405 struct gsm_bts *bts = vty->index;
2406
2407 bts->paging.free_chans_need = atoi(argv[0]);
2408 return CMD_SUCCESS;
2409}
2410
Harald Weltea9251762010-05-11 23:50:21 +02002411DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
2412 "gprs ns timer " NS_TIMERS " <0-255>",
2413 GPRS_TEXT "Network Service\n"
2414 "Network Service Timer\n"
2415 NS_TIMERS_HELP "Timer Value\n")
2416{
2417 struct gsm_bts *bts = vty->index;
2418 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
2419 int val = atoi(argv[1]);
2420
2421 if (bts->gprs.mode == BTS_GPRS_NONE) {
2422 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2423 return CMD_WARNING;
2424 }
2425
2426 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
2427 return CMD_WARNING;
2428
2429 bts->gprs.nse.timer[idx] = val;
2430
2431 return CMD_SUCCESS;
2432}
2433
2434#define BSSGP_TIMERS "(blocking-timer|blocking-retries|unblocking-retries|reset-timer|reset-retries|suspend-timer|suspend-retries|resume-timer|resume-retries|capability-update-timer|capability-update-retries)"
Harald Welte18ce31c2010-05-14 20:05:17 +02002435#define BSSGP_TIMERS_HELP \
2436 "Tbvc-block timeout\n" \
2437 "Tbvc-block retries\n" \
2438 "Tbvc-unblock retries\n" \
2439 "Tbvcc-reset timeout\n" \
2440 "Tbvc-reset retries\n" \
2441 "Tbvc-suspend timeout\n" \
2442 "Tbvc-suspend retries\n" \
2443 "Tbvc-resume timeout\n" \
2444 "Tbvc-resume retries\n" \
2445 "Tbvc-capa-update timeout\n" \
2446 "Tbvc-capa-update retries\n"
Harald Weltea9251762010-05-11 23:50:21 +02002447
2448DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
2449 "gprs cell timer " BSSGP_TIMERS " <0-255>",
2450 GPRS_TEXT "Cell / BSSGP\n"
2451 "Cell/BSSGP Timer\n"
2452 BSSGP_TIMERS_HELP "Timer Value\n")
2453{
2454 struct gsm_bts *bts = vty->index;
2455 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
2456 int val = atoi(argv[1]);
2457
2458 if (bts->gprs.mode == BTS_GPRS_NONE) {
2459 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2460 return CMD_WARNING;
2461 }
2462
2463 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
2464 return CMD_WARNING;
2465
2466 bts->gprs.cell.timer[idx] = val;
2467
2468 return CMD_SUCCESS;
2469}
2470
Harald Welte3055e332010-03-14 15:37:43 +08002471DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
2472 "gprs routing area <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02002473 GPRS_TEXT
Harald Welte557f3992012-08-16 23:23:50 +02002474 "GPRS Routing Area Code\n"
2475 "GPRS Routing Area Code\n"
2476 "GPRS Routing Area Code\n")
Harald Welte3055e332010-03-14 15:37:43 +08002477{
2478 struct gsm_bts *bts = vty->index;
2479
Harald Weltecb20b7a2010-04-18 15:51:20 +02002480 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002481 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2482 return CMD_WARNING;
2483 }
2484
Harald Welte3055e332010-03-14 15:37:43 +08002485 bts->gprs.rac = atoi(argv[0]);
2486
2487 return CMD_SUCCESS;
2488}
2489
Max88bdcd42016-07-28 11:55:37 +02002490DEFUN(cfg_bts_gprs_ctrl_ack, cfg_bts_gprs_ctrl_ack_cmd,
2491 "gprs control-ack-type-rach", GPRS_TEXT
2492 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2493 "four access bursts format instead of default RLC/MAC control block\n")
2494{
2495 struct gsm_bts *bts = vty->index;
2496
2497 if (bts->gprs.mode == BTS_GPRS_NONE) {
2498 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2499 return CMD_WARNING;
2500 }
2501
2502 bts->gprs.ctrl_ack_type_use_block = false;
2503
2504 return CMD_SUCCESS;
2505}
2506
2507DEFUN(cfg_no_bts_gprs_ctrl_ack, cfg_no_bts_gprs_ctrl_ack_cmd,
2508 "no gprs control-ack-type-rach", NO_STR GPRS_TEXT
2509 "Set GPRS Control Ack Type for PACKET CONTROL ACKNOWLEDGMENT message to "
2510 "four access bursts format instead of default RLC/MAC control block\n")
2511{
2512 struct gsm_bts *bts = vty->index;
2513
2514 if (bts->gprs.mode == BTS_GPRS_NONE) {
2515 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2516 return CMD_WARNING;
2517 }
2518
2519 bts->gprs.ctrl_ack_type_use_block = true;
2520
2521 return CMD_SUCCESS;
2522}
2523
Andreas Eversberga4fa21c2013-03-16 16:31:26 +01002524DEFUN(cfg_bts_gprs_net_ctrl_ord, cfg_bts_gprs_net_ctrl_ord_cmd,
2525 "gprs network-control-order (nc0|nc1|nc2)",
2526 GPRS_TEXT
2527 "GPRS Network Control Order\n"
2528 "MS controlled cell re-selection, no measurement reporting\n"
2529 "MS controlled cell re-selection, MS sends measurement reports\n"
2530 "Network controlled cell re-selection, MS sends measurement reports\n")
2531{
2532 struct gsm_bts *bts = vty->index;
2533
2534 if (bts->gprs.mode == BTS_GPRS_NONE) {
2535 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2536 return CMD_WARNING;
2537 }
2538
2539 bts->gprs.net_ctrl_ord = atoi(argv[0] + 2);
2540
2541 return CMD_SUCCESS;
2542}
2543
Harald Weltecb20b7a2010-04-18 15:51:20 +02002544DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
2545 "gprs mode (none|gprs|egprs)",
Harald Welte9e002452010-05-11 21:53:49 +02002546 GPRS_TEXT
2547 "GPRS Mode for this BTS\n"
2548 "GPRS Disabled on this BTS\n"
2549 "GPRS Enabled on this BTS\n"
2550 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welte410575a2010-03-14 23:30:30 +08002551{
2552 struct gsm_bts *bts = vty->index;
Holger Hans Peter Freyther611f7752015-01-31 22:16:00 +01002553 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0], NULL);
Harald Welte410575a2010-03-14 23:30:30 +08002554
Holger Hans Peter Freyther611f7752015-01-31 22:16:00 +01002555 if (!bts_gprs_mode_is_compat(bts, mode)) {
Harald Welte20e275a2010-06-14 22:44:42 +02002556 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2557 VTY_NEWLINE);
2558 return CMD_WARNING;
2559 }
2560
2561 bts->gprs.mode = mode;
Harald Welte410575a2010-03-14 23:30:30 +08002562
2563 return CMD_SUCCESS;
2564}
2565
bhargava612722c2016-07-21 11:14:34 +05302566DEFUN(cfg_bts_gprs_11bit_rach_support_for_egprs,
2567 cfg_bts_gprs_11bit_rach_support_for_egprs_cmd,
2568 "gprs 11bit_rach_support_for_egprs (0|1)",
2569 GPRS_TEXT "11 bit RACH options\n"
2570 "Disable 11 bit RACH for EGPRS\n"
2571 "Enable 11 bit RACH for EGPRS")
2572{
2573 struct gsm_bts *bts = vty->index;
2574
2575 bts->gprs.supports_egprs_11bit_rach = atoi(argv[0]);
2576
2577 if (bts->gprs.supports_egprs_11bit_rach > 1) {
2578 vty_out(vty, "Error in RACH type%s", VTY_NEWLINE);
2579 return CMD_WARNING;
2580 }
2581
2582 if ((bts->gprs.mode == BTS_GPRS_NONE) &&
2583 (bts->gprs.supports_egprs_11bit_rach == 1)) {
2584 vty_out(vty, "Error:gprs mode is none and 11bit rach is"
2585 " enabled%s", VTY_NEWLINE);
2586 return CMD_WARNING;
2587 }
2588
2589 return CMD_SUCCESS;
2590}
2591
Harald Welted8acf142010-07-30 11:50:09 +02002592#define SI_TEXT "System Information Messages\n"
2593#define SI_TYPE_TEXT "(1|2|3|4|5|6|7|8|9|10|13|16|17|18|19|20|2bis|2ter|2quater|5bis|5ter)"
2594#define SI_TYPE_HELP "System Information Type 1\n" \
2595 "System Information Type 2\n" \
2596 "System Information Type 3\n" \
2597 "System Information Type 4\n" \
2598 "System Information Type 5\n" \
2599 "System Information Type 6\n" \
2600 "System Information Type 7\n" \
2601 "System Information Type 8\n" \
2602 "System Information Type 9\n" \
2603 "System Information Type 10\n" \
2604 "System Information Type 13\n" \
2605 "System Information Type 16\n" \
2606 "System Information Type 17\n" \
2607 "System Information Type 18\n" \
2608 "System Information Type 19\n" \
2609 "System Information Type 20\n" \
2610 "System Information Type 2bis\n" \
2611 "System Information Type 2ter\n" \
2612 "System Information Type 2quater\n" \
2613 "System Information Type 5bis\n" \
2614 "System Information Type 5ter\n"
2615
2616DEFUN(cfg_bts_si_mode, cfg_bts_si_mode_cmd,
2617 "system-information " SI_TYPE_TEXT " mode (static|computed)",
2618 SI_TEXT SI_TYPE_HELP
2619 "System Information Mode\n"
2620 "Static user-specified\n"
2621 "Dynamic, BSC-computed\n")
2622{
2623 struct gsm_bts *bts = vty->index;
2624 int type;
2625
2626 type = get_string_value(osmo_sitype_strs, argv[0]);
2627 if (type < 0) {
2628 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2629 return CMD_WARNING;
2630 }
2631
2632 if (!strcmp(argv[1], "static"))
2633 bts->si_mode_static |= (1 << type);
2634 else
2635 bts->si_mode_static &= ~(1 << type);
2636
2637 return CMD_SUCCESS;
2638}
2639
2640DEFUN(cfg_bts_si_static, cfg_bts_si_static_cmd,
2641 "system-information " SI_TYPE_TEXT " static HEXSTRING",
2642 SI_TEXT SI_TYPE_HELP
2643 "Static System Information filling\n"
2644 "Static user-specified SI content in HEX notation\n")
2645{
2646 struct gsm_bts *bts = vty->index;
2647 int rc, type;
2648
2649 type = get_string_value(osmo_sitype_strs, argv[0]);
2650 if (type < 0) {
2651 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2652 return CMD_WARNING;
2653 }
2654
2655 if (!(bts->si_mode_static & (1 << type))) {
2656 vty_out(vty, "SI Type %s is not configured in static mode%s",
2657 get_value_string(osmo_sitype_strs, type), VTY_NEWLINE);
2658 return CMD_WARNING;
2659 }
2660
Harald Welte9f09ac32010-07-30 11:53:18 +02002661 /* Fill buffer with padding pattern */
2662 memset(bts->si_buf[type], 0x2b, sizeof(bts->si_buf[type]));
2663
2664 /* Parse the user-specified SI in hex format, [partially] overwriting padding */
Pablo Neira Ayusob1d5a692011-05-07 12:12:48 +02002665 rc = osmo_hexparse(argv[1], bts->si_buf[type], sizeof(bts->si_buf[0]));
Harald Welted8acf142010-07-30 11:50:09 +02002666 if (rc < 0 || rc > sizeof(bts->si_buf[0])) {
2667 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
2668 return CMD_WARNING;
2669 }
2670
2671 /* Mark this SI as present */
2672 bts->si_valid |= (1 << type);
2673
2674 return CMD_SUCCESS;
2675}
2676
Harald Welteca46eff2011-01-11 23:44:56 +01002677DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
Harald Weltef989b782011-02-15 11:43:27 +01002678 "neighbor-list mode (automatic|manual|manual-si5)",
Harald Welteca46eff2011-01-11 23:44:56 +01002679 "Neighbor List\n" "Mode of Neighbor List generation\n"
Harald Weltef989b782011-02-15 11:43:27 +01002680 "Automatically from all BTS in this OpenBSC\n" "Manual\n"
2681 "Manual with different lists for SI2 and SI5\n")
Harald Welteca46eff2011-01-11 23:44:56 +01002682{
2683 struct gsm_bts *bts = vty->index;
Harald Weltef989b782011-02-15 11:43:27 +01002684 int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
Harald Welteca46eff2011-01-11 23:44:56 +01002685
Harald Weltef989b782011-02-15 11:43:27 +01002686 switch (mode) {
2687 case NL_MODE_MANUAL_SI5SEP:
2688 case NL_MODE_MANUAL:
Harald Welteca46eff2011-01-11 23:44:56 +01002689 /* make sure we clear the current list when switching to
2690 * manual mode */
2691 if (bts->neigh_list_manual_mode == 0)
2692 memset(&bts->si_common.data.neigh_list, 0,
2693 sizeof(bts->si_common.data.neigh_list));
Harald Weltef989b782011-02-15 11:43:27 +01002694 break;
2695 default:
2696 break;
2697 }
2698
2699 bts->neigh_list_manual_mode = mode;
Harald Welteca46eff2011-01-11 23:44:56 +01002700
2701 return CMD_SUCCESS;
2702}
2703
2704DEFUN(cfg_bts_neigh, cfg_bts_neigh_cmd,
Harald Welte09e4fad2012-01-29 13:24:12 +01002705 "neighbor-list (add|del) arfcn <0-1023>",
Harald Welteca46eff2011-01-11 23:44:56 +01002706 "Neighbor List\n" "Add to manual neighbor list\n"
2707 "Delete from manual neighbor list\n" "ARFCN of neighbor\n"
2708 "ARFCN of neighbor\n")
2709{
2710 struct gsm_bts *bts = vty->index;
2711 struct bitvec *bv = &bts->si_common.neigh_list;
2712 uint16_t arfcn = atoi(argv[1]);
2713
2714 if (!bts->neigh_list_manual_mode) {
2715 vty_out(vty, "%% Cannot configure neighbor list in "
2716 "automatic mode%s", VTY_NEWLINE);
2717 return CMD_WARNING;
2718 }
2719
2720 if (!strcmp(argv[0], "add"))
2721 bitvec_set_bit_pos(bv, arfcn, 1);
2722 else
2723 bitvec_set_bit_pos(bv, arfcn, 0);
2724
2725 return CMD_SUCCESS;
2726}
2727
Max33220d02016-04-29 12:51:31 +02002728
Max88ddcaa2016-04-15 16:04:46 +02002729DEFUN(cfg_bts_si2quater_neigh_add, cfg_bts_si2quater_neigh_add_cmd,
Max33220d02016-04-29 12:51:31 +02002730 "si2quater neighbor-list add earfcn <0-65535> threshold <0-31> "
2731 "[<0-7>]", "SI2quater Neighbor List\n"
Max88ddcaa2016-04-15 16:04:46 +02002732 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
2733 "EARFCN of neighbor\n" "EARFCN of neighbor\n" "threshold high bits\n"
2734 "threshold high bits\n" "measurement bandwidth\n")
2735{
2736 struct gsm_bts *bts = vty->index;
2737 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
2738 uint16_t arfcn = atoi(argv[0]);
2739 uint8_t meas = OSMO_EARFCN_MEAS_INVALID, thresh = atoi(argv[1]);
2740 int r;
2741
2742 if (3 == argc)
2743 meas = atoi(argv[2]);
2744
2745 r = osmo_earfcn_add(e, arfcn, meas);
2746
2747 if (r < 0) {
Harald Weltec10042b2016-11-26 15:04:39 +01002748 vty_out(vty, "Unable to add arfcn %u: %s%s", arfcn, strerror(-r),
Max88ddcaa2016-04-15 16:04:46 +02002749 VTY_NEWLINE);
2750 return CMD_WARNING;
2751 }
Maxcc0e5002016-04-20 15:57:14 +02002752 if (si2q_size_check(bts)) {
2753 if (e->thresh_hi && thresh != e->thresh_hi)
2754 vty_out(vty, "Warning: multiple thresholds are not "
2755 "supported, overriding previous threshold %u%s",
2756 e->thresh_hi, VTY_NEWLINE);
Max88ddcaa2016-04-15 16:04:46 +02002757
Maxcc0e5002016-04-20 15:57:14 +02002758 e->thresh_hi = thresh;
2759 return CMD_SUCCESS;
2760 }
2761 vty_out(vty, "Warning: not enough space in si2quater for a given arfcn%s"
2762 , VTY_NEWLINE);
2763 osmo_earfcn_del(e, arfcn);
2764 return CMD_WARNING;
Max88ddcaa2016-04-15 16:04:46 +02002765}
2766
2767DEFUN(cfg_bts_si2quater_neigh_del, cfg_bts_si2quater_neigh_del_cmd,
Max33220d02016-04-29 12:51:31 +02002768 "si2quater neighbor-list del earfcn <0-65535>",
Max88ddcaa2016-04-15 16:04:46 +02002769 "SI2quater Neighbor List\n"
2770 "SI2quater Neighbor List\n"
2771 "Delete from SI2quater manual neighbor list\n"
Max303753e2016-04-20 12:06:05 +02002772 "EARFCN of neighbor\n"
2773 "EARFCN\n")
Max88ddcaa2016-04-15 16:04:46 +02002774{
2775 struct gsm_bts *bts = vty->index;
2776 struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list;
Max2befab12016-04-20 12:06:06 +02002777 uint16_t arfcn = atoi(argv[0]);
Max88ddcaa2016-04-15 16:04:46 +02002778 int r = osmo_earfcn_del(e, arfcn);
2779 if (r < 0) {
2780 vty_out(vty, "Unable to delete arfcn %u: %s%s", arfcn,
Max2befab12016-04-20 12:06:06 +02002781 strerror(-r), VTY_NEWLINE);
Max88ddcaa2016-04-15 16:04:46 +02002782 return CMD_WARNING;
2783 }
2784
2785 return CMD_SUCCESS;
2786}
2787
Maxeaf196c2016-04-20 15:57:13 +02002788DEFUN(cfg_bts_si2quater_uarfcn_add, cfg_bts_si2quater_uarfcn_add_cmd,
Max33220d02016-04-29 12:51:31 +02002789 "si2quater neighbor-list add uarfcn <0-16383> <0-511> <0-1>",
Maxeaf196c2016-04-20 15:57:13 +02002790 "SI2quater Neighbor List\n"
2791 "SI2quater Neighbor List\n" "Add to manual SI2quater neighbor list\n"
2792 "UARFCN of neighbor\n" "UARFCN of neighbor\n" "scrambling code\n"
2793 "diversity bit\n")
2794{
2795 struct gsm_bts *bts = vty->index;
2796 uint16_t arfcn = atoi(argv[0]), scramble = atoi(argv[1]);
2797
2798 switch(bts_uarfcn_add(bts, arfcn, scramble, atoi(argv[2]))) {
2799 case -ENOMEM:
2800 vty_out(vty, "Unable to add arfcn: max number of UARFCNs (%u) "
2801 "reached%s", MAX_EARFCN_LIST, VTY_NEWLINE);
Harald Welte365b2302016-11-26 15:06:37 +01002802 return CMD_WARNING;
Maxcc0e5002016-04-20 15:57:14 +02002803 case -ENOSPC:
2804 vty_out(vty, "Warning: not enough space in si2quater for a "
2805 "given arfcn%s", VTY_NEWLINE);
Harald Welte365b2302016-11-26 15:06:37 +01002806 return CMD_WARNING;
Maxeaf196c2016-04-20 15:57:13 +02002807 case -EADDRINUSE:
2808 vty_out(vty, "Unable to add arfcn: (%u, %u) is already added%s",
2809 arfcn, scramble, VTY_NEWLINE);
2810 return CMD_WARNING;
2811 }
2812
2813 return CMD_SUCCESS;
2814}
2815
2816DEFUN(cfg_bts_si2quater_uarfcn_del, cfg_bts_si2quater_uarfcn_del_cmd,
Max33220d02016-04-29 12:51:31 +02002817 "si2quater neighbor-list del uarfcn <0-16383> <0-511>",
Maxeaf196c2016-04-20 15:57:13 +02002818 "SI2quater Neighbor List\n"
2819 "SI2quater Neighbor List\n"
2820 "Delete from SI2quater manual neighbor list\n"
2821 "UARFCN of neighbor\n"
2822 "UARFCN\n"
2823 "scrambling code\n")
2824{
2825 struct gsm_bts *bts = vty->index;
2826
2827 if (bts_uarfcn_del(bts, atoi(argv[0]), atoi(argv[1])) < 0) {
2828 vty_out(vty, "Unable to delete uarfcn: pair not found%s",
2829 VTY_NEWLINE);
2830 return CMD_WARNING;
2831 }
2832
2833 return CMD_SUCCESS;
2834}
2835
Harald Weltef989b782011-02-15 11:43:27 +01002836DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
Harald Welte09e4fad2012-01-29 13:24:12 +01002837 "si5 neighbor-list (add|del) arfcn <0-1023>",
Harald Welte557f3992012-08-16 23:23:50 +02002838 "SI5 Neighbor List\n"
Harald Weltef989b782011-02-15 11:43:27 +01002839 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
2840 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
2841 "ARFCN of neighbor\n")
2842{
2843 struct gsm_bts *bts = vty->index;
2844 struct bitvec *bv = &bts->si_common.si5_neigh_list;
2845 uint16_t arfcn = atoi(argv[1]);
2846
2847 if (!bts->neigh_list_manual_mode) {
2848 vty_out(vty, "%% Cannot configure neighbor list in "
2849 "automatic mode%s", VTY_NEWLINE);
2850 return CMD_WARNING;
2851 }
2852
2853 if (!strcmp(argv[0], "add"))
2854 bitvec_set_bit_pos(bv, arfcn, 1);
2855 else
2856 bitvec_set_bit_pos(bv, arfcn, 0);
2857
2858 return CMD_SUCCESS;
2859}
Harald Welted8acf142010-07-30 11:50:09 +02002860
Holger Hans Peter Freyther10799162012-07-20 10:27:31 +02002861#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
2862
2863DEFUN(cfg_bts_excl_rf_lock,
2864 cfg_bts_excl_rf_lock_cmd,
2865 "rf-lock-exclude",
2866 EXCL_RFLOCK_STR)
2867{
2868 struct gsm_bts *bts = vty->index;
2869 bts->excl_from_rf_lock = 1;
2870 return CMD_SUCCESS;
2871}
2872
2873DEFUN(cfg_bts_no_excl_rf_lock,
2874 cfg_bts_no_excl_rf_lock_cmd,
2875 "no rf-lock-exclude",
2876 NO_STR EXCL_RFLOCK_STR)
2877{
2878 struct gsm_bts *bts = vty->index;
2879 bts->excl_from_rf_lock = 0;
2880 return CMD_SUCCESS;
2881}
2882
Jacob Erlbeck8f8e5bf2014-01-16 11:02:14 +01002883#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
2884
2885DEFUN(cfg_bts_force_comb_si,
2886 cfg_bts_force_comb_si_cmd,
2887 "force-combined-si",
2888 FORCE_COMB_SI_STR)
2889{
2890 struct gsm_bts *bts = vty->index;
2891 bts->force_combined_si = 1;
2892 return CMD_SUCCESS;
2893}
2894
2895DEFUN(cfg_bts_no_force_comb_si,
2896 cfg_bts_no_force_comb_si_cmd,
2897 "no force-combined-si",
2898 NO_STR FORCE_COMB_SI_STR)
2899{
2900 struct gsm_bts *bts = vty->index;
2901 bts->force_combined_si = 0;
2902 return CMD_SUCCESS;
2903}
2904
Andreas Eversberg976493b2013-12-07 18:32:28 +01002905static void _get_codec_from_arg(struct vty *vty, int argc, const char *argv[])
2906{
2907 struct gsm_bts *bts = vty->index;
2908 struct bts_codec_conf *codec = &bts->codec;
2909 int i;
2910
2911 codec->hr = 0;
2912 codec->efr = 0;
2913 codec->amr = 0;
2914 for (i = 0; i < argc; i++) {
2915 if (!strcmp(argv[i], "hr"))
2916 codec->hr = 1;
2917 if (!strcmp(argv[i], "efr"))
2918 codec->efr = 1;
2919 if (!strcmp(argv[i], "amr"))
2920 codec->amr = 1;
2921 }
2922}
2923
2924#define CODEC_PAR_STR " (hr|efr|amr)"
2925#define CODEC_HELP_STR "Half Rate\n" \
2926 "Enhanced Full Rate\nAdaptive Multirate\n"
2927
2928DEFUN(cfg_bts_codec0, cfg_bts_codec0_cmd,
2929 "codec-support fr",
2930 "Codec Support settings\nFullrate\n")
2931{
2932 _get_codec_from_arg(vty, 0, argv);
2933 return CMD_SUCCESS;
2934}
2935
2936DEFUN(cfg_bts_codec1, cfg_bts_codec1_cmd,
2937 "codec-support fr" CODEC_PAR_STR,
2938 "Codec Support settings\nFullrate\n"
2939 CODEC_HELP_STR)
2940{
2941 _get_codec_from_arg(vty, 1, argv);
2942 return CMD_SUCCESS;
2943}
2944
2945DEFUN(cfg_bts_codec2, cfg_bts_codec2_cmd,
2946 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR,
2947 "Codec Support settings\nFullrate\n"
2948 CODEC_HELP_STR CODEC_HELP_STR)
2949{
2950 _get_codec_from_arg(vty, 2, argv);
2951 return CMD_SUCCESS;
2952}
2953
2954DEFUN(cfg_bts_codec3, cfg_bts_codec3_cmd,
2955 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
2956 "Codec Support settings\nFullrate\n"
2957 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
2958{
2959 _get_codec_from_arg(vty, 3, argv);
2960 return CMD_SUCCESS;
2961}
2962
2963DEFUN(cfg_bts_codec4, cfg_bts_codec4_cmd,
2964 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
2965 "Codec Support settings\nFullrate\n"
2966 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
2967{
2968 _get_codec_from_arg(vty, 4, argv);
2969 return CMD_SUCCESS;
2970}
2971
Holger Hans Peter Freyther15152612014-12-17 14:46:17 +01002972DEFUN(cfg_bts_depends_on, cfg_bts_depends_on_cmd,
2973 "depends-on-bts <0-255>",
2974 "This BTS can only be started if another one is up\n" "BTS Number\n")
2975{
2976 struct gsm_bts *bts = vty->index;
2977 struct gsm_bts *other_bts;
2978 int dep = atoi(argv[0]);
2979
2980
2981 if (!is_ipaccess_bts(bts)) {
2982 vty_out(vty, "This feature is only available for IP systems.%s",
2983 VTY_NEWLINE);
2984 return CMD_WARNING;
2985 }
2986
2987 other_bts = gsm_bts_num(bts->network, dep);
2988 if (!other_bts || !is_ipaccess_bts(other_bts)) {
2989 vty_out(vty, "This feature is only available for IP systems.%s",
2990 VTY_NEWLINE);
2991 return CMD_WARNING;
2992 }
2993
2994 if (dep >= bts->nr) {
2995 vty_out(vty, "%%Need to depend on an already declared unit.%s",
2996 VTY_NEWLINE);
2997 return CMD_WARNING;
2998 }
2999
3000 bts_depend_mark(bts, dep);
3001 return CMD_SUCCESS;
3002}
3003
3004DEFUN(cfg_bts_no_depends_on, cfg_bts_no_depends_on_cmd,
3005 "depeneds-on-bts <0-255>",
3006 NO_STR "This BTS can only be started if another one is up\n"
3007 "BTS Number\n")
3008{
3009 struct gsm_bts *bts = vty->index;
3010 int dep = atoi(argv[0]);
3011
3012 bts_depend_clear(bts, dep);
3013 return CMD_SUCCESS;
3014}
3015
Andreas Eversbergfa163e82014-01-19 11:47:44 +01003016#define AMR_TEXT "Adaptive Multi Rate settings\n"
3017#define AMR_MODE_TEXT "Codec modes to use with AMR codec\n"
3018#define AMR_START_TEXT "Initial codec to use with AMR\n" \
3019 "Automatically\nFirst codec\nSecond codec\nThird codec\nFourth codec\n"
3020#define AMR_TH_TEXT "AMR threshold between codecs\nMS side\nBTS side\n"
3021#define AMR_HY_TEXT "AMR hysteresis between codecs\nMS side\nBTS side\n"
3022
3023static void get_amr_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3024{
3025 struct gsm_bts *bts = vty->index;
3026 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3027 struct gsm48_multi_rate_conf *mr_conf =
3028 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3029 int i;
3030
3031 mr->gsm48_ie[1] = 0;
3032 for (i = 0; i < argc; i++)
3033 mr->gsm48_ie[1] |= 1 << atoi(argv[i]);
3034 mr_conf->icmi = 0;
3035}
3036
3037static void get_amr_th_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3038{
3039 struct gsm_bts *bts = vty->index;
3040 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freyther8083cc92015-09-24 11:39:38 +02003041 struct amr_mode *modes;
Andreas Eversbergfa163e82014-01-19 11:47:44 +01003042 int i;
3043
Holger Hans Peter Freyther8083cc92015-09-24 11:39:38 +02003044 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3045 for (i = 0; i < argc - 1; i++)
3046 modes[i].threshold = atoi(argv[i + 1]);
Andreas Eversbergfa163e82014-01-19 11:47:44 +01003047}
3048
3049static void get_amr_hy_from_arg(struct vty *vty, int argc, const char *argv[], int full)
3050{
3051 struct gsm_bts *bts = vty->index;
3052 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
Holger Hans Peter Freyther8083cc92015-09-24 11:39:38 +02003053 struct amr_mode *modes;
Andreas Eversbergfa163e82014-01-19 11:47:44 +01003054 int i;
3055
Holger Hans Peter Freyther8083cc92015-09-24 11:39:38 +02003056 modes = argv[0][0]=='m' ? mr->ms_mode : mr->bts_mode;
3057 for (i = 0; i < argc - 1; i++)
3058 modes[i].hysteresis = atoi(argv[i + 1]);
Andreas Eversbergfa163e82014-01-19 11:47:44 +01003059}
3060
3061static void get_amr_start_from_arg(struct vty *vty, const char *argv[], int full)
3062{
3063 struct gsm_bts *bts = vty->index;
3064 struct amr_multirate_conf *mr = (full) ? &bts->mr_full: &bts->mr_half;
3065 struct gsm48_multi_rate_conf *mr_conf =
3066 (struct gsm48_multi_rate_conf *) mr->gsm48_ie;
3067 int num = 0, i;
3068
3069 for (i = 0; i < ((full) ? 8 : 6); i++) {
3070 if ((mr->gsm48_ie[1] & (1 << i))) {
3071 num++;
3072 }
3073 }
3074
3075 if (argv[0][0] == 'a' || num == 0)
3076 mr_conf->icmi = 0;
3077 else {
3078 mr_conf->icmi = 1;
3079 if (num < atoi(argv[0]))
3080 mr_conf->smod = num - 1;
3081 else
3082 mr_conf->smod = atoi(argv[0]) - 1;
3083 }
3084}
3085
3086#define AMR_TCHF_PAR_STR " (0|1|2|3|4|5|6|7)"
3087#define AMR_TCHF_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n" \
3088 "10,2k\n12,2k\n"
3089
3090#define AMR_TCHH_PAR_STR " (0|1|2|3|4|5)"
3091#define AMR_TCHH_HELP_STR "4,75k\n5,15k\n5,90k\n6,70k\n7,40k\n7,95k\n"
3092
3093#define AMR_TH_HELP_STR "Threshold between codec 1 and 2\n"
3094#define AMR_HY_HELP_STR "Hysteresis between codec 1 and 2\n"
3095
3096DEFUN(cfg_bts_amr_fr_modes1, cfg_bts_amr_fr_modes1_cmd,
3097 "amr tch-f modes" AMR_TCHF_PAR_STR,
3098 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3099 AMR_TCHF_HELP_STR)
3100{
3101 get_amr_from_arg(vty, 1, argv, 1);
3102 return CMD_SUCCESS;
3103}
3104
3105DEFUN(cfg_bts_amr_fr_modes2, cfg_bts_amr_fr_modes2_cmd,
3106 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3107 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3108 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3109{
3110 get_amr_from_arg(vty, 2, argv, 1);
3111 return CMD_SUCCESS;
3112}
3113
3114DEFUN(cfg_bts_amr_fr_modes3, cfg_bts_amr_fr_modes3_cmd,
3115 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3116 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3117 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3118{
3119 get_amr_from_arg(vty, 3, argv, 1);
3120 return CMD_SUCCESS;
3121}
3122
3123DEFUN(cfg_bts_amr_fr_modes4, cfg_bts_amr_fr_modes4_cmd,
3124 "amr tch-f modes" AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR AMR_TCHF_PAR_STR,
3125 AMR_TEXT "Full Rate\n" AMR_MODE_TEXT
3126 AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR AMR_TCHF_HELP_STR)
3127{
3128 get_amr_from_arg(vty, 4, argv, 1);
3129 return CMD_SUCCESS;
3130}
3131
3132DEFUN(cfg_bts_amr_fr_start_mode, cfg_bts_amr_fr_start_mode_cmd,
3133 "amr tch-f start-mode (auto|1|2|3|4)",
3134 AMR_TEXT "Full Rate\n" AMR_START_TEXT)
3135{
3136 get_amr_start_from_arg(vty, argv, 1);
3137 return CMD_SUCCESS;
3138}
3139
3140DEFUN(cfg_bts_amr_fr_thres1, cfg_bts_amr_fr_thres1_cmd,
3141 "amr tch-f threshold (ms|bts) <0-63>",
3142 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3143 AMR_TH_HELP_STR)
3144{
3145 get_amr_th_from_arg(vty, 2, argv, 1);
3146 return CMD_SUCCESS;
3147}
3148
3149DEFUN(cfg_bts_amr_fr_thres2, cfg_bts_amr_fr_thres2_cmd,
3150 "amr tch-f threshold (ms|bts) <0-63> <0-63>",
3151 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3152 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3153{
3154 get_amr_th_from_arg(vty, 3, argv, 1);
3155 return CMD_SUCCESS;
3156}
3157
3158DEFUN(cfg_bts_amr_fr_thres3, cfg_bts_amr_fr_thres3_cmd,
3159 "amr tch-f threshold (ms|bts) <0-63> <0-63> <0-63>",
3160 AMR_TEXT "Full Rate\n" AMR_TH_TEXT
3161 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3162{
3163 get_amr_th_from_arg(vty, 4, argv, 1);
3164 return CMD_SUCCESS;
3165}
3166
3167DEFUN(cfg_bts_amr_fr_hyst1, cfg_bts_amr_fr_hyst1_cmd,
3168 "amr tch-f hysteresis (ms|bts) <0-15>",
3169 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3170 AMR_HY_HELP_STR)
3171{
3172 get_amr_hy_from_arg(vty, 2, argv, 1);
3173 return CMD_SUCCESS;
3174}
3175
3176DEFUN(cfg_bts_amr_fr_hyst2, cfg_bts_amr_fr_hyst2_cmd,
3177 "amr tch-f hysteresis (ms|bts) <0-15> <0-15>",
3178 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3179 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3180{
3181 get_amr_hy_from_arg(vty, 3, argv, 1);
3182 return CMD_SUCCESS;
3183}
3184
3185DEFUN(cfg_bts_amr_fr_hyst3, cfg_bts_amr_fr_hyst3_cmd,
3186 "amr tch-f hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3187 AMR_TEXT "Full Rate\n" AMR_HY_TEXT
3188 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3189{
3190 get_amr_hy_from_arg(vty, 4, argv, 1);
3191 return CMD_SUCCESS;
3192}
3193
3194DEFUN(cfg_bts_amr_hr_modes1, cfg_bts_amr_hr_modes1_cmd,
3195 "amr tch-h modes" AMR_TCHH_PAR_STR,
3196 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3197 AMR_TCHH_HELP_STR)
3198{
3199 get_amr_from_arg(vty, 1, argv, 0);
3200 return CMD_SUCCESS;
3201}
3202
3203DEFUN(cfg_bts_amr_hr_modes2, cfg_bts_amr_hr_modes2_cmd,
3204 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3205 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3206 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3207{
3208 get_amr_from_arg(vty, 2, argv, 0);
3209 return CMD_SUCCESS;
3210}
3211
3212DEFUN(cfg_bts_amr_hr_modes3, cfg_bts_amr_hr_modes3_cmd,
3213 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3214 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3215 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3216{
3217 get_amr_from_arg(vty, 3, argv, 0);
3218 return CMD_SUCCESS;
3219}
3220
3221DEFUN(cfg_bts_amr_hr_modes4, cfg_bts_amr_hr_modes4_cmd,
3222 "amr tch-h modes" AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR AMR_TCHH_PAR_STR,
3223 AMR_TEXT "Half Rate\n" AMR_MODE_TEXT
3224 AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR AMR_TCHH_HELP_STR)
3225{
3226 get_amr_from_arg(vty, 4, argv, 0);
3227 return CMD_SUCCESS;
3228}
3229
3230DEFUN(cfg_bts_amr_hr_start_mode, cfg_bts_amr_hr_start_mode_cmd,
3231 "amr tch-h start-mode (auto|1|2|3|4)",
3232 AMR_TEXT "Half Rate\n" AMR_START_TEXT)
3233{
3234 get_amr_start_from_arg(vty, argv, 0);
3235 return CMD_SUCCESS;
3236}
3237
3238DEFUN(cfg_bts_amr_hr_thres1, cfg_bts_amr_hr_thres1_cmd,
3239 "amr tch-h threshold (ms|bts) <0-63>",
3240 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3241 AMR_TH_HELP_STR)
3242{
3243 get_amr_th_from_arg(vty, 2, argv, 0);
3244 return CMD_SUCCESS;
3245}
3246
3247DEFUN(cfg_bts_amr_hr_thres2, cfg_bts_amr_hr_thres2_cmd,
3248 "amr tch-h threshold (ms|bts) <0-63> <0-63>",
3249 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3250 AMR_TH_HELP_STR AMR_TH_HELP_STR)
3251{
3252 get_amr_th_from_arg(vty, 3, argv, 0);
3253 return CMD_SUCCESS;
3254}
3255
3256DEFUN(cfg_bts_amr_hr_thres3, cfg_bts_amr_hr_thres3_cmd,
3257 "amr tch-h threshold (ms|bts) <0-63> <0-63> <0-63>",
3258 AMR_TEXT "Half Rate\n" AMR_TH_TEXT
3259 AMR_TH_HELP_STR AMR_TH_HELP_STR AMR_TH_HELP_STR)
3260{
3261 get_amr_th_from_arg(vty, 4, argv, 0);
3262 return CMD_SUCCESS;
3263}
3264
3265DEFUN(cfg_bts_amr_hr_hyst1, cfg_bts_amr_hr_hyst1_cmd,
3266 "amr tch-h hysteresis (ms|bts) <0-15>",
3267 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3268 AMR_HY_HELP_STR)
3269{
3270 get_amr_hy_from_arg(vty, 2, argv, 0);
3271 return CMD_SUCCESS;
3272}
3273
3274DEFUN(cfg_bts_amr_hr_hyst2, cfg_bts_amr_hr_hyst2_cmd,
3275 "amr tch-h hysteresis (ms|bts) <0-15> <0-15>",
3276 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3277 AMR_HY_HELP_STR AMR_HY_HELP_STR)
3278{
3279 get_amr_hy_from_arg(vty, 3, argv, 0);
3280 return CMD_SUCCESS;
3281}
3282
3283DEFUN(cfg_bts_amr_hr_hyst3, cfg_bts_amr_hr_hyst3_cmd,
3284 "amr tch-h hysteresis (ms|bts) <0-15> <0-15> <0-15>",
3285 AMR_TEXT "Half Rate\n" AMR_HY_TEXT
3286 AMR_HY_HELP_STR AMR_HY_HELP_STR AMR_HY_HELP_STR)
3287{
3288 get_amr_hy_from_arg(vty, 4, argv, 0);
3289 return CMD_SUCCESS;
3290}
3291
Harald Welte9e002452010-05-11 21:53:49 +02003292#define TRX_TEXT "Radio Transceiver\n"
Harald Welte3e774612009-08-10 13:48:16 +02003293
Harald Welte59b04682009-06-10 05:40:52 +08003294/* per TRX configuration */
3295DEFUN(cfg_trx,
3296 cfg_trx_cmd,
Harald Welte2af06cb2012-08-17 12:50:14 +02003297 "trx <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02003298 TRX_TEXT
Harald Welte59b04682009-06-10 05:40:52 +08003299 "Select a TRX to configure")
3300{
3301 int trx_nr = atoi(argv[0]);
3302 struct gsm_bts *bts = vty->index;
3303 struct gsm_bts_trx *trx;
3304
Harald Weltee712a5f2009-06-21 16:17:15 +02003305 if (trx_nr > bts->num_trx) {
3306 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
3307 bts->num_trx, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +08003308 return CMD_WARNING;
Harald Weltee712a5f2009-06-21 16:17:15 +02003309 } else if (trx_nr == bts->num_trx) {
3310 /* we need to allocate a new one */
3311 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02003312 } else
Harald Weltee712a5f2009-06-21 16:17:15 +02003313 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02003314
Harald Weltee712a5f2009-06-21 16:17:15 +02003315 if (!trx)
3316 return CMD_WARNING;
Harald Welte59b04682009-06-10 05:40:52 +08003317
3318 vty->index = trx;
Harald Welte8791dac2010-05-14 17:59:53 +02003319 vty->index_sub = &trx->description;
Harald Welte59b04682009-06-10 05:40:52 +08003320 vty->node = TRX_NODE;
3321
3322 return CMD_SUCCESS;
3323}
3324
3325DEFUN(cfg_trx_arfcn,
3326 cfg_trx_arfcn_cmd,
Harald Welte09e4fad2012-01-29 13:24:12 +01003327 "arfcn <0-1023>",
Harald Welte764c8e12012-08-17 09:57:25 +02003328 "Set the ARFCN for this TRX\n"
3329 "Absolute Radio Frequency Channel Number\n")
Harald Welte59b04682009-06-10 05:40:52 +08003330{
3331 int arfcn = atoi(argv[0]);
3332 struct gsm_bts_trx *trx = vty->index;
3333
3334 /* FIXME: check if this ARFCN is supported by this TRX */
3335
3336 trx->arfcn = arfcn;
3337
3338 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
3339 /* FIXME: use OML layer to update the ARFCN */
3340 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
3341
3342 return CMD_SUCCESS;
3343}
3344
Harald Welte (local)b709bfe2009-12-27 20:56:38 +01003345DEFUN(cfg_trx_nominal_power,
3346 cfg_trx_nominal_power_cmd,
3347 "nominal power <0-100>",
Harald Welte557f3992012-08-16 23:23:50 +02003348 "Nominal TRX RF Power in dBm\n"
3349 "Nominal TRX RF Power in dBm\n"
3350 "Nominal TRX RF Power in dBm\n")
Harald Welte (local)b709bfe2009-12-27 20:56:38 +01003351{
3352 struct gsm_bts_trx *trx = vty->index;
3353
3354 trx->nominal_power = atoi(argv[0]);
3355
3356 return CMD_SUCCESS;
3357}
3358
Harald Welte91afe4c2009-06-20 18:15:19 +02003359DEFUN(cfg_trx_max_power_red,
3360 cfg_trx_max_power_red_cmd,
3361 "max_power_red <0-100>",
Harald Welte557f3992012-08-16 23:23:50 +02003362 "Reduction of maximum BS RF Power (relative to nominal power)\n"
Harald Welte91afe4c2009-06-20 18:15:19 +02003363 "Reduction of maximum BS RF Power in dB\n")
3364{
3365 int maxpwr_r = atoi(argv[0]);
3366 struct gsm_bts_trx *trx = vty->index;
Harald Welte01acd742009-11-18 09:20:22 +01003367 int upper_limit = 24; /* default 12.21 max power red. */
Harald Welte91afe4c2009-06-20 18:15:19 +02003368
3369 /* FIXME: check if our BTS type supports more than 12 */
3370 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
3371 vty_out(vty, "%% Power %d dB is not in the valid range%s",
3372 maxpwr_r, VTY_NEWLINE);
3373 return CMD_WARNING;
3374 }
3375 if (maxpwr_r & 1) {
3376 vty_out(vty, "%% Power %d dB is not an even value%s",
3377 maxpwr_r, VTY_NEWLINE);
3378 return CMD_WARNING;
3379 }
3380
3381 trx->max_power_red = maxpwr_r;
3382
3383 /* FIXME: make sure we update this using OML */
3384
3385 return CMD_SUCCESS;
3386}
3387
Harald Welte62868882009-08-08 16:12:58 +02003388DEFUN(cfg_trx_rsl_e1,
3389 cfg_trx_rsl_e1_cmd,
3390 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welte557f3992012-08-16 23:23:50 +02003391 "RSL Parameters\n"
3392 "E1/T1 interface to be used for RSL\n"
3393 "E1/T1 interface to be used for RSL\n"
3394 "E1/T1 Line Number to be used for RSL\n"
3395 "E1/T1 Timeslot to be used for RSL\n"
3396 "E1/T1 Timeslot to be used for RSL\n"
3397 "E1/T1 Sub-slot to be used for RSL\n"
3398 "E1/T1 Sub-slot 0 is to be used for RSL\n"
3399 "E1/T1 Sub-slot 1 is to be used for RSL\n"
3400 "E1/T1 Sub-slot 2 is to be used for RSL\n"
3401 "E1/T1 Sub-slot 3 is to be used for RSL\n"
3402 "E1/T1 full timeslot is to be used for RSL\n")
Harald Welte62868882009-08-08 16:12:58 +02003403{
3404 struct gsm_bts_trx *trx = vty->index;
3405
3406 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
3407
3408 return CMD_SUCCESS;
3409}
3410
3411DEFUN(cfg_trx_rsl_e1_tei,
3412 cfg_trx_rsl_e1_tei_cmd,
3413 "rsl e1 tei <0-63>",
Harald Welte557f3992012-08-16 23:23:50 +02003414 "RSL Parameters\n"
3415 "Set the TEI to be used for RSL\n"
3416 "Set the TEI to be used for RSL\n"
3417 "TEI to be used for RSL\n")
Harald Welte62868882009-08-08 16:12:58 +02003418{
3419 struct gsm_bts_trx *trx = vty->index;
3420
3421 trx->rsl_tei = atoi(argv[0]);
3422
3423 return CMD_SUCCESS;
3424}
3425
Holger Hans Peter Freyther1c8b4802009-11-11 11:54:24 +01003426DEFUN(cfg_trx_rf_locked,
3427 cfg_trx_rf_locked_cmd,
3428 "rf_locked (0|1)",
Harald Welte557f3992012-08-16 23:23:50 +02003429 "Set or unset the RF Locking (Turn off RF of the TRX)\n"
3430 "TRX is NOT RF locked (active)\n"
3431 "TRX is RF locked (turned off)\n")
Holger Hans Peter Freyther1c8b4802009-11-11 11:54:24 +01003432{
3433 int locked = atoi(argv[0]);
3434 struct gsm_bts_trx *trx = vty->index;
3435
3436 gsm_trx_lock_rf(trx, locked);
3437 return CMD_SUCCESS;
3438}
Harald Welte62868882009-08-08 16:12:58 +02003439
Harald Welte59b04682009-06-10 05:40:52 +08003440/* per TS configuration */
3441DEFUN(cfg_ts,
3442 cfg_ts_cmd,
Harald Welte62868882009-08-08 16:12:58 +02003443 "timeslot <0-7>",
Harald Welte557f3992012-08-16 23:23:50 +02003444 "Select a Timeslot to configure\n"
3445 "Timeslot number\n")
Harald Welte59b04682009-06-10 05:40:52 +08003446{
3447 int ts_nr = atoi(argv[0]);
3448 struct gsm_bts_trx *trx = vty->index;
3449 struct gsm_bts_trx_ts *ts;
3450
3451 if (ts_nr >= TRX_NR_TS) {
3452 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
3453 TRX_NR_TS, VTY_NEWLINE);
3454 return CMD_WARNING;
3455 }
3456
3457 ts = &trx->ts[ts_nr];
3458
3459 vty->index = ts;
3460 vty->node = TS_NODE;
3461
3462 return CMD_SUCCESS;
3463}
3464
Harald Welte3ffe1b32009-08-07 00:25:23 +02003465DEFUN(cfg_ts_pchan,
3466 cfg_ts_pchan_cmd,
Harald Welte2addf852012-08-17 12:42:06 +02003467 "phys_chan_config PCHAN", /* dynamically generated! */
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +01003468 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte2addf852012-08-17 12:42:06 +02003469{
3470 struct gsm_bts_trx_ts *ts = vty->index;
3471 int pchanc;
3472
3473 pchanc = gsm_pchan_parse(argv[0]);
3474 if (pchanc < 0)
3475 return CMD_WARNING;
3476
3477 ts->pchan = pchanc;
3478
3479 return CMD_SUCCESS;
3480}
3481
3482/* used for backwards compatibility with old config files that still
3483 * have uppercase pchan type names */
3484DEFUN_HIDDEN(cfg_ts_pchan_compat,
3485 cfg_ts_pchan_compat_cmd,
Harald Welte3ffe1b32009-08-07 00:25:23 +02003486 "phys_chan_config PCHAN",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +01003487 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte3ffe1b32009-08-07 00:25:23 +02003488{
3489 struct gsm_bts_trx_ts *ts = vty->index;
3490 int pchanc;
3491
3492 pchanc = gsm_pchan_parse(argv[0]);
3493 if (pchanc < 0)
3494 return CMD_WARNING;
3495
3496 ts->pchan = pchanc;
3497
3498 return CMD_SUCCESS;
3499}
3500
Harald Welte2addf852012-08-17 12:42:06 +02003501
3502
Harald Welte85771a42011-05-30 12:09:13 +02003503DEFUN(cfg_ts_tsc,
3504 cfg_ts_tsc_cmd,
3505 "training_sequence_code <0-7>",
Harald Welte557f3992012-08-16 23:23:50 +02003506 "Training Sequence Code of the Timeslot\n" "TSC\n")
Harald Welte85771a42011-05-30 12:09:13 +02003507{
3508 struct gsm_bts_trx_ts *ts = vty->index;
3509
Harald Welte499cd252014-01-19 17:10:50 +01003510 if (!gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_MULTI_TSC)) {
3511 vty_out(vty, "%% This BTS does not support a TSC != BCC, "
3512 "falling back to BCC%s", VTY_NEWLINE);
3513 ts->tsc = -1;
3514 return CMD_WARNING;
3515 }
3516
Harald Welte85771a42011-05-30 12:09:13 +02003517 ts->tsc = atoi(argv[0]);
3518
3519 return CMD_SUCCESS;
3520}
3521
Harald Weltea42a93f2010-06-14 22:26:10 +02003522#define HOPPING_STR "Configure frequency hopping\n"
3523
3524DEFUN(cfg_ts_hopping,
3525 cfg_ts_hopping_cmd,
3526 "hopping enabled (0|1)",
3527 HOPPING_STR "Enable or disable frequency hopping\n"
3528 "Disable frequency hopping\n" "Enable frequency hopping\n")
3529{
3530 struct gsm_bts_trx_ts *ts = vty->index;
Harald Welte059c1ef2010-06-14 22:47:37 +02003531 int enabled = atoi(argv[0]);
Harald Weltea42a93f2010-06-14 22:26:10 +02003532
Harald Welte059c1ef2010-06-14 22:47:37 +02003533 if (enabled && !gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_HOPPING)) {
3534 vty_out(vty, "BTS model does not support hopping%s",
3535 VTY_NEWLINE);
3536 return CMD_WARNING;
3537 }
3538
3539 ts->hopping.enabled = enabled;
Harald Weltea42a93f2010-06-14 22:26:10 +02003540
3541 return CMD_SUCCESS;
3542}
3543
Harald Welte67104d12009-09-12 13:05:33 +02003544DEFUN(cfg_ts_hsn,
3545 cfg_ts_hsn_cmd,
Harald Weltea42a93f2010-06-14 22:26:10 +02003546 "hopping sequence-number <0-63>",
3547 HOPPING_STR
Harald Welte557f3992012-08-16 23:23:50 +02003548 "Which hopping sequence to use for this channel\n"
3549 "Hopping Sequence Number (HSN)\n")
Harald Welte67104d12009-09-12 13:05:33 +02003550{
3551 struct gsm_bts_trx_ts *ts = vty->index;
3552
3553 ts->hopping.hsn = atoi(argv[0]);
3554
3555 return CMD_SUCCESS;
3556}
3557
3558DEFUN(cfg_ts_maio,
3559 cfg_ts_maio_cmd,
3560 "hopping maio <0-63>",
Harald Weltea42a93f2010-06-14 22:26:10 +02003561 HOPPING_STR
Harald Welte557f3992012-08-16 23:23:50 +02003562 "Which hopping MAIO to use for this channel\n"
3563 "Mobile Allocation Index Offset (MAIO)\n")
Harald Welte67104d12009-09-12 13:05:33 +02003564{
3565 struct gsm_bts_trx_ts *ts = vty->index;
3566
3567 ts->hopping.maio = atoi(argv[0]);
3568
3569 return CMD_SUCCESS;
3570}
3571
3572DEFUN(cfg_ts_arfcn_add,
3573 cfg_ts_arfcn_add_cmd,
3574 "hopping arfcn add <0-1023>",
Harald Weltea42a93f2010-06-14 22:26:10 +02003575 HOPPING_STR "Configure hopping ARFCN list\n"
3576 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte67104d12009-09-12 13:05:33 +02003577{
3578 struct gsm_bts_trx_ts *ts = vty->index;
3579 int arfcn = atoi(argv[0]);
3580
Harald Weltea42a93f2010-06-14 22:26:10 +02003581 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
3582
Harald Welte67104d12009-09-12 13:05:33 +02003583 return CMD_SUCCESS;
3584}
3585
3586DEFUN(cfg_ts_arfcn_del,
3587 cfg_ts_arfcn_del_cmd,
3588 "hopping arfcn del <0-1023>",
Harald Weltea42a93f2010-06-14 22:26:10 +02003589 HOPPING_STR "Configure hopping ARFCN list\n"
3590 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte67104d12009-09-12 13:05:33 +02003591{
3592 struct gsm_bts_trx_ts *ts = vty->index;
3593 int arfcn = atoi(argv[0]);
3594
Harald Weltea42a93f2010-06-14 22:26:10 +02003595 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
3596
Harald Welte67104d12009-09-12 13:05:33 +02003597 return CMD_SUCCESS;
3598}
3599
Harald Welte3ffe1b32009-08-07 00:25:23 +02003600DEFUN(cfg_ts_e1_subslot,
3601 cfg_ts_e1_subslot_cmd,
Harald Welte62868882009-08-08 16:12:58 +02003602 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welte557f3992012-08-16 23:23:50 +02003603 "E1/T1 channel connected to this on-air timeslot\n"
3604 "E1/T1 channel connected to this on-air timeslot\n"
3605 "E1/T1 line connected to this on-air timeslot\n"
Harald Weltefa2015f2012-08-17 09:52:03 +02003606 "E1/T1 timeslot connected to this on-air timeslot\n"
3607 "E1/T1 timeslot connected to this on-air timeslot\n"
Harald Welte557f3992012-08-16 23:23:50 +02003608 "E1/T1 sub-slot connected to this on-air timeslot\n"
3609 "E1/T1 sub-slot 0 connected to this on-air timeslot\n"
3610 "E1/T1 sub-slot 1 connected to this on-air timeslot\n"
3611 "E1/T1 sub-slot 2 connected to this on-air timeslot\n"
3612 "E1/T1 sub-slot 3 connected to this on-air timeslot\n"
3613 "Full E1/T1 timeslot connected to this on-air timeslot\n")
Harald Welte3ffe1b32009-08-07 00:25:23 +02003614{
3615 struct gsm_bts_trx_ts *ts = vty->index;
3616
Harald Welte62868882009-08-08 16:12:58 +02003617 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Welte3ffe1b32009-08-07 00:25:23 +02003618
3619 return CMD_SUCCESS;
3620}
Harald Welte59b04682009-06-10 05:40:52 +08003621
Harald Weltea5b1dae2010-05-16 21:47:13 +02003622void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
3623{
3624 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
Alexander Couzensd8aad3a2016-08-02 11:34:11 +02003625 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_TOTAL].current,
3626 net->bsc_ctrs->ctr[BSC_CTR_CHREQ_NO_CHANNEL].current,
Alexander Couzens65bfd762016-07-12 15:42:02 +02003627 VTY_NEWLINE);
Harald Weltea5b1dae2010-05-16 21:47:13 +02003628 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
Alexander Couzensd8aad3a2016-08-02 11:34:11 +02003629 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RF_FAIL].current,
3630 net->bsc_ctrs->ctr[BSC_CTR_CHAN_RLL_ERR].current,
Alexander Couzens65bfd762016-07-12 15:42:02 +02003631 VTY_NEWLINE);
Harald Weltea5b1dae2010-05-16 21:47:13 +02003632 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
Alexander Couzensd8aad3a2016-08-02 11:34:11 +02003633 net->bsc_ctrs->ctr[BSC_CTR_PAGING_ATTEMPTED].current,
3634 net->bsc_ctrs->ctr[BSC_CTR_PAGING_COMPLETED].current,
3635 net->bsc_ctrs->ctr[BSC_CTR_PAGING_EXPIRED].current,
Alexander Couzens65bfd762016-07-12 15:42:02 +02003636 VTY_NEWLINE);
Harald Weltea5b1dae2010-05-16 21:47:13 +02003637 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
Alexander Couzensd8aad3a2016-08-02 11:34:11 +02003638 net->bsc_ctrs->ctr[BSC_CTR_BTS_OML_FAIL].current,
3639 net->bsc_ctrs->ctr[BSC_CTR_BTS_RSL_FAIL].current,
Alexander Couzens65bfd762016-07-12 15:42:02 +02003640 VTY_NEWLINE);
Harald Weltea5b1dae2010-05-16 21:47:13 +02003641}
3642
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02003643DEFUN(drop_bts,
3644 drop_bts_cmd,
Holger Hans Peter Freythere4ac0e42010-04-11 12:46:45 +02003645 "drop bts connection <0-65535> (oml|rsl)",
Harald Welte557f3992012-08-16 23:23:50 +02003646 "Debug/Simulation command to drop Abis/IP BTS\n"
3647 "Debug/Simulation command to drop Abis/IP BTS\n"
3648 "Debug/Simulation command to drop Abis/IP BTS\n"
3649 "BTS NR\n" "Drop OML Connection\n" "Drop RSL Connection\n")
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02003650{
3651 struct gsm_network *gsmnet;
3652 struct gsm_bts_trx *trx;
3653 struct gsm_bts *bts;
3654 unsigned int bts_nr;
3655
3656 gsmnet = gsmnet_from_vty(vty);
3657
3658 bts_nr = atoi(argv[0]);
3659 if (bts_nr >= gsmnet->num_bts) {
3660 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3661 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3662 return CMD_WARNING;
3663 }
3664
3665 bts = gsm_bts_num(gsmnet, bts_nr);
3666 if (!bts) {
3667 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3668 return CMD_WARNING;
3669 }
3670
3671 if (!is_ipaccess_bts(bts)) {
3672 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
3673 return CMD_WARNING;
3674 }
3675
3676
3677 /* close all connections */
3678 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freyther03f17d02010-11-15 20:29:46 +01003679 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02003680 } else if (strcmp(argv[1], "rsl") == 0) {
3681 /* close all rsl connections */
3682 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freyther03f17d02010-11-15 20:29:46 +01003683 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02003684 }
3685 } else {
3686 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
3687 return CMD_WARNING;
3688 }
3689
3690 return CMD_SUCCESS;
3691}
3692
Holger Hans Peter Freyther8ab66e82016-03-16 13:45:23 +01003693DEFUN(restart_bts, restart_bts_cmd,
3694 "restart-bts <0-65535>",
3695 "Restart ip.access nanoBTS through OML\n"
3696 "BTS Number\n")
3697{
3698 struct gsm_network *gsmnet;
3699 struct gsm_bts_trx *trx;
3700 struct gsm_bts *bts;
3701 unsigned int bts_nr;
3702
3703 gsmnet = gsmnet_from_vty(vty);
3704
3705 bts_nr = atoi(argv[0]);
3706 if (bts_nr >= gsmnet->num_bts) {
3707 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3708 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3709 return CMD_WARNING;
3710 }
3711
3712 bts = gsm_bts_num(gsmnet, bts_nr);
3713 if (!bts) {
3714 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3715 return CMD_WARNING;
3716 }
3717
3718 if (!is_ipaccess_bts(bts) || is_sysmobts_v2(bts)) {
3719 vty_out(vty, "This command only works for ipaccess nanoBTS.%s",
3720 VTY_NEWLINE);
3721 return CMD_WARNING;
3722 }
3723
3724 /* go from last TRX to c0 */
3725 llist_for_each_entry_reverse(trx, &bts->trx_list, list)
3726 abis_nm_ipaccess_restart(trx);
3727
3728 return CMD_SUCCESS;
3729}
3730
Harald Weltebf4ba722014-12-28 15:00:45 +01003731DEFUN(smscb_cmd, smscb_cmd_cmd,
3732 "bts <0-255> smscb-command <1-4> HEXSTRING",
3733 "BTS related commands\n" "BTS Number\n"
3734 "SMS Cell Broadcast\n" "Last Valid Block\n"
3735 "Hex Encoded SMSCB message (up to 88 octets)\n")
3736{
3737 struct gsm_bts *bts;
3738 int bts_nr = atoi(argv[0]);
3739 int last_block = atoi(argv[1]);
3740 struct rsl_ie_cb_cmd_type cb_cmd;
3741 uint8_t buf[88];
3742 int rc;
3743
Neels Hofmeyr191933d2016-05-11 18:48:39 +02003744 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
Harald Weltebf4ba722014-12-28 15:00:45 +01003745 if (!bts) {
3746 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3747 return CMD_WARNING;
3748 }
3749 rc = osmo_hexparse(argv[2], buf, sizeof(buf));
3750 if (rc < 0 || rc > sizeof(buf)) {
3751 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
3752 return CMD_WARNING;
3753 }
3754
3755 cb_cmd.spare = 0;
3756 cb_cmd.def_bcast = 0;
3757 cb_cmd.command = RSL_CB_CMD_TYPE_NORMAL;
3758
3759 switch (last_block) {
3760 case 1:
3761 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_1;
3762 break;
3763 case 2:
3764 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_2;
3765 break;
3766 case 3:
3767 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_3;
3768 break;
3769 case 4:
3770 cb_cmd.last_block = RSL_CB_CMD_LASTBLOCK_4;
3771 break;
3772 }
3773
3774 rsl_sms_cb_command(bts, RSL_CHAN_SDCCH4_ACCH, cb_cmd, buf, rc);
3775
3776 return CMD_SUCCESS;
3777}
3778
3779
Harald Welte5213e992010-12-23 13:18:07 +01003780DEFUN(pdch_act, pdch_act_cmd,
3781 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
3782 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3783 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
3784 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
3785 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
3786{
3787 struct gsm_bts *bts;
3788 struct gsm_bts_trx *trx;
3789 struct gsm_bts_trx_ts *ts;
3790 int bts_nr = atoi(argv[0]);
3791 int trx_nr = atoi(argv[1]);
3792 int ts_nr = atoi(argv[2]);
3793 int activate;
3794
Neels Hofmeyr191933d2016-05-11 18:48:39 +02003795 bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);
Harald Welte5213e992010-12-23 13:18:07 +01003796 if (!bts) {
3797 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3798 return CMD_WARNING;
3799 }
3800
3801 if (!is_ipaccess_bts(bts)) {
3802 vty_out(vty, "%% This command only works for ipaccess BTS%s",
3803 VTY_NEWLINE);
3804 return CMD_WARNING;
3805 }
3806
3807 trx = gsm_bts_trx_num(bts, trx_nr);
3808 if (!trx) {
3809 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
3810 return CMD_WARNING;
3811 }
3812
3813 ts = &trx->ts[ts_nr];
3814 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
3815 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
3816 "mode%s", ts_nr, VTY_NEWLINE);
3817 return CMD_WARNING;
3818 }
3819
3820 if (!strcmp(argv[3], "activate"))
3821 activate = 1;
3822 else
3823 activate = 0;
3824
3825 rsl_ipacc_pdch_activate(ts, activate);
3826
3827 return CMD_SUCCESS;
3828
3829}
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02003830
Harald Welte40152872010-05-16 20:52:23 +02003831extern int bsc_vty_init_extra(void);
Holger Hans Peter Freytherc48a2a12010-04-10 00:08:28 +02003832
Neels Hofmeyrd5cd2652016-05-10 13:40:19 +02003833int bsc_vty_init(const struct log_info *cat, struct gsm_network *network)
Harald Welte59b04682009-06-10 05:40:52 +08003834{
Harald Welte2addf852012-08-17 12:42:06 +02003835 cfg_ts_pchan_cmd.string =
3836 vty_cmd_string_from_valstr(tall_bsc_ctx,
3837 gsm_pchant_names,
3838 "phys_chan_config (", "|", ")",
3839 VTY_DO_LOWER);
3840 cfg_ts_pchan_cmd.doc =
3841 vty_cmd_string_from_valstr(tall_bsc_ctx,
3842 gsm_pchant_descs,
3843 "Physical Channel Combination\n",
3844 "\n", "", 0);
3845
Harald Welte85a77b12012-08-17 13:02:12 +02003846 cfg_bts_type_cmd.string =
3847 vty_cmd_string_from_valstr(tall_bsc_ctx,
3848 bts_type_names,
3849 "type (", "|", ")",
3850 VTY_DO_LOWER);
3851 cfg_bts_type_cmd.doc =
3852 vty_cmd_string_from_valstr(tall_bsc_ctx,
3853 bts_type_descs,
3854 "BTS Vendor/Type\n",
3855 "\n", "", 0);
3856
Neels Hofmeyrbfe27272016-05-12 01:16:58 +02003857 common_cs_vty_init(network, config_write_net);
Harald Welte85a77b12012-08-17 13:02:12 +02003858
Neels Hofmeyrd416b482016-05-12 01:53:23 +02003859 install_element_ve(&bsc_show_net_cmd);
Harald Welte7bc28f62010-05-12 16:10:35 +00003860 install_element_ve(&show_bts_cmd);
3861 install_element_ve(&show_trx_cmd);
3862 install_element_ve(&show_ts_cmd);
3863 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08003864 install_element_ve(&show_lchan_summary_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08003865
Harald Welte7bc28f62010-05-12 16:10:35 +00003866 install_element_ve(&show_paging_cmd);
Holger Hans Peter Freyther35e6fbb2013-02-05 09:39:09 +01003867 install_element_ve(&show_paging_group_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08003868
Pablo Neira Ayuso36ad9a42011-03-09 13:36:32 +01003869 logging_vty_add_cmds(cat);
Jacob Erlbeck63fac682015-10-26 16:25:37 +01003870 osmo_stats_vty_add_cmds();
Holger Hans Peter Freytherc8d862e2009-12-22 22:32:51 +01003871
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01003872 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Welte0af9c9f2009-12-19 21:41:52 +01003873 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Weltea8062f12009-12-21 16:51:50 +01003874 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
3875 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
3876 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
3877 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
3878 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
3879 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01003880 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +01003881 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
3882 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
3883 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
3884 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
3885 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
3886 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
3887 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
3888 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
3889 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltee2aaf442010-12-23 22:53:50 +01003890 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +01003891 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther21d63ff2010-09-06 09:25:48 +08003892 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +08003893 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Weltee87eb462009-08-07 13:29:14 +02003894
3895 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte97ceef92009-08-06 19:06:46 +02003896 install_node(&bts_node, config_write_bts);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01003897 vty_install_default(BTS_NODE);
Harald Welte59b04682009-06-10 05:40:52 +08003898 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte8791dac2010-05-14 17:59:53 +02003899 install_element(BTS_NODE, &cfg_description_cmd);
3900 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Welte91afe4c2009-06-20 18:15:19 +02003901 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +02003902 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Max3d94aca2016-05-11 12:45:13 +02003903 install_element(BTS_NODE, &cfg_bts_dtxu_cmd);
3904 install_element(BTS_NODE, &cfg_bts_dtxd_cmd);
3905 install_element(BTS_NODE, &cfg_bts_no_dtxu_cmd);
3906 install_element(BTS_NODE, &cfg_bts_no_dtxd_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08003907 install_element(BTS_NODE, &cfg_bts_lac_cmd);
3908 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte62868882009-08-08 16:12:58 +02003909 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08003910 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8b3c5952013-03-12 13:57:05 +01003911 install_element(BTS_NODE, &cfg_bts_rsl_ip_cmd);
Sylvain Munautcb8e8432011-10-17 14:04:55 +02003912 install_element(BTS_NODE, &cfg_bts_nokia_site_skip_reset_cmd);
Andreas Eversbergac27b952013-12-05 13:25:06 +01003913 install_element(BTS_NODE, &cfg_bts_nokia_site_no_loc_rel_cnf_cmd);
Sipos Csabadef87b42015-02-07 13:27:36 +01003914 install_element(BTS_NODE, &cfg_bts_nokia_site_bts_reset_timer_cnf_cmd);
Harald Welte25572872009-10-20 00:22:00 +02003915 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte62868882009-08-08 16:12:58 +02003916 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
3917 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte3e774612009-08-10 13:48:16 +02003918 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01003919 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
3920 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Andreas Eversberg14e12f22012-10-13 07:27:47 +02003921 install_element(BTS_NODE, &cfg_bts_chan_desc_att_cmd);
3922 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_pa_mfrms_cmd);
3923 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_ag_blks_res_cmd);
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08003924 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
3925 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02003926 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +08003927 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Ivan Kluchnikov80d58432013-09-16 13:13:04 +04003928 install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
Harald Welte (local)cbd46102009-08-13 10:14:26 +02003929 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02003930 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Holger Hans Peter Freyther2fb8ebf2013-07-27 21:07:57 +02003931 install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
Harald Welteb761bf82009-12-12 18:17:25 +01003932 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
3933 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaut00d71462010-11-28 18:17:28 +01003934 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
3935 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
3936 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
3937 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
3938 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
3939 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Andreas Eversbergf9248d92013-03-10 11:49:35 +01003940 install_element(BTS_NODE, &cfg_bts_radio_link_timeout_cmd);
Harald Weltecb20b7a2010-04-18 15:51:20 +02003941 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
bhargava612722c2016-07-21 11:14:34 +05303942 install_element(BTS_NODE, &cfg_bts_gprs_11bit_rach_support_for_egprs_cmd);
Harald Weltea9251762010-05-11 23:50:21 +02003943 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte3055e332010-03-14 15:37:43 +08003944 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
Andreas Eversberga4fa21c2013-03-16 16:31:26 +01003945 install_element(BTS_NODE, &cfg_bts_gprs_net_ctrl_ord_cmd);
Max88bdcd42016-07-28 11:55:37 +02003946 install_element(BTS_NODE, &cfg_bts_gprs_ctrl_ack_cmd);
3947 install_element(BTS_NODE, &cfg_no_bts_gprs_ctrl_ack_cmd);
Harald Welte3055e332010-03-14 15:37:43 +08003948 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Weltea9251762010-05-11 23:50:21 +02003949 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Welte4a048c52010-03-22 11:48:36 +08003950 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte3055e332010-03-14 15:37:43 +08003951 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welte410575a2010-03-14 23:30:30 +08003952 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
3953 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
3954 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freyther3112f672010-09-06 10:11:25 +08003955 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welted8acf142010-07-30 11:50:09 +02003956 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
3957 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welteca46eff2011-01-11 23:44:56 +01003958 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
3959 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Weltef989b782011-02-15 11:43:27 +01003960 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Max88ddcaa2016-04-15 16:04:46 +02003961 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_add_cmd);
3962 install_element(BTS_NODE, &cfg_bts_si2quater_neigh_del_cmd);
Maxeaf196c2016-04-20 15:57:13 +02003963 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_add_cmd);
3964 install_element(BTS_NODE, &cfg_bts_si2quater_uarfcn_del_cmd);
Holger Hans Peter Freyther10799162012-07-20 10:27:31 +02003965 install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
3966 install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
Jacob Erlbeck8f8e5bf2014-01-16 11:02:14 +01003967 install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
3968 install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
Andreas Eversberg976493b2013-12-07 18:32:28 +01003969 install_element(BTS_NODE, &cfg_bts_codec0_cmd);
3970 install_element(BTS_NODE, &cfg_bts_codec1_cmd);
3971 install_element(BTS_NODE, &cfg_bts_codec2_cmd);
3972 install_element(BTS_NODE, &cfg_bts_codec3_cmd);
3973 install_element(BTS_NODE, &cfg_bts_codec4_cmd);
Holger Hans Peter Freyther15152612014-12-17 14:46:17 +01003974 install_element(BTS_NODE, &cfg_bts_depends_on_cmd);
3975 install_element(BTS_NODE, &cfg_bts_no_depends_on_cmd);
Andreas Eversbergfa163e82014-01-19 11:47:44 +01003976 install_element(BTS_NODE, &cfg_bts_amr_fr_modes1_cmd);
3977 install_element(BTS_NODE, &cfg_bts_amr_fr_modes2_cmd);
3978 install_element(BTS_NODE, &cfg_bts_amr_fr_modes3_cmd);
3979 install_element(BTS_NODE, &cfg_bts_amr_fr_modes4_cmd);
3980 install_element(BTS_NODE, &cfg_bts_amr_fr_thres1_cmd);
3981 install_element(BTS_NODE, &cfg_bts_amr_fr_thres2_cmd);
3982 install_element(BTS_NODE, &cfg_bts_amr_fr_thres3_cmd);
3983 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst1_cmd);
3984 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst2_cmd);
3985 install_element(BTS_NODE, &cfg_bts_amr_fr_hyst3_cmd);
3986 install_element(BTS_NODE, &cfg_bts_amr_fr_start_mode_cmd);
3987 install_element(BTS_NODE, &cfg_bts_amr_hr_modes1_cmd);
3988 install_element(BTS_NODE, &cfg_bts_amr_hr_modes2_cmd);
3989 install_element(BTS_NODE, &cfg_bts_amr_hr_modes3_cmd);
3990 install_element(BTS_NODE, &cfg_bts_amr_hr_modes4_cmd);
3991 install_element(BTS_NODE, &cfg_bts_amr_hr_thres1_cmd);
3992 install_element(BTS_NODE, &cfg_bts_amr_hr_thres2_cmd);
3993 install_element(BTS_NODE, &cfg_bts_amr_hr_thres3_cmd);
3994 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst1_cmd);
3995 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst2_cmd);
3996 install_element(BTS_NODE, &cfg_bts_amr_hr_hyst3_cmd);
3997 install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08003998
3999 install_element(BTS_NODE, &cfg_trx_cmd);
4000 install_node(&trx_node, dummy_config_write);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01004001 vty_install_default(TRX_NODE);
Harald Welte59b04682009-06-10 05:40:52 +08004002 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte8791dac2010-05-14 17:59:53 +02004003 install_element(TRX_NODE, &cfg_description_cmd);
4004 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)b709bfe2009-12-27 20:56:38 +01004005 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte7f597bc2009-06-20 22:36:12 +02004006 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte62868882009-08-08 16:12:58 +02004007 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
4008 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther1c8b4802009-11-11 11:54:24 +01004009 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08004010
4011 install_element(TRX_NODE, &cfg_ts_cmd);
4012 install_node(&ts_node, dummy_config_write);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01004013 vty_install_default(TS_NODE);
Harald Welte3ffe1b32009-08-07 00:25:23 +02004014 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Welte2addf852012-08-17 12:42:06 +02004015 install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);
Harald Welte85771a42011-05-30 12:09:13 +02004016 install_element(TS_NODE, &cfg_ts_tsc_cmd);
Harald Weltea42a93f2010-06-14 22:26:10 +02004017 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte67104d12009-09-12 13:05:33 +02004018 install_element(TS_NODE, &cfg_ts_hsn_cmd);
4019 install_element(TS_NODE, &cfg_ts_maio_cmd);
4020 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
4021 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Welte3ffe1b32009-08-07 00:25:23 +02004022 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08004023
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02004024 install_element(ENABLE_NODE, &drop_bts_cmd);
Holger Hans Peter Freyther8ab66e82016-03-16 13:45:23 +01004025 install_element(ENABLE_NODE, &restart_bts_cmd);
Harald Welte5213e992010-12-23 13:18:07 +01004026 install_element(ENABLE_NODE, &pdch_act_cmd);
Harald Weltebf4ba722014-12-28 15:00:45 +01004027 install_element(ENABLE_NODE, &smscb_cmd_cmd);
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02004028
Harald Welte63b964e2010-05-31 16:40:40 +02004029 abis_nm_vty_init();
Harald Welte1d5a2062011-02-12 14:42:59 +01004030 abis_om2k_vty_init();
Harald Weltee76bea02011-02-05 13:54:41 +01004031 e1inp_vty_init();
Harald Welte63b964e2010-05-31 16:40:40 +02004032
Harald Welte40152872010-05-16 20:52:23 +02004033 bsc_vty_init_extra();
Harald Welte59b04682009-06-10 05:40:52 +08004034
4035 return 0;
4036}