blob: 3b85892e04f1931c42284a573f85996357622a24 [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>
21#include <unistd.h>
Harald Welte59b04682009-06-10 05:40:52 +080022
Harald Weltebd9591f2010-05-19 19:45:32 +020023#include <osmocom/vty/command.h>
24#include <osmocom/vty/buffer.h>
25#include <osmocom/vty/vty.h>
26#include <osmocom/vty/logging.h>
27#include <osmocom/vty/telnet_interface.h>
Harald Welte2addf852012-08-17 12:42:06 +020028#include <osmocom/vty/misc.h>
Harald Welte59b04682009-06-10 05:40:52 +080029
Holger Hans Peter Freyther35e6fbb2013-02-05 09:39:09 +010030#include <osmocom/gsm/gsm0502.h>
31
Harald Welte59b04682009-06-10 05:40:52 +080032#include <arpa/inet.h>
33
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +010034#include <osmocom/core/linuxlist.h>
Harald Welte59b04682009-06-10 05:40:52 +080035#include <openbsc/gsm_data.h>
Pablo Neira Ayuso42e41df2011-08-17 22:44:07 +020036#include <osmocom/abis/e1_input.h>
Harald Welte59b04682009-06-10 05:40:52 +080037#include <openbsc/abis_nm.h>
Harald Welte30f93fb2011-02-19 16:48:17 +010038#include <openbsc/abis_om2000.h>
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +010039#include <osmocom/core/utils.h>
40#include <osmocom/gsm/gsm_utils.h>
Harald Welte73e69942011-05-23 20:42:26 +020041#include <osmocom/gsm/abis_nm.h>
Harald Weltefe96f382009-12-22 13:09:29 +010042#include <openbsc/chan_alloc.h>
Harald Welte44007742009-12-22 21:43:14 +010043#include <openbsc/meas_rep.h>
Harald Welte59b04682009-06-10 05:40:52 +080044#include <openbsc/db.h>
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +010045#include <osmocom/core/talloc.h>
Holger Hans Peter Freytherb70d45b2010-04-06 11:55:37 +020046#include <openbsc/vty.h>
Harald Weltecfb6b282012-06-16 14:59:56 +080047#include <osmocom/gprs/gprs_ns.h>
Harald Welted8acf142010-07-30 11:50:09 +020048#include <openbsc/system_information.h>
Harald Welte682ee5f2010-05-16 22:02:16 +020049#include <openbsc/debug.h>
Holger Hans Peter Freyther25176f12010-11-09 17:00:42 +010050#include <openbsc/paging.h>
Harald Welte64fcd772011-08-20 18:25:02 +020051#include <openbsc/ipaccess.h>
Harald Welte5213e992010-12-23 13:18:07 +010052#include <openbsc/abis_rsl.h>
Holger Hans Peter Freytherd0146922011-02-24 14:19:14 +010053#include <openbsc/osmo_msc_data.h>
54#include <openbsc/osmo_bsc_rf.h>
Harald Welte59b04682009-06-10 05:40:52 +080055
Holger Hans Peter Freyther35e6fbb2013-02-05 09:39:09 +010056#include <inttypes.h>
57
Harald Welted9dea592011-03-04 13:53:51 +010058#include "../../bscconfig.h"
Harald Welte10c29f62010-05-16 19:20:24 +020059
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +020060
61#define NETWORK_STR "Configure the GSM network\n"
62#define CODE_CMD_STR "Code commands\n"
63#define NAME_CMD_STR "Name Commands\n"
64#define NAME_STR "Name to use\n"
65#define LCHAN_NR_STR "Logical Channel Number\n"
66
67
Harald Welted6b62e32010-05-12 17:19:53 +000068/* FIXME: this should go to some common file */
69static const struct value_string gprs_ns_timer_strs[] = {
Harald Weltea9251762010-05-11 23:50:21 +020070 { 0, "tns-block" },
71 { 1, "tns-block-retries" },
72 { 2, "tns-reset" },
73 { 3, "tns-reset-retries" },
74 { 4, "tns-test" },
75 { 5, "tns-alive" },
76 { 6, "tns-alive-retries" },
77 { 0, NULL }
78};
79
Harald Welted6b62e32010-05-12 17:19:53 +000080static const struct value_string gprs_bssgp_cfg_strs[] = {
Harald Weltea9251762010-05-11 23:50:21 +020081 { 0, "blocking-timer" },
82 { 1, "blocking-retries" },
83 { 2, "unblocking-retries" },
84 { 3, "reset-timer" },
85 { 4, "reset-retries" },
86 { 5, "suspend-timer" },
87 { 6, "suspend-retries" },
88 { 7, "resume-timer" },
89 { 8, "resume-retries" },
90 { 9, "capability-update-timer" },
91 { 10, "capability-update-retries" },
92 { 0, NULL }
93};
94
Harald Weltef989b782011-02-15 11:43:27 +010095static const struct value_string bts_neigh_mode_strs[] = {
96 { NL_MODE_AUTOMATIC, "automatic" },
97 { NL_MODE_MANUAL, "manual" },
98 { NL_MODE_MANUAL_SI5SEP, "manual-si5" },
99 { 0, NULL }
100};
101
Daniel Willmann2c9540c2012-05-14 18:43:23 +0200102const struct value_string bts_loc_fix_names[] = {
103 { BTS_LOC_FIX_INVALID, "invalid" },
104 { BTS_LOC_FIX_2D, "fix2d" },
105 { BTS_LOC_FIX_3D, "fix3d" },
106 { 0, NULL }
107};
108
Harald Weltee87eb462009-08-07 13:29:14 +0200109struct cmd_node net_node = {
110 GSMNET_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +0200111 "%s(config-net)# ",
Harald Weltee87eb462009-08-07 13:29:14 +0200112 1,
113};
114
Harald Welte59b04682009-06-10 05:40:52 +0800115struct cmd_node bts_node = {
116 BTS_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +0200117 "%s(config-net-bts)# ",
Harald Welte59b04682009-06-10 05:40:52 +0800118 1,
119};
120
121struct cmd_node trx_node = {
122 TRX_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +0200123 "%s(config-net-bts-trx)# ",
Harald Welte59b04682009-06-10 05:40:52 +0800124 1,
125};
126
127struct cmd_node ts_node = {
128 TS_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +0200129 "%s(config-net-bts-trx-ts)# ",
Harald Welte59b04682009-06-10 05:40:52 +0800130 1,
131};
132
Harald Welte61daf6d2010-05-27 13:39:40 +0200133extern struct gsm_network *bsc_gsmnet;
134
Harald Welte40152872010-05-16 20:52:23 +0200135struct gsm_network *gsmnet_from_vty(struct vty *v)
136{
Harald Welte61daf6d2010-05-27 13:39:40 +0200137 /* In case we read from the config file, the vty->priv cannot
138 * point to a struct telnet_connection, and thus conn->priv
139 * will not point to the gsm_network structure */
140#if 0
Harald Welte40152872010-05-16 20:52:23 +0200141 struct telnet_connection *conn = v->priv;
142 return (struct gsm_network *) conn->priv;
Harald Welte61daf6d2010-05-27 13:39:40 +0200143#else
144 return bsc_gsmnet;
145#endif
Harald Welte40152872010-05-16 20:52:23 +0200146}
147
Harald Welte59b04682009-06-10 05:40:52 +0800148static int dummy_config_write(struct vty *v)
149{
150 return CMD_SUCCESS;
151}
152
153static void net_dump_nmstate(struct vty *vty, struct gsm_nm_state *nms)
154{
Harald Weltee7b751c2013-03-15 16:57:33 +0100155 vty_out(vty,"Oper '%s', Admin '%s', Avail '%s'%s",
156 abis_nm_opstate_name(nms->operational),
157 get_value_string(abis_nm_adm_state_names, nms->administrative),
Harald Welte306a8892011-05-23 20:30:39 +0200158 abis_nm_avail_name(nms->availability), VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800159}
160
Harald Weltefe96f382009-12-22 13:09:29 +0100161static void dump_pchan_load_vty(struct vty *vty, char *prefix,
162 const struct pchan_load *pl)
163{
164 int i;
165
166 for (i = 0; i < ARRAY_SIZE(pl->pchan); i++) {
167 const struct load_counter *lc = &pl->pchan[i];
168 unsigned int percent;
169
170 if (lc->total == 0)
171 continue;
172
173 percent = (lc->used * 100) / lc->total;
174
175 vty_out(vty, "%s%20s: %3u%% (%u/%u)%s", prefix,
176 gsm_pchan_name(i), percent, lc->used, lc->total,
177 VTY_NEWLINE);
178 }
179}
180
Harald Welte59b04682009-06-10 05:40:52 +0800181static void net_dump_vty(struct vty *vty, struct gsm_network *net)
182{
Harald Weltefe96f382009-12-22 13:09:29 +0100183 struct pchan_load pl;
184
Harald Welte59b04682009-06-10 05:40:52 +0800185 vty_out(vty, "BSC is on Country Code %u, Network Code %u "
186 "and has %u BTS%s", net->country_code, net->network_code,
187 net->num_bts, VTY_NEWLINE);
188 vty_out(vty, " Long network name: '%s'%s",
189 net->name_long, VTY_NEWLINE);
190 vty_out(vty, " Short network name: '%s'%s",
191 net->name_short, VTY_NEWLINE);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +0200192 vty_out(vty, " Authentication policy: %s%s",
193 gsm_auth_policy_name(net->auth_policy), VTY_NEWLINE);
Harald Welte59936d72009-11-18 20:33:19 +0100194 vty_out(vty, " Location updating reject cause: %u%s",
195 net->reject_cause, VTY_NEWLINE);
Harald Weltecca253a2009-08-30 15:47:06 +0900196 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
197 VTY_NEWLINE);
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +0100198 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
199 VTY_NEWLINE);
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +0800200 vty_out(vty, " Use TCH for Paging any: %d%s", net->pag_any_tch,
201 VTY_NEWLINE);
Harald Welte52af1952009-12-13 10:53:12 +0100202 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
203 VTY_NEWLINE);
Harald Weltea310f3e2009-12-14 09:00:24 +0100204 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
205 VTY_NEWLINE);
Harald Welte0af9c9f2009-12-19 21:41:52 +0100206 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
207 VTY_NEWLINE);
Harald Weltefe96f382009-12-22 13:09:29 +0100208 network_chan_load(&pl, net);
209 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
210 dump_pchan_load_vty(vty, " ", &pl);
Holger Hans Peter Freytherd0146922011-02-24 14:19:14 +0100211
212 /* show rf */
Holger Hans Peter Freyther4d614172011-08-15 15:53:00 +0200213 if (net->bsc_data && net->bsc_data->rf_ctrl)
Holger Hans Peter Freytherd0146922011-02-24 14:19:14 +0100214 vty_out(vty, " Last RF Command: %s%s",
Holger Hans Peter Freyther4d614172011-08-15 15:53:00 +0200215 net->bsc_data->rf_ctrl->last_state_command,
Holger Hans Peter Freytherd0146922011-02-24 14:19:14 +0100216 VTY_NEWLINE);
Jacob Erlbeckdcce8e82013-09-11 10:46:57 +0200217 if (net->bsc_data && net->bsc_data->rf_ctrl)
218 vty_out(vty, " Last RF Lock Command: %s%s",
219 net->bsc_data->rf_ctrl->last_rf_lock_ctrl_command,
220 VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800221}
222
223DEFUN(show_net, show_net_cmd, "show network",
224 SHOW_STR "Display information about a GSM NETWORK\n")
225{
Harald Welte40152872010-05-16 20:52:23 +0200226 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800227 net_dump_vty(vty, net);
228
229 return CMD_SUCCESS;
230}
231
232static void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l)
233{
234 struct e1inp_line *line;
235
236 if (!e1l) {
237 vty_out(vty, " None%s", VTY_NEWLINE);
238 return;
239 }
240
241 line = e1l->ts->line;
242
243 vty_out(vty, " E1 Line %u, Type %s: Timeslot %u, Mode %s%s",
244 line->num, line->driver->name, e1l->ts->num,
245 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
246 vty_out(vty, " E1 TEI %u, SAPI %u%s",
247 e1l->tei, e1l->sapi, VTY_NEWLINE);
248}
249
250static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
251{
Harald Weltefe96f382009-12-22 13:09:29 +0100252 struct pchan_load pl;
253
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +0200254 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Welte91afe4c2009-06-20 18:15:19 +0200255 "BSIC %u, TSC %u and %u TRX%s",
256 bts->nr, btstype2str(bts->type), gsm_band_name(bts->band),
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +0200257 bts->cell_identity,
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +0200258 bts->location_area_code, bts->bsic, bts->tsc,
Harald Welte91afe4c2009-06-20 18:15:19 +0200259 bts->num_trx, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200260 vty_out(vty, "Description: %s%s",
261 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Harald Welte8e9d1792009-12-12 15:38:16 +0100262 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +0100263 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte8e9d1792009-12-12 15:38:16 +0100264 rxlev2dbm(bts->si_common.cell_sel_par.rxlev_acc_min),
265 VTY_NEWLINE);
266 vty_out(vty, "Cell Reselection Hysteresis: %u dBm%s",
Harald Welteb761bf82009-12-12 18:17:25 +0100267 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +0100268 vty_out(vty, "RACH TX-Integer: %u%s", bts->si_common.rach_control.tx_integer,
269 VTY_NEWLINE);
270 vty_out(vty, "RACH Max transmissions: %u%s",
271 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
272 VTY_NEWLINE);
Harald Welte8c973ba2009-12-21 23:08:18 +0100273 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)e19be3f2009-08-12 13:28:23 +0200274 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Andreas Eversberg14e12f22012-10-13 07:27:47 +0200275 vty_out(vty, "Channel Description Attachment: %s%s",
276 (bts->si_common.chan_desc.att) ? "yes" : "no", VTY_NEWLINE);
277 vty_out(vty, "Channel Description BS-PA-MFRMS: %u%s",
278 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
279 vty_out(vty, "Channel Description BS-AG_BLKS-RES: %u%s",
280 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
Harald Welted8acf142010-07-30 11:50:09 +0200281 vty_out(vty, "System Information present: 0x%08x, static: 0x%08x%s",
282 bts->si_valid, bts->si_mode_static, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800283 if (is_ipaccess_bts(bts))
Harald Welte25572872009-10-20 00:22:00 +0200284 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte59b04682009-06-10 05:40:52 +0800285 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte25572872009-10-20 00:22:00 +0200286 bts->oml_tei, VTY_NEWLINE);
Sylvain Munautcb8e8432011-10-17 14:04:55 +0200287 else if (bts->type == GSM_BTS_TYPE_NOKIA_SITE)
288 vty_out(vty, " Skip Reset: %d%s",
289 bts->nokia.skip_reset, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800290 vty_out(vty, " NM State: ");
Harald Welte69f6f812011-05-30 12:07:53 +0200291 net_dump_nmstate(vty, &bts->mo.nm_state);
Harald Welte59b04682009-06-10 05:40:52 +0800292 vty_out(vty, " Site Mgr NM State: ");
Harald Welte69f6f812011-05-30 12:07:53 +0200293 net_dump_nmstate(vty, &bts->site_mgr.mo.nm_state);
Holger Hans Peter Freyther03d80af2013-05-29 16:22:09 +0200294 vty_out(vty, " GPRS NSE: ");
295 net_dump_nmstate(vty, &bts->gprs.nse.mo.nm_state);
296 vty_out(vty, " GPRS CELL: ");
297 net_dump_nmstate(vty, &bts->gprs.cell.mo.nm_state);
298 vty_out(vty, " GPRS NSVC0: ");
299 net_dump_nmstate(vty, &bts->gprs.nsvc[0].mo.nm_state);
300 vty_out(vty, " GPRS NSVC1: ");
301 net_dump_nmstate(vty, &bts->gprs.nsvc[1].mo.nm_state);
Holger Hans Peter Freyther914ff192011-04-26 15:52:34 +0200302 vty_out(vty, " Paging: %u pending requests, %u free slots%s",
303 paging_pending_requests_nr(bts),
Harald Welte59b04682009-06-10 05:40:52 +0800304 bts->paging.available_slots, VTY_NEWLINE);
Holger Hans Peter Freytherb5c79c92010-11-25 16:28:45 +0100305 if (is_ipaccess_bts(bts)) {
306 vty_out(vty, " OML Link state: %s.%s",
307 bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);
308 } else {
Harald Welte25572872009-10-20 00:22:00 +0200309 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
310 e1isl_dump_vty(vty, bts->oml_link);
311 }
Holger Hans Peter Freytherb5c79c92010-11-25 16:28:45 +0100312
313 /* FIXME: chan_desc */
Harald Weltefe96f382009-12-22 13:09:29 +0100314 memset(&pl, 0, sizeof(pl));
315 bts_chan_load(&pl, bts);
316 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
317 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte59b04682009-06-10 05:40:52 +0800318}
319
Sylvain Munaut1ad96282012-12-28 12:15:11 +0100320DEFUN(show_bts, show_bts_cmd, "show bts [<0-255>]",
Harald Welte59b04682009-06-10 05:40:52 +0800321 SHOW_STR "Display information about a BTS\n"
322 "BTS number")
323{
Harald Welte40152872010-05-16 20:52:23 +0200324 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800325 int bts_nr;
326
327 if (argc != 0) {
328 /* use the BTS number that the user has specified */
329 bts_nr = atoi(argv[0]);
Harald Welteda5db862010-12-24 12:24:03 +0100330 if (bts_nr >= net->num_bts) {
Harald Welte59b04682009-06-10 05:40:52 +0800331 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
332 VTY_NEWLINE);
333 return CMD_WARNING;
334 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200335 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte59b04682009-06-10 05:40:52 +0800336 return CMD_SUCCESS;
337 }
338 /* print all BTS's */
339 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee712a5f2009-06-21 16:17:15 +0200340 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte59b04682009-06-10 05:40:52 +0800341
342 return CMD_SUCCESS;
343}
344
Harald Welte62868882009-08-08 16:12:58 +0200345/* utility functions */
346static void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,
347 const char *ts, const char *ss)
348{
349 e1_link->e1_nr = atoi(line);
350 e1_link->e1_ts = atoi(ts);
351 if (!strcmp(ss, "full"))
352 e1_link->e1_ts_ss = 255;
353 else
354 e1_link->e1_ts_ss = atoi(ss);
355}
356
357static void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,
358 const char *prefix)
359{
360 if (!e1_link->e1_ts)
361 return;
362
363 if (e1_link->e1_ts_ss == 255)
364 vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",
365 prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);
366 else
367 vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",
368 prefix, e1_link->e1_nr, e1_link->e1_ts,
369 e1_link->e1_ts_ss, VTY_NEWLINE);
370}
371
372
Harald Welte97ceef92009-08-06 19:06:46 +0200373static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
374{
Harald Welte62868882009-08-08 16:12:58 +0200375 vty_out(vty, " timeslot %u%s", ts->nr, VTY_NEWLINE);
Harald Welte85771a42011-05-30 12:09:13 +0200376 if (ts->tsc != -1 && ts->tsc != ts->trx->bts->tsc)
377 vty_out(vty, " training_sequence_code %u%s", ts->tsc, VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200378 if (ts->pchan != GSM_PCHAN_NONE)
379 vty_out(vty, " phys_chan_config %s%s",
380 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
Harald Weltea42a93f2010-06-14 22:26:10 +0200381 vty_out(vty, " hopping enabled %u%s",
382 ts->hopping.enabled, VTY_NEWLINE);
383 if (ts->hopping.enabled) {
384 unsigned int i;
385 vty_out(vty, " hopping sequence-number %u%s",
Harald Welte67104d12009-09-12 13:05:33 +0200386 ts->hopping.hsn, VTY_NEWLINE);
Harald Weltea42a93f2010-06-14 22:26:10 +0200387 vty_out(vty, " hopping maio %u%s",
Harald Welte67104d12009-09-12 13:05:33 +0200388 ts->hopping.maio, VTY_NEWLINE);
Harald Weltea42a93f2010-06-14 22:26:10 +0200389 for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {
390 if (!bitvec_get_bit_pos(&ts->hopping.arfcns, i))
391 continue;
392 vty_out(vty, " hopping arfcn add %u%s",
393 i, VTY_NEWLINE);
394 }
Harald Welteff598092010-12-24 12:07:07 +0100395 }
Harald Welte62868882009-08-08 16:12:58 +0200396 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Weltec02789e2011-02-14 16:15:21 +0100397
398 if (ts->trx->bts->model->config_write_ts)
399 ts->trx->bts->model->config_write_ts(vty, ts);
Harald Welte97ceef92009-08-06 19:06:46 +0200400}
401
402static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
403{
404 int i;
405
Harald Weltee87eb462009-08-07 13:29:14 +0200406 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200407 if (trx->description)
408 vty_out(vty, " description %s%s", trx->description,
409 VTY_NEWLINE);
Holger Hans Peter Freyther32be2aa2010-04-17 06:42:07 +0200410 vty_out(vty, " rf_locked %u%s",
Harald Welte69f6f812011-05-30 12:07:53 +0200411 trx->mo.nm_state.administrative == NM_STATE_LOCKED ? 1 : 0,
Holger Hans Peter Freyther32be2aa2010-04-17 06:42:07 +0200412 VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200413 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)b709bfe2009-12-27 20:56:38 +0100414 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200415 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200416 config_write_e1_link(vty, &trx->rsl_e1_link, " rsl ");
417 vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei, VTY_NEWLINE);
Harald Welte97ceef92009-08-06 19:06:46 +0200418
Harald Weltec02789e2011-02-14 16:15:21 +0100419 if (trx->bts->model->config_write_trx)
420 trx->bts->model->config_write_trx(vty, trx);
421
Harald Welte97ceef92009-08-06 19:06:46 +0200422 for (i = 0; i < TRX_NR_TS; i++)
423 config_write_ts_single(vty, &trx->ts[i]);
424}
425
Harald Weltea9251762010-05-11 23:50:21 +0200426static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
427{
428 unsigned int i;
429 vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
430 VTY_NEWLINE);
431 if (bts->gprs.mode == BTS_GPRS_NONE)
432 return;
433
434 vty_out(vty, " gprs routing area %u%s", bts->gprs.rac,
435 VTY_NEWLINE);
Andreas Eversberga4fa21c2013-03-16 16:31:26 +0100436 vty_out(vty, " gprs network-control-order nc%u%s",
437 bts->gprs.net_ctrl_ord, VTY_NEWLINE);
Harald Weltea9251762010-05-11 23:50:21 +0200438 vty_out(vty, " gprs cell bvci %u%s", bts->gprs.cell.bvci,
439 VTY_NEWLINE);
440 for (i = 0; i < ARRAY_SIZE(bts->gprs.cell.timer); i++)
441 vty_out(vty, " gprs cell timer %s %u%s",
442 get_value_string(gprs_bssgp_cfg_strs, i),
443 bts->gprs.cell.timer[i], VTY_NEWLINE);
444 vty_out(vty, " gprs nsei %u%s", bts->gprs.nse.nsei,
445 VTY_NEWLINE);
446 for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)
447 vty_out(vty, " gprs ns timer %s %u%s",
448 get_value_string(gprs_ns_timer_strs, i),
449 bts->gprs.nse.timer[i], VTY_NEWLINE);
450 for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
451 struct gsm_bts_gprs_nsvc *nsvc =
452 &bts->gprs.nsvc[i];
453 struct in_addr ia;
454
455 ia.s_addr = htonl(nsvc->remote_ip);
456 vty_out(vty, " gprs nsvc %u nsvci %u%s", i,
457 nsvc->nsvci, VTY_NEWLINE);
458 vty_out(vty, " gprs nsvc %u local udp port %u%s", i,
459 nsvc->local_port, VTY_NEWLINE);
460 vty_out(vty, " gprs nsvc %u remote udp port %u%s", i,
461 nsvc->remote_port, VTY_NEWLINE);
462 vty_out(vty, " gprs nsvc %u remote ip %s%s", i,
463 inet_ntoa(ia), VTY_NEWLINE);
464 }
465}
466
Holger Hans Peter Freyther38c56672013-09-15 17:23:34 +0200467/* Write the model data if there is one */
468static void config_write_bts_model(struct vty *vty, struct gsm_bts *bts)
Harald Welte97ceef92009-08-06 19:06:46 +0200469{
470 struct gsm_bts_trx *trx;
Holger Hans Peter Freyther38c56672013-09-15 17:23:34 +0200471
472 if (!bts->model)
473 return;
474
475 if (bts->model->config_write_bts)
476 bts->model->config_write_bts(vty, bts);
477
478 llist_for_each_entry(trx, &bts->trx_list, list)
479 config_write_trx_single(vty, trx);
480}
481
482static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
483{
Harald Welted8acf142010-07-30 11:50:09 +0200484 int i;
Harald Welte97ceef92009-08-06 19:06:46 +0200485
Harald Weltee87eb462009-08-07 13:29:14 +0200486 vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE);
487 vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200488 if (bts->description)
489 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200490 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freyther6d82b7c2009-11-19 16:38:49 +0100491 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200492 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte97ceef92009-08-06 19:06:46 +0200493 VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200494 vty_out(vty, " training_sequence_code %u%s", bts->tsc, VTY_NEWLINE);
495 vty_out(vty, " base_station_id_code %u%s", bts->bsic, VTY_NEWLINE);
Jacob Erlbeckcc0d8842013-09-17 13:59:29 +0200496 if (bts->tz.override != 0) {
497 if (bts->tz.dst)
498 vty_out(vty, " timezone %d %d %d%s",
499 bts->tz.hr, bts->tz.mn, bts->tz.dst, VTY_NEWLINE);
500 else
501 vty_out(vty, " timezone %d %d%s",
502 bts->tz.hr, bts->tz.mn, VTY_NEWLINE);
503 }
Harald Welte (local)cbd46102009-08-13 10:14:26 +0200504 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +0100505 vty_out(vty, " cell reselection hysteresis %u%s",
506 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
507 vty_out(vty, " rxlev access min %u%s",
508 bts->si_common.cell_sel_par.rxlev_acc_min, VTY_NEWLINE);
Sylvain Munaut00d71462010-11-28 18:17:28 +0100509
510 if (bts->si_common.cell_ro_sel_par.present) {
511 struct gsm48_si_selection_params *sp;
512 sp = &bts->si_common.cell_ro_sel_par;
513
514 if (sp->cbq)
515 vty_out(vty, " cell bar qualify %u%s",
516 sp->cbq, VTY_NEWLINE);
517
518 if (sp->cell_resel_off)
519 vty_out(vty, " cell reselection offset %u%s",
520 sp->cell_resel_off*2, VTY_NEWLINE);
521
522 if (sp->temp_offs == 7)
523 vty_out(vty, " temporary offset infinite%s",
524 VTY_NEWLINE);
525 else if (sp->temp_offs)
526 vty_out(vty, " temporary offset %u%s",
527 sp->temp_offs*10, VTY_NEWLINE);
528
529 if (sp->penalty_time == 31)
530 vty_out(vty, " penalty time reserved%s",
531 VTY_NEWLINE);
532 else if (sp->penalty_time)
533 vty_out(vty, " penalty time %u%s",
534 (sp->penalty_time*20)+20, VTY_NEWLINE);
535 }
536
Holger Hans Peter Freyther2fb8ebf2013-07-27 21:07:57 +0200537 /* Is periodic LU enabled or disabled? */
538 if (bts->si_common.chan_desc.t3212 == 0)
539 vty_out(vty, " no periodic location update%s", VTY_NEWLINE);
540 else
541 vty_out(vty, " periodic location update %u%s",
542 bts->si_common.chan_desc.t3212 * 6, VTY_NEWLINE);
543
Harald Welte3e774612009-08-10 13:48:16 +0200544 vty_out(vty, " channel allocator %s%s",
545 bts->chan_alloc_reverse ? "descending" : "ascending",
546 VTY_NEWLINE);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +0100547 vty_out(vty, " rach tx integer %u%s",
548 bts->si_common.rach_control.tx_integer, VTY_NEWLINE);
549 vty_out(vty, " rach max transmission %u%s",
550 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
551 VTY_NEWLINE);
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +0800552
Andreas Eversberg14e12f22012-10-13 07:27:47 +0200553 vty_out(vty, " channel-descrption attach %u%s",
554 bts->si_common.chan_desc.att, VTY_NEWLINE);
555 vty_out(vty, " channel-descrption bs-pa-mfrms %u%s",
556 bts->si_common.chan_desc.bs_pa_mfrms + 2, VTY_NEWLINE);
557 vty_out(vty, " channel-descrption bs-ag-blks-res %u%s",
558 bts->si_common.chan_desc.bs_ag_blks_res, VTY_NEWLINE);
559
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +0800560 if (bts->rach_b_thresh != -1)
561 vty_out(vty, " rach nm busy threshold %u%s",
562 bts->rach_b_thresh, VTY_NEWLINE);
563 if (bts->rach_ldavg_slots != -1)
564 vty_out(vty, " rach nm load average %u%s",
565 bts->rach_ldavg_slots, VTY_NEWLINE);
Harald Welte8c973ba2009-12-21 23:08:18 +0100566 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)e19be3f2009-08-12 13:28:23 +0200567 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +0800568 if ((bts->si_common.rach_control.t2 & 0x4) == 0)
569 vty_out(vty, " rach emergency call allowed 1%s", VTY_NEWLINE);
Ivan Kluchnikov80d58432013-09-16 13:13:04 +0400570 if ((bts->si_common.rach_control.t3) != 0)
571 for (i = 0; i < 8; i++)
572 if (bts->si_common.rach_control.t3 & (0x1 << i))
573 vty_out(vty, " rach access-control-class %d barred%s", i, VTY_NEWLINE);
574 if ((bts->si_common.rach_control.t2 & 0xfb) != 0)
575 for (i = 0; i < 8; i++)
576 if ((i != 2) && (bts->si_common.rach_control.t2 & (0x1 << i)))
577 vty_out(vty, " rach access-control-class %d barred%s", i+8, VTY_NEWLINE);
Harald Welted8acf142010-07-30 11:50:09 +0200578 for (i = SYSINFO_TYPE_1; i < _MAX_SYSINFO_TYPE; i++) {
579 if (bts->si_mode_static & (1 << i)) {
580 vty_out(vty, " system-information %s mode static%s",
581 get_value_string(osmo_sitype_strs, i), VTY_NEWLINE);
582 vty_out(vty, " system-information %s static %s%s",
583 get_value_string(osmo_sitype_strs, i),
Sylvain Munaut79eae142011-11-13 23:05:23 +0100584 osmo_hexdump_nospc(bts->si_buf[i], sizeof(bts->si_buf[i])),
Harald Welted8acf142010-07-30 11:50:09 +0200585 VTY_NEWLINE);
586 }
587 }
Harald Welte08011e22011-03-04 13:41:31 +0100588 switch (bts->type) {
589 case GSM_BTS_TYPE_NANOBTS:
Harald Welte35ac0e42012-07-02 19:51:55 +0200590 case GSM_BTS_TYPE_OSMO_SYSMO:
Harald Weltee87eb462009-08-07 13:29:14 +0200591 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Welte3ffe1b32009-08-07 00:25:23 +0200592 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte8b3c5952013-03-12 13:57:05 +0100593 if (bts->ip_access.rsl_ip) {
594 struct in_addr ia;
595 ia.s_addr = htonl(bts->ip_access.rsl_ip);
596 vty_out(vty, " ip.access rsl-ip %s%s", inet_ntoa(ia),
597 VTY_NEWLINE);
598 }
Pablo Neira Ayuso42e41df2011-08-17 22:44:07 +0200599 vty_out(vty, " oml ip.access stream_id %u line %u%s",
600 bts->oml_tei, bts->oml_e1_link.e1_nr, VTY_NEWLINE);
Harald Welte08011e22011-03-04 13:41:31 +0100601 break;
Sylvain Munautcb8e8432011-10-17 14:04:55 +0200602 case GSM_BTS_TYPE_NOKIA_SITE:
603 vty_out(vty, " nokia_site skip-reset %d%s", bts->nokia.skip_reset, VTY_NEWLINE);
Andreas Eversbergac27b952013-12-05 13:25:06 +0100604 vty_out(vty, " nokia_site no-local-rel-conf %d%s",
605 bts->nokia.no_loc_rel_cnf, VTY_NEWLINE);
Andreas Eversbergc3daa0f2013-12-05 16:02:37 +0100606 /* fall through: Nokia requires "oml e1" parameters also */
Harald Welte08011e22011-03-04 13:41:31 +0100607 default:
Harald Welte62868882009-08-08 16:12:58 +0200608 config_write_e1_link(vty, &bts->oml_e1_link, " oml ");
609 vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE);
Harald Welte08011e22011-03-04 13:41:31 +0100610 break;
Harald Welte62868882009-08-08 16:12:58 +0200611 }
Holger Hans Peter Freyther3112f672010-09-06 10:11:25 +0800612
613 /* if we have a limit, write it */
614 if (bts->paging.free_chans_need >= 0)
615 vty_out(vty, " paging free %d%s", bts->paging.free_chans_need, VTY_NEWLINE);
616
Harald Welteca46eff2011-01-11 23:44:56 +0100617 vty_out(vty, " neighbor-list mode %s%s",
Harald Weltef989b782011-02-15 11:43:27 +0100618 get_value_string(bts_neigh_mode_strs, bts->neigh_list_manual_mode), VTY_NEWLINE);
619 if (bts->neigh_list_manual_mode != NL_MODE_AUTOMATIC) {
Harald Welteca46eff2011-01-11 23:44:56 +0100620 for (i = 0; i < 1024; i++) {
621 if (bitvec_get_bit_pos(&bts->si_common.neigh_list, i))
622 vty_out(vty, " neighbor-list add arfcn %u%s",
623 i, VTY_NEWLINE);
624 }
625 }
Harald Weltef989b782011-02-15 11:43:27 +0100626 if (bts->neigh_list_manual_mode == NL_MODE_MANUAL_SI5SEP) {
627 for (i = 0; i < 1024; i++) {
628 if (bitvec_get_bit_pos(&bts->si_common.si5_neigh_list, i))
629 vty_out(vty, " si5 neighbor-list add arfcn %u%s",
630 i, VTY_NEWLINE);
631 }
632 }
Harald Welteca46eff2011-01-11 23:44:56 +0100633
Andreas Eversberg976493b2013-12-07 18:32:28 +0100634 vty_out(vty, " codec-support fr");
635 if (bts->codec.hr)
636 vty_out(vty, " hr");
637 if (bts->codec.efr)
638 vty_out(vty, " efr");
639 if (bts->codec.amr)
640 vty_out(vty, " amr");
641 vty_out(vty, "%s", VTY_NEWLINE);
642
Harald Weltea9251762010-05-11 23:50:21 +0200643 config_write_bts_gprs(vty, bts);
Harald Welte97ceef92009-08-06 19:06:46 +0200644
Holger Hans Peter Freyther10799162012-07-20 10:27:31 +0200645 if (bts->excl_from_rf_lock)
646 vty_out(vty, " rf-lock-exclude%s", VTY_NEWLINE);
647
Jacob Erlbeck8f8e5bf2014-01-16 11:02:14 +0100648 vty_out(vty, " %sforce-combined-si%s",
649 bts->force_combined_si ? "" : "no ", VTY_NEWLINE);
650
Holger Hans Peter Freyther38c56672013-09-15 17:23:34 +0200651 config_write_bts_model(vty, bts);
Harald Welte97ceef92009-08-06 19:06:46 +0200652}
653
654static int config_write_bts(struct vty *v)
655{
Harald Welte40152872010-05-16 20:52:23 +0200656 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte97ceef92009-08-06 19:06:46 +0200657 struct gsm_bts *bts;
658
659 llist_for_each_entry(bts, &gsmnet->bts_list, list)
660 config_write_bts_single(v, bts);
661
662 return CMD_SUCCESS;
663}
664
Harald Weltee87eb462009-08-07 13:29:14 +0200665static int config_write_net(struct vty *vty)
666{
Harald Welte40152872010-05-16 20:52:23 +0200667 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
668
Harald Weltee87eb462009-08-07 13:29:14 +0200669 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200670 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200671 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200672 vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE);
673 vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +0200674 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Harald Welte59936d72009-11-18 20:33:19 +0100675 vty_out(vty, " location updating reject cause %u%s",
676 gsmnet->reject_cause, VTY_NEWLINE);
Harald Weltecca253a2009-08-30 15:47:06 +0900677 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freyther6b4f5462009-11-19 16:37:48 +0100678 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +0800679 vty_out(vty, " paging any use tch %d%s", gsmnet->pag_any_tch, VTY_NEWLINE);
Harald Welte52af1952009-12-13 10:53:12 +0100680 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
681 VTY_NEWLINE);
Harald Weltea310f3e2009-12-14 09:00:24 +0100682 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Welte0af9c9f2009-12-19 21:41:52 +0100683 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Weltea8062f12009-12-21 16:51:50 +0100684 vty_out(vty, " handover window rxlev averaging %u%s",
685 gsmnet->handover.win_rxlev_avg, VTY_NEWLINE);
686 vty_out(vty, " handover window rxqual averaging %u%s",
687 gsmnet->handover.win_rxqual_avg, VTY_NEWLINE);
688 vty_out(vty, " handover window rxlev neighbor averaging %u%s",
689 gsmnet->handover.win_rxlev_avg_neigh, VTY_NEWLINE);
690 vty_out(vty, " handover power budget interval %u%s",
691 gsmnet->handover.pwr_interval, VTY_NEWLINE);
692 vty_out(vty, " handover power budget hysteresis %u%s",
693 gsmnet->handover.pwr_hysteresis, VTY_NEWLINE);
694 vty_out(vty, " handover maximum distance %u%s",
695 gsmnet->handover.max_distance, VTY_NEWLINE);
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +0100696 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +0100697 vty_out(vty, " timer t3103 %u%s", gsmnet->T3103, VTY_NEWLINE);
698 vty_out(vty, " timer t3105 %u%s", gsmnet->T3105, VTY_NEWLINE);
699 vty_out(vty, " timer t3107 %u%s", gsmnet->T3107, VTY_NEWLINE);
700 vty_out(vty, " timer t3109 %u%s", gsmnet->T3109, VTY_NEWLINE);
701 vty_out(vty, " timer t3111 %u%s", gsmnet->T3111, VTY_NEWLINE);
702 vty_out(vty, " timer t3113 %u%s", gsmnet->T3113, VTY_NEWLINE);
703 vty_out(vty, " timer t3115 %u%s", gsmnet->T3115, VTY_NEWLINE);
704 vty_out(vty, " timer t3117 %u%s", gsmnet->T3117, VTY_NEWLINE);
705 vty_out(vty, " timer t3119 %u%s", gsmnet->T3119, VTY_NEWLINE);
Harald Weltea00fdd72010-12-23 14:39:29 +0100706 vty_out(vty, " timer t3122 %u%s", gsmnet->T3122, VTY_NEWLINE);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +0100707 vty_out(vty, " timer t3141 %u%s", gsmnet->T3141, VTY_NEWLINE);
Harald Weltef41bfd52010-12-15 15:34:23 +0100708 vty_out(vty, " dtx-used %u%s", gsmnet->dtx_enabled, VTY_NEWLINE);
Holger Hans Peter Freyther68b21e12010-12-22 16:26:04 +0100709 vty_out(vty, " subscriber-keep-in-ram %d%s",
710 gsmnet->keep_subscr, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200711
712 return CMD_SUCCESS;
713}
Harald Welte97ceef92009-08-06 19:06:46 +0200714
Harald Welte59b04682009-06-10 05:40:52 +0800715static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx)
716{
717 vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
718 trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200719 vty_out(vty, "Description: %s%s",
720 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Welte91afe4c2009-06-20 18:15:19 +0200721 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte62868882009-08-08 16:12:58 +0200722 "resulting BS power: %d dBm%s",
Harald Welte91afe4c2009-06-20 18:15:19 +0200723 trx->nominal_power, trx->max_power_red,
Harald Welte62868882009-08-08 16:12:58 +0200724 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800725 vty_out(vty, " NM State: ");
Harald Welte69f6f812011-05-30 12:07:53 +0200726 net_dump_nmstate(vty, &trx->mo.nm_state);
Harald Welte59b04682009-06-10 05:40:52 +0800727 vty_out(vty, " Baseband Transceiver NM State: ");
Harald Welte69f6f812011-05-30 12:07:53 +0200728 net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);
Harald Welte25572872009-10-20 00:22:00 +0200729 if (is_ipaccess_bts(trx->bts)) {
730 vty_out(vty, " ip.access stream ID: 0x%02x%s",
731 trx->rsl_tei, VTY_NEWLINE);
732 } else {
733 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
734 e1isl_dump_vty(vty, trx->rsl_link);
735 }
Harald Welte59b04682009-06-10 05:40:52 +0800736}
737
738DEFUN(show_trx,
739 show_trx_cmd,
Sylvain Munaut1ad96282012-12-28 12:15:11 +0100740 "show trx [<0-255>] [<0-255>]",
Harald Welte9e002452010-05-11 21:53:49 +0200741 SHOW_STR "Display information about a TRX\n"
742 "BTS Number\n"
743 "TRX Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800744{
Harald Welte40152872010-05-16 20:52:23 +0200745 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800746 struct gsm_bts *bts = NULL;
747 struct gsm_bts_trx *trx;
748 int bts_nr, trx_nr;
749
750 if (argc >= 1) {
751 /* use the BTS number that the user has specified */
752 bts_nr = atoi(argv[0]);
753 if (bts_nr >= net->num_bts) {
754 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
755 VTY_NEWLINE);
756 return CMD_WARNING;
757 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200758 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800759 }
760 if (argc >= 2) {
761 trx_nr = atoi(argv[1]);
762 if (trx_nr >= bts->num_trx) {
763 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
764 VTY_NEWLINE);
765 return CMD_WARNING;
766 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200767 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800768 trx_dump_vty(vty, trx);
769 return CMD_SUCCESS;
770 }
771 if (bts) {
772 /* print all TRX in this BTS */
773 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200774 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800775 trx_dump_vty(vty, trx);
776 }
777 return CMD_SUCCESS;
778 }
779
780 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200781 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800782 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200783 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800784 trx_dump_vty(vty, trx);
785 }
786 }
787
788 return CMD_SUCCESS;
789}
790
Harald Welte97ceef92009-08-06 19:06:46 +0200791
Harald Welte59b04682009-06-10 05:40:52 +0800792static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
793{
Harald Welte85771a42011-05-30 12:09:13 +0200794 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, phys cfg %s, TSC %u",
Harald Weltee3bd0c02010-12-24 12:12:10 +0100795 ts->trx->bts->nr, ts->trx->nr, ts->nr,
Harald Welted1dcdb82013-03-08 07:44:45 +0000796 gsm_pchan_name(ts->pchan),
797 ts->tsc == -1 ? ts->trx->bts->tsc : ts->tsc);
Harald Welte98d2bb82010-12-24 12:14:52 +0100798 if (ts->pchan == GSM_PCHAN_TCH_F_PDCH)
Harald Welte81c2ed32010-12-24 12:26:13 +0100799 vty_out(vty, " (%s mode)",
Harald Welte98d2bb82010-12-24 12:14:52 +0100800 ts->flags & TS_F_PDCH_MODE ? "PDCH" : "TCH/F");
801 vty_out(vty, "%s", VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800802 vty_out(vty, " NM State: ");
Harald Welte69f6f812011-05-30 12:07:53 +0200803 net_dump_nmstate(vty, &ts->mo.nm_state);
Harald Welte87504212009-12-02 01:56:49 +0530804 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welte59b04682009-06-10 05:40:52 +0800805 vty_out(vty, " E1 Line %u, Timeslot %u, Subslot %u%s",
806 ts->e1_link.e1_nr, ts->e1_link.e1_ts,
807 ts->e1_link.e1_ts_ss, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800808}
809
810DEFUN(show_ts,
811 show_ts_cmd,
Sylvain Munaut1ad96282012-12-28 12:15:11 +0100812 "show timeslot [<0-255>] [<0-255>] [<0-7>]",
Harald Welte9e002452010-05-11 21:53:49 +0200813 SHOW_STR "Display information about a TS\n"
814 "BTS Number\n" "TRX Number\n" "Timeslot Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800815{
Harald Welte40152872010-05-16 20:52:23 +0200816 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte06868382010-12-24 12:05:03 +0100817 struct gsm_bts *bts = NULL;
818 struct gsm_bts_trx *trx = NULL;
819 struct gsm_bts_trx_ts *ts = NULL;
Harald Welte59b04682009-06-10 05:40:52 +0800820 int bts_nr, trx_nr, ts_nr;
821
822 if (argc >= 1) {
823 /* use the BTS number that the user has specified */
824 bts_nr = atoi(argv[0]);
825 if (bts_nr >= net->num_bts) {
826 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
827 VTY_NEWLINE);
828 return CMD_WARNING;
829 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200830 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800831 }
832 if (argc >= 2) {
833 trx_nr = atoi(argv[1]);
834 if (trx_nr >= bts->num_trx) {
835 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
836 VTY_NEWLINE);
837 return CMD_WARNING;
838 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200839 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800840 }
841 if (argc >= 3) {
842 ts_nr = atoi(argv[2]);
843 if (ts_nr >= TRX_NR_TS) {
844 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
845 VTY_NEWLINE);
846 return CMD_WARNING;
847 }
Harald Welte06868382010-12-24 12:05:03 +0100848 /* Fully Specified: print and exit */
Harald Welte59b04682009-06-10 05:40:52 +0800849 ts = &trx->ts[ts_nr];
850 ts_dump_vty(vty, ts);
851 return CMD_SUCCESS;
852 }
Harald Welte06868382010-12-24 12:05:03 +0100853
854 if (bts && trx) {
855 /* Iterate over all TS in this TRX */
856 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
857 ts = &trx->ts[ts_nr];
858 ts_dump_vty(vty, ts);
859 }
860 } else if (bts) {
861 /* Iterate over all TRX in this BTS, TS in each TRX */
Harald Welte59b04682009-06-10 05:40:52 +0800862 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200863 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800864 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
865 ts = &trx->ts[ts_nr];
866 ts_dump_vty(vty, ts);
867 }
868 }
Harald Welte06868382010-12-24 12:05:03 +0100869 } else {
870 /* Iterate over all BTS, TRX in each BTS, TS in each TRX */
871 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
872 bts = gsm_bts_num(net, bts_nr);
873 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
874 trx = gsm_bts_trx_num(bts, trx_nr);
875 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
876 ts = &trx->ts[ts_nr];
877 ts_dump_vty(vty, ts);
878 }
879 }
880 }
Harald Welte59b04682009-06-10 05:40:52 +0800881 }
882
883 return CMD_SUCCESS;
884}
885
Holger Hans Peter Freyther1dd0a1b2010-01-06 06:00:40 +0100886static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte59b04682009-06-10 05:40:52 +0800887{
Harald Welte91afe4c2009-06-20 18:15:19 +0200888 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte59b04682009-06-10 05:40:52 +0800889 subscr->authorized, VTY_NEWLINE);
Holger Hans Peter Freyther7d552fc2013-12-12 15:45:41 +0100890 if (strlen(subscr->name))
Harald Welte59b04682009-06-10 05:40:52 +0800891 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
892 if (subscr->extension)
893 vty_out(vty, " Extension: %s%s", subscr->extension,
894 VTY_NEWLINE);
Holger Hans Peter Freytherb0be39b2013-07-14 08:38:24 +0200895 vty_out(vty, " IMSI: %s%s", subscr->imsi, VTY_NEWLINE);
Holger Hans Peter Freythercd8bacf2009-08-19 12:53:57 +0200896 if (subscr->tmsi != GSM_RESERVED_TMSI)
897 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte270c06c2009-08-15 03:24:51 +0200898 VTY_NEWLINE);
Sylvain Munaute5863a22009-12-27 19:29:28 +0100899
Harald Welte (local)02d5efa2009-08-14 20:27:16 +0200900 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800901}
902
Harald Welte44007742009-12-22 21:43:14 +0100903static void meas_rep_dump_uni_vty(struct vty *vty,
904 struct gsm_meas_rep_unidir *mru,
905 const char *prefix,
906 const char *dir)
907{
908 vty_out(vty, "%s RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",
909 prefix, dir, rxlev2dbm(mru->full.rx_lev),
910 dir, rxlev2dbm(mru->sub.rx_lev));
911 vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",
912 dir, mru->full.rx_qual, dir, mru->sub.rx_qual,
913 VTY_NEWLINE);
914}
915
916static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,
917 const char *prefix)
918{
919 vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);
920 vty_out(vty, "%s Flags: %s%s%s%s%s", prefix,
921 mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",
922 mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",
923 mr->flags & MEAS_REP_F_FPC ? "FPC " : "",
924 mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",
925 VTY_NEWLINE);
926 if (mr->flags & MEAS_REP_F_MS_TO)
927 vty_out(vty, "%s MS Timing Offset: %u%s", prefix,
928 mr->ms_timing_offset, VTY_NEWLINE);
929 if (mr->flags & MEAS_REP_F_MS_L1)
930 vty_out(vty, "%s L1 MS Power: %u dBm, Timing Advance: %u%s",
931 prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);
932 if (mr->flags & MEAS_REP_F_DL_VALID)
933 meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");
934 meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");
935}
936
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +0800937static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte59b04682009-06-10 05:40:52 +0800938{
Harald Welte44007742009-12-22 21:43:14 +0100939 int idx;
940
Harald Weltef62dad62010-12-24 12:22:34 +0100941 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",
942 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
943 lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);
Holger Hans Peter Freyther6e5c50f2010-06-28 17:09:29 +0800944 vty_out(vty, " Connection: %u, State: %s%s",
945 lchan->conn ? 1: 0,
Harald Welteab2534c2009-12-29 10:52:38 +0100946 gsm_lchans_name(lchan->state), VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +0100947 vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s",
948 lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
949 - lchan->bs_power*2,
950 ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),
951 VTY_NEWLINE);
Holger Hans Peter Freyther1a95fa82010-06-28 15:47:12 +0800952 if (lchan->conn && lchan->conn->subscr) {
Harald Welte59b04682009-06-10 05:40:52 +0800953 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther1a95fa82010-06-28 15:47:12 +0800954 subscr_dump_vty(vty, lchan->conn->subscr);
Harald Welte59b04682009-06-10 05:40:52 +0800955 } else
956 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte87504212009-12-02 01:56:49 +0530957 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
958 struct in_addr ia;
Holger Hans Peter Freythercec1ec52010-04-07 15:39:16 +0200959 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte87504212009-12-02 01:56:49 +0530960 vty_out(vty, " Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",
961 inet_ntoa(ia), lchan->abis_ip.bound_port,
962 lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,
963 VTY_NEWLINE);
964 }
Harald Welte44007742009-12-22 21:43:14 +0100965
966 /* we want to report the last measurement report */
967 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
968 lchan->meas_rep_idx, 1);
969 meas_rep_dump_vty(vty, &lchan->meas_rep[idx], " ");
Harald Welte59b04682009-06-10 05:40:52 +0800970}
971
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +0800972static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
973{
Holger Hans Peter Freythercf13a922010-05-14 01:57:02 +0800974 struct gsm_meas_rep *mr;
975 int idx;
976
977 /* we want to report the last measurement report */
978 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
979 lchan->meas_rep_idx, 1);
980 mr = &lchan->meas_rep[idx];
981
Harald Weltef62dad62010-12-24 12:22:34 +0100982 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u, Type %s - "
983 "L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
984 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
Harald Welte81c2ed32010-12-24 12:26:13 +0100985 lchan->nr, gsm_lchant_name(lchan->type), mr->ms_l1.pwr,
Holger Hans Peter Freythercf13a922010-05-14 01:57:02 +0800986 rxlev2dbm(mr->dl.full.rx_lev),
987 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +0800988 VTY_NEWLINE);
989}
990
Holger Hans Peter Freyther86bbcbd2011-12-27 16:34:12 +0100991
992static int dump_lchan_trx_ts(struct gsm_bts_trx_ts *ts, struct vty *vty,
993 void (*dump_cb)(struct vty *, struct gsm_lchan *))
994{
995 int lchan_nr;
996 for (lchan_nr = 0; lchan_nr < TS_MAX_LCHAN; lchan_nr++) {
997 struct gsm_lchan *lchan = &ts->lchan[lchan_nr];
998 if ((lchan->type == GSM_LCHAN_NONE) && (lchan->state == LCHAN_S_NONE))
999 continue;
1000 dump_cb(vty, lchan);
1001 }
1002
1003 return CMD_SUCCESS;
1004}
1005
1006static int dump_lchan_trx(struct gsm_bts_trx *trx, struct vty *vty,
1007 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1008{
1009 int ts_nr;
1010
1011 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
1012 struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
1013 dump_lchan_trx_ts(ts, vty, dump_cb);
1014 }
1015
1016 return CMD_SUCCESS;
1017}
1018
1019static int dump_lchan_bts(struct gsm_bts *bts, struct vty *vty,
1020 void (*dump_cb)(struct vty *, struct gsm_lchan *))
1021{
1022 int trx_nr;
1023
1024 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
1025 struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, trx_nr);
1026 dump_lchan_trx(trx, vty, dump_cb);
1027 }
1028
1029 return CMD_SUCCESS;
1030}
1031
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +08001032static int lchan_summary(struct vty *vty, int argc, const char **argv,
1033 void (*dump_cb)(struct vty *, struct gsm_lchan *))
Harald Welte59b04682009-06-10 05:40:52 +08001034{
Harald Welte40152872010-05-16 20:52:23 +02001035 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +08001036 struct gsm_bts *bts;
1037 struct gsm_bts_trx *trx;
1038 struct gsm_bts_trx_ts *ts;
1039 struct gsm_lchan *lchan;
1040 int bts_nr, trx_nr, ts_nr, lchan_nr;
1041
1042 if (argc >= 1) {
1043 /* use the BTS number that the user has specified */
1044 bts_nr = atoi(argv[0]);
1045 if (bts_nr >= net->num_bts) {
1046 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1047 VTY_NEWLINE);
1048 return CMD_WARNING;
1049 }
Harald Weltee712a5f2009-06-21 16:17:15 +02001050 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther86bbcbd2011-12-27 16:34:12 +01001051
1052 if (argc == 1)
1053 return dump_lchan_bts(bts, vty, dump_cb);
Harald Welte59b04682009-06-10 05:40:52 +08001054 }
1055 if (argc >= 2) {
1056 trx_nr = atoi(argv[1]);
1057 if (trx_nr >= bts->num_trx) {
1058 vty_out(vty, "%% can't find TRX %s%s", argv[1],
1059 VTY_NEWLINE);
1060 return CMD_WARNING;
1061 }
Harald Weltee712a5f2009-06-21 16:17:15 +02001062 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther86bbcbd2011-12-27 16:34:12 +01001063
1064 if (argc == 2)
1065 return dump_lchan_trx(trx, vty, dump_cb);
Harald Welte59b04682009-06-10 05:40:52 +08001066 }
1067 if (argc >= 3) {
1068 ts_nr = atoi(argv[2]);
1069 if (ts_nr >= TRX_NR_TS) {
1070 vty_out(vty, "%% can't find TS %s%s", argv[2],
1071 VTY_NEWLINE);
1072 return CMD_WARNING;
1073 }
1074 ts = &trx->ts[ts_nr];
Holger Hans Peter Freyther86bbcbd2011-12-27 16:34:12 +01001075
1076 if (argc == 3)
1077 return dump_lchan_trx_ts(ts, vty, dump_cb);
Harald Welte59b04682009-06-10 05:40:52 +08001078 }
1079 if (argc >= 4) {
1080 lchan_nr = atoi(argv[3]);
1081 if (lchan_nr >= TS_MAX_LCHAN) {
1082 vty_out(vty, "%% can't find LCHAN %s%s", argv[3],
1083 VTY_NEWLINE);
1084 return CMD_WARNING;
1085 }
1086 lchan = &ts->lchan[lchan_nr];
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +08001087 dump_cb(vty, lchan);
Harald Welte59b04682009-06-10 05:40:52 +08001088 return CMD_SUCCESS;
1089 }
Holger Hans Peter Freyther86bbcbd2011-12-27 16:34:12 +01001090
1091
Harald Welte59b04682009-06-10 05:40:52 +08001092 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +02001093 bts = gsm_bts_num(net, bts_nr);
Holger Hans Peter Freyther86bbcbd2011-12-27 16:34:12 +01001094 dump_lchan_bts(bts, vty, dump_cb);
Harald Welte59b04682009-06-10 05:40:52 +08001095 }
1096
1097 return CMD_SUCCESS;
1098}
1099
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +08001100
1101DEFUN(show_lchan,
1102 show_lchan_cmd,
Sylvain Munaut1ad96282012-12-28 12:15:11 +01001103 "show lchan [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +08001104 SHOW_STR "Display information about a logical channel\n"
1105 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001106 LCHAN_NR_STR)
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +08001107
1108{
1109 return lchan_summary(vty, argc, argv, lchan_dump_full_vty);
1110}
1111
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08001112DEFUN(show_lchan_summary,
1113 show_lchan_summary_cmd,
Sylvain Munaut1ad96282012-12-28 12:15:11 +01001114 "show lchan summary [<0-255>] [<0-255>] [<0-7>] [lchan_nr]",
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08001115 SHOW_STR "Display information about a logical channel\n"
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001116 "Short summary\n"
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08001117 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001118 LCHAN_NR_STR)
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08001119{
1120 return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
1121}
1122
Harald Welte59b04682009-06-10 05:40:52 +08001123static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
1124{
1125 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
1126 subscr_dump_vty(vty, pag->subscr);
1127}
1128
1129static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
1130{
1131 struct gsm_paging_request *pag;
1132
Holger Hans Peter Freyther9372d9c2013-03-03 11:03:17 +01001133 if (!bts->paging.bts)
1134 return;
1135
Harald Welte59b04682009-06-10 05:40:52 +08001136 llist_for_each_entry(pag, &bts->paging.pending_requests, entry)
1137 paging_dump_vty(vty, pag);
1138}
1139
1140DEFUN(show_paging,
1141 show_paging_cmd,
Sylvain Munaut1ad96282012-12-28 12:15:11 +01001142 "show paging [<0-255>]",
Harald Welte9e002452010-05-11 21:53:49 +02001143 SHOW_STR "Display information about paging reuqests of a BTS\n"
1144 "BTS Number\n")
Harald Welte59b04682009-06-10 05:40:52 +08001145{
Harald Welte40152872010-05-16 20:52:23 +02001146 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +08001147 struct gsm_bts *bts;
1148 int bts_nr;
1149
1150 if (argc >= 1) {
1151 /* use the BTS number that the user has specified */
1152 bts_nr = atoi(argv[0]);
1153 if (bts_nr >= net->num_bts) {
1154 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1155 VTY_NEWLINE);
1156 return CMD_WARNING;
1157 }
Harald Weltee712a5f2009-06-21 16:17:15 +02001158 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +08001159 bts_paging_dump_vty(vty, bts);
1160
1161 return CMD_SUCCESS;
1162 }
1163 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +02001164 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +08001165 bts_paging_dump_vty(vty, bts);
1166 }
1167
1168 return CMD_SUCCESS;
1169}
1170
Holger Hans Peter Freyther35e6fbb2013-02-05 09:39:09 +01001171DEFUN(show_paging_group,
1172 show_paging_group_cmd,
1173 "show paging-group <0-255> IMSI",
1174 SHOW_STR "Display the paging group\n"
1175 "BTS Number\n" "IMSI\n")
1176{
1177 struct gsm_network *net = gsmnet_from_vty(vty);
1178 struct gsm_bts *bts;
1179 unsigned int page_group;
1180 int bts_nr = atoi(argv[0]);
1181
1182 if (bts_nr >= net->num_bts) {
1183 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1184 return CMD_WARNING;
1185 }
1186
1187 bts = gsm_bts_num(net, bts_nr);
1188 if (!bts) {
1189 vty_out(vty, "%% can't find BTS %s%s", argv[0], VTY_NEWLINE);
1190 return CMD_WARNING;
1191 }
1192
1193 page_group = gsm0502_calc_paging_group(&bts->si_common.chan_desc,
1194 str_to_imsi(argv[1]));
1195 vty_out(vty, "%%Paging group for IMSI %" PRIu64 " on BTS #%d is %u%s",
1196 str_to_imsi(argv[1]), bts->nr,
1197 page_group, VTY_NEWLINE);
1198 return CMD_SUCCESS;
1199}
1200
Harald Weltee87eb462009-08-07 13:29:14 +02001201DEFUN(cfg_net,
1202 cfg_net_cmd,
Harald Welte9e002452010-05-11 21:53:49 +02001203 "network", NETWORK_STR)
Harald Weltee87eb462009-08-07 13:29:14 +02001204{
Harald Welte40152872010-05-16 20:52:23 +02001205 vty->index = gsmnet_from_vty(vty);
Harald Weltee87eb462009-08-07 13:29:14 +02001206 vty->node = GSMNET_NODE;
1207
1208 return CMD_SUCCESS;
1209}
1210
Harald Weltee87eb462009-08-07 13:29:14 +02001211DEFUN(cfg_net_ncc,
1212 cfg_net_ncc_cmd,
1213 "network country code <1-999>",
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001214 "Set the GSM network country code\n"
1215 "Country commands\n"
1216 CODE_CMD_STR
1217 "Network Country Code to use\n")
Harald Weltee87eb462009-08-07 13:29:14 +02001218{
Harald Welte40152872010-05-16 20:52:23 +02001219 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1220
Harald Weltee87eb462009-08-07 13:29:14 +02001221 gsmnet->country_code = atoi(argv[0]);
1222
1223 return CMD_SUCCESS;
1224}
1225
1226DEFUN(cfg_net_mnc,
1227 cfg_net_mnc_cmd,
Dieter Spaarf1295252011-07-27 23:43:56 +02001228 "mobile network code <0-999>",
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001229 "Set the GSM mobile network code\n"
1230 "Network Commands\n"
1231 CODE_CMD_STR
1232 "Mobile Network Code to use\n")
Harald Weltee87eb462009-08-07 13:29:14 +02001233{
Harald Welte40152872010-05-16 20:52:23 +02001234 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1235
Harald Weltee87eb462009-08-07 13:29:14 +02001236 gsmnet->network_code = atoi(argv[0]);
1237
1238 return CMD_SUCCESS;
1239}
1240
1241DEFUN(cfg_net_name_short,
1242 cfg_net_name_short_cmd,
1243 "short name NAME",
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001244 "Set the short GSM network name\n" NAME_CMD_STR NAME_STR)
Harald Weltee87eb462009-08-07 13:29:14 +02001245{
Harald Welte40152872010-05-16 20:52:23 +02001246 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1247
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +02001248 bsc_replace_string(gsmnet, &gsmnet->name_short, argv[0]);
Harald Weltee87eb462009-08-07 13:29:14 +02001249 return CMD_SUCCESS;
1250}
1251
1252DEFUN(cfg_net_name_long,
1253 cfg_net_name_long_cmd,
1254 "long name NAME",
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001255 "Set the long GSM network name\n" NAME_CMD_STR NAME_STR)
Harald Weltee87eb462009-08-07 13:29:14 +02001256{
Harald Welte40152872010-05-16 20:52:23 +02001257 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1258
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +02001259 bsc_replace_string(gsmnet, &gsmnet->name_long, argv[0]);
Harald Weltee87eb462009-08-07 13:29:14 +02001260 return CMD_SUCCESS;
1261}
Harald Welte59b04682009-06-10 05:40:52 +08001262
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02001263DEFUN(cfg_net_auth_policy,
1264 cfg_net_auth_policy_cmd,
1265 "auth policy (closed|accept-all|token)",
Harald Welte9e002452010-05-11 21:53:49 +02001266 "Authentication (not cryptographic)\n"
1267 "Set the GSM network authentication policy\n"
1268 "Require the MS to be activated in HLR\n"
1269 "Accept all MS, whether in HLR or not\n"
1270 "Use SMS-token based authentication\n")
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02001271{
1272 enum gsm_auth_policy policy = gsm_auth_policy_parse(argv[0]);
Harald Welte40152872010-05-16 20:52:23 +02001273 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02001274
1275 gsmnet->auth_policy = policy;
1276
1277 return CMD_SUCCESS;
1278}
1279
Harald Welte59936d72009-11-18 20:33:19 +01001280DEFUN(cfg_net_reject_cause,
1281 cfg_net_reject_cause_cmd,
1282 "location updating reject cause <2-111>",
Harald Welte557f3992012-08-16 23:23:50 +02001283 "Set the reject cause of location updating reject\n"
1284 "Set the reject cause of location updating reject\n"
1285 "Set the reject cause of location updating reject\n"
1286 "Set the reject cause of location updating reject\n"
1287 "Cause Value as Per GSM TS 04.08\n")
Harald Welte59936d72009-11-18 20:33:19 +01001288{
Harald Welte40152872010-05-16 20:52:23 +02001289 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1290
Harald Welte59936d72009-11-18 20:33:19 +01001291 gsmnet->reject_cause = atoi(argv[0]);
1292
1293 return CMD_SUCCESS;
1294}
1295
Harald Weltecca253a2009-08-30 15:47:06 +09001296DEFUN(cfg_net_encryption,
1297 cfg_net_encryption_cmd,
Harald Welte55ff9362012-07-04 21:37:56 +02001298 "encryption a5 (0|1|2|3)",
Harald Welte18ce31c2010-05-14 20:05:17 +02001299 "Encryption options\n"
1300 "A5 encryption\n" "A5/0: No encryption\n"
Harald Welte55ff9362012-07-04 21:37:56 +02001301 "A5/1: Encryption\n" "A5/2: Export-grade Encryption\n"
1302 "A5/3: 'New' Secure Encryption\n")
Harald Weltecca253a2009-08-30 15:47:06 +09001303{
Harald Welte40152872010-05-16 20:52:23 +02001304 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1305
Andreas.Eversberg53293292009-11-17 09:55:26 +01001306 gsmnet->a5_encryption= atoi(argv[0]);
Harald Weltecca253a2009-08-30 15:47:06 +09001307
1308 return CMD_SUCCESS;
1309}
1310
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001311DEFUN(cfg_net_neci,
1312 cfg_net_neci_cmd,
1313 "neci (0|1)",
Harald Welte18ce31c2010-05-14 20:05:17 +02001314 "New Establish Cause Indication\n"
1315 "Don't set the NECI bit\n" "Set the NECI bit\n")
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001316{
Harald Welte40152872010-05-16 20:52:23 +02001317 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1318
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001319 gsmnet->neci = atoi(argv[0]);
Holger Hans Peter Freytherf0f37f12010-09-06 09:36:02 +08001320 gsm_net_update_ctype(gsmnet);
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001321 return CMD_SUCCESS;
1322}
1323
Harald Welte52af1952009-12-13 10:53:12 +01001324DEFUN(cfg_net_rrlp_mode, cfg_net_rrlp_mode_cmd,
1325 "rrlp mode (none|ms-based|ms-preferred|ass-preferred)",
Harald Welte9e002452010-05-11 21:53:49 +02001326 "Radio Resource Location Protocol\n"
1327 "Set the Radio Resource Location Protocol Mode\n"
1328 "Don't send RRLP request\n"
1329 "Request MS-based location\n"
1330 "Request any location, prefer MS-based\n"
1331 "Request any location, prefer MS-assisted\n")
Harald Welte52af1952009-12-13 10:53:12 +01001332{
Harald Welte40152872010-05-16 20:52:23 +02001333 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1334
Harald Welte52af1952009-12-13 10:53:12 +01001335 gsmnet->rrlp.mode = rrlp_mode_parse(argv[0]);
1336
1337 return CMD_SUCCESS;
1338}
1339
Harald Weltea310f3e2009-12-14 09:00:24 +01001340DEFUN(cfg_net_mm_info, cfg_net_mm_info_cmd,
1341 "mm info (0|1)",
Holger Hans Peter Freyther29844222012-07-21 00:27:10 +02001342 "Mobility Management\n"
1343 "Send MM INFO after LOC UPD ACCEPT\n"
1344 "Disable\n" "Enable\n")
Harald Weltea310f3e2009-12-14 09:00:24 +01001345{
Harald Welte40152872010-05-16 20:52:23 +02001346 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1347
Harald Weltea310f3e2009-12-14 09:00:24 +01001348 gsmnet->send_mm_info = atoi(argv[0]);
1349
1350 return CMD_SUCCESS;
1351}
1352
Harald Welte9e002452010-05-11 21:53:49 +02001353#define HANDOVER_STR "Handover Options\n"
1354
Harald Welte0af9c9f2009-12-19 21:41:52 +01001355DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1356 "handover (0|1)",
Harald Welte9e002452010-05-11 21:53:49 +02001357 HANDOVER_STR
1358 "Don't perform in-call handover\n"
1359 "Perform in-call handover\n")
Harald Welte0af9c9f2009-12-19 21:41:52 +01001360{
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001361 int enable = atoi(argv[0]);
Harald Welte40152872010-05-16 20:52:23 +02001362 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001363
1364 if (enable && ipacc_rtp_direct) {
Harald Welteaa2c3032009-12-20 13:51:01 +01001365 vty_out(vty, "%% Cannot enable handover unless RTP Proxy mode "
1366 "is enabled by using the -P command line option%s",
1367 VTY_NEWLINE);
1368 return CMD_WARNING;
1369 }
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001370 gsmnet->handover.active = enable;
Harald Welte0af9c9f2009-12-19 21:41:52 +01001371
1372 return CMD_SUCCESS;
1373}
1374
Harald Welte9e002452010-05-11 21:53:49 +02001375#define HO_WIN_STR HANDOVER_STR "Measurement Window\n"
1376#define HO_WIN_RXLEV_STR HO_WIN_STR "Received Level Averaging\n"
1377#define HO_WIN_RXQUAL_STR HO_WIN_STR "Received Quality Averaging\n"
1378#define HO_PBUDGET_STR HANDOVER_STR "Power Budget\n"
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001379#define HO_AVG_COUNT_STR "Amount to use for Averaging\n"
Harald Welte9e002452010-05-11 21:53:49 +02001380
Harald Weltea8062f12009-12-21 16:51:50 +01001381DEFUN(cfg_net_ho_win_rxlev_avg, cfg_net_ho_win_rxlev_avg_cmd,
1382 "handover window rxlev averaging <1-10>",
Harald Welte9e002452010-05-11 21:53:49 +02001383 HO_WIN_RXLEV_STR
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001384 "How many RxLev measurements are used for averaging\n"
1385 HO_AVG_COUNT_STR)
Harald Weltea8062f12009-12-21 16:51:50 +01001386{
Harald Welte40152872010-05-16 20:52:23 +02001387 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001388 gsmnet->handover.win_rxlev_avg = atoi(argv[0]);
1389 return CMD_SUCCESS;
1390}
1391
1392DEFUN(cfg_net_ho_win_rxqual_avg, cfg_net_ho_win_rxqual_avg_cmd,
1393 "handover window rxqual averaging <1-10>",
Harald Welte9e002452010-05-11 21:53:49 +02001394 HO_WIN_RXQUAL_STR
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001395 "How many RxQual measurements are used for averaging\n"
1396 HO_AVG_COUNT_STR)
Harald Weltea8062f12009-12-21 16:51:50 +01001397{
Harald Welte40152872010-05-16 20:52:23 +02001398 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001399 gsmnet->handover.win_rxqual_avg = atoi(argv[0]);
1400 return CMD_SUCCESS;
1401}
1402
1403DEFUN(cfg_net_ho_win_rxlev_neigh_avg, cfg_net_ho_win_rxlev_avg_neigh_cmd,
1404 "handover window rxlev neighbor averaging <1-10>",
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001405 HO_WIN_RXLEV_STR "Neighbor\n"
1406 "How many RxQual measurements are used for averaging\n"
1407 HO_AVG_COUNT_STR)
Harald Weltea8062f12009-12-21 16:51:50 +01001408{
Harald Welte40152872010-05-16 20:52:23 +02001409 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001410 gsmnet->handover.win_rxlev_avg_neigh = atoi(argv[0]);
1411 return CMD_SUCCESS;
1412}
1413
1414DEFUN(cfg_net_ho_pwr_interval, cfg_net_ho_pwr_interval_cmd,
1415 "handover power budget interval <1-99>",
Harald Welte9e002452010-05-11 21:53:49 +02001416 HO_PBUDGET_STR
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001417 "How often to check if we have a better cell (SACCH frames)\n"
1418 "Interval\n" "Number\n")
Harald Weltea8062f12009-12-21 16:51:50 +01001419{
Harald Welte40152872010-05-16 20:52:23 +02001420 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001421 gsmnet->handover.pwr_interval = atoi(argv[0]);
1422 return CMD_SUCCESS;
1423}
1424
1425DEFUN(cfg_net_ho_pwr_hysteresis, cfg_net_ho_pwr_hysteresis_cmd,
1426 "handover power budget hysteresis <0-999>",
Harald Welte9e002452010-05-11 21:53:49 +02001427 HO_PBUDGET_STR
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001428 "How many dB does a neighbor to be stronger to become a HO candidate\n"
1429 "Hysteresis\n" "Number\n")
Harald Weltea8062f12009-12-21 16:51:50 +01001430{
Harald Welte40152872010-05-16 20:52:23 +02001431 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001432 gsmnet->handover.pwr_hysteresis = atoi(argv[0]);
1433 return CMD_SUCCESS;
1434}
1435
1436DEFUN(cfg_net_ho_max_distance, cfg_net_ho_max_distance_cmd,
1437 "handover maximum distance <0-9999>",
Harald Welte9e002452010-05-11 21:53:49 +02001438 HANDOVER_STR
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001439 "How big is the maximum timing advance before HO is forced\n"
1440 "Distance\n" "Number\n")
Harald Weltea8062f12009-12-21 16:51:50 +01001441{
Harald Welte40152872010-05-16 20:52:23 +02001442 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001443 gsmnet->handover.max_distance = atoi(argv[0]);
1444 return CMD_SUCCESS;
1445}
Harald Welte0af9c9f2009-12-19 21:41:52 +01001446
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +08001447DEFUN(cfg_net_pag_any_tch,
1448 cfg_net_pag_any_tch_cmd,
1449 "paging any use tch (0|1)",
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001450 "Assign a TCH when receiving a Paging Any request\n"
1451 "Any Channel\n" "Use\n" "TCH\n"
1452 "Do not use TCH for Paging Request Any\n"
1453 "Do use TCH for Paging Request Any\n")
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +08001454{
Holger Hans Peter Freytherc5628882010-09-06 10:09:19 +08001455 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +08001456 gsmnet->pag_any_tch = atoi(argv[0]);
1457 gsm_net_update_ctype(gsmnet);
1458 return CMD_SUCCESS;
1459}
1460
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001461#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001462 DEFUN(cfg_net_T##number, \
1463 cfg_net_T##number##_cmd, \
1464 "timer t" #number " <0-65535>", \
Harald Welte9e002452010-05-11 21:53:49 +02001465 "Configure GSM Timers\n" \
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001466 doc "Timer Value\n") \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001467{ \
Harald Welte40152872010-05-16 20:52:23 +02001468 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001469 int value = atoi(argv[0]); \
1470 \
1471 if (value < 0 || value > 65535) { \
1472 vty_out(vty, "Timer value %s out of range.%s", \
1473 argv[0], VTY_NEWLINE); \
1474 return CMD_WARNING; \
1475 } \
1476 \
1477 gsmnet->T##number = value; \
1478 return CMD_SUCCESS; \
1479}
1480
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001481DECLARE_TIMER(3101, "Set the timeout value for IMMEDIATE ASSIGNMENT.\n")
1482DECLARE_TIMER(3103, "Set the timeout value for HANDOVER.\n")
Harald Welte9b77f612012-06-03 13:01:47 +02001483DECLARE_TIMER(3105, "Set the timer for repetition of PHYSICAL INFORMATION.\n")
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001484DECLARE_TIMER(3107, "Currently not used.\n")
Holger Hans Peter Freyther969a4052011-12-28 16:21:05 +01001485DECLARE_TIMER(3109, "Set the RSL SACCH deactivation timeout.\n")
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001486DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.\n")
1487DECLARE_TIMER(3113, "Set the time to try paging a subscriber.\n")
1488DECLARE_TIMER(3115, "Currently not used.\n")
1489DECLARE_TIMER(3117, "Currently not used.\n")
1490DECLARE_TIMER(3119, "Currently not used.\n")
1491DECLARE_TIMER(3122, "Waiting time (seconds) after IMM ASS REJECT\n")
1492DECLARE_TIMER(3141, "Currently not used.\n")
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001493
Holger Hans Peter Freyther21d63ff2010-09-06 09:25:48 +08001494DEFUN(cfg_net_dtx,
1495 cfg_net_dtx_cmd,
1496 "dtx-used (0|1)",
1497 "Enable the usage of DTX.\n"
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001498 "DTX is disabled\n" "DTX is enabled\n")
Holger Hans Peter Freyther21d63ff2010-09-06 09:25:48 +08001499{
1500 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1501 gsmnet->dtx_enabled = atoi(argv[0]);
1502 return CMD_SUCCESS;
1503}
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001504
Holger Hans Peter Freyther68b21e12010-12-22 16:26:04 +01001505DEFUN(cfg_net_subscr_keep,
1506 cfg_net_subscr_keep_cmd,
1507 "subscriber-keep-in-ram (0|1)",
1508 "Keep unused subscribers in RAM.\n"
1509 "Delete unused subscribers\n" "Keep unused subscribers\n")
1510{
1511 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1512 gsmnet->keep_subscr = atoi(argv[0]);
1513 return CMD_SUCCESS;
1514}
1515
Harald Welte59b04682009-06-10 05:40:52 +08001516/* per-BTS configuration */
1517DEFUN(cfg_bts,
1518 cfg_bts_cmd,
Harald Welte2af06cb2012-08-17 12:50:14 +02001519 "bts <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02001520 "Select a BTS to configure\n"
1521 "BTS Number\n")
Harald Welte59b04682009-06-10 05:40:52 +08001522{
Harald Welte40152872010-05-16 20:52:23 +02001523 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +08001524 int bts_nr = atoi(argv[0]);
1525 struct gsm_bts *bts;
1526
Harald Weltee712a5f2009-06-21 16:17:15 +02001527 if (bts_nr > gsmnet->num_bts) {
1528 vty_out(vty, "%% The next unused BTS number is %u%s",
1529 gsmnet->num_bts, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +08001530 return CMD_WARNING;
Harald Weltee712a5f2009-06-21 16:17:15 +02001531 } else if (bts_nr == gsmnet->num_bts) {
1532 /* allocate a new one */
Harald Weltec7881282011-06-05 13:31:33 +02001533 bts = gsm_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,
1534 HARDCODED_TSC, HARDCODED_BSIC);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02001535 } else
Harald Weltee712a5f2009-06-21 16:17:15 +02001536 bts = gsm_bts_num(gsmnet, bts_nr);
1537
Daniel Willmann580085f2010-01-11 13:43:07 +01001538 if (!bts) {
1539 vty_out(vty, "%% Unable to allocate BTS %u%s",
1540 gsmnet->num_bts, VTY_NEWLINE);
Harald Weltee712a5f2009-06-21 16:17:15 +02001541 return CMD_WARNING;
Daniel Willmann580085f2010-01-11 13:43:07 +01001542 }
Harald Welte59b04682009-06-10 05:40:52 +08001543
1544 vty->index = bts;
Harald Welte8791dac2010-05-14 17:59:53 +02001545 vty->index_sub = &bts->description;
Harald Welte59b04682009-06-10 05:40:52 +08001546 vty->node = BTS_NODE;
1547
1548 return CMD_SUCCESS;
1549}
1550
1551DEFUN(cfg_bts_type,
1552 cfg_bts_type_cmd,
Harald Welte85a77b12012-08-17 13:02:12 +02001553 "type TYPE", /* dynamically created */
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001554 "Set the BTS type\n" "Type\n")
Harald Welte59b04682009-06-10 05:40:52 +08001555{
1556 struct gsm_bts *bts = vty->index;
Harald Welte59698fb2010-01-10 18:01:52 +01001557 int rc;
Harald Welte59b04682009-06-10 05:40:52 +08001558
Harald Welte59698fb2010-01-10 18:01:52 +01001559 rc = gsm_set_bts_type(bts, parse_btstype(argv[0]));
1560 if (rc < 0)
1561 return CMD_WARNING;
Harald Welte25572872009-10-20 00:22:00 +02001562
Harald Welte59b04682009-06-10 05:40:52 +08001563 return CMD_SUCCESS;
1564}
1565
Harald Welte91afe4c2009-06-20 18:15:19 +02001566DEFUN(cfg_bts_band,
1567 cfg_bts_band_cmd,
1568 "band BAND",
Holger Hans Peter Freythere8127042011-10-03 23:42:06 +02001569 "Set the frequency band of this BTS\n" "Frequency band\n")
Harald Welte91afe4c2009-06-20 18:15:19 +02001570{
1571 struct gsm_bts *bts = vty->index;
Harald Welte62868882009-08-08 16:12:58 +02001572 int band = gsm_band_parse(argv[0]);
Harald Welte91afe4c2009-06-20 18:15:19 +02001573
1574 if (band < 0) {
1575 vty_out(vty, "%% BAND %d is not a valid GSM band%s",
1576 band, VTY_NEWLINE);
1577 return CMD_WARNING;
1578 }
1579
1580 bts->band = band;
1581
1582 return CMD_SUCCESS;
1583}
1584
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +02001585DEFUN(cfg_bts_ci,
1586 cfg_bts_ci_cmd,
1587 "cell_identity <0-65535>",
Holger Hans Peter Freyther29844222012-07-21 00:27:10 +02001588 "Set the Cell identity of this BTS\n" "Cell Identity\n")
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +02001589{
1590 struct gsm_bts *bts = vty->index;
1591 int ci = atoi(argv[0]);
1592
1593 if (ci < 0 || ci > 0xffff) {
1594 vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s",
1595 ci, VTY_NEWLINE);
1596 return CMD_WARNING;
1597 }
1598 bts->cell_identity = ci;
1599
1600 return CMD_SUCCESS;
1601}
1602
Harald Welte59b04682009-06-10 05:40:52 +08001603DEFUN(cfg_bts_lac,
1604 cfg_bts_lac_cmd,
Holger Hans Peter Freyther54a22832009-09-29 14:02:33 +02001605 "location_area_code <0-65535>",
Holger Hans Peter Freyther29844222012-07-21 00:27:10 +02001606 "Set the Location Area Code (LAC) of this BTS\n" "LAC\n")
Harald Welte59b04682009-06-10 05:40:52 +08001607{
1608 struct gsm_bts *bts = vty->index;
1609 int lac = atoi(argv[0]);
1610
Holger Hans Peter Freyther54a22832009-09-29 14:02:33 +02001611 if (lac < 0 || lac > 0xffff) {
1612 vty_out(vty, "%% LAC %d is not in the valid range (0-65535)%s",
Harald Welte59b04682009-06-10 05:40:52 +08001613 lac, VTY_NEWLINE);
1614 return CMD_WARNING;
1615 }
Holger Hans Peter Freyther6c6ab862009-10-01 04:07:15 +02001616
1617 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
1618 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
1619 lac, VTY_NEWLINE);
1620 return CMD_WARNING;
1621 }
1622
Harald Welte59b04682009-06-10 05:40:52 +08001623 bts->location_area_code = lac;
1624
1625 return CMD_SUCCESS;
1626}
1627
Harald Weltea54a2bb2009-12-01 18:04:30 +05301628
Harald Welte59b04682009-06-10 05:40:52 +08001629DEFUN(cfg_bts_tsc,
1630 cfg_bts_tsc_cmd,
Harald Weltede896da2012-05-31 10:57:08 +02001631 "training_sequence_code <0-7>",
Holger Hans Peter Freyther29844222012-07-21 00:27:10 +02001632 "Set the Training Sequence Code (TSC) of this BTS\n" "TSC\n")
Harald Welte59b04682009-06-10 05:40:52 +08001633{
1634 struct gsm_bts *bts = vty->index;
1635 int tsc = atoi(argv[0]);
1636
Harald Welte59b04682009-06-10 05:40:52 +08001637 bts->tsc = tsc;
1638
1639 return CMD_SUCCESS;
1640}
1641
1642DEFUN(cfg_bts_bsic,
1643 cfg_bts_bsic_cmd,
1644 "base_station_id_code <0-63>",
Harald Welte557f3992012-08-16 23:23:50 +02001645 "Set the Base Station Identity Code (BSIC) of this BTS\n"
1646 "BSIC of this BTS\n")
Harald Welte59b04682009-06-10 05:40:52 +08001647{
1648 struct gsm_bts *bts = vty->index;
1649 int bsic = atoi(argv[0]);
1650
1651 if (bsic < 0 || bsic > 0x3f) {
Harald Welte62868882009-08-08 16:12:58 +02001652 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte59b04682009-06-10 05:40:52 +08001653 bsic, VTY_NEWLINE);
1654 return CMD_WARNING;
1655 }
1656 bts->bsic = bsic;
1657
1658 return CMD_SUCCESS;
1659}
1660
Gus Bourgf9dc16b2011-12-02 10:18:17 +01001661DEFUN(cfg_bts_timezone,
1662 cfg_bts_timezone_cmd,
1663 "timezone <-19-19> (0|15|30|45)",
Harald Welte557f3992012-08-16 23:23:50 +02001664 "Set the Timezone Offset of this BTS\n"
1665 "Timezone offset (hours)\n"
1666 "Timezone offset (00 minutes)\n"
1667 "Timezone offset (15 minutes)\n"
1668 "Timezone offset (30 minutes)\n"
Harald Weltefa2015f2012-08-17 09:52:03 +02001669 "Timezone offset (45 minutes)\n"
Harald Welte557f3992012-08-16 23:23:50 +02001670 )
Gus Bourgf9dc16b2011-12-02 10:18:17 +01001671{
1672 struct gsm_bts *bts = vty->index;
1673 int tzhr = atoi(argv[0]);
1674 int tzmn = atoi(argv[1]);
1675
Harald Welte5c3abf92012-07-08 16:48:11 +02001676 bts->tz.hr = tzhr;
1677 bts->tz.mn = tzmn;
Jacob Erlbeckcc0d8842013-09-17 13:59:29 +02001678 bts->tz.dst = 0;
1679 bts->tz.override = 1;
1680
1681 return CMD_SUCCESS;
1682}
1683
1684DEFUN(cfg_bts_timezone_dst,
1685 cfg_bts_timezone_dst_cmd,
1686 "timezone <-19-19> (0|15|30|45) <0-2>",
1687 "Set the Timezone Offset of this BTS\n"
1688 "Timezone offset (hours)\n"
1689 "Timezone offset (00 minutes)\n"
1690 "Timezone offset (15 minutes)\n"
1691 "Timezone offset (30 minutes)\n"
1692 "Timezone offset (45 minutes)\n"
1693 "DST offset (hours)\n"
1694 )
1695{
1696 struct gsm_bts *bts = vty->index;
1697 int tzhr = atoi(argv[0]);
1698 int tzmn = atoi(argv[1]);
1699 int tzdst = atoi(argv[2]);
1700
1701 bts->tz.hr = tzhr;
1702 bts->tz.mn = tzmn;
1703 bts->tz.dst = tzdst;
Harald Welte5c3abf92012-07-08 16:48:11 +02001704 bts->tz.override = 1;
Gus Bourgf9dc16b2011-12-02 10:18:17 +01001705
1706 return CMD_SUCCESS;
1707}
1708
1709DEFUN(cfg_bts_no_timezone,
1710 cfg_bts_no_timezone_cmd,
1711 "no timezone",
Harald Welte557f3992012-08-16 23:23:50 +02001712 NO_STR
1713 "Disable BTS specific timezone\n")
Gus Bourgf9dc16b2011-12-02 10:18:17 +01001714{
1715 struct gsm_bts *bts = vty->index;
Harald Welte5c3abf92012-07-08 16:48:11 +02001716
1717 bts->tz.override = 0;
1718
Gus Bourgf9dc16b2011-12-02 10:18:17 +01001719 return CMD_SUCCESS;
1720}
Harald Welte59b04682009-06-10 05:40:52 +08001721
1722DEFUN(cfg_bts_unit_id,
1723 cfg_bts_unit_id_cmd,
Harald Weltef515aa02009-08-07 13:27:09 +02001724 "ip.access unit_id <0-65534> <0-255>",
Harald Welte557f3992012-08-16 23:23:50 +02001725 "Abis/IP specific options\n"
1726 "Set the IPA BTS Unit ID\n"
1727 "Unit ID (Site)\n"
1728 "Unit ID (BTS)\n")
Harald Welte59b04682009-06-10 05:40:52 +08001729{
1730 struct gsm_bts *bts = vty->index;
1731 int site_id = atoi(argv[0]);
1732 int bts_id = atoi(argv[1]);
1733
Harald Weltef515aa02009-08-07 13:27:09 +02001734 if (!is_ipaccess_bts(bts)) {
1735 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1736 return CMD_WARNING;
1737 }
1738
Harald Welte59b04682009-06-10 05:40:52 +08001739 bts->ip_access.site_id = site_id;
1740 bts->ip_access.bts_id = bts_id;
1741
1742 return CMD_SUCCESS;
1743}
1744
Harald Welte8b3c5952013-03-12 13:57:05 +01001745DEFUN(cfg_bts_rsl_ip,
1746 cfg_bts_rsl_ip_cmd,
1747 "ip.access rsl-ip A.B.C.D",
1748 "Abis/IP specific options\n"
1749 "Set the IPA RSL IP Address of the BSC\n"
1750 "Destination IP address for RSL connection\n")
1751{
1752 struct gsm_bts *bts = vty->index;
1753 struct in_addr ia;
1754
1755 if (!is_ipaccess_bts(bts)) {
1756 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1757 return CMD_WARNING;
1758 }
1759
1760 inet_aton(argv[0], &ia);
1761 bts->ip_access.rsl_ip = ntohl(ia.s_addr);
1762
1763 return CMD_SUCCESS;
1764}
1765
Andreas Eversbergac27b952013-12-05 13:25:06 +01001766#define NOKIA_STR "Nokia *Site related commands\n"
Harald Welte8b3c5952013-03-12 13:57:05 +01001767
Sylvain Munautcb8e8432011-10-17 14:04:55 +02001768DEFUN(cfg_bts_nokia_site_skip_reset,
1769 cfg_bts_nokia_site_skip_reset_cmd,
1770 "nokia_site skip-reset (0|1)",
Andreas Eversbergac27b952013-12-05 13:25:06 +01001771 NOKIA_STR
Harald Welte557f3992012-08-16 23:23:50 +02001772 "Skip the reset step during bootstrap process of this BTS\n"
1773 "Do NOT skip the reset\n" "Skip the reset\n")
Sylvain Munautcb8e8432011-10-17 14:04:55 +02001774{
1775 struct gsm_bts *bts = vty->index;
1776
1777 if (bts->type != GSM_BTS_TYPE_NOKIA_SITE) {
1778 vty_out(vty, "%% BTS is not of Nokia *Site type%s", VTY_NEWLINE);
1779 return CMD_WARNING;
1780 }
1781
1782 bts->nokia.skip_reset = atoi(argv[0]);
1783
1784 return CMD_SUCCESS;
1785}
1786
Andreas Eversbergac27b952013-12-05 13:25:06 +01001787DEFUN(cfg_bts_nokia_site_no_loc_rel_cnf,
1788 cfg_bts_nokia_site_no_loc_rel_cnf_cmd,
1789 "nokia_site no-local-rel-conf (0|1)",
1790 NOKIA_STR
1791 "Do not wait for RELease CONFirm message when releasing channel locally\n"
1792 "Wait for RELease CONFirm\n" "Do not wait for RELease CONFirm\n")
1793{
1794 struct gsm_bts *bts = vty->index;
1795
1796 if (!is_nokia_bts(bts)) {
1797 vty_out(vty, "%% BTS is not of Nokia *Site type%s",
1798 VTY_NEWLINE);
1799 return CMD_WARNING;
1800 }
1801
1802 bts->nokia.no_loc_rel_cnf = atoi(argv[0]);
1803
1804 return CMD_SUCCESS;
1805}
1806
Harald Welte9e002452010-05-11 21:53:49 +02001807#define OML_STR "Organization & Maintenance Link\n"
Harald Welte557f3992012-08-16 23:23:50 +02001808#define IPA_STR "A-bis/IP Specific Options\n"
Harald Welte9e002452010-05-11 21:53:49 +02001809
Harald Welte25572872009-10-20 00:22:00 +02001810DEFUN(cfg_bts_stream_id,
1811 cfg_bts_stream_id_cmd,
Pablo Neira Ayuso42e41df2011-08-17 22:44:07 +02001812 "oml ip.access stream_id <0-255> line E1_LINE",
Harald Welte9e002452010-05-11 21:53:49 +02001813 OML_STR IPA_STR
Harald Welte557f3992012-08-16 23:23:50 +02001814 "Set the ip.access Stream ID of the OML link of this BTS\n"
1815 "Stream Identifier\n" "Virtual E1 Line Number\n" "Virtual E1 Line Number\n")
Harald Welte25572872009-10-20 00:22:00 +02001816{
1817 struct gsm_bts *bts = vty->index;
Pablo Neira Ayuso42e41df2011-08-17 22:44:07 +02001818 int stream_id = atoi(argv[0]), linenr = atoi(argv[1]);
Harald Welte25572872009-10-20 00:22:00 +02001819
1820 if (!is_ipaccess_bts(bts)) {
1821 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1822 return CMD_WARNING;
1823 }
1824
1825 bts->oml_tei = stream_id;
Pablo Neira Ayuso42e41df2011-08-17 22:44:07 +02001826 /* This is used by e1inp_bind_ops callback for each BTS model. */
1827 bts->oml_e1_link.e1_nr = linenr;
1828
1829 return CMD_SUCCESS;
1830}
1831
Harald Weltefa2015f2012-08-17 09:52:03 +02001832#define OML_E1_STR OML_STR "OML E1/T1 Configuration\n"
Harald Welte25572872009-10-20 00:22:00 +02001833
Harald Welte62868882009-08-08 16:12:58 +02001834DEFUN(cfg_bts_oml_e1,
1835 cfg_bts_oml_e1_cmd,
1836 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltefa2015f2012-08-17 09:52:03 +02001837 OML_E1_STR
1838 "E1/T1 line number to be used for OML\n"
Harald Welte557f3992012-08-16 23:23:50 +02001839 "E1/T1 line number to be used for OML\n"
1840 "E1/T1 timeslot to be used for OML\n"
1841 "E1/T1 timeslot to be used for OML\n"
1842 "E1/T1 sub-slot to be used for OML\n"
1843 "Use E1/T1 sub-slot 0\n"
1844 "Use E1/T1 sub-slot 1\n"
1845 "Use E1/T1 sub-slot 2\n"
1846 "Use E1/T1 sub-slot 3\n"
1847 "Use full E1 slot 3\n"
1848 )
Harald Welte62868882009-08-08 16:12:58 +02001849{
1850 struct gsm_bts *bts = vty->index;
1851
1852 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
1853
1854 return CMD_SUCCESS;
1855}
1856
1857
1858DEFUN(cfg_bts_oml_e1_tei,
1859 cfg_bts_oml_e1_tei_cmd,
1860 "oml e1 tei <0-63>",
Harald Welte9e002452010-05-11 21:53:49 +02001861 OML_E1_STR
Harald Welte557f3992012-08-16 23:23:50 +02001862 "Set the TEI to be used for OML\n"
1863 "TEI Number\n")
Harald Welte62868882009-08-08 16:12:58 +02001864{
1865 struct gsm_bts *bts = vty->index;
1866
1867 bts->oml_tei = atoi(argv[0]);
1868
1869 return CMD_SUCCESS;
1870}
1871
Harald Welte3e774612009-08-10 13:48:16 +02001872DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1873 "channel allocator (ascending|descending)",
Harald Welte9e002452010-05-11 21:53:49 +02001874 "Channnel Allocator\n" "Channel Allocator\n"
1875 "Allocate Timeslots and Transceivers in ascending order\n"
1876 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte3e774612009-08-10 13:48:16 +02001877{
1878 struct gsm_bts *bts = vty->index;
1879
1880 if (!strcmp(argv[0], "ascending"))
1881 bts->chan_alloc_reverse = 0;
1882 else
1883 bts->chan_alloc_reverse = 1;
1884
1885 return CMD_SUCCESS;
1886}
1887
Harald Welte9e002452010-05-11 21:53:49 +02001888#define RACH_STR "Random Access Control Channel\n"
1889
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01001890DEFUN(cfg_bts_rach_tx_integer,
1891 cfg_bts_rach_tx_integer_cmd,
1892 "rach tx integer <0-15>",
Harald Welte9e002452010-05-11 21:53:49 +02001893 RACH_STR
Harald Welte557f3992012-08-16 23:23:50 +02001894 "Set the raw tx integer value in RACH Control parameters IE\n"
1895 "Set the raw tx integer value in RACH Control parameters IE\n"
1896 "Raw tx integer value in RACH Control parameters IE\n")
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01001897{
1898 struct gsm_bts *bts = vty->index;
1899 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
1900 return CMD_SUCCESS;
1901}
1902
1903DEFUN(cfg_bts_rach_max_trans,
1904 cfg_bts_rach_max_trans_cmd,
1905 "rach max transmission (1|2|4|7)",
Harald Welte9e002452010-05-11 21:53:49 +02001906 RACH_STR
Harald Welte557f3992012-08-16 23:23:50 +02001907 "Set the maximum number of RACH burst transmissions\n"
1908 "Set the maximum number of RACH burst transmissions\n"
Harald Weltefa2015f2012-08-17 09:52:03 +02001909 "Maximum number of 1 RACH burst transmissions\n"
1910 "Maximum number of 2 RACH burst transmissions\n"
1911 "Maximum number of 4 RACH burst transmissions\n"
1912 "Maximum number of 7 RACH burst transmissions\n")
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01001913{
1914 struct gsm_bts *bts = vty->index;
1915 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
1916 return CMD_SUCCESS;
1917}
1918
Andreas Eversberg14e12f22012-10-13 07:27:47 +02001919#define CD_STR "Channel Description\n"
1920
1921DEFUN(cfg_bts_chan_desc_att,
1922 cfg_bts_chan_desc_att_cmd,
1923 "channel-descrption attach (0|1)",
1924 CD_STR
1925 "Set if attachment is required\n"
1926 "Attachment is NOT required\n"
1927 "Attachment is required (standard)\n")
1928{
1929 struct gsm_bts *bts = vty->index;
1930 bts->si_common.chan_desc.att = atoi(argv[0]);
1931 return CMD_SUCCESS;
1932}
1933
1934DEFUN(cfg_bts_chan_desc_bs_pa_mfrms,
1935 cfg_bts_chan_desc_bs_pa_mfrms_cmd,
1936 "channel-descrption bs-pa-mfrms <2-9>",
1937 CD_STR
1938 "Set number of multiframe periods for paging groups\n"
1939 "Number of multiframe periods for paging groups\n")
1940{
1941 struct gsm_bts *bts = vty->index;
1942 int bs_pa_mfrms = atoi(argv[0]);
1943
1944 bts->si_common.chan_desc.bs_pa_mfrms = bs_pa_mfrms - 2;
1945 return CMD_SUCCESS;
1946}
1947
1948DEFUN(cfg_bts_chan_desc_bs_ag_blks_res,
1949 cfg_bts_chan_desc_bs_ag_blks_res_cmd,
1950 "channel-descrption bs-ag-blks-res <0-7>",
1951 CD_STR
1952 "Set number of blocks reserved for access grant\n"
1953 "Number of blocks reserved for access grant\n")
1954{
1955 struct gsm_bts *bts = vty->index;
1956 int bs_ag_blks_res = atoi(argv[0]);
1957
1958 bts->si_common.chan_desc.bs_ag_blks_res = bs_ag_blks_res;
1959 return CMD_SUCCESS;
1960}
1961
Harald Welte9e002452010-05-11 21:53:49 +02001962#define NM_STR "Network Management\n"
1963
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08001964DEFUN(cfg_bts_rach_nm_b_thresh,
1965 cfg_bts_rach_nm_b_thresh_cmd,
1966 "rach nm busy threshold <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02001967 RACH_STR NM_STR
Harald Welte557f3992012-08-16 23:23:50 +02001968 "Set the NM Busy Threshold\n"
1969 "Set the NM Busy Threshold\n"
1970 "NM Busy Threshold in dB")
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08001971{
1972 struct gsm_bts *bts = vty->index;
1973 bts->rach_b_thresh = atoi(argv[0]);
1974 return CMD_SUCCESS;
1975}
1976
1977DEFUN(cfg_bts_rach_nm_ldavg,
1978 cfg_bts_rach_nm_ldavg_cmd,
1979 "rach nm load average <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001980 RACH_STR NM_STR
Harald Welte557f3992012-08-16 23:23:50 +02001981 "Set the NM Loadaverage Slots value\n"
1982 "Set the NM Loadaverage Slots value\n"
1983 "NM Loadaverage Slots value\n")
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08001984{
1985 struct gsm_bts *bts = vty->index;
1986 bts->rach_ldavg_slots = atoi(argv[0]);
1987 return CMD_SUCCESS;
1988}
1989
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02001990DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
1991 "cell barred (0|1)",
Harald Welte557f3992012-08-16 23:23:50 +02001992 "Should this cell be barred from access?\n"
1993 "Should this cell be barred from access?\n"
1994 "Cell should NOT be barred\n"
1995 "Cell should be barred\n")
1996
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02001997{
1998 struct gsm_bts *bts = vty->index;
1999
Harald Welte8c973ba2009-12-21 23:08:18 +01002000 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02002001
2002 return CMD_SUCCESS;
2003}
2004
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +08002005DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
2006 "rach emergency call allowed (0|1)",
Harald Welte557f3992012-08-16 23:23:50 +02002007 RACH_STR
2008 "Should this cell allow emergency calls?\n"
2009 "Should this cell allow emergency calls?\n"
2010 "Should this cell allow emergency calls?\n"
2011 "Do NOT allow emergency calls\n"
2012 "Allow emergency calls\n")
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +08002013{
2014 struct gsm_bts *bts = vty->index;
2015
2016 if (atoi(argv[0]) == 0)
2017 bts->si_common.rach_control.t2 |= 0x4;
2018 else
2019 bts->si_common.rach_control.t2 &= ~0x4;
2020
2021 return CMD_SUCCESS;
2022}
2023
Ivan Kluchnikov80d58432013-09-16 13:13:04 +04002024DEFUN(cfg_bts_rach_ac_class, cfg_bts_rach_ac_class_cmd,
2025 "rach access-control-class (0|1|2|3|4|5|6|7|8|9|11|12|13|14|15) (barred|allowed)",
2026 RACH_STR
2027 "Set access control class\n"
2028 "Access control class 0\n"
2029 "Access control class 1\n"
2030 "Access control class 2\n"
2031 "Access control class 3\n"
2032 "Access control class 4\n"
2033 "Access control class 5\n"
2034 "Access control class 6\n"
2035 "Access control class 7\n"
2036 "Access control class 8\n"
2037 "Access control class 9\n"
2038 "Access control class 11 for PLMN use\n"
2039 "Access control class 12 for security services\n"
2040 "Access control class 13 for public utilities (e.g. water/gas suppliers)\n"
2041 "Access control class 14 for emergency services\n"
2042 "Access control class 15 for PLMN staff\n"
2043 "barred to use access control class\n"
2044 "allowed to use access control class\n")
2045{
2046 struct gsm_bts *bts = vty->index;
2047
2048 uint8_t control_class;
2049 uint8_t allowed = 0;
2050
2051 if (strcmp(argv[1], "allowed") == 0)
2052 allowed = 1;
2053
2054 control_class = atoi(argv[0]);
2055 if (control_class < 8)
2056 if (allowed)
2057 bts->si_common.rach_control.t3 &= ~(0x1 << control_class);
2058 else
2059 bts->si_common.rach_control.t3 |= (0x1 << control_class);
2060 else
2061 if (allowed)
2062 bts->si_common.rach_control.t2 &= ~(0x1 << (control_class - 8));
2063 else
2064 bts->si_common.rach_control.t2 |= (0x1 << (control_class - 8));
2065
2066 return CMD_SUCCESS;
2067}
2068
Harald Welte (local)cbd46102009-08-13 10:14:26 +02002069DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
2070 "ms max power <0-40>",
Harald Welte557f3992012-08-16 23:23:50 +02002071 "MS Options\n"
Harald Weltefa2015f2012-08-17 09:52:03 +02002072 "Maximum transmit power of the MS\n"
2073 "Maximum transmit power of the MS\n"
Harald Welte557f3992012-08-16 23:23:50 +02002074 "Maximum transmit power of the MS in dBm")
Harald Welte (local)cbd46102009-08-13 10:14:26 +02002075{
2076 struct gsm_bts *bts = vty->index;
2077
2078 bts->ms_max_power = atoi(argv[0]);
2079
2080 return CMD_SUCCESS;
2081}
2082
Harald Welte557f3992012-08-16 23:23:50 +02002083#define CELL_STR "Cell Parameters\n"
2084
Harald Welteb761bf82009-12-12 18:17:25 +01002085DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
2086 "cell reselection hysteresis <0-14>",
Harald Welte557f3992012-08-16 23:23:50 +02002087 CELL_STR "Cell re-selection parameters\n"
2088 "Cell Re-Selection Hysteresis in dB\n"
Harald Welteb761bf82009-12-12 18:17:25 +01002089 "Cell Re-Selection Hysteresis in dB")
2090{
2091 struct gsm_bts *bts = vty->index;
2092
2093 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
2094
2095 return CMD_SUCCESS;
2096}
2097
2098DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
2099 "rxlev access min <0-63>",
Harald Welte557f3992012-08-16 23:23:50 +02002100 "Minimum RxLev needed for cell access\n"
2101 "Minimum RxLev needed for cell access\n"
2102 "Minimum RxLev needed for cell access\n"
Harald Welteb761bf82009-12-12 18:17:25 +01002103 "Minimum RxLev needed for cell access (better than -110dBm)")
2104{
2105 struct gsm_bts *bts = vty->index;
2106
2107 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
2108
2109 return CMD_SUCCESS;
2110}
2111
Sylvain Munaut00d71462010-11-28 18:17:28 +01002112DEFUN(cfg_bts_cell_bar_qualify, cfg_bts_cell_bar_qualify_cmd,
2113 "cell bar qualify (0|1)",
Harald Welte557f3992012-08-16 23:23:50 +02002114 CELL_STR "Cell Bar Qualify\n" "Cell Bar Qualify\n"
2115 "Set CBQ to 0\n" "Set CBQ to 1\n")
Sylvain Munaut00d71462010-11-28 18:17:28 +01002116{
2117 struct gsm_bts *bts = vty->index;
2118
2119 bts->si_common.cell_ro_sel_par.present = 1;
2120 bts->si_common.cell_ro_sel_par.cbq = atoi(argv[0]);
2121
2122 return CMD_SUCCESS;
2123}
2124
2125DEFUN(cfg_bts_cell_resel_ofs, cfg_bts_cell_resel_ofs_cmd,
2126 "cell reselection offset <0-126>",
Harald Welte557f3992012-08-16 23:23:50 +02002127 CELL_STR "Cell Re-Selection Parameters\n"
2128 "Cell Re-Selection Offset (CRO) in dB\n"
2129 "Cell Re-Selection Offset (CRO) in dB\n"
2130 )
Sylvain Munaut00d71462010-11-28 18:17:28 +01002131{
2132 struct gsm_bts *bts = vty->index;
2133
2134 bts->si_common.cell_ro_sel_par.present = 1;
2135 bts->si_common.cell_ro_sel_par.cell_resel_off = atoi(argv[0])/2;
2136
2137 return CMD_SUCCESS;
2138}
2139
2140DEFUN(cfg_bts_temp_ofs, cfg_bts_temp_ofs_cmd,
2141 "temporary offset <0-60>",
Harald Welte557f3992012-08-16 23:23:50 +02002142 "Cell selection temporary negative offset\n"
2143 "Cell selection temporary negative offset\n"
Sylvain Munaut00d71462010-11-28 18:17:28 +01002144 "Cell selection temporary negative offset in dB")
2145{
2146 struct gsm_bts *bts = vty->index;
2147
2148 bts->si_common.cell_ro_sel_par.present = 1;
2149 bts->si_common.cell_ro_sel_par.temp_offs = atoi(argv[0])/10;
2150
2151 return CMD_SUCCESS;
2152}
2153
2154DEFUN(cfg_bts_temp_ofs_inf, cfg_bts_temp_ofs_inf_cmd,
2155 "temporary offset infinite",
Harald Welte557f3992012-08-16 23:23:50 +02002156 "Cell selection temporary negative offset\n"
2157 "Cell selection temporary negative offset\n"
Sylvain Munaut00d71462010-11-28 18:17:28 +01002158 "Sets cell selection temporary negative offset to infinity")
2159{
2160 struct gsm_bts *bts = vty->index;
2161
2162 bts->si_common.cell_ro_sel_par.present = 1;
2163 bts->si_common.cell_ro_sel_par.temp_offs = 7;
2164
2165 return CMD_SUCCESS;
2166}
2167
2168DEFUN(cfg_bts_penalty_time, cfg_bts_penalty_time_cmd,
2169 "penalty time <20-620>",
Harald Welte557f3992012-08-16 23:23:50 +02002170 "Cell selection penalty time\n"
2171 "Cell selection penalty time\n"
2172 "Cell selection penalty time in seconds (by 20s increments)\n")
Sylvain Munaut00d71462010-11-28 18:17:28 +01002173{
2174 struct gsm_bts *bts = vty->index;
2175
2176 bts->si_common.cell_ro_sel_par.present = 1;
2177 bts->si_common.cell_ro_sel_par.penalty_time = (atoi(argv[0])-20)/20;
2178
2179 return CMD_SUCCESS;
2180}
2181
2182DEFUN(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd,
2183 "penalty time reserved",
Harald Welte557f3992012-08-16 23:23:50 +02002184 "Cell selection penalty time\n"
2185 "Cell selection penalty time\n"
2186 "Set cell selection penalty time to reserved value 31, "
Sylvain Munaut00d71462010-11-28 18:17:28 +01002187 "(indicate that CELL_RESELECT_OFFSET is subtracted from C2 "
2188 "and TEMPORARY_OFFSET is ignored)")
2189{
2190 struct gsm_bts *bts = vty->index;
2191
2192 bts->si_common.cell_ro_sel_par.present = 1;
2193 bts->si_common.cell_ro_sel_par.penalty_time = 31;
2194
2195 return CMD_SUCCESS;
2196}
2197
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02002198DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
Daniel Willmann3e7db9e2012-12-27 00:02:01 +01002199 "periodic location update <6-1530>",
Harald Welte557f3992012-08-16 23:23:50 +02002200 "Periodic Location Updating Interval\n"
2201 "Periodic Location Updating Interval\n"
2202 "Periodic Location Updating Interval\n"
2203 "Periodic Location Updating Interval in Minutes\n")
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02002204{
2205 struct gsm_bts *bts = vty->index;
2206
Dieter Spaarb0f746d2010-10-05 21:10:55 +02002207 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02002208
2209 return CMD_SUCCESS;
2210}
2211
Holger Hans Peter Freyther2fb8ebf2013-07-27 21:07:57 +02002212DEFUN(cfg_bts_no_per_loc_upd, cfg_bts_no_per_loc_upd_cmd,
2213 "no periodic location update",
2214 NO_STR
2215 "Periodic Location Updating Interval\n"
2216 "Periodic Location Updating Interval\n"
2217 "Periodic Location Updating Interval\n")
2218{
2219 struct gsm_bts *bts = vty->index;
2220
2221 bts->si_common.chan_desc.t3212 = 0;
2222 return CMD_SUCCESS;
2223}
2224
Harald Welte9e002452010-05-11 21:53:49 +02002225#define GPRS_TEXT "GPRS Packet Network\n"
2226
Harald Welte410575a2010-03-14 23:30:30 +08002227DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welteb42fe342010-04-18 14:00:26 +02002228 "gprs cell bvci <2-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02002229 GPRS_TEXT
2230 "GPRS Cell Settings\n"
Harald Welte557f3992012-08-16 23:23:50 +02002231 "GPRS BSSGP VC Identifier\n"
Harald Welte3055e332010-03-14 15:37:43 +08002232 "GPRS BSSGP VC Identifier")
2233{
2234 struct gsm_bts *bts = vty->index;
2235
Harald Weltecb20b7a2010-04-18 15:51:20 +02002236 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002237 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2238 return CMD_WARNING;
2239 }
2240
Harald Welte3055e332010-03-14 15:37:43 +08002241 bts->gprs.cell.bvci = atoi(argv[0]);
2242
2243 return CMD_SUCCESS;
2244}
2245
Harald Welte4a048c52010-03-22 11:48:36 +08002246DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
2247 "gprs nsei <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02002248 GPRS_TEXT
Harald Welte557f3992012-08-16 23:23:50 +02002249 "GPRS NS Entity Identifier\n"
Harald Welte4a048c52010-03-22 11:48:36 +08002250 "GPRS NS Entity Identifier")
2251{
2252 struct gsm_bts *bts = vty->index;
2253
Harald Weltecb20b7a2010-04-18 15:51:20 +02002254 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte4a048c52010-03-22 11:48:36 +08002255 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2256 return CMD_WARNING;
2257 }
2258
2259 bts->gprs.nse.nsei = atoi(argv[0]);
2260
2261 return CMD_SUCCESS;
2262}
2263
Harald Welte9e002452010-05-11 21:53:49 +02002264#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
2265 "NSVC Logical Number\n"
Harald Welte4a048c52010-03-22 11:48:36 +08002266
Harald Welte3055e332010-03-14 15:37:43 +08002267DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
2268 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02002269 GPRS_TEXT NSVC_TEXT
2270 "NS Virtual Connection Identifier\n"
Harald Welte3055e332010-03-14 15:37:43 +08002271 "GPRS NS VC Identifier")
2272{
2273 struct gsm_bts *bts = vty->index;
2274 int idx = atoi(argv[0]);
2275
Harald Weltecb20b7a2010-04-18 15:51:20 +02002276 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002277 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2278 return CMD_WARNING;
2279 }
2280
Harald Welte3055e332010-03-14 15:37:43 +08002281 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
2282
2283 return CMD_SUCCESS;
2284}
2285
Harald Welte410575a2010-03-14 23:30:30 +08002286DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
2287 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02002288 GPRS_TEXT NSVC_TEXT
Harald Welte557f3992012-08-16 23:23:50 +02002289 "GPRS NS Local UDP Port\n"
2290 "GPRS NS Local UDP Port\n"
2291 "GPRS NS Local UDP Port\n"
Harald Welte764c8e12012-08-17 09:57:25 +02002292 "GPRS NS Local UDP Port Number\n")
Harald Welte410575a2010-03-14 23:30:30 +08002293{
2294 struct gsm_bts *bts = vty->index;
2295 int idx = atoi(argv[0]);
2296
Harald Weltecb20b7a2010-04-18 15:51:20 +02002297 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002298 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2299 return CMD_WARNING;
2300 }
2301
Harald Welte410575a2010-03-14 23:30:30 +08002302 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
2303
2304 return CMD_SUCCESS;
2305}
2306
2307DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
2308 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02002309 GPRS_TEXT NSVC_TEXT
Harald Welte557f3992012-08-16 23:23:50 +02002310 "GPRS NS Remote UDP Port\n"
2311 "GPRS NS Remote UDP Port\n"
Harald Welte764c8e12012-08-17 09:57:25 +02002312 "GPRS NS Remote UDP Port\n"
2313 "GPRS NS Remote UDP Port Number\n")
Harald Welte410575a2010-03-14 23:30:30 +08002314{
2315 struct gsm_bts *bts = vty->index;
2316 int idx = atoi(argv[0]);
2317
Harald Weltecb20b7a2010-04-18 15:51:20 +02002318 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002319 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2320 return CMD_WARNING;
2321 }
2322
Harald Welte410575a2010-03-14 23:30:30 +08002323 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
2324
2325 return CMD_SUCCESS;
2326}
2327
2328DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
2329 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte9e002452010-05-11 21:53:49 +02002330 GPRS_TEXT NSVC_TEXT
Harald Welte557f3992012-08-16 23:23:50 +02002331 "GPRS NS Remote IP Address\n"
2332 "GPRS NS Remote IP Address\n"
2333 "GPRS NS Remote IP Address\n")
Harald Welte410575a2010-03-14 23:30:30 +08002334{
2335 struct gsm_bts *bts = vty->index;
2336 int idx = atoi(argv[0]);
2337 struct in_addr ia;
2338
Harald Weltecb20b7a2010-04-18 15:51:20 +02002339 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002340 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2341 return CMD_WARNING;
2342 }
2343
Harald Welte410575a2010-03-14 23:30:30 +08002344 inet_aton(argv[1], &ia);
2345 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
2346
2347 return CMD_SUCCESS;
2348}
2349
Holger Hans Peter Freyther3112f672010-09-06 10:11:25 +08002350DEFUN(cfg_bts_pag_free, cfg_bts_pag_free_cmd,
Harald Welte557f3992012-08-16 23:23:50 +02002351 "paging free <-1-1024>",
2352 "Paging options\n"
2353 "Only page when having a certain amount of free slots\n"
2354 "amount of required free paging slots. -1 to disable\n")
Holger Hans Peter Freyther3112f672010-09-06 10:11:25 +08002355{
2356 struct gsm_bts *bts = vty->index;
2357
2358 bts->paging.free_chans_need = atoi(argv[0]);
2359 return CMD_SUCCESS;
2360}
2361
Harald Weltea9251762010-05-11 23:50:21 +02002362DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
2363 "gprs ns timer " NS_TIMERS " <0-255>",
2364 GPRS_TEXT "Network Service\n"
2365 "Network Service Timer\n"
2366 NS_TIMERS_HELP "Timer Value\n")
2367{
2368 struct gsm_bts *bts = vty->index;
2369 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
2370 int val = atoi(argv[1]);
2371
2372 if (bts->gprs.mode == BTS_GPRS_NONE) {
2373 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2374 return CMD_WARNING;
2375 }
2376
2377 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
2378 return CMD_WARNING;
2379
2380 bts->gprs.nse.timer[idx] = val;
2381
2382 return CMD_SUCCESS;
2383}
2384
2385#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 +02002386#define BSSGP_TIMERS_HELP \
2387 "Tbvc-block timeout\n" \
2388 "Tbvc-block retries\n" \
2389 "Tbvc-unblock retries\n" \
2390 "Tbvcc-reset timeout\n" \
2391 "Tbvc-reset retries\n" \
2392 "Tbvc-suspend timeout\n" \
2393 "Tbvc-suspend retries\n" \
2394 "Tbvc-resume timeout\n" \
2395 "Tbvc-resume retries\n" \
2396 "Tbvc-capa-update timeout\n" \
2397 "Tbvc-capa-update retries\n"
Harald Weltea9251762010-05-11 23:50:21 +02002398
2399DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
2400 "gprs cell timer " BSSGP_TIMERS " <0-255>",
2401 GPRS_TEXT "Cell / BSSGP\n"
2402 "Cell/BSSGP Timer\n"
2403 BSSGP_TIMERS_HELP "Timer Value\n")
2404{
2405 struct gsm_bts *bts = vty->index;
2406 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
2407 int val = atoi(argv[1]);
2408
2409 if (bts->gprs.mode == BTS_GPRS_NONE) {
2410 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2411 return CMD_WARNING;
2412 }
2413
2414 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
2415 return CMD_WARNING;
2416
2417 bts->gprs.cell.timer[idx] = val;
2418
2419 return CMD_SUCCESS;
2420}
2421
Harald Welte3055e332010-03-14 15:37:43 +08002422DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
2423 "gprs routing area <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02002424 GPRS_TEXT
Harald Welte557f3992012-08-16 23:23:50 +02002425 "GPRS Routing Area Code\n"
2426 "GPRS Routing Area Code\n"
2427 "GPRS Routing Area Code\n")
Harald Welte3055e332010-03-14 15:37:43 +08002428{
2429 struct gsm_bts *bts = vty->index;
2430
Harald Weltecb20b7a2010-04-18 15:51:20 +02002431 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002432 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2433 return CMD_WARNING;
2434 }
2435
Harald Welte3055e332010-03-14 15:37:43 +08002436 bts->gprs.rac = atoi(argv[0]);
2437
2438 return CMD_SUCCESS;
2439}
2440
Andreas Eversberga4fa21c2013-03-16 16:31:26 +01002441DEFUN(cfg_bts_gprs_net_ctrl_ord, cfg_bts_gprs_net_ctrl_ord_cmd,
2442 "gprs network-control-order (nc0|nc1|nc2)",
2443 GPRS_TEXT
2444 "GPRS Network Control Order\n"
2445 "MS controlled cell re-selection, no measurement reporting\n"
2446 "MS controlled cell re-selection, MS sends measurement reports\n"
2447 "Network controlled cell re-selection, MS sends measurement reports\n")
2448{
2449 struct gsm_bts *bts = vty->index;
2450
2451 if (bts->gprs.mode == BTS_GPRS_NONE) {
2452 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2453 return CMD_WARNING;
2454 }
2455
2456 bts->gprs.net_ctrl_ord = atoi(argv[0] + 2);
2457
2458 return CMD_SUCCESS;
2459}
2460
Harald Weltecb20b7a2010-04-18 15:51:20 +02002461DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
2462 "gprs mode (none|gprs|egprs)",
Harald Welte9e002452010-05-11 21:53:49 +02002463 GPRS_TEXT
2464 "GPRS Mode for this BTS\n"
2465 "GPRS Disabled on this BTS\n"
2466 "GPRS Enabled on this BTS\n"
2467 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welte410575a2010-03-14 23:30:30 +08002468{
2469 struct gsm_bts *bts = vty->index;
Harald Welte20e275a2010-06-14 22:44:42 +02002470 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0]);
Harald Welte410575a2010-03-14 23:30:30 +08002471
Harald Welte20e275a2010-06-14 22:44:42 +02002472 if (mode != BTS_GPRS_NONE &&
2473 !gsm_bts_has_feature(bts, BTS_FEAT_GPRS)) {
2474 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2475 VTY_NEWLINE);
2476 return CMD_WARNING;
2477 }
2478 if (mode == BTS_GPRS_EGPRS &&
2479 !gsm_bts_has_feature(bts, BTS_FEAT_EGPRS)) {
2480 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2481 VTY_NEWLINE);
2482 return CMD_WARNING;
2483 }
2484
2485 bts->gprs.mode = mode;
Harald Welte410575a2010-03-14 23:30:30 +08002486
2487 return CMD_SUCCESS;
2488}
2489
Harald Welted8acf142010-07-30 11:50:09 +02002490#define SI_TEXT "System Information Messages\n"
2491#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)"
2492#define SI_TYPE_HELP "System Information Type 1\n" \
2493 "System Information Type 2\n" \
2494 "System Information Type 3\n" \
2495 "System Information Type 4\n" \
2496 "System Information Type 5\n" \
2497 "System Information Type 6\n" \
2498 "System Information Type 7\n" \
2499 "System Information Type 8\n" \
2500 "System Information Type 9\n" \
2501 "System Information Type 10\n" \
2502 "System Information Type 13\n" \
2503 "System Information Type 16\n" \
2504 "System Information Type 17\n" \
2505 "System Information Type 18\n" \
2506 "System Information Type 19\n" \
2507 "System Information Type 20\n" \
2508 "System Information Type 2bis\n" \
2509 "System Information Type 2ter\n" \
2510 "System Information Type 2quater\n" \
2511 "System Information Type 5bis\n" \
2512 "System Information Type 5ter\n"
2513
2514DEFUN(cfg_bts_si_mode, cfg_bts_si_mode_cmd,
2515 "system-information " SI_TYPE_TEXT " mode (static|computed)",
2516 SI_TEXT SI_TYPE_HELP
2517 "System Information Mode\n"
2518 "Static user-specified\n"
2519 "Dynamic, BSC-computed\n")
2520{
2521 struct gsm_bts *bts = vty->index;
2522 int type;
2523
2524 type = get_string_value(osmo_sitype_strs, argv[0]);
2525 if (type < 0) {
2526 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2527 return CMD_WARNING;
2528 }
2529
2530 if (!strcmp(argv[1], "static"))
2531 bts->si_mode_static |= (1 << type);
2532 else
2533 bts->si_mode_static &= ~(1 << type);
2534
2535 return CMD_SUCCESS;
2536}
2537
2538DEFUN(cfg_bts_si_static, cfg_bts_si_static_cmd,
2539 "system-information " SI_TYPE_TEXT " static HEXSTRING",
2540 SI_TEXT SI_TYPE_HELP
2541 "Static System Information filling\n"
2542 "Static user-specified SI content in HEX notation\n")
2543{
2544 struct gsm_bts *bts = vty->index;
2545 int rc, type;
2546
2547 type = get_string_value(osmo_sitype_strs, argv[0]);
2548 if (type < 0) {
2549 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2550 return CMD_WARNING;
2551 }
2552
2553 if (!(bts->si_mode_static & (1 << type))) {
2554 vty_out(vty, "SI Type %s is not configured in static mode%s",
2555 get_value_string(osmo_sitype_strs, type), VTY_NEWLINE);
2556 return CMD_WARNING;
2557 }
2558
Harald Welte9f09ac32010-07-30 11:53:18 +02002559 /* Fill buffer with padding pattern */
2560 memset(bts->si_buf[type], 0x2b, sizeof(bts->si_buf[type]));
2561
2562 /* Parse the user-specified SI in hex format, [partially] overwriting padding */
Pablo Neira Ayusob1d5a692011-05-07 12:12:48 +02002563 rc = osmo_hexparse(argv[1], bts->si_buf[type], sizeof(bts->si_buf[0]));
Harald Welted8acf142010-07-30 11:50:09 +02002564 if (rc < 0 || rc > sizeof(bts->si_buf[0])) {
2565 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
2566 return CMD_WARNING;
2567 }
2568
2569 /* Mark this SI as present */
2570 bts->si_valid |= (1 << type);
2571
2572 return CMD_SUCCESS;
2573}
2574
Harald Welteca46eff2011-01-11 23:44:56 +01002575DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
Harald Weltef989b782011-02-15 11:43:27 +01002576 "neighbor-list mode (automatic|manual|manual-si5)",
Harald Welteca46eff2011-01-11 23:44:56 +01002577 "Neighbor List\n" "Mode of Neighbor List generation\n"
Harald Weltef989b782011-02-15 11:43:27 +01002578 "Automatically from all BTS in this OpenBSC\n" "Manual\n"
2579 "Manual with different lists for SI2 and SI5\n")
Harald Welteca46eff2011-01-11 23:44:56 +01002580{
2581 struct gsm_bts *bts = vty->index;
Harald Weltef989b782011-02-15 11:43:27 +01002582 int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
Harald Welteca46eff2011-01-11 23:44:56 +01002583
Harald Weltef989b782011-02-15 11:43:27 +01002584 switch (mode) {
2585 case NL_MODE_MANUAL_SI5SEP:
2586 case NL_MODE_MANUAL:
Harald Welteca46eff2011-01-11 23:44:56 +01002587 /* make sure we clear the current list when switching to
2588 * manual mode */
2589 if (bts->neigh_list_manual_mode == 0)
2590 memset(&bts->si_common.data.neigh_list, 0,
2591 sizeof(bts->si_common.data.neigh_list));
Harald Weltef989b782011-02-15 11:43:27 +01002592 break;
2593 default:
2594 break;
2595 }
2596
2597 bts->neigh_list_manual_mode = mode;
Harald Welteca46eff2011-01-11 23:44:56 +01002598
2599 return CMD_SUCCESS;
2600}
2601
2602DEFUN(cfg_bts_neigh, cfg_bts_neigh_cmd,
Harald Welte09e4fad2012-01-29 13:24:12 +01002603 "neighbor-list (add|del) arfcn <0-1023>",
Harald Welteca46eff2011-01-11 23:44:56 +01002604 "Neighbor List\n" "Add to manual neighbor list\n"
2605 "Delete from manual neighbor list\n" "ARFCN of neighbor\n"
2606 "ARFCN of neighbor\n")
2607{
2608 struct gsm_bts *bts = vty->index;
2609 struct bitvec *bv = &bts->si_common.neigh_list;
2610 uint16_t arfcn = atoi(argv[1]);
2611
2612 if (!bts->neigh_list_manual_mode) {
2613 vty_out(vty, "%% Cannot configure neighbor list in "
2614 "automatic mode%s", VTY_NEWLINE);
2615 return CMD_WARNING;
2616 }
2617
2618 if (!strcmp(argv[0], "add"))
2619 bitvec_set_bit_pos(bv, arfcn, 1);
2620 else
2621 bitvec_set_bit_pos(bv, arfcn, 0);
2622
2623 return CMD_SUCCESS;
2624}
2625
Harald Weltef989b782011-02-15 11:43:27 +01002626DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
Harald Welte09e4fad2012-01-29 13:24:12 +01002627 "si5 neighbor-list (add|del) arfcn <0-1023>",
Harald Welte557f3992012-08-16 23:23:50 +02002628 "SI5 Neighbor List\n"
Harald Weltef989b782011-02-15 11:43:27 +01002629 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
2630 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
2631 "ARFCN of neighbor\n")
2632{
2633 struct gsm_bts *bts = vty->index;
2634 struct bitvec *bv = &bts->si_common.si5_neigh_list;
2635 uint16_t arfcn = atoi(argv[1]);
2636
2637 if (!bts->neigh_list_manual_mode) {
2638 vty_out(vty, "%% Cannot configure neighbor list in "
2639 "automatic mode%s", VTY_NEWLINE);
2640 return CMD_WARNING;
2641 }
2642
2643 if (!strcmp(argv[0], "add"))
2644 bitvec_set_bit_pos(bv, arfcn, 1);
2645 else
2646 bitvec_set_bit_pos(bv, arfcn, 0);
2647
2648 return CMD_SUCCESS;
2649}
Harald Welted8acf142010-07-30 11:50:09 +02002650
Holger Hans Peter Freyther10799162012-07-20 10:27:31 +02002651#define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"
2652
2653DEFUN(cfg_bts_excl_rf_lock,
2654 cfg_bts_excl_rf_lock_cmd,
2655 "rf-lock-exclude",
2656 EXCL_RFLOCK_STR)
2657{
2658 struct gsm_bts *bts = vty->index;
2659 bts->excl_from_rf_lock = 1;
2660 return CMD_SUCCESS;
2661}
2662
2663DEFUN(cfg_bts_no_excl_rf_lock,
2664 cfg_bts_no_excl_rf_lock_cmd,
2665 "no rf-lock-exclude",
2666 NO_STR EXCL_RFLOCK_STR)
2667{
2668 struct gsm_bts *bts = vty->index;
2669 bts->excl_from_rf_lock = 0;
2670 return CMD_SUCCESS;
2671}
2672
Jacob Erlbeck8f8e5bf2014-01-16 11:02:14 +01002673#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
2674
2675DEFUN(cfg_bts_force_comb_si,
2676 cfg_bts_force_comb_si_cmd,
2677 "force-combined-si",
2678 FORCE_COMB_SI_STR)
2679{
2680 struct gsm_bts *bts = vty->index;
2681 bts->force_combined_si = 1;
2682 return CMD_SUCCESS;
2683}
2684
2685DEFUN(cfg_bts_no_force_comb_si,
2686 cfg_bts_no_force_comb_si_cmd,
2687 "no force-combined-si",
2688 NO_STR FORCE_COMB_SI_STR)
2689{
2690 struct gsm_bts *bts = vty->index;
2691 bts->force_combined_si = 0;
2692 return CMD_SUCCESS;
2693}
2694
Andreas Eversberg976493b2013-12-07 18:32:28 +01002695static void _get_codec_from_arg(struct vty *vty, int argc, const char *argv[])
2696{
2697 struct gsm_bts *bts = vty->index;
2698 struct bts_codec_conf *codec = &bts->codec;
2699 int i;
2700
2701 codec->hr = 0;
2702 codec->efr = 0;
2703 codec->amr = 0;
2704 for (i = 0; i < argc; i++) {
2705 if (!strcmp(argv[i], "hr"))
2706 codec->hr = 1;
2707 if (!strcmp(argv[i], "efr"))
2708 codec->efr = 1;
2709 if (!strcmp(argv[i], "amr"))
2710 codec->amr = 1;
2711 }
2712}
2713
2714#define CODEC_PAR_STR " (hr|efr|amr)"
2715#define CODEC_HELP_STR "Half Rate\n" \
2716 "Enhanced Full Rate\nAdaptive Multirate\n"
2717
2718DEFUN(cfg_bts_codec0, cfg_bts_codec0_cmd,
2719 "codec-support fr",
2720 "Codec Support settings\nFullrate\n")
2721{
2722 _get_codec_from_arg(vty, 0, argv);
2723 return CMD_SUCCESS;
2724}
2725
2726DEFUN(cfg_bts_codec1, cfg_bts_codec1_cmd,
2727 "codec-support fr" CODEC_PAR_STR,
2728 "Codec Support settings\nFullrate\n"
2729 CODEC_HELP_STR)
2730{
2731 _get_codec_from_arg(vty, 1, argv);
2732 return CMD_SUCCESS;
2733}
2734
2735DEFUN(cfg_bts_codec2, cfg_bts_codec2_cmd,
2736 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR,
2737 "Codec Support settings\nFullrate\n"
2738 CODEC_HELP_STR CODEC_HELP_STR)
2739{
2740 _get_codec_from_arg(vty, 2, argv);
2741 return CMD_SUCCESS;
2742}
2743
2744DEFUN(cfg_bts_codec3, cfg_bts_codec3_cmd,
2745 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
2746 "Codec Support settings\nFullrate\n"
2747 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
2748{
2749 _get_codec_from_arg(vty, 3, argv);
2750 return CMD_SUCCESS;
2751}
2752
2753DEFUN(cfg_bts_codec4, cfg_bts_codec4_cmd,
2754 "codec-support fr" CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR CODEC_PAR_STR,
2755 "Codec Support settings\nFullrate\n"
2756 CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR CODEC_HELP_STR)
2757{
2758 _get_codec_from_arg(vty, 4, argv);
2759 return CMD_SUCCESS;
2760}
2761
Harald Welte9e002452010-05-11 21:53:49 +02002762#define TRX_TEXT "Radio Transceiver\n"
Harald Welte3e774612009-08-10 13:48:16 +02002763
Harald Welte59b04682009-06-10 05:40:52 +08002764/* per TRX configuration */
2765DEFUN(cfg_trx,
2766 cfg_trx_cmd,
Harald Welte2af06cb2012-08-17 12:50:14 +02002767 "trx <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02002768 TRX_TEXT
Harald Welte59b04682009-06-10 05:40:52 +08002769 "Select a TRX to configure")
2770{
2771 int trx_nr = atoi(argv[0]);
2772 struct gsm_bts *bts = vty->index;
2773 struct gsm_bts_trx *trx;
2774
Harald Weltee712a5f2009-06-21 16:17:15 +02002775 if (trx_nr > bts->num_trx) {
2776 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
2777 bts->num_trx, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +08002778 return CMD_WARNING;
Harald Weltee712a5f2009-06-21 16:17:15 +02002779 } else if (trx_nr == bts->num_trx) {
2780 /* we need to allocate a new one */
2781 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02002782 } else
Harald Weltee712a5f2009-06-21 16:17:15 +02002783 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02002784
Harald Weltee712a5f2009-06-21 16:17:15 +02002785 if (!trx)
2786 return CMD_WARNING;
Harald Welte59b04682009-06-10 05:40:52 +08002787
2788 vty->index = trx;
Harald Welte8791dac2010-05-14 17:59:53 +02002789 vty->index_sub = &trx->description;
Harald Welte59b04682009-06-10 05:40:52 +08002790 vty->node = TRX_NODE;
2791
2792 return CMD_SUCCESS;
2793}
2794
2795DEFUN(cfg_trx_arfcn,
2796 cfg_trx_arfcn_cmd,
Harald Welte09e4fad2012-01-29 13:24:12 +01002797 "arfcn <0-1023>",
Harald Welte764c8e12012-08-17 09:57:25 +02002798 "Set the ARFCN for this TRX\n"
2799 "Absolute Radio Frequency Channel Number\n")
Harald Welte59b04682009-06-10 05:40:52 +08002800{
2801 int arfcn = atoi(argv[0]);
2802 struct gsm_bts_trx *trx = vty->index;
2803
2804 /* FIXME: check if this ARFCN is supported by this TRX */
2805
2806 trx->arfcn = arfcn;
2807
2808 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
2809 /* FIXME: use OML layer to update the ARFCN */
2810 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
2811
2812 return CMD_SUCCESS;
2813}
2814
Harald Welte (local)b709bfe2009-12-27 20:56:38 +01002815DEFUN(cfg_trx_nominal_power,
2816 cfg_trx_nominal_power_cmd,
2817 "nominal power <0-100>",
Harald Welte557f3992012-08-16 23:23:50 +02002818 "Nominal TRX RF Power in dBm\n"
2819 "Nominal TRX RF Power in dBm\n"
2820 "Nominal TRX RF Power in dBm\n")
Harald Welte (local)b709bfe2009-12-27 20:56:38 +01002821{
2822 struct gsm_bts_trx *trx = vty->index;
2823
2824 trx->nominal_power = atoi(argv[0]);
2825
2826 return CMD_SUCCESS;
2827}
2828
Harald Welte91afe4c2009-06-20 18:15:19 +02002829DEFUN(cfg_trx_max_power_red,
2830 cfg_trx_max_power_red_cmd,
2831 "max_power_red <0-100>",
Harald Welte557f3992012-08-16 23:23:50 +02002832 "Reduction of maximum BS RF Power (relative to nominal power)\n"
Harald Welte91afe4c2009-06-20 18:15:19 +02002833 "Reduction of maximum BS RF Power in dB\n")
2834{
2835 int maxpwr_r = atoi(argv[0]);
2836 struct gsm_bts_trx *trx = vty->index;
Harald Welte01acd742009-11-18 09:20:22 +01002837 int upper_limit = 24; /* default 12.21 max power red. */
Harald Welte91afe4c2009-06-20 18:15:19 +02002838
2839 /* FIXME: check if our BTS type supports more than 12 */
2840 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
2841 vty_out(vty, "%% Power %d dB is not in the valid range%s",
2842 maxpwr_r, VTY_NEWLINE);
2843 return CMD_WARNING;
2844 }
2845 if (maxpwr_r & 1) {
2846 vty_out(vty, "%% Power %d dB is not an even value%s",
2847 maxpwr_r, VTY_NEWLINE);
2848 return CMD_WARNING;
2849 }
2850
2851 trx->max_power_red = maxpwr_r;
2852
2853 /* FIXME: make sure we update this using OML */
2854
2855 return CMD_SUCCESS;
2856}
2857
Harald Welte62868882009-08-08 16:12:58 +02002858DEFUN(cfg_trx_rsl_e1,
2859 cfg_trx_rsl_e1_cmd,
2860 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welte557f3992012-08-16 23:23:50 +02002861 "RSL Parameters\n"
2862 "E1/T1 interface to be used for RSL\n"
2863 "E1/T1 interface to be used for RSL\n"
2864 "E1/T1 Line Number to be used for RSL\n"
2865 "E1/T1 Timeslot to be used for RSL\n"
2866 "E1/T1 Timeslot to be used for RSL\n"
2867 "E1/T1 Sub-slot to be used for RSL\n"
2868 "E1/T1 Sub-slot 0 is to be used for RSL\n"
2869 "E1/T1 Sub-slot 1 is to be used for RSL\n"
2870 "E1/T1 Sub-slot 2 is to be used for RSL\n"
2871 "E1/T1 Sub-slot 3 is to be used for RSL\n"
2872 "E1/T1 full timeslot is to be used for RSL\n")
Harald Welte62868882009-08-08 16:12:58 +02002873{
2874 struct gsm_bts_trx *trx = vty->index;
2875
2876 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
2877
2878 return CMD_SUCCESS;
2879}
2880
2881DEFUN(cfg_trx_rsl_e1_tei,
2882 cfg_trx_rsl_e1_tei_cmd,
2883 "rsl e1 tei <0-63>",
Harald Welte557f3992012-08-16 23:23:50 +02002884 "RSL Parameters\n"
2885 "Set the TEI to be used for RSL\n"
2886 "Set the TEI to be used for RSL\n"
2887 "TEI to be used for RSL\n")
Harald Welte62868882009-08-08 16:12:58 +02002888{
2889 struct gsm_bts_trx *trx = vty->index;
2890
2891 trx->rsl_tei = atoi(argv[0]);
2892
2893 return CMD_SUCCESS;
2894}
2895
Holger Hans Peter Freyther1c8b4802009-11-11 11:54:24 +01002896DEFUN(cfg_trx_rf_locked,
2897 cfg_trx_rf_locked_cmd,
2898 "rf_locked (0|1)",
Harald Welte557f3992012-08-16 23:23:50 +02002899 "Set or unset the RF Locking (Turn off RF of the TRX)\n"
2900 "TRX is NOT RF locked (active)\n"
2901 "TRX is RF locked (turned off)\n")
Holger Hans Peter Freyther1c8b4802009-11-11 11:54:24 +01002902{
2903 int locked = atoi(argv[0]);
2904 struct gsm_bts_trx *trx = vty->index;
2905
2906 gsm_trx_lock_rf(trx, locked);
2907 return CMD_SUCCESS;
2908}
Harald Welte62868882009-08-08 16:12:58 +02002909
Harald Welte59b04682009-06-10 05:40:52 +08002910/* per TS configuration */
2911DEFUN(cfg_ts,
2912 cfg_ts_cmd,
Harald Welte62868882009-08-08 16:12:58 +02002913 "timeslot <0-7>",
Harald Welte557f3992012-08-16 23:23:50 +02002914 "Select a Timeslot to configure\n"
2915 "Timeslot number\n")
Harald Welte59b04682009-06-10 05:40:52 +08002916{
2917 int ts_nr = atoi(argv[0]);
2918 struct gsm_bts_trx *trx = vty->index;
2919 struct gsm_bts_trx_ts *ts;
2920
2921 if (ts_nr >= TRX_NR_TS) {
2922 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
2923 TRX_NR_TS, VTY_NEWLINE);
2924 return CMD_WARNING;
2925 }
2926
2927 ts = &trx->ts[ts_nr];
2928
2929 vty->index = ts;
2930 vty->node = TS_NODE;
2931
2932 return CMD_SUCCESS;
2933}
2934
Harald Welte3ffe1b32009-08-07 00:25:23 +02002935DEFUN(cfg_ts_pchan,
2936 cfg_ts_pchan_cmd,
Harald Welte2addf852012-08-17 12:42:06 +02002937 "phys_chan_config PCHAN", /* dynamically generated! */
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +01002938 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte2addf852012-08-17 12:42:06 +02002939{
2940 struct gsm_bts_trx_ts *ts = vty->index;
2941 int pchanc;
2942
2943 pchanc = gsm_pchan_parse(argv[0]);
2944 if (pchanc < 0)
2945 return CMD_WARNING;
2946
2947 ts->pchan = pchanc;
2948
2949 return CMD_SUCCESS;
2950}
2951
2952/* used for backwards compatibility with old config files that still
2953 * have uppercase pchan type names */
2954DEFUN_HIDDEN(cfg_ts_pchan_compat,
2955 cfg_ts_pchan_compat_cmd,
Harald Welte3ffe1b32009-08-07 00:25:23 +02002956 "phys_chan_config PCHAN",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +01002957 "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")
Harald Welte3ffe1b32009-08-07 00:25:23 +02002958{
2959 struct gsm_bts_trx_ts *ts = vty->index;
2960 int pchanc;
2961
2962 pchanc = gsm_pchan_parse(argv[0]);
2963 if (pchanc < 0)
2964 return CMD_WARNING;
2965
2966 ts->pchan = pchanc;
2967
2968 return CMD_SUCCESS;
2969}
2970
Harald Welte2addf852012-08-17 12:42:06 +02002971
2972
Harald Welte85771a42011-05-30 12:09:13 +02002973DEFUN(cfg_ts_tsc,
2974 cfg_ts_tsc_cmd,
2975 "training_sequence_code <0-7>",
Harald Welte557f3992012-08-16 23:23:50 +02002976 "Training Sequence Code of the Timeslot\n" "TSC\n")
Harald Welte85771a42011-05-30 12:09:13 +02002977{
2978 struct gsm_bts_trx_ts *ts = vty->index;
2979
2980 ts->tsc = atoi(argv[0]);
2981
2982 return CMD_SUCCESS;
2983}
2984
Harald Weltea42a93f2010-06-14 22:26:10 +02002985#define HOPPING_STR "Configure frequency hopping\n"
2986
2987DEFUN(cfg_ts_hopping,
2988 cfg_ts_hopping_cmd,
2989 "hopping enabled (0|1)",
2990 HOPPING_STR "Enable or disable frequency hopping\n"
2991 "Disable frequency hopping\n" "Enable frequency hopping\n")
2992{
2993 struct gsm_bts_trx_ts *ts = vty->index;
Harald Welte059c1ef2010-06-14 22:47:37 +02002994 int enabled = atoi(argv[0]);
Harald Weltea42a93f2010-06-14 22:26:10 +02002995
Harald Welte059c1ef2010-06-14 22:47:37 +02002996 if (enabled && !gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_HOPPING)) {
2997 vty_out(vty, "BTS model does not support hopping%s",
2998 VTY_NEWLINE);
2999 return CMD_WARNING;
3000 }
3001
3002 ts->hopping.enabled = enabled;
Harald Weltea42a93f2010-06-14 22:26:10 +02003003
3004 return CMD_SUCCESS;
3005}
3006
Harald Welte67104d12009-09-12 13:05:33 +02003007DEFUN(cfg_ts_hsn,
3008 cfg_ts_hsn_cmd,
Harald Weltea42a93f2010-06-14 22:26:10 +02003009 "hopping sequence-number <0-63>",
3010 HOPPING_STR
Harald Welte557f3992012-08-16 23:23:50 +02003011 "Which hopping sequence to use for this channel\n"
3012 "Hopping Sequence Number (HSN)\n")
Harald Welte67104d12009-09-12 13:05:33 +02003013{
3014 struct gsm_bts_trx_ts *ts = vty->index;
3015
3016 ts->hopping.hsn = atoi(argv[0]);
3017
3018 return CMD_SUCCESS;
3019}
3020
3021DEFUN(cfg_ts_maio,
3022 cfg_ts_maio_cmd,
3023 "hopping maio <0-63>",
Harald Weltea42a93f2010-06-14 22:26:10 +02003024 HOPPING_STR
Harald Welte557f3992012-08-16 23:23:50 +02003025 "Which hopping MAIO to use for this channel\n"
3026 "Mobile Allocation Index Offset (MAIO)\n")
Harald Welte67104d12009-09-12 13:05:33 +02003027{
3028 struct gsm_bts_trx_ts *ts = vty->index;
3029
3030 ts->hopping.maio = atoi(argv[0]);
3031
3032 return CMD_SUCCESS;
3033}
3034
3035DEFUN(cfg_ts_arfcn_add,
3036 cfg_ts_arfcn_add_cmd,
3037 "hopping arfcn add <0-1023>",
Harald Weltea42a93f2010-06-14 22:26:10 +02003038 HOPPING_STR "Configure hopping ARFCN list\n"
3039 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte67104d12009-09-12 13:05:33 +02003040{
3041 struct gsm_bts_trx_ts *ts = vty->index;
3042 int arfcn = atoi(argv[0]);
3043
Harald Weltea42a93f2010-06-14 22:26:10 +02003044 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
3045
Harald Welte67104d12009-09-12 13:05:33 +02003046 return CMD_SUCCESS;
3047}
3048
3049DEFUN(cfg_ts_arfcn_del,
3050 cfg_ts_arfcn_del_cmd,
3051 "hopping arfcn del <0-1023>",
Harald Weltea42a93f2010-06-14 22:26:10 +02003052 HOPPING_STR "Configure hopping ARFCN list\n"
3053 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte67104d12009-09-12 13:05:33 +02003054{
3055 struct gsm_bts_trx_ts *ts = vty->index;
3056 int arfcn = atoi(argv[0]);
3057
Harald Weltea42a93f2010-06-14 22:26:10 +02003058 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
3059
Harald Welte67104d12009-09-12 13:05:33 +02003060 return CMD_SUCCESS;
3061}
3062
Harald Welte3ffe1b32009-08-07 00:25:23 +02003063DEFUN(cfg_ts_e1_subslot,
3064 cfg_ts_e1_subslot_cmd,
Harald Welte62868882009-08-08 16:12:58 +02003065 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welte557f3992012-08-16 23:23:50 +02003066 "E1/T1 channel connected to this on-air timeslot\n"
3067 "E1/T1 channel connected to this on-air timeslot\n"
3068 "E1/T1 line connected to this on-air timeslot\n"
Harald Weltefa2015f2012-08-17 09:52:03 +02003069 "E1/T1 timeslot connected to this on-air timeslot\n"
3070 "E1/T1 timeslot connected to this on-air timeslot\n"
Harald Welte557f3992012-08-16 23:23:50 +02003071 "E1/T1 sub-slot connected to this on-air timeslot\n"
3072 "E1/T1 sub-slot 0 connected to this on-air timeslot\n"
3073 "E1/T1 sub-slot 1 connected to this on-air timeslot\n"
3074 "E1/T1 sub-slot 2 connected to this on-air timeslot\n"
3075 "E1/T1 sub-slot 3 connected to this on-air timeslot\n"
3076 "Full E1/T1 timeslot connected to this on-air timeslot\n")
Harald Welte3ffe1b32009-08-07 00:25:23 +02003077{
3078 struct gsm_bts_trx_ts *ts = vty->index;
3079
Harald Welte62868882009-08-08 16:12:58 +02003080 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Welte3ffe1b32009-08-07 00:25:23 +02003081
3082 return CMD_SUCCESS;
3083}
Harald Welte59b04682009-06-10 05:40:52 +08003084
Harald Weltea5b1dae2010-05-16 21:47:13 +02003085void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
3086{
3087 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
Pablo Neira Ayuso1c450742011-05-06 12:13:10 +02003088 osmo_counter_get(net->stats.chreq.total),
3089 osmo_counter_get(net->stats.chreq.no_channel), VTY_NEWLINE);
Harald Weltea5b1dae2010-05-16 21:47:13 +02003090 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
Pablo Neira Ayuso1c450742011-05-06 12:13:10 +02003091 osmo_counter_get(net->stats.chan.rf_fail),
3092 osmo_counter_get(net->stats.chan.rll_err), VTY_NEWLINE);
Harald Weltea5b1dae2010-05-16 21:47:13 +02003093 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
Pablo Neira Ayuso1c450742011-05-06 12:13:10 +02003094 osmo_counter_get(net->stats.paging.attempted),
3095 osmo_counter_get(net->stats.paging.completed),
3096 osmo_counter_get(net->stats.paging.expired), VTY_NEWLINE);
Harald Weltea5b1dae2010-05-16 21:47:13 +02003097 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
Pablo Neira Ayuso1c450742011-05-06 12:13:10 +02003098 osmo_counter_get(net->stats.bts.oml_fail),
3099 osmo_counter_get(net->stats.bts.rsl_fail), VTY_NEWLINE);
Harald Weltea5b1dae2010-05-16 21:47:13 +02003100}
3101
Harald Welte682ee5f2010-05-16 22:02:16 +02003102DEFUN(logging_fltr_imsi,
3103 logging_fltr_imsi_cmd,
3104 "logging filter imsi IMSI",
3105 LOGGING_STR FILTER_STR
3106 "Filter log messages by IMSI\n" "IMSI to be used as filter\n")
3107{
Harald Welte58bef962011-02-18 21:10:05 +01003108 struct log_target *tgt = osmo_log_vty2tgt(vty);
Harald Welte682ee5f2010-05-16 22:02:16 +02003109
Harald Welte58bef962011-02-18 21:10:05 +01003110 if (!tgt)
Harald Welte682ee5f2010-05-16 22:02:16 +02003111 return CMD_WARNING;
Harald Welte682ee5f2010-05-16 22:02:16 +02003112
Harald Welte58bef962011-02-18 21:10:05 +01003113 log_set_imsi_filter(tgt, argv[0]);
Harald Welte682ee5f2010-05-16 22:02:16 +02003114 return CMD_SUCCESS;
3115}
3116
Harald Welte58bef962011-02-18 21:10:05 +01003117
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02003118DEFUN(drop_bts,
3119 drop_bts_cmd,
Holger Hans Peter Freythere4ac0e42010-04-11 12:46:45 +02003120 "drop bts connection <0-65535> (oml|rsl)",
Harald Welte557f3992012-08-16 23:23:50 +02003121 "Debug/Simulation command to drop Abis/IP BTS\n"
3122 "Debug/Simulation command to drop Abis/IP BTS\n"
3123 "Debug/Simulation command to drop Abis/IP BTS\n"
3124 "BTS NR\n" "Drop OML Connection\n" "Drop RSL Connection\n")
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02003125{
3126 struct gsm_network *gsmnet;
3127 struct gsm_bts_trx *trx;
3128 struct gsm_bts *bts;
3129 unsigned int bts_nr;
3130
3131 gsmnet = gsmnet_from_vty(vty);
3132
3133 bts_nr = atoi(argv[0]);
3134 if (bts_nr >= gsmnet->num_bts) {
3135 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
3136 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
3137 return CMD_WARNING;
3138 }
3139
3140 bts = gsm_bts_num(gsmnet, bts_nr);
3141 if (!bts) {
3142 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
3143 return CMD_WARNING;
3144 }
3145
3146 if (!is_ipaccess_bts(bts)) {
3147 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
3148 return CMD_WARNING;
3149 }
3150
3151
3152 /* close all connections */
3153 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freyther03f17d02010-11-15 20:29:46 +01003154 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02003155 } else if (strcmp(argv[1], "rsl") == 0) {
3156 /* close all rsl connections */
3157 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freyther03f17d02010-11-15 20:29:46 +01003158 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02003159 }
3160 } else {
3161 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
3162 return CMD_WARNING;
3163 }
3164
3165 return CMD_SUCCESS;
3166}
3167
Harald Welte5213e992010-12-23 13:18:07 +01003168DEFUN(pdch_act, pdch_act_cmd,
3169 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
3170 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
3171 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
3172 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
3173 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
3174{
3175 struct gsm_bts *bts;
3176 struct gsm_bts_trx *trx;
3177 struct gsm_bts_trx_ts *ts;
3178 int bts_nr = atoi(argv[0]);
3179 int trx_nr = atoi(argv[1]);
3180 int ts_nr = atoi(argv[2]);
3181 int activate;
3182
3183 bts = gsm_bts_num(bsc_gsmnet, bts_nr);
3184 if (!bts) {
3185 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
3186 return CMD_WARNING;
3187 }
3188
3189 if (!is_ipaccess_bts(bts)) {
3190 vty_out(vty, "%% This command only works for ipaccess BTS%s",
3191 VTY_NEWLINE);
3192 return CMD_WARNING;
3193 }
3194
3195 trx = gsm_bts_trx_num(bts, trx_nr);
3196 if (!trx) {
3197 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
3198 return CMD_WARNING;
3199 }
3200
3201 ts = &trx->ts[ts_nr];
3202 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
3203 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
3204 "mode%s", ts_nr, VTY_NEWLINE);
3205 return CMD_WARNING;
3206 }
3207
3208 if (!strcmp(argv[3], "activate"))
3209 activate = 1;
3210 else
3211 activate = 0;
3212
3213 rsl_ipacc_pdch_activate(ts, activate);
3214
3215 return CMD_SUCCESS;
3216
3217}
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02003218
Harald Welte40152872010-05-16 20:52:23 +02003219extern int bsc_vty_init_extra(void);
Harald Welte10c29f62010-05-16 19:20:24 +02003220extern const char *openbsc_copyright;
Holger Hans Peter Freytherc48a2a12010-04-10 00:08:28 +02003221
Pablo Neira Ayuso36ad9a42011-03-09 13:36:32 +01003222int bsc_vty_init(const struct log_info *cat)
Harald Welte59b04682009-06-10 05:40:52 +08003223{
Harald Welte2addf852012-08-17 12:42:06 +02003224 cfg_ts_pchan_cmd.string =
3225 vty_cmd_string_from_valstr(tall_bsc_ctx,
3226 gsm_pchant_names,
3227 "phys_chan_config (", "|", ")",
3228 VTY_DO_LOWER);
3229 cfg_ts_pchan_cmd.doc =
3230 vty_cmd_string_from_valstr(tall_bsc_ctx,
3231 gsm_pchant_descs,
3232 "Physical Channel Combination\n",
3233 "\n", "", 0);
3234
Harald Welte85a77b12012-08-17 13:02:12 +02003235 cfg_bts_type_cmd.string =
3236 vty_cmd_string_from_valstr(tall_bsc_ctx,
3237 bts_type_names,
3238 "type (", "|", ")",
3239 VTY_DO_LOWER);
3240 cfg_bts_type_cmd.doc =
3241 vty_cmd_string_from_valstr(tall_bsc_ctx,
3242 bts_type_descs,
3243 "BTS Vendor/Type\n",
3244 "\n", "", 0);
3245
3246
Harald Welte7bc28f62010-05-12 16:10:35 +00003247 install_element_ve(&show_net_cmd);
3248 install_element_ve(&show_bts_cmd);
3249 install_element_ve(&show_trx_cmd);
3250 install_element_ve(&show_ts_cmd);
3251 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08003252 install_element_ve(&show_lchan_summary_cmd);
Harald Welte682ee5f2010-05-16 22:02:16 +02003253 install_element_ve(&logging_fltr_imsi_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08003254
Harald Welte7bc28f62010-05-12 16:10:35 +00003255 install_element_ve(&show_paging_cmd);
Holger Hans Peter Freyther35e6fbb2013-02-05 09:39:09 +01003256 install_element_ve(&show_paging_group_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08003257
Pablo Neira Ayuso36ad9a42011-03-09 13:36:32 +01003258 logging_vty_add_cmds(cat);
Harald Welte58bef962011-02-18 21:10:05 +01003259 install_element(CFG_LOG_NODE, &logging_fltr_imsi_cmd);
Holger Hans Peter Freytherc8d862e2009-12-22 22:32:51 +01003260
Harald Weltee87eb462009-08-07 13:29:14 +02003261 install_element(CONFIG_NODE, &cfg_net_cmd);
3262 install_node(&net_node, config_write_net);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01003263 vty_install_default(GSMNET_NODE);
Harald Welte62868882009-08-08 16:12:58 +02003264 install_element(GSMNET_NODE, &cfg_net_ncc_cmd);
Harald Weltee87eb462009-08-07 13:29:14 +02003265 install_element(GSMNET_NODE, &cfg_net_mnc_cmd);
3266 install_element(GSMNET_NODE, &cfg_net_name_short_cmd);
3267 install_element(GSMNET_NODE, &cfg_net_name_long_cmd);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02003268 install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd);
Harald Welte59936d72009-11-18 20:33:19 +01003269 install_element(GSMNET_NODE, &cfg_net_reject_cause_cmd);
Harald Weltecca253a2009-08-30 15:47:06 +09003270 install_element(GSMNET_NODE, &cfg_net_encryption_cmd);
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01003271 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Welte52af1952009-12-13 10:53:12 +01003272 install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd);
Harald Welte284ddba2009-12-14 17:49:15 +01003273 install_element(GSMNET_NODE, &cfg_net_mm_info_cmd);
Harald Welte0af9c9f2009-12-19 21:41:52 +01003274 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Weltea8062f12009-12-21 16:51:50 +01003275 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
3276 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
3277 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
3278 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
3279 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
3280 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01003281 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +01003282 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
3283 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
3284 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
3285 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
3286 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
3287 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
3288 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
3289 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
3290 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltee2aaf442010-12-23 22:53:50 +01003291 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +01003292 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther21d63ff2010-09-06 09:25:48 +08003293 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freyther68b21e12010-12-22 16:26:04 +01003294 install_element(GSMNET_NODE, &cfg_net_subscr_keep_cmd);
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +08003295 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Weltee87eb462009-08-07 13:29:14 +02003296
3297 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte97ceef92009-08-06 19:06:46 +02003298 install_node(&bts_node, config_write_bts);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01003299 vty_install_default(BTS_NODE);
Harald Welte59b04682009-06-10 05:40:52 +08003300 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte8791dac2010-05-14 17:59:53 +02003301 install_element(BTS_NODE, &cfg_description_cmd);
3302 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Welte91afe4c2009-06-20 18:15:19 +02003303 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +02003304 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08003305 install_element(BTS_NODE, &cfg_bts_lac_cmd);
3306 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte62868882009-08-08 16:12:58 +02003307 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08003308 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8b3c5952013-03-12 13:57:05 +01003309 install_element(BTS_NODE, &cfg_bts_rsl_ip_cmd);
Gus Bourgf9dc16b2011-12-02 10:18:17 +01003310 install_element(BTS_NODE, &cfg_bts_timezone_cmd);
Jacob Erlbeckcc0d8842013-09-17 13:59:29 +02003311 install_element(BTS_NODE, &cfg_bts_timezone_dst_cmd);
Gus Bourgf9dc16b2011-12-02 10:18:17 +01003312 install_element(BTS_NODE, &cfg_bts_no_timezone_cmd);
Sylvain Munautcb8e8432011-10-17 14:04:55 +02003313 install_element(BTS_NODE, &cfg_bts_nokia_site_skip_reset_cmd);
Andreas Eversbergac27b952013-12-05 13:25:06 +01003314 install_element(BTS_NODE, &cfg_bts_nokia_site_no_loc_rel_cnf_cmd);
Harald Welte25572872009-10-20 00:22:00 +02003315 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte62868882009-08-08 16:12:58 +02003316 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
3317 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte3e774612009-08-10 13:48:16 +02003318 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01003319 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
3320 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Andreas Eversberg14e12f22012-10-13 07:27:47 +02003321 install_element(BTS_NODE, &cfg_bts_chan_desc_att_cmd);
3322 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_pa_mfrms_cmd);
3323 install_element(BTS_NODE, &cfg_bts_chan_desc_bs_ag_blks_res_cmd);
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08003324 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
3325 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02003326 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +08003327 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Ivan Kluchnikov80d58432013-09-16 13:13:04 +04003328 install_element(BTS_NODE, &cfg_bts_rach_ac_class_cmd);
Harald Welte (local)cbd46102009-08-13 10:14:26 +02003329 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02003330 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Holger Hans Peter Freyther2fb8ebf2013-07-27 21:07:57 +02003331 install_element(BTS_NODE, &cfg_bts_no_per_loc_upd_cmd);
Harald Welteb761bf82009-12-12 18:17:25 +01003332 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
3333 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaut00d71462010-11-28 18:17:28 +01003334 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
3335 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
3336 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
3337 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
3338 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
3339 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Harald Weltecb20b7a2010-04-18 15:51:20 +02003340 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
Harald Weltea9251762010-05-11 23:50:21 +02003341 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte3055e332010-03-14 15:37:43 +08003342 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
Andreas Eversberga4fa21c2013-03-16 16:31:26 +01003343 install_element(BTS_NODE, &cfg_bts_gprs_net_ctrl_ord_cmd);
Harald Welte3055e332010-03-14 15:37:43 +08003344 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Weltea9251762010-05-11 23:50:21 +02003345 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Welte4a048c52010-03-22 11:48:36 +08003346 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte3055e332010-03-14 15:37:43 +08003347 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welte410575a2010-03-14 23:30:30 +08003348 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
3349 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
3350 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freyther3112f672010-09-06 10:11:25 +08003351 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welted8acf142010-07-30 11:50:09 +02003352 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
3353 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welteca46eff2011-01-11 23:44:56 +01003354 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
3355 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Weltef989b782011-02-15 11:43:27 +01003356 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Holger Hans Peter Freyther10799162012-07-20 10:27:31 +02003357 install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
3358 install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
Jacob Erlbeck8f8e5bf2014-01-16 11:02:14 +01003359 install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
3360 install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
Andreas Eversberg976493b2013-12-07 18:32:28 +01003361 install_element(BTS_NODE, &cfg_bts_codec0_cmd);
3362 install_element(BTS_NODE, &cfg_bts_codec1_cmd);
3363 install_element(BTS_NODE, &cfg_bts_codec2_cmd);
3364 install_element(BTS_NODE, &cfg_bts_codec3_cmd);
3365 install_element(BTS_NODE, &cfg_bts_codec4_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08003366
3367 install_element(BTS_NODE, &cfg_trx_cmd);
3368 install_node(&trx_node, dummy_config_write);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01003369 vty_install_default(TRX_NODE);
Harald Welte59b04682009-06-10 05:40:52 +08003370 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte8791dac2010-05-14 17:59:53 +02003371 install_element(TRX_NODE, &cfg_description_cmd);
3372 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)b709bfe2009-12-27 20:56:38 +01003373 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte7f597bc2009-06-20 22:36:12 +02003374 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte62868882009-08-08 16:12:58 +02003375 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
3376 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther1c8b4802009-11-11 11:54:24 +01003377 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08003378
3379 install_element(TRX_NODE, &cfg_ts_cmd);
3380 install_node(&ts_node, dummy_config_write);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01003381 vty_install_default(TS_NODE);
Harald Welte3ffe1b32009-08-07 00:25:23 +02003382 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Welte2addf852012-08-17 12:42:06 +02003383 install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);
Harald Welte85771a42011-05-30 12:09:13 +02003384 install_element(TS_NODE, &cfg_ts_tsc_cmd);
Harald Weltea42a93f2010-06-14 22:26:10 +02003385 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte67104d12009-09-12 13:05:33 +02003386 install_element(TS_NODE, &cfg_ts_hsn_cmd);
3387 install_element(TS_NODE, &cfg_ts_maio_cmd);
3388 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
3389 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Welte3ffe1b32009-08-07 00:25:23 +02003390 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08003391
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02003392 install_element(ENABLE_NODE, &drop_bts_cmd);
Harald Welte5213e992010-12-23 13:18:07 +01003393 install_element(ENABLE_NODE, &pdch_act_cmd);
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02003394
Harald Welte63b964e2010-05-31 16:40:40 +02003395 abis_nm_vty_init();
Harald Welte1d5a2062011-02-12 14:42:59 +01003396 abis_om2k_vty_init();
Harald Weltee76bea02011-02-05 13:54:41 +01003397 e1inp_vty_init();
Harald Welte63b964e2010-05-31 16:40:40 +02003398
Harald Welte40152872010-05-16 20:52:23 +02003399 bsc_vty_init_extra();
Harald Welte59b04682009-06-10 05:40:52 +08003400
3401 return 0;
3402}