blob: e68dffd193297b81a27b2f6fcc1f7cd7e04f8235 [file] [log] [blame]
Harald Welte68628e82009-03-10 12:17:57 +00001/* OpenBSC interface to quagga VTY */
Harald Welteaf387632010-03-14 23:30:30 +08002/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
Harald Welte68628e82009-03-10 12:17:57 +00003 * All Rights Reserved
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (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
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 */
20
21#include <stdlib.h>
22#include <unistd.h>
23#include <sys/types.h>
24
25#include <vty/command.h>
Harald Weltef9daefd2009-08-09 15:13:54 +020026#include <vty/buffer.h>
Harald Welte68628e82009-03-10 12:17:57 +000027#include <vty/vty.h>
28
29#include <arpa/inet.h>
30
Harald Weltedfe6c7d2010-02-20 16:24:02 +010031#include <osmocore/linuxlist.h>
Harald Welte68628e82009-03-10 12:17:57 +000032#include <openbsc/gsm_data.h>
Harald Welte68628e82009-03-10 12:17:57 +000033#include <openbsc/e1_input.h>
Harald Welte1bc77352009-03-10 19:47:51 +000034#include <openbsc/abis_nm.h>
Harald Weltedfe6c7d2010-02-20 16:24:02 +010035#include <osmocore/gsm_utils.h>
Harald Welteb908cb72009-12-22 13:09:29 +010036#include <openbsc/chan_alloc.h>
Harald Welte8387a492009-12-22 21:43:14 +010037#include <openbsc/meas_rep.h>
Harald Welte40f82892009-05-23 17:31:39 +000038#include <openbsc/db.h>
Harald Weltedfe6c7d2010-02-20 16:24:02 +010039#include <osmocore/talloc.h>
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +010040#include <openbsc/telnet_interface.h>
Holger Hans Peter Freyther3c712322010-04-06 11:55:37 +020041#include <openbsc/vty.h>
Harald Welte22229d62010-05-12 20:28:04 +020042#include <openbsc/gprs_ns.h>
Harald Welte68628e82009-03-10 12:17:57 +000043
Harald Welte1353f962010-05-16 19:20:24 +020044#include "../bscconfig.h"
45
Harald Welteea4647d2010-05-12 17:19:53 +000046/* FIXME: this should go to some common file */
47static const struct value_string gprs_ns_timer_strs[] = {
Harald Welte615e9562010-05-11 23:50:21 +020048 { 0, "tns-block" },
49 { 1, "tns-block-retries" },
50 { 2, "tns-reset" },
51 { 3, "tns-reset-retries" },
52 { 4, "tns-test" },
53 { 5, "tns-alive" },
54 { 6, "tns-alive-retries" },
55 { 0, NULL }
56};
57
Harald Welteea4647d2010-05-12 17:19:53 +000058static const struct value_string gprs_bssgp_cfg_strs[] = {
Harald Welte615e9562010-05-11 23:50:21 +020059 { 0, "blocking-timer" },
60 { 1, "blocking-retries" },
61 { 2, "unblocking-retries" },
62 { 3, "reset-timer" },
63 { 4, "reset-retries" },
64 { 5, "suspend-timer" },
65 { 6, "suspend-retries" },
66 { 7, "resume-timer" },
67 { 8, "resume-retries" },
68 { 9, "capability-update-timer" },
69 { 10, "capability-update-retries" },
70 { 0, NULL }
71};
72
Harald Welte5013b2a2009-08-07 13:29:14 +020073struct cmd_node net_node = {
74 GSMNET_NODE,
75 "%s(network)#",
76 1,
77};
78
Harald Welte68628e82009-03-10 12:17:57 +000079struct cmd_node bts_node = {
80 BTS_NODE,
81 "%s(bts)#",
82 1,
83};
84
85struct cmd_node trx_node = {
86 TRX_NODE,
87 "%s(trx)#",
88 1,
89};
90
91struct cmd_node ts_node = {
92 TS_NODE,
93 "%s(ts)#",
94 1,
95};
96
Harald Weltedcccb182010-05-16 20:52:23 +020097struct gsm_network *gsmnet_from_vty(struct vty *v)
98{
99 struct telnet_connection *conn = v->priv;
100 return (struct gsm_network *) conn->priv;
101}
102
Harald Welte68628e82009-03-10 12:17:57 +0000103static int dummy_config_write(struct vty *v)
104{
105 return CMD_SUCCESS;
106}
107
108static void net_dump_nmstate(struct vty *vty, struct gsm_nm_state *nms)
109{
Harald Welte1bc77352009-03-10 19:47:51 +0000110 vty_out(vty,"Oper '%s', Admin %u, Avail '%s'%s",
111 nm_opstate_name(nms->operational), nms->administrative,
112 nm_avail_name(nms->availability), VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000113}
114
Harald Welteb908cb72009-12-22 13:09:29 +0100115static void dump_pchan_load_vty(struct vty *vty, char *prefix,
116 const struct pchan_load *pl)
117{
118 int i;
119
120 for (i = 0; i < ARRAY_SIZE(pl->pchan); i++) {
121 const struct load_counter *lc = &pl->pchan[i];
122 unsigned int percent;
123
124 if (lc->total == 0)
125 continue;
126
127 percent = (lc->used * 100) / lc->total;
128
129 vty_out(vty, "%s%20s: %3u%% (%u/%u)%s", prefix,
130 gsm_pchan_name(i), percent, lc->used, lc->total,
131 VTY_NEWLINE);
132 }
133}
134
Harald Welte68628e82009-03-10 12:17:57 +0000135static void net_dump_vty(struct vty *vty, struct gsm_network *net)
136{
Harald Welteb908cb72009-12-22 13:09:29 +0100137 struct pchan_load pl;
138
Harald Welteef235b52009-03-10 12:34:02 +0000139 vty_out(vty, "BSC is on Country Code %u, Network Code %u "
140 "and has %u BTS%s", net->country_code, net->network_code,
141 net->num_bts, VTY_NEWLINE);
Harald Welte1bc77352009-03-10 19:47:51 +0000142 vty_out(vty, " Long network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000143 net->name_long, VTY_NEWLINE);
Harald Welte1bc77352009-03-10 19:47:51 +0000144 vty_out(vty, " Short network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000145 net->name_short, VTY_NEWLINE);
Harald Welte (local)69de3972009-08-12 14:42:23 +0200146 vty_out(vty, " Authentication policy: %s%s",
147 gsm_auth_policy_name(net->auth_policy), VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100148 vty_out(vty, " Location updating reject cause: %u%s",
149 net->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900150 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
151 VTY_NEWLINE);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +0100152 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
153 VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100154 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
155 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100156 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
157 VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100158 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
159 VTY_NEWLINE);
Harald Welteb908cb72009-12-22 13:09:29 +0100160 network_chan_load(&pl, net);
161 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
162 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte68628e82009-03-10 12:17:57 +0000163}
164
165DEFUN(show_net, show_net_cmd, "show network",
166 SHOW_STR "Display information about a GSM NETWORK\n")
167{
Harald Weltedcccb182010-05-16 20:52:23 +0200168 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000169 net_dump_vty(vty, net);
170
171 return CMD_SUCCESS;
172}
173
174static void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l)
175{
Harald Welteedb37782009-05-01 14:59:07 +0000176 struct e1inp_line *line;
177
178 if (!e1l) {
179 vty_out(vty, " None%s", VTY_NEWLINE);
180 return;
181 }
182
183 line = e1l->ts->line;
184
185 vty_out(vty, " E1 Line %u, Type %s: Timeslot %u, Mode %s%s",
186 line->num, line->driver->name, e1l->ts->num,
Harald Welte1bc77352009-03-10 19:47:51 +0000187 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
Harald Welteedb37782009-05-01 14:59:07 +0000188 vty_out(vty, " E1 TEI %u, SAPI %u%s",
Harald Welte68628e82009-03-10 12:17:57 +0000189 e1l->tei, e1l->sapi, VTY_NEWLINE);
190}
191
192static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
193{
Harald Welteb908cb72009-12-22 13:09:29 +0100194 struct pchan_load pl;
195
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200196 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Weltefcd24452009-06-20 18:15:19 +0200197 "BSIC %u, TSC %u and %u TRX%s",
198 bts->nr, btstype2str(bts->type), gsm_band_name(bts->band),
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200199 bts->cell_identity,
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +0200200 bts->location_area_code, bts->bsic, bts->tsc,
Harald Weltefcd24452009-06-20 18:15:19 +0200201 bts->num_trx, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200202 vty_out(vty, "Description: %s%s",
203 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Harald Welte1d8dbc42009-12-12 15:38:16 +0100204 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100205 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte1d8dbc42009-12-12 15:38:16 +0100206 rxlev2dbm(bts->si_common.cell_sel_par.rxlev_acc_min),
207 VTY_NEWLINE);
208 vty_out(vty, "Cell Reselection Hysteresis: %u dBm%s",
Harald Welte73225282009-12-12 18:17:25 +0100209 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100210 vty_out(vty, "RACH TX-Integer: %u%s", bts->si_common.rach_control.tx_integer,
211 VTY_NEWLINE);
212 vty_out(vty, "RACH Max transmissions: %u%s",
213 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
214 VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100215 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200216 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Harald Welte4cc34222009-05-01 15:12:31 +0000217 if (is_ipaccess_bts(bts))
Harald Welte8175e952009-10-20 00:22:00 +0200218 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte4cc34222009-05-01 15:12:31 +0000219 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte8175e952009-10-20 00:22:00 +0200220 bts->oml_tei, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000221 vty_out(vty, " NM State: ");
222 net_dump_nmstate(vty, &bts->nm_state);
223 vty_out(vty, " Site Mgr NM State: ");
224 net_dump_nmstate(vty, &bts->site_mgr.nm_state);
225 vty_out(vty, " Paging: FIXME pending requests, %u free slots%s",
226 bts->paging.available_slots, VTY_NEWLINE);
Harald Welte8175e952009-10-20 00:22:00 +0200227 if (!is_ipaccess_bts(bts)) {
228 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
229 e1isl_dump_vty(vty, bts->oml_link);
230 }
Harald Welte68628e82009-03-10 12:17:57 +0000231 /* FIXME: oml_link, chan_desc */
Harald Welteb908cb72009-12-22 13:09:29 +0100232 memset(&pl, 0, sizeof(pl));
233 bts_chan_load(&pl, bts);
234 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
235 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte68628e82009-03-10 12:17:57 +0000236}
237
238DEFUN(show_bts, show_bts_cmd, "show bts [number]",
239 SHOW_STR "Display information about a BTS\n"
240 "BTS number")
241{
Harald Weltedcccb182010-05-16 20:52:23 +0200242 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000243 int bts_nr;
244
245 if (argc != 0) {
246 /* use the BTS number that the user has specified */
247 bts_nr = atoi(argv[0]);
248 if (bts_nr > net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000249 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000250 VTY_NEWLINE);
251 return CMD_WARNING;
252 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200253 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000254 return CMD_SUCCESS;
255 }
256 /* print all BTS's */
257 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee441d9c2009-06-21 16:17:15 +0200258 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000259
260 return CMD_SUCCESS;
261}
262
Harald Welte42581822009-08-08 16:12:58 +0200263/* utility functions */
264static void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,
265 const char *ts, const char *ss)
266{
267 e1_link->e1_nr = atoi(line);
268 e1_link->e1_ts = atoi(ts);
269 if (!strcmp(ss, "full"))
270 e1_link->e1_ts_ss = 255;
271 else
272 e1_link->e1_ts_ss = atoi(ss);
273}
274
275static void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,
276 const char *prefix)
277{
278 if (!e1_link->e1_ts)
279 return;
280
281 if (e1_link->e1_ts_ss == 255)
282 vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",
283 prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);
284 else
285 vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",
286 prefix, e1_link->e1_nr, e1_link->e1_ts,
287 e1_link->e1_ts_ss, VTY_NEWLINE);
288}
289
290
Harald Welte67ce0732009-08-06 19:06:46 +0200291static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
292{
Harald Welte42581822009-08-08 16:12:58 +0200293 vty_out(vty, " timeslot %u%s", ts->nr, VTY_NEWLINE);
294 if (ts->pchan != GSM_PCHAN_NONE)
295 vty_out(vty, " phys_chan_config %s%s",
296 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
297 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Welte67ce0732009-08-06 19:06:46 +0200298}
299
300static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
301{
302 int i;
303
Harald Welte5013b2a2009-08-07 13:29:14 +0200304 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200305 if (trx->description)
306 vty_out(vty, " description %s%s", trx->description,
307 VTY_NEWLINE);
Holger Hans Peter Freyther2ba40af2010-04-17 06:42:07 +0200308 vty_out(vty, " rf_locked %u%s",
309 trx->nm_state.administrative == NM_STATE_LOCKED ? 1 : 0,
310 VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200311 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)7b37d972009-12-27 20:56:38 +0100312 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200313 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200314 config_write_e1_link(vty, &trx->rsl_e1_link, " rsl ");
315 vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei, VTY_NEWLINE);
Harald Welte67ce0732009-08-06 19:06:46 +0200316
317 for (i = 0; i < TRX_NR_TS; i++)
318 config_write_ts_single(vty, &trx->ts[i]);
319}
320
Harald Welte615e9562010-05-11 23:50:21 +0200321static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
322{
323 unsigned int i;
324 vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
325 VTY_NEWLINE);
326 if (bts->gprs.mode == BTS_GPRS_NONE)
327 return;
328
329 vty_out(vty, " gprs routing area %u%s", bts->gprs.rac,
330 VTY_NEWLINE);
331 vty_out(vty, " gprs cell bvci %u%s", bts->gprs.cell.bvci,
332 VTY_NEWLINE);
333 for (i = 0; i < ARRAY_SIZE(bts->gprs.cell.timer); i++)
334 vty_out(vty, " gprs cell timer %s %u%s",
335 get_value_string(gprs_bssgp_cfg_strs, i),
336 bts->gprs.cell.timer[i], VTY_NEWLINE);
337 vty_out(vty, " gprs nsei %u%s", bts->gprs.nse.nsei,
338 VTY_NEWLINE);
339 for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)
340 vty_out(vty, " gprs ns timer %s %u%s",
341 get_value_string(gprs_ns_timer_strs, i),
342 bts->gprs.nse.timer[i], VTY_NEWLINE);
343 for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
344 struct gsm_bts_gprs_nsvc *nsvc =
345 &bts->gprs.nsvc[i];
346 struct in_addr ia;
347
348 ia.s_addr = htonl(nsvc->remote_ip);
349 vty_out(vty, " gprs nsvc %u nsvci %u%s", i,
350 nsvc->nsvci, VTY_NEWLINE);
351 vty_out(vty, " gprs nsvc %u local udp port %u%s", i,
352 nsvc->local_port, VTY_NEWLINE);
353 vty_out(vty, " gprs nsvc %u remote udp port %u%s", i,
354 nsvc->remote_port, VTY_NEWLINE);
355 vty_out(vty, " gprs nsvc %u remote ip %s%s", i,
356 inet_ntoa(ia), VTY_NEWLINE);
357 }
358}
359
Harald Welte67ce0732009-08-06 19:06:46 +0200360static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
361{
362 struct gsm_bts_trx *trx;
363
Harald Welte5013b2a2009-08-07 13:29:14 +0200364 vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE);
365 vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200366 if (bts->description)
367 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200368 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freytherf926ed62009-11-19 16:38:49 +0100369 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200370 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte67ce0732009-08-06 19:06:46 +0200371 VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200372 vty_out(vty, " training_sequence_code %u%s", bts->tsc, VTY_NEWLINE);
373 vty_out(vty, " base_station_id_code %u%s", bts->bsic, VTY_NEWLINE);
Harald Welte (local)0e451d02009-08-13 10:14:26 +0200374 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100375 vty_out(vty, " cell reselection hysteresis %u%s",
376 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
377 vty_out(vty, " rxlev access min %u%s",
378 bts->si_common.cell_sel_par.rxlev_acc_min, VTY_NEWLINE);
Harald Weltea43f7892009-12-01 18:04:30 +0530379 if (bts->si_common.chan_desc.t3212)
Harald Welte (local)efc92312009-08-14 23:09:25 +0200380 vty_out(vty, " periodic location update %u%s",
Harald Weltea43f7892009-12-01 18:04:30 +0530381 bts->si_common.chan_desc.t3212 * 10, VTY_NEWLINE);
Harald Welte7a8fa412009-08-10 13:48:16 +0200382 vty_out(vty, " channel allocator %s%s",
383 bts->chan_alloc_reverse ? "descending" : "ascending",
384 VTY_NEWLINE);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +0100385 vty_out(vty, " rach tx integer %u%s",
386 bts->si_common.rach_control.tx_integer, VTY_NEWLINE);
387 vty_out(vty, " rach max transmission %u%s",
388 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
389 VTY_NEWLINE);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800390
391 if (bts->rach_b_thresh != -1)
392 vty_out(vty, " rach nm busy threshold %u%s",
393 bts->rach_b_thresh, VTY_NEWLINE);
394 if (bts->rach_ldavg_slots != -1)
395 vty_out(vty, " rach nm load average %u%s",
396 bts->rach_ldavg_slots, VTY_NEWLINE);
Harald Welte71355012009-12-21 23:08:18 +0100397 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200398 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +0800399 if ((bts->si_common.rach_control.t2 & 0x4) == 0)
400 vty_out(vty, " rach emergency call allowed 1%s", VTY_NEWLINE);
Harald Welte8175e952009-10-20 00:22:00 +0200401 if (is_ipaccess_bts(bts)) {
Harald Welte5013b2a2009-08-07 13:29:14 +0200402 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Weltea6fd58e2009-08-07 00:25:23 +0200403 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte8175e952009-10-20 00:22:00 +0200404 vty_out(vty, " oml ip.access stream_id %u%s", bts->oml_tei, VTY_NEWLINE);
405 } else {
Harald Welte42581822009-08-08 16:12:58 +0200406 config_write_e1_link(vty, &bts->oml_e1_link, " oml ");
407 vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE);
408 }
Harald Welte615e9562010-05-11 23:50:21 +0200409 config_write_bts_gprs(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200410
411 llist_for_each_entry(trx, &bts->trx_list, list)
412 config_write_trx_single(vty, trx);
413}
414
415static int config_write_bts(struct vty *v)
416{
Harald Weltedcccb182010-05-16 20:52:23 +0200417 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte67ce0732009-08-06 19:06:46 +0200418 struct gsm_bts *bts;
419
420 llist_for_each_entry(bts, &gsmnet->bts_list, list)
421 config_write_bts_single(v, bts);
422
423 return CMD_SUCCESS;
424}
425
Harald Welte5013b2a2009-08-07 13:29:14 +0200426static int config_write_net(struct vty *vty)
427{
Harald Weltedcccb182010-05-16 20:52:23 +0200428 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
429
Harald Welte5013b2a2009-08-07 13:29:14 +0200430 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200431 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200432 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200433 vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE);
434 vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE);
Harald Welte (local)69de3972009-08-12 14:42:23 +0200435 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100436 vty_out(vty, " location updating reject cause %u%s",
437 gsmnet->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900438 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freytherd54c3372009-11-19 16:37:48 +0100439 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100440 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
441 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100442 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100443 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Welteb720bd32009-12-21 16:51:50 +0100444 vty_out(vty, " handover window rxlev averaging %u%s",
445 gsmnet->handover.win_rxlev_avg, VTY_NEWLINE);
446 vty_out(vty, " handover window rxqual averaging %u%s",
447 gsmnet->handover.win_rxqual_avg, VTY_NEWLINE);
448 vty_out(vty, " handover window rxlev neighbor averaging %u%s",
449 gsmnet->handover.win_rxlev_avg_neigh, VTY_NEWLINE);
450 vty_out(vty, " handover power budget interval %u%s",
451 gsmnet->handover.pwr_interval, VTY_NEWLINE);
452 vty_out(vty, " handover power budget hysteresis %u%s",
453 gsmnet->handover.pwr_hysteresis, VTY_NEWLINE);
454 vty_out(vty, " handover maximum distance %u%s",
455 gsmnet->handover.max_distance, VTY_NEWLINE);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +0100456 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100457 vty_out(vty, " timer t3103 %u%s", gsmnet->T3103, VTY_NEWLINE);
458 vty_out(vty, " timer t3105 %u%s", gsmnet->T3105, VTY_NEWLINE);
459 vty_out(vty, " timer t3107 %u%s", gsmnet->T3107, VTY_NEWLINE);
460 vty_out(vty, " timer t3109 %u%s", gsmnet->T3109, VTY_NEWLINE);
461 vty_out(vty, " timer t3111 %u%s", gsmnet->T3111, VTY_NEWLINE);
462 vty_out(vty, " timer t3113 %u%s", gsmnet->T3113, VTY_NEWLINE);
463 vty_out(vty, " timer t3115 %u%s", gsmnet->T3115, VTY_NEWLINE);
464 vty_out(vty, " timer t3117 %u%s", gsmnet->T3117, VTY_NEWLINE);
465 vty_out(vty, " timer t3119 %u%s", gsmnet->T3119, VTY_NEWLINE);
466 vty_out(vty, " timer t3141 %u%s", gsmnet->T3141, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200467
468 return CMD_SUCCESS;
469}
Harald Welte67ce0732009-08-06 19:06:46 +0200470
Harald Welte68628e82009-03-10 12:17:57 +0000471static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx)
472{
473 vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
474 trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200475 vty_out(vty, "Description: %s%s",
476 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Weltefcd24452009-06-20 18:15:19 +0200477 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte42581822009-08-08 16:12:58 +0200478 "resulting BS power: %d dBm%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200479 trx->nominal_power, trx->max_power_red,
Harald Welte42581822009-08-08 16:12:58 +0200480 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000481 vty_out(vty, " NM State: ");
482 net_dump_nmstate(vty, &trx->nm_state);
483 vty_out(vty, " Baseband Transceiver NM State: ");
484 net_dump_nmstate(vty, &trx->bb_transc.nm_state);
Harald Welte8175e952009-10-20 00:22:00 +0200485 if (is_ipaccess_bts(trx->bts)) {
486 vty_out(vty, " ip.access stream ID: 0x%02x%s",
487 trx->rsl_tei, VTY_NEWLINE);
488 } else {
489 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
490 e1isl_dump_vty(vty, trx->rsl_link);
491 }
Harald Welte68628e82009-03-10 12:17:57 +0000492}
493
494DEFUN(show_trx,
495 show_trx_cmd,
496 "show trx [bts_nr] [trx_nr]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200497 SHOW_STR "Display information about a TRX\n"
498 "BTS Number\n"
499 "TRX Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000500{
Harald Weltedcccb182010-05-16 20:52:23 +0200501 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000502 struct gsm_bts *bts = NULL;
503 struct gsm_bts_trx *trx;
504 int bts_nr, trx_nr;
505
506 if (argc >= 1) {
507 /* use the BTS number that the user has specified */
508 bts_nr = atoi(argv[0]);
509 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000510 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000511 VTY_NEWLINE);
512 return CMD_WARNING;
513 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200514 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000515 }
516 if (argc >= 2) {
517 trx_nr = atoi(argv[1]);
518 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000519 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000520 VTY_NEWLINE);
521 return CMD_WARNING;
522 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200523 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000524 trx_dump_vty(vty, trx);
525 return CMD_SUCCESS;
526 }
527 if (bts) {
528 /* print all TRX in this BTS */
529 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200530 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000531 trx_dump_vty(vty, trx);
532 }
533 return CMD_SUCCESS;
534 }
535
536 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200537 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000538 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200539 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000540 trx_dump_vty(vty, trx);
541 }
542 }
543
544 return CMD_SUCCESS;
545}
546
Harald Welte67ce0732009-08-06 19:06:46 +0200547
Harald Welte68628e82009-03-10 12:17:57 +0000548static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
549{
Harald Welte68628e82009-03-10 12:17:57 +0000550 vty_out(vty, "Timeslot %u of TRX %u in BTS %u, phys cfg %s%s",
551 ts->nr, ts->trx->nr, ts->trx->bts->nr,
552 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
553 vty_out(vty, " NM State: ");
554 net_dump_nmstate(vty, &ts->nm_state);
Harald Welte2c828992009-12-02 01:56:49 +0530555 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welteef235b52009-03-10 12:34:02 +0000556 vty_out(vty, " E1 Line %u, Timeslot %u, Subslot %u%s",
557 ts->e1_link.e1_nr, ts->e1_link.e1_ts,
558 ts->e1_link.e1_ts_ss, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000559}
560
561DEFUN(show_ts,
562 show_ts_cmd,
Harald Welte1bc77352009-03-10 19:47:51 +0000563 "show timeslot [bts_nr] [trx_nr] [ts_nr]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200564 SHOW_STR "Display information about a TS\n"
565 "BTS Number\n" "TRX Number\n" "Timeslot Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000566{
Harald Weltedcccb182010-05-16 20:52:23 +0200567 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000568 struct gsm_bts *bts;
569 struct gsm_bts_trx *trx;
570 struct gsm_bts_trx_ts *ts;
571 int bts_nr, trx_nr, ts_nr;
572
573 if (argc >= 1) {
574 /* use the BTS number that the user has specified */
575 bts_nr = atoi(argv[0]);
576 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000577 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000578 VTY_NEWLINE);
579 return CMD_WARNING;
580 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200581 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000582 }
583 if (argc >= 2) {
584 trx_nr = atoi(argv[1]);
585 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000586 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000587 VTY_NEWLINE);
588 return CMD_WARNING;
589 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200590 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000591 }
592 if (argc >= 3) {
593 ts_nr = atoi(argv[2]);
594 if (ts_nr >= TRX_NR_TS) {
Harald Welte1bc77352009-03-10 19:47:51 +0000595 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
Harald Welte68628e82009-03-10 12:17:57 +0000596 VTY_NEWLINE);
597 return CMD_WARNING;
598 }
599 ts = &trx->ts[ts_nr];
600 ts_dump_vty(vty, ts);
601 return CMD_SUCCESS;
602 }
603 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200604 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000605 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200606 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000607 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
608 ts = &trx->ts[ts_nr];
609 ts_dump_vty(vty, ts);
610 }
611 }
612 }
613
614 return CMD_SUCCESS;
615}
616
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100617static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte68628e82009-03-10 12:17:57 +0000618{
Harald Weltefcd24452009-06-20 18:15:19 +0200619 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte40f82892009-05-23 17:31:39 +0000620 subscr->authorized, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000621 if (subscr->name)
Harald Welte1bc77352009-03-10 19:47:51 +0000622 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000623 if (subscr->extension)
624 vty_out(vty, " Extension: %s%s", subscr->extension,
625 VTY_NEWLINE);
626 if (subscr->imsi)
627 vty_out(vty, " IMSI: %s%s", subscr->imsi, VTY_NEWLINE);
Holger Hans Peter Freyther22230252009-08-19 12:53:57 +0200628 if (subscr->tmsi != GSM_RESERVED_TMSI)
629 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte731fd912009-08-15 03:24:51 +0200630 VTY_NEWLINE);
Sylvain Munautaf292642009-12-27 19:29:28 +0100631
Harald Welte (local)15920de2009-08-14 20:27:16 +0200632 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000633}
634
Harald Welte8387a492009-12-22 21:43:14 +0100635static void meas_rep_dump_uni_vty(struct vty *vty,
636 struct gsm_meas_rep_unidir *mru,
637 const char *prefix,
638 const char *dir)
639{
640 vty_out(vty, "%s RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",
641 prefix, dir, rxlev2dbm(mru->full.rx_lev),
642 dir, rxlev2dbm(mru->sub.rx_lev));
643 vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",
644 dir, mru->full.rx_qual, dir, mru->sub.rx_qual,
645 VTY_NEWLINE);
646}
647
648static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,
649 const char *prefix)
650{
651 vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);
652 vty_out(vty, "%s Flags: %s%s%s%s%s", prefix,
653 mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",
654 mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",
655 mr->flags & MEAS_REP_F_FPC ? "FPC " : "",
656 mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",
657 VTY_NEWLINE);
658 if (mr->flags & MEAS_REP_F_MS_TO)
659 vty_out(vty, "%s MS Timing Offset: %u%s", prefix,
660 mr->ms_timing_offset, VTY_NEWLINE);
661 if (mr->flags & MEAS_REP_F_MS_L1)
662 vty_out(vty, "%s L1 MS Power: %u dBm, Timing Advance: %u%s",
663 prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);
664 if (mr->flags & MEAS_REP_F_DL_VALID)
665 meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");
666 meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");
667}
668
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +0800669static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte68628e82009-03-10 12:17:57 +0000670{
Harald Welte8387a492009-12-22 21:43:14 +0100671 int idx;
672
Harald Welte68628e82009-03-10 12:17:57 +0000673 vty_out(vty, "Lchan %u in Timeslot %u of TRX %u in BTS %u, Type %s%s",
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +0200674 lchan->nr, lchan->ts->nr, lchan->ts->trx->nr,
Harald Welte (local)ccd88452009-12-27 18:05:25 +0100675 lchan->ts->trx->bts->nr, gsm_lchant_name(lchan->type),
Harald Welte68628e82009-03-10 12:17:57 +0000676 VTY_NEWLINE);
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100677 vty_out(vty, " Use Count: %u, State: %s%s", lchan->conn.use_count,
Harald Welte1887f9d2009-12-29 10:52:38 +0100678 gsm_lchans_name(lchan->state), VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100679 vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s",
680 lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
681 - lchan->bs_power*2,
682 ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),
683 VTY_NEWLINE);
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100684 if (lchan->conn.subscr) {
Harald Welte68628e82009-03-10 12:17:57 +0000685 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100686 subscr_dump_vty(vty, lchan->conn.subscr);
Harald Welte68628e82009-03-10 12:17:57 +0000687 } else
688 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte2c828992009-12-02 01:56:49 +0530689 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
690 struct in_addr ia;
Holger Hans Peter Freyther54fa7992010-04-07 15:39:16 +0200691 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte2c828992009-12-02 01:56:49 +0530692 vty_out(vty, " Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",
693 inet_ntoa(ia), lchan->abis_ip.bound_port,
694 lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,
695 VTY_NEWLINE);
696 }
Harald Welte8387a492009-12-22 21:43:14 +0100697
698 /* we want to report the last measurement report */
699 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
700 lchan->meas_rep_idx, 1);
701 meas_rep_dump_vty(vty, &lchan->meas_rep[idx], " ");
Harald Welte68628e82009-03-10 12:17:57 +0000702}
703
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +0800704static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
705{
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +0800706 struct gsm_meas_rep *mr;
707 int idx;
708
709 /* we want to report the last measurement report */
710 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
711 lchan->meas_rep_idx, 1);
712 mr = &lchan->meas_rep[idx];
713
714 vty_out(vty, "Lchan: %u Timeslot: %u TRX: %u BTS: %u Type: %s - L1 MS Power: %u dBm "
715 "RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +0800716 lchan->nr, lchan->ts->nr, lchan->ts->trx->nr,
717 lchan->ts->trx->bts->nr, gsm_lchant_name(lchan->type),
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +0800718 mr->ms_l1.pwr,
719 rxlev2dbm(mr->dl.full.rx_lev),
720 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +0800721 VTY_NEWLINE);
722}
723
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +0800724static int lchan_summary(struct vty *vty, int argc, const char **argv,
725 void (*dump_cb)(struct vty *, struct gsm_lchan *))
Harald Welte68628e82009-03-10 12:17:57 +0000726{
Harald Weltedcccb182010-05-16 20:52:23 +0200727 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000728 struct gsm_bts *bts;
729 struct gsm_bts_trx *trx;
730 struct gsm_bts_trx_ts *ts;
731 struct gsm_lchan *lchan;
732 int bts_nr, trx_nr, ts_nr, lchan_nr;
733
734 if (argc >= 1) {
735 /* use the BTS number that the user has specified */
736 bts_nr = atoi(argv[0]);
737 if (bts_nr >= net->num_bts) {
738 vty_out(vty, "%% can't find BTS %s%s", argv[0],
739 VTY_NEWLINE);
740 return CMD_WARNING;
741 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200742 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000743 }
744 if (argc >= 2) {
745 trx_nr = atoi(argv[1]);
746 if (trx_nr >= bts->num_trx) {
747 vty_out(vty, "%% can't find TRX %s%s", argv[1],
748 VTY_NEWLINE);
749 return CMD_WARNING;
750 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200751 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000752 }
753 if (argc >= 3) {
754 ts_nr = atoi(argv[2]);
755 if (ts_nr >= TRX_NR_TS) {
756 vty_out(vty, "%% can't find TS %s%s", argv[2],
757 VTY_NEWLINE);
758 return CMD_WARNING;
759 }
760 ts = &trx->ts[ts_nr];
761 }
762 if (argc >= 4) {
763 lchan_nr = atoi(argv[3]);
764 if (lchan_nr >= TS_MAX_LCHAN) {
765 vty_out(vty, "%% can't find LCHAN %s%s", argv[3],
766 VTY_NEWLINE);
767 return CMD_WARNING;
768 }
769 lchan = &ts->lchan[lchan_nr];
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +0800770 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +0000771 return CMD_SUCCESS;
772 }
773 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200774 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000775 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200776 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000777 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
778 ts = &trx->ts[ts_nr];
779 for (lchan_nr = 0; lchan_nr < TS_MAX_LCHAN;
780 lchan_nr++) {
781 lchan = &ts->lchan[lchan_nr];
Harald Welteef235b52009-03-10 12:34:02 +0000782 if (lchan->type == GSM_LCHAN_NONE)
783 continue;
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +0800784 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +0000785 }
786 }
787 }
788 }
789
790 return CMD_SUCCESS;
791}
792
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +0800793
794DEFUN(show_lchan,
795 show_lchan_cmd,
796 "show lchan [bts_nr] [trx_nr] [ts_nr] [lchan_nr]",
797 SHOW_STR "Display information about a logical channel\n"
798 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
799 "Logical Channel Number\n")
800
801{
802 return lchan_summary(vty, argc, argv, lchan_dump_full_vty);
803}
804
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +0800805DEFUN(show_lchan_summary,
806 show_lchan_summary_cmd,
807 "show lchan summary [bts_nr] [trx_nr] [ts_nr] [lchan_nr]",
808 SHOW_STR "Display information about a logical channel\n"
809 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
810 "Logical Channel Number\n")
811{
812 return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
813}
814
Harald Welte1bc77352009-03-10 19:47:51 +0000815static void e1drv_dump_vty(struct vty *vty, struct e1inp_driver *drv)
816{
817 vty_out(vty, "E1 Input Driver %s%s", drv->name, VTY_NEWLINE);
818}
819
820DEFUN(show_e1drv,
821 show_e1drv_cmd,
822 "show e1_driver",
823 SHOW_STR "Display information about available E1 drivers\n")
824{
825 struct e1inp_driver *drv;
826
827 llist_for_each_entry(drv, &e1inp_driver_list, list)
828 e1drv_dump_vty(vty, drv);
829
830 return CMD_SUCCESS;
831}
832
Harald Welte68628e82009-03-10 12:17:57 +0000833static void e1line_dump_vty(struct vty *vty, struct e1inp_line *line)
834{
835 vty_out(vty, "E1 Line Number %u, Name %s, Driver %s%s",
836 line->num, line->name ? line->name : "",
837 line->driver->name, VTY_NEWLINE);
838}
839
840DEFUN(show_e1line,
841 show_e1line_cmd,
842 "show e1_line [line_nr]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200843 SHOW_STR "Display information about a E1 line\n"
844 "E1 Line Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000845{
Harald Welte1bc77352009-03-10 19:47:51 +0000846 struct e1inp_line *line;
847
848 if (argc >= 1) {
849 int num = atoi(argv[0]);
850 llist_for_each_entry(line, &e1inp_line_list, list) {
851 if (line->num == num) {
852 e1line_dump_vty(vty, line);
853 return CMD_SUCCESS;
854 }
855 }
856 return CMD_WARNING;
857 }
858
859 llist_for_each_entry(line, &e1inp_line_list, list)
860 e1line_dump_vty(vty, line);
861
862 return CMD_SUCCESS;
Harald Welte68628e82009-03-10 12:17:57 +0000863}
864
865static void e1ts_dump_vty(struct vty *vty, struct e1inp_ts *ts)
866{
Harald Welte42581822009-08-08 16:12:58 +0200867 if (ts->type == E1INP_TS_TYPE_NONE)
868 return;
Harald Welte1bc77352009-03-10 19:47:51 +0000869 vty_out(vty, "E1 Timeslot %2u of Line %u is Type %s%s",
870 ts->num, ts->line->num, e1inp_tstype_name(ts->type),
871 VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000872}
873
874DEFUN(show_e1ts,
875 show_e1ts_cmd,
876 "show e1_timeslot [line_nr] [ts_nr]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200877 SHOW_STR "Display information about a E1 timeslot\n"
878 "E1 Line Number\n" "E1 Timeslot Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000879{
Harald Welte986c3d72009-11-17 06:12:16 +0100880 struct e1inp_line *line = NULL;
Harald Welte1bc77352009-03-10 19:47:51 +0000881 struct e1inp_ts *ts;
882 int ts_nr;
Harald Welte68628e82009-03-10 12:17:57 +0000883
Harald Welte1bc77352009-03-10 19:47:51 +0000884 if (argc == 0) {
885 llist_for_each_entry(line, &e1inp_line_list, list) {
886 for (ts_nr = 0; ts_nr < NUM_E1_TS; ts_nr++) {
887 ts = &line->ts[ts_nr];
888 e1ts_dump_vty(vty, ts);
889 }
890 }
891 return CMD_SUCCESS;
892 }
893 if (argc >= 1) {
894 int num = atoi(argv[0]);
895 llist_for_each_entry(line, &e1inp_line_list, list) {
896 if (line->num == num)
897 break;
898 }
899 if (!line || line->num != num) {
900 vty_out(vty, "E1 line %s is invalid%s",
901 argv[0], VTY_NEWLINE);
902 return CMD_WARNING;
903 }
904 }
905 if (argc >= 2) {
906 ts_nr = atoi(argv[1]);
907 if (ts_nr > NUM_E1_TS) {
908 vty_out(vty, "E1 timeslot %s is invalid%s",
909 argv[1], VTY_NEWLINE);
910 return CMD_WARNING;
911 }
912 ts = &line->ts[ts_nr];
913 e1ts_dump_vty(vty, ts);
914 return CMD_SUCCESS;
915 } else {
916 for (ts_nr = 0; ts_nr < NUM_E1_TS; ts_nr++) {
917 ts = &line->ts[ts_nr];
918 e1ts_dump_vty(vty, ts);
919 }
920 return CMD_SUCCESS;
921 }
922 return CMD_SUCCESS;
Harald Welte68628e82009-03-10 12:17:57 +0000923}
924
Harald Weltebe4b7302009-05-23 16:59:33 +0000925static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
Harald Weltef5025b62009-03-28 16:55:11 +0000926{
927 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
928 subscr_dump_vty(vty, pag->subscr);
929}
930
Harald Weltebe4b7302009-05-23 16:59:33 +0000931static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
Harald Weltef5025b62009-03-28 16:55:11 +0000932{
933 struct gsm_paging_request *pag;
934
935 llist_for_each_entry(pag, &bts->paging.pending_requests, entry)
936 paging_dump_vty(vty, pag);
937}
938
939DEFUN(show_paging,
940 show_paging_cmd,
941 "show paging [bts_nr]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200942 SHOW_STR "Display information about paging reuqests of a BTS\n"
943 "BTS Number\n")
Harald Weltef5025b62009-03-28 16:55:11 +0000944{
Harald Weltedcccb182010-05-16 20:52:23 +0200945 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Weltef5025b62009-03-28 16:55:11 +0000946 struct gsm_bts *bts;
947 int bts_nr;
948
949 if (argc >= 1) {
950 /* use the BTS number that the user has specified */
951 bts_nr = atoi(argv[0]);
952 if (bts_nr >= net->num_bts) {
953 vty_out(vty, "%% can't find BTS %s%s", argv[0],
954 VTY_NEWLINE);
955 return CMD_WARNING;
956 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200957 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +0000958 bts_paging_dump_vty(vty, bts);
959
960 return CMD_SUCCESS;
961 }
962 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200963 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +0000964 bts_paging_dump_vty(vty, bts);
965 }
966
967 return CMD_SUCCESS;
968}
969
Harald Welte8f0ed552010-05-11 21:53:49 +0200970#define NETWORK_STR "Configure the GSM network\n"
971
Harald Welte5013b2a2009-08-07 13:29:14 +0200972DEFUN(cfg_net,
973 cfg_net_cmd,
Harald Welte8f0ed552010-05-11 21:53:49 +0200974 "network", NETWORK_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +0200975{
Harald Weltedcccb182010-05-16 20:52:23 +0200976 vty->index = gsmnet_from_vty(vty);
Harald Welte5013b2a2009-08-07 13:29:14 +0200977 vty->node = GSMNET_NODE;
978
979 return CMD_SUCCESS;
980}
981
982
983DEFUN(cfg_net_ncc,
984 cfg_net_ncc_cmd,
985 "network country code <1-999>",
986 "Set the GSM network country code")
987{
Harald Weltedcccb182010-05-16 20:52:23 +0200988 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
989
Harald Welte5013b2a2009-08-07 13:29:14 +0200990 gsmnet->country_code = atoi(argv[0]);
991
992 return CMD_SUCCESS;
993}
994
995DEFUN(cfg_net_mnc,
996 cfg_net_mnc_cmd,
997 "mobile network code <1-999>",
998 "Set the GSM mobile network code")
999{
Harald Weltedcccb182010-05-16 20:52:23 +02001000 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1001
Harald Welte5013b2a2009-08-07 13:29:14 +02001002 gsmnet->network_code = atoi(argv[0]);
1003
1004 return CMD_SUCCESS;
1005}
1006
1007DEFUN(cfg_net_name_short,
1008 cfg_net_name_short_cmd,
1009 "short name NAME",
1010 "Set the short GSM network name")
1011{
Harald Weltedcccb182010-05-16 20:52:23 +02001012 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1013
Harald Welte5013b2a2009-08-07 13:29:14 +02001014 if (gsmnet->name_short)
1015 talloc_free(gsmnet->name_short);
1016
1017 gsmnet->name_short = talloc_strdup(gsmnet, argv[0]);
1018
1019 return CMD_SUCCESS;
1020}
1021
1022DEFUN(cfg_net_name_long,
1023 cfg_net_name_long_cmd,
1024 "long name NAME",
1025 "Set the long GSM network name")
1026{
Harald Weltedcccb182010-05-16 20:52:23 +02001027 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1028
Harald Welte5013b2a2009-08-07 13:29:14 +02001029 if (gsmnet->name_long)
1030 talloc_free(gsmnet->name_long);
1031
1032 gsmnet->name_long = talloc_strdup(gsmnet, argv[0]);
1033
1034 return CMD_SUCCESS;
1035}
Harald Welte40f82892009-05-23 17:31:39 +00001036
Harald Welte (local)69de3972009-08-12 14:42:23 +02001037DEFUN(cfg_net_auth_policy,
1038 cfg_net_auth_policy_cmd,
1039 "auth policy (closed|accept-all|token)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001040 "Authentication (not cryptographic)\n"
1041 "Set the GSM network authentication policy\n"
1042 "Require the MS to be activated in HLR\n"
1043 "Accept all MS, whether in HLR or not\n"
1044 "Use SMS-token based authentication\n")
Harald Welte (local)69de3972009-08-12 14:42:23 +02001045{
1046 enum gsm_auth_policy policy = gsm_auth_policy_parse(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001047 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte (local)69de3972009-08-12 14:42:23 +02001048
1049 gsmnet->auth_policy = policy;
1050
1051 return CMD_SUCCESS;
1052}
1053
Harald Welte1085c092009-11-18 20:33:19 +01001054DEFUN(cfg_net_reject_cause,
1055 cfg_net_reject_cause_cmd,
1056 "location updating reject cause <2-111>",
1057 "Set the reject cause of location updating reject\n")
1058{
Harald Weltedcccb182010-05-16 20:52:23 +02001059 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1060
Harald Welte1085c092009-11-18 20:33:19 +01001061 gsmnet->reject_cause = atoi(argv[0]);
1062
1063 return CMD_SUCCESS;
1064}
1065
Harald Welte4381cfe2009-08-30 15:47:06 +09001066DEFUN(cfg_net_encryption,
1067 cfg_net_encryption_cmd,
1068 "encryption a5 (0|1|2)",
Harald Welte28326062010-05-14 20:05:17 +02001069 "Encryption options\n"
1070 "A5 encryption\n" "A5/0: No encryption\n"
1071 "A5/1: Encryption\n" "A5/2: Export-grade Encryption\n")
Harald Welte4381cfe2009-08-30 15:47:06 +09001072{
Harald Weltedcccb182010-05-16 20:52:23 +02001073 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1074
Andreas.Eversberg1059deb2009-11-17 09:55:26 +01001075 gsmnet->a5_encryption= atoi(argv[0]);
Harald Welte4381cfe2009-08-30 15:47:06 +09001076
1077 return CMD_SUCCESS;
1078}
1079
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001080DEFUN(cfg_net_neci,
1081 cfg_net_neci_cmd,
1082 "neci (0|1)",
Harald Welte28326062010-05-14 20:05:17 +02001083 "New Establish Cause Indication\n"
1084 "Don't set the NECI bit\n" "Set the NECI bit\n")
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001085{
Harald Weltedcccb182010-05-16 20:52:23 +02001086 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1087
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001088 gsmnet->neci = atoi(argv[0]);
1089 return CMD_SUCCESS;
1090}
1091
Harald Welteeab84a12009-12-13 10:53:12 +01001092DEFUN(cfg_net_rrlp_mode, cfg_net_rrlp_mode_cmd,
1093 "rrlp mode (none|ms-based|ms-preferred|ass-preferred)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001094 "Radio Resource Location Protocol\n"
1095 "Set the Radio Resource Location Protocol Mode\n"
1096 "Don't send RRLP request\n"
1097 "Request MS-based location\n"
1098 "Request any location, prefer MS-based\n"
1099 "Request any location, prefer MS-assisted\n")
Harald Welteeab84a12009-12-13 10:53:12 +01001100{
Harald Weltedcccb182010-05-16 20:52:23 +02001101 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1102
Harald Welteeab84a12009-12-13 10:53:12 +01001103 gsmnet->rrlp.mode = rrlp_mode_parse(argv[0]);
1104
1105 return CMD_SUCCESS;
1106}
1107
Harald Welte648b6ce2009-12-14 09:00:24 +01001108DEFUN(cfg_net_mm_info, cfg_net_mm_info_cmd,
1109 "mm info (0|1)",
1110 "Whether to send MM INFO after LOC UPD ACCEPT")
1111{
Harald Weltedcccb182010-05-16 20:52:23 +02001112 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1113
Harald Welte648b6ce2009-12-14 09:00:24 +01001114 gsmnet->send_mm_info = atoi(argv[0]);
1115
1116 return CMD_SUCCESS;
1117}
1118
Harald Welte8f0ed552010-05-11 21:53:49 +02001119#define HANDOVER_STR "Handover Options\n"
1120
Harald Weltebc814502009-12-19 21:41:52 +01001121DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1122 "handover (0|1)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001123 HANDOVER_STR
1124 "Don't perform in-call handover\n"
1125 "Perform in-call handover\n")
Harald Weltebc814502009-12-19 21:41:52 +01001126{
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001127 int enable = atoi(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001128 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001129
1130 if (enable && ipacc_rtp_direct) {
Harald Weltefe03f0d2009-12-20 13:51:01 +01001131 vty_out(vty, "%% Cannot enable handover unless RTP Proxy mode "
1132 "is enabled by using the -P command line option%s",
1133 VTY_NEWLINE);
1134 return CMD_WARNING;
1135 }
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001136 gsmnet->handover.active = enable;
Harald Weltebc814502009-12-19 21:41:52 +01001137
1138 return CMD_SUCCESS;
1139}
1140
Harald Welte8f0ed552010-05-11 21:53:49 +02001141#define HO_WIN_STR HANDOVER_STR "Measurement Window\n"
1142#define HO_WIN_RXLEV_STR HO_WIN_STR "Received Level Averaging\n"
1143#define HO_WIN_RXQUAL_STR HO_WIN_STR "Received Quality Averaging\n"
1144#define HO_PBUDGET_STR HANDOVER_STR "Power Budget\n"
1145
Harald Welteb720bd32009-12-21 16:51:50 +01001146DEFUN(cfg_net_ho_win_rxlev_avg, cfg_net_ho_win_rxlev_avg_cmd,
1147 "handover window rxlev averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001148 HO_WIN_RXLEV_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001149 "How many RxLev measurements are used for averaging")
1150{
Harald Weltedcccb182010-05-16 20:52:23 +02001151 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001152 gsmnet->handover.win_rxlev_avg = atoi(argv[0]);
1153 return CMD_SUCCESS;
1154}
1155
1156DEFUN(cfg_net_ho_win_rxqual_avg, cfg_net_ho_win_rxqual_avg_cmd,
1157 "handover window rxqual averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001158 HO_WIN_RXQUAL_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001159 "How many RxQual measurements are used for averaging")
1160{
Harald Weltedcccb182010-05-16 20:52:23 +02001161 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001162 gsmnet->handover.win_rxqual_avg = atoi(argv[0]);
1163 return CMD_SUCCESS;
1164}
1165
1166DEFUN(cfg_net_ho_win_rxlev_neigh_avg, cfg_net_ho_win_rxlev_avg_neigh_cmd,
1167 "handover window rxlev neighbor averaging <1-10>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001168 HO_WIN_RXLEV_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001169 "How many RxQual measurements are used for averaging")
1170{
Harald Weltedcccb182010-05-16 20:52:23 +02001171 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001172 gsmnet->handover.win_rxlev_avg_neigh = atoi(argv[0]);
1173 return CMD_SUCCESS;
1174}
1175
1176DEFUN(cfg_net_ho_pwr_interval, cfg_net_ho_pwr_interval_cmd,
1177 "handover power budget interval <1-99>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001178 HO_PBUDGET_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001179 "How often to check if we have a better cell (SACCH frames)")
1180{
Harald Weltedcccb182010-05-16 20:52:23 +02001181 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001182 gsmnet->handover.pwr_interval = atoi(argv[0]);
1183 return CMD_SUCCESS;
1184}
1185
1186DEFUN(cfg_net_ho_pwr_hysteresis, cfg_net_ho_pwr_hysteresis_cmd,
1187 "handover power budget hysteresis <0-999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001188 HO_PBUDGET_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001189 "How many dB does a neighbor to be stronger to become a HO candidate")
1190{
Harald Weltedcccb182010-05-16 20:52:23 +02001191 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001192 gsmnet->handover.pwr_hysteresis = atoi(argv[0]);
1193 return CMD_SUCCESS;
1194}
1195
1196DEFUN(cfg_net_ho_max_distance, cfg_net_ho_max_distance_cmd,
1197 "handover maximum distance <0-9999>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001198 HANDOVER_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001199 "How big is the maximum timing advance before HO is forced")
1200{
Harald Weltedcccb182010-05-16 20:52:23 +02001201 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001202 gsmnet->handover.max_distance = atoi(argv[0]);
1203 return CMD_SUCCESS;
1204}
Harald Weltebc814502009-12-19 21:41:52 +01001205
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001206#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001207 DEFUN(cfg_net_T##number, \
1208 cfg_net_T##number##_cmd, \
1209 "timer t" #number " <0-65535>", \
Harald Welte8f0ed552010-05-11 21:53:49 +02001210 "Configure GSM Timers\n" \
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001211 doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001212{ \
Harald Weltedcccb182010-05-16 20:52:23 +02001213 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001214 int value = atoi(argv[0]); \
1215 \
1216 if (value < 0 || value > 65535) { \
1217 vty_out(vty, "Timer value %s out of range.%s", \
1218 argv[0], VTY_NEWLINE); \
1219 return CMD_WARNING; \
1220 } \
1221 \
1222 gsmnet->T##number = value; \
1223 return CMD_SUCCESS; \
1224}
1225
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001226DECLARE_TIMER(3101, "Set the timeout value for IMMEDIATE ASSIGNMENT.")
1227DECLARE_TIMER(3103, "Set the timeout value for HANDOVER.")
1228DECLARE_TIMER(3105, "Currently not used.")
1229DECLARE_TIMER(3107, "Currently not used.")
1230DECLARE_TIMER(3109, "Currently not used.")
1231DECLARE_TIMER(3111, "Currently not used.")
1232DECLARE_TIMER(3113, "Set the time to try paging a subscriber.")
1233DECLARE_TIMER(3115, "Currently not used.")
1234DECLARE_TIMER(3117, "Currently not used.")
1235DECLARE_TIMER(3119, "Currently not used.")
1236DECLARE_TIMER(3141, "Currently not used.")
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001237
1238
Harald Welte5258fc42009-03-28 19:07:53 +00001239/* per-BTS configuration */
1240DEFUN(cfg_bts,
1241 cfg_bts_cmd,
1242 "bts BTS_NR",
Harald Welte8f0ed552010-05-11 21:53:49 +02001243 "Select a BTS to configure\n"
1244 "BTS Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001245{
Harald Weltedcccb182010-05-16 20:52:23 +02001246 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte5258fc42009-03-28 19:07:53 +00001247 int bts_nr = atoi(argv[0]);
1248 struct gsm_bts *bts;
1249
Harald Weltee441d9c2009-06-21 16:17:15 +02001250 if (bts_nr > gsmnet->num_bts) {
1251 vty_out(vty, "%% The next unused BTS number is %u%s",
1252 gsmnet->num_bts, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00001253 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02001254 } else if (bts_nr == gsmnet->num_bts) {
1255 /* allocate a new one */
1256 bts = gsm_bts_alloc(gsmnet, GSM_BTS_TYPE_UNKNOWN,
1257 HARDCODED_TSC, HARDCODED_BSIC);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02001258 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02001259 bts = gsm_bts_num(gsmnet, bts_nr);
1260
Daniel Willmannf15c2762010-01-11 13:43:07 +01001261 if (!bts) {
1262 vty_out(vty, "%% Unable to allocate BTS %u%s",
1263 gsmnet->num_bts, VTY_NEWLINE);
Harald Weltee441d9c2009-06-21 16:17:15 +02001264 return CMD_WARNING;
Daniel Willmannf15c2762010-01-11 13:43:07 +01001265 }
Harald Welte5258fc42009-03-28 19:07:53 +00001266
1267 vty->index = bts;
Harald Welte197dea92010-05-14 17:59:53 +02001268 vty->index_sub = &bts->description;
Harald Welte5258fc42009-03-28 19:07:53 +00001269 vty->node = BTS_NODE;
1270
1271 return CMD_SUCCESS;
1272}
1273
1274DEFUN(cfg_bts_type,
1275 cfg_bts_type_cmd,
1276 "type TYPE",
1277 "Set the BTS type\n")
1278{
1279 struct gsm_bts *bts = vty->index;
Harald Welte39315c42010-01-10 18:01:52 +01001280 int rc;
Harald Welte5258fc42009-03-28 19:07:53 +00001281
Harald Welte39315c42010-01-10 18:01:52 +01001282 rc = gsm_set_bts_type(bts, parse_btstype(argv[0]));
1283 if (rc < 0)
1284 return CMD_WARNING;
Harald Welte8175e952009-10-20 00:22:00 +02001285
Harald Welte5258fc42009-03-28 19:07:53 +00001286 return CMD_SUCCESS;
1287}
1288
Harald Weltefcd24452009-06-20 18:15:19 +02001289DEFUN(cfg_bts_band,
1290 cfg_bts_band_cmd,
1291 "band BAND",
1292 "Set the frequency band of this BTS\n")
1293{
1294 struct gsm_bts *bts = vty->index;
Harald Welte42581822009-08-08 16:12:58 +02001295 int band = gsm_band_parse(argv[0]);
Harald Weltefcd24452009-06-20 18:15:19 +02001296
1297 if (band < 0) {
1298 vty_out(vty, "%% BAND %d is not a valid GSM band%s",
1299 band, VTY_NEWLINE);
1300 return CMD_WARNING;
1301 }
1302
1303 bts->band = band;
1304
1305 return CMD_SUCCESS;
1306}
1307
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02001308DEFUN(cfg_bts_ci,
1309 cfg_bts_ci_cmd,
1310 "cell_identity <0-65535>",
1311 "Set the Cell identity of this BTS\n")
1312{
1313 struct gsm_bts *bts = vty->index;
1314 int ci = atoi(argv[0]);
1315
1316 if (ci < 0 || ci > 0xffff) {
1317 vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s",
1318 ci, VTY_NEWLINE);
1319 return CMD_WARNING;
1320 }
1321 bts->cell_identity = ci;
1322
1323 return CMD_SUCCESS;
1324}
1325
Harald Welte5258fc42009-03-28 19:07:53 +00001326DEFUN(cfg_bts_lac,
1327 cfg_bts_lac_cmd,
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001328 "location_area_code <0-65535>",
Harald Welte5258fc42009-03-28 19:07:53 +00001329 "Set the Location Area Code (LAC) of this BTS\n")
1330{
1331 struct gsm_bts *bts = vty->index;
1332 int lac = atoi(argv[0]);
1333
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001334 if (lac < 0 || lac > 0xffff) {
1335 vty_out(vty, "%% LAC %d is not in the valid range (0-65535)%s",
Harald Welte5258fc42009-03-28 19:07:53 +00001336 lac, VTY_NEWLINE);
1337 return CMD_WARNING;
1338 }
Holger Hans Peter Freythere48b9562009-10-01 04:07:15 +02001339
1340 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
1341 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
1342 lac, VTY_NEWLINE);
1343 return CMD_WARNING;
1344 }
1345
Harald Welte5258fc42009-03-28 19:07:53 +00001346 bts->location_area_code = lac;
1347
1348 return CMD_SUCCESS;
1349}
1350
Harald Weltea43f7892009-12-01 18:04:30 +05301351
Harald Welte5258fc42009-03-28 19:07:53 +00001352DEFUN(cfg_bts_tsc,
1353 cfg_bts_tsc_cmd,
1354 "training_sequence_code <0-255>",
1355 "Set the Training Sequence Code (TSC) of this BTS\n")
1356{
1357 struct gsm_bts *bts = vty->index;
1358 int tsc = atoi(argv[0]);
1359
1360 if (tsc < 0 || tsc > 0xff) {
1361 vty_out(vty, "%% TSC %d is not in the valid range (0-255)%s",
1362 tsc, VTY_NEWLINE);
1363 return CMD_WARNING;
1364 }
1365 bts->tsc = tsc;
1366
1367 return CMD_SUCCESS;
1368}
1369
Harald Welte78f2f502009-05-23 16:56:52 +00001370DEFUN(cfg_bts_bsic,
1371 cfg_bts_bsic_cmd,
1372 "base_station_id_code <0-63>",
1373 "Set the Base Station Identity Code (BSIC) of this BTS\n")
1374{
1375 struct gsm_bts *bts = vty->index;
1376 int bsic = atoi(argv[0]);
1377
1378 if (bsic < 0 || bsic > 0x3f) {
Harald Welte42581822009-08-08 16:12:58 +02001379 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte78f2f502009-05-23 16:56:52 +00001380 bsic, VTY_NEWLINE);
1381 return CMD_WARNING;
1382 }
1383 bts->bsic = bsic;
1384
1385 return CMD_SUCCESS;
1386}
1387
1388
Harald Welte4cc34222009-05-01 15:12:31 +00001389DEFUN(cfg_bts_unit_id,
1390 cfg_bts_unit_id_cmd,
Harald Welte07dc73d2009-08-07 13:27:09 +02001391 "ip.access unit_id <0-65534> <0-255>",
1392 "Set the ip.access BTS Unit ID of this BTS\n")
Harald Welte4cc34222009-05-01 15:12:31 +00001393{
1394 struct gsm_bts *bts = vty->index;
1395 int site_id = atoi(argv[0]);
1396 int bts_id = atoi(argv[1]);
1397
Harald Welte07dc73d2009-08-07 13:27:09 +02001398 if (!is_ipaccess_bts(bts)) {
1399 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1400 return CMD_WARNING;
1401 }
1402
Harald Welte4cc34222009-05-01 15:12:31 +00001403 bts->ip_access.site_id = site_id;
1404 bts->ip_access.bts_id = bts_id;
1405
1406 return CMD_SUCCESS;
1407}
1408
Harald Welte8f0ed552010-05-11 21:53:49 +02001409#define OML_STR "Organization & Maintenance Link\n"
1410#define IPA_STR "ip.access Specific Options\n"
1411
Harald Welte8175e952009-10-20 00:22:00 +02001412DEFUN(cfg_bts_stream_id,
1413 cfg_bts_stream_id_cmd,
1414 "oml ip.access stream_id <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001415 OML_STR IPA_STR
Harald Welte8175e952009-10-20 00:22:00 +02001416 "Set the ip.access Stream ID of the OML link of this BTS\n")
1417{
1418 struct gsm_bts *bts = vty->index;
1419 int stream_id = atoi(argv[0]);
1420
1421 if (!is_ipaccess_bts(bts)) {
1422 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1423 return CMD_WARNING;
1424 }
1425
1426 bts->oml_tei = stream_id;
1427
1428 return CMD_SUCCESS;
1429}
1430
Harald Welte8f0ed552010-05-11 21:53:49 +02001431#define OML_E1_STR OML_STR "E1 Line\n"
Harald Welte8175e952009-10-20 00:22:00 +02001432
Harald Welte42581822009-08-08 16:12:58 +02001433DEFUN(cfg_bts_oml_e1,
1434 cfg_bts_oml_e1_cmd,
1435 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001436 OML_E1_STR
Harald Welte42581822009-08-08 16:12:58 +02001437 "E1 interface to be used for OML\n")
1438{
1439 struct gsm_bts *bts = vty->index;
1440
1441 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
1442
1443 return CMD_SUCCESS;
1444}
1445
1446
1447DEFUN(cfg_bts_oml_e1_tei,
1448 cfg_bts_oml_e1_tei_cmd,
1449 "oml e1 tei <0-63>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001450 OML_E1_STR
Harald Welte42581822009-08-08 16:12:58 +02001451 "Set the TEI to be used for OML")
1452{
1453 struct gsm_bts *bts = vty->index;
1454
1455 bts->oml_tei = atoi(argv[0]);
1456
1457 return CMD_SUCCESS;
1458}
1459
Harald Welte7a8fa412009-08-10 13:48:16 +02001460DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1461 "channel allocator (ascending|descending)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001462 "Channnel Allocator\n" "Channel Allocator\n"
1463 "Allocate Timeslots and Transceivers in ascending order\n"
1464 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte7a8fa412009-08-10 13:48:16 +02001465{
1466 struct gsm_bts *bts = vty->index;
1467
1468 if (!strcmp(argv[0], "ascending"))
1469 bts->chan_alloc_reverse = 0;
1470 else
1471 bts->chan_alloc_reverse = 1;
1472
1473 return CMD_SUCCESS;
1474}
1475
Harald Welte8f0ed552010-05-11 21:53:49 +02001476#define RACH_STR "Random Access Control Channel\n"
1477
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001478DEFUN(cfg_bts_rach_tx_integer,
1479 cfg_bts_rach_tx_integer_cmd,
1480 "rach tx integer <0-15>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001481 RACH_STR
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001482 "Set the raw tx integer value in RACH Control parameters IE")
1483{
1484 struct gsm_bts *bts = vty->index;
1485 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
1486 return CMD_SUCCESS;
1487}
1488
1489DEFUN(cfg_bts_rach_max_trans,
1490 cfg_bts_rach_max_trans_cmd,
1491 "rach max transmission (1|2|4|7)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001492 RACH_STR
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01001493 "Set the maximum number of RACH burst transmissions")
1494{
1495 struct gsm_bts *bts = vty->index;
1496 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
1497 return CMD_SUCCESS;
1498}
1499
Harald Welte8f0ed552010-05-11 21:53:49 +02001500#define NM_STR "Network Management\n"
1501
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08001502DEFUN(cfg_bts_rach_nm_b_thresh,
1503 cfg_bts_rach_nm_b_thresh_cmd,
1504 "rach nm busy threshold <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001505 RACH_STR NM_STR
1506 "Set the NM Busy Threshold in dB")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08001507{
1508 struct gsm_bts *bts = vty->index;
1509 bts->rach_b_thresh = atoi(argv[0]);
1510 return CMD_SUCCESS;
1511}
1512
1513DEFUN(cfg_bts_rach_nm_ldavg,
1514 cfg_bts_rach_nm_ldavg_cmd,
1515 "rach nm load average <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001516 RACH_STR NM_STR
1517 "Set the NM Loadaverage Slots value")
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08001518{
1519 struct gsm_bts *bts = vty->index;
1520 bts->rach_ldavg_slots = atoi(argv[0]);
1521 return CMD_SUCCESS;
1522}
1523
Harald Welte (local)5dececf2009-08-12 13:28:23 +02001524DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
1525 "cell barred (0|1)",
1526 "Should this cell be barred from access?")
1527{
1528 struct gsm_bts *bts = vty->index;
1529
Harald Welte71355012009-12-21 23:08:18 +01001530 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02001531
1532 return CMD_SUCCESS;
1533}
1534
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08001535DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
1536 "rach emergency call allowed (0|1)",
1537 "Should this cell allow emergency calls?")
1538{
1539 struct gsm_bts *bts = vty->index;
1540
1541 if (atoi(argv[0]) == 0)
1542 bts->si_common.rach_control.t2 |= 0x4;
1543 else
1544 bts->si_common.rach_control.t2 &= ~0x4;
1545
1546 return CMD_SUCCESS;
1547}
1548
Harald Welte (local)0e451d02009-08-13 10:14:26 +02001549DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
1550 "ms max power <0-40>",
1551 "Maximum transmit power of the MS")
1552{
1553 struct gsm_bts *bts = vty->index;
1554
1555 bts->ms_max_power = atoi(argv[0]);
1556
1557 return CMD_SUCCESS;
1558}
1559
Harald Welte73225282009-12-12 18:17:25 +01001560DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
1561 "cell reselection hysteresis <0-14>",
1562 "Cell Re-Selection Hysteresis in dB")
1563{
1564 struct gsm_bts *bts = vty->index;
1565
1566 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
1567
1568 return CMD_SUCCESS;
1569}
1570
1571DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
1572 "rxlev access min <0-63>",
1573 "Minimum RxLev needed for cell access (better than -110dBm)")
1574{
1575 struct gsm_bts *bts = vty->index;
1576
1577 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
1578
1579 return CMD_SUCCESS;
1580}
1581
Harald Welte (local)efc92312009-08-14 23:09:25 +02001582DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
1583 "periodic location update <0-1530>",
1584 "Periodic Location Updating Interval in Minutes")
1585{
1586 struct gsm_bts *bts = vty->index;
1587
Harald Weltea43f7892009-12-01 18:04:30 +05301588 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 10;
Harald Welte (local)efc92312009-08-14 23:09:25 +02001589
1590 return CMD_SUCCESS;
1591}
1592
Harald Welte8f0ed552010-05-11 21:53:49 +02001593#define GPRS_TEXT "GPRS Packet Network\n"
1594
Harald Welteaf387632010-03-14 23:30:30 +08001595DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welte57ba7e32010-04-18 14:00:26 +02001596 "gprs cell bvci <2-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001597 GPRS_TEXT
1598 "GPRS Cell Settings\n"
Harald Welte97a282b2010-03-14 15:37:43 +08001599 "GPRS BSSGP VC Identifier")
1600{
1601 struct gsm_bts *bts = vty->index;
1602
Harald Welte4511d892010-04-18 15:51:20 +02001603 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08001604 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1605 return CMD_WARNING;
1606 }
1607
Harald Welte97a282b2010-03-14 15:37:43 +08001608 bts->gprs.cell.bvci = atoi(argv[0]);
1609
1610 return CMD_SUCCESS;
1611}
1612
Harald Weltea5731cf2010-03-22 11:48:36 +08001613DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
1614 "gprs nsei <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001615 GPRS_TEXT
Harald Weltea5731cf2010-03-22 11:48:36 +08001616 "GPRS NS Entity Identifier")
1617{
1618 struct gsm_bts *bts = vty->index;
1619
Harald Welte4511d892010-04-18 15:51:20 +02001620 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltea5731cf2010-03-22 11:48:36 +08001621 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1622 return CMD_WARNING;
1623 }
1624
1625 bts->gprs.nse.nsei = atoi(argv[0]);
1626
1627 return CMD_SUCCESS;
1628}
1629
Harald Welte8f0ed552010-05-11 21:53:49 +02001630#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
1631 "NSVC Logical Number\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08001632
Harald Welte97a282b2010-03-14 15:37:43 +08001633DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
1634 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001635 GPRS_TEXT NSVC_TEXT
1636 "NS Virtual Connection Identifier\n"
Harald Welte97a282b2010-03-14 15:37:43 +08001637 "GPRS NS VC Identifier")
1638{
1639 struct gsm_bts *bts = vty->index;
1640 int idx = atoi(argv[0]);
1641
Harald Welte4511d892010-04-18 15:51:20 +02001642 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08001643 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1644 return CMD_WARNING;
1645 }
1646
Harald Welte97a282b2010-03-14 15:37:43 +08001647 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
1648
1649 return CMD_SUCCESS;
1650}
1651
Harald Welteaf387632010-03-14 23:30:30 +08001652DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
1653 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001654 GPRS_TEXT NSVC_TEXT
Harald Welteaf387632010-03-14 23:30:30 +08001655 "GPRS NS Local UDP Port")
1656{
1657 struct gsm_bts *bts = vty->index;
1658 int idx = atoi(argv[0]);
1659
Harald Welte4511d892010-04-18 15:51:20 +02001660 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08001661 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1662 return CMD_WARNING;
1663 }
1664
Harald Welteaf387632010-03-14 23:30:30 +08001665 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
1666
1667 return CMD_SUCCESS;
1668}
1669
1670DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
1671 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001672 GPRS_TEXT NSVC_TEXT
Harald Welteaf387632010-03-14 23:30:30 +08001673 "GPRS NS Remote UDP Port")
1674{
1675 struct gsm_bts *bts = vty->index;
1676 int idx = atoi(argv[0]);
1677
Harald Welte4511d892010-04-18 15:51:20 +02001678 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08001679 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1680 return CMD_WARNING;
1681 }
1682
Harald Welteaf387632010-03-14 23:30:30 +08001683 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
1684
1685 return CMD_SUCCESS;
1686}
1687
1688DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
1689 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte8f0ed552010-05-11 21:53:49 +02001690 GPRS_TEXT NSVC_TEXT
Harald Welteaf387632010-03-14 23:30:30 +08001691 "GPRS NS Remote IP Address")
1692{
1693 struct gsm_bts *bts = vty->index;
1694 int idx = atoi(argv[0]);
1695 struct in_addr ia;
1696
Harald Welte4511d892010-04-18 15:51:20 +02001697 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08001698 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1699 return CMD_WARNING;
1700 }
1701
Harald Welteaf387632010-03-14 23:30:30 +08001702 inet_aton(argv[1], &ia);
1703 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
1704
1705 return CMD_SUCCESS;
1706}
1707
Harald Welte615e9562010-05-11 23:50:21 +02001708DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
1709 "gprs ns timer " NS_TIMERS " <0-255>",
1710 GPRS_TEXT "Network Service\n"
1711 "Network Service Timer\n"
1712 NS_TIMERS_HELP "Timer Value\n")
1713{
1714 struct gsm_bts *bts = vty->index;
1715 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
1716 int val = atoi(argv[1]);
1717
1718 if (bts->gprs.mode == BTS_GPRS_NONE) {
1719 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1720 return CMD_WARNING;
1721 }
1722
1723 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
1724 return CMD_WARNING;
1725
1726 bts->gprs.nse.timer[idx] = val;
1727
1728 return CMD_SUCCESS;
1729}
1730
1731#define BSSGP_TIMERS "(blocking-timer|blocking-retries|unblocking-retries|reset-timer|reset-retries|suspend-timer|suspend-retries|resume-timer|resume-retries|capability-update-timer|capability-update-retries)"
Harald Welte28326062010-05-14 20:05:17 +02001732#define BSSGP_TIMERS_HELP \
1733 "Tbvc-block timeout\n" \
1734 "Tbvc-block retries\n" \
1735 "Tbvc-unblock retries\n" \
1736 "Tbvcc-reset timeout\n" \
1737 "Tbvc-reset retries\n" \
1738 "Tbvc-suspend timeout\n" \
1739 "Tbvc-suspend retries\n" \
1740 "Tbvc-resume timeout\n" \
1741 "Tbvc-resume retries\n" \
1742 "Tbvc-capa-update timeout\n" \
1743 "Tbvc-capa-update retries\n"
Harald Welte615e9562010-05-11 23:50:21 +02001744
1745DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
1746 "gprs cell timer " BSSGP_TIMERS " <0-255>",
1747 GPRS_TEXT "Cell / BSSGP\n"
1748 "Cell/BSSGP Timer\n"
1749 BSSGP_TIMERS_HELP "Timer Value\n")
1750{
1751 struct gsm_bts *bts = vty->index;
1752 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
1753 int val = atoi(argv[1]);
1754
1755 if (bts->gprs.mode == BTS_GPRS_NONE) {
1756 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1757 return CMD_WARNING;
1758 }
1759
1760 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
1761 return CMD_WARNING;
1762
1763 bts->gprs.cell.timer[idx] = val;
1764
1765 return CMD_SUCCESS;
1766}
1767
Harald Welte97a282b2010-03-14 15:37:43 +08001768DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
1769 "gprs routing area <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001770 GPRS_TEXT
Harald Welte97a282b2010-03-14 15:37:43 +08001771 "GPRS Routing Area Code")
1772{
1773 struct gsm_bts *bts = vty->index;
1774
Harald Welte4511d892010-04-18 15:51:20 +02001775 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-03-14 23:56:56 +08001776 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1777 return CMD_WARNING;
1778 }
1779
Harald Welte97a282b2010-03-14 15:37:43 +08001780 bts->gprs.rac = atoi(argv[0]);
1781
1782 return CMD_SUCCESS;
1783}
1784
Harald Welte4511d892010-04-18 15:51:20 +02001785DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
1786 "gprs mode (none|gprs|egprs)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001787 GPRS_TEXT
1788 "GPRS Mode for this BTS\n"
1789 "GPRS Disabled on this BTS\n"
1790 "GPRS Enabled on this BTS\n"
1791 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welteaf387632010-03-14 23:30:30 +08001792{
1793 struct gsm_bts *bts = vty->index;
1794
Harald Welte4511d892010-04-18 15:51:20 +02001795 bts->gprs.mode = bts_gprs_mode_parse(argv[0]);
Harald Welteaf387632010-03-14 23:30:30 +08001796
1797 return CMD_SUCCESS;
1798}
1799
Harald Welte8f0ed552010-05-11 21:53:49 +02001800#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02001801
Harald Welte5258fc42009-03-28 19:07:53 +00001802/* per TRX configuration */
1803DEFUN(cfg_trx,
1804 cfg_trx_cmd,
1805 "trx TRX_NR",
Harald Welte8f0ed552010-05-11 21:53:49 +02001806 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00001807 "Select a TRX to configure")
1808{
1809 int trx_nr = atoi(argv[0]);
1810 struct gsm_bts *bts = vty->index;
1811 struct gsm_bts_trx *trx;
1812
Harald Weltee441d9c2009-06-21 16:17:15 +02001813 if (trx_nr > bts->num_trx) {
1814 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
1815 bts->num_trx, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00001816 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02001817 } else if (trx_nr == bts->num_trx) {
1818 /* we need to allocate a new one */
1819 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02001820 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02001821 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02001822
Harald Weltee441d9c2009-06-21 16:17:15 +02001823 if (!trx)
1824 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00001825
1826 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02001827 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00001828 vty->node = TRX_NODE;
1829
1830 return CMD_SUCCESS;
1831}
1832
1833DEFUN(cfg_trx_arfcn,
1834 cfg_trx_arfcn_cmd,
Harald Welte93e90202010-05-14 19:00:52 +02001835 "arfcn <0-1024>",
Harald Welte5258fc42009-03-28 19:07:53 +00001836 "Set the ARFCN for this TRX\n")
1837{
1838 int arfcn = atoi(argv[0]);
1839 struct gsm_bts_trx *trx = vty->index;
1840
1841 /* FIXME: check if this ARFCN is supported by this TRX */
1842
1843 trx->arfcn = arfcn;
1844
1845 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
1846 /* FIXME: use OML layer to update the ARFCN */
1847 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
1848
1849 return CMD_SUCCESS;
1850}
1851
Harald Welte (local)7b37d972009-12-27 20:56:38 +01001852DEFUN(cfg_trx_nominal_power,
1853 cfg_trx_nominal_power_cmd,
1854 "nominal power <0-100>",
1855 "Nominal TRX RF Power in dB\n")
1856{
1857 struct gsm_bts_trx *trx = vty->index;
1858
1859 trx->nominal_power = atoi(argv[0]);
1860
1861 return CMD_SUCCESS;
1862}
1863
Harald Weltefcd24452009-06-20 18:15:19 +02001864DEFUN(cfg_trx_max_power_red,
1865 cfg_trx_max_power_red_cmd,
1866 "max_power_red <0-100>",
1867 "Reduction of maximum BS RF Power in dB\n")
1868{
1869 int maxpwr_r = atoi(argv[0]);
1870 struct gsm_bts_trx *trx = vty->index;
Harald Welte61a83b22009-11-18 09:20:22 +01001871 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-06-20 18:15:19 +02001872
1873 /* FIXME: check if our BTS type supports more than 12 */
1874 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
1875 vty_out(vty, "%% Power %d dB is not in the valid range%s",
1876 maxpwr_r, VTY_NEWLINE);
1877 return CMD_WARNING;
1878 }
1879 if (maxpwr_r & 1) {
1880 vty_out(vty, "%% Power %d dB is not an even value%s",
1881 maxpwr_r, VTY_NEWLINE);
1882 return CMD_WARNING;
1883 }
1884
1885 trx->max_power_red = maxpwr_r;
1886
1887 /* FIXME: make sure we update this using OML */
1888
1889 return CMD_SUCCESS;
1890}
1891
Harald Welte42581822009-08-08 16:12:58 +02001892DEFUN(cfg_trx_rsl_e1,
1893 cfg_trx_rsl_e1_cmd,
1894 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
1895 "E1 interface to be used for RSL\n")
1896{
1897 struct gsm_bts_trx *trx = vty->index;
1898
1899 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
1900
1901 return CMD_SUCCESS;
1902}
1903
1904DEFUN(cfg_trx_rsl_e1_tei,
1905 cfg_trx_rsl_e1_tei_cmd,
1906 "rsl e1 tei <0-63>",
1907 "Set the TEI to be used for RSL")
1908{
1909 struct gsm_bts_trx *trx = vty->index;
1910
1911 trx->rsl_tei = atoi(argv[0]);
1912
1913 return CMD_SUCCESS;
1914}
1915
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01001916DEFUN(cfg_trx_rf_locked,
1917 cfg_trx_rf_locked_cmd,
1918 "rf_locked (0|1)",
1919 "Turn off RF of the TRX.\n")
1920{
1921 int locked = atoi(argv[0]);
1922 struct gsm_bts_trx *trx = vty->index;
1923
1924 gsm_trx_lock_rf(trx, locked);
1925 return CMD_SUCCESS;
1926}
Harald Welte42581822009-08-08 16:12:58 +02001927
Harald Welte5258fc42009-03-28 19:07:53 +00001928/* per TS configuration */
1929DEFUN(cfg_ts,
1930 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02001931 "timeslot <0-7>",
Harald Welte5258fc42009-03-28 19:07:53 +00001932 "Select a Timeslot to configure")
1933{
1934 int ts_nr = atoi(argv[0]);
1935 struct gsm_bts_trx *trx = vty->index;
1936 struct gsm_bts_trx_ts *ts;
1937
1938 if (ts_nr >= TRX_NR_TS) {
1939 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
1940 TRX_NR_TS, VTY_NEWLINE);
1941 return CMD_WARNING;
1942 }
1943
1944 ts = &trx->ts[ts_nr];
1945
1946 vty->index = ts;
1947 vty->node = TS_NODE;
1948
1949 return CMD_SUCCESS;
1950}
1951
Harald Weltea6fd58e2009-08-07 00:25:23 +02001952DEFUN(cfg_ts_pchan,
1953 cfg_ts_pchan_cmd,
1954 "phys_chan_config PCHAN",
1955 "Physical Channel configuration (TCH/SDCCH/...)")
1956{
1957 struct gsm_bts_trx_ts *ts = vty->index;
1958 int pchanc;
1959
1960 pchanc = gsm_pchan_parse(argv[0]);
1961 if (pchanc < 0)
1962 return CMD_WARNING;
1963
1964 ts->pchan = pchanc;
1965
1966 return CMD_SUCCESS;
1967}
1968
1969DEFUN(cfg_ts_e1_subslot,
1970 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02001971 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltea6fd58e2009-08-07 00:25:23 +02001972 "E1 sub-slot connected to this on-air timeslot")
1973{
1974 struct gsm_bts_trx_ts *ts = vty->index;
1975
Harald Welte42581822009-08-08 16:12:58 +02001976 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02001977
1978 return CMD_SUCCESS;
1979}
Harald Welte5258fc42009-03-28 19:07:53 +00001980
Harald Weltedcccb182010-05-16 20:52:23 +02001981extern int bsc_vty_init_extra(void);
Harald Welte1353f962010-05-16 19:20:24 +02001982extern const char *openbsc_copyright;
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02001983
Harald Weltedcccb182010-05-16 20:52:23 +02001984int bsc_vty_init(void)
Harald Welte68628e82009-03-10 12:17:57 +00001985{
Harald Welteb4d5b172010-05-12 16:10:35 +00001986 install_element_ve(&show_net_cmd);
1987 install_element_ve(&show_bts_cmd);
1988 install_element_ve(&show_trx_cmd);
1989 install_element_ve(&show_ts_cmd);
1990 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08001991 install_element_ve(&show_lchan_summary_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00001992
Harald Welteb4d5b172010-05-12 16:10:35 +00001993 install_element_ve(&show_e1drv_cmd);
1994 install_element_ve(&show_e1line_cmd);
1995 install_element_ve(&show_e1ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00001996
Harald Welteb4d5b172010-05-12 16:10:35 +00001997 install_element_ve(&show_paging_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00001998
Holger Hans Peter Freyther3c712322010-04-06 11:55:37 +02001999 openbsc_vty_add_cmds();
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01002000
Harald Welte5013b2a2009-08-07 13:29:14 +02002001 install_element(CONFIG_NODE, &cfg_net_cmd);
2002 install_node(&net_node, config_write_net);
2003 install_default(GSMNET_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +02002004 install_element(GSMNET_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +02002005 install_element(GSMNET_NODE, &ournode_end_cmd);
Harald Welte42581822009-08-08 16:12:58 +02002006 install_element(GSMNET_NODE, &cfg_net_ncc_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02002007 install_element(GSMNET_NODE, &cfg_net_mnc_cmd);
2008 install_element(GSMNET_NODE, &cfg_net_name_short_cmd);
2009 install_element(GSMNET_NODE, &cfg_net_name_long_cmd);
Harald Welte (local)69de3972009-08-12 14:42:23 +02002010 install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd);
Harald Welte1085c092009-11-18 20:33:19 +01002011 install_element(GSMNET_NODE, &cfg_net_reject_cause_cmd);
Harald Welte4381cfe2009-08-30 15:47:06 +09002012 install_element(GSMNET_NODE, &cfg_net_encryption_cmd);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01002013 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Welteeab84a12009-12-13 10:53:12 +01002014 install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd);
Harald Welte3d23db42009-12-14 17:49:15 +01002015 install_element(GSMNET_NODE, &cfg_net_mm_info_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01002016 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-12-21 16:51:50 +01002017 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
2018 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
2019 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
2020 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
2021 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
2022 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01002023 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01002024 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
2025 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
2026 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
2027 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
2028 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
2029 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
2030 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
2031 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
2032 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
2033 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02002034
2035 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02002036 install_node(&bts_node, config_write_bts);
Harald Welte68628e82009-03-10 12:17:57 +00002037 install_default(BTS_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +02002038 install_element(BTS_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +02002039 install_element(BTS_NODE, &ournode_end_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00002040 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02002041 install_element(BTS_NODE, &cfg_description_cmd);
2042 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02002043 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02002044 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00002045 install_element(BTS_NODE, &cfg_bts_lac_cmd);
2046 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02002047 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00002048 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02002049 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-08-08 16:12:58 +02002050 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
2051 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte7a8fa412009-08-10 13:48:16 +02002052 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01002053 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
2054 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002055 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
2056 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002057 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002058 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002059 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02002060 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Harald Welte73225282009-12-12 18:17:25 +01002061 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
2062 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Harald Welte4511d892010-04-18 15:51:20 +02002063 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02002064 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08002065 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
2066 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02002067 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08002068 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08002069 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-03-14 23:30:30 +08002070 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
2071 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
2072 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002073
Harald Welte5258fc42009-03-28 19:07:53 +00002074 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002075 install_node(&trx_node, dummy_config_write);
Harald Welte68628e82009-03-10 12:17:57 +00002076 install_default(TRX_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +02002077 install_element(TRX_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +02002078 install_element(TRX_NODE, &ournode_end_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00002079 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02002080 install_element(TRX_NODE, &cfg_description_cmd);
2081 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)7b37d972009-12-27 20:56:38 +01002082 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02002083 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-08-08 16:12:58 +02002084 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
2085 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01002086 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002087
Harald Welte5258fc42009-03-28 19:07:53 +00002088 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002089 install_node(&ts_node, dummy_config_write);
Harald Welte68628e82009-03-10 12:17:57 +00002090 install_default(TS_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +02002091 install_element(TS_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +02002092 install_element(TS_NODE, &ournode_end_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02002093 install_element(TS_NODE, &cfg_ts_pchan_cmd);
2094 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002095
Harald Weltedcccb182010-05-16 20:52:23 +02002096 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00002097
Harald Welte68628e82009-03-10 12:17:57 +00002098 return 0;
2099}