blob: 41a927715f3957f2de127a8cb637d3b0a496729e [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
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 Welte684b9752009-08-09 15:13:54 +020026#include <vty/buffer.h>
Harald Welte59b04682009-06-10 05:40:52 +080027#include <vty/vty.h>
28
29#include <arpa/inet.h>
30
Harald Weltef4625b12010-02-20 16:24:02 +010031#include <osmocore/linuxlist.h>
Harald Welte59b04682009-06-10 05:40:52 +080032#include <openbsc/gsm_data.h>
Harald Welte59b04682009-06-10 05:40:52 +080033#include <openbsc/e1_input.h>
34#include <openbsc/abis_nm.h>
Harald Weltef4625b12010-02-20 16:24:02 +010035#include <osmocore/gsm_utils.h>
Harald Weltefe96f382009-12-22 13:09:29 +010036#include <openbsc/chan_alloc.h>
Harald Welte44007742009-12-22 21:43:14 +010037#include <openbsc/meas_rep.h>
Harald Welte59b04682009-06-10 05:40:52 +080038#include <openbsc/db.h>
Harald Weltef4625b12010-02-20 16:24:02 +010039#include <osmocore/talloc.h>
Holger Hans Peter Freytherc8d862e2009-12-22 22:32:51 +010040#include <openbsc/telnet_interface.h>
Holger Hans Peter Freytherb70d45b2010-04-06 11:55:37 +020041#include <openbsc/vty.h>
Harald Weltef45981f2010-05-12 20:28:04 +020042#include <openbsc/gprs_ns.h>
Harald Welte59b04682009-06-10 05:40:52 +080043
Harald Welte10c29f62010-05-16 19:20:24 +020044#include "../bscconfig.h"
45
Harald Welted6b62e32010-05-12 17:19:53 +000046/* FIXME: this should go to some common file */
47static const struct value_string gprs_ns_timer_strs[] = {
Harald Weltea9251762010-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 Welted6b62e32010-05-12 17:19:53 +000058static const struct value_string gprs_bssgp_cfg_strs[] = {
Harald Weltea9251762010-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 Weltee87eb462009-08-07 13:29:14 +020073struct cmd_node net_node = {
74 GSMNET_NODE,
75 "%s(network)#",
76 1,
77};
78
Harald Welte59b04682009-06-10 05:40:52 +080079struct 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 Welte40152872010-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 Welte59b04682009-06-10 05:40:52 +0800103static 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{
110 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);
113}
114
Harald Weltefe96f382009-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 Welte59b04682009-06-10 05:40:52 +0800135static void net_dump_vty(struct vty *vty, struct gsm_network *net)
136{
Harald Weltefe96f382009-12-22 13:09:29 +0100137 struct pchan_load pl;
138
Harald Welte59b04682009-06-10 05:40:52 +0800139 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);
142 vty_out(vty, " Long network name: '%s'%s",
143 net->name_long, VTY_NEWLINE);
144 vty_out(vty, " Short network name: '%s'%s",
145 net->name_short, VTY_NEWLINE);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +0200146 vty_out(vty, " Authentication policy: %s%s",
147 gsm_auth_policy_name(net->auth_policy), VTY_NEWLINE);
Harald Welte59936d72009-11-18 20:33:19 +0100148 vty_out(vty, " Location updating reject cause: %u%s",
149 net->reject_cause, VTY_NEWLINE);
Harald Weltecca253a2009-08-30 15:47:06 +0900150 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
151 VTY_NEWLINE);
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +0100152 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
153 VTY_NEWLINE);
Harald Welte52af1952009-12-13 10:53:12 +0100154 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
155 VTY_NEWLINE);
Harald Weltea310f3e2009-12-14 09:00:24 +0100156 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
157 VTY_NEWLINE);
Harald Welte0af9c9f2009-12-19 21:41:52 +0100158 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
159 VTY_NEWLINE);
Harald Weltefe96f382009-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 Welte59b04682009-06-10 05:40:52 +0800163}
164
165DEFUN(show_net, show_net_cmd, "show network",
166 SHOW_STR "Display information about a GSM NETWORK\n")
167{
Harald Welte40152872010-05-16 20:52:23 +0200168 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800169 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{
176 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,
187 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
188 vty_out(vty, " E1 TEI %u, SAPI %u%s",
189 e1l->tei, e1l->sapi, VTY_NEWLINE);
190}
191
192static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
193{
Harald Weltefe96f382009-12-22 13:09:29 +0100194 struct pchan_load pl;
195
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +0200196 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Welte91afe4c2009-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 Freythera098dfb2009-08-21 14:44:12 +0200199 bts->cell_identity,
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +0200200 bts->location_area_code, bts->bsic, bts->tsc,
Harald Welte91afe4c2009-06-20 18:15:19 +0200201 bts->num_trx, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200202 vty_out(vty, "Description: %s%s",
203 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Harald Welte8e9d1792009-12-12 15:38:16 +0100204 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +0100205 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte8e9d1792009-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 Welteb761bf82009-12-12 18:17:25 +0100209 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut8e2d8de2009-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 Welte8c973ba2009-12-21 23:08:18 +0100215 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)e19be3f2009-08-12 13:28:23 +0200216 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800217 if (is_ipaccess_bts(bts))
Harald Welte25572872009-10-20 00:22:00 +0200218 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte59b04682009-06-10 05:40:52 +0800219 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte25572872009-10-20 00:22:00 +0200220 bts->oml_tei, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800221 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 Welte25572872009-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 Welte59b04682009-06-10 05:40:52 +0800231 /* FIXME: oml_link, chan_desc */
Harald Weltefe96f382009-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 Welte59b04682009-06-10 05:40:52 +0800236}
237
238DEFUN(show_bts, show_bts_cmd, "show bts [number]",
239 SHOW_STR "Display information about a BTS\n"
240 "BTS number")
241{
Harald Welte40152872010-05-16 20:52:23 +0200242 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800243 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) {
249 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
250 VTY_NEWLINE);
251 return CMD_WARNING;
252 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200253 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte59b04682009-06-10 05:40:52 +0800254 return CMD_SUCCESS;
255 }
256 /* print all BTS's */
257 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee712a5f2009-06-21 16:17:15 +0200258 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte59b04682009-06-10 05:40:52 +0800259
260 return CMD_SUCCESS;
261}
262
Harald Welte62868882009-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 Welte97ceef92009-08-06 19:06:46 +0200291static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
292{
Harald Welte62868882009-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 Welte97ceef92009-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 Weltee87eb462009-08-07 13:29:14 +0200304 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200305 if (trx->description)
306 vty_out(vty, " description %s%s", trx->description,
307 VTY_NEWLINE);
Holger Hans Peter Freyther32be2aa2010-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 Weltee87eb462009-08-07 13:29:14 +0200311 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)b709bfe2009-12-27 20:56:38 +0100312 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200313 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte62868882009-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 Welte97ceef92009-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 Weltea9251762010-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 Welte97ceef92009-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 Weltee87eb462009-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 Welte8791dac2010-05-14 17:59:53 +0200366 if (bts->description)
367 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200368 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freyther6d82b7c2009-11-19 16:38:49 +0100369 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200370 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte97ceef92009-08-06 19:06:46 +0200371 VTY_NEWLINE);
Harald Weltee87eb462009-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)cbd46102009-08-13 10:14:26 +0200374 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welteb761bf82009-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 Weltea54a2bb2009-12-01 18:04:30 +0530379 if (bts->si_common.chan_desc.t3212)
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +0200380 vty_out(vty, " periodic location update %u%s",
Harald Weltea54a2bb2009-12-01 18:04:30 +0530381 bts->si_common.chan_desc.t3212 * 10, VTY_NEWLINE);
Harald Welte3e774612009-08-10 13:48:16 +0200382 vty_out(vty, " channel allocator %s%s",
383 bts->chan_alloc_reverse ? "descending" : "ascending",
384 VTY_NEWLINE);
Sylvain Munaut8e2d8de2009-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 Freyther697ed2b2010-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 Welte8c973ba2009-12-21 23:08:18 +0100397 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)e19be3f2009-08-12 13:28:23 +0200398 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther440984b2010-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 Welte25572872009-10-20 00:22:00 +0200401 if (is_ipaccess_bts(bts)) {
Harald Weltee87eb462009-08-07 13:29:14 +0200402 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Welte3ffe1b32009-08-07 00:25:23 +0200403 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte25572872009-10-20 00:22:00 +0200404 vty_out(vty, " oml ip.access stream_id %u%s", bts->oml_tei, VTY_NEWLINE);
405 } else {
Harald Welte62868882009-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 Weltea9251762010-05-11 23:50:21 +0200409 config_write_bts_gprs(vty, bts);
Harald Welte97ceef92009-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 Welte40152872010-05-16 20:52:23 +0200417 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte97ceef92009-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 Weltee87eb462009-08-07 13:29:14 +0200426static int config_write_net(struct vty *vty)
427{
Harald Welte40152872010-05-16 20:52:23 +0200428 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
429
Harald Weltee87eb462009-08-07 13:29:14 +0200430 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200431 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200432 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte62868882009-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)a59a27e2009-08-12 14:42:23 +0200435 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Harald Welte59936d72009-11-18 20:33:19 +0100436 vty_out(vty, " location updating reject cause %u%s",
437 gsmnet->reject_cause, VTY_NEWLINE);
Harald Weltecca253a2009-08-30 15:47:06 +0900438 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freyther6b4f5462009-11-19 16:37:48 +0100439 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Harald Welte52af1952009-12-13 10:53:12 +0100440 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
441 VTY_NEWLINE);
Harald Weltea310f3e2009-12-14 09:00:24 +0100442 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Welte0af9c9f2009-12-19 21:41:52 +0100443 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Weltea8062f12009-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 Freyther26ba2e72009-11-21 21:18:38 +0100456 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther89733862009-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 Weltee87eb462009-08-07 13:29:14 +0200467
468 return CMD_SUCCESS;
469}
Harald Welte97ceef92009-08-06 19:06:46 +0200470
Harald Welte59b04682009-06-10 05:40:52 +0800471static 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 Welte8791dac2010-05-14 17:59:53 +0200475 vty_out(vty, "Description: %s%s",
476 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Welte91afe4c2009-06-20 18:15:19 +0200477 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte62868882009-08-08 16:12:58 +0200478 "resulting BS power: %d dBm%s",
Harald Welte91afe4c2009-06-20 18:15:19 +0200479 trx->nominal_power, trx->max_power_red,
Harald Welte62868882009-08-08 16:12:58 +0200480 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800481 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 Welte25572872009-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 Welte59b04682009-06-10 05:40:52 +0800492}
493
494DEFUN(show_trx,
495 show_trx_cmd,
496 "show trx [bts_nr] [trx_nr]",
Harald Welte9e002452010-05-11 21:53:49 +0200497 SHOW_STR "Display information about a TRX\n"
498 "BTS Number\n"
499 "TRX Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800500{
Harald Welte40152872010-05-16 20:52:23 +0200501 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800502 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) {
510 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
511 VTY_NEWLINE);
512 return CMD_WARNING;
513 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200514 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800515 }
516 if (argc >= 2) {
517 trx_nr = atoi(argv[1]);
518 if (trx_nr >= bts->num_trx) {
519 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
520 VTY_NEWLINE);
521 return CMD_WARNING;
522 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200523 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800524 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 Weltee712a5f2009-06-21 16:17:15 +0200530 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800531 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 Weltee712a5f2009-06-21 16:17:15 +0200537 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800538 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200539 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800540 trx_dump_vty(vty, trx);
541 }
542 }
543
544 return CMD_SUCCESS;
545}
546
Harald Welte97ceef92009-08-06 19:06:46 +0200547
Harald Welte59b04682009-06-10 05:40:52 +0800548static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
549{
Harald Welte59b04682009-06-10 05:40:52 +0800550 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 Welte87504212009-12-02 01:56:49 +0530555 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welte59b04682009-06-10 05:40:52 +0800556 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 Welte59b04682009-06-10 05:40:52 +0800559}
560
561DEFUN(show_ts,
562 show_ts_cmd,
563 "show timeslot [bts_nr] [trx_nr] [ts_nr]",
Harald Welte9e002452010-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 Welte59b04682009-06-10 05:40:52 +0800566{
Harald Welte40152872010-05-16 20:52:23 +0200567 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800568 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) {
577 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
578 VTY_NEWLINE);
579 return CMD_WARNING;
580 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200581 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800582 }
583 if (argc >= 2) {
584 trx_nr = atoi(argv[1]);
585 if (trx_nr >= bts->num_trx) {
586 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
587 VTY_NEWLINE);
588 return CMD_WARNING;
589 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200590 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800591 }
592 if (argc >= 3) {
593 ts_nr = atoi(argv[2]);
594 if (ts_nr >= TRX_NR_TS) {
595 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
596 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 Weltee712a5f2009-06-21 16:17:15 +0200604 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800605 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200606 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800607 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 Freyther1dd0a1b2010-01-06 06:00:40 +0100617static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte59b04682009-06-10 05:40:52 +0800618{
Harald Welte91afe4c2009-06-20 18:15:19 +0200619 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte59b04682009-06-10 05:40:52 +0800620 subscr->authorized, VTY_NEWLINE);
621 if (subscr->name)
622 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
623 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 Freythercd8bacf2009-08-19 12:53:57 +0200628 if (subscr->tmsi != GSM_RESERVED_TMSI)
629 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte270c06c2009-08-15 03:24:51 +0200630 VTY_NEWLINE);
Sylvain Munaute5863a22009-12-27 19:29:28 +0100631
Harald Welte (local)02d5efa2009-08-14 20:27:16 +0200632 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800633}
634
Harald Welte44007742009-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 Freyther5424e022010-05-14 02:03:16 +0800669static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte59b04682009-06-10 05:40:52 +0800670{
Harald Welte44007742009-12-22 21:43:14 +0100671 int idx;
672
Harald Welte59b04682009-06-10 05:40:52 +0800673 vty_out(vty, "Lchan %u in Timeslot %u of TRX %u in BTS %u, Type %s%s",
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +0200674 lchan->nr, lchan->ts->nr, lchan->ts->trx->nr,
Harald Welte (local)02204d02009-12-27 18:05:25 +0100675 lchan->ts->trx->bts->nr, gsm_lchant_name(lchan->type),
Harald Welte59b04682009-06-10 05:40:52 +0800676 VTY_NEWLINE);
Holger Hans Peter Freyther065b8112010-03-23 06:41:45 +0100677 vty_out(vty, " Use Count: %u, State: %s%s", lchan->conn.use_count,
Harald Welteab2534c2009-12-29 10:52:38 +0100678 gsm_lchans_name(lchan->state), VTY_NEWLINE);
Harald Welteb761bf82009-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 Freyther065b8112010-03-23 06:41:45 +0100684 if (lchan->conn.subscr) {
Harald Welte59b04682009-06-10 05:40:52 +0800685 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther065b8112010-03-23 06:41:45 +0100686 subscr_dump_vty(vty, lchan->conn.subscr);
Harald Welte59b04682009-06-10 05:40:52 +0800687 } else
688 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte87504212009-12-02 01:56:49 +0530689 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
690 struct in_addr ia;
Holger Hans Peter Freythercec1ec52010-04-07 15:39:16 +0200691 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte87504212009-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 Welte44007742009-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 Welte59b04682009-06-10 05:40:52 +0800702}
703
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +0800704static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
705{
Holger Hans Peter Freythercf13a922010-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 Freythere959b4e2010-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 Freythercf13a922010-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 Freythere959b4e2010-05-14 02:08:49 +0800721 VTY_NEWLINE);
722}
723
Holger Hans Peter Freyther5424e022010-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 Welte59b04682009-06-10 05:40:52 +0800726{
Harald Welte40152872010-05-16 20:52:23 +0200727 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800728 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 Weltee712a5f2009-06-21 16:17:15 +0200742 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800743 }
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 Weltee712a5f2009-06-21 16:17:15 +0200751 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800752 }
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 Freyther5424e022010-05-14 02:03:16 +0800770 dump_cb(vty, lchan);
Harald Welte59b04682009-06-10 05:40:52 +0800771 return CMD_SUCCESS;
772 }
773 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200774 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800775 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200776 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800777 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];
782 if (lchan->type == GSM_LCHAN_NONE)
783 continue;
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +0800784 dump_cb(vty, lchan);
Harald Welte59b04682009-06-10 05:40:52 +0800785 }
786 }
787 }
788 }
789
790 return CMD_SUCCESS;
791}
792
Holger Hans Peter Freyther5424e022010-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 Freythere959b4e2010-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 Welte59b04682009-06-10 05:40:52 +0800815static 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
833static 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 Welte9e002452010-05-11 21:53:49 +0200843 SHOW_STR "Display information about a E1 line\n"
844 "E1 Line Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800845{
846 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;
863}
864
865static void e1ts_dump_vty(struct vty *vty, struct e1inp_ts *ts)
866{
Harald Welte62868882009-08-08 16:12:58 +0200867 if (ts->type == E1INP_TS_TYPE_NONE)
868 return;
Harald Welte59b04682009-06-10 05:40:52 +0800869 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);
872}
873
874DEFUN(show_e1ts,
875 show_e1ts_cmd,
876 "show e1_timeslot [line_nr] [ts_nr]",
Harald Welte9e002452010-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 Welte59b04682009-06-10 05:40:52 +0800879{
Harald Welte49c79562009-11-17 06:12:16 +0100880 struct e1inp_line *line = NULL;
Harald Welte59b04682009-06-10 05:40:52 +0800881 struct e1inp_ts *ts;
882 int ts_nr;
883
884 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;
923}
924
925static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
926{
927 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
928 subscr_dump_vty(vty, pag->subscr);
929}
930
931static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
932{
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 Welte9e002452010-05-11 21:53:49 +0200942 SHOW_STR "Display information about paging reuqests of a BTS\n"
943 "BTS Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800944{
Harald Welte40152872010-05-16 20:52:23 +0200945 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800946 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 Weltee712a5f2009-06-21 16:17:15 +0200957 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800958 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 Weltee712a5f2009-06-21 16:17:15 +0200963 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800964 bts_paging_dump_vty(vty, bts);
965 }
966
967 return CMD_SUCCESS;
968}
969
Harald Welte9e002452010-05-11 21:53:49 +0200970#define NETWORK_STR "Configure the GSM network\n"
971
Harald Weltee87eb462009-08-07 13:29:14 +0200972DEFUN(cfg_net,
973 cfg_net_cmd,
Harald Welte9e002452010-05-11 21:53:49 +0200974 "network", NETWORK_STR)
Harald Weltee87eb462009-08-07 13:29:14 +0200975{
Harald Welte40152872010-05-16 20:52:23 +0200976 vty->index = gsmnet_from_vty(vty);
Harald Weltee87eb462009-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 Welte40152872010-05-16 20:52:23 +0200988 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
989
Harald Weltee87eb462009-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 Welte40152872010-05-16 20:52:23 +02001000 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1001
Harald Weltee87eb462009-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 Welte40152872010-05-16 20:52:23 +02001012 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1013
Harald Weltee87eb462009-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 Welte40152872010-05-16 20:52:23 +02001027 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1028
Harald Weltee87eb462009-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 Welte59b04682009-06-10 05:40:52 +08001036
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02001037DEFUN(cfg_net_auth_policy,
1038 cfg_net_auth_policy_cmd,
1039 "auth policy (closed|accept-all|token)",
Harald Welte9e002452010-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)a59a27e2009-08-12 14:42:23 +02001045{
1046 enum gsm_auth_policy policy = gsm_auth_policy_parse(argv[0]);
Harald Welte40152872010-05-16 20:52:23 +02001047 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02001048
1049 gsmnet->auth_policy = policy;
1050
1051 return CMD_SUCCESS;
1052}
1053
Harald Welte59936d72009-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 Welte40152872010-05-16 20:52:23 +02001059 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1060
Harald Welte59936d72009-11-18 20:33:19 +01001061 gsmnet->reject_cause = atoi(argv[0]);
1062
1063 return CMD_SUCCESS;
1064}
1065
Harald Weltecca253a2009-08-30 15:47:06 +09001066DEFUN(cfg_net_encryption,
1067 cfg_net_encryption_cmd,
1068 "encryption a5 (0|1|2)",
Harald Welte18ce31c2010-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 Weltecca253a2009-08-30 15:47:06 +09001072{
Harald Welte40152872010-05-16 20:52:23 +02001073 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1074
Andreas.Eversberg53293292009-11-17 09:55:26 +01001075 gsmnet->a5_encryption= atoi(argv[0]);
Harald Weltecca253a2009-08-30 15:47:06 +09001076
1077 return CMD_SUCCESS;
1078}
1079
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001080DEFUN(cfg_net_neci,
1081 cfg_net_neci_cmd,
1082 "neci (0|1)",
Harald Welte18ce31c2010-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 Freyther96c89822009-11-16 17:12:38 +01001085{
Harald Welte40152872010-05-16 20:52:23 +02001086 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1087
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001088 gsmnet->neci = atoi(argv[0]);
1089 return CMD_SUCCESS;
1090}
1091
Harald Welte52af1952009-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 Welte9e002452010-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 Welte52af1952009-12-13 10:53:12 +01001100{
Harald Welte40152872010-05-16 20:52:23 +02001101 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1102
Harald Welte52af1952009-12-13 10:53:12 +01001103 gsmnet->rrlp.mode = rrlp_mode_parse(argv[0]);
1104
1105 return CMD_SUCCESS;
1106}
1107
Harald Weltea310f3e2009-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 Welte40152872010-05-16 20:52:23 +02001112 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1113
Harald Weltea310f3e2009-12-14 09:00:24 +01001114 gsmnet->send_mm_info = atoi(argv[0]);
1115
1116 return CMD_SUCCESS;
1117}
1118
Harald Welte9e002452010-05-11 21:53:49 +02001119#define HANDOVER_STR "Handover Options\n"
1120
Harald Welte0af9c9f2009-12-19 21:41:52 +01001121DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1122 "handover (0|1)",
Harald Welte9e002452010-05-11 21:53:49 +02001123 HANDOVER_STR
1124 "Don't perform in-call handover\n"
1125 "Perform in-call handover\n")
Harald Welte0af9c9f2009-12-19 21:41:52 +01001126{
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001127 int enable = atoi(argv[0]);
Harald Welte40152872010-05-16 20:52:23 +02001128 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001129
1130 if (enable && ipacc_rtp_direct) {
Harald Welteaa2c3032009-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 Freyther3524d4b2010-01-07 16:14:38 +01001136 gsmnet->handover.active = enable;
Harald Welte0af9c9f2009-12-19 21:41:52 +01001137
1138 return CMD_SUCCESS;
1139}
1140
Harald Welte9e002452010-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 Weltea8062f12009-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 Welte9e002452010-05-11 21:53:49 +02001148 HO_WIN_RXLEV_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001149 "How many RxLev measurements are used for averaging")
1150{
Harald Welte40152872010-05-16 20:52:23 +02001151 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-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 Welte9e002452010-05-11 21:53:49 +02001158 HO_WIN_RXQUAL_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001159 "How many RxQual measurements are used for averaging")
1160{
Harald Welte40152872010-05-16 20:52:23 +02001161 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-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 Welte9e002452010-05-11 21:53:49 +02001168 HO_WIN_RXLEV_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001169 "How many RxQual measurements are used for averaging")
1170{
Harald Welte40152872010-05-16 20:52:23 +02001171 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-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 Welte9e002452010-05-11 21:53:49 +02001178 HO_PBUDGET_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001179 "How often to check if we have a better cell (SACCH frames)")
1180{
Harald Welte40152872010-05-16 20:52:23 +02001181 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-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 Welte9e002452010-05-11 21:53:49 +02001188 HO_PBUDGET_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001189 "How many dB does a neighbor to be stronger to become a HO candidate")
1190{
Harald Welte40152872010-05-16 20:52:23 +02001191 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-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 Welte9e002452010-05-11 21:53:49 +02001198 HANDOVER_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001199 "How big is the maximum timing advance before HO is forced")
1200{
Harald Welte40152872010-05-16 20:52:23 +02001201 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001202 gsmnet->handover.max_distance = atoi(argv[0]);
1203 return CMD_SUCCESS;
1204}
Harald Welte0af9c9f2009-12-19 21:41:52 +01001205
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001206#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001207 DEFUN(cfg_net_T##number, \
1208 cfg_net_T##number##_cmd, \
1209 "timer t" #number " <0-65535>", \
Harald Welte9e002452010-05-11 21:53:49 +02001210 "Configure GSM Timers\n" \
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001211 doc) \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001212{ \
Harald Welte40152872010-05-16 20:52:23 +02001213 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freyther26ba2e72009-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 Freyther13ae9802009-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 Freyther26ba2e72009-11-21 21:18:38 +01001237
1238
Harald Welte59b04682009-06-10 05:40:52 +08001239/* per-BTS configuration */
1240DEFUN(cfg_bts,
1241 cfg_bts_cmd,
1242 "bts BTS_NR",
Harald Welte9e002452010-05-11 21:53:49 +02001243 "Select a BTS to configure\n"
1244 "BTS Number\n")
Harald Welte59b04682009-06-10 05:40:52 +08001245{
Harald Welte40152872010-05-16 20:52:23 +02001246 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +08001247 int bts_nr = atoi(argv[0]);
1248 struct gsm_bts *bts;
1249
Harald Weltee712a5f2009-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 Welte59b04682009-06-10 05:40:52 +08001253 return CMD_WARNING;
Harald Weltee712a5f2009-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 Freyther71135142010-03-29 08:47:44 +02001258 } else
Harald Weltee712a5f2009-06-21 16:17:15 +02001259 bts = gsm_bts_num(gsmnet, bts_nr);
1260
Daniel Willmann580085f2010-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 Weltee712a5f2009-06-21 16:17:15 +02001264 return CMD_WARNING;
Daniel Willmann580085f2010-01-11 13:43:07 +01001265 }
Harald Welte59b04682009-06-10 05:40:52 +08001266
1267 vty->index = bts;
Harald Welte8791dac2010-05-14 17:59:53 +02001268 vty->index_sub = &bts->description;
Harald Welte59b04682009-06-10 05:40:52 +08001269 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 Welte59698fb2010-01-10 18:01:52 +01001280 int rc;
Harald Welte59b04682009-06-10 05:40:52 +08001281
Harald Welte59698fb2010-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 Welte25572872009-10-20 00:22:00 +02001285
Harald Welte59b04682009-06-10 05:40:52 +08001286 return CMD_SUCCESS;
1287}
1288
Harald Welte91afe4c2009-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 Welte62868882009-08-08 16:12:58 +02001295 int band = gsm_band_parse(argv[0]);
Harald Welte91afe4c2009-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 Freythera098dfb2009-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 Welte59b04682009-06-10 05:40:52 +08001326DEFUN(cfg_bts_lac,
1327 cfg_bts_lac_cmd,
Holger Hans Peter Freyther54a22832009-09-29 14:02:33 +02001328 "location_area_code <0-65535>",
Harald Welte59b04682009-06-10 05:40:52 +08001329 "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 Freyther54a22832009-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 Welte59b04682009-06-10 05:40:52 +08001336 lac, VTY_NEWLINE);
1337 return CMD_WARNING;
1338 }
Holger Hans Peter Freyther6c6ab862009-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 Welte59b04682009-06-10 05:40:52 +08001346 bts->location_area_code = lac;
1347
1348 return CMD_SUCCESS;
1349}
1350
Harald Weltea54a2bb2009-12-01 18:04:30 +05301351
Harald Welte59b04682009-06-10 05:40:52 +08001352DEFUN(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
1370DEFUN(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 Welte62868882009-08-08 16:12:58 +02001379 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte59b04682009-06-10 05:40:52 +08001380 bsic, VTY_NEWLINE);
1381 return CMD_WARNING;
1382 }
1383 bts->bsic = bsic;
1384
1385 return CMD_SUCCESS;
1386}
1387
1388
1389DEFUN(cfg_bts_unit_id,
1390 cfg_bts_unit_id_cmd,
Harald Weltef515aa02009-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 Welte59b04682009-06-10 05:40:52 +08001393{
1394 struct gsm_bts *bts = vty->index;
1395 int site_id = atoi(argv[0]);
1396 int bts_id = atoi(argv[1]);
1397
Harald Weltef515aa02009-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 Welte59b04682009-06-10 05:40:52 +08001403 bts->ip_access.site_id = site_id;
1404 bts->ip_access.bts_id = bts_id;
1405
1406 return CMD_SUCCESS;
1407}
1408
Harald Welte9e002452010-05-11 21:53:49 +02001409#define OML_STR "Organization & Maintenance Link\n"
1410#define IPA_STR "ip.access Specific Options\n"
1411
Harald Welte25572872009-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 Welte9e002452010-05-11 21:53:49 +02001415 OML_STR IPA_STR
Harald Welte25572872009-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 Welte9e002452010-05-11 21:53:49 +02001431#define OML_E1_STR OML_STR "E1 Line\n"
Harald Welte25572872009-10-20 00:22:00 +02001432
Harald Welte62868882009-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 Welte9e002452010-05-11 21:53:49 +02001436 OML_E1_STR
Harald Welte62868882009-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 Welte9e002452010-05-11 21:53:49 +02001450 OML_E1_STR
Harald Welte62868882009-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 Welte3e774612009-08-10 13:48:16 +02001460DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1461 "channel allocator (ascending|descending)",
Harald Welte9e002452010-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 Welte3e774612009-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 Welte9e002452010-05-11 21:53:49 +02001476#define RACH_STR "Random Access Control Channel\n"
1477
Sylvain Munaut8e2d8de2009-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 Welte9e002452010-05-11 21:53:49 +02001481 RACH_STR
Sylvain Munaut8e2d8de2009-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 Welte9e002452010-05-11 21:53:49 +02001492 RACH_STR
Sylvain Munaut8e2d8de2009-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 Welte9e002452010-05-11 21:53:49 +02001500#define NM_STR "Network Management\n"
1501
Holger Hans Peter Freyther697ed2b2010-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 Welte9e002452010-05-11 21:53:49 +02001505 RACH_STR NM_STR
1506 "Set the NM Busy Threshold in dB")
Holger Hans Peter Freyther697ed2b2010-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 Welte9e002452010-05-11 21:53:49 +02001516 RACH_STR NM_STR
1517 "Set the NM Loadaverage Slots value")
Holger Hans Peter Freyther697ed2b2010-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)e19be3f2009-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 Welte8c973ba2009-12-21 23:08:18 +01001530 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02001531
1532 return CMD_SUCCESS;
1533}
1534
Holger Hans Peter Freyther440984b2010-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)cbd46102009-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 Welteb761bf82009-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)b6ea7f72009-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 Weltea54a2bb2009-12-01 18:04:30 +05301588 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 10;
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02001589
1590 return CMD_SUCCESS;
1591}
1592
Harald Welte9e002452010-05-11 21:53:49 +02001593#define GPRS_TEXT "GPRS Packet Network\n"
1594
Harald Welte410575a2010-03-14 23:30:30 +08001595DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welteb42fe342010-04-18 14:00:26 +02001596 "gprs cell bvci <2-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001597 GPRS_TEXT
1598 "GPRS Cell Settings\n"
Harald Welte3055e332010-03-14 15:37:43 +08001599 "GPRS BSSGP VC Identifier")
1600{
1601 struct gsm_bts *bts = vty->index;
1602
Harald Weltecb20b7a2010-04-18 15:51:20 +02001603 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-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 Welte3055e332010-03-14 15:37:43 +08001608 bts->gprs.cell.bvci = atoi(argv[0]);
1609
1610 return CMD_SUCCESS;
1611}
1612
Harald Welte4a048c52010-03-22 11:48:36 +08001613DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
1614 "gprs nsei <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001615 GPRS_TEXT
Harald Welte4a048c52010-03-22 11:48:36 +08001616 "GPRS NS Entity Identifier")
1617{
1618 struct gsm_bts *bts = vty->index;
1619
Harald Weltecb20b7a2010-04-18 15:51:20 +02001620 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte4a048c52010-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 Welte9e002452010-05-11 21:53:49 +02001630#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
1631 "NSVC Logical Number\n"
Harald Welte4a048c52010-03-22 11:48:36 +08001632
Harald Welte3055e332010-03-14 15:37:43 +08001633DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
1634 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001635 GPRS_TEXT NSVC_TEXT
1636 "NS Virtual Connection Identifier\n"
Harald Welte3055e332010-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 Weltecb20b7a2010-04-18 15:51:20 +02001642 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-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 Welte3055e332010-03-14 15:37:43 +08001647 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
1648
1649 return CMD_SUCCESS;
1650}
1651
Harald Welte410575a2010-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 Welte9e002452010-05-11 21:53:49 +02001654 GPRS_TEXT NSVC_TEXT
Harald Welte410575a2010-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 Weltecb20b7a2010-04-18 15:51:20 +02001660 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-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 Welte410575a2010-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 Welte9e002452010-05-11 21:53:49 +02001672 GPRS_TEXT NSVC_TEXT
Harald Welte410575a2010-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 Weltecb20b7a2010-04-18 15:51:20 +02001678 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-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 Welte410575a2010-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 Welte9e002452010-05-11 21:53:49 +02001690 GPRS_TEXT NSVC_TEXT
Harald Welte410575a2010-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 Weltecb20b7a2010-04-18 15:51:20 +02001697 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-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 Welte410575a2010-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 Weltea9251762010-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 Welte18ce31c2010-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 Weltea9251762010-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 Welte3055e332010-03-14 15:37:43 +08001768DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
1769 "gprs routing area <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02001770 GPRS_TEXT
Harald Welte3055e332010-03-14 15:37:43 +08001771 "GPRS Routing Area Code")
1772{
1773 struct gsm_bts *bts = vty->index;
1774
Harald Weltecb20b7a2010-04-18 15:51:20 +02001775 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-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 Welte3055e332010-03-14 15:37:43 +08001780 bts->gprs.rac = atoi(argv[0]);
1781
1782 return CMD_SUCCESS;
1783}
1784
Harald Weltecb20b7a2010-04-18 15:51:20 +02001785DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
1786 "gprs mode (none|gprs|egprs)",
Harald Welte9e002452010-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 Welte410575a2010-03-14 23:30:30 +08001792{
1793 struct gsm_bts *bts = vty->index;
1794
Harald Weltecb20b7a2010-04-18 15:51:20 +02001795 bts->gprs.mode = bts_gprs_mode_parse(argv[0]);
Harald Welte410575a2010-03-14 23:30:30 +08001796
1797 return CMD_SUCCESS;
1798}
1799
Harald Welte9e002452010-05-11 21:53:49 +02001800#define TRX_TEXT "Radio Transceiver\n"
Harald Welte3e774612009-08-10 13:48:16 +02001801
Harald Welte59b04682009-06-10 05:40:52 +08001802/* per TRX configuration */
1803DEFUN(cfg_trx,
1804 cfg_trx_cmd,
1805 "trx TRX_NR",
Harald Welte9e002452010-05-11 21:53:49 +02001806 TRX_TEXT
Harald Welte59b04682009-06-10 05:40:52 +08001807 "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 Weltee712a5f2009-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 Welte59b04682009-06-10 05:40:52 +08001816 return CMD_WARNING;
Harald Weltee712a5f2009-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 Freyther71135142010-03-29 08:47:44 +02001820 } else
Harald Weltee712a5f2009-06-21 16:17:15 +02001821 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02001822
Harald Weltee712a5f2009-06-21 16:17:15 +02001823 if (!trx)
1824 return CMD_WARNING;
Harald Welte59b04682009-06-10 05:40:52 +08001825
1826 vty->index = trx;
Harald Welte8791dac2010-05-14 17:59:53 +02001827 vty->index_sub = &trx->description;
Harald Welte59b04682009-06-10 05:40:52 +08001828 vty->node = TRX_NODE;
1829
1830 return CMD_SUCCESS;
1831}
1832
1833DEFUN(cfg_trx_arfcn,
1834 cfg_trx_arfcn_cmd,
Harald Welte00044592010-05-14 19:00:52 +02001835 "arfcn <0-1024>",
Harald Welte59b04682009-06-10 05:40:52 +08001836 "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)b709bfe2009-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 Welte91afe4c2009-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 Welte01acd742009-11-18 09:20:22 +01001871 int upper_limit = 24; /* default 12.21 max power red. */
Harald Welte91afe4c2009-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 Welte62868882009-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 Freyther1c8b4802009-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 Welte62868882009-08-08 16:12:58 +02001927
Harald Welte59b04682009-06-10 05:40:52 +08001928/* per TS configuration */
1929DEFUN(cfg_ts,
1930 cfg_ts_cmd,
Harald Welte62868882009-08-08 16:12:58 +02001931 "timeslot <0-7>",
Harald Welte59b04682009-06-10 05:40:52 +08001932 "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 Welte3ffe1b32009-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 Welte62868882009-08-08 16:12:58 +02001971 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welte3ffe1b32009-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 Welte62868882009-08-08 16:12:58 +02001976 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Welte3ffe1b32009-08-07 00:25:23 +02001977
1978 return CMD_SUCCESS;
1979}
Harald Welte59b04682009-06-10 05:40:52 +08001980
Harald Weltea5b1dae2010-05-16 21:47:13 +02001981void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
1982{
1983 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
1984 counter_get(net->stats.chreq.total),
1985 counter_get(net->stats.chreq.no_channel), VTY_NEWLINE);
1986 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
1987 counter_get(net->stats.chan.rf_fail),
1988 counter_get(net->stats.chan.rll_err), VTY_NEWLINE);
1989 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
1990 counter_get(net->stats.paging.attempted),
1991 counter_get(net->stats.paging.completed),
1992 counter_get(net->stats.paging.expired), VTY_NEWLINE);
1993 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
1994 counter_get(net->stats.bts.oml_fail),
1995 counter_get(net->stats.bts.rsl_fail), VTY_NEWLINE);
1996}
1997
Harald Welte40152872010-05-16 20:52:23 +02001998extern int bsc_vty_init_extra(void);
Harald Welte10c29f62010-05-16 19:20:24 +02001999extern const char *openbsc_copyright;
Holger Hans Peter Freytherc48a2a12010-04-10 00:08:28 +02002000
Harald Welte40152872010-05-16 20:52:23 +02002001int bsc_vty_init(void)
Harald Welte59b04682009-06-10 05:40:52 +08002002{
Harald Welte7bc28f62010-05-12 16:10:35 +00002003 install_element_ve(&show_net_cmd);
2004 install_element_ve(&show_bts_cmd);
2005 install_element_ve(&show_trx_cmd);
2006 install_element_ve(&show_ts_cmd);
2007 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08002008 install_element_ve(&show_lchan_summary_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002009
Harald Welte7bc28f62010-05-12 16:10:35 +00002010 install_element_ve(&show_e1drv_cmd);
2011 install_element_ve(&show_e1line_cmd);
2012 install_element_ve(&show_e1ts_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002013
Harald Welte7bc28f62010-05-12 16:10:35 +00002014 install_element_ve(&show_paging_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002015
Holger Hans Peter Freytherb70d45b2010-04-06 11:55:37 +02002016 openbsc_vty_add_cmds();
Holger Hans Peter Freytherc8d862e2009-12-22 22:32:51 +01002017
Harald Weltee87eb462009-08-07 13:29:14 +02002018 install_element(CONFIG_NODE, &cfg_net_cmd);
2019 install_node(&net_node, config_write_net);
2020 install_default(GSMNET_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +02002021 install_element(GSMNET_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +02002022 install_element(GSMNET_NODE, &ournode_end_cmd);
Harald Welte62868882009-08-08 16:12:58 +02002023 install_element(GSMNET_NODE, &cfg_net_ncc_cmd);
Harald Weltee87eb462009-08-07 13:29:14 +02002024 install_element(GSMNET_NODE, &cfg_net_mnc_cmd);
2025 install_element(GSMNET_NODE, &cfg_net_name_short_cmd);
2026 install_element(GSMNET_NODE, &cfg_net_name_long_cmd);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02002027 install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd);
Harald Welte59936d72009-11-18 20:33:19 +01002028 install_element(GSMNET_NODE, &cfg_net_reject_cause_cmd);
Harald Weltecca253a2009-08-30 15:47:06 +09002029 install_element(GSMNET_NODE, &cfg_net_encryption_cmd);
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01002030 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Welte52af1952009-12-13 10:53:12 +01002031 install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd);
Harald Welte284ddba2009-12-14 17:49:15 +01002032 install_element(GSMNET_NODE, &cfg_net_mm_info_cmd);
Harald Welte0af9c9f2009-12-19 21:41:52 +01002033 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Weltea8062f12009-12-21 16:51:50 +01002034 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
2035 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
2036 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
2037 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
2038 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
2039 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01002040 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +01002041 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
2042 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
2043 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
2044 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
2045 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
2046 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
2047 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
2048 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
2049 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
2050 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Harald Weltee87eb462009-08-07 13:29:14 +02002051
2052 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte97ceef92009-08-06 19:06:46 +02002053 install_node(&bts_node, config_write_bts);
Harald Welte59b04682009-06-10 05:40:52 +08002054 install_default(BTS_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +02002055 install_element(BTS_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +02002056 install_element(BTS_NODE, &ournode_end_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002057 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte8791dac2010-05-14 17:59:53 +02002058 install_element(BTS_NODE, &cfg_description_cmd);
2059 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Welte91afe4c2009-06-20 18:15:19 +02002060 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +02002061 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002062 install_element(BTS_NODE, &cfg_bts_lac_cmd);
2063 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte62868882009-08-08 16:12:58 +02002064 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002065 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte25572872009-10-20 00:22:00 +02002066 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte62868882009-08-08 16:12:58 +02002067 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
2068 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte3e774612009-08-10 13:48:16 +02002069 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01002070 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
2071 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08002072 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
2073 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02002074 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +08002075 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Harald Welte (local)cbd46102009-08-13 10:14:26 +02002076 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02002077 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Harald Welteb761bf82009-12-12 18:17:25 +01002078 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
2079 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Harald Weltecb20b7a2010-04-18 15:51:20 +02002080 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
Harald Weltea9251762010-05-11 23:50:21 +02002081 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte3055e332010-03-14 15:37:43 +08002082 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
2083 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Weltea9251762010-05-11 23:50:21 +02002084 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Welte4a048c52010-03-22 11:48:36 +08002085 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte3055e332010-03-14 15:37:43 +08002086 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welte410575a2010-03-14 23:30:30 +08002087 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
2088 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
2089 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002090
2091 install_element(BTS_NODE, &cfg_trx_cmd);
2092 install_node(&trx_node, dummy_config_write);
2093 install_default(TRX_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +02002094 install_element(TRX_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +02002095 install_element(TRX_NODE, &ournode_end_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002096 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte8791dac2010-05-14 17:59:53 +02002097 install_element(TRX_NODE, &cfg_description_cmd);
2098 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)b709bfe2009-12-27 20:56:38 +01002099 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte7f597bc2009-06-20 22:36:12 +02002100 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte62868882009-08-08 16:12:58 +02002101 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
2102 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther1c8b4802009-11-11 11:54:24 +01002103 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002104
2105 install_element(TRX_NODE, &cfg_ts_cmd);
2106 install_node(&ts_node, dummy_config_write);
2107 install_default(TS_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +02002108 install_element(TS_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +02002109 install_element(TS_NODE, &ournode_end_cmd);
Harald Welte3ffe1b32009-08-07 00:25:23 +02002110 install_element(TS_NODE, &cfg_ts_pchan_cmd);
2111 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002112
Harald Welte40152872010-05-16 20:52:23 +02002113 bsc_vty_init_extra();
Harald Welte59b04682009-06-10 05:40:52 +08002114
2115 return 0;
2116}