blob: 68a059749c9ee9cba09401e37dded6396fe6ac18 [file] [log] [blame]
Harald Welte68628e82009-03-10 12:17:57 +00001/* OpenBSC interface to quagga VTY */
Harald Welteaf387632010-03-14 23:30:30 +08002/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
Harald Welte68628e82009-03-10 12:17:57 +00003 * All Rights Reserved
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 */
20
21#include <stdlib.h>
22#include <unistd.h>
23#include <sys/types.h>
24
Harald Welte4b037e42010-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 Welte68628e82009-03-10 12:17:57 +000030
31#include <arpa/inet.h>
32
Harald Weltedfe6c7d2010-02-20 16:24:02 +010033#include <osmocore/linuxlist.h>
Harald Welte68628e82009-03-10 12:17:57 +000034#include <openbsc/gsm_data.h>
Harald Welte68628e82009-03-10 12:17:57 +000035#include <openbsc/e1_input.h>
Harald Welte1bc77352009-03-10 19:47:51 +000036#include <openbsc/abis_nm.h>
Harald Weltedfe6c7d2010-02-20 16:24:02 +010037#include <osmocore/gsm_utils.h>
Harald Welteb908cb72009-12-22 13:09:29 +010038#include <openbsc/chan_alloc.h>
Harald Welte8387a492009-12-22 21:43:14 +010039#include <openbsc/meas_rep.h>
Harald Welte40f82892009-05-23 17:31:39 +000040#include <openbsc/db.h>
Harald Weltedfe6c7d2010-02-20 16:24:02 +010041#include <osmocore/talloc.h>
Holger Hans Peter Freyther3c712322010-04-06 11:55:37 +020042#include <openbsc/vty.h>
Harald Welte22229d62010-05-12 20:28:04 +020043#include <openbsc/gprs_ns.h>
Harald Welte5bc61dc2010-05-16 22:02:16 +020044#include <openbsc/debug.h>
Harald Welte68628e82009-03-10 12:17:57 +000045
Harald Welte1353f962010-05-16 19:20:24 +020046#include "../bscconfig.h"
47
Harald Welteea4647d2010-05-12 17:19:53 +000048/* FIXME: this should go to some common file */
49static const struct value_string gprs_ns_timer_strs[] = {
Harald Welte615e9562010-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 Welteea4647d2010-05-12 17:19:53 +000060static const struct value_string gprs_bssgp_cfg_strs[] = {
Harald Welte615e9562010-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 Welte5013b2a2009-08-07 13:29:14 +020075struct cmd_node net_node = {
76 GSMNET_NODE,
77 "%s(network)#",
78 1,
79};
80
Harald Welte68628e82009-03-10 12:17:57 +000081struct 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 Welte39231152010-05-27 13:39:40 +020099extern struct gsm_network *bsc_gsmnet;
100
Harald Weltedcccb182010-05-16 20:52:23 +0200101struct gsm_network *gsmnet_from_vty(struct vty *v)
102{
Harald Welte39231152010-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 Weltedcccb182010-05-16 20:52:23 +0200107 struct telnet_connection *conn = v->priv;
108 return (struct gsm_network *) conn->priv;
Harald Welte39231152010-05-27 13:39:40 +0200109#else
110 return bsc_gsmnet;
111#endif
Harald Weltedcccb182010-05-16 20:52:23 +0200112}
113
Harald Welte68628e82009-03-10 12:17:57 +0000114static 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{
Harald Welte1bc77352009-03-10 19:47:51 +0000121 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);
Harald Welte68628e82009-03-10 12:17:57 +0000124}
125
Harald Welteb908cb72009-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 Welte68628e82009-03-10 12:17:57 +0000146static void net_dump_vty(struct vty *vty, struct gsm_network *net)
147{
Harald Welteb908cb72009-12-22 13:09:29 +0100148 struct pchan_load pl;
149
Harald Welteef235b52009-03-10 12:34:02 +0000150 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);
Harald Welte1bc77352009-03-10 19:47:51 +0000153 vty_out(vty, " Long network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000154 net->name_long, VTY_NEWLINE);
Harald Welte1bc77352009-03-10 19:47:51 +0000155 vty_out(vty, " Short network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000156 net->name_short, VTY_NEWLINE);
Harald Welte (local)69de3972009-08-12 14:42:23 +0200157 vty_out(vty, " Authentication policy: %s%s",
158 gsm_auth_policy_name(net->auth_policy), VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100159 vty_out(vty, " Location updating reject cause: %u%s",
160 net->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900161 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
162 VTY_NEWLINE);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +0100163 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
164 VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100165 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
166 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100167 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
168 VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100169 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
170 VTY_NEWLINE);
Harald Welteb908cb72009-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 Welte68628e82009-03-10 12:17:57 +0000174}
175
176DEFUN(show_net, show_net_cmd, "show network",
177 SHOW_STR "Display information about a GSM NETWORK\n")
178{
Harald Weltedcccb182010-05-16 20:52:23 +0200179 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000180 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{
Harald Welteedb37782009-05-01 14:59:07 +0000187 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,
Harald Welte1bc77352009-03-10 19:47:51 +0000198 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
Harald Welteedb37782009-05-01 14:59:07 +0000199 vty_out(vty, " E1 TEI %u, SAPI %u%s",
Harald Welte68628e82009-03-10 12:17:57 +0000200 e1l->tei, e1l->sapi, VTY_NEWLINE);
201}
202
203static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
204{
Harald Welteb908cb72009-12-22 13:09:29 +0100205 struct pchan_load pl;
206
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200207 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Weltefcd24452009-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 Freytherc4a49e32009-08-21 14:44:12 +0200210 bts->cell_identity,
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +0200211 bts->location_area_code, bts->bsic, bts->tsc,
Harald Weltefcd24452009-06-20 18:15:19 +0200212 bts->num_trx, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200213 vty_out(vty, "Description: %s%s",
214 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Harald Welte1d8dbc42009-12-12 15:38:16 +0100215 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100216 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte1d8dbc42009-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 Welte73225282009-12-12 18:17:25 +0100220 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut4010f1e2009-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 Welte71355012009-12-21 23:08:18 +0100226 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200227 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Harald Welte4cc34222009-05-01 15:12:31 +0000228 if (is_ipaccess_bts(bts))
Harald Welte8175e952009-10-20 00:22:00 +0200229 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte4cc34222009-05-01 15:12:31 +0000230 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte8175e952009-10-20 00:22:00 +0200231 bts->oml_tei, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000232 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 Welte8175e952009-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 Welte68628e82009-03-10 12:17:57 +0000242 /* FIXME: oml_link, chan_desc */
Harald Welteb908cb72009-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 Welte68628e82009-03-10 12:17:57 +0000247}
248
249DEFUN(show_bts, show_bts_cmd, "show bts [number]",
250 SHOW_STR "Display information about a BTS\n"
251 "BTS number")
252{
Harald Weltedcccb182010-05-16 20:52:23 +0200253 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000254 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) {
Harald Welte1bc77352009-03-10 19:47:51 +0000260 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000261 VTY_NEWLINE);
262 return CMD_WARNING;
263 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200264 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000265 return CMD_SUCCESS;
266 }
267 /* print all BTS's */
268 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee441d9c2009-06-21 16:17:15 +0200269 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000270
271 return CMD_SUCCESS;
272}
273
Harald Welte42581822009-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 Welte67ce0732009-08-06 19:06:46 +0200302static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
303{
Harald Welte42581822009-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 Weltea39b0f22010-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 Welte6e0cd042009-09-12 13:05:33 +0200313 ts->hopping.hsn, VTY_NEWLINE);
Harald Weltea39b0f22010-06-14 22:26:10 +0200314 vty_out(vty, " hopping maio %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200315 ts->hopping.maio, VTY_NEWLINE);
Harald Weltea39b0f22010-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 Welte42581822009-08-08 16:12:58 +0200323 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Welte67ce0732009-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 Welte5013b2a2009-08-07 13:29:14 +0200330 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200331 if (trx->description)
332 vty_out(vty, " description %s%s", trx->description,
333 VTY_NEWLINE);
Holger Hans Peter Freyther2ba40af2010-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 Welte5013b2a2009-08-07 13:29:14 +0200337 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)7b37d972009-12-27 20:56:38 +0100338 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200339 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte42581822009-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 Welte67ce0732009-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 Welte615e9562010-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 Welte67ce0732009-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 Welte5013b2a2009-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 Welte197dea92010-05-14 17:59:53 +0200392 if (bts->description)
393 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200394 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freytherf926ed62009-11-19 16:38:49 +0100395 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200396 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte67ce0732009-08-06 19:06:46 +0200397 VTY_NEWLINE);
Harald Welte5013b2a2009-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)0e451d02009-08-13 10:14:26 +0200400 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-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 Weltea43f7892009-12-01 18:04:30 +0530405 if (bts->si_common.chan_desc.t3212)
Harald Welte (local)efc92312009-08-14 23:09:25 +0200406 vty_out(vty, " periodic location update %u%s",
Harald Weltea43f7892009-12-01 18:04:30 +0530407 bts->si_common.chan_desc.t3212 * 10, VTY_NEWLINE);
Harald Welte7a8fa412009-08-10 13:48:16 +0200408 vty_out(vty, " channel allocator %s%s",
409 bts->chan_alloc_reverse ? "descending" : "ascending",
410 VTY_NEWLINE);
Sylvain Munaut4010f1e2009-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 Freyther95c22902010-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 Welte71355012009-12-21 23:08:18 +0100423 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200424 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther3a0a4632010-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 Welte8175e952009-10-20 00:22:00 +0200427 if (is_ipaccess_bts(bts)) {
Harald Welte5013b2a2009-08-07 13:29:14 +0200428 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Weltea6fd58e2009-08-07 00:25:23 +0200429 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte8175e952009-10-20 00:22:00 +0200430 vty_out(vty, " oml ip.access stream_id %u%s", bts->oml_tei, VTY_NEWLINE);
431 } else {
Harald Welte42581822009-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 Welte615e9562010-05-11 23:50:21 +0200435 config_write_bts_gprs(vty, bts);
Harald Welte67ce0732009-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 Weltedcccb182010-05-16 20:52:23 +0200443 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte67ce0732009-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 Welte5013b2a2009-08-07 13:29:14 +0200452static int config_write_net(struct vty *vty)
453{
Harald Weltedcccb182010-05-16 20:52:23 +0200454 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
455
Harald Welte5013b2a2009-08-07 13:29:14 +0200456 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200457 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200458 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte42581822009-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)69de3972009-08-12 14:42:23 +0200461 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100462 vty_out(vty, " location updating reject cause %u%s",
463 gsmnet->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900464 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freytherd54c3372009-11-19 16:37:48 +0100465 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100466 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
467 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100468 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100469 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Welteb720bd32009-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 Freytherc4d88ad2009-11-21 21:18:38 +0100482 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-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 Welte5013b2a2009-08-07 13:29:14 +0200493
494 return CMD_SUCCESS;
495}
Harald Welte67ce0732009-08-06 19:06:46 +0200496
Harald Welte68628e82009-03-10 12:17:57 +0000497static 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 Welte197dea92010-05-14 17:59:53 +0200501 vty_out(vty, "Description: %s%s",
502 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Weltefcd24452009-06-20 18:15:19 +0200503 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte42581822009-08-08 16:12:58 +0200504 "resulting BS power: %d dBm%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200505 trx->nominal_power, trx->max_power_red,
Harald Welte42581822009-08-08 16:12:58 +0200506 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000507 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 Welte8175e952009-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 Welte68628e82009-03-10 12:17:57 +0000518}
519
520DEFUN(show_trx,
521 show_trx_cmd,
522 "show trx [bts_nr] [trx_nr]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200523 SHOW_STR "Display information about a TRX\n"
524 "BTS Number\n"
525 "TRX Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000526{
Harald Weltedcccb182010-05-16 20:52:23 +0200527 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000528 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) {
Harald Welte1bc77352009-03-10 19:47:51 +0000536 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000537 VTY_NEWLINE);
538 return CMD_WARNING;
539 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200540 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000541 }
542 if (argc >= 2) {
543 trx_nr = atoi(argv[1]);
544 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000545 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000546 VTY_NEWLINE);
547 return CMD_WARNING;
548 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200549 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000550 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 Weltee441d9c2009-06-21 16:17:15 +0200556 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000557 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 Weltee441d9c2009-06-21 16:17:15 +0200563 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000564 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200565 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000566 trx_dump_vty(vty, trx);
567 }
568 }
569
570 return CMD_SUCCESS;
571}
572
Harald Welte67ce0732009-08-06 19:06:46 +0200573
Harald Welte68628e82009-03-10 12:17:57 +0000574static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
575{
Harald Welte68628e82009-03-10 12:17:57 +0000576 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 Welte2c828992009-12-02 01:56:49 +0530581 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welteef235b52009-03-10 12:34:02 +0000582 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 Welte68628e82009-03-10 12:17:57 +0000585}
586
587DEFUN(show_ts,
588 show_ts_cmd,
Harald Welte1bc77352009-03-10 19:47:51 +0000589 "show timeslot [bts_nr] [trx_nr] [ts_nr]",
Harald Welte8f0ed552010-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 Welte68628e82009-03-10 12:17:57 +0000592{
Harald Weltedcccb182010-05-16 20:52:23 +0200593 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000594 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) {
Harald Welte1bc77352009-03-10 19:47:51 +0000603 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000604 VTY_NEWLINE);
605 return CMD_WARNING;
606 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200607 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000608 }
609 if (argc >= 2) {
610 trx_nr = atoi(argv[1]);
611 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000612 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000613 VTY_NEWLINE);
614 return CMD_WARNING;
615 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200616 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000617 }
618 if (argc >= 3) {
619 ts_nr = atoi(argv[2]);
620 if (ts_nr >= TRX_NR_TS) {
Harald Welte1bc77352009-03-10 19:47:51 +0000621 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
Harald Welte68628e82009-03-10 12:17:57 +0000622 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 Weltee441d9c2009-06-21 16:17:15 +0200630 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000631 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200632 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000633 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 Freyther424c4f02010-01-06 06:00:40 +0100643static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte68628e82009-03-10 12:17:57 +0000644{
Harald Weltefcd24452009-06-20 18:15:19 +0200645 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte40f82892009-05-23 17:31:39 +0000646 subscr->authorized, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000647 if (subscr->name)
Harald Welte1bc77352009-03-10 19:47:51 +0000648 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000649 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 Freyther22230252009-08-19 12:53:57 +0200654 if (subscr->tmsi != GSM_RESERVED_TMSI)
655 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte731fd912009-08-15 03:24:51 +0200656 VTY_NEWLINE);
Sylvain Munautaf292642009-12-27 19:29:28 +0100657
Harald Welte (local)15920de2009-08-14 20:27:16 +0200658 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000659}
660
Harald Welte8387a492009-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 Freyther029235e2010-05-14 02:03:16 +0800695static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte68628e82009-03-10 12:17:57 +0000696{
Harald Welte8387a492009-12-22 21:43:14 +0100697 int idx;
698
Harald Welte68628e82009-03-10 12:17:57 +0000699 vty_out(vty, "Lchan %u in Timeslot %u of TRX %u in BTS %u, Type %s%s",
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +0200700 lchan->nr, lchan->ts->nr, lchan->ts->trx->nr,
Harald Welte (local)ccd88452009-12-27 18:05:25 +0100701 lchan->ts->trx->bts->nr, gsm_lchant_name(lchan->type),
Harald Welte68628e82009-03-10 12:17:57 +0000702 VTY_NEWLINE);
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100703 vty_out(vty, " Use Count: %u, State: %s%s", lchan->conn.use_count,
Harald Welte1887f9d2009-12-29 10:52:38 +0100704 gsm_lchans_name(lchan->state), VTY_NEWLINE);
Harald Welte73225282009-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 Freyther68884aa2010-03-23 06:41:45 +0100710 if (lchan->conn.subscr) {
Harald Welte68628e82009-03-10 12:17:57 +0000711 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100712 subscr_dump_vty(vty, lchan->conn.subscr);
Harald Welte68628e82009-03-10 12:17:57 +0000713 } else
714 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte2c828992009-12-02 01:56:49 +0530715 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
716 struct in_addr ia;
Holger Hans Peter Freyther54fa7992010-04-07 15:39:16 +0200717 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte2c828992009-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 Welte8387a492009-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 Welte68628e82009-03-10 12:17:57 +0000728}
729
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +0800730static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
731{
Holger Hans Peter Freythercf5cc5b2010-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 Freyther3d6a5d62010-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 Freythercf5cc5b2010-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 Freyther3d6a5d62010-05-14 02:08:49 +0800747 VTY_NEWLINE);
748}
749
Holger Hans Peter Freyther029235e2010-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 Welte68628e82009-03-10 12:17:57 +0000752{
Harald Weltedcccb182010-05-16 20:52:23 +0200753 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000754 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 Weltee441d9c2009-06-21 16:17:15 +0200768 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000769 }
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 Weltee441d9c2009-06-21 16:17:15 +0200777 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000778 }
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 Freyther029235e2010-05-14 02:03:16 +0800796 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +0000797 return CMD_SUCCESS;
798 }
799 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200800 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000801 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200802 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000803 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];
Harald Welteef235b52009-03-10 12:34:02 +0000808 if (lchan->type == GSM_LCHAN_NONE)
809 continue;
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +0800810 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +0000811 }
812 }
813 }
814 }
815
816 return CMD_SUCCESS;
817}
818
Holger Hans Peter Freyther029235e2010-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 Freyther3d6a5d62010-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 Welte1bc77352009-03-10 19:47:51 +0000841static 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
Harald Welte68628e82009-03-10 12:17:57 +0000859static 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 Welte8f0ed552010-05-11 21:53:49 +0200869 SHOW_STR "Display information about a E1 line\n"
870 "E1 Line Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000871{
Harald Welte1bc77352009-03-10 19:47:51 +0000872 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;
Harald Welte68628e82009-03-10 12:17:57 +0000889}
890
891static void e1ts_dump_vty(struct vty *vty, struct e1inp_ts *ts)
892{
Harald Welte42581822009-08-08 16:12:58 +0200893 if (ts->type == E1INP_TS_TYPE_NONE)
894 return;
Harald Welte1bc77352009-03-10 19:47:51 +0000895 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);
Harald Welte68628e82009-03-10 12:17:57 +0000898}
899
900DEFUN(show_e1ts,
901 show_e1ts_cmd,
902 "show e1_timeslot [line_nr] [ts_nr]",
Harald Welte8f0ed552010-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 Welte68628e82009-03-10 12:17:57 +0000905{
Harald Welte986c3d72009-11-17 06:12:16 +0100906 struct e1inp_line *line = NULL;
Harald Welte1bc77352009-03-10 19:47:51 +0000907 struct e1inp_ts *ts;
908 int ts_nr;
Harald Welte68628e82009-03-10 12:17:57 +0000909
Harald Welte1bc77352009-03-10 19:47:51 +0000910 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;
Harald Welte68628e82009-03-10 12:17:57 +0000949}
950
Harald Weltebe4b7302009-05-23 16:59:33 +0000951static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
Harald Weltef5025b62009-03-28 16:55:11 +0000952{
953 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
954 subscr_dump_vty(vty, pag->subscr);
955}
956
Harald Weltebe4b7302009-05-23 16:59:33 +0000957static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
Harald Weltef5025b62009-03-28 16:55:11 +0000958{
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 Welte8f0ed552010-05-11 21:53:49 +0200968 SHOW_STR "Display information about paging reuqests of a BTS\n"
969 "BTS Number\n")
Harald Weltef5025b62009-03-28 16:55:11 +0000970{
Harald Weltedcccb182010-05-16 20:52:23 +0200971 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Weltef5025b62009-03-28 16:55:11 +0000972 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 Weltee441d9c2009-06-21 16:17:15 +0200983 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +0000984 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 Weltee441d9c2009-06-21 16:17:15 +0200989 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +0000990 bts_paging_dump_vty(vty, bts);
991 }
992
993 return CMD_SUCCESS;
994}
995
Harald Welte8f0ed552010-05-11 21:53:49 +0200996#define NETWORK_STR "Configure the GSM network\n"
997
Harald Welte5013b2a2009-08-07 13:29:14 +0200998DEFUN(cfg_net,
999 cfg_net_cmd,
Harald Welte8f0ed552010-05-11 21:53:49 +02001000 "network", NETWORK_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001001{
Harald Weltedcccb182010-05-16 20:52:23 +02001002 vty->index = gsmnet_from_vty(vty);
Harald Welte5013b2a2009-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 Weltedcccb182010-05-16 20:52:23 +02001014 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1015
Harald Welte5013b2a2009-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 Weltedcccb182010-05-16 20:52:23 +02001026 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1027
Harald Welte5013b2a2009-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 Weltedcccb182010-05-16 20:52:23 +02001038 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1039
Harald Welte5013b2a2009-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 Weltedcccb182010-05-16 20:52:23 +02001053 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1054
Harald Welte5013b2a2009-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 Welte40f82892009-05-23 17:31:39 +00001062
Harald Welte (local)69de3972009-08-12 14:42:23 +02001063DEFUN(cfg_net_auth_policy,
1064 cfg_net_auth_policy_cmd,
1065 "auth policy (closed|accept-all|token)",
Harald Welte8f0ed552010-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)69de3972009-08-12 14:42:23 +02001071{
1072 enum gsm_auth_policy policy = gsm_auth_policy_parse(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001073 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte (local)69de3972009-08-12 14:42:23 +02001074
1075 gsmnet->auth_policy = policy;
1076
1077 return CMD_SUCCESS;
1078}
1079
Harald Welte1085c092009-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 Weltedcccb182010-05-16 20:52:23 +02001085 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1086
Harald Welte1085c092009-11-18 20:33:19 +01001087 gsmnet->reject_cause = atoi(argv[0]);
1088
1089 return CMD_SUCCESS;
1090}
1091
Harald Welte4381cfe2009-08-30 15:47:06 +09001092DEFUN(cfg_net_encryption,
1093 cfg_net_encryption_cmd,
1094 "encryption a5 (0|1|2)",
Harald Welte28326062010-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 Welte4381cfe2009-08-30 15:47:06 +09001098{
Harald Weltedcccb182010-05-16 20:52:23 +02001099 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1100
Andreas.Eversberg1059deb2009-11-17 09:55:26 +01001101 gsmnet->a5_encryption= atoi(argv[0]);
Harald Welte4381cfe2009-08-30 15:47:06 +09001102
1103 return CMD_SUCCESS;
1104}
1105
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001106DEFUN(cfg_net_neci,
1107 cfg_net_neci_cmd,
1108 "neci (0|1)",
Harald Welte28326062010-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 Freytherf7d752f2009-11-16 17:12:38 +01001111{
Harald Weltedcccb182010-05-16 20:52:23 +02001112 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1113
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001114 gsmnet->neci = atoi(argv[0]);
1115 return CMD_SUCCESS;
1116}
1117
Harald Welteeab84a12009-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 Welte8f0ed552010-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 Welteeab84a12009-12-13 10:53:12 +01001126{
Harald Weltedcccb182010-05-16 20:52:23 +02001127 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1128
Harald Welteeab84a12009-12-13 10:53:12 +01001129 gsmnet->rrlp.mode = rrlp_mode_parse(argv[0]);
1130
1131 return CMD_SUCCESS;
1132}
1133
Harald Welte648b6ce2009-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 Weltedcccb182010-05-16 20:52:23 +02001138 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1139
Harald Welte648b6ce2009-12-14 09:00:24 +01001140 gsmnet->send_mm_info = atoi(argv[0]);
1141
1142 return CMD_SUCCESS;
1143}
1144
Harald Welte8f0ed552010-05-11 21:53:49 +02001145#define HANDOVER_STR "Handover Options\n"
1146
Harald Weltebc814502009-12-19 21:41:52 +01001147DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1148 "handover (0|1)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001149 HANDOVER_STR
1150 "Don't perform in-call handover\n"
1151 "Perform in-call handover\n")
Harald Weltebc814502009-12-19 21:41:52 +01001152{
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001153 int enable = atoi(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001154 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001155
1156 if (enable && ipacc_rtp_direct) {
Harald Weltefe03f0d2009-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 Freythercbcfe242010-01-07 16:14:38 +01001162 gsmnet->handover.active = enable;
Harald Weltebc814502009-12-19 21:41:52 +01001163
1164 return CMD_SUCCESS;
1165}
1166
Harald Welte8f0ed552010-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 Welteb720bd32009-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 Welte8f0ed552010-05-11 21:53:49 +02001174 HO_WIN_RXLEV_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001175 "How many RxLev measurements are used for averaging")
1176{
Harald Weltedcccb182010-05-16 20:52:23 +02001177 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-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 Welte8f0ed552010-05-11 21:53:49 +02001184 HO_WIN_RXQUAL_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001185 "How many RxQual measurements are used for averaging")
1186{
Harald Weltedcccb182010-05-16 20:52:23 +02001187 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-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 Welte8f0ed552010-05-11 21:53:49 +02001194 HO_WIN_RXLEV_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001195 "How many RxQual measurements are used for averaging")
1196{
Harald Weltedcccb182010-05-16 20:52:23 +02001197 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-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 Welte8f0ed552010-05-11 21:53:49 +02001204 HO_PBUDGET_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001205 "How often to check if we have a better cell (SACCH frames)")
1206{
Harald Weltedcccb182010-05-16 20:52:23 +02001207 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-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 Welte8f0ed552010-05-11 21:53:49 +02001214 HO_PBUDGET_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001215 "How many dB does a neighbor to be stronger to become a HO candidate")
1216{
Harald Weltedcccb182010-05-16 20:52:23 +02001217 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-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 Welte8f0ed552010-05-11 21:53:49 +02001224 HANDOVER_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001225 "How big is the maximum timing advance before HO is forced")
1226{
Harald Weltedcccb182010-05-16 20:52:23 +02001227 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001228 gsmnet->handover.max_distance = atoi(argv[0]);
1229 return CMD_SUCCESS;
1230}
Harald Weltebc814502009-12-19 21:41:52 +01001231
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001232#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001233 DEFUN(cfg_net_T##number, \
1234 cfg_net_T##number##_cmd, \
1235 "timer t" #number " <0-65535>", \
Harald Welte8f0ed552010-05-11 21:53:49 +02001236 "Configure GSM Timers\n" \
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001237 doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001238{ \
Harald Weltedcccb182010-05-16 20:52:23 +02001239 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freytherc4d88ad2009-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 Freytherc8021062009-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 Freytherf30c0dc2010-05-31 21:33:15 +08001257DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.")
Holger Hans Peter Freytherc8021062009-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 Freytherc4d88ad2009-11-21 21:18:38 +01001263
1264
Harald Welte5258fc42009-03-28 19:07:53 +00001265/* per-BTS configuration */
1266DEFUN(cfg_bts,
1267 cfg_bts_cmd,
1268 "bts BTS_NR",
Harald Welte8f0ed552010-05-11 21:53:49 +02001269 "Select a BTS to configure\n"
1270 "BTS Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001271{
Harald Weltedcccb182010-05-16 20:52:23 +02001272 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte5258fc42009-03-28 19:07:53 +00001273 int bts_nr = atoi(argv[0]);
1274 struct gsm_bts *bts;
1275
Harald Weltee441d9c2009-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 Welte5258fc42009-03-28 19:07:53 +00001279 return CMD_WARNING;
Harald Weltee441d9c2009-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 Freytheracf8a0c2010-03-29 08:47:44 +02001284 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02001285 bts = gsm_bts_num(gsmnet, bts_nr);
1286
Daniel Willmannf15c2762010-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 Weltee441d9c2009-06-21 16:17:15 +02001290 return CMD_WARNING;
Daniel Willmannf15c2762010-01-11 13:43:07 +01001291 }
Harald Welte5258fc42009-03-28 19:07:53 +00001292
1293 vty->index = bts;
Harald Welte197dea92010-05-14 17:59:53 +02001294 vty->index_sub = &bts->description;
Harald Welte5258fc42009-03-28 19:07:53 +00001295 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 Welte39315c42010-01-10 18:01:52 +01001306 int rc;
Harald Welte5258fc42009-03-28 19:07:53 +00001307
Harald Welte39315c42010-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 Welte8175e952009-10-20 00:22:00 +02001311
Harald Welte5258fc42009-03-28 19:07:53 +00001312 return CMD_SUCCESS;
1313}
1314
Harald Weltefcd24452009-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 Welte42581822009-08-08 16:12:58 +02001321 int band = gsm_band_parse(argv[0]);
Harald Weltefcd24452009-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 Freytherc4a49e32009-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 Welte5258fc42009-03-28 19:07:53 +00001352DEFUN(cfg_bts_lac,
1353 cfg_bts_lac_cmd,
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001354 "location_area_code <0-65535>",
Harald Welte5258fc42009-03-28 19:07:53 +00001355 "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 Freyther0b7f4b32009-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 Welte5258fc42009-03-28 19:07:53 +00001362 lac, VTY_NEWLINE);
1363 return CMD_WARNING;
1364 }
Holger Hans Peter Freythere48b9562009-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 Welte5258fc42009-03-28 19:07:53 +00001372 bts->location_area_code = lac;
1373
1374 return CMD_SUCCESS;
1375}
1376
Harald Weltea43f7892009-12-01 18:04:30 +05301377
Harald Welte5258fc42009-03-28 19:07:53 +00001378DEFUN(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
Harald Welte78f2f502009-05-23 16:56:52 +00001396DEFUN(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 Welte42581822009-08-08 16:12:58 +02001405 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte78f2f502009-05-23 16:56:52 +00001406 bsic, VTY_NEWLINE);
1407 return CMD_WARNING;
1408 }
1409 bts->bsic = bsic;
1410
1411 return CMD_SUCCESS;
1412}
1413
1414
Harald Welte4cc34222009-05-01 15:12:31 +00001415DEFUN(cfg_bts_unit_id,
1416 cfg_bts_unit_id_cmd,
Harald Welte07dc73d2009-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 Welte4cc34222009-05-01 15:12:31 +00001419{
1420 struct gsm_bts *bts = vty->index;
1421 int site_id = atoi(argv[0]);
1422 int bts_id = atoi(argv[1]);
1423
Harald Welte07dc73d2009-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 Welte4cc34222009-05-01 15:12:31 +00001429 bts->ip_access.site_id = site_id;
1430 bts->ip_access.bts_id = bts_id;
1431
1432 return CMD_SUCCESS;
1433}
1434
Harald Welte8f0ed552010-05-11 21:53:49 +02001435#define OML_STR "Organization & Maintenance Link\n"
1436#define IPA_STR "ip.access Specific Options\n"
1437
Harald Welte8175e952009-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 Welte8f0ed552010-05-11 21:53:49 +02001441 OML_STR IPA_STR
Harald Welte8175e952009-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 Welte8f0ed552010-05-11 21:53:49 +02001457#define OML_E1_STR OML_STR "E1 Line\n"
Harald Welte8175e952009-10-20 00:22:00 +02001458
Harald Welte42581822009-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 Welte8f0ed552010-05-11 21:53:49 +02001462 OML_E1_STR
Harald Welte42581822009-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 Welte8f0ed552010-05-11 21:53:49 +02001476 OML_E1_STR
Harald Welte42581822009-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 Welte7a8fa412009-08-10 13:48:16 +02001486DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1487 "channel allocator (ascending|descending)",
Harald Welte8f0ed552010-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 Welte7a8fa412009-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 Welte8f0ed552010-05-11 21:53:49 +02001502#define RACH_STR "Random Access Control Channel\n"
1503
Sylvain Munaut4010f1e2009-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 Welte8f0ed552010-05-11 21:53:49 +02001507 RACH_STR
Sylvain Munaut4010f1e2009-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 Welte8f0ed552010-05-11 21:53:49 +02001518 RACH_STR
Sylvain Munaut4010f1e2009-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 Welte8f0ed552010-05-11 21:53:49 +02001526#define NM_STR "Network Management\n"
1527
Holger Hans Peter Freyther95c22902010-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 Welte8f0ed552010-05-11 21:53:49 +02001531 RACH_STR NM_STR
1532 "Set the NM Busy Threshold in dB")
Holger Hans Peter Freyther95c22902010-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 Welte8f0ed552010-05-11 21:53:49 +02001542 RACH_STR NM_STR
1543 "Set the NM Loadaverage Slots value")
Holger Hans Peter Freyther95c22902010-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)5dececf2009-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 Welte71355012009-12-21 23:08:18 +01001556 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02001557
1558 return CMD_SUCCESS;
1559}
1560
Holger Hans Peter Freyther3a0a4632010-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)0e451d02009-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 Welte73225282009-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)efc92312009-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 Weltea43f7892009-12-01 18:04:30 +05301614 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 10;
Harald Welte (local)efc92312009-08-14 23:09:25 +02001615
1616 return CMD_SUCCESS;
1617}
1618
Harald Welte8f0ed552010-05-11 21:53:49 +02001619#define GPRS_TEXT "GPRS Packet Network\n"
1620
Harald Welteaf387632010-03-14 23:30:30 +08001621DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welte57ba7e32010-04-18 14:00:26 +02001622 "gprs cell bvci <2-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001623 GPRS_TEXT
1624 "GPRS Cell Settings\n"
Harald Welte97a282b2010-03-14 15:37:43 +08001625 "GPRS BSSGP VC Identifier")
1626{
1627 struct gsm_bts *bts = vty->index;
1628
Harald Welte4511d892010-04-18 15:51:20 +02001629 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-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 Welte97a282b2010-03-14 15:37:43 +08001634 bts->gprs.cell.bvci = atoi(argv[0]);
1635
1636 return CMD_SUCCESS;
1637}
1638
Harald Weltea5731cf2010-03-22 11:48:36 +08001639DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
1640 "gprs nsei <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001641 GPRS_TEXT
Harald Weltea5731cf2010-03-22 11:48:36 +08001642 "GPRS NS Entity Identifier")
1643{
1644 struct gsm_bts *bts = vty->index;
1645
Harald Welte4511d892010-04-18 15:51:20 +02001646 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltea5731cf2010-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 Welte8f0ed552010-05-11 21:53:49 +02001656#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
1657 "NSVC Logical Number\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08001658
Harald Welte97a282b2010-03-14 15:37:43 +08001659DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
1660 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001661 GPRS_TEXT NSVC_TEXT
1662 "NS Virtual Connection Identifier\n"
Harald Welte97a282b2010-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 Welte4511d892010-04-18 15:51:20 +02001668 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-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 Welte97a282b2010-03-14 15:37:43 +08001673 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
1674
1675 return CMD_SUCCESS;
1676}
1677
Harald Welteaf387632010-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 Welte8f0ed552010-05-11 21:53:49 +02001680 GPRS_TEXT NSVC_TEXT
Harald Welteaf387632010-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 Welte4511d892010-04-18 15:51:20 +02001686 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-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 Welteaf387632010-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 Welte8f0ed552010-05-11 21:53:49 +02001698 GPRS_TEXT NSVC_TEXT
Harald Welteaf387632010-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 Welte4511d892010-04-18 15:51:20 +02001704 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-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 Welteaf387632010-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 Welte8f0ed552010-05-11 21:53:49 +02001716 GPRS_TEXT NSVC_TEXT
Harald Welteaf387632010-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 Welte4511d892010-04-18 15:51:20 +02001723 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-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 Welteaf387632010-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 Welte615e9562010-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 Welte28326062010-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 Welte615e9562010-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 Welte97a282b2010-03-14 15:37:43 +08001794DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
1795 "gprs routing area <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001796 GPRS_TEXT
Harald Welte97a282b2010-03-14 15:37:43 +08001797 "GPRS Routing Area Code")
1798{
1799 struct gsm_bts *bts = vty->index;
1800
Harald Welte4511d892010-04-18 15:51:20 +02001801 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-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 Welte97a282b2010-03-14 15:37:43 +08001806 bts->gprs.rac = atoi(argv[0]);
1807
1808 return CMD_SUCCESS;
1809}
1810
Harald Welte4511d892010-04-18 15:51:20 +02001811DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
1812 "gprs mode (none|gprs|egprs)",
Harald Welte8f0ed552010-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 Welteaf387632010-03-14 23:30:30 +08001818{
1819 struct gsm_bts *bts = vty->index;
Harald Weltef3d8e922010-06-14 22:44:42 +02001820 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0]);
Harald Welteaf387632010-03-14 23:30:30 +08001821
Harald Weltef3d8e922010-06-14 22:44:42 +02001822 if (mode != BTS_GPRS_NONE &&
1823 !gsm_bts_has_feature(bts, BTS_FEAT_GPRS)) {
1824 vty_out(vty, "This BTS type does not support %s%s", argv[0],
1825 VTY_NEWLINE);
1826 return CMD_WARNING;
1827 }
1828 if (mode == BTS_GPRS_EGPRS &&
1829 !gsm_bts_has_feature(bts, BTS_FEAT_EGPRS)) {
1830 vty_out(vty, "This BTS type does not support %s%s", argv[0],
1831 VTY_NEWLINE);
1832 return CMD_WARNING;
1833 }
1834
1835 bts->gprs.mode = mode;
Harald Welteaf387632010-03-14 23:30:30 +08001836
1837 return CMD_SUCCESS;
1838}
1839
Harald Welte8f0ed552010-05-11 21:53:49 +02001840#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02001841
Harald Welte5258fc42009-03-28 19:07:53 +00001842/* per TRX configuration */
1843DEFUN(cfg_trx,
1844 cfg_trx_cmd,
1845 "trx TRX_NR",
Harald Welte8f0ed552010-05-11 21:53:49 +02001846 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00001847 "Select a TRX to configure")
1848{
1849 int trx_nr = atoi(argv[0]);
1850 struct gsm_bts *bts = vty->index;
1851 struct gsm_bts_trx *trx;
1852
Harald Weltee441d9c2009-06-21 16:17:15 +02001853 if (trx_nr > bts->num_trx) {
1854 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
1855 bts->num_trx, VTY_NEWLINE);
Harald Welte5258fc42009-03-28 19:07:53 +00001856 return CMD_WARNING;
Harald Weltee441d9c2009-06-21 16:17:15 +02001857 } else if (trx_nr == bts->num_trx) {
1858 /* we need to allocate a new one */
1859 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02001860 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02001861 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02001862
Harald Weltee441d9c2009-06-21 16:17:15 +02001863 if (!trx)
1864 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00001865
1866 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02001867 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00001868 vty->node = TRX_NODE;
1869
1870 return CMD_SUCCESS;
1871}
1872
1873DEFUN(cfg_trx_arfcn,
1874 cfg_trx_arfcn_cmd,
Harald Welte93e90202010-05-14 19:00:52 +02001875 "arfcn <0-1024>",
Harald Welte5258fc42009-03-28 19:07:53 +00001876 "Set the ARFCN for this TRX\n")
1877{
1878 int arfcn = atoi(argv[0]);
1879 struct gsm_bts_trx *trx = vty->index;
1880
1881 /* FIXME: check if this ARFCN is supported by this TRX */
1882
1883 trx->arfcn = arfcn;
1884
1885 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
1886 /* FIXME: use OML layer to update the ARFCN */
1887 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
1888
1889 return CMD_SUCCESS;
1890}
1891
Harald Welte (local)7b37d972009-12-27 20:56:38 +01001892DEFUN(cfg_trx_nominal_power,
1893 cfg_trx_nominal_power_cmd,
1894 "nominal power <0-100>",
1895 "Nominal TRX RF Power in dB\n")
1896{
1897 struct gsm_bts_trx *trx = vty->index;
1898
1899 trx->nominal_power = atoi(argv[0]);
1900
1901 return CMD_SUCCESS;
1902}
1903
Harald Weltefcd24452009-06-20 18:15:19 +02001904DEFUN(cfg_trx_max_power_red,
1905 cfg_trx_max_power_red_cmd,
1906 "max_power_red <0-100>",
1907 "Reduction of maximum BS RF Power in dB\n")
1908{
1909 int maxpwr_r = atoi(argv[0]);
1910 struct gsm_bts_trx *trx = vty->index;
Harald Welte61a83b22009-11-18 09:20:22 +01001911 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-06-20 18:15:19 +02001912
1913 /* FIXME: check if our BTS type supports more than 12 */
1914 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
1915 vty_out(vty, "%% Power %d dB is not in the valid range%s",
1916 maxpwr_r, VTY_NEWLINE);
1917 return CMD_WARNING;
1918 }
1919 if (maxpwr_r & 1) {
1920 vty_out(vty, "%% Power %d dB is not an even value%s",
1921 maxpwr_r, VTY_NEWLINE);
1922 return CMD_WARNING;
1923 }
1924
1925 trx->max_power_red = maxpwr_r;
1926
1927 /* FIXME: make sure we update this using OML */
1928
1929 return CMD_SUCCESS;
1930}
1931
Harald Welte42581822009-08-08 16:12:58 +02001932DEFUN(cfg_trx_rsl_e1,
1933 cfg_trx_rsl_e1_cmd,
1934 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
1935 "E1 interface to be used for RSL\n")
1936{
1937 struct gsm_bts_trx *trx = vty->index;
1938
1939 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
1940
1941 return CMD_SUCCESS;
1942}
1943
1944DEFUN(cfg_trx_rsl_e1_tei,
1945 cfg_trx_rsl_e1_tei_cmd,
1946 "rsl e1 tei <0-63>",
1947 "Set the TEI to be used for RSL")
1948{
1949 struct gsm_bts_trx *trx = vty->index;
1950
1951 trx->rsl_tei = atoi(argv[0]);
1952
1953 return CMD_SUCCESS;
1954}
1955
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01001956DEFUN(cfg_trx_rf_locked,
1957 cfg_trx_rf_locked_cmd,
1958 "rf_locked (0|1)",
1959 "Turn off RF of the TRX.\n")
1960{
1961 int locked = atoi(argv[0]);
1962 struct gsm_bts_trx *trx = vty->index;
1963
1964 gsm_trx_lock_rf(trx, locked);
1965 return CMD_SUCCESS;
1966}
Harald Welte42581822009-08-08 16:12:58 +02001967
Harald Welte5258fc42009-03-28 19:07:53 +00001968/* per TS configuration */
1969DEFUN(cfg_ts,
1970 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02001971 "timeslot <0-7>",
Harald Welte5258fc42009-03-28 19:07:53 +00001972 "Select a Timeslot to configure")
1973{
1974 int ts_nr = atoi(argv[0]);
1975 struct gsm_bts_trx *trx = vty->index;
1976 struct gsm_bts_trx_ts *ts;
1977
1978 if (ts_nr >= TRX_NR_TS) {
1979 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
1980 TRX_NR_TS, VTY_NEWLINE);
1981 return CMD_WARNING;
1982 }
1983
1984 ts = &trx->ts[ts_nr];
1985
1986 vty->index = ts;
1987 vty->node = TS_NODE;
1988
1989 return CMD_SUCCESS;
1990}
1991
Harald Weltea6fd58e2009-08-07 00:25:23 +02001992DEFUN(cfg_ts_pchan,
1993 cfg_ts_pchan_cmd,
1994 "phys_chan_config PCHAN",
1995 "Physical Channel configuration (TCH/SDCCH/...)")
1996{
1997 struct gsm_bts_trx_ts *ts = vty->index;
1998 int pchanc;
1999
2000 pchanc = gsm_pchan_parse(argv[0]);
2001 if (pchanc < 0)
2002 return CMD_WARNING;
2003
2004 ts->pchan = pchanc;
2005
2006 return CMD_SUCCESS;
2007}
2008
Harald Weltea39b0f22010-06-14 22:26:10 +02002009#define HOPPING_STR "Configure frequency hopping\n"
2010
2011DEFUN(cfg_ts_hopping,
2012 cfg_ts_hopping_cmd,
2013 "hopping enabled (0|1)",
2014 HOPPING_STR "Enable or disable frequency hopping\n"
2015 "Disable frequency hopping\n" "Enable frequency hopping\n")
2016{
2017 struct gsm_bts_trx_ts *ts = vty->index;
Harald Weltec2fb3d02010-06-14 22:47:37 +02002018 int enabled = atoi(argv[0]);
Harald Weltea39b0f22010-06-14 22:26:10 +02002019
Harald Weltec2fb3d02010-06-14 22:47:37 +02002020 if (enabled && !gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_HOPPING)) {
2021 vty_out(vty, "BTS model does not support hopping%s",
2022 VTY_NEWLINE);
2023 return CMD_WARNING;
2024 }
2025
2026 ts->hopping.enabled = enabled;
Harald Weltea39b0f22010-06-14 22:26:10 +02002027
2028 return CMD_SUCCESS;
2029}
2030
Harald Welte6e0cd042009-09-12 13:05:33 +02002031DEFUN(cfg_ts_hsn,
2032 cfg_ts_hsn_cmd,
Harald Weltea39b0f22010-06-14 22:26:10 +02002033 "hopping sequence-number <0-63>",
2034 HOPPING_STR
Harald Welte6e0cd042009-09-12 13:05:33 +02002035 "Which hopping sequence to use for this channel")
2036{
2037 struct gsm_bts_trx_ts *ts = vty->index;
2038
2039 ts->hopping.hsn = atoi(argv[0]);
2040
2041 return CMD_SUCCESS;
2042}
2043
2044DEFUN(cfg_ts_maio,
2045 cfg_ts_maio_cmd,
2046 "hopping maio <0-63>",
Harald Weltea39b0f22010-06-14 22:26:10 +02002047 HOPPING_STR
Harald Welte6e0cd042009-09-12 13:05:33 +02002048 "Which hopping MAIO to use for this channel")
2049{
2050 struct gsm_bts_trx_ts *ts = vty->index;
2051
2052 ts->hopping.maio = atoi(argv[0]);
2053
2054 return CMD_SUCCESS;
2055}
2056
2057DEFUN(cfg_ts_arfcn_add,
2058 cfg_ts_arfcn_add_cmd,
2059 "hopping arfcn add <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02002060 HOPPING_STR "Configure hopping ARFCN list\n"
2061 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02002062{
2063 struct gsm_bts_trx_ts *ts = vty->index;
2064 int arfcn = atoi(argv[0]);
2065
Harald Weltea39b0f22010-06-14 22:26:10 +02002066 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
2067
Harald Welte6e0cd042009-09-12 13:05:33 +02002068 return CMD_SUCCESS;
2069}
2070
2071DEFUN(cfg_ts_arfcn_del,
2072 cfg_ts_arfcn_del_cmd,
2073 "hopping arfcn del <0-1023>",
Harald Weltea39b0f22010-06-14 22:26:10 +02002074 HOPPING_STR "Configure hopping ARFCN list\n"
2075 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte6e0cd042009-09-12 13:05:33 +02002076{
2077 struct gsm_bts_trx_ts *ts = vty->index;
2078 int arfcn = atoi(argv[0]);
2079
Harald Weltea39b0f22010-06-14 22:26:10 +02002080 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
2081
Harald Welte6e0cd042009-09-12 13:05:33 +02002082 return CMD_SUCCESS;
2083}
2084
Harald Weltea6fd58e2009-08-07 00:25:23 +02002085DEFUN(cfg_ts_e1_subslot,
2086 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02002087 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltea6fd58e2009-08-07 00:25:23 +02002088 "E1 sub-slot connected to this on-air timeslot")
2089{
2090 struct gsm_bts_trx_ts *ts = vty->index;
2091
Harald Welte42581822009-08-08 16:12:58 +02002092 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02002093
2094 return CMD_SUCCESS;
2095}
Harald Welte5258fc42009-03-28 19:07:53 +00002096
Harald Welte4f10c252010-05-16 21:47:13 +02002097void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
2098{
2099 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
2100 counter_get(net->stats.chreq.total),
2101 counter_get(net->stats.chreq.no_channel), VTY_NEWLINE);
2102 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
2103 counter_get(net->stats.chan.rf_fail),
2104 counter_get(net->stats.chan.rll_err), VTY_NEWLINE);
2105 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
2106 counter_get(net->stats.paging.attempted),
2107 counter_get(net->stats.paging.completed),
2108 counter_get(net->stats.paging.expired), VTY_NEWLINE);
2109 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
2110 counter_get(net->stats.bts.oml_fail),
2111 counter_get(net->stats.bts.rsl_fail), VTY_NEWLINE);
2112}
2113
Harald Welte5bc61dc2010-05-16 22:02:16 +02002114DEFUN(logging_fltr_imsi,
2115 logging_fltr_imsi_cmd,
2116 "logging filter imsi IMSI",
2117 LOGGING_STR FILTER_STR
2118 "Filter log messages by IMSI\n" "IMSI to be used as filter\n")
2119{
2120 struct telnet_connection *conn;
2121
2122 conn = (struct telnet_connection *) vty->priv;
2123 if (!conn->dbg) {
2124 vty_out(vty, "Logging was not enabled.%s", VTY_NEWLINE);
2125 return CMD_WARNING;
2126 }
2127
2128 log_set_imsi_filter(conn->dbg, argv[0]);
2129 return CMD_SUCCESS;
2130}
2131
Harald Weltedcccb182010-05-16 20:52:23 +02002132extern int bsc_vty_init_extra(void);
Harald Welte1353f962010-05-16 19:20:24 +02002133extern const char *openbsc_copyright;
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02002134
Harald Weltedcccb182010-05-16 20:52:23 +02002135int bsc_vty_init(void)
Harald Welte68628e82009-03-10 12:17:57 +00002136{
Harald Welteb4d5b172010-05-12 16:10:35 +00002137 install_element_ve(&show_net_cmd);
2138 install_element_ve(&show_bts_cmd);
2139 install_element_ve(&show_trx_cmd);
2140 install_element_ve(&show_ts_cmd);
2141 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +08002142 install_element_ve(&show_lchan_summary_cmd);
Harald Welte5bc61dc2010-05-16 22:02:16 +02002143 install_element_ve(&logging_fltr_imsi_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00002144
Harald Welteb4d5b172010-05-12 16:10:35 +00002145 install_element_ve(&show_e1drv_cmd);
2146 install_element_ve(&show_e1line_cmd);
2147 install_element_ve(&show_e1ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002148
Harald Welteb4d5b172010-05-12 16:10:35 +00002149 install_element_ve(&show_paging_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00002150
Harald Welte5bc61dc2010-05-16 22:02:16 +02002151 logging_vty_add_cmds();
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01002152
Harald Welte5013b2a2009-08-07 13:29:14 +02002153 install_element(CONFIG_NODE, &cfg_net_cmd);
2154 install_node(&net_node, config_write_net);
2155 install_default(GSMNET_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +02002156 install_element(GSMNET_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +02002157 install_element(GSMNET_NODE, &ournode_end_cmd);
Harald Welte42581822009-08-08 16:12:58 +02002158 install_element(GSMNET_NODE, &cfg_net_ncc_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02002159 install_element(GSMNET_NODE, &cfg_net_mnc_cmd);
2160 install_element(GSMNET_NODE, &cfg_net_name_short_cmd);
2161 install_element(GSMNET_NODE, &cfg_net_name_long_cmd);
Harald Welte (local)69de3972009-08-12 14:42:23 +02002162 install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd);
Harald Welte1085c092009-11-18 20:33:19 +01002163 install_element(GSMNET_NODE, &cfg_net_reject_cause_cmd);
Harald Welte4381cfe2009-08-30 15:47:06 +09002164 install_element(GSMNET_NODE, &cfg_net_encryption_cmd);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01002165 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Welteeab84a12009-12-13 10:53:12 +01002166 install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd);
Harald Welte3d23db42009-12-14 17:49:15 +01002167 install_element(GSMNET_NODE, &cfg_net_mm_info_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01002168 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-12-21 16:51:50 +01002169 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
2170 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
2171 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
2172 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
2173 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
2174 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01002175 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01002176 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
2177 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
2178 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
2179 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
2180 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
2181 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
2182 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
2183 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
2184 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
2185 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02002186
2187 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02002188 install_node(&bts_node, config_write_bts);
Harald Welte68628e82009-03-10 12:17:57 +00002189 install_default(BTS_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +02002190 install_element(BTS_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +02002191 install_element(BTS_NODE, &ournode_end_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00002192 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02002193 install_element(BTS_NODE, &cfg_description_cmd);
2194 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02002195 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02002196 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00002197 install_element(BTS_NODE, &cfg_bts_lac_cmd);
2198 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02002199 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00002200 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02002201 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-08-08 16:12:58 +02002202 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
2203 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte7a8fa412009-08-10 13:48:16 +02002204 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-12-22 13:43:26 +01002205 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
2206 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +08002207 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
2208 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02002209 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002210 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002211 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02002212 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Harald Welte73225282009-12-12 18:17:25 +01002213 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
2214 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Harald Welte4511d892010-04-18 15:51:20 +02002215 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02002216 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08002217 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
2218 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02002219 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08002220 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08002221 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-03-14 23:30:30 +08002222 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
2223 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
2224 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002225
Harald Welte5258fc42009-03-28 19:07:53 +00002226 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002227 install_node(&trx_node, dummy_config_write);
Harald Welte68628e82009-03-10 12:17:57 +00002228 install_default(TRX_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +02002229 install_element(TRX_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +02002230 install_element(TRX_NODE, &ournode_end_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00002231 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02002232 install_element(TRX_NODE, &cfg_description_cmd);
2233 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)7b37d972009-12-27 20:56:38 +01002234 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02002235 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-08-08 16:12:58 +02002236 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
2237 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +01002238 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002239
Harald Welte5258fc42009-03-28 19:07:53 +00002240 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002241 install_node(&ts_node, dummy_config_write);
Harald Welte68628e82009-03-10 12:17:57 +00002242 install_default(TS_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +02002243 install_element(TS_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +02002244 install_element(TS_NODE, &ournode_end_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02002245 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Weltea39b0f22010-06-14 22:26:10 +02002246 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte6e0cd042009-09-12 13:05:33 +02002247 install_element(TS_NODE, &cfg_ts_hsn_cmd);
2248 install_element(TS_NODE, &cfg_ts_maio_cmd);
2249 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
2250 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02002251 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002252
Harald Welte81c9b9c2010-05-31 16:40:40 +02002253 abis_nm_vty_init();
2254
Harald Weltedcccb182010-05-16 20:52:23 +02002255 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00002256
Harald Welte68628e82009-03-10 12:17:57 +00002257 return 0;
2258}