blob: 5eacb22af03fca4475fcd12932606be500e1360d [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
Harald Weltebd9591f2010-05-19 19:45:32 +020025#include <osmocom/vty/command.h>
26#include <osmocom/vty/buffer.h>
27#include <osmocom/vty/vty.h>
28#include <osmocom/vty/logging.h>
29#include <osmocom/vty/telnet_interface.h>
Harald Welte59b04682009-06-10 05:40:52 +080030
31#include <arpa/inet.h>
32
Harald Weltef4625b12010-02-20 16:24:02 +010033#include <osmocore/linuxlist.h>
Harald Welte59b04682009-06-10 05:40:52 +080034#include <openbsc/gsm_data.h>
Harald Welte59b04682009-06-10 05:40:52 +080035#include <openbsc/e1_input.h>
36#include <openbsc/abis_nm.h>
Harald Weltef4625b12010-02-20 16:24:02 +010037#include <osmocore/gsm_utils.h>
Harald Weltefe96f382009-12-22 13:09:29 +010038#include <openbsc/chan_alloc.h>
Harald Welte44007742009-12-22 21:43:14 +010039#include <openbsc/meas_rep.h>
Harald Welte59b04682009-06-10 05:40:52 +080040#include <openbsc/db.h>
Harald Weltef4625b12010-02-20 16:24:02 +010041#include <osmocore/talloc.h>
Holger Hans Peter Freytherb70d45b2010-04-06 11:55:37 +020042#include <openbsc/vty.h>
Harald Weltef45981f2010-05-12 20:28:04 +020043#include <openbsc/gprs_ns.h>
Harald Welte682ee5f2010-05-16 22:02:16 +020044#include <openbsc/debug.h>
Harald Welte59b04682009-06-10 05:40:52 +080045
Harald Welte10c29f62010-05-16 19:20:24 +020046#include "../bscconfig.h"
47
Harald Welted6b62e32010-05-12 17:19:53 +000048/* FIXME: this should go to some common file */
49static const struct value_string gprs_ns_timer_strs[] = {
Harald Weltea9251762010-05-11 23:50:21 +020050 { 0, "tns-block" },
51 { 1, "tns-block-retries" },
52 { 2, "tns-reset" },
53 { 3, "tns-reset-retries" },
54 { 4, "tns-test" },
55 { 5, "tns-alive" },
56 { 6, "tns-alive-retries" },
57 { 0, NULL }
58};
59
Harald Welted6b62e32010-05-12 17:19:53 +000060static const struct value_string gprs_bssgp_cfg_strs[] = {
Harald Weltea9251762010-05-11 23:50:21 +020061 { 0, "blocking-timer" },
62 { 1, "blocking-retries" },
63 { 2, "unblocking-retries" },
64 { 3, "reset-timer" },
65 { 4, "reset-retries" },
66 { 5, "suspend-timer" },
67 { 6, "suspend-retries" },
68 { 7, "resume-timer" },
69 { 8, "resume-retries" },
70 { 9, "capability-update-timer" },
71 { 10, "capability-update-retries" },
72 { 0, NULL }
73};
74
Harald Weltee87eb462009-08-07 13:29:14 +020075struct cmd_node net_node = {
76 GSMNET_NODE,
77 "%s(network)#",
78 1,
79};
80
Harald Welte59b04682009-06-10 05:40:52 +080081struct cmd_node bts_node = {
82 BTS_NODE,
83 "%s(bts)#",
84 1,
85};
86
87struct cmd_node trx_node = {
88 TRX_NODE,
89 "%s(trx)#",
90 1,
91};
92
93struct cmd_node ts_node = {
94 TS_NODE,
95 "%s(ts)#",
96 1,
97};
98
Harald Welte61daf6d2010-05-27 13:39:40 +020099extern struct gsm_network *bsc_gsmnet;
100
Harald Welte40152872010-05-16 20:52:23 +0200101struct gsm_network *gsmnet_from_vty(struct vty *v)
102{
Harald Welte61daf6d2010-05-27 13:39:40 +0200103 /* In case we read from the config file, the vty->priv cannot
104 * point to a struct telnet_connection, and thus conn->priv
105 * will not point to the gsm_network structure */
106#if 0
Harald Welte40152872010-05-16 20:52:23 +0200107 struct telnet_connection *conn = v->priv;
108 return (struct gsm_network *) conn->priv;
Harald Welte61daf6d2010-05-27 13:39:40 +0200109#else
110 return bsc_gsmnet;
111#endif
Harald Welte40152872010-05-16 20:52:23 +0200112}
113
Harald Welte59b04682009-06-10 05:40:52 +0800114static int dummy_config_write(struct vty *v)
115{
116 return CMD_SUCCESS;
117}
118
119static void net_dump_nmstate(struct vty *vty, struct gsm_nm_state *nms)
120{
121 vty_out(vty,"Oper '%s', Admin %u, Avail '%s'%s",
122 nm_opstate_name(nms->operational), nms->administrative,
123 nm_avail_name(nms->availability), VTY_NEWLINE);
124}
125
Harald Weltefe96f382009-12-22 13:09:29 +0100126static void dump_pchan_load_vty(struct vty *vty, char *prefix,
127 const struct pchan_load *pl)
128{
129 int i;
130
131 for (i = 0; i < ARRAY_SIZE(pl->pchan); i++) {
132 const struct load_counter *lc = &pl->pchan[i];
133 unsigned int percent;
134
135 if (lc->total == 0)
136 continue;
137
138 percent = (lc->used * 100) / lc->total;
139
140 vty_out(vty, "%s%20s: %3u%% (%u/%u)%s", prefix,
141 gsm_pchan_name(i), percent, lc->used, lc->total,
142 VTY_NEWLINE);
143 }
144}
145
Harald Welte59b04682009-06-10 05:40:52 +0800146static void net_dump_vty(struct vty *vty, struct gsm_network *net)
147{
Harald Weltefe96f382009-12-22 13:09:29 +0100148 struct pchan_load pl;
149
Harald Welte59b04682009-06-10 05:40:52 +0800150 vty_out(vty, "BSC is on Country Code %u, Network Code %u "
151 "and has %u BTS%s", net->country_code, net->network_code,
152 net->num_bts, VTY_NEWLINE);
153 vty_out(vty, " Long network name: '%s'%s",
154 net->name_long, VTY_NEWLINE);
155 vty_out(vty, " Short network name: '%s'%s",
156 net->name_short, VTY_NEWLINE);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +0200157 vty_out(vty, " Authentication policy: %s%s",
158 gsm_auth_policy_name(net->auth_policy), VTY_NEWLINE);
Harald Welte59936d72009-11-18 20:33:19 +0100159 vty_out(vty, " Location updating reject cause: %u%s",
160 net->reject_cause, VTY_NEWLINE);
Harald Weltecca253a2009-08-30 15:47:06 +0900161 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
162 VTY_NEWLINE);
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +0100163 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
164 VTY_NEWLINE);
Harald Welte52af1952009-12-13 10:53:12 +0100165 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
166 VTY_NEWLINE);
Harald Weltea310f3e2009-12-14 09:00:24 +0100167 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
168 VTY_NEWLINE);
Harald Welte0af9c9f2009-12-19 21:41:52 +0100169 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
170 VTY_NEWLINE);
Harald Weltefe96f382009-12-22 13:09:29 +0100171 network_chan_load(&pl, net);
172 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
173 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte59b04682009-06-10 05:40:52 +0800174}
175
176DEFUN(show_net, show_net_cmd, "show network",
177 SHOW_STR "Display information about a GSM NETWORK\n")
178{
Harald Welte40152872010-05-16 20:52:23 +0200179 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800180 net_dump_vty(vty, net);
181
182 return CMD_SUCCESS;
183}
184
185static void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l)
186{
187 struct e1inp_line *line;
188
189 if (!e1l) {
190 vty_out(vty, " None%s", VTY_NEWLINE);
191 return;
192 }
193
194 line = e1l->ts->line;
195
196 vty_out(vty, " E1 Line %u, Type %s: Timeslot %u, Mode %s%s",
197 line->num, line->driver->name, e1l->ts->num,
198 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
199 vty_out(vty, " E1 TEI %u, SAPI %u%s",
200 e1l->tei, e1l->sapi, VTY_NEWLINE);
201}
202
203static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
204{
Harald Weltefe96f382009-12-22 13:09:29 +0100205 struct pchan_load pl;
206
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +0200207 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Welte91afe4c2009-06-20 18:15:19 +0200208 "BSIC %u, TSC %u and %u TRX%s",
209 bts->nr, btstype2str(bts->type), gsm_band_name(bts->band),
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +0200210 bts->cell_identity,
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +0200211 bts->location_area_code, bts->bsic, bts->tsc,
Harald Welte91afe4c2009-06-20 18:15:19 +0200212 bts->num_trx, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200213 vty_out(vty, "Description: %s%s",
214 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Harald Welte8e9d1792009-12-12 15:38:16 +0100215 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +0100216 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte8e9d1792009-12-12 15:38:16 +0100217 rxlev2dbm(bts->si_common.cell_sel_par.rxlev_acc_min),
218 VTY_NEWLINE);
219 vty_out(vty, "Cell Reselection Hysteresis: %u dBm%s",
Harald Welteb761bf82009-12-12 18:17:25 +0100220 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +0100221 vty_out(vty, "RACH TX-Integer: %u%s", bts->si_common.rach_control.tx_integer,
222 VTY_NEWLINE);
223 vty_out(vty, "RACH Max transmissions: %u%s",
224 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
225 VTY_NEWLINE);
Harald Welte8c973ba2009-12-21 23:08:18 +0100226 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)e19be3f2009-08-12 13:28:23 +0200227 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800228 if (is_ipaccess_bts(bts))
Harald Welte25572872009-10-20 00:22:00 +0200229 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte59b04682009-06-10 05:40:52 +0800230 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte25572872009-10-20 00:22:00 +0200231 bts->oml_tei, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800232 vty_out(vty, " NM State: ");
233 net_dump_nmstate(vty, &bts->nm_state);
234 vty_out(vty, " Site Mgr NM State: ");
235 net_dump_nmstate(vty, &bts->site_mgr.nm_state);
236 vty_out(vty, " Paging: FIXME pending requests, %u free slots%s",
237 bts->paging.available_slots, VTY_NEWLINE);
Harald Welte25572872009-10-20 00:22:00 +0200238 if (!is_ipaccess_bts(bts)) {
239 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
240 e1isl_dump_vty(vty, bts->oml_link);
241 }
Harald Welte59b04682009-06-10 05:40:52 +0800242 /* FIXME: oml_link, chan_desc */
Harald Weltefe96f382009-12-22 13:09:29 +0100243 memset(&pl, 0, sizeof(pl));
244 bts_chan_load(&pl, bts);
245 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
246 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte59b04682009-06-10 05:40:52 +0800247}
248
249DEFUN(show_bts, show_bts_cmd, "show bts [number]",
250 SHOW_STR "Display information about a BTS\n"
251 "BTS number")
252{
Harald Welte40152872010-05-16 20:52:23 +0200253 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800254 int bts_nr;
255
256 if (argc != 0) {
257 /* use the BTS number that the user has specified */
258 bts_nr = atoi(argv[0]);
259 if (bts_nr > net->num_bts) {
260 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
261 VTY_NEWLINE);
262 return CMD_WARNING;
263 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200264 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte59b04682009-06-10 05:40:52 +0800265 return CMD_SUCCESS;
266 }
267 /* print all BTS's */
268 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee712a5f2009-06-21 16:17:15 +0200269 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte59b04682009-06-10 05:40:52 +0800270
271 return CMD_SUCCESS;
272}
273
Harald Welte62868882009-08-08 16:12:58 +0200274/* utility functions */
275static void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,
276 const char *ts, const char *ss)
277{
278 e1_link->e1_nr = atoi(line);
279 e1_link->e1_ts = atoi(ts);
280 if (!strcmp(ss, "full"))
281 e1_link->e1_ts_ss = 255;
282 else
283 e1_link->e1_ts_ss = atoi(ss);
284}
285
286static void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,
287 const char *prefix)
288{
289 if (!e1_link->e1_ts)
290 return;
291
292 if (e1_link->e1_ts_ss == 255)
293 vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",
294 prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);
295 else
296 vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",
297 prefix, e1_link->e1_nr, e1_link->e1_ts,
298 e1_link->e1_ts_ss, VTY_NEWLINE);
299}
300
301
Harald Welte97ceef92009-08-06 19:06:46 +0200302static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
303{
Harald Welte62868882009-08-08 16:12:58 +0200304 vty_out(vty, " timeslot %u%s", ts->nr, VTY_NEWLINE);
305 if (ts->pchan != GSM_PCHAN_NONE)
306 vty_out(vty, " phys_chan_config %s%s",
307 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
Harald Weltea42a93f2010-06-14 22:26:10 +0200308 vty_out(vty, " hopping enabled %u%s",
309 ts->hopping.enabled, VTY_NEWLINE);
310 if (ts->hopping.enabled) {
311 unsigned int i;
312 vty_out(vty, " hopping sequence-number %u%s",
Harald Welte67104d12009-09-12 13:05:33 +0200313 ts->hopping.hsn, VTY_NEWLINE);
Harald Weltea42a93f2010-06-14 22:26:10 +0200314 vty_out(vty, " hopping maio %u%s",
Harald Welte67104d12009-09-12 13:05:33 +0200315 ts->hopping.maio, VTY_NEWLINE);
Harald Weltea42a93f2010-06-14 22:26:10 +0200316 for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {
317 if (!bitvec_get_bit_pos(&ts->hopping.arfcns, i))
318 continue;
319 vty_out(vty, " hopping arfcn add %u%s",
320 i, VTY_NEWLINE);
321 }
322 } else
Harald Welte62868882009-08-08 16:12:58 +0200323 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Welte97ceef92009-08-06 19:06:46 +0200324}
325
326static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
327{
328 int i;
329
Harald Weltee87eb462009-08-07 13:29:14 +0200330 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200331 if (trx->description)
332 vty_out(vty, " description %s%s", trx->description,
333 VTY_NEWLINE);
Holger Hans Peter Freyther32be2aa2010-04-17 06:42:07 +0200334 vty_out(vty, " rf_locked %u%s",
335 trx->nm_state.administrative == NM_STATE_LOCKED ? 1 : 0,
336 VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200337 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)b709bfe2009-12-27 20:56:38 +0100338 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200339 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200340 config_write_e1_link(vty, &trx->rsl_e1_link, " rsl ");
341 vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei, VTY_NEWLINE);
Harald Welte97ceef92009-08-06 19:06:46 +0200342
343 for (i = 0; i < TRX_NR_TS; i++)
344 config_write_ts_single(vty, &trx->ts[i]);
345}
346
Harald Weltea9251762010-05-11 23:50:21 +0200347static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
348{
349 unsigned int i;
350 vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
351 VTY_NEWLINE);
352 if (bts->gprs.mode == BTS_GPRS_NONE)
353 return;
354
355 vty_out(vty, " gprs routing area %u%s", bts->gprs.rac,
356 VTY_NEWLINE);
357 vty_out(vty, " gprs cell bvci %u%s", bts->gprs.cell.bvci,
358 VTY_NEWLINE);
359 for (i = 0; i < ARRAY_SIZE(bts->gprs.cell.timer); i++)
360 vty_out(vty, " gprs cell timer %s %u%s",
361 get_value_string(gprs_bssgp_cfg_strs, i),
362 bts->gprs.cell.timer[i], VTY_NEWLINE);
363 vty_out(vty, " gprs nsei %u%s", bts->gprs.nse.nsei,
364 VTY_NEWLINE);
365 for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)
366 vty_out(vty, " gprs ns timer %s %u%s",
367 get_value_string(gprs_ns_timer_strs, i),
368 bts->gprs.nse.timer[i], VTY_NEWLINE);
369 for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
370 struct gsm_bts_gprs_nsvc *nsvc =
371 &bts->gprs.nsvc[i];
372 struct in_addr ia;
373
374 ia.s_addr = htonl(nsvc->remote_ip);
375 vty_out(vty, " gprs nsvc %u nsvci %u%s", i,
376 nsvc->nsvci, VTY_NEWLINE);
377 vty_out(vty, " gprs nsvc %u local udp port %u%s", i,
378 nsvc->local_port, VTY_NEWLINE);
379 vty_out(vty, " gprs nsvc %u remote udp port %u%s", i,
380 nsvc->remote_port, VTY_NEWLINE);
381 vty_out(vty, " gprs nsvc %u remote ip %s%s", i,
382 inet_ntoa(ia), VTY_NEWLINE);
383 }
384}
385
Harald Welte97ceef92009-08-06 19:06:46 +0200386static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
387{
388 struct gsm_bts_trx *trx;
389
Harald Weltee87eb462009-08-07 13:29:14 +0200390 vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE);
391 vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200392 if (bts->description)
393 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200394 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freyther6d82b7c2009-11-19 16:38:49 +0100395 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200396 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte97ceef92009-08-06 19:06:46 +0200397 VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200398 vty_out(vty, " training_sequence_code %u%s", bts->tsc, VTY_NEWLINE);
399 vty_out(vty, " base_station_id_code %u%s", bts->bsic, VTY_NEWLINE);
Harald Welte (local)cbd46102009-08-13 10:14:26 +0200400 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +0100401 vty_out(vty, " cell reselection hysteresis %u%s",
402 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
403 vty_out(vty, " rxlev access min %u%s",
404 bts->si_common.cell_sel_par.rxlev_acc_min, VTY_NEWLINE);
Harald Weltea54a2bb2009-12-01 18:04:30 +0530405 if (bts->si_common.chan_desc.t3212)
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +0200406 vty_out(vty, " periodic location update %u%s",
Harald Weltea54a2bb2009-12-01 18:04:30 +0530407 bts->si_common.chan_desc.t3212 * 10, VTY_NEWLINE);
Harald Welte3e774612009-08-10 13:48:16 +0200408 vty_out(vty, " channel allocator %s%s",
409 bts->chan_alloc_reverse ? "descending" : "ascending",
410 VTY_NEWLINE);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +0100411 vty_out(vty, " rach tx integer %u%s",
412 bts->si_common.rach_control.tx_integer, VTY_NEWLINE);
413 vty_out(vty, " rach max transmission %u%s",
414 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
415 VTY_NEWLINE);
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +0800416
417 if (bts->rach_b_thresh != -1)
418 vty_out(vty, " rach nm busy threshold %u%s",
419 bts->rach_b_thresh, VTY_NEWLINE);
420 if (bts->rach_ldavg_slots != -1)
421 vty_out(vty, " rach nm load average %u%s",
422 bts->rach_ldavg_slots, VTY_NEWLINE);
Harald Welte8c973ba2009-12-21 23:08:18 +0100423 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)e19be3f2009-08-12 13:28:23 +0200424 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +0800425 if ((bts->si_common.rach_control.t2 & 0x4) == 0)
426 vty_out(vty, " rach emergency call allowed 1%s", VTY_NEWLINE);
Harald Welte25572872009-10-20 00:22:00 +0200427 if (is_ipaccess_bts(bts)) {
Harald Weltee87eb462009-08-07 13:29:14 +0200428 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Welte3ffe1b32009-08-07 00:25:23 +0200429 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte25572872009-10-20 00:22:00 +0200430 vty_out(vty, " oml ip.access stream_id %u%s", bts->oml_tei, VTY_NEWLINE);
431 } else {
Harald Welte62868882009-08-08 16:12:58 +0200432 config_write_e1_link(vty, &bts->oml_e1_link, " oml ");
433 vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE);
434 }
Harald Weltea9251762010-05-11 23:50:21 +0200435 config_write_bts_gprs(vty, bts);
Harald Welte97ceef92009-08-06 19:06:46 +0200436
437 llist_for_each_entry(trx, &bts->trx_list, list)
438 config_write_trx_single(vty, trx);
439}
440
441static int config_write_bts(struct vty *v)
442{
Harald Welte40152872010-05-16 20:52:23 +0200443 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte97ceef92009-08-06 19:06:46 +0200444 struct gsm_bts *bts;
445
446 llist_for_each_entry(bts, &gsmnet->bts_list, list)
447 config_write_bts_single(v, bts);
448
449 return CMD_SUCCESS;
450}
451
Harald Weltee87eb462009-08-07 13:29:14 +0200452static int config_write_net(struct vty *vty)
453{
Harald Welte40152872010-05-16 20:52:23 +0200454 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
455
Harald Weltee87eb462009-08-07 13:29:14 +0200456 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200457 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200458 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200459 vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE);
460 vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +0200461 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Harald Welte59936d72009-11-18 20:33:19 +0100462 vty_out(vty, " location updating reject cause %u%s",
463 gsmnet->reject_cause, VTY_NEWLINE);
Harald Weltecca253a2009-08-30 15:47:06 +0900464 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freyther6b4f5462009-11-19 16:37:48 +0100465 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Harald Welte52af1952009-12-13 10:53:12 +0100466 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
467 VTY_NEWLINE);
Harald Weltea310f3e2009-12-14 09:00:24 +0100468 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Welte0af9c9f2009-12-19 21:41:52 +0100469 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Weltea8062f12009-12-21 16:51:50 +0100470 vty_out(vty, " handover window rxlev averaging %u%s",
471 gsmnet->handover.win_rxlev_avg, VTY_NEWLINE);
472 vty_out(vty, " handover window rxqual averaging %u%s",
473 gsmnet->handover.win_rxqual_avg, VTY_NEWLINE);
474 vty_out(vty, " handover window rxlev neighbor averaging %u%s",
475 gsmnet->handover.win_rxlev_avg_neigh, VTY_NEWLINE);
476 vty_out(vty, " handover power budget interval %u%s",
477 gsmnet->handover.pwr_interval, VTY_NEWLINE);
478 vty_out(vty, " handover power budget hysteresis %u%s",
479 gsmnet->handover.pwr_hysteresis, VTY_NEWLINE);
480 vty_out(vty, " handover maximum distance %u%s",
481 gsmnet->handover.max_distance, VTY_NEWLINE);
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +0100482 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +0100483 vty_out(vty, " timer t3103 %u%s", gsmnet->T3103, VTY_NEWLINE);
484 vty_out(vty, " timer t3105 %u%s", gsmnet->T3105, VTY_NEWLINE);
485 vty_out(vty, " timer t3107 %u%s", gsmnet->T3107, VTY_NEWLINE);
486 vty_out(vty, " timer t3109 %u%s", gsmnet->T3109, VTY_NEWLINE);
487 vty_out(vty, " timer t3111 %u%s", gsmnet->T3111, VTY_NEWLINE);
488 vty_out(vty, " timer t3113 %u%s", gsmnet->T3113, VTY_NEWLINE);
489 vty_out(vty, " timer t3115 %u%s", gsmnet->T3115, VTY_NEWLINE);
490 vty_out(vty, " timer t3117 %u%s", gsmnet->T3117, VTY_NEWLINE);
491 vty_out(vty, " timer t3119 %u%s", gsmnet->T3119, VTY_NEWLINE);
492 vty_out(vty, " timer t3141 %u%s", gsmnet->T3141, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200493
494 return CMD_SUCCESS;
495}
Harald Welte97ceef92009-08-06 19:06:46 +0200496
Harald Welte59b04682009-06-10 05:40:52 +0800497static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx)
498{
499 vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
500 trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200501 vty_out(vty, "Description: %s%s",
502 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Welte91afe4c2009-06-20 18:15:19 +0200503 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte62868882009-08-08 16:12:58 +0200504 "resulting BS power: %d dBm%s",
Harald Welte91afe4c2009-06-20 18:15:19 +0200505 trx->nominal_power, trx->max_power_red,
Harald Welte62868882009-08-08 16:12:58 +0200506 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800507 vty_out(vty, " NM State: ");
508 net_dump_nmstate(vty, &trx->nm_state);
509 vty_out(vty, " Baseband Transceiver NM State: ");
510 net_dump_nmstate(vty, &trx->bb_transc.nm_state);
Harald Welte25572872009-10-20 00:22:00 +0200511 if (is_ipaccess_bts(trx->bts)) {
512 vty_out(vty, " ip.access stream ID: 0x%02x%s",
513 trx->rsl_tei, VTY_NEWLINE);
514 } else {
515 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
516 e1isl_dump_vty(vty, trx->rsl_link);
517 }
Harald Welte59b04682009-06-10 05:40:52 +0800518}
519
520DEFUN(show_trx,
521 show_trx_cmd,
522 "show trx [bts_nr] [trx_nr]",
Harald Welte9e002452010-05-11 21:53:49 +0200523 SHOW_STR "Display information about a TRX\n"
524 "BTS Number\n"
525 "TRX Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800526{
Harald Welte40152872010-05-16 20:52:23 +0200527 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800528 struct gsm_bts *bts = NULL;
529 struct gsm_bts_trx *trx;
530 int bts_nr, trx_nr;
531
532 if (argc >= 1) {
533 /* use the BTS number that the user has specified */
534 bts_nr = atoi(argv[0]);
535 if (bts_nr >= net->num_bts) {
536 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
537 VTY_NEWLINE);
538 return CMD_WARNING;
539 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200540 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800541 }
542 if (argc >= 2) {
543 trx_nr = atoi(argv[1]);
544 if (trx_nr >= bts->num_trx) {
545 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
546 VTY_NEWLINE);
547 return CMD_WARNING;
548 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200549 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800550 trx_dump_vty(vty, trx);
551 return CMD_SUCCESS;
552 }
553 if (bts) {
554 /* print all TRX in this BTS */
555 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200556 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800557 trx_dump_vty(vty, trx);
558 }
559 return CMD_SUCCESS;
560 }
561
562 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200563 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800564 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200565 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800566 trx_dump_vty(vty, trx);
567 }
568 }
569
570 return CMD_SUCCESS;
571}
572
Harald Welte97ceef92009-08-06 19:06:46 +0200573
Harald Welte59b04682009-06-10 05:40:52 +0800574static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
575{
Harald Welte59b04682009-06-10 05:40:52 +0800576 vty_out(vty, "Timeslot %u of TRX %u in BTS %u, phys cfg %s%s",
577 ts->nr, ts->trx->nr, ts->trx->bts->nr,
578 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
579 vty_out(vty, " NM State: ");
580 net_dump_nmstate(vty, &ts->nm_state);
Harald Welte87504212009-12-02 01:56:49 +0530581 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welte59b04682009-06-10 05:40:52 +0800582 vty_out(vty, " E1 Line %u, Timeslot %u, Subslot %u%s",
583 ts->e1_link.e1_nr, ts->e1_link.e1_ts,
584 ts->e1_link.e1_ts_ss, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800585}
586
587DEFUN(show_ts,
588 show_ts_cmd,
589 "show timeslot [bts_nr] [trx_nr] [ts_nr]",
Harald Welte9e002452010-05-11 21:53:49 +0200590 SHOW_STR "Display information about a TS\n"
591 "BTS Number\n" "TRX Number\n" "Timeslot Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800592{
Harald Welte40152872010-05-16 20:52:23 +0200593 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800594 struct gsm_bts *bts;
595 struct gsm_bts_trx *trx;
596 struct gsm_bts_trx_ts *ts;
597 int bts_nr, trx_nr, ts_nr;
598
599 if (argc >= 1) {
600 /* use the BTS number that the user has specified */
601 bts_nr = atoi(argv[0]);
602 if (bts_nr >= net->num_bts) {
603 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
604 VTY_NEWLINE);
605 return CMD_WARNING;
606 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200607 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800608 }
609 if (argc >= 2) {
610 trx_nr = atoi(argv[1]);
611 if (trx_nr >= bts->num_trx) {
612 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
613 VTY_NEWLINE);
614 return CMD_WARNING;
615 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200616 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800617 }
618 if (argc >= 3) {
619 ts_nr = atoi(argv[2]);
620 if (ts_nr >= TRX_NR_TS) {
621 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
622 VTY_NEWLINE);
623 return CMD_WARNING;
624 }
625 ts = &trx->ts[ts_nr];
626 ts_dump_vty(vty, ts);
627 return CMD_SUCCESS;
628 }
629 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200630 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800631 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200632 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800633 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
634 ts = &trx->ts[ts_nr];
635 ts_dump_vty(vty, ts);
636 }
637 }
638 }
639
640 return CMD_SUCCESS;
641}
642
Holger Hans Peter Freyther1dd0a1b2010-01-06 06:00:40 +0100643static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte59b04682009-06-10 05:40:52 +0800644{
Harald Welte91afe4c2009-06-20 18:15:19 +0200645 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte59b04682009-06-10 05:40:52 +0800646 subscr->authorized, VTY_NEWLINE);
647 if (subscr->name)
648 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
649 if (subscr->extension)
650 vty_out(vty, " Extension: %s%s", subscr->extension,
651 VTY_NEWLINE);
652 if (subscr->imsi)
653 vty_out(vty, " IMSI: %s%s", subscr->imsi, VTY_NEWLINE);
Holger Hans Peter Freythercd8bacf2009-08-19 12:53:57 +0200654 if (subscr->tmsi != GSM_RESERVED_TMSI)
655 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte270c06c2009-08-15 03:24:51 +0200656 VTY_NEWLINE);
Sylvain Munaute5863a22009-12-27 19:29:28 +0100657
Harald Welte (local)02d5efa2009-08-14 20:27:16 +0200658 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800659}
660
Harald Welte44007742009-12-22 21:43:14 +0100661static void meas_rep_dump_uni_vty(struct vty *vty,
662 struct gsm_meas_rep_unidir *mru,
663 const char *prefix,
664 const char *dir)
665{
666 vty_out(vty, "%s RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",
667 prefix, dir, rxlev2dbm(mru->full.rx_lev),
668 dir, rxlev2dbm(mru->sub.rx_lev));
669 vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",
670 dir, mru->full.rx_qual, dir, mru->sub.rx_qual,
671 VTY_NEWLINE);
672}
673
674static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,
675 const char *prefix)
676{
677 vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);
678 vty_out(vty, "%s Flags: %s%s%s%s%s", prefix,
679 mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",
680 mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",
681 mr->flags & MEAS_REP_F_FPC ? "FPC " : "",
682 mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",
683 VTY_NEWLINE);
684 if (mr->flags & MEAS_REP_F_MS_TO)
685 vty_out(vty, "%s MS Timing Offset: %u%s", prefix,
686 mr->ms_timing_offset, VTY_NEWLINE);
687 if (mr->flags & MEAS_REP_F_MS_L1)
688 vty_out(vty, "%s L1 MS Power: %u dBm, Timing Advance: %u%s",
689 prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);
690 if (mr->flags & MEAS_REP_F_DL_VALID)
691 meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");
692 meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");
693}
694
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +0800695static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte59b04682009-06-10 05:40:52 +0800696{
Harald Welte44007742009-12-22 21:43:14 +0100697 int idx;
698
Harald Welte59b04682009-06-10 05:40:52 +0800699 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 +0200700 lchan->nr, lchan->ts->nr, lchan->ts->trx->nr,
Harald Welte (local)02204d02009-12-27 18:05:25 +0100701 lchan->ts->trx->bts->nr, gsm_lchant_name(lchan->type),
Harald Welte59b04682009-06-10 05:40:52 +0800702 VTY_NEWLINE);
Holger Hans Peter Freyther065b8112010-03-23 06:41:45 +0100703 vty_out(vty, " Use Count: %u, State: %s%s", lchan->conn.use_count,
Harald Welteab2534c2009-12-29 10:52:38 +0100704 gsm_lchans_name(lchan->state), VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +0100705 vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s",
706 lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
707 - lchan->bs_power*2,
708 ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),
709 VTY_NEWLINE);
Holger Hans Peter Freyther065b8112010-03-23 06:41:45 +0100710 if (lchan->conn.subscr) {
Harald Welte59b04682009-06-10 05:40:52 +0800711 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther065b8112010-03-23 06:41:45 +0100712 subscr_dump_vty(vty, lchan->conn.subscr);
Harald Welte59b04682009-06-10 05:40:52 +0800713 } else
714 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte87504212009-12-02 01:56:49 +0530715 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
716 struct in_addr ia;
Holger Hans Peter Freythercec1ec52010-04-07 15:39:16 +0200717 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte87504212009-12-02 01:56:49 +0530718 vty_out(vty, " Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",
719 inet_ntoa(ia), lchan->abis_ip.bound_port,
720 lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,
721 VTY_NEWLINE);
722 }
Harald Welte44007742009-12-22 21:43:14 +0100723
724 /* we want to report the last measurement report */
725 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
726 lchan->meas_rep_idx, 1);
727 meas_rep_dump_vty(vty, &lchan->meas_rep[idx], " ");
Harald Welte59b04682009-06-10 05:40:52 +0800728}
729
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +0800730static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
731{
Holger Hans Peter Freythercf13a922010-05-14 01:57:02 +0800732 struct gsm_meas_rep *mr;
733 int idx;
734
735 /* we want to report the last measurement report */
736 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
737 lchan->meas_rep_idx, 1);
738 mr = &lchan->meas_rep[idx];
739
740 vty_out(vty, "Lchan: %u Timeslot: %u TRX: %u BTS: %u Type: %s - L1 MS Power: %u dBm "
741 "RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +0800742 lchan->nr, lchan->ts->nr, lchan->ts->trx->nr,
743 lchan->ts->trx->bts->nr, gsm_lchant_name(lchan->type),
Holger Hans Peter Freythercf13a922010-05-14 01:57:02 +0800744 mr->ms_l1.pwr,
745 rxlev2dbm(mr->dl.full.rx_lev),
746 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +0800747 VTY_NEWLINE);
748}
749
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +0800750static int lchan_summary(struct vty *vty, int argc, const char **argv,
751 void (*dump_cb)(struct vty *, struct gsm_lchan *))
Harald Welte59b04682009-06-10 05:40:52 +0800752{
Harald Welte40152872010-05-16 20:52:23 +0200753 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800754 struct gsm_bts *bts;
755 struct gsm_bts_trx *trx;
756 struct gsm_bts_trx_ts *ts;
757 struct gsm_lchan *lchan;
758 int bts_nr, trx_nr, ts_nr, lchan_nr;
759
760 if (argc >= 1) {
761 /* use the BTS number that the user has specified */
762 bts_nr = atoi(argv[0]);
763 if (bts_nr >= net->num_bts) {
764 vty_out(vty, "%% can't find BTS %s%s", argv[0],
765 VTY_NEWLINE);
766 return CMD_WARNING;
767 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200768 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800769 }
770 if (argc >= 2) {
771 trx_nr = atoi(argv[1]);
772 if (trx_nr >= bts->num_trx) {
773 vty_out(vty, "%% can't find TRX %s%s", argv[1],
774 VTY_NEWLINE);
775 return CMD_WARNING;
776 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200777 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800778 }
779 if (argc >= 3) {
780 ts_nr = atoi(argv[2]);
781 if (ts_nr >= TRX_NR_TS) {
782 vty_out(vty, "%% can't find TS %s%s", argv[2],
783 VTY_NEWLINE);
784 return CMD_WARNING;
785 }
786 ts = &trx->ts[ts_nr];
787 }
788 if (argc >= 4) {
789 lchan_nr = atoi(argv[3]);
790 if (lchan_nr >= TS_MAX_LCHAN) {
791 vty_out(vty, "%% can't find LCHAN %s%s", argv[3],
792 VTY_NEWLINE);
793 return CMD_WARNING;
794 }
795 lchan = &ts->lchan[lchan_nr];
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +0800796 dump_cb(vty, lchan);
Harald Welte59b04682009-06-10 05:40:52 +0800797 return CMD_SUCCESS;
798 }
799 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200800 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800801 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200802 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800803 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
804 ts = &trx->ts[ts_nr];
805 for (lchan_nr = 0; lchan_nr < TS_MAX_LCHAN;
806 lchan_nr++) {
807 lchan = &ts->lchan[lchan_nr];
808 if (lchan->type == GSM_LCHAN_NONE)
809 continue;
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +0800810 dump_cb(vty, lchan);
Harald Welte59b04682009-06-10 05:40:52 +0800811 }
812 }
813 }
814 }
815
816 return CMD_SUCCESS;
817}
818
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +0800819
820DEFUN(show_lchan,
821 show_lchan_cmd,
822 "show lchan [bts_nr] [trx_nr] [ts_nr] [lchan_nr]",
823 SHOW_STR "Display information about a logical channel\n"
824 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
825 "Logical Channel Number\n")
826
827{
828 return lchan_summary(vty, argc, argv, lchan_dump_full_vty);
829}
830
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +0800831DEFUN(show_lchan_summary,
832 show_lchan_summary_cmd,
833 "show lchan summary [bts_nr] [trx_nr] [ts_nr] [lchan_nr]",
834 SHOW_STR "Display information about a logical channel\n"
835 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
836 "Logical Channel Number\n")
837{
838 return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
839}
840
Harald Welte59b04682009-06-10 05:40:52 +0800841static void e1drv_dump_vty(struct vty *vty, struct e1inp_driver *drv)
842{
843 vty_out(vty, "E1 Input Driver %s%s", drv->name, VTY_NEWLINE);
844}
845
846DEFUN(show_e1drv,
847 show_e1drv_cmd,
848 "show e1_driver",
849 SHOW_STR "Display information about available E1 drivers\n")
850{
851 struct e1inp_driver *drv;
852
853 llist_for_each_entry(drv, &e1inp_driver_list, list)
854 e1drv_dump_vty(vty, drv);
855
856 return CMD_SUCCESS;
857}
858
859static void e1line_dump_vty(struct vty *vty, struct e1inp_line *line)
860{
861 vty_out(vty, "E1 Line Number %u, Name %s, Driver %s%s",
862 line->num, line->name ? line->name : "",
863 line->driver->name, VTY_NEWLINE);
864}
865
866DEFUN(show_e1line,
867 show_e1line_cmd,
868 "show e1_line [line_nr]",
Harald Welte9e002452010-05-11 21:53:49 +0200869 SHOW_STR "Display information about a E1 line\n"
870 "E1 Line Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800871{
872 struct e1inp_line *line;
873
874 if (argc >= 1) {
875 int num = atoi(argv[0]);
876 llist_for_each_entry(line, &e1inp_line_list, list) {
877 if (line->num == num) {
878 e1line_dump_vty(vty, line);
879 return CMD_SUCCESS;
880 }
881 }
882 return CMD_WARNING;
883 }
884
885 llist_for_each_entry(line, &e1inp_line_list, list)
886 e1line_dump_vty(vty, line);
887
888 return CMD_SUCCESS;
889}
890
891static void e1ts_dump_vty(struct vty *vty, struct e1inp_ts *ts)
892{
Harald Welte62868882009-08-08 16:12:58 +0200893 if (ts->type == E1INP_TS_TYPE_NONE)
894 return;
Harald Welte59b04682009-06-10 05:40:52 +0800895 vty_out(vty, "E1 Timeslot %2u of Line %u is Type %s%s",
896 ts->num, ts->line->num, e1inp_tstype_name(ts->type),
897 VTY_NEWLINE);
898}
899
900DEFUN(show_e1ts,
901 show_e1ts_cmd,
902 "show e1_timeslot [line_nr] [ts_nr]",
Harald Welte9e002452010-05-11 21:53:49 +0200903 SHOW_STR "Display information about a E1 timeslot\n"
904 "E1 Line Number\n" "E1 Timeslot Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800905{
Harald Welte49c79562009-11-17 06:12:16 +0100906 struct e1inp_line *line = NULL;
Harald Welte59b04682009-06-10 05:40:52 +0800907 struct e1inp_ts *ts;
908 int ts_nr;
909
910 if (argc == 0) {
911 llist_for_each_entry(line, &e1inp_line_list, list) {
912 for (ts_nr = 0; ts_nr < NUM_E1_TS; ts_nr++) {
913 ts = &line->ts[ts_nr];
914 e1ts_dump_vty(vty, ts);
915 }
916 }
917 return CMD_SUCCESS;
918 }
919 if (argc >= 1) {
920 int num = atoi(argv[0]);
921 llist_for_each_entry(line, &e1inp_line_list, list) {
922 if (line->num == num)
923 break;
924 }
925 if (!line || line->num != num) {
926 vty_out(vty, "E1 line %s is invalid%s",
927 argv[0], VTY_NEWLINE);
928 return CMD_WARNING;
929 }
930 }
931 if (argc >= 2) {
932 ts_nr = atoi(argv[1]);
933 if (ts_nr > NUM_E1_TS) {
934 vty_out(vty, "E1 timeslot %s is invalid%s",
935 argv[1], VTY_NEWLINE);
936 return CMD_WARNING;
937 }
938 ts = &line->ts[ts_nr];
939 e1ts_dump_vty(vty, ts);
940 return CMD_SUCCESS;
941 } else {
942 for (ts_nr = 0; ts_nr < NUM_E1_TS; ts_nr++) {
943 ts = &line->ts[ts_nr];
944 e1ts_dump_vty(vty, ts);
945 }
946 return CMD_SUCCESS;
947 }
948 return CMD_SUCCESS;
949}
950
951static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
952{
953 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
954 subscr_dump_vty(vty, pag->subscr);
955}
956
957static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
958{
959 struct gsm_paging_request *pag;
960
961 llist_for_each_entry(pag, &bts->paging.pending_requests, entry)
962 paging_dump_vty(vty, pag);
963}
964
965DEFUN(show_paging,
966 show_paging_cmd,
967 "show paging [bts_nr]",
Harald Welte9e002452010-05-11 21:53:49 +0200968 SHOW_STR "Display information about paging reuqests of a BTS\n"
969 "BTS Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800970{
Harald Welte40152872010-05-16 20:52:23 +0200971 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800972 struct gsm_bts *bts;
973 int bts_nr;
974
975 if (argc >= 1) {
976 /* use the BTS number that the user has specified */
977 bts_nr = atoi(argv[0]);
978 if (bts_nr >= net->num_bts) {
979 vty_out(vty, "%% can't find BTS %s%s", argv[0],
980 VTY_NEWLINE);
981 return CMD_WARNING;
982 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200983 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800984 bts_paging_dump_vty(vty, bts);
985
986 return CMD_SUCCESS;
987 }
988 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200989 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800990 bts_paging_dump_vty(vty, bts);
991 }
992
993 return CMD_SUCCESS;
994}
995
Harald Welte9e002452010-05-11 21:53:49 +0200996#define NETWORK_STR "Configure the GSM network\n"
997
Harald Weltee87eb462009-08-07 13:29:14 +0200998DEFUN(cfg_net,
999 cfg_net_cmd,
Harald Welte9e002452010-05-11 21:53:49 +02001000 "network", NETWORK_STR)
Harald Weltee87eb462009-08-07 13:29:14 +02001001{
Harald Welte40152872010-05-16 20:52:23 +02001002 vty->index = gsmnet_from_vty(vty);
Harald Weltee87eb462009-08-07 13:29:14 +02001003 vty->node = GSMNET_NODE;
1004
1005 return CMD_SUCCESS;
1006}
1007
1008
1009DEFUN(cfg_net_ncc,
1010 cfg_net_ncc_cmd,
1011 "network country code <1-999>",
1012 "Set the GSM network country code")
1013{
Harald Welte40152872010-05-16 20:52:23 +02001014 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1015
Harald Weltee87eb462009-08-07 13:29:14 +02001016 gsmnet->country_code = atoi(argv[0]);
1017
1018 return CMD_SUCCESS;
1019}
1020
1021DEFUN(cfg_net_mnc,
1022 cfg_net_mnc_cmd,
1023 "mobile network code <1-999>",
1024 "Set the GSM mobile network code")
1025{
Harald Welte40152872010-05-16 20:52:23 +02001026 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1027
Harald Weltee87eb462009-08-07 13:29:14 +02001028 gsmnet->network_code = atoi(argv[0]);
1029
1030 return CMD_SUCCESS;
1031}
1032
1033DEFUN(cfg_net_name_short,
1034 cfg_net_name_short_cmd,
1035 "short name NAME",
1036 "Set the short GSM network name")
1037{
Harald Welte40152872010-05-16 20:52:23 +02001038 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1039
Harald Weltee87eb462009-08-07 13:29:14 +02001040 if (gsmnet->name_short)
1041 talloc_free(gsmnet->name_short);
1042
1043 gsmnet->name_short = talloc_strdup(gsmnet, argv[0]);
1044
1045 return CMD_SUCCESS;
1046}
1047
1048DEFUN(cfg_net_name_long,
1049 cfg_net_name_long_cmd,
1050 "long name NAME",
1051 "Set the long GSM network name")
1052{
Harald Welte40152872010-05-16 20:52:23 +02001053 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1054
Harald Weltee87eb462009-08-07 13:29:14 +02001055 if (gsmnet->name_long)
1056 talloc_free(gsmnet->name_long);
1057
1058 gsmnet->name_long = talloc_strdup(gsmnet, argv[0]);
1059
1060 return CMD_SUCCESS;
1061}
Harald Welte59b04682009-06-10 05:40:52 +08001062
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02001063DEFUN(cfg_net_auth_policy,
1064 cfg_net_auth_policy_cmd,
1065 "auth policy (closed|accept-all|token)",
Harald Welte9e002452010-05-11 21:53:49 +02001066 "Authentication (not cryptographic)\n"
1067 "Set the GSM network authentication policy\n"
1068 "Require the MS to be activated in HLR\n"
1069 "Accept all MS, whether in HLR or not\n"
1070 "Use SMS-token based authentication\n")
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02001071{
1072 enum gsm_auth_policy policy = gsm_auth_policy_parse(argv[0]);
Harald Welte40152872010-05-16 20:52:23 +02001073 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02001074
1075 gsmnet->auth_policy = policy;
1076
1077 return CMD_SUCCESS;
1078}
1079
Harald Welte59936d72009-11-18 20:33:19 +01001080DEFUN(cfg_net_reject_cause,
1081 cfg_net_reject_cause_cmd,
1082 "location updating reject cause <2-111>",
1083 "Set the reject cause of location updating reject\n")
1084{
Harald Welte40152872010-05-16 20:52:23 +02001085 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1086
Harald Welte59936d72009-11-18 20:33:19 +01001087 gsmnet->reject_cause = atoi(argv[0]);
1088
1089 return CMD_SUCCESS;
1090}
1091
Harald Weltecca253a2009-08-30 15:47:06 +09001092DEFUN(cfg_net_encryption,
1093 cfg_net_encryption_cmd,
1094 "encryption a5 (0|1|2)",
Harald Welte18ce31c2010-05-14 20:05:17 +02001095 "Encryption options\n"
1096 "A5 encryption\n" "A5/0: No encryption\n"
1097 "A5/1: Encryption\n" "A5/2: Export-grade Encryption\n")
Harald Weltecca253a2009-08-30 15:47:06 +09001098{
Harald Welte40152872010-05-16 20:52:23 +02001099 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1100
Andreas.Eversberg53293292009-11-17 09:55:26 +01001101 gsmnet->a5_encryption= atoi(argv[0]);
Harald Weltecca253a2009-08-30 15:47:06 +09001102
1103 return CMD_SUCCESS;
1104}
1105
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001106DEFUN(cfg_net_neci,
1107 cfg_net_neci_cmd,
1108 "neci (0|1)",
Harald Welte18ce31c2010-05-14 20:05:17 +02001109 "New Establish Cause Indication\n"
1110 "Don't set the NECI bit\n" "Set the NECI bit\n")
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001111{
Harald Welte40152872010-05-16 20:52:23 +02001112 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1113
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001114 gsmnet->neci = atoi(argv[0]);
1115 return CMD_SUCCESS;
1116}
1117
Harald Welte52af1952009-12-13 10:53:12 +01001118DEFUN(cfg_net_rrlp_mode, cfg_net_rrlp_mode_cmd,
1119 "rrlp mode (none|ms-based|ms-preferred|ass-preferred)",
Harald Welte9e002452010-05-11 21:53:49 +02001120 "Radio Resource Location Protocol\n"
1121 "Set the Radio Resource Location Protocol Mode\n"
1122 "Don't send RRLP request\n"
1123 "Request MS-based location\n"
1124 "Request any location, prefer MS-based\n"
1125 "Request any location, prefer MS-assisted\n")
Harald Welte52af1952009-12-13 10:53:12 +01001126{
Harald Welte40152872010-05-16 20:52:23 +02001127 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1128
Harald Welte52af1952009-12-13 10:53:12 +01001129 gsmnet->rrlp.mode = rrlp_mode_parse(argv[0]);
1130
1131 return CMD_SUCCESS;
1132}
1133
Harald Weltea310f3e2009-12-14 09:00:24 +01001134DEFUN(cfg_net_mm_info, cfg_net_mm_info_cmd,
1135 "mm info (0|1)",
1136 "Whether to send MM INFO after LOC UPD ACCEPT")
1137{
Harald Welte40152872010-05-16 20:52:23 +02001138 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1139
Harald Weltea310f3e2009-12-14 09:00:24 +01001140 gsmnet->send_mm_info = atoi(argv[0]);
1141
1142 return CMD_SUCCESS;
1143}
1144
Harald Welte9e002452010-05-11 21:53:49 +02001145#define HANDOVER_STR "Handover Options\n"
1146
Harald Welte0af9c9f2009-12-19 21:41:52 +01001147DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1148 "handover (0|1)",
Harald Welte9e002452010-05-11 21:53:49 +02001149 HANDOVER_STR
1150 "Don't perform in-call handover\n"
1151 "Perform in-call handover\n")
Harald Welte0af9c9f2009-12-19 21:41:52 +01001152{
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001153 int enable = atoi(argv[0]);
Harald Welte40152872010-05-16 20:52:23 +02001154 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001155
1156 if (enable && ipacc_rtp_direct) {
Harald Welteaa2c3032009-12-20 13:51:01 +01001157 vty_out(vty, "%% Cannot enable handover unless RTP Proxy mode "
1158 "is enabled by using the -P command line option%s",
1159 VTY_NEWLINE);
1160 return CMD_WARNING;
1161 }
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001162 gsmnet->handover.active = enable;
Harald Welte0af9c9f2009-12-19 21:41:52 +01001163
1164 return CMD_SUCCESS;
1165}
1166
Harald Welte9e002452010-05-11 21:53:49 +02001167#define HO_WIN_STR HANDOVER_STR "Measurement Window\n"
1168#define HO_WIN_RXLEV_STR HO_WIN_STR "Received Level Averaging\n"
1169#define HO_WIN_RXQUAL_STR HO_WIN_STR "Received Quality Averaging\n"
1170#define HO_PBUDGET_STR HANDOVER_STR "Power Budget\n"
1171
Harald Weltea8062f12009-12-21 16:51:50 +01001172DEFUN(cfg_net_ho_win_rxlev_avg, cfg_net_ho_win_rxlev_avg_cmd,
1173 "handover window rxlev averaging <1-10>",
Harald Welte9e002452010-05-11 21:53:49 +02001174 HO_WIN_RXLEV_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001175 "How many RxLev measurements are used for averaging")
1176{
Harald Welte40152872010-05-16 20:52:23 +02001177 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001178 gsmnet->handover.win_rxlev_avg = atoi(argv[0]);
1179 return CMD_SUCCESS;
1180}
1181
1182DEFUN(cfg_net_ho_win_rxqual_avg, cfg_net_ho_win_rxqual_avg_cmd,
1183 "handover window rxqual averaging <1-10>",
Harald Welte9e002452010-05-11 21:53:49 +02001184 HO_WIN_RXQUAL_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001185 "How many RxQual measurements are used for averaging")
1186{
Harald Welte40152872010-05-16 20:52:23 +02001187 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001188 gsmnet->handover.win_rxqual_avg = atoi(argv[0]);
1189 return CMD_SUCCESS;
1190}
1191
1192DEFUN(cfg_net_ho_win_rxlev_neigh_avg, cfg_net_ho_win_rxlev_avg_neigh_cmd,
1193 "handover window rxlev neighbor averaging <1-10>",
Harald Welte9e002452010-05-11 21:53:49 +02001194 HO_WIN_RXLEV_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001195 "How many RxQual measurements are used for averaging")
1196{
Harald Welte40152872010-05-16 20:52:23 +02001197 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001198 gsmnet->handover.win_rxlev_avg_neigh = atoi(argv[0]);
1199 return CMD_SUCCESS;
1200}
1201
1202DEFUN(cfg_net_ho_pwr_interval, cfg_net_ho_pwr_interval_cmd,
1203 "handover power budget interval <1-99>",
Harald Welte9e002452010-05-11 21:53:49 +02001204 HO_PBUDGET_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001205 "How often to check if we have a better cell (SACCH frames)")
1206{
Harald Welte40152872010-05-16 20:52:23 +02001207 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001208 gsmnet->handover.pwr_interval = atoi(argv[0]);
1209 return CMD_SUCCESS;
1210}
1211
1212DEFUN(cfg_net_ho_pwr_hysteresis, cfg_net_ho_pwr_hysteresis_cmd,
1213 "handover power budget hysteresis <0-999>",
Harald Welte9e002452010-05-11 21:53:49 +02001214 HO_PBUDGET_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001215 "How many dB does a neighbor to be stronger to become a HO candidate")
1216{
Harald Welte40152872010-05-16 20:52:23 +02001217 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001218 gsmnet->handover.pwr_hysteresis = atoi(argv[0]);
1219 return CMD_SUCCESS;
1220}
1221
1222DEFUN(cfg_net_ho_max_distance, cfg_net_ho_max_distance_cmd,
1223 "handover maximum distance <0-9999>",
Harald Welte9e002452010-05-11 21:53:49 +02001224 HANDOVER_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001225 "How big is the maximum timing advance before HO is forced")
1226{
Harald Welte40152872010-05-16 20:52:23 +02001227 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001228 gsmnet->handover.max_distance = atoi(argv[0]);
1229 return CMD_SUCCESS;
1230}
Harald Welte0af9c9f2009-12-19 21:41:52 +01001231
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001232#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001233 DEFUN(cfg_net_T##number, \
1234 cfg_net_T##number##_cmd, \
1235 "timer t" #number " <0-65535>", \
Harald Welte9e002452010-05-11 21:53:49 +02001236 "Configure GSM Timers\n" \
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001237 doc) \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001238{ \
Harald Welte40152872010-05-16 20:52:23 +02001239 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001240 int value = atoi(argv[0]); \
1241 \
1242 if (value < 0 || value > 65535) { \
1243 vty_out(vty, "Timer value %s out of range.%s", \
1244 argv[0], VTY_NEWLINE); \
1245 return CMD_WARNING; \
1246 } \
1247 \
1248 gsmnet->T##number = value; \
1249 return CMD_SUCCESS; \
1250}
1251
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001252DECLARE_TIMER(3101, "Set the timeout value for IMMEDIATE ASSIGNMENT.")
1253DECLARE_TIMER(3103, "Set the timeout value for HANDOVER.")
1254DECLARE_TIMER(3105, "Currently not used.")
1255DECLARE_TIMER(3107, "Currently not used.")
1256DECLARE_TIMER(3109, "Currently not used.")
Holger Hans Peter Freyther4a00c062010-05-31 21:33:15 +08001257DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.")
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001258DECLARE_TIMER(3113, "Set the time to try paging a subscriber.")
1259DECLARE_TIMER(3115, "Currently not used.")
1260DECLARE_TIMER(3117, "Currently not used.")
1261DECLARE_TIMER(3119, "Currently not used.")
1262DECLARE_TIMER(3141, "Currently not used.")
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001263
1264
Harald Welte59b04682009-06-10 05:40:52 +08001265/* per-BTS configuration */
1266DEFUN(cfg_bts,
1267 cfg_bts_cmd,
1268 "bts BTS_NR",
Harald Welte9e002452010-05-11 21:53:49 +02001269 "Select a BTS to configure\n"
1270 "BTS Number\n")
Harald Welte59b04682009-06-10 05:40:52 +08001271{
Harald Welte40152872010-05-16 20:52:23 +02001272 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +08001273 int bts_nr = atoi(argv[0]);
1274 struct gsm_bts *bts;
1275
Harald Weltee712a5f2009-06-21 16:17:15 +02001276 if (bts_nr > gsmnet->num_bts) {
1277 vty_out(vty, "%% The next unused BTS number is %u%s",
1278 gsmnet->num_bts, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +08001279 return CMD_WARNING;
Harald Weltee712a5f2009-06-21 16:17:15 +02001280 } else if (bts_nr == gsmnet->num_bts) {
1281 /* allocate a new one */
1282 bts = gsm_bts_alloc(gsmnet, GSM_BTS_TYPE_UNKNOWN,
1283 HARDCODED_TSC, HARDCODED_BSIC);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02001284 } else
Harald Weltee712a5f2009-06-21 16:17:15 +02001285 bts = gsm_bts_num(gsmnet, bts_nr);
1286
Daniel Willmann580085f2010-01-11 13:43:07 +01001287 if (!bts) {
1288 vty_out(vty, "%% Unable to allocate BTS %u%s",
1289 gsmnet->num_bts, VTY_NEWLINE);
Harald Weltee712a5f2009-06-21 16:17:15 +02001290 return CMD_WARNING;
Daniel Willmann580085f2010-01-11 13:43:07 +01001291 }
Harald Welte59b04682009-06-10 05:40:52 +08001292
1293 vty->index = bts;
Harald Welte8791dac2010-05-14 17:59:53 +02001294 vty->index_sub = &bts->description;
Harald Welte59b04682009-06-10 05:40:52 +08001295 vty->node = BTS_NODE;
1296
1297 return CMD_SUCCESS;
1298}
1299
1300DEFUN(cfg_bts_type,
1301 cfg_bts_type_cmd,
1302 "type TYPE",
1303 "Set the BTS type\n")
1304{
1305 struct gsm_bts *bts = vty->index;
Harald Welte59698fb2010-01-10 18:01:52 +01001306 int rc;
Harald Welte59b04682009-06-10 05:40:52 +08001307
Harald Welte59698fb2010-01-10 18:01:52 +01001308 rc = gsm_set_bts_type(bts, parse_btstype(argv[0]));
1309 if (rc < 0)
1310 return CMD_WARNING;
Harald Welte25572872009-10-20 00:22:00 +02001311
Harald Welte59b04682009-06-10 05:40:52 +08001312 return CMD_SUCCESS;
1313}
1314
Harald Welte91afe4c2009-06-20 18:15:19 +02001315DEFUN(cfg_bts_band,
1316 cfg_bts_band_cmd,
1317 "band BAND",
1318 "Set the frequency band of this BTS\n")
1319{
1320 struct gsm_bts *bts = vty->index;
Harald Welte62868882009-08-08 16:12:58 +02001321 int band = gsm_band_parse(argv[0]);
Harald Welte91afe4c2009-06-20 18:15:19 +02001322
1323 if (band < 0) {
1324 vty_out(vty, "%% BAND %d is not a valid GSM band%s",
1325 band, VTY_NEWLINE);
1326 return CMD_WARNING;
1327 }
1328
1329 bts->band = band;
1330
1331 return CMD_SUCCESS;
1332}
1333
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +02001334DEFUN(cfg_bts_ci,
1335 cfg_bts_ci_cmd,
1336 "cell_identity <0-65535>",
1337 "Set the Cell identity of this BTS\n")
1338{
1339 struct gsm_bts *bts = vty->index;
1340 int ci = atoi(argv[0]);
1341
1342 if (ci < 0 || ci > 0xffff) {
1343 vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s",
1344 ci, VTY_NEWLINE);
1345 return CMD_WARNING;
1346 }
1347 bts->cell_identity = ci;
1348
1349 return CMD_SUCCESS;
1350}
1351
Harald Welte59b04682009-06-10 05:40:52 +08001352DEFUN(cfg_bts_lac,
1353 cfg_bts_lac_cmd,
Holger Hans Peter Freyther54a22832009-09-29 14:02:33 +02001354 "location_area_code <0-65535>",
Harald Welte59b04682009-06-10 05:40:52 +08001355 "Set the Location Area Code (LAC) of this BTS\n")
1356{
1357 struct gsm_bts *bts = vty->index;
1358 int lac = atoi(argv[0]);
1359
Holger Hans Peter Freyther54a22832009-09-29 14:02:33 +02001360 if (lac < 0 || lac > 0xffff) {
1361 vty_out(vty, "%% LAC %d is not in the valid range (0-65535)%s",
Harald Welte59b04682009-06-10 05:40:52 +08001362 lac, VTY_NEWLINE);
1363 return CMD_WARNING;
1364 }
Holger Hans Peter Freyther6c6ab862009-10-01 04:07:15 +02001365
1366 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
1367 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
1368 lac, VTY_NEWLINE);
1369 return CMD_WARNING;
1370 }
1371
Harald Welte59b04682009-06-10 05:40:52 +08001372 bts->location_area_code = lac;
1373
1374 return CMD_SUCCESS;
1375}
1376
Harald Weltea54a2bb2009-12-01 18:04:30 +05301377
Harald Welte59b04682009-06-10 05:40:52 +08001378DEFUN(cfg_bts_tsc,
1379 cfg_bts_tsc_cmd,
1380 "training_sequence_code <0-255>",
1381 "Set the Training Sequence Code (TSC) of this BTS\n")
1382{
1383 struct gsm_bts *bts = vty->index;
1384 int tsc = atoi(argv[0]);
1385
1386 if (tsc < 0 || tsc > 0xff) {
1387 vty_out(vty, "%% TSC %d is not in the valid range (0-255)%s",
1388 tsc, VTY_NEWLINE);
1389 return CMD_WARNING;
1390 }
1391 bts->tsc = tsc;
1392
1393 return CMD_SUCCESS;
1394}
1395
1396DEFUN(cfg_bts_bsic,
1397 cfg_bts_bsic_cmd,
1398 "base_station_id_code <0-63>",
1399 "Set the Base Station Identity Code (BSIC) of this BTS\n")
1400{
1401 struct gsm_bts *bts = vty->index;
1402 int bsic = atoi(argv[0]);
1403
1404 if (bsic < 0 || bsic > 0x3f) {
Harald Welte62868882009-08-08 16:12:58 +02001405 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte59b04682009-06-10 05:40:52 +08001406 bsic, VTY_NEWLINE);
1407 return CMD_WARNING;
1408 }
1409 bts->bsic = bsic;
1410
1411 return CMD_SUCCESS;
1412}
1413
1414
1415DEFUN(cfg_bts_unit_id,
1416 cfg_bts_unit_id_cmd,
Harald Weltef515aa02009-08-07 13:27:09 +02001417 "ip.access unit_id <0-65534> <0-255>",
1418 "Set the ip.access BTS Unit ID of this BTS\n")
Harald Welte59b04682009-06-10 05:40:52 +08001419{
1420 struct gsm_bts *bts = vty->index;
1421 int site_id = atoi(argv[0]);
1422 int bts_id = atoi(argv[1]);
1423
Harald Weltef515aa02009-08-07 13:27:09 +02001424 if (!is_ipaccess_bts(bts)) {
1425 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1426 return CMD_WARNING;
1427 }
1428
Harald Welte59b04682009-06-10 05:40:52 +08001429 bts->ip_access.site_id = site_id;
1430 bts->ip_access.bts_id = bts_id;
1431
1432 return CMD_SUCCESS;
1433}
1434
Harald Welte9e002452010-05-11 21:53:49 +02001435#define OML_STR "Organization & Maintenance Link\n"
1436#define IPA_STR "ip.access Specific Options\n"
1437
Harald Welte25572872009-10-20 00:22:00 +02001438DEFUN(cfg_bts_stream_id,
1439 cfg_bts_stream_id_cmd,
1440 "oml ip.access stream_id <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02001441 OML_STR IPA_STR
Harald Welte25572872009-10-20 00:22:00 +02001442 "Set the ip.access Stream ID of the OML link of this BTS\n")
1443{
1444 struct gsm_bts *bts = vty->index;
1445 int stream_id = atoi(argv[0]);
1446
1447 if (!is_ipaccess_bts(bts)) {
1448 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1449 return CMD_WARNING;
1450 }
1451
1452 bts->oml_tei = stream_id;
1453
1454 return CMD_SUCCESS;
1455}
1456
Harald Welte9e002452010-05-11 21:53:49 +02001457#define OML_E1_STR OML_STR "E1 Line\n"
Harald Welte25572872009-10-20 00:22:00 +02001458
Harald Welte62868882009-08-08 16:12:58 +02001459DEFUN(cfg_bts_oml_e1,
1460 cfg_bts_oml_e1_cmd,
1461 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welte9e002452010-05-11 21:53:49 +02001462 OML_E1_STR
Harald Welte62868882009-08-08 16:12:58 +02001463 "E1 interface to be used for OML\n")
1464{
1465 struct gsm_bts *bts = vty->index;
1466
1467 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
1468
1469 return CMD_SUCCESS;
1470}
1471
1472
1473DEFUN(cfg_bts_oml_e1_tei,
1474 cfg_bts_oml_e1_tei_cmd,
1475 "oml e1 tei <0-63>",
Harald Welte9e002452010-05-11 21:53:49 +02001476 OML_E1_STR
Harald Welte62868882009-08-08 16:12:58 +02001477 "Set the TEI to be used for OML")
1478{
1479 struct gsm_bts *bts = vty->index;
1480
1481 bts->oml_tei = atoi(argv[0]);
1482
1483 return CMD_SUCCESS;
1484}
1485
Harald Welte3e774612009-08-10 13:48:16 +02001486DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1487 "channel allocator (ascending|descending)",
Harald Welte9e002452010-05-11 21:53:49 +02001488 "Channnel Allocator\n" "Channel Allocator\n"
1489 "Allocate Timeslots and Transceivers in ascending order\n"
1490 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte3e774612009-08-10 13:48:16 +02001491{
1492 struct gsm_bts *bts = vty->index;
1493
1494 if (!strcmp(argv[0], "ascending"))
1495 bts->chan_alloc_reverse = 0;
1496 else
1497 bts->chan_alloc_reverse = 1;
1498
1499 return CMD_SUCCESS;
1500}
1501
Harald Welte9e002452010-05-11 21:53:49 +02001502#define RACH_STR "Random Access Control Channel\n"
1503
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01001504DEFUN(cfg_bts_rach_tx_integer,
1505 cfg_bts_rach_tx_integer_cmd,
1506 "rach tx integer <0-15>",
Harald Welte9e002452010-05-11 21:53:49 +02001507 RACH_STR
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01001508 "Set the raw tx integer value in RACH Control parameters IE")
1509{
1510 struct gsm_bts *bts = vty->index;
1511 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
1512 return CMD_SUCCESS;
1513}
1514
1515DEFUN(cfg_bts_rach_max_trans,
1516 cfg_bts_rach_max_trans_cmd,
1517 "rach max transmission (1|2|4|7)",
Harald Welte9e002452010-05-11 21:53:49 +02001518 RACH_STR
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01001519 "Set the maximum number of RACH burst transmissions")
1520{
1521 struct gsm_bts *bts = vty->index;
1522 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
1523 return CMD_SUCCESS;
1524}
1525
Harald Welte9e002452010-05-11 21:53:49 +02001526#define NM_STR "Network Management\n"
1527
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08001528DEFUN(cfg_bts_rach_nm_b_thresh,
1529 cfg_bts_rach_nm_b_thresh_cmd,
1530 "rach nm busy threshold <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02001531 RACH_STR NM_STR
1532 "Set the NM Busy Threshold in dB")
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08001533{
1534 struct gsm_bts *bts = vty->index;
1535 bts->rach_b_thresh = atoi(argv[0]);
1536 return CMD_SUCCESS;
1537}
1538
1539DEFUN(cfg_bts_rach_nm_ldavg,
1540 cfg_bts_rach_nm_ldavg_cmd,
1541 "rach nm load average <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001542 RACH_STR NM_STR
1543 "Set the NM Loadaverage Slots value")
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08001544{
1545 struct gsm_bts *bts = vty->index;
1546 bts->rach_ldavg_slots = atoi(argv[0]);
1547 return CMD_SUCCESS;
1548}
1549
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02001550DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
1551 "cell barred (0|1)",
1552 "Should this cell be barred from access?")
1553{
1554 struct gsm_bts *bts = vty->index;
1555
Harald Welte8c973ba2009-12-21 23:08:18 +01001556 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02001557
1558 return CMD_SUCCESS;
1559}
1560
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +08001561DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
1562 "rach emergency call allowed (0|1)",
1563 "Should this cell allow emergency calls?")
1564{
1565 struct gsm_bts *bts = vty->index;
1566
1567 if (atoi(argv[0]) == 0)
1568 bts->si_common.rach_control.t2 |= 0x4;
1569 else
1570 bts->si_common.rach_control.t2 &= ~0x4;
1571
1572 return CMD_SUCCESS;
1573}
1574
Harald Welte (local)cbd46102009-08-13 10:14:26 +02001575DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
1576 "ms max power <0-40>",
1577 "Maximum transmit power of the MS")
1578{
1579 struct gsm_bts *bts = vty->index;
1580
1581 bts->ms_max_power = atoi(argv[0]);
1582
1583 return CMD_SUCCESS;
1584}
1585
Harald Welteb761bf82009-12-12 18:17:25 +01001586DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
1587 "cell reselection hysteresis <0-14>",
1588 "Cell Re-Selection Hysteresis in dB")
1589{
1590 struct gsm_bts *bts = vty->index;
1591
1592 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
1593
1594 return CMD_SUCCESS;
1595}
1596
1597DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
1598 "rxlev access min <0-63>",
1599 "Minimum RxLev needed for cell access (better than -110dBm)")
1600{
1601 struct gsm_bts *bts = vty->index;
1602
1603 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
1604
1605 return CMD_SUCCESS;
1606}
1607
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02001608DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
1609 "periodic location update <0-1530>",
1610 "Periodic Location Updating Interval in Minutes")
1611{
1612 struct gsm_bts *bts = vty->index;
1613
Harald Weltea54a2bb2009-12-01 18:04:30 +05301614 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 10;
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02001615
1616 return CMD_SUCCESS;
1617}
1618
Harald Welte9e002452010-05-11 21:53:49 +02001619#define GPRS_TEXT "GPRS Packet Network\n"
1620
Harald Welte410575a2010-03-14 23:30:30 +08001621DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welteb42fe342010-04-18 14:00:26 +02001622 "gprs cell bvci <2-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001623 GPRS_TEXT
1624 "GPRS Cell Settings\n"
Harald Welte3055e332010-03-14 15:37:43 +08001625 "GPRS BSSGP VC Identifier")
1626{
1627 struct gsm_bts *bts = vty->index;
1628
Harald Weltecb20b7a2010-04-18 15:51:20 +02001629 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08001630 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1631 return CMD_WARNING;
1632 }
1633
Harald Welte3055e332010-03-14 15:37:43 +08001634 bts->gprs.cell.bvci = atoi(argv[0]);
1635
1636 return CMD_SUCCESS;
1637}
1638
Harald Welte4a048c52010-03-22 11:48:36 +08001639DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
1640 "gprs nsei <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001641 GPRS_TEXT
Harald Welte4a048c52010-03-22 11:48:36 +08001642 "GPRS NS Entity Identifier")
1643{
1644 struct gsm_bts *bts = vty->index;
1645
Harald Weltecb20b7a2010-04-18 15:51:20 +02001646 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte4a048c52010-03-22 11:48:36 +08001647 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1648 return CMD_WARNING;
1649 }
1650
1651 bts->gprs.nse.nsei = atoi(argv[0]);
1652
1653 return CMD_SUCCESS;
1654}
1655
Harald Welte9e002452010-05-11 21:53:49 +02001656#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
1657 "NSVC Logical Number\n"
Harald Welte4a048c52010-03-22 11:48:36 +08001658
Harald Welte3055e332010-03-14 15:37:43 +08001659DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
1660 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001661 GPRS_TEXT NSVC_TEXT
1662 "NS Virtual Connection Identifier\n"
Harald Welte3055e332010-03-14 15:37:43 +08001663 "GPRS NS VC Identifier")
1664{
1665 struct gsm_bts *bts = vty->index;
1666 int idx = atoi(argv[0]);
1667
Harald Weltecb20b7a2010-04-18 15:51:20 +02001668 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08001669 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1670 return CMD_WARNING;
1671 }
1672
Harald Welte3055e332010-03-14 15:37:43 +08001673 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
1674
1675 return CMD_SUCCESS;
1676}
1677
Harald Welte410575a2010-03-14 23:30:30 +08001678DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
1679 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001680 GPRS_TEXT NSVC_TEXT
Harald Welte410575a2010-03-14 23:30:30 +08001681 "GPRS NS Local UDP Port")
1682{
1683 struct gsm_bts *bts = vty->index;
1684 int idx = atoi(argv[0]);
1685
Harald Weltecb20b7a2010-04-18 15:51:20 +02001686 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08001687 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1688 return CMD_WARNING;
1689 }
1690
Harald Welte410575a2010-03-14 23:30:30 +08001691 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
1692
1693 return CMD_SUCCESS;
1694}
1695
1696DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
1697 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001698 GPRS_TEXT NSVC_TEXT
Harald Welte410575a2010-03-14 23:30:30 +08001699 "GPRS NS Remote UDP Port")
1700{
1701 struct gsm_bts *bts = vty->index;
1702 int idx = atoi(argv[0]);
1703
Harald Weltecb20b7a2010-04-18 15:51:20 +02001704 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08001705 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1706 return CMD_WARNING;
1707 }
1708
Harald Welte410575a2010-03-14 23:30:30 +08001709 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
1710
1711 return CMD_SUCCESS;
1712}
1713
1714DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
1715 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte9e002452010-05-11 21:53:49 +02001716 GPRS_TEXT NSVC_TEXT
Harald Welte410575a2010-03-14 23:30:30 +08001717 "GPRS NS Remote IP Address")
1718{
1719 struct gsm_bts *bts = vty->index;
1720 int idx = atoi(argv[0]);
1721 struct in_addr ia;
1722
Harald Weltecb20b7a2010-04-18 15:51:20 +02001723 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08001724 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1725 return CMD_WARNING;
1726 }
1727
Harald Welte410575a2010-03-14 23:30:30 +08001728 inet_aton(argv[1], &ia);
1729 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
1730
1731 return CMD_SUCCESS;
1732}
1733
Harald Weltea9251762010-05-11 23:50:21 +02001734DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
1735 "gprs ns timer " NS_TIMERS " <0-255>",
1736 GPRS_TEXT "Network Service\n"
1737 "Network Service Timer\n"
1738 NS_TIMERS_HELP "Timer Value\n")
1739{
1740 struct gsm_bts *bts = vty->index;
1741 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
1742 int val = atoi(argv[1]);
1743
1744 if (bts->gprs.mode == BTS_GPRS_NONE) {
1745 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1746 return CMD_WARNING;
1747 }
1748
1749 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
1750 return CMD_WARNING;
1751
1752 bts->gprs.nse.timer[idx] = val;
1753
1754 return CMD_SUCCESS;
1755}
1756
1757#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 +02001758#define BSSGP_TIMERS_HELP \
1759 "Tbvc-block timeout\n" \
1760 "Tbvc-block retries\n" \
1761 "Tbvc-unblock retries\n" \
1762 "Tbvcc-reset timeout\n" \
1763 "Tbvc-reset retries\n" \
1764 "Tbvc-suspend timeout\n" \
1765 "Tbvc-suspend retries\n" \
1766 "Tbvc-resume timeout\n" \
1767 "Tbvc-resume retries\n" \
1768 "Tbvc-capa-update timeout\n" \
1769 "Tbvc-capa-update retries\n"
Harald Weltea9251762010-05-11 23:50:21 +02001770
1771DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
1772 "gprs cell timer " BSSGP_TIMERS " <0-255>",
1773 GPRS_TEXT "Cell / BSSGP\n"
1774 "Cell/BSSGP Timer\n"
1775 BSSGP_TIMERS_HELP "Timer Value\n")
1776{
1777 struct gsm_bts *bts = vty->index;
1778 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
1779 int val = atoi(argv[1]);
1780
1781 if (bts->gprs.mode == BTS_GPRS_NONE) {
1782 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1783 return CMD_WARNING;
1784 }
1785
1786 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
1787 return CMD_WARNING;
1788
1789 bts->gprs.cell.timer[idx] = val;
1790
1791 return CMD_SUCCESS;
1792}
1793
Harald Welte3055e332010-03-14 15:37:43 +08001794DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
1795 "gprs routing area <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02001796 GPRS_TEXT
Harald Welte3055e332010-03-14 15:37:43 +08001797 "GPRS Routing Area Code")
1798{
1799 struct gsm_bts *bts = vty->index;
1800
Harald Weltecb20b7a2010-04-18 15:51:20 +02001801 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08001802 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1803 return CMD_WARNING;
1804 }
1805
Harald Welte3055e332010-03-14 15:37:43 +08001806 bts->gprs.rac = atoi(argv[0]);
1807
1808 return CMD_SUCCESS;
1809}
1810
Harald Weltecb20b7a2010-04-18 15:51:20 +02001811DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
1812 "gprs mode (none|gprs|egprs)",
Harald Welte9e002452010-05-11 21:53:49 +02001813 GPRS_TEXT
1814 "GPRS Mode for this BTS\n"
1815 "GPRS Disabled on this BTS\n"
1816 "GPRS Enabled on this BTS\n"
1817 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welte410575a2010-03-14 23:30:30 +08001818{
1819 struct gsm_bts *bts = vty->index;
1820
Harald Weltecb20b7a2010-04-18 15:51:20 +02001821 bts->gprs.mode = bts_gprs_mode_parse(argv[0]);
Harald Welte410575a2010-03-14 23:30:30 +08001822
1823 return CMD_SUCCESS;
1824}
1825
Harald Welte9e002452010-05-11 21:53:49 +02001826#define TRX_TEXT "Radio Transceiver\n"
Harald Welte3e774612009-08-10 13:48:16 +02001827
Harald Welte59b04682009-06-10 05:40:52 +08001828/* per TRX configuration */
1829DEFUN(cfg_trx,
1830 cfg_trx_cmd,
1831 "trx TRX_NR",
Harald Welte9e002452010-05-11 21:53:49 +02001832 TRX_TEXT
Harald Welte59b04682009-06-10 05:40:52 +08001833 "Select a TRX to configure")
1834{
1835 int trx_nr = atoi(argv[0]);
1836 struct gsm_bts *bts = vty->index;
1837 struct gsm_bts_trx *trx;
1838
Harald Weltee712a5f2009-06-21 16:17:15 +02001839 if (trx_nr > bts->num_trx) {
1840 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
1841 bts->num_trx, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +08001842 return CMD_WARNING;
Harald Weltee712a5f2009-06-21 16:17:15 +02001843 } else if (trx_nr == bts->num_trx) {
1844 /* we need to allocate a new one */
1845 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02001846 } else
Harald Weltee712a5f2009-06-21 16:17:15 +02001847 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02001848
Harald Weltee712a5f2009-06-21 16:17:15 +02001849 if (!trx)
1850 return CMD_WARNING;
Harald Welte59b04682009-06-10 05:40:52 +08001851
1852 vty->index = trx;
Harald Welte8791dac2010-05-14 17:59:53 +02001853 vty->index_sub = &trx->description;
Harald Welte59b04682009-06-10 05:40:52 +08001854 vty->node = TRX_NODE;
1855
1856 return CMD_SUCCESS;
1857}
1858
1859DEFUN(cfg_trx_arfcn,
1860 cfg_trx_arfcn_cmd,
Harald Welte00044592010-05-14 19:00:52 +02001861 "arfcn <0-1024>",
Harald Welte59b04682009-06-10 05:40:52 +08001862 "Set the ARFCN for this TRX\n")
1863{
1864 int arfcn = atoi(argv[0]);
1865 struct gsm_bts_trx *trx = vty->index;
1866
1867 /* FIXME: check if this ARFCN is supported by this TRX */
1868
1869 trx->arfcn = arfcn;
1870
1871 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
1872 /* FIXME: use OML layer to update the ARFCN */
1873 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
1874
1875 return CMD_SUCCESS;
1876}
1877
Harald Welte (local)b709bfe2009-12-27 20:56:38 +01001878DEFUN(cfg_trx_nominal_power,
1879 cfg_trx_nominal_power_cmd,
1880 "nominal power <0-100>",
1881 "Nominal TRX RF Power in dB\n")
1882{
1883 struct gsm_bts_trx *trx = vty->index;
1884
1885 trx->nominal_power = atoi(argv[0]);
1886
1887 return CMD_SUCCESS;
1888}
1889
Harald Welte91afe4c2009-06-20 18:15:19 +02001890DEFUN(cfg_trx_max_power_red,
1891 cfg_trx_max_power_red_cmd,
1892 "max_power_red <0-100>",
1893 "Reduction of maximum BS RF Power in dB\n")
1894{
1895 int maxpwr_r = atoi(argv[0]);
1896 struct gsm_bts_trx *trx = vty->index;
Harald Welte01acd742009-11-18 09:20:22 +01001897 int upper_limit = 24; /* default 12.21 max power red. */
Harald Welte91afe4c2009-06-20 18:15:19 +02001898
1899 /* FIXME: check if our BTS type supports more than 12 */
1900 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
1901 vty_out(vty, "%% Power %d dB is not in the valid range%s",
1902 maxpwr_r, VTY_NEWLINE);
1903 return CMD_WARNING;
1904 }
1905 if (maxpwr_r & 1) {
1906 vty_out(vty, "%% Power %d dB is not an even value%s",
1907 maxpwr_r, VTY_NEWLINE);
1908 return CMD_WARNING;
1909 }
1910
1911 trx->max_power_red = maxpwr_r;
1912
1913 /* FIXME: make sure we update this using OML */
1914
1915 return CMD_SUCCESS;
1916}
1917
Harald Welte62868882009-08-08 16:12:58 +02001918DEFUN(cfg_trx_rsl_e1,
1919 cfg_trx_rsl_e1_cmd,
1920 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
1921 "E1 interface to be used for RSL\n")
1922{
1923 struct gsm_bts_trx *trx = vty->index;
1924
1925 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
1926
1927 return CMD_SUCCESS;
1928}
1929
1930DEFUN(cfg_trx_rsl_e1_tei,
1931 cfg_trx_rsl_e1_tei_cmd,
1932 "rsl e1 tei <0-63>",
1933 "Set the TEI to be used for RSL")
1934{
1935 struct gsm_bts_trx *trx = vty->index;
1936
1937 trx->rsl_tei = atoi(argv[0]);
1938
1939 return CMD_SUCCESS;
1940}
1941
Holger Hans Peter Freyther1c8b4802009-11-11 11:54:24 +01001942DEFUN(cfg_trx_rf_locked,
1943 cfg_trx_rf_locked_cmd,
1944 "rf_locked (0|1)",
1945 "Turn off RF of the TRX.\n")
1946{
1947 int locked = atoi(argv[0]);
1948 struct gsm_bts_trx *trx = vty->index;
1949
1950 gsm_trx_lock_rf(trx, locked);
1951 return CMD_SUCCESS;
1952}
Harald Welte62868882009-08-08 16:12:58 +02001953
Harald Welte59b04682009-06-10 05:40:52 +08001954/* per TS configuration */
1955DEFUN(cfg_ts,
1956 cfg_ts_cmd,
Harald Welte62868882009-08-08 16:12:58 +02001957 "timeslot <0-7>",
Harald Welte59b04682009-06-10 05:40:52 +08001958 "Select a Timeslot to configure")
1959{
1960 int ts_nr = atoi(argv[0]);
1961 struct gsm_bts_trx *trx = vty->index;
1962 struct gsm_bts_trx_ts *ts;
1963
1964 if (ts_nr >= TRX_NR_TS) {
1965 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
1966 TRX_NR_TS, VTY_NEWLINE);
1967 return CMD_WARNING;
1968 }
1969
1970 ts = &trx->ts[ts_nr];
1971
1972 vty->index = ts;
1973 vty->node = TS_NODE;
1974
1975 return CMD_SUCCESS;
1976}
1977
Harald Welte3ffe1b32009-08-07 00:25:23 +02001978DEFUN(cfg_ts_pchan,
1979 cfg_ts_pchan_cmd,
1980 "phys_chan_config PCHAN",
1981 "Physical Channel configuration (TCH/SDCCH/...)")
1982{
1983 struct gsm_bts_trx_ts *ts = vty->index;
1984 int pchanc;
1985
1986 pchanc = gsm_pchan_parse(argv[0]);
1987 if (pchanc < 0)
1988 return CMD_WARNING;
1989
1990 ts->pchan = pchanc;
1991
1992 return CMD_SUCCESS;
1993}
1994
Harald Weltea42a93f2010-06-14 22:26:10 +02001995#define HOPPING_STR "Configure frequency hopping\n"
1996
1997DEFUN(cfg_ts_hopping,
1998 cfg_ts_hopping_cmd,
1999 "hopping enabled (0|1)",
2000 HOPPING_STR "Enable or disable frequency hopping\n"
2001 "Disable frequency hopping\n" "Enable frequency hopping\n")
2002{
2003 struct gsm_bts_trx_ts *ts = vty->index;
2004
2005 ts->hopping.enabled = atoi(argv[0]);
2006
2007 return CMD_SUCCESS;
2008}
2009
Harald Welte67104d12009-09-12 13:05:33 +02002010DEFUN(cfg_ts_hsn,
2011 cfg_ts_hsn_cmd,
Harald Weltea42a93f2010-06-14 22:26:10 +02002012 "hopping sequence-number <0-63>",
2013 HOPPING_STR
Harald Welte67104d12009-09-12 13:05:33 +02002014 "Which hopping sequence to use for this channel")
2015{
2016 struct gsm_bts_trx_ts *ts = vty->index;
2017
2018 ts->hopping.hsn = atoi(argv[0]);
2019
2020 return CMD_SUCCESS;
2021}
2022
2023DEFUN(cfg_ts_maio,
2024 cfg_ts_maio_cmd,
2025 "hopping maio <0-63>",
Harald Weltea42a93f2010-06-14 22:26:10 +02002026 HOPPING_STR
Harald Welte67104d12009-09-12 13:05:33 +02002027 "Which hopping MAIO to use for this channel")
2028{
2029 struct gsm_bts_trx_ts *ts = vty->index;
2030
2031 ts->hopping.maio = atoi(argv[0]);
2032
2033 return CMD_SUCCESS;
2034}
2035
2036DEFUN(cfg_ts_arfcn_add,
2037 cfg_ts_arfcn_add_cmd,
2038 "hopping arfcn add <0-1023>",
Harald Weltea42a93f2010-06-14 22:26:10 +02002039 HOPPING_STR "Configure hopping ARFCN list\n"
2040 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte67104d12009-09-12 13:05:33 +02002041{
2042 struct gsm_bts_trx_ts *ts = vty->index;
2043 int arfcn = atoi(argv[0]);
2044
Harald Weltea42a93f2010-06-14 22:26:10 +02002045 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
2046
Harald Welte67104d12009-09-12 13:05:33 +02002047 return CMD_SUCCESS;
2048}
2049
2050DEFUN(cfg_ts_arfcn_del,
2051 cfg_ts_arfcn_del_cmd,
2052 "hopping arfcn del <0-1023>",
Harald Weltea42a93f2010-06-14 22:26:10 +02002053 HOPPING_STR "Configure hopping ARFCN list\n"
2054 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte67104d12009-09-12 13:05:33 +02002055{
2056 struct gsm_bts_trx_ts *ts = vty->index;
2057 int arfcn = atoi(argv[0]);
2058
Harald Weltea42a93f2010-06-14 22:26:10 +02002059 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
2060
Harald Welte67104d12009-09-12 13:05:33 +02002061 return CMD_SUCCESS;
2062}
2063
Harald Welte3ffe1b32009-08-07 00:25:23 +02002064DEFUN(cfg_ts_e1_subslot,
2065 cfg_ts_e1_subslot_cmd,
Harald Welte62868882009-08-08 16:12:58 +02002066 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welte3ffe1b32009-08-07 00:25:23 +02002067 "E1 sub-slot connected to this on-air timeslot")
2068{
2069 struct gsm_bts_trx_ts *ts = vty->index;
2070
Harald Welte62868882009-08-08 16:12:58 +02002071 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Welte3ffe1b32009-08-07 00:25:23 +02002072
2073 return CMD_SUCCESS;
2074}
Harald Welte59b04682009-06-10 05:40:52 +08002075
Harald Weltea5b1dae2010-05-16 21:47:13 +02002076void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
2077{
2078 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
2079 counter_get(net->stats.chreq.total),
2080 counter_get(net->stats.chreq.no_channel), VTY_NEWLINE);
2081 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
2082 counter_get(net->stats.chan.rf_fail),
2083 counter_get(net->stats.chan.rll_err), VTY_NEWLINE);
2084 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
2085 counter_get(net->stats.paging.attempted),
2086 counter_get(net->stats.paging.completed),
2087 counter_get(net->stats.paging.expired), VTY_NEWLINE);
2088 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
2089 counter_get(net->stats.bts.oml_fail),
2090 counter_get(net->stats.bts.rsl_fail), VTY_NEWLINE);
2091}
2092
Harald Welte682ee5f2010-05-16 22:02:16 +02002093DEFUN(logging_fltr_imsi,
2094 logging_fltr_imsi_cmd,
2095 "logging filter imsi IMSI",
2096 LOGGING_STR FILTER_STR
2097 "Filter log messages by IMSI\n" "IMSI to be used as filter\n")
2098{
2099 struct telnet_connection *conn;
2100
2101 conn = (struct telnet_connection *) vty->priv;
2102 if (!conn->dbg) {
2103 vty_out(vty, "Logging was not enabled.%s", VTY_NEWLINE);
2104 return CMD_WARNING;
2105 }
2106
2107 log_set_imsi_filter(conn->dbg, argv[0]);
2108 return CMD_SUCCESS;
2109}
2110
Harald Welte40152872010-05-16 20:52:23 +02002111extern int bsc_vty_init_extra(void);
Harald Welte10c29f62010-05-16 19:20:24 +02002112extern const char *openbsc_copyright;
Holger Hans Peter Freytherc48a2a12010-04-10 00:08:28 +02002113
Harald Welte40152872010-05-16 20:52:23 +02002114int bsc_vty_init(void)
Harald Welte59b04682009-06-10 05:40:52 +08002115{
Harald Welte7bc28f62010-05-12 16:10:35 +00002116 install_element_ve(&show_net_cmd);
2117 install_element_ve(&show_bts_cmd);
2118 install_element_ve(&show_trx_cmd);
2119 install_element_ve(&show_ts_cmd);
2120 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08002121 install_element_ve(&show_lchan_summary_cmd);
Harald Welte682ee5f2010-05-16 22:02:16 +02002122 install_element_ve(&logging_fltr_imsi_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002123
Harald Welte7bc28f62010-05-12 16:10:35 +00002124 install_element_ve(&show_e1drv_cmd);
2125 install_element_ve(&show_e1line_cmd);
2126 install_element_ve(&show_e1ts_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002127
Harald Welte7bc28f62010-05-12 16:10:35 +00002128 install_element_ve(&show_paging_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002129
Harald Welte682ee5f2010-05-16 22:02:16 +02002130 logging_vty_add_cmds();
Holger Hans Peter Freytherc8d862e2009-12-22 22:32:51 +01002131
Harald Weltee87eb462009-08-07 13:29:14 +02002132 install_element(CONFIG_NODE, &cfg_net_cmd);
2133 install_node(&net_node, config_write_net);
2134 install_default(GSMNET_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +02002135 install_element(GSMNET_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +02002136 install_element(GSMNET_NODE, &ournode_end_cmd);
Harald Welte62868882009-08-08 16:12:58 +02002137 install_element(GSMNET_NODE, &cfg_net_ncc_cmd);
Harald Weltee87eb462009-08-07 13:29:14 +02002138 install_element(GSMNET_NODE, &cfg_net_mnc_cmd);
2139 install_element(GSMNET_NODE, &cfg_net_name_short_cmd);
2140 install_element(GSMNET_NODE, &cfg_net_name_long_cmd);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02002141 install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd);
Harald Welte59936d72009-11-18 20:33:19 +01002142 install_element(GSMNET_NODE, &cfg_net_reject_cause_cmd);
Harald Weltecca253a2009-08-30 15:47:06 +09002143 install_element(GSMNET_NODE, &cfg_net_encryption_cmd);
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01002144 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Welte52af1952009-12-13 10:53:12 +01002145 install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd);
Harald Welte284ddba2009-12-14 17:49:15 +01002146 install_element(GSMNET_NODE, &cfg_net_mm_info_cmd);
Harald Welte0af9c9f2009-12-19 21:41:52 +01002147 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Weltea8062f12009-12-21 16:51:50 +01002148 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
2149 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
2150 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
2151 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
2152 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
2153 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01002154 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +01002155 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
2156 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
2157 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
2158 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
2159 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
2160 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
2161 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
2162 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
2163 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
2164 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Harald Weltee87eb462009-08-07 13:29:14 +02002165
2166 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte97ceef92009-08-06 19:06:46 +02002167 install_node(&bts_node, config_write_bts);
Harald Welte59b04682009-06-10 05:40:52 +08002168 install_default(BTS_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +02002169 install_element(BTS_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +02002170 install_element(BTS_NODE, &ournode_end_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002171 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte8791dac2010-05-14 17:59:53 +02002172 install_element(BTS_NODE, &cfg_description_cmd);
2173 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Welte91afe4c2009-06-20 18:15:19 +02002174 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +02002175 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002176 install_element(BTS_NODE, &cfg_bts_lac_cmd);
2177 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte62868882009-08-08 16:12:58 +02002178 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002179 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte25572872009-10-20 00:22:00 +02002180 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte62868882009-08-08 16:12:58 +02002181 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
2182 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte3e774612009-08-10 13:48:16 +02002183 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01002184 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
2185 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08002186 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
2187 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02002188 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +08002189 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Harald Welte (local)cbd46102009-08-13 10:14:26 +02002190 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02002191 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Harald Welteb761bf82009-12-12 18:17:25 +01002192 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
2193 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Harald Weltecb20b7a2010-04-18 15:51:20 +02002194 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
Harald Weltea9251762010-05-11 23:50:21 +02002195 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte3055e332010-03-14 15:37:43 +08002196 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
2197 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Weltea9251762010-05-11 23:50:21 +02002198 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Welte4a048c52010-03-22 11:48:36 +08002199 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte3055e332010-03-14 15:37:43 +08002200 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welte410575a2010-03-14 23:30:30 +08002201 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
2202 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
2203 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002204
2205 install_element(BTS_NODE, &cfg_trx_cmd);
2206 install_node(&trx_node, dummy_config_write);
2207 install_default(TRX_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +02002208 install_element(TRX_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +02002209 install_element(TRX_NODE, &ournode_end_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002210 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte8791dac2010-05-14 17:59:53 +02002211 install_element(TRX_NODE, &cfg_description_cmd);
2212 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)b709bfe2009-12-27 20:56:38 +01002213 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte7f597bc2009-06-20 22:36:12 +02002214 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte62868882009-08-08 16:12:58 +02002215 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
2216 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther1c8b4802009-11-11 11:54:24 +01002217 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002218
2219 install_element(TRX_NODE, &cfg_ts_cmd);
2220 install_node(&ts_node, dummy_config_write);
2221 install_default(TS_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +02002222 install_element(TS_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +02002223 install_element(TS_NODE, &ournode_end_cmd);
Harald Welte3ffe1b32009-08-07 00:25:23 +02002224 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Weltea42a93f2010-06-14 22:26:10 +02002225 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte67104d12009-09-12 13:05:33 +02002226 install_element(TS_NODE, &cfg_ts_hsn_cmd);
2227 install_element(TS_NODE, &cfg_ts_maio_cmd);
2228 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
2229 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Welte3ffe1b32009-08-07 00:25:23 +02002230 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002231
Harald Welte63b964e2010-05-31 16:40:40 +02002232 abis_nm_vty_init();
2233
Harald Welte40152872010-05-16 20:52:23 +02002234 bsc_vty_init_extra();
Harald Welte59b04682009-06-10 05:40:52 +08002235
2236 return 0;
2237}