blob: e5e424cec9ad91bce3b53190b4d9795a3317848d [file] [log] [blame]
Harald Welte59b04682009-06-10 05:40:52 +08001/* OpenBSC interface to quagga VTY */
Harald Welte410575a2010-03-14 23:30:30 +08002/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
Harald Welte59b04682009-06-10 05:40:52 +08003 * All Rights Reserved
4 *
5 * This program is free software; you can redistribute it and/or modify
Harald Welte0e3e88e2011-01-01 15:25:50 +01006 * it under the terms of the GNU Affero General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
Harald Welte59b04682009-06-10 05:40:52 +08008 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Harald Welte0e3e88e2011-01-01 15:25:50 +010013 * GNU Affero General Public License for more details.
Harald Welte59b04682009-06-10 05:40:52 +080014 *
Harald Welte0e3e88e2011-01-01 15:25:50 +010015 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Harald Welte59b04682009-06-10 05:40:52 +080017 *
18 */
19
20#include <stdlib.h>
21#include <unistd.h>
22#include <sys/types.h>
23
Harald Weltebd9591f2010-05-19 19:45:32 +020024#include <osmocom/vty/command.h>
25#include <osmocom/vty/buffer.h>
26#include <osmocom/vty/vty.h>
27#include <osmocom/vty/logging.h>
28#include <osmocom/vty/telnet_interface.h>
Harald Welte59b04682009-06-10 05:40:52 +080029
30#include <arpa/inet.h>
31
Harald Weltef4625b12010-02-20 16:24:02 +010032#include <osmocore/linuxlist.h>
Harald Welte59b04682009-06-10 05:40:52 +080033#include <openbsc/gsm_data.h>
Harald Welte59b04682009-06-10 05:40:52 +080034#include <openbsc/e1_input.h>
35#include <openbsc/abis_nm.h>
Harald Welte30f93fb2011-02-19 16:48:17 +010036#include <openbsc/abis_om2000.h>
Harald Welted8acf142010-07-30 11:50:09 +020037#include <osmocore/utils.h>
Harald Weltef4625b12010-02-20 16:24:02 +010038#include <osmocore/gsm_utils.h>
Harald Weltefe96f382009-12-22 13:09:29 +010039#include <openbsc/chan_alloc.h>
Harald Welte44007742009-12-22 21:43:14 +010040#include <openbsc/meas_rep.h>
Harald Welte59b04682009-06-10 05:40:52 +080041#include <openbsc/db.h>
Harald Weltef4625b12010-02-20 16:24:02 +010042#include <osmocore/talloc.h>
Holger Hans Peter Freytherb70d45b2010-04-06 11:55:37 +020043#include <openbsc/vty.h>
Harald Weltef45981f2010-05-12 20:28:04 +020044#include <openbsc/gprs_ns.h>
Harald Welted8acf142010-07-30 11:50:09 +020045#include <openbsc/system_information.h>
Harald Welte682ee5f2010-05-16 22:02:16 +020046#include <openbsc/debug.h>
Holger Hans Peter Freyther25176f12010-11-09 17:00:42 +010047#include <openbsc/paging.h>
Holger Hans Peter Freyther03f17d02010-11-15 20:29:46 +010048#include <openbsc/ipaccess.h>
Harald Welte5213e992010-12-23 13:18:07 +010049#include <openbsc/abis_rsl.h>
Harald Welte59b04682009-06-10 05:40:52 +080050
Harald Welte10c29f62010-05-16 19:20:24 +020051#include "../bscconfig.h"
52
Harald Welted6b62e32010-05-12 17:19:53 +000053/* FIXME: this should go to some common file */
54static const struct value_string gprs_ns_timer_strs[] = {
Harald Weltea9251762010-05-11 23:50:21 +020055 { 0, "tns-block" },
56 { 1, "tns-block-retries" },
57 { 2, "tns-reset" },
58 { 3, "tns-reset-retries" },
59 { 4, "tns-test" },
60 { 5, "tns-alive" },
61 { 6, "tns-alive-retries" },
62 { 0, NULL }
63};
64
Harald Welted6b62e32010-05-12 17:19:53 +000065static const struct value_string gprs_bssgp_cfg_strs[] = {
Harald Weltea9251762010-05-11 23:50:21 +020066 { 0, "blocking-timer" },
67 { 1, "blocking-retries" },
68 { 2, "unblocking-retries" },
69 { 3, "reset-timer" },
70 { 4, "reset-retries" },
71 { 5, "suspend-timer" },
72 { 6, "suspend-retries" },
73 { 7, "resume-timer" },
74 { 8, "resume-retries" },
75 { 9, "capability-update-timer" },
76 { 10, "capability-update-retries" },
77 { 0, NULL }
78};
79
Harald Weltef989b782011-02-15 11:43:27 +010080static const struct value_string bts_neigh_mode_strs[] = {
81 { NL_MODE_AUTOMATIC, "automatic" },
82 { NL_MODE_MANUAL, "manual" },
83 { NL_MODE_MANUAL_SI5SEP, "manual-si5" },
84 { 0, NULL }
85};
86
Harald Weltee87eb462009-08-07 13:29:14 +020087struct cmd_node net_node = {
88 GSMNET_NODE,
89 "%s(network)#",
90 1,
91};
92
Harald Welte59b04682009-06-10 05:40:52 +080093struct cmd_node bts_node = {
94 BTS_NODE,
95 "%s(bts)#",
96 1,
97};
98
99struct cmd_node trx_node = {
100 TRX_NODE,
101 "%s(trx)#",
102 1,
103};
104
105struct cmd_node ts_node = {
106 TS_NODE,
107 "%s(ts)#",
108 1,
109};
110
Harald Welte61daf6d2010-05-27 13:39:40 +0200111extern struct gsm_network *bsc_gsmnet;
112
Harald Welte40152872010-05-16 20:52:23 +0200113struct gsm_network *gsmnet_from_vty(struct vty *v)
114{
Harald Welte61daf6d2010-05-27 13:39:40 +0200115 /* In case we read from the config file, the vty->priv cannot
116 * point to a struct telnet_connection, and thus conn->priv
117 * will not point to the gsm_network structure */
118#if 0
Harald Welte40152872010-05-16 20:52:23 +0200119 struct telnet_connection *conn = v->priv;
120 return (struct gsm_network *) conn->priv;
Harald Welte61daf6d2010-05-27 13:39:40 +0200121#else
122 return bsc_gsmnet;
123#endif
Harald Welte40152872010-05-16 20:52:23 +0200124}
125
Harald Welte59b04682009-06-10 05:40:52 +0800126static int dummy_config_write(struct vty *v)
127{
128 return CMD_SUCCESS;
129}
130
131static void net_dump_nmstate(struct vty *vty, struct gsm_nm_state *nms)
132{
133 vty_out(vty,"Oper '%s', Admin %u, Avail '%s'%s",
134 nm_opstate_name(nms->operational), nms->administrative,
135 nm_avail_name(nms->availability), VTY_NEWLINE);
136}
137
Harald Weltefe96f382009-12-22 13:09:29 +0100138static void dump_pchan_load_vty(struct vty *vty, char *prefix,
139 const struct pchan_load *pl)
140{
141 int i;
142
143 for (i = 0; i < ARRAY_SIZE(pl->pchan); i++) {
144 const struct load_counter *lc = &pl->pchan[i];
145 unsigned int percent;
146
147 if (lc->total == 0)
148 continue;
149
150 percent = (lc->used * 100) / lc->total;
151
152 vty_out(vty, "%s%20s: %3u%% (%u/%u)%s", prefix,
153 gsm_pchan_name(i), percent, lc->used, lc->total,
154 VTY_NEWLINE);
155 }
156}
157
Harald Welte59b04682009-06-10 05:40:52 +0800158static void net_dump_vty(struct vty *vty, struct gsm_network *net)
159{
Harald Weltefe96f382009-12-22 13:09:29 +0100160 struct pchan_load pl;
161
Harald Welte59b04682009-06-10 05:40:52 +0800162 vty_out(vty, "BSC is on Country Code %u, Network Code %u "
163 "and has %u BTS%s", net->country_code, net->network_code,
164 net->num_bts, VTY_NEWLINE);
165 vty_out(vty, " Long network name: '%s'%s",
166 net->name_long, VTY_NEWLINE);
167 vty_out(vty, " Short network name: '%s'%s",
168 net->name_short, VTY_NEWLINE);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +0200169 vty_out(vty, " Authentication policy: %s%s",
170 gsm_auth_policy_name(net->auth_policy), VTY_NEWLINE);
Harald Welte59936d72009-11-18 20:33:19 +0100171 vty_out(vty, " Location updating reject cause: %u%s",
172 net->reject_cause, VTY_NEWLINE);
Harald Weltecca253a2009-08-30 15:47:06 +0900173 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
174 VTY_NEWLINE);
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +0100175 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
176 VTY_NEWLINE);
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +0800177 vty_out(vty, " Use TCH for Paging any: %d%s", net->pag_any_tch,
178 VTY_NEWLINE);
Harald Welte52af1952009-12-13 10:53:12 +0100179 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
180 VTY_NEWLINE);
Harald Weltea310f3e2009-12-14 09:00:24 +0100181 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
182 VTY_NEWLINE);
Harald Welte0af9c9f2009-12-19 21:41:52 +0100183 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
184 VTY_NEWLINE);
Harald Weltefe96f382009-12-22 13:09:29 +0100185 network_chan_load(&pl, net);
186 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
187 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte59b04682009-06-10 05:40:52 +0800188}
189
190DEFUN(show_net, show_net_cmd, "show network",
191 SHOW_STR "Display information about a GSM NETWORK\n")
192{
Harald Welte40152872010-05-16 20:52:23 +0200193 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800194 net_dump_vty(vty, net);
195
196 return CMD_SUCCESS;
197}
198
199static void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l)
200{
201 struct e1inp_line *line;
202
203 if (!e1l) {
204 vty_out(vty, " None%s", VTY_NEWLINE);
205 return;
206 }
207
208 line = e1l->ts->line;
209
210 vty_out(vty, " E1 Line %u, Type %s: Timeslot %u, Mode %s%s",
211 line->num, line->driver->name, e1l->ts->num,
212 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
213 vty_out(vty, " E1 TEI %u, SAPI %u%s",
214 e1l->tei, e1l->sapi, VTY_NEWLINE);
215}
216
217static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
218{
Harald Weltefe96f382009-12-22 13:09:29 +0100219 struct pchan_load pl;
220
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +0200221 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Welte91afe4c2009-06-20 18:15:19 +0200222 "BSIC %u, TSC %u and %u TRX%s",
223 bts->nr, btstype2str(bts->type), gsm_band_name(bts->band),
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +0200224 bts->cell_identity,
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +0200225 bts->location_area_code, bts->bsic, bts->tsc,
Harald Welte91afe4c2009-06-20 18:15:19 +0200226 bts->num_trx, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200227 vty_out(vty, "Description: %s%s",
228 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Harald Welte8e9d1792009-12-12 15:38:16 +0100229 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +0100230 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte8e9d1792009-12-12 15:38:16 +0100231 rxlev2dbm(bts->si_common.cell_sel_par.rxlev_acc_min),
232 VTY_NEWLINE);
233 vty_out(vty, "Cell Reselection Hysteresis: %u dBm%s",
Harald Welteb761bf82009-12-12 18:17:25 +0100234 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +0100235 vty_out(vty, "RACH TX-Integer: %u%s", bts->si_common.rach_control.tx_integer,
236 VTY_NEWLINE);
237 vty_out(vty, "RACH Max transmissions: %u%s",
238 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
239 VTY_NEWLINE);
Harald Welte8c973ba2009-12-21 23:08:18 +0100240 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)e19be3f2009-08-12 13:28:23 +0200241 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Harald Welted8acf142010-07-30 11:50:09 +0200242 vty_out(vty, "System Information present: 0x%08x, static: 0x%08x%s",
243 bts->si_valid, bts->si_mode_static, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800244 if (is_ipaccess_bts(bts))
Harald Welte25572872009-10-20 00:22:00 +0200245 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte59b04682009-06-10 05:40:52 +0800246 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte25572872009-10-20 00:22:00 +0200247 bts->oml_tei, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800248 vty_out(vty, " NM State: ");
249 net_dump_nmstate(vty, &bts->nm_state);
250 vty_out(vty, " Site Mgr NM State: ");
251 net_dump_nmstate(vty, &bts->site_mgr.nm_state);
252 vty_out(vty, " Paging: FIXME pending requests, %u free slots%s",
253 bts->paging.available_slots, VTY_NEWLINE);
Holger Hans Peter Freytherb5c79c92010-11-25 16:28:45 +0100254 if (is_ipaccess_bts(bts)) {
255 vty_out(vty, " OML Link state: %s.%s",
256 bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);
257 } else {
Harald Welte25572872009-10-20 00:22:00 +0200258 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
259 e1isl_dump_vty(vty, bts->oml_link);
260 }
Holger Hans Peter Freytherb5c79c92010-11-25 16:28:45 +0100261
262 /* FIXME: chan_desc */
Harald Weltefe96f382009-12-22 13:09:29 +0100263 memset(&pl, 0, sizeof(pl));
264 bts_chan_load(&pl, bts);
265 vty_out(vty, " Current Channel Load:%s", VTY_NEWLINE);
266 dump_pchan_load_vty(vty, " ", &pl);
Harald Welte59b04682009-06-10 05:40:52 +0800267}
268
269DEFUN(show_bts, show_bts_cmd, "show bts [number]",
270 SHOW_STR "Display information about a BTS\n"
271 "BTS number")
272{
Harald Welte40152872010-05-16 20:52:23 +0200273 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800274 int bts_nr;
275
276 if (argc != 0) {
277 /* use the BTS number that the user has specified */
278 bts_nr = atoi(argv[0]);
Harald Welteda5db862010-12-24 12:24:03 +0100279 if (bts_nr >= net->num_bts) {
Harald Welte59b04682009-06-10 05:40:52 +0800280 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
281 VTY_NEWLINE);
282 return CMD_WARNING;
283 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200284 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte59b04682009-06-10 05:40:52 +0800285 return CMD_SUCCESS;
286 }
287 /* print all BTS's */
288 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee712a5f2009-06-21 16:17:15 +0200289 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte59b04682009-06-10 05:40:52 +0800290
291 return CMD_SUCCESS;
292}
293
Harald Welte62868882009-08-08 16:12:58 +0200294/* utility functions */
295static void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,
296 const char *ts, const char *ss)
297{
298 e1_link->e1_nr = atoi(line);
299 e1_link->e1_ts = atoi(ts);
300 if (!strcmp(ss, "full"))
301 e1_link->e1_ts_ss = 255;
302 else
303 e1_link->e1_ts_ss = atoi(ss);
304}
305
306static void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,
307 const char *prefix)
308{
309 if (!e1_link->e1_ts)
310 return;
311
312 if (e1_link->e1_ts_ss == 255)
313 vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",
314 prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);
315 else
316 vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",
317 prefix, e1_link->e1_nr, e1_link->e1_ts,
318 e1_link->e1_ts_ss, VTY_NEWLINE);
319}
320
321
Harald Welte97ceef92009-08-06 19:06:46 +0200322static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
323{
Harald Welte62868882009-08-08 16:12:58 +0200324 vty_out(vty, " timeslot %u%s", ts->nr, VTY_NEWLINE);
325 if (ts->pchan != GSM_PCHAN_NONE)
326 vty_out(vty, " phys_chan_config %s%s",
327 gsm_pchan_name(ts->pchan), VTY_NEWLINE);
Harald Weltea42a93f2010-06-14 22:26:10 +0200328 vty_out(vty, " hopping enabled %u%s",
329 ts->hopping.enabled, VTY_NEWLINE);
330 if (ts->hopping.enabled) {
331 unsigned int i;
332 vty_out(vty, " hopping sequence-number %u%s",
Harald Welte67104d12009-09-12 13:05:33 +0200333 ts->hopping.hsn, VTY_NEWLINE);
Harald Weltea42a93f2010-06-14 22:26:10 +0200334 vty_out(vty, " hopping maio %u%s",
Harald Welte67104d12009-09-12 13:05:33 +0200335 ts->hopping.maio, VTY_NEWLINE);
Harald Weltea42a93f2010-06-14 22:26:10 +0200336 for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {
337 if (!bitvec_get_bit_pos(&ts->hopping.arfcns, i))
338 continue;
339 vty_out(vty, " hopping arfcn add %u%s",
340 i, VTY_NEWLINE);
341 }
Harald Welteff598092010-12-24 12:07:07 +0100342 }
Harald Welte62868882009-08-08 16:12:58 +0200343 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Weltec02789e2011-02-14 16:15:21 +0100344
345 if (ts->trx->bts->model->config_write_ts)
346 ts->trx->bts->model->config_write_ts(vty, ts);
Harald Welte97ceef92009-08-06 19:06:46 +0200347}
348
349static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
350{
351 int i;
352
Harald Weltee87eb462009-08-07 13:29:14 +0200353 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200354 if (trx->description)
355 vty_out(vty, " description %s%s", trx->description,
356 VTY_NEWLINE);
Holger Hans Peter Freyther32be2aa2010-04-17 06:42:07 +0200357 vty_out(vty, " rf_locked %u%s",
358 trx->nm_state.administrative == NM_STATE_LOCKED ? 1 : 0,
359 VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200360 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)b709bfe2009-12-27 20:56:38 +0100361 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200362 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200363 config_write_e1_link(vty, &trx->rsl_e1_link, " rsl ");
364 vty_out(vty, " rsl e1 tei %u%s", trx->rsl_tei, VTY_NEWLINE);
Harald Welte97ceef92009-08-06 19:06:46 +0200365
Harald Weltec02789e2011-02-14 16:15:21 +0100366 if (trx->bts->model->config_write_trx)
367 trx->bts->model->config_write_trx(vty, trx);
368
Harald Welte97ceef92009-08-06 19:06:46 +0200369 for (i = 0; i < TRX_NR_TS; i++)
370 config_write_ts_single(vty, &trx->ts[i]);
371}
372
Harald Weltea9251762010-05-11 23:50:21 +0200373static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
374{
375 unsigned int i;
376 vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
377 VTY_NEWLINE);
378 if (bts->gprs.mode == BTS_GPRS_NONE)
379 return;
380
381 vty_out(vty, " gprs routing area %u%s", bts->gprs.rac,
382 VTY_NEWLINE);
383 vty_out(vty, " gprs cell bvci %u%s", bts->gprs.cell.bvci,
384 VTY_NEWLINE);
385 for (i = 0; i < ARRAY_SIZE(bts->gprs.cell.timer); i++)
386 vty_out(vty, " gprs cell timer %s %u%s",
387 get_value_string(gprs_bssgp_cfg_strs, i),
388 bts->gprs.cell.timer[i], VTY_NEWLINE);
389 vty_out(vty, " gprs nsei %u%s", bts->gprs.nse.nsei,
390 VTY_NEWLINE);
391 for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)
392 vty_out(vty, " gprs ns timer %s %u%s",
393 get_value_string(gprs_ns_timer_strs, i),
394 bts->gprs.nse.timer[i], VTY_NEWLINE);
395 for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
396 struct gsm_bts_gprs_nsvc *nsvc =
397 &bts->gprs.nsvc[i];
398 struct in_addr ia;
399
400 ia.s_addr = htonl(nsvc->remote_ip);
401 vty_out(vty, " gprs nsvc %u nsvci %u%s", i,
402 nsvc->nsvci, VTY_NEWLINE);
403 vty_out(vty, " gprs nsvc %u local udp port %u%s", i,
404 nsvc->local_port, VTY_NEWLINE);
405 vty_out(vty, " gprs nsvc %u remote udp port %u%s", i,
406 nsvc->remote_port, VTY_NEWLINE);
407 vty_out(vty, " gprs nsvc %u remote ip %s%s", i,
408 inet_ntoa(ia), VTY_NEWLINE);
409 }
410}
411
Harald Welte97ceef92009-08-06 19:06:46 +0200412static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
413{
414 struct gsm_bts_trx *trx;
Harald Welted8acf142010-07-30 11:50:09 +0200415 int i;
Harald Welte97ceef92009-08-06 19:06:46 +0200416
Harald Weltee87eb462009-08-07 13:29:14 +0200417 vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE);
418 vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200419 if (bts->description)
420 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200421 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freyther6d82b7c2009-11-19 16:38:49 +0100422 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200423 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte97ceef92009-08-06 19:06:46 +0200424 VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200425 vty_out(vty, " training_sequence_code %u%s", bts->tsc, VTY_NEWLINE);
426 vty_out(vty, " base_station_id_code %u%s", bts->bsic, VTY_NEWLINE);
Harald Welte (local)cbd46102009-08-13 10:14:26 +0200427 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +0100428 vty_out(vty, " cell reselection hysteresis %u%s",
429 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
430 vty_out(vty, " rxlev access min %u%s",
431 bts->si_common.cell_sel_par.rxlev_acc_min, VTY_NEWLINE);
Sylvain Munaut00d71462010-11-28 18:17:28 +0100432
433 if (bts->si_common.cell_ro_sel_par.present) {
434 struct gsm48_si_selection_params *sp;
435 sp = &bts->si_common.cell_ro_sel_par;
436
437 if (sp->cbq)
438 vty_out(vty, " cell bar qualify %u%s",
439 sp->cbq, VTY_NEWLINE);
440
441 if (sp->cell_resel_off)
442 vty_out(vty, " cell reselection offset %u%s",
443 sp->cell_resel_off*2, VTY_NEWLINE);
444
445 if (sp->temp_offs == 7)
446 vty_out(vty, " temporary offset infinite%s",
447 VTY_NEWLINE);
448 else if (sp->temp_offs)
449 vty_out(vty, " temporary offset %u%s",
450 sp->temp_offs*10, VTY_NEWLINE);
451
452 if (sp->penalty_time == 31)
453 vty_out(vty, " penalty time reserved%s",
454 VTY_NEWLINE);
455 else if (sp->penalty_time)
456 vty_out(vty, " penalty time %u%s",
457 (sp->penalty_time*20)+20, VTY_NEWLINE);
458 }
459
Harald Weltea54a2bb2009-12-01 18:04:30 +0530460 if (bts->si_common.chan_desc.t3212)
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +0200461 vty_out(vty, " periodic location update %u%s",
Dieter Spaarb0f746d2010-10-05 21:10:55 +0200462 bts->si_common.chan_desc.t3212 * 6, VTY_NEWLINE);
Harald Welte3e774612009-08-10 13:48:16 +0200463 vty_out(vty, " channel allocator %s%s",
464 bts->chan_alloc_reverse ? "descending" : "ascending",
465 VTY_NEWLINE);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +0100466 vty_out(vty, " rach tx integer %u%s",
467 bts->si_common.rach_control.tx_integer, VTY_NEWLINE);
468 vty_out(vty, " rach max transmission %u%s",
469 rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
470 VTY_NEWLINE);
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +0800471
472 if (bts->rach_b_thresh != -1)
473 vty_out(vty, " rach nm busy threshold %u%s",
474 bts->rach_b_thresh, VTY_NEWLINE);
475 if (bts->rach_ldavg_slots != -1)
476 vty_out(vty, " rach nm load average %u%s",
477 bts->rach_ldavg_slots, VTY_NEWLINE);
Harald Welte8c973ba2009-12-21 23:08:18 +0100478 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)e19be3f2009-08-12 13:28:23 +0200479 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +0800480 if ((bts->si_common.rach_control.t2 & 0x4) == 0)
481 vty_out(vty, " rach emergency call allowed 1%s", VTY_NEWLINE);
Harald Welted8acf142010-07-30 11:50:09 +0200482 for (i = SYSINFO_TYPE_1; i < _MAX_SYSINFO_TYPE; i++) {
483 if (bts->si_mode_static & (1 << i)) {
484 vty_out(vty, " system-information %s mode static%s",
485 get_value_string(osmo_sitype_strs, i), VTY_NEWLINE);
486 vty_out(vty, " system-information %s static %s%s",
487 get_value_string(osmo_sitype_strs, i),
488 hexdump_nospc(bts->si_buf[i], sizeof(bts->si_buf[i])),
489 VTY_NEWLINE);
490 }
491 }
Harald Welte25572872009-10-20 00:22:00 +0200492 if (is_ipaccess_bts(bts)) {
Harald Weltee87eb462009-08-07 13:29:14 +0200493 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Welte3ffe1b32009-08-07 00:25:23 +0200494 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte25572872009-10-20 00:22:00 +0200495 vty_out(vty, " oml ip.access stream_id %u%s", bts->oml_tei, VTY_NEWLINE);
496 } else {
Harald Welte62868882009-08-08 16:12:58 +0200497 config_write_e1_link(vty, &bts->oml_e1_link, " oml ");
498 vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE);
499 }
Holger Hans Peter Freyther3112f672010-09-06 10:11:25 +0800500
501 /* if we have a limit, write it */
502 if (bts->paging.free_chans_need >= 0)
503 vty_out(vty, " paging free %d%s", bts->paging.free_chans_need, VTY_NEWLINE);
504
Harald Welteca46eff2011-01-11 23:44:56 +0100505 vty_out(vty, " neighbor-list mode %s%s",
Harald Weltef989b782011-02-15 11:43:27 +0100506 get_value_string(bts_neigh_mode_strs, bts->neigh_list_manual_mode), VTY_NEWLINE);
507 if (bts->neigh_list_manual_mode != NL_MODE_AUTOMATIC) {
Harald Welteca46eff2011-01-11 23:44:56 +0100508 for (i = 0; i < 1024; i++) {
509 if (bitvec_get_bit_pos(&bts->si_common.neigh_list, i))
510 vty_out(vty, " neighbor-list add arfcn %u%s",
511 i, VTY_NEWLINE);
512 }
513 }
Harald Weltef989b782011-02-15 11:43:27 +0100514 if (bts->neigh_list_manual_mode == NL_MODE_MANUAL_SI5SEP) {
515 for (i = 0; i < 1024; i++) {
516 if (bitvec_get_bit_pos(&bts->si_common.si5_neigh_list, i))
517 vty_out(vty, " si5 neighbor-list add arfcn %u%s",
518 i, VTY_NEWLINE);
519 }
520 }
Harald Welteca46eff2011-01-11 23:44:56 +0100521
Harald Weltea9251762010-05-11 23:50:21 +0200522 config_write_bts_gprs(vty, bts);
Harald Welte97ceef92009-08-06 19:06:46 +0200523
Harald Weltec02789e2011-02-14 16:15:21 +0100524 if (bts->model->config_write_bts)
525 bts->model->config_write_bts(vty, bts);
526
Harald Welte97ceef92009-08-06 19:06:46 +0200527 llist_for_each_entry(trx, &bts->trx_list, list)
528 config_write_trx_single(vty, trx);
529}
530
531static int config_write_bts(struct vty *v)
532{
Harald Welte40152872010-05-16 20:52:23 +0200533 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte97ceef92009-08-06 19:06:46 +0200534 struct gsm_bts *bts;
535
536 llist_for_each_entry(bts, &gsmnet->bts_list, list)
537 config_write_bts_single(v, bts);
538
539 return CMD_SUCCESS;
540}
541
Harald Weltee87eb462009-08-07 13:29:14 +0200542static int config_write_net(struct vty *vty)
543{
Harald Welte40152872010-05-16 20:52:23 +0200544 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
545
Harald Weltee87eb462009-08-07 13:29:14 +0200546 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200547 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200548 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte62868882009-08-08 16:12:58 +0200549 vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE);
550 vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +0200551 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Harald Welte59936d72009-11-18 20:33:19 +0100552 vty_out(vty, " location updating reject cause %u%s",
553 gsmnet->reject_cause, VTY_NEWLINE);
Harald Weltecca253a2009-08-30 15:47:06 +0900554 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freyther6b4f5462009-11-19 16:37:48 +0100555 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +0800556 vty_out(vty, " paging any use tch %d%s", gsmnet->pag_any_tch, VTY_NEWLINE);
Harald Welte52af1952009-12-13 10:53:12 +0100557 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
558 VTY_NEWLINE);
Harald Weltea310f3e2009-12-14 09:00:24 +0100559 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Welte0af9c9f2009-12-19 21:41:52 +0100560 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Weltea8062f12009-12-21 16:51:50 +0100561 vty_out(vty, " handover window rxlev averaging %u%s",
562 gsmnet->handover.win_rxlev_avg, VTY_NEWLINE);
563 vty_out(vty, " handover window rxqual averaging %u%s",
564 gsmnet->handover.win_rxqual_avg, VTY_NEWLINE);
565 vty_out(vty, " handover window rxlev neighbor averaging %u%s",
566 gsmnet->handover.win_rxlev_avg_neigh, VTY_NEWLINE);
567 vty_out(vty, " handover power budget interval %u%s",
568 gsmnet->handover.pwr_interval, VTY_NEWLINE);
569 vty_out(vty, " handover power budget hysteresis %u%s",
570 gsmnet->handover.pwr_hysteresis, VTY_NEWLINE);
571 vty_out(vty, " handover maximum distance %u%s",
572 gsmnet->handover.max_distance, VTY_NEWLINE);
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +0100573 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +0100574 vty_out(vty, " timer t3103 %u%s", gsmnet->T3103, VTY_NEWLINE);
575 vty_out(vty, " timer t3105 %u%s", gsmnet->T3105, VTY_NEWLINE);
576 vty_out(vty, " timer t3107 %u%s", gsmnet->T3107, VTY_NEWLINE);
577 vty_out(vty, " timer t3109 %u%s", gsmnet->T3109, VTY_NEWLINE);
578 vty_out(vty, " timer t3111 %u%s", gsmnet->T3111, VTY_NEWLINE);
579 vty_out(vty, " timer t3113 %u%s", gsmnet->T3113, VTY_NEWLINE);
580 vty_out(vty, " timer t3115 %u%s", gsmnet->T3115, VTY_NEWLINE);
581 vty_out(vty, " timer t3117 %u%s", gsmnet->T3117, VTY_NEWLINE);
582 vty_out(vty, " timer t3119 %u%s", gsmnet->T3119, VTY_NEWLINE);
Harald Weltea00fdd72010-12-23 14:39:29 +0100583 vty_out(vty, " timer t3122 %u%s", gsmnet->T3122, VTY_NEWLINE);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +0100584 vty_out(vty, " timer t3141 %u%s", gsmnet->T3141, VTY_NEWLINE);
Harald Weltef41bfd52010-12-15 15:34:23 +0100585 vty_out(vty, " dtx-used %u%s", gsmnet->dtx_enabled, VTY_NEWLINE);
Holger Hans Peter Freyther68b21e12010-12-22 16:26:04 +0100586 vty_out(vty, " subscriber-keep-in-ram %d%s",
587 gsmnet->keep_subscr, VTY_NEWLINE);
Harald Weltee87eb462009-08-07 13:29:14 +0200588
589 return CMD_SUCCESS;
590}
Harald Welte97ceef92009-08-06 19:06:46 +0200591
Harald Welte59b04682009-06-10 05:40:52 +0800592static void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx)
593{
594 vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",
595 trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);
Harald Welte8791dac2010-05-14 17:59:53 +0200596 vty_out(vty, "Description: %s%s",
597 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Welte91afe4c2009-06-20 18:15:19 +0200598 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte62868882009-08-08 16:12:58 +0200599 "resulting BS power: %d dBm%s",
Harald Welte91afe4c2009-06-20 18:15:19 +0200600 trx->nominal_power, trx->max_power_red,
Harald Welte62868882009-08-08 16:12:58 +0200601 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800602 vty_out(vty, " NM State: ");
603 net_dump_nmstate(vty, &trx->nm_state);
604 vty_out(vty, " Baseband Transceiver NM State: ");
605 net_dump_nmstate(vty, &trx->bb_transc.nm_state);
Harald Welte25572872009-10-20 00:22:00 +0200606 if (is_ipaccess_bts(trx->bts)) {
607 vty_out(vty, " ip.access stream ID: 0x%02x%s",
608 trx->rsl_tei, VTY_NEWLINE);
609 } else {
610 vty_out(vty, " E1 Signalling Link:%s", VTY_NEWLINE);
611 e1isl_dump_vty(vty, trx->rsl_link);
612 }
Harald Welte59b04682009-06-10 05:40:52 +0800613}
614
615DEFUN(show_trx,
616 show_trx_cmd,
617 "show trx [bts_nr] [trx_nr]",
Harald Welte9e002452010-05-11 21:53:49 +0200618 SHOW_STR "Display information about a TRX\n"
619 "BTS Number\n"
620 "TRX Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800621{
Harald Welte40152872010-05-16 20:52:23 +0200622 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800623 struct gsm_bts *bts = NULL;
624 struct gsm_bts_trx *trx;
625 int bts_nr, trx_nr;
626
627 if (argc >= 1) {
628 /* use the BTS number that the user has specified */
629 bts_nr = atoi(argv[0]);
630 if (bts_nr >= net->num_bts) {
631 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
632 VTY_NEWLINE);
633 return CMD_WARNING;
634 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200635 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800636 }
637 if (argc >= 2) {
638 trx_nr = atoi(argv[1]);
639 if (trx_nr >= bts->num_trx) {
640 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
641 VTY_NEWLINE);
642 return CMD_WARNING;
643 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200644 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800645 trx_dump_vty(vty, trx);
646 return CMD_SUCCESS;
647 }
648 if (bts) {
649 /* print all TRX in this BTS */
650 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200651 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800652 trx_dump_vty(vty, trx);
653 }
654 return CMD_SUCCESS;
655 }
656
657 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200658 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800659 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200660 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800661 trx_dump_vty(vty, trx);
662 }
663 }
664
665 return CMD_SUCCESS;
666}
667
Harald Welte97ceef92009-08-06 19:06:46 +0200668
Harald Welte59b04682009-06-10 05:40:52 +0800669static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
670{
Harald Welte98d2bb82010-12-24 12:14:52 +0100671 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, phys cfg %s",
Harald Weltee3bd0c02010-12-24 12:12:10 +0100672 ts->trx->bts->nr, ts->trx->nr, ts->nr,
Harald Welte98d2bb82010-12-24 12:14:52 +0100673 gsm_pchan_name(ts->pchan));
674 if (ts->pchan == GSM_PCHAN_TCH_F_PDCH)
Harald Welte81c2ed32010-12-24 12:26:13 +0100675 vty_out(vty, " (%s mode)",
Harald Welte98d2bb82010-12-24 12:14:52 +0100676 ts->flags & TS_F_PDCH_MODE ? "PDCH" : "TCH/F");
677 vty_out(vty, "%s", VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800678 vty_out(vty, " NM State: ");
679 net_dump_nmstate(vty, &ts->nm_state);
Harald Welte87504212009-12-02 01:56:49 +0530680 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welte59b04682009-06-10 05:40:52 +0800681 vty_out(vty, " E1 Line %u, Timeslot %u, Subslot %u%s",
682 ts->e1_link.e1_nr, ts->e1_link.e1_ts,
683 ts->e1_link.e1_ts_ss, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800684}
685
686DEFUN(show_ts,
687 show_ts_cmd,
688 "show timeslot [bts_nr] [trx_nr] [ts_nr]",
Harald Welte9e002452010-05-11 21:53:49 +0200689 SHOW_STR "Display information about a TS\n"
690 "BTS Number\n" "TRX Number\n" "Timeslot Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800691{
Harald Welte40152872010-05-16 20:52:23 +0200692 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte06868382010-12-24 12:05:03 +0100693 struct gsm_bts *bts = NULL;
694 struct gsm_bts_trx *trx = NULL;
695 struct gsm_bts_trx_ts *ts = NULL;
Harald Welte59b04682009-06-10 05:40:52 +0800696 int bts_nr, trx_nr, ts_nr;
697
698 if (argc >= 1) {
699 /* use the BTS number that the user has specified */
700 bts_nr = atoi(argv[0]);
701 if (bts_nr >= net->num_bts) {
702 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
703 VTY_NEWLINE);
704 return CMD_WARNING;
705 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200706 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800707 }
708 if (argc >= 2) {
709 trx_nr = atoi(argv[1]);
710 if (trx_nr >= bts->num_trx) {
711 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
712 VTY_NEWLINE);
713 return CMD_WARNING;
714 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200715 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800716 }
717 if (argc >= 3) {
718 ts_nr = atoi(argv[2]);
719 if (ts_nr >= TRX_NR_TS) {
720 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
721 VTY_NEWLINE);
722 return CMD_WARNING;
723 }
Harald Welte06868382010-12-24 12:05:03 +0100724 /* Fully Specified: print and exit */
Harald Welte59b04682009-06-10 05:40:52 +0800725 ts = &trx->ts[ts_nr];
726 ts_dump_vty(vty, ts);
727 return CMD_SUCCESS;
728 }
Harald Welte06868382010-12-24 12:05:03 +0100729
730 if (bts && trx) {
731 /* Iterate over all TS in this TRX */
732 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
733 ts = &trx->ts[ts_nr];
734 ts_dump_vty(vty, ts);
735 }
736 } else if (bts) {
737 /* Iterate over all TRX in this BTS, TS in each TRX */
Harald Welte59b04682009-06-10 05:40:52 +0800738 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200739 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800740 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
741 ts = &trx->ts[ts_nr];
742 ts_dump_vty(vty, ts);
743 }
744 }
Harald Welte06868382010-12-24 12:05:03 +0100745 } else {
746 /* Iterate over all BTS, TRX in each BTS, TS in each TRX */
747 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
748 bts = gsm_bts_num(net, bts_nr);
749 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
750 trx = gsm_bts_trx_num(bts, trx_nr);
751 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
752 ts = &trx->ts[ts_nr];
753 ts_dump_vty(vty, ts);
754 }
755 }
756 }
Harald Welte59b04682009-06-10 05:40:52 +0800757 }
758
759 return CMD_SUCCESS;
760}
761
Holger Hans Peter Freyther1dd0a1b2010-01-06 06:00:40 +0100762static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte59b04682009-06-10 05:40:52 +0800763{
Harald Welte91afe4c2009-06-20 18:15:19 +0200764 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte59b04682009-06-10 05:40:52 +0800765 subscr->authorized, VTY_NEWLINE);
766 if (subscr->name)
767 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
768 if (subscr->extension)
769 vty_out(vty, " Extension: %s%s", subscr->extension,
770 VTY_NEWLINE);
771 if (subscr->imsi)
772 vty_out(vty, " IMSI: %s%s", subscr->imsi, VTY_NEWLINE);
Holger Hans Peter Freythercd8bacf2009-08-19 12:53:57 +0200773 if (subscr->tmsi != GSM_RESERVED_TMSI)
774 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte270c06c2009-08-15 03:24:51 +0200775 VTY_NEWLINE);
Sylvain Munaute5863a22009-12-27 19:29:28 +0100776
Harald Welte (local)02d5efa2009-08-14 20:27:16 +0200777 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +0800778}
779
Harald Welte44007742009-12-22 21:43:14 +0100780static void meas_rep_dump_uni_vty(struct vty *vty,
781 struct gsm_meas_rep_unidir *mru,
782 const char *prefix,
783 const char *dir)
784{
785 vty_out(vty, "%s RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",
786 prefix, dir, rxlev2dbm(mru->full.rx_lev),
787 dir, rxlev2dbm(mru->sub.rx_lev));
788 vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",
789 dir, mru->full.rx_qual, dir, mru->sub.rx_qual,
790 VTY_NEWLINE);
791}
792
793static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,
794 const char *prefix)
795{
796 vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);
797 vty_out(vty, "%s Flags: %s%s%s%s%s", prefix,
798 mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",
799 mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",
800 mr->flags & MEAS_REP_F_FPC ? "FPC " : "",
801 mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",
802 VTY_NEWLINE);
803 if (mr->flags & MEAS_REP_F_MS_TO)
804 vty_out(vty, "%s MS Timing Offset: %u%s", prefix,
805 mr->ms_timing_offset, VTY_NEWLINE);
806 if (mr->flags & MEAS_REP_F_MS_L1)
807 vty_out(vty, "%s L1 MS Power: %u dBm, Timing Advance: %u%s",
808 prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);
809 if (mr->flags & MEAS_REP_F_DL_VALID)
810 meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");
811 meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");
812}
813
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +0800814static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte59b04682009-06-10 05:40:52 +0800815{
Harald Welte44007742009-12-22 21:43:14 +0100816 int idx;
817
Harald Weltef62dad62010-12-24 12:22:34 +0100818 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",
819 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
820 lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);
Holger Hans Peter Freyther6e5c50f2010-06-28 17:09:29 +0800821 vty_out(vty, " Connection: %u, State: %s%s",
822 lchan->conn ? 1: 0,
Harald Welteab2534c2009-12-29 10:52:38 +0100823 gsm_lchans_name(lchan->state), VTY_NEWLINE);
Harald Welteb761bf82009-12-12 18:17:25 +0100824 vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s",
825 lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red
826 - lchan->bs_power*2,
827 ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),
828 VTY_NEWLINE);
Holger Hans Peter Freyther1a95fa82010-06-28 15:47:12 +0800829 if (lchan->conn && lchan->conn->subscr) {
Harald Welte59b04682009-06-10 05:40:52 +0800830 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther1a95fa82010-06-28 15:47:12 +0800831 subscr_dump_vty(vty, lchan->conn->subscr);
Harald Welte59b04682009-06-10 05:40:52 +0800832 } else
833 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte87504212009-12-02 01:56:49 +0530834 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
835 struct in_addr ia;
Holger Hans Peter Freythercec1ec52010-04-07 15:39:16 +0200836 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte87504212009-12-02 01:56:49 +0530837 vty_out(vty, " Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",
838 inet_ntoa(ia), lchan->abis_ip.bound_port,
839 lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,
840 VTY_NEWLINE);
841 }
Harald Welte44007742009-12-22 21:43:14 +0100842
843 /* we want to report the last measurement report */
844 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
845 lchan->meas_rep_idx, 1);
846 meas_rep_dump_vty(vty, &lchan->meas_rep[idx], " ");
Harald Welte59b04682009-06-10 05:40:52 +0800847}
848
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +0800849static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
850{
Holger Hans Peter Freythercf13a922010-05-14 01:57:02 +0800851 struct gsm_meas_rep *mr;
852 int idx;
853
854 /* we want to report the last measurement report */
855 idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
856 lchan->meas_rep_idx, 1);
857 mr = &lchan->meas_rep[idx];
858
Harald Weltef62dad62010-12-24 12:22:34 +0100859 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u, Type %s - "
860 "L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
861 lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
Harald Welte81c2ed32010-12-24 12:26:13 +0100862 lchan->nr, gsm_lchant_name(lchan->type), mr->ms_l1.pwr,
Holger Hans Peter Freythercf13a922010-05-14 01:57:02 +0800863 rxlev2dbm(mr->dl.full.rx_lev),
864 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +0800865 VTY_NEWLINE);
866}
867
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +0800868static int lchan_summary(struct vty *vty, int argc, const char **argv,
869 void (*dump_cb)(struct vty *, struct gsm_lchan *))
Harald Welte59b04682009-06-10 05:40:52 +0800870{
Harald Welte40152872010-05-16 20:52:23 +0200871 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +0800872 struct gsm_bts *bts;
873 struct gsm_bts_trx *trx;
874 struct gsm_bts_trx_ts *ts;
875 struct gsm_lchan *lchan;
876 int bts_nr, trx_nr, ts_nr, lchan_nr;
877
878 if (argc >= 1) {
879 /* use the BTS number that the user has specified */
880 bts_nr = atoi(argv[0]);
881 if (bts_nr >= net->num_bts) {
882 vty_out(vty, "%% can't find BTS %s%s", argv[0],
883 VTY_NEWLINE);
884 return CMD_WARNING;
885 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200886 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800887 }
888 if (argc >= 2) {
889 trx_nr = atoi(argv[1]);
890 if (trx_nr >= bts->num_trx) {
891 vty_out(vty, "%% can't find TRX %s%s", argv[1],
892 VTY_NEWLINE);
893 return CMD_WARNING;
894 }
Harald Weltee712a5f2009-06-21 16:17:15 +0200895 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800896 }
897 if (argc >= 3) {
898 ts_nr = atoi(argv[2]);
899 if (ts_nr >= TRX_NR_TS) {
900 vty_out(vty, "%% can't find TS %s%s", argv[2],
901 VTY_NEWLINE);
902 return CMD_WARNING;
903 }
904 ts = &trx->ts[ts_nr];
905 }
906 if (argc >= 4) {
907 lchan_nr = atoi(argv[3]);
908 if (lchan_nr >= TS_MAX_LCHAN) {
909 vty_out(vty, "%% can't find LCHAN %s%s", argv[3],
910 VTY_NEWLINE);
911 return CMD_WARNING;
912 }
913 lchan = &ts->lchan[lchan_nr];
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +0800914 dump_cb(vty, lchan);
Harald Welte59b04682009-06-10 05:40:52 +0800915 return CMD_SUCCESS;
916 }
917 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200918 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800919 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +0200920 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte59b04682009-06-10 05:40:52 +0800921 for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
922 ts = &trx->ts[ts_nr];
923 for (lchan_nr = 0; lchan_nr < TS_MAX_LCHAN;
924 lchan_nr++) {
925 lchan = &ts->lchan[lchan_nr];
926 if (lchan->type == GSM_LCHAN_NONE)
927 continue;
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +0800928 dump_cb(vty, lchan);
Harald Welte59b04682009-06-10 05:40:52 +0800929 }
930 }
931 }
932 }
933
934 return CMD_SUCCESS;
935}
936
Holger Hans Peter Freyther5424e022010-05-14 02:03:16 +0800937
938DEFUN(show_lchan,
939 show_lchan_cmd,
940 "show lchan [bts_nr] [trx_nr] [ts_nr] [lchan_nr]",
941 SHOW_STR "Display information about a logical channel\n"
942 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
943 "Logical Channel Number\n")
944
945{
946 return lchan_summary(vty, argc, argv, lchan_dump_full_vty);
947}
948
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +0800949DEFUN(show_lchan_summary,
950 show_lchan_summary_cmd,
951 "show lchan summary [bts_nr] [trx_nr] [ts_nr] [lchan_nr]",
952 SHOW_STR "Display information about a logical channel\n"
953 "BTS Number\n" "TRX Number\n" "Timeslot Number\n"
954 "Logical Channel Number\n")
955{
956 return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
957}
958
Harald Welte59b04682009-06-10 05:40:52 +0800959static void e1drv_dump_vty(struct vty *vty, struct e1inp_driver *drv)
960{
961 vty_out(vty, "E1 Input Driver %s%s", drv->name, VTY_NEWLINE);
962}
963
964DEFUN(show_e1drv,
965 show_e1drv_cmd,
966 "show e1_driver",
967 SHOW_STR "Display information about available E1 drivers\n")
968{
969 struct e1inp_driver *drv;
970
971 llist_for_each_entry(drv, &e1inp_driver_list, list)
972 e1drv_dump_vty(vty, drv);
973
974 return CMD_SUCCESS;
975}
976
977static void e1line_dump_vty(struct vty *vty, struct e1inp_line *line)
978{
979 vty_out(vty, "E1 Line Number %u, Name %s, Driver %s%s",
980 line->num, line->name ? line->name : "",
981 line->driver->name, VTY_NEWLINE);
982}
983
984DEFUN(show_e1line,
985 show_e1line_cmd,
986 "show e1_line [line_nr]",
Harald Welte9e002452010-05-11 21:53:49 +0200987 SHOW_STR "Display information about a E1 line\n"
988 "E1 Line Number\n")
Harald Welte59b04682009-06-10 05:40:52 +0800989{
990 struct e1inp_line *line;
991
992 if (argc >= 1) {
993 int num = atoi(argv[0]);
994 llist_for_each_entry(line, &e1inp_line_list, list) {
995 if (line->num == num) {
996 e1line_dump_vty(vty, line);
997 return CMD_SUCCESS;
998 }
999 }
1000 return CMD_WARNING;
1001 }
1002
1003 llist_for_each_entry(line, &e1inp_line_list, list)
1004 e1line_dump_vty(vty, line);
1005
1006 return CMD_SUCCESS;
1007}
1008
1009static void e1ts_dump_vty(struct vty *vty, struct e1inp_ts *ts)
1010{
Harald Welte62868882009-08-08 16:12:58 +02001011 if (ts->type == E1INP_TS_TYPE_NONE)
1012 return;
Harald Welte59b04682009-06-10 05:40:52 +08001013 vty_out(vty, "E1 Timeslot %2u of Line %u is Type %s%s",
1014 ts->num, ts->line->num, e1inp_tstype_name(ts->type),
1015 VTY_NEWLINE);
1016}
1017
1018DEFUN(show_e1ts,
1019 show_e1ts_cmd,
1020 "show e1_timeslot [line_nr] [ts_nr]",
Harald Welte9e002452010-05-11 21:53:49 +02001021 SHOW_STR "Display information about a E1 timeslot\n"
1022 "E1 Line Number\n" "E1 Timeslot Number\n")
Harald Welte59b04682009-06-10 05:40:52 +08001023{
Harald Welte49c79562009-11-17 06:12:16 +01001024 struct e1inp_line *line = NULL;
Harald Welte59b04682009-06-10 05:40:52 +08001025 struct e1inp_ts *ts;
1026 int ts_nr;
1027
1028 if (argc == 0) {
1029 llist_for_each_entry(line, &e1inp_line_list, list) {
1030 for (ts_nr = 0; ts_nr < NUM_E1_TS; ts_nr++) {
1031 ts = &line->ts[ts_nr];
1032 e1ts_dump_vty(vty, ts);
1033 }
1034 }
1035 return CMD_SUCCESS;
1036 }
1037 if (argc >= 1) {
1038 int num = atoi(argv[0]);
1039 llist_for_each_entry(line, &e1inp_line_list, list) {
1040 if (line->num == num)
1041 break;
1042 }
1043 if (!line || line->num != num) {
1044 vty_out(vty, "E1 line %s is invalid%s",
1045 argv[0], VTY_NEWLINE);
1046 return CMD_WARNING;
1047 }
1048 }
1049 if (argc >= 2) {
1050 ts_nr = atoi(argv[1]);
1051 if (ts_nr > NUM_E1_TS) {
1052 vty_out(vty, "E1 timeslot %s is invalid%s",
1053 argv[1], VTY_NEWLINE);
1054 return CMD_WARNING;
1055 }
1056 ts = &line->ts[ts_nr];
1057 e1ts_dump_vty(vty, ts);
1058 return CMD_SUCCESS;
1059 } else {
1060 for (ts_nr = 0; ts_nr < NUM_E1_TS; ts_nr++) {
1061 ts = &line->ts[ts_nr];
1062 e1ts_dump_vty(vty, ts);
1063 }
1064 return CMD_SUCCESS;
1065 }
1066 return CMD_SUCCESS;
1067}
1068
1069static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
1070{
1071 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
1072 subscr_dump_vty(vty, pag->subscr);
1073}
1074
1075static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
1076{
1077 struct gsm_paging_request *pag;
1078
1079 llist_for_each_entry(pag, &bts->paging.pending_requests, entry)
1080 paging_dump_vty(vty, pag);
1081}
1082
1083DEFUN(show_paging,
1084 show_paging_cmd,
1085 "show paging [bts_nr]",
Harald Welte9e002452010-05-11 21:53:49 +02001086 SHOW_STR "Display information about paging reuqests of a BTS\n"
1087 "BTS Number\n")
Harald Welte59b04682009-06-10 05:40:52 +08001088{
Harald Welte40152872010-05-16 20:52:23 +02001089 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +08001090 struct gsm_bts *bts;
1091 int bts_nr;
1092
1093 if (argc >= 1) {
1094 /* use the BTS number that the user has specified */
1095 bts_nr = atoi(argv[0]);
1096 if (bts_nr >= net->num_bts) {
1097 vty_out(vty, "%% can't find BTS %s%s", argv[0],
1098 VTY_NEWLINE);
1099 return CMD_WARNING;
1100 }
Harald Weltee712a5f2009-06-21 16:17:15 +02001101 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +08001102 bts_paging_dump_vty(vty, bts);
1103
1104 return CMD_SUCCESS;
1105 }
1106 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee712a5f2009-06-21 16:17:15 +02001107 bts = gsm_bts_num(net, bts_nr);
Harald Welte59b04682009-06-10 05:40:52 +08001108 bts_paging_dump_vty(vty, bts);
1109 }
1110
1111 return CMD_SUCCESS;
1112}
1113
Harald Welte9e002452010-05-11 21:53:49 +02001114#define NETWORK_STR "Configure the GSM network\n"
1115
Harald Weltee87eb462009-08-07 13:29:14 +02001116DEFUN(cfg_net,
1117 cfg_net_cmd,
Harald Welte9e002452010-05-11 21:53:49 +02001118 "network", NETWORK_STR)
Harald Weltee87eb462009-08-07 13:29:14 +02001119{
Harald Welte40152872010-05-16 20:52:23 +02001120 vty->index = gsmnet_from_vty(vty);
Harald Weltee87eb462009-08-07 13:29:14 +02001121 vty->node = GSMNET_NODE;
1122
1123 return CMD_SUCCESS;
1124}
1125
1126
1127DEFUN(cfg_net_ncc,
1128 cfg_net_ncc_cmd,
1129 "network country code <1-999>",
1130 "Set the GSM network country code")
1131{
Harald Welte40152872010-05-16 20:52:23 +02001132 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1133
Harald Weltee87eb462009-08-07 13:29:14 +02001134 gsmnet->country_code = atoi(argv[0]);
1135
1136 return CMD_SUCCESS;
1137}
1138
1139DEFUN(cfg_net_mnc,
1140 cfg_net_mnc_cmd,
1141 "mobile network code <1-999>",
1142 "Set the GSM mobile network code")
1143{
Harald Welte40152872010-05-16 20:52:23 +02001144 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1145
Harald Weltee87eb462009-08-07 13:29:14 +02001146 gsmnet->network_code = atoi(argv[0]);
1147
1148 return CMD_SUCCESS;
1149}
1150
1151DEFUN(cfg_net_name_short,
1152 cfg_net_name_short_cmd,
1153 "short name NAME",
1154 "Set the short GSM network name")
1155{
Harald Welte40152872010-05-16 20:52:23 +02001156 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1157
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +02001158 bsc_replace_string(gsmnet, &gsmnet->name_short, argv[0]);
Harald Weltee87eb462009-08-07 13:29:14 +02001159 return CMD_SUCCESS;
1160}
1161
1162DEFUN(cfg_net_name_long,
1163 cfg_net_name_long_cmd,
1164 "long name NAME",
1165 "Set the long GSM network name")
1166{
Harald Welte40152872010-05-16 20:52:23 +02001167 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1168
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +02001169 bsc_replace_string(gsmnet, &gsmnet->name_long, argv[0]);
Harald Weltee87eb462009-08-07 13:29:14 +02001170 return CMD_SUCCESS;
1171}
Harald Welte59b04682009-06-10 05:40:52 +08001172
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02001173DEFUN(cfg_net_auth_policy,
1174 cfg_net_auth_policy_cmd,
1175 "auth policy (closed|accept-all|token)",
Harald Welte9e002452010-05-11 21:53:49 +02001176 "Authentication (not cryptographic)\n"
1177 "Set the GSM network authentication policy\n"
1178 "Require the MS to be activated in HLR\n"
1179 "Accept all MS, whether in HLR or not\n"
1180 "Use SMS-token based authentication\n")
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02001181{
1182 enum gsm_auth_policy policy = gsm_auth_policy_parse(argv[0]);
Harald Welte40152872010-05-16 20:52:23 +02001183 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02001184
1185 gsmnet->auth_policy = policy;
1186
1187 return CMD_SUCCESS;
1188}
1189
Harald Welte59936d72009-11-18 20:33:19 +01001190DEFUN(cfg_net_reject_cause,
1191 cfg_net_reject_cause_cmd,
1192 "location updating reject cause <2-111>",
1193 "Set the reject cause of location updating reject\n")
1194{
Harald Welte40152872010-05-16 20:52:23 +02001195 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1196
Harald Welte59936d72009-11-18 20:33:19 +01001197 gsmnet->reject_cause = atoi(argv[0]);
1198
1199 return CMD_SUCCESS;
1200}
1201
Harald Weltecca253a2009-08-30 15:47:06 +09001202DEFUN(cfg_net_encryption,
1203 cfg_net_encryption_cmd,
1204 "encryption a5 (0|1|2)",
Harald Welte18ce31c2010-05-14 20:05:17 +02001205 "Encryption options\n"
1206 "A5 encryption\n" "A5/0: No encryption\n"
1207 "A5/1: Encryption\n" "A5/2: Export-grade Encryption\n")
Harald Weltecca253a2009-08-30 15:47:06 +09001208{
Harald Welte40152872010-05-16 20:52:23 +02001209 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1210
Andreas.Eversberg53293292009-11-17 09:55:26 +01001211 gsmnet->a5_encryption= atoi(argv[0]);
Harald Weltecca253a2009-08-30 15:47:06 +09001212
1213 return CMD_SUCCESS;
1214}
1215
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001216DEFUN(cfg_net_neci,
1217 cfg_net_neci_cmd,
1218 "neci (0|1)",
Harald Welte18ce31c2010-05-14 20:05:17 +02001219 "New Establish Cause Indication\n"
1220 "Don't set the NECI bit\n" "Set the NECI bit\n")
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001221{
Harald Welte40152872010-05-16 20:52:23 +02001222 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1223
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001224 gsmnet->neci = atoi(argv[0]);
Holger Hans Peter Freytherf0f37f12010-09-06 09:36:02 +08001225 gsm_net_update_ctype(gsmnet);
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01001226 return CMD_SUCCESS;
1227}
1228
Harald Welte52af1952009-12-13 10:53:12 +01001229DEFUN(cfg_net_rrlp_mode, cfg_net_rrlp_mode_cmd,
1230 "rrlp mode (none|ms-based|ms-preferred|ass-preferred)",
Harald Welte9e002452010-05-11 21:53:49 +02001231 "Radio Resource Location Protocol\n"
1232 "Set the Radio Resource Location Protocol Mode\n"
1233 "Don't send RRLP request\n"
1234 "Request MS-based location\n"
1235 "Request any location, prefer MS-based\n"
1236 "Request any location, prefer MS-assisted\n")
Harald Welte52af1952009-12-13 10:53:12 +01001237{
Harald Welte40152872010-05-16 20:52:23 +02001238 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1239
Harald Welte52af1952009-12-13 10:53:12 +01001240 gsmnet->rrlp.mode = rrlp_mode_parse(argv[0]);
1241
1242 return CMD_SUCCESS;
1243}
1244
Harald Weltea310f3e2009-12-14 09:00:24 +01001245DEFUN(cfg_net_mm_info, cfg_net_mm_info_cmd,
1246 "mm info (0|1)",
1247 "Whether to send MM INFO after LOC UPD ACCEPT")
1248{
Harald Welte40152872010-05-16 20:52:23 +02001249 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1250
Harald Weltea310f3e2009-12-14 09:00:24 +01001251 gsmnet->send_mm_info = atoi(argv[0]);
1252
1253 return CMD_SUCCESS;
1254}
1255
Harald Welte9e002452010-05-11 21:53:49 +02001256#define HANDOVER_STR "Handover Options\n"
1257
Harald Welte0af9c9f2009-12-19 21:41:52 +01001258DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1259 "handover (0|1)",
Harald Welte9e002452010-05-11 21:53:49 +02001260 HANDOVER_STR
1261 "Don't perform in-call handover\n"
1262 "Perform in-call handover\n")
Harald Welte0af9c9f2009-12-19 21:41:52 +01001263{
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001264 int enable = atoi(argv[0]);
Harald Welte40152872010-05-16 20:52:23 +02001265 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001266
1267 if (enable && ipacc_rtp_direct) {
Harald Welteaa2c3032009-12-20 13:51:01 +01001268 vty_out(vty, "%% Cannot enable handover unless RTP Proxy mode "
1269 "is enabled by using the -P command line option%s",
1270 VTY_NEWLINE);
1271 return CMD_WARNING;
1272 }
Holger Hans Peter Freyther3524d4b2010-01-07 16:14:38 +01001273 gsmnet->handover.active = enable;
Harald Welte0af9c9f2009-12-19 21:41:52 +01001274
1275 return CMD_SUCCESS;
1276}
1277
Harald Welte9e002452010-05-11 21:53:49 +02001278#define HO_WIN_STR HANDOVER_STR "Measurement Window\n"
1279#define HO_WIN_RXLEV_STR HO_WIN_STR "Received Level Averaging\n"
1280#define HO_WIN_RXQUAL_STR HO_WIN_STR "Received Quality Averaging\n"
1281#define HO_PBUDGET_STR HANDOVER_STR "Power Budget\n"
1282
Harald Weltea8062f12009-12-21 16:51:50 +01001283DEFUN(cfg_net_ho_win_rxlev_avg, cfg_net_ho_win_rxlev_avg_cmd,
1284 "handover window rxlev averaging <1-10>",
Harald Welte9e002452010-05-11 21:53:49 +02001285 HO_WIN_RXLEV_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001286 "How many RxLev measurements are used for averaging")
1287{
Harald Welte40152872010-05-16 20:52:23 +02001288 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001289 gsmnet->handover.win_rxlev_avg = atoi(argv[0]);
1290 return CMD_SUCCESS;
1291}
1292
1293DEFUN(cfg_net_ho_win_rxqual_avg, cfg_net_ho_win_rxqual_avg_cmd,
1294 "handover window rxqual averaging <1-10>",
Harald Welte9e002452010-05-11 21:53:49 +02001295 HO_WIN_RXQUAL_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001296 "How many RxQual measurements are used for averaging")
1297{
Harald Welte40152872010-05-16 20:52:23 +02001298 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001299 gsmnet->handover.win_rxqual_avg = atoi(argv[0]);
1300 return CMD_SUCCESS;
1301}
1302
1303DEFUN(cfg_net_ho_win_rxlev_neigh_avg, cfg_net_ho_win_rxlev_avg_neigh_cmd,
1304 "handover window rxlev neighbor averaging <1-10>",
Harald Welte9e002452010-05-11 21:53:49 +02001305 HO_WIN_RXLEV_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001306 "How many RxQual measurements are used for averaging")
1307{
Harald Welte40152872010-05-16 20:52:23 +02001308 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001309 gsmnet->handover.win_rxlev_avg_neigh = atoi(argv[0]);
1310 return CMD_SUCCESS;
1311}
1312
1313DEFUN(cfg_net_ho_pwr_interval, cfg_net_ho_pwr_interval_cmd,
1314 "handover power budget interval <1-99>",
Harald Welte9e002452010-05-11 21:53:49 +02001315 HO_PBUDGET_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001316 "How often to check if we have a better cell (SACCH frames)")
1317{
Harald Welte40152872010-05-16 20:52:23 +02001318 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001319 gsmnet->handover.pwr_interval = atoi(argv[0]);
1320 return CMD_SUCCESS;
1321}
1322
1323DEFUN(cfg_net_ho_pwr_hysteresis, cfg_net_ho_pwr_hysteresis_cmd,
1324 "handover power budget hysteresis <0-999>",
Harald Welte9e002452010-05-11 21:53:49 +02001325 HO_PBUDGET_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001326 "How many dB does a neighbor to be stronger to become a HO candidate")
1327{
Harald Welte40152872010-05-16 20:52:23 +02001328 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001329 gsmnet->handover.pwr_hysteresis = atoi(argv[0]);
1330 return CMD_SUCCESS;
1331}
1332
1333DEFUN(cfg_net_ho_max_distance, cfg_net_ho_max_distance_cmd,
1334 "handover maximum distance <0-9999>",
Harald Welte9e002452010-05-11 21:53:49 +02001335 HANDOVER_STR
Harald Weltea8062f12009-12-21 16:51:50 +01001336 "How big is the maximum timing advance before HO is forced")
1337{
Harald Welte40152872010-05-16 20:52:23 +02001338 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Weltea8062f12009-12-21 16:51:50 +01001339 gsmnet->handover.max_distance = atoi(argv[0]);
1340 return CMD_SUCCESS;
1341}
Harald Welte0af9c9f2009-12-19 21:41:52 +01001342
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +08001343DEFUN(cfg_net_pag_any_tch,
1344 cfg_net_pag_any_tch_cmd,
1345 "paging any use tch (0|1)",
1346 "Assign a TCH when receiving a Paging Any request")
1347{
Holger Hans Peter Freytherc5628882010-09-06 10:09:19 +08001348 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +08001349 gsmnet->pag_any_tch = atoi(argv[0]);
1350 gsm_net_update_ctype(gsmnet);
1351 return CMD_SUCCESS;
1352}
1353
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001354#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001355 DEFUN(cfg_net_T##number, \
1356 cfg_net_T##number##_cmd, \
1357 "timer t" #number " <0-65535>", \
Harald Welte9e002452010-05-11 21:53:49 +02001358 "Configure GSM Timers\n" \
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001359 doc) \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001360{ \
Harald Welte40152872010-05-16 20:52:23 +02001361 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001362 int value = atoi(argv[0]); \
1363 \
1364 if (value < 0 || value > 65535) { \
1365 vty_out(vty, "Timer value %s out of range.%s", \
1366 argv[0], VTY_NEWLINE); \
1367 return CMD_WARNING; \
1368 } \
1369 \
1370 gsmnet->T##number = value; \
1371 return CMD_SUCCESS; \
1372}
1373
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001374DECLARE_TIMER(3101, "Set the timeout value for IMMEDIATE ASSIGNMENT.")
1375DECLARE_TIMER(3103, "Set the timeout value for HANDOVER.")
1376DECLARE_TIMER(3105, "Currently not used.")
1377DECLARE_TIMER(3107, "Currently not used.")
1378DECLARE_TIMER(3109, "Currently not used.")
Holger Hans Peter Freyther4a00c062010-05-31 21:33:15 +08001379DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.")
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001380DECLARE_TIMER(3113, "Set the time to try paging a subscriber.")
1381DECLARE_TIMER(3115, "Currently not used.")
1382DECLARE_TIMER(3117, "Currently not used.")
1383DECLARE_TIMER(3119, "Currently not used.")
Harald Weltea00fdd72010-12-23 14:39:29 +01001384DECLARE_TIMER(3122, "Waiting time (seconds) after IMM ASS REJECT")
Holger Hans Peter Freyther13ae9802009-12-22 08:27:21 +01001385DECLARE_TIMER(3141, "Currently not used.")
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001386
Holger Hans Peter Freyther21d63ff2010-09-06 09:25:48 +08001387DEFUN(cfg_net_dtx,
1388 cfg_net_dtx_cmd,
1389 "dtx-used (0|1)",
1390 "Enable the usage of DTX.\n"
1391 "DTX is enabled/disabled")
1392{
1393 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1394 gsmnet->dtx_enabled = atoi(argv[0]);
1395 return CMD_SUCCESS;
1396}
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01001397
Holger Hans Peter Freyther68b21e12010-12-22 16:26:04 +01001398DEFUN(cfg_net_subscr_keep,
1399 cfg_net_subscr_keep_cmd,
1400 "subscriber-keep-in-ram (0|1)",
1401 "Keep unused subscribers in RAM.\n"
1402 "Delete unused subscribers\n" "Keep unused subscribers\n")
1403{
1404 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1405 gsmnet->keep_subscr = atoi(argv[0]);
1406 return CMD_SUCCESS;
1407}
1408
Harald Welte59b04682009-06-10 05:40:52 +08001409/* per-BTS configuration */
1410DEFUN(cfg_bts,
1411 cfg_bts_cmd,
1412 "bts BTS_NR",
Harald Welte9e002452010-05-11 21:53:49 +02001413 "Select a BTS to configure\n"
1414 "BTS Number\n")
Harald Welte59b04682009-06-10 05:40:52 +08001415{
Harald Welte40152872010-05-16 20:52:23 +02001416 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte59b04682009-06-10 05:40:52 +08001417 int bts_nr = atoi(argv[0]);
1418 struct gsm_bts *bts;
1419
Harald Weltee712a5f2009-06-21 16:17:15 +02001420 if (bts_nr > gsmnet->num_bts) {
1421 vty_out(vty, "%% The next unused BTS number is %u%s",
1422 gsmnet->num_bts, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +08001423 return CMD_WARNING;
Harald Weltee712a5f2009-06-21 16:17:15 +02001424 } else if (bts_nr == gsmnet->num_bts) {
1425 /* allocate a new one */
1426 bts = gsm_bts_alloc(gsmnet, GSM_BTS_TYPE_UNKNOWN,
1427 HARDCODED_TSC, HARDCODED_BSIC);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02001428 } else
Harald Weltee712a5f2009-06-21 16:17:15 +02001429 bts = gsm_bts_num(gsmnet, bts_nr);
1430
Daniel Willmann580085f2010-01-11 13:43:07 +01001431 if (!bts) {
1432 vty_out(vty, "%% Unable to allocate BTS %u%s",
1433 gsmnet->num_bts, VTY_NEWLINE);
Harald Weltee712a5f2009-06-21 16:17:15 +02001434 return CMD_WARNING;
Daniel Willmann580085f2010-01-11 13:43:07 +01001435 }
Harald Welte59b04682009-06-10 05:40:52 +08001436
1437 vty->index = bts;
Harald Welte8791dac2010-05-14 17:59:53 +02001438 vty->index_sub = &bts->description;
Harald Welte59b04682009-06-10 05:40:52 +08001439 vty->node = BTS_NODE;
1440
1441 return CMD_SUCCESS;
1442}
1443
1444DEFUN(cfg_bts_type,
1445 cfg_bts_type_cmd,
1446 "type TYPE",
1447 "Set the BTS type\n")
1448{
1449 struct gsm_bts *bts = vty->index;
Harald Welte59698fb2010-01-10 18:01:52 +01001450 int rc;
Harald Welte59b04682009-06-10 05:40:52 +08001451
Harald Welte59698fb2010-01-10 18:01:52 +01001452 rc = gsm_set_bts_type(bts, parse_btstype(argv[0]));
1453 if (rc < 0)
1454 return CMD_WARNING;
Harald Welte25572872009-10-20 00:22:00 +02001455
Harald Welte59b04682009-06-10 05:40:52 +08001456 return CMD_SUCCESS;
1457}
1458
Harald Welte91afe4c2009-06-20 18:15:19 +02001459DEFUN(cfg_bts_band,
1460 cfg_bts_band_cmd,
1461 "band BAND",
1462 "Set the frequency band of this BTS\n")
1463{
1464 struct gsm_bts *bts = vty->index;
Harald Welte62868882009-08-08 16:12:58 +02001465 int band = gsm_band_parse(argv[0]);
Harald Welte91afe4c2009-06-20 18:15:19 +02001466
1467 if (band < 0) {
1468 vty_out(vty, "%% BAND %d is not a valid GSM band%s",
1469 band, VTY_NEWLINE);
1470 return CMD_WARNING;
1471 }
1472
1473 bts->band = band;
1474
1475 return CMD_SUCCESS;
1476}
1477
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +02001478DEFUN(cfg_bts_ci,
1479 cfg_bts_ci_cmd,
1480 "cell_identity <0-65535>",
1481 "Set the Cell identity of this BTS\n")
1482{
1483 struct gsm_bts *bts = vty->index;
1484 int ci = atoi(argv[0]);
1485
1486 if (ci < 0 || ci > 0xffff) {
1487 vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s",
1488 ci, VTY_NEWLINE);
1489 return CMD_WARNING;
1490 }
1491 bts->cell_identity = ci;
1492
1493 return CMD_SUCCESS;
1494}
1495
Harald Welte59b04682009-06-10 05:40:52 +08001496DEFUN(cfg_bts_lac,
1497 cfg_bts_lac_cmd,
Holger Hans Peter Freyther54a22832009-09-29 14:02:33 +02001498 "location_area_code <0-65535>",
Harald Welte59b04682009-06-10 05:40:52 +08001499 "Set the Location Area Code (LAC) of this BTS\n")
1500{
1501 struct gsm_bts *bts = vty->index;
1502 int lac = atoi(argv[0]);
1503
Holger Hans Peter Freyther54a22832009-09-29 14:02:33 +02001504 if (lac < 0 || lac > 0xffff) {
1505 vty_out(vty, "%% LAC %d is not in the valid range (0-65535)%s",
Harald Welte59b04682009-06-10 05:40:52 +08001506 lac, VTY_NEWLINE);
1507 return CMD_WARNING;
1508 }
Holger Hans Peter Freyther6c6ab862009-10-01 04:07:15 +02001509
1510 if (lac == GSM_LAC_RESERVED_DETACHED || lac == GSM_LAC_RESERVED_ALL_BTS) {
1511 vty_out(vty, "%% LAC %d is reserved by GSM 04.08%s",
1512 lac, VTY_NEWLINE);
1513 return CMD_WARNING;
1514 }
1515
Harald Welte59b04682009-06-10 05:40:52 +08001516 bts->location_area_code = lac;
1517
1518 return CMD_SUCCESS;
1519}
1520
Harald Weltea54a2bb2009-12-01 18:04:30 +05301521
Harald Welte59b04682009-06-10 05:40:52 +08001522DEFUN(cfg_bts_tsc,
1523 cfg_bts_tsc_cmd,
1524 "training_sequence_code <0-255>",
1525 "Set the Training Sequence Code (TSC) of this BTS\n")
1526{
1527 struct gsm_bts *bts = vty->index;
1528 int tsc = atoi(argv[0]);
1529
1530 if (tsc < 0 || tsc > 0xff) {
1531 vty_out(vty, "%% TSC %d is not in the valid range (0-255)%s",
1532 tsc, VTY_NEWLINE);
1533 return CMD_WARNING;
1534 }
1535 bts->tsc = tsc;
1536
1537 return CMD_SUCCESS;
1538}
1539
1540DEFUN(cfg_bts_bsic,
1541 cfg_bts_bsic_cmd,
1542 "base_station_id_code <0-63>",
1543 "Set the Base Station Identity Code (BSIC) of this BTS\n")
1544{
1545 struct gsm_bts *bts = vty->index;
1546 int bsic = atoi(argv[0]);
1547
1548 if (bsic < 0 || bsic > 0x3f) {
Harald Welte62868882009-08-08 16:12:58 +02001549 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte59b04682009-06-10 05:40:52 +08001550 bsic, VTY_NEWLINE);
1551 return CMD_WARNING;
1552 }
1553 bts->bsic = bsic;
1554
1555 return CMD_SUCCESS;
1556}
1557
1558
1559DEFUN(cfg_bts_unit_id,
1560 cfg_bts_unit_id_cmd,
Harald Weltef515aa02009-08-07 13:27:09 +02001561 "ip.access unit_id <0-65534> <0-255>",
1562 "Set the ip.access BTS Unit ID of this BTS\n")
Harald Welte59b04682009-06-10 05:40:52 +08001563{
1564 struct gsm_bts *bts = vty->index;
1565 int site_id = atoi(argv[0]);
1566 int bts_id = atoi(argv[1]);
1567
Harald Weltef515aa02009-08-07 13:27:09 +02001568 if (!is_ipaccess_bts(bts)) {
1569 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1570 return CMD_WARNING;
1571 }
1572
Harald Welte59b04682009-06-10 05:40:52 +08001573 bts->ip_access.site_id = site_id;
1574 bts->ip_access.bts_id = bts_id;
1575
1576 return CMD_SUCCESS;
1577}
1578
Harald Welte9e002452010-05-11 21:53:49 +02001579#define OML_STR "Organization & Maintenance Link\n"
1580#define IPA_STR "ip.access Specific Options\n"
1581
Harald Welte25572872009-10-20 00:22:00 +02001582DEFUN(cfg_bts_stream_id,
1583 cfg_bts_stream_id_cmd,
1584 "oml ip.access stream_id <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02001585 OML_STR IPA_STR
Harald Welte25572872009-10-20 00:22:00 +02001586 "Set the ip.access Stream ID of the OML link of this BTS\n")
1587{
1588 struct gsm_bts *bts = vty->index;
1589 int stream_id = atoi(argv[0]);
1590
1591 if (!is_ipaccess_bts(bts)) {
1592 vty_out(vty, "%% BTS is not of ip.access type%s", VTY_NEWLINE);
1593 return CMD_WARNING;
1594 }
1595
1596 bts->oml_tei = stream_id;
1597
1598 return CMD_SUCCESS;
1599}
1600
Harald Welte9e002452010-05-11 21:53:49 +02001601#define OML_E1_STR OML_STR "E1 Line\n"
Harald Welte25572872009-10-20 00:22:00 +02001602
Harald Welte62868882009-08-08 16:12:58 +02001603DEFUN(cfg_bts_oml_e1,
1604 cfg_bts_oml_e1_cmd,
1605 "oml e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welte9e002452010-05-11 21:53:49 +02001606 OML_E1_STR
Harald Welte62868882009-08-08 16:12:58 +02001607 "E1 interface to be used for OML\n")
1608{
1609 struct gsm_bts *bts = vty->index;
1610
1611 parse_e1_link(&bts->oml_e1_link, argv[0], argv[1], argv[2]);
1612
1613 return CMD_SUCCESS;
1614}
1615
1616
1617DEFUN(cfg_bts_oml_e1_tei,
1618 cfg_bts_oml_e1_tei_cmd,
1619 "oml e1 tei <0-63>",
Harald Welte9e002452010-05-11 21:53:49 +02001620 OML_E1_STR
Harald Welte62868882009-08-08 16:12:58 +02001621 "Set the TEI to be used for OML")
1622{
1623 struct gsm_bts *bts = vty->index;
1624
1625 bts->oml_tei = atoi(argv[0]);
1626
1627 return CMD_SUCCESS;
1628}
1629
Harald Welte3e774612009-08-10 13:48:16 +02001630DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1631 "channel allocator (ascending|descending)",
Harald Welte9e002452010-05-11 21:53:49 +02001632 "Channnel Allocator\n" "Channel Allocator\n"
1633 "Allocate Timeslots and Transceivers in ascending order\n"
1634 "Allocate Timeslots and Transceivers in descending order\n")
Harald Welte3e774612009-08-10 13:48:16 +02001635{
1636 struct gsm_bts *bts = vty->index;
1637
1638 if (!strcmp(argv[0], "ascending"))
1639 bts->chan_alloc_reverse = 0;
1640 else
1641 bts->chan_alloc_reverse = 1;
1642
1643 return CMD_SUCCESS;
1644}
1645
Harald Welte9e002452010-05-11 21:53:49 +02001646#define RACH_STR "Random Access Control Channel\n"
1647
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01001648DEFUN(cfg_bts_rach_tx_integer,
1649 cfg_bts_rach_tx_integer_cmd,
1650 "rach tx integer <0-15>",
Harald Welte9e002452010-05-11 21:53:49 +02001651 RACH_STR
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01001652 "Set the raw tx integer value in RACH Control parameters IE")
1653{
1654 struct gsm_bts *bts = vty->index;
1655 bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
1656 return CMD_SUCCESS;
1657}
1658
1659DEFUN(cfg_bts_rach_max_trans,
1660 cfg_bts_rach_max_trans_cmd,
1661 "rach max transmission (1|2|4|7)",
Harald Welte9e002452010-05-11 21:53:49 +02001662 RACH_STR
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01001663 "Set the maximum number of RACH burst transmissions")
1664{
1665 struct gsm_bts *bts = vty->index;
1666 bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
1667 return CMD_SUCCESS;
1668}
1669
Harald Welte9e002452010-05-11 21:53:49 +02001670#define NM_STR "Network Management\n"
1671
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08001672DEFUN(cfg_bts_rach_nm_b_thresh,
1673 cfg_bts_rach_nm_b_thresh_cmd,
1674 "rach nm busy threshold <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02001675 RACH_STR NM_STR
1676 "Set the NM Busy Threshold in dB")
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08001677{
1678 struct gsm_bts *bts = vty->index;
1679 bts->rach_b_thresh = atoi(argv[0]);
1680 return CMD_SUCCESS;
1681}
1682
1683DEFUN(cfg_bts_rach_nm_ldavg,
1684 cfg_bts_rach_nm_ldavg_cmd,
1685 "rach nm load average <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001686 RACH_STR NM_STR
1687 "Set the NM Loadaverage Slots value")
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08001688{
1689 struct gsm_bts *bts = vty->index;
1690 bts->rach_ldavg_slots = atoi(argv[0]);
1691 return CMD_SUCCESS;
1692}
1693
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02001694DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
1695 "cell barred (0|1)",
1696 "Should this cell be barred from access?")
1697{
1698 struct gsm_bts *bts = vty->index;
1699
Harald Welte8c973ba2009-12-21 23:08:18 +01001700 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02001701
1702 return CMD_SUCCESS;
1703}
1704
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +08001705DEFUN(cfg_bts_rach_ec_allowed, cfg_bts_rach_ec_allowed_cmd,
1706 "rach emergency call allowed (0|1)",
1707 "Should this cell allow emergency calls?")
1708{
1709 struct gsm_bts *bts = vty->index;
1710
1711 if (atoi(argv[0]) == 0)
1712 bts->si_common.rach_control.t2 |= 0x4;
1713 else
1714 bts->si_common.rach_control.t2 &= ~0x4;
1715
1716 return CMD_SUCCESS;
1717}
1718
Harald Welte (local)cbd46102009-08-13 10:14:26 +02001719DEFUN(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd,
1720 "ms max power <0-40>",
1721 "Maximum transmit power of the MS")
1722{
1723 struct gsm_bts *bts = vty->index;
1724
1725 bts->ms_max_power = atoi(argv[0]);
1726
1727 return CMD_SUCCESS;
1728}
1729
Harald Welteb761bf82009-12-12 18:17:25 +01001730DEFUN(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd,
1731 "cell reselection hysteresis <0-14>",
1732 "Cell Re-Selection Hysteresis in dB")
1733{
1734 struct gsm_bts *bts = vty->index;
1735
1736 bts->si_common.cell_sel_par.cell_resel_hyst = atoi(argv[0])/2;
1737
1738 return CMD_SUCCESS;
1739}
1740
1741DEFUN(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd,
1742 "rxlev access min <0-63>",
1743 "Minimum RxLev needed for cell access (better than -110dBm)")
1744{
1745 struct gsm_bts *bts = vty->index;
1746
1747 bts->si_common.cell_sel_par.rxlev_acc_min = atoi(argv[0]);
1748
1749 return CMD_SUCCESS;
1750}
1751
Sylvain Munaut00d71462010-11-28 18:17:28 +01001752DEFUN(cfg_bts_cell_bar_qualify, cfg_bts_cell_bar_qualify_cmd,
1753 "cell bar qualify (0|1)",
1754 "Cell Bar Qualify")
1755{
1756 struct gsm_bts *bts = vty->index;
1757
1758 bts->si_common.cell_ro_sel_par.present = 1;
1759 bts->si_common.cell_ro_sel_par.cbq = atoi(argv[0]);
1760
1761 return CMD_SUCCESS;
1762}
1763
1764DEFUN(cfg_bts_cell_resel_ofs, cfg_bts_cell_resel_ofs_cmd,
1765 "cell reselection offset <0-126>",
1766 "Cell Re-Selection Offset in dB")
1767{
1768 struct gsm_bts *bts = vty->index;
1769
1770 bts->si_common.cell_ro_sel_par.present = 1;
1771 bts->si_common.cell_ro_sel_par.cell_resel_off = atoi(argv[0])/2;
1772
1773 return CMD_SUCCESS;
1774}
1775
1776DEFUN(cfg_bts_temp_ofs, cfg_bts_temp_ofs_cmd,
1777 "temporary offset <0-60>",
1778 "Cell selection temporary negative offset in dB")
1779{
1780 struct gsm_bts *bts = vty->index;
1781
1782 bts->si_common.cell_ro_sel_par.present = 1;
1783 bts->si_common.cell_ro_sel_par.temp_offs = atoi(argv[0])/10;
1784
1785 return CMD_SUCCESS;
1786}
1787
1788DEFUN(cfg_bts_temp_ofs_inf, cfg_bts_temp_ofs_inf_cmd,
1789 "temporary offset infinite",
1790 "Sets cell selection temporary negative offset to infinity")
1791{
1792 struct gsm_bts *bts = vty->index;
1793
1794 bts->si_common.cell_ro_sel_par.present = 1;
1795 bts->si_common.cell_ro_sel_par.temp_offs = 7;
1796
1797 return CMD_SUCCESS;
1798}
1799
1800DEFUN(cfg_bts_penalty_time, cfg_bts_penalty_time_cmd,
1801 "penalty time <20-620>",
1802 "Cell selection penalty time in seconds (by 20s increments)")
1803{
1804 struct gsm_bts *bts = vty->index;
1805
1806 bts->si_common.cell_ro_sel_par.present = 1;
1807 bts->si_common.cell_ro_sel_par.penalty_time = (atoi(argv[0])-20)/20;
1808
1809 return CMD_SUCCESS;
1810}
1811
1812DEFUN(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd,
1813 "penalty time reserved",
1814 "Set cell selection penalty time to reserved value 31\n"
1815 "(indicate that CELL_RESELECT_OFFSET is subtracted from C2 "
1816 "and TEMPORARY_OFFSET is ignored)")
1817{
1818 struct gsm_bts *bts = vty->index;
1819
1820 bts->si_common.cell_ro_sel_par.present = 1;
1821 bts->si_common.cell_ro_sel_par.penalty_time = 31;
1822
1823 return CMD_SUCCESS;
1824}
1825
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02001826DEFUN(cfg_bts_per_loc_upd, cfg_bts_per_loc_upd_cmd,
1827 "periodic location update <0-1530>",
1828 "Periodic Location Updating Interval in Minutes")
1829{
1830 struct gsm_bts *bts = vty->index;
1831
Dieter Spaarb0f746d2010-10-05 21:10:55 +02001832 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02001833
1834 return CMD_SUCCESS;
1835}
1836
Harald Welte9e002452010-05-11 21:53:49 +02001837#define GPRS_TEXT "GPRS Packet Network\n"
1838
Harald Welte410575a2010-03-14 23:30:30 +08001839DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welteb42fe342010-04-18 14:00:26 +02001840 "gprs cell bvci <2-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001841 GPRS_TEXT
1842 "GPRS Cell Settings\n"
Harald Welte3055e332010-03-14 15:37:43 +08001843 "GPRS BSSGP VC Identifier")
1844{
1845 struct gsm_bts *bts = vty->index;
1846
Harald Weltecb20b7a2010-04-18 15:51:20 +02001847 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08001848 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1849 return CMD_WARNING;
1850 }
1851
Harald Welte3055e332010-03-14 15:37:43 +08001852 bts->gprs.cell.bvci = atoi(argv[0]);
1853
1854 return CMD_SUCCESS;
1855}
1856
Harald Welte4a048c52010-03-22 11:48:36 +08001857DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
1858 "gprs nsei <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001859 GPRS_TEXT
Harald Welte4a048c52010-03-22 11:48:36 +08001860 "GPRS NS Entity Identifier")
1861{
1862 struct gsm_bts *bts = vty->index;
1863
Harald Weltecb20b7a2010-04-18 15:51:20 +02001864 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte4a048c52010-03-22 11:48:36 +08001865 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1866 return CMD_WARNING;
1867 }
1868
1869 bts->gprs.nse.nsei = atoi(argv[0]);
1870
1871 return CMD_SUCCESS;
1872}
1873
Harald Welte9e002452010-05-11 21:53:49 +02001874#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
1875 "NSVC Logical Number\n"
Harald Welte4a048c52010-03-22 11:48:36 +08001876
Harald Welte3055e332010-03-14 15:37:43 +08001877DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
1878 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001879 GPRS_TEXT NSVC_TEXT
1880 "NS Virtual Connection Identifier\n"
Harald Welte3055e332010-03-14 15:37:43 +08001881 "GPRS NS VC Identifier")
1882{
1883 struct gsm_bts *bts = vty->index;
1884 int idx = atoi(argv[0]);
1885
Harald Weltecb20b7a2010-04-18 15:51:20 +02001886 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08001887 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1888 return CMD_WARNING;
1889 }
1890
Harald Welte3055e332010-03-14 15:37:43 +08001891 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
1892
1893 return CMD_SUCCESS;
1894}
1895
Harald Welte410575a2010-03-14 23:30:30 +08001896DEFUN(cfg_bts_gprs_nsvc_lport, cfg_bts_gprs_nsvc_lport_cmd,
1897 "gprs nsvc <0-1> local udp port <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001898 GPRS_TEXT NSVC_TEXT
Harald Welte410575a2010-03-14 23:30:30 +08001899 "GPRS NS Local UDP Port")
1900{
1901 struct gsm_bts *bts = vty->index;
1902 int idx = atoi(argv[0]);
1903
Harald Weltecb20b7a2010-04-18 15:51:20 +02001904 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08001905 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1906 return CMD_WARNING;
1907 }
1908
Harald Welte410575a2010-03-14 23:30:30 +08001909 bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
1910
1911 return CMD_SUCCESS;
1912}
1913
1914DEFUN(cfg_bts_gprs_nsvc_rport, cfg_bts_gprs_nsvc_rport_cmd,
1915 "gprs nsvc <0-1> remote udp port <0-65535>",
Harald Welte9e002452010-05-11 21:53:49 +02001916 GPRS_TEXT NSVC_TEXT
Harald Welte410575a2010-03-14 23:30:30 +08001917 "GPRS NS Remote UDP Port")
1918{
1919 struct gsm_bts *bts = vty->index;
1920 int idx = atoi(argv[0]);
1921
Harald Weltecb20b7a2010-04-18 15:51:20 +02001922 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08001923 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1924 return CMD_WARNING;
1925 }
1926
Harald Welte410575a2010-03-14 23:30:30 +08001927 bts->gprs.nsvc[idx].remote_port = atoi(argv[1]);
1928
1929 return CMD_SUCCESS;
1930}
1931
1932DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd,
1933 "gprs nsvc <0-1> remote ip A.B.C.D",
Harald Welte9e002452010-05-11 21:53:49 +02001934 GPRS_TEXT NSVC_TEXT
Harald Welte410575a2010-03-14 23:30:30 +08001935 "GPRS NS Remote IP Address")
1936{
1937 struct gsm_bts *bts = vty->index;
1938 int idx = atoi(argv[0]);
1939 struct in_addr ia;
1940
Harald Weltecb20b7a2010-04-18 15:51:20 +02001941 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08001942 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1943 return CMD_WARNING;
1944 }
1945
Harald Welte410575a2010-03-14 23:30:30 +08001946 inet_aton(argv[1], &ia);
1947 bts->gprs.nsvc[idx].remote_ip = ntohl(ia.s_addr);
1948
1949 return CMD_SUCCESS;
1950}
1951
Holger Hans Peter Freyther3112f672010-09-06 10:11:25 +08001952DEFUN(cfg_bts_pag_free, cfg_bts_pag_free_cmd,
1953 "paging free FREE_NR",
1954 "Only page when having a certain amount of free slots. -1 to disable")
1955{
1956 struct gsm_bts *bts = vty->index;
1957
1958 bts->paging.free_chans_need = atoi(argv[0]);
1959 return CMD_SUCCESS;
1960}
1961
Harald Weltea9251762010-05-11 23:50:21 +02001962DEFUN(cfg_bts_gprs_ns_timer, cfg_bts_gprs_ns_timer_cmd,
1963 "gprs ns timer " NS_TIMERS " <0-255>",
1964 GPRS_TEXT "Network Service\n"
1965 "Network Service Timer\n"
1966 NS_TIMERS_HELP "Timer Value\n")
1967{
1968 struct gsm_bts *bts = vty->index;
1969 int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
1970 int val = atoi(argv[1]);
1971
1972 if (bts->gprs.mode == BTS_GPRS_NONE) {
1973 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
1974 return CMD_WARNING;
1975 }
1976
1977 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
1978 return CMD_WARNING;
1979
1980 bts->gprs.nse.timer[idx] = val;
1981
1982 return CMD_SUCCESS;
1983}
1984
1985#define BSSGP_TIMERS "(blocking-timer|blocking-retries|unblocking-retries|reset-timer|reset-retries|suspend-timer|suspend-retries|resume-timer|resume-retries|capability-update-timer|capability-update-retries)"
Harald Welte18ce31c2010-05-14 20:05:17 +02001986#define BSSGP_TIMERS_HELP \
1987 "Tbvc-block timeout\n" \
1988 "Tbvc-block retries\n" \
1989 "Tbvc-unblock retries\n" \
1990 "Tbvcc-reset timeout\n" \
1991 "Tbvc-reset retries\n" \
1992 "Tbvc-suspend timeout\n" \
1993 "Tbvc-suspend retries\n" \
1994 "Tbvc-resume timeout\n" \
1995 "Tbvc-resume retries\n" \
1996 "Tbvc-capa-update timeout\n" \
1997 "Tbvc-capa-update retries\n"
Harald Weltea9251762010-05-11 23:50:21 +02001998
1999DEFUN(cfg_bts_gprs_cell_timer, cfg_bts_gprs_cell_timer_cmd,
2000 "gprs cell timer " BSSGP_TIMERS " <0-255>",
2001 GPRS_TEXT "Cell / BSSGP\n"
2002 "Cell/BSSGP Timer\n"
2003 BSSGP_TIMERS_HELP "Timer Value\n")
2004{
2005 struct gsm_bts *bts = vty->index;
2006 int idx = get_string_value(gprs_bssgp_cfg_strs, argv[0]);
2007 int val = atoi(argv[1]);
2008
2009 if (bts->gprs.mode == BTS_GPRS_NONE) {
2010 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2011 return CMD_WARNING;
2012 }
2013
2014 if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))
2015 return CMD_WARNING;
2016
2017 bts->gprs.cell.timer[idx] = val;
2018
2019 return CMD_SUCCESS;
2020}
2021
Harald Welte3055e332010-03-14 15:37:43 +08002022DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
2023 "gprs routing area <0-255>",
Harald Welte9e002452010-05-11 21:53:49 +02002024 GPRS_TEXT
Harald Welte3055e332010-03-14 15:37:43 +08002025 "GPRS Routing Area Code")
2026{
2027 struct gsm_bts *bts = vty->index;
2028
Harald Weltecb20b7a2010-04-18 15:51:20 +02002029 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltec05a4b12010-03-14 23:56:56 +08002030 vty_out(vty, "%% GPRS not enabled on this BTS%s", VTY_NEWLINE);
2031 return CMD_WARNING;
2032 }
2033
Harald Welte3055e332010-03-14 15:37:43 +08002034 bts->gprs.rac = atoi(argv[0]);
2035
2036 return CMD_SUCCESS;
2037}
2038
Harald Weltecb20b7a2010-04-18 15:51:20 +02002039DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
2040 "gprs mode (none|gprs|egprs)",
Harald Welte9e002452010-05-11 21:53:49 +02002041 GPRS_TEXT
2042 "GPRS Mode for this BTS\n"
2043 "GPRS Disabled on this BTS\n"
2044 "GPRS Enabled on this BTS\n"
2045 "EGPRS (EDGE) Enabled on this BTS\n")
Harald Welte410575a2010-03-14 23:30:30 +08002046{
2047 struct gsm_bts *bts = vty->index;
Harald Welte20e275a2010-06-14 22:44:42 +02002048 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0]);
Harald Welte410575a2010-03-14 23:30:30 +08002049
Harald Welte20e275a2010-06-14 22:44:42 +02002050 if (mode != BTS_GPRS_NONE &&
2051 !gsm_bts_has_feature(bts, BTS_FEAT_GPRS)) {
2052 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2053 VTY_NEWLINE);
2054 return CMD_WARNING;
2055 }
2056 if (mode == BTS_GPRS_EGPRS &&
2057 !gsm_bts_has_feature(bts, BTS_FEAT_EGPRS)) {
2058 vty_out(vty, "This BTS type does not support %s%s", argv[0],
2059 VTY_NEWLINE);
2060 return CMD_WARNING;
2061 }
2062
2063 bts->gprs.mode = mode;
Harald Welte410575a2010-03-14 23:30:30 +08002064
2065 return CMD_SUCCESS;
2066}
2067
Harald Welted8acf142010-07-30 11:50:09 +02002068#define SI_TEXT "System Information Messages\n"
2069#define SI_TYPE_TEXT "(1|2|3|4|5|6|7|8|9|10|13|16|17|18|19|20|2bis|2ter|2quater|5bis|5ter)"
2070#define SI_TYPE_HELP "System Information Type 1\n" \
2071 "System Information Type 2\n" \
2072 "System Information Type 3\n" \
2073 "System Information Type 4\n" \
2074 "System Information Type 5\n" \
2075 "System Information Type 6\n" \
2076 "System Information Type 7\n" \
2077 "System Information Type 8\n" \
2078 "System Information Type 9\n" \
2079 "System Information Type 10\n" \
2080 "System Information Type 13\n" \
2081 "System Information Type 16\n" \
2082 "System Information Type 17\n" \
2083 "System Information Type 18\n" \
2084 "System Information Type 19\n" \
2085 "System Information Type 20\n" \
2086 "System Information Type 2bis\n" \
2087 "System Information Type 2ter\n" \
2088 "System Information Type 2quater\n" \
2089 "System Information Type 5bis\n" \
2090 "System Information Type 5ter\n"
2091
2092DEFUN(cfg_bts_si_mode, cfg_bts_si_mode_cmd,
2093 "system-information " SI_TYPE_TEXT " mode (static|computed)",
2094 SI_TEXT SI_TYPE_HELP
2095 "System Information Mode\n"
2096 "Static user-specified\n"
2097 "Dynamic, BSC-computed\n")
2098{
2099 struct gsm_bts *bts = vty->index;
2100 int type;
2101
2102 type = get_string_value(osmo_sitype_strs, argv[0]);
2103 if (type < 0) {
2104 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2105 return CMD_WARNING;
2106 }
2107
2108 if (!strcmp(argv[1], "static"))
2109 bts->si_mode_static |= (1 << type);
2110 else
2111 bts->si_mode_static &= ~(1 << type);
2112
2113 return CMD_SUCCESS;
2114}
2115
2116DEFUN(cfg_bts_si_static, cfg_bts_si_static_cmd,
2117 "system-information " SI_TYPE_TEXT " static HEXSTRING",
2118 SI_TEXT SI_TYPE_HELP
2119 "Static System Information filling\n"
2120 "Static user-specified SI content in HEX notation\n")
2121{
2122 struct gsm_bts *bts = vty->index;
2123 int rc, type;
2124
2125 type = get_string_value(osmo_sitype_strs, argv[0]);
2126 if (type < 0) {
2127 vty_out(vty, "Error SI Type%s", VTY_NEWLINE);
2128 return CMD_WARNING;
2129 }
2130
2131 if (!(bts->si_mode_static & (1 << type))) {
2132 vty_out(vty, "SI Type %s is not configured in static mode%s",
2133 get_value_string(osmo_sitype_strs, type), VTY_NEWLINE);
2134 return CMD_WARNING;
2135 }
2136
Harald Welte9f09ac32010-07-30 11:53:18 +02002137 /* Fill buffer with padding pattern */
2138 memset(bts->si_buf[type], 0x2b, sizeof(bts->si_buf[type]));
2139
2140 /* Parse the user-specified SI in hex format, [partially] overwriting padding */
Harald Welted8acf142010-07-30 11:50:09 +02002141 rc = hexparse(argv[1], bts->si_buf[type], sizeof(bts->si_buf[0]));
2142 if (rc < 0 || rc > sizeof(bts->si_buf[0])) {
2143 vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
2144 return CMD_WARNING;
2145 }
2146
2147 /* Mark this SI as present */
2148 bts->si_valid |= (1 << type);
2149
2150 return CMD_SUCCESS;
2151}
2152
Harald Welteca46eff2011-01-11 23:44:56 +01002153DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
Harald Weltef989b782011-02-15 11:43:27 +01002154 "neighbor-list mode (automatic|manual|manual-si5)",
Harald Welteca46eff2011-01-11 23:44:56 +01002155 "Neighbor List\n" "Mode of Neighbor List generation\n"
Harald Weltef989b782011-02-15 11:43:27 +01002156 "Automatically from all BTS in this OpenBSC\n" "Manual\n"
2157 "Manual with different lists for SI2 and SI5\n")
Harald Welteca46eff2011-01-11 23:44:56 +01002158{
2159 struct gsm_bts *bts = vty->index;
Harald Weltef989b782011-02-15 11:43:27 +01002160 int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
Harald Welteca46eff2011-01-11 23:44:56 +01002161
Harald Weltef989b782011-02-15 11:43:27 +01002162 switch (mode) {
2163 case NL_MODE_MANUAL_SI5SEP:
2164 case NL_MODE_MANUAL:
Harald Welteca46eff2011-01-11 23:44:56 +01002165 /* make sure we clear the current list when switching to
2166 * manual mode */
2167 if (bts->neigh_list_manual_mode == 0)
2168 memset(&bts->si_common.data.neigh_list, 0,
2169 sizeof(bts->si_common.data.neigh_list));
Harald Weltef989b782011-02-15 11:43:27 +01002170 break;
2171 default:
2172 break;
2173 }
2174
2175 bts->neigh_list_manual_mode = mode;
Harald Welteca46eff2011-01-11 23:44:56 +01002176
2177 return CMD_SUCCESS;
2178}
2179
2180DEFUN(cfg_bts_neigh, cfg_bts_neigh_cmd,
2181 "neighbor-list (add|del) arfcn <0-1024>",
2182 "Neighbor List\n" "Add to manual neighbor list\n"
2183 "Delete from manual neighbor list\n" "ARFCN of neighbor\n"
2184 "ARFCN of neighbor\n")
2185{
2186 struct gsm_bts *bts = vty->index;
2187 struct bitvec *bv = &bts->si_common.neigh_list;
2188 uint16_t arfcn = atoi(argv[1]);
2189
2190 if (!bts->neigh_list_manual_mode) {
2191 vty_out(vty, "%% Cannot configure neighbor list in "
2192 "automatic mode%s", VTY_NEWLINE);
2193 return CMD_WARNING;
2194 }
2195
2196 if (!strcmp(argv[0], "add"))
2197 bitvec_set_bit_pos(bv, arfcn, 1);
2198 else
2199 bitvec_set_bit_pos(bv, arfcn, 0);
2200
2201 return CMD_SUCCESS;
2202}
2203
Harald Weltef989b782011-02-15 11:43:27 +01002204DEFUN(cfg_bts_si5_neigh, cfg_bts_si5_neigh_cmd,
2205 "si5 neighbor-list (add|del) arfcn <0-1024>",
2206 "SI5 Neighbor List\n" "Add to manual SI5 neighbor list\n"
2207 "Delete from SI5 manual neighbor list\n" "ARFCN of neighbor\n"
2208 "ARFCN of neighbor\n")
2209{
2210 struct gsm_bts *bts = vty->index;
2211 struct bitvec *bv = &bts->si_common.si5_neigh_list;
2212 uint16_t arfcn = atoi(argv[1]);
2213
2214 if (!bts->neigh_list_manual_mode) {
2215 vty_out(vty, "%% Cannot configure neighbor list in "
2216 "automatic mode%s", VTY_NEWLINE);
2217 return CMD_WARNING;
2218 }
2219
2220 if (!strcmp(argv[0], "add"))
2221 bitvec_set_bit_pos(bv, arfcn, 1);
2222 else
2223 bitvec_set_bit_pos(bv, arfcn, 0);
2224
2225 return CMD_SUCCESS;
2226}
Harald Welted8acf142010-07-30 11:50:09 +02002227
Harald Welte9e002452010-05-11 21:53:49 +02002228#define TRX_TEXT "Radio Transceiver\n"
Harald Welte3e774612009-08-10 13:48:16 +02002229
Harald Welte59b04682009-06-10 05:40:52 +08002230/* per TRX configuration */
2231DEFUN(cfg_trx,
2232 cfg_trx_cmd,
2233 "trx TRX_NR",
Harald Welte9e002452010-05-11 21:53:49 +02002234 TRX_TEXT
Harald Welte59b04682009-06-10 05:40:52 +08002235 "Select a TRX to configure")
2236{
2237 int trx_nr = atoi(argv[0]);
2238 struct gsm_bts *bts = vty->index;
2239 struct gsm_bts_trx *trx;
2240
Harald Weltee712a5f2009-06-21 16:17:15 +02002241 if (trx_nr > bts->num_trx) {
2242 vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",
2243 bts->num_trx, VTY_NEWLINE);
Harald Welte59b04682009-06-10 05:40:52 +08002244 return CMD_WARNING;
Harald Weltee712a5f2009-06-21 16:17:15 +02002245 } else if (trx_nr == bts->num_trx) {
2246 /* we need to allocate a new one */
2247 trx = gsm_bts_trx_alloc(bts);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02002248 } else
Harald Weltee712a5f2009-06-21 16:17:15 +02002249 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freyther71135142010-03-29 08:47:44 +02002250
Harald Weltee712a5f2009-06-21 16:17:15 +02002251 if (!trx)
2252 return CMD_WARNING;
Harald Welte59b04682009-06-10 05:40:52 +08002253
2254 vty->index = trx;
Harald Welte8791dac2010-05-14 17:59:53 +02002255 vty->index_sub = &trx->description;
Harald Welte59b04682009-06-10 05:40:52 +08002256 vty->node = TRX_NODE;
2257
2258 return CMD_SUCCESS;
2259}
2260
2261DEFUN(cfg_trx_arfcn,
2262 cfg_trx_arfcn_cmd,
Harald Welte00044592010-05-14 19:00:52 +02002263 "arfcn <0-1024>",
Harald Welte59b04682009-06-10 05:40:52 +08002264 "Set the ARFCN for this TRX\n")
2265{
2266 int arfcn = atoi(argv[0]);
2267 struct gsm_bts_trx *trx = vty->index;
2268
2269 /* FIXME: check if this ARFCN is supported by this TRX */
2270
2271 trx->arfcn = arfcn;
2272
2273 /* FIXME: patch ARFCN into SYSTEM INFORMATION */
2274 /* FIXME: use OML layer to update the ARFCN */
2275 /* FIXME: use RSL layer to update SYSTEM INFORMATION */
2276
2277 return CMD_SUCCESS;
2278}
2279
Harald Welte (local)b709bfe2009-12-27 20:56:38 +01002280DEFUN(cfg_trx_nominal_power,
2281 cfg_trx_nominal_power_cmd,
2282 "nominal power <0-100>",
2283 "Nominal TRX RF Power in dB\n")
2284{
2285 struct gsm_bts_trx *trx = vty->index;
2286
2287 trx->nominal_power = atoi(argv[0]);
2288
2289 return CMD_SUCCESS;
2290}
2291
Harald Welte91afe4c2009-06-20 18:15:19 +02002292DEFUN(cfg_trx_max_power_red,
2293 cfg_trx_max_power_red_cmd,
2294 "max_power_red <0-100>",
2295 "Reduction of maximum BS RF Power in dB\n")
2296{
2297 int maxpwr_r = atoi(argv[0]);
2298 struct gsm_bts_trx *trx = vty->index;
Harald Welte01acd742009-11-18 09:20:22 +01002299 int upper_limit = 24; /* default 12.21 max power red. */
Harald Welte91afe4c2009-06-20 18:15:19 +02002300
2301 /* FIXME: check if our BTS type supports more than 12 */
2302 if (maxpwr_r < 0 || maxpwr_r > upper_limit) {
2303 vty_out(vty, "%% Power %d dB is not in the valid range%s",
2304 maxpwr_r, VTY_NEWLINE);
2305 return CMD_WARNING;
2306 }
2307 if (maxpwr_r & 1) {
2308 vty_out(vty, "%% Power %d dB is not an even value%s",
2309 maxpwr_r, VTY_NEWLINE);
2310 return CMD_WARNING;
2311 }
2312
2313 trx->max_power_red = maxpwr_r;
2314
2315 /* FIXME: make sure we update this using OML */
2316
2317 return CMD_SUCCESS;
2318}
2319
Harald Welte62868882009-08-08 16:12:58 +02002320DEFUN(cfg_trx_rsl_e1,
2321 cfg_trx_rsl_e1_cmd,
2322 "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
2323 "E1 interface to be used for RSL\n")
2324{
2325 struct gsm_bts_trx *trx = vty->index;
2326
2327 parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);
2328
2329 return CMD_SUCCESS;
2330}
2331
2332DEFUN(cfg_trx_rsl_e1_tei,
2333 cfg_trx_rsl_e1_tei_cmd,
2334 "rsl e1 tei <0-63>",
2335 "Set the TEI to be used for RSL")
2336{
2337 struct gsm_bts_trx *trx = vty->index;
2338
2339 trx->rsl_tei = atoi(argv[0]);
2340
2341 return CMD_SUCCESS;
2342}
2343
Holger Hans Peter Freyther1c8b4802009-11-11 11:54:24 +01002344DEFUN(cfg_trx_rf_locked,
2345 cfg_trx_rf_locked_cmd,
2346 "rf_locked (0|1)",
2347 "Turn off RF of the TRX.\n")
2348{
2349 int locked = atoi(argv[0]);
2350 struct gsm_bts_trx *trx = vty->index;
2351
2352 gsm_trx_lock_rf(trx, locked);
2353 return CMD_SUCCESS;
2354}
Harald Welte62868882009-08-08 16:12:58 +02002355
Harald Welte59b04682009-06-10 05:40:52 +08002356/* per TS configuration */
2357DEFUN(cfg_ts,
2358 cfg_ts_cmd,
Harald Welte62868882009-08-08 16:12:58 +02002359 "timeslot <0-7>",
Harald Welte59b04682009-06-10 05:40:52 +08002360 "Select a Timeslot to configure")
2361{
2362 int ts_nr = atoi(argv[0]);
2363 struct gsm_bts_trx *trx = vty->index;
2364 struct gsm_bts_trx_ts *ts;
2365
2366 if (ts_nr >= TRX_NR_TS) {
2367 vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",
2368 TRX_NR_TS, VTY_NEWLINE);
2369 return CMD_WARNING;
2370 }
2371
2372 ts = &trx->ts[ts_nr];
2373
2374 vty->index = ts;
2375 vty->node = TS_NODE;
2376
2377 return CMD_SUCCESS;
2378}
2379
Harald Welte3ffe1b32009-08-07 00:25:23 +02002380DEFUN(cfg_ts_pchan,
2381 cfg_ts_pchan_cmd,
2382 "phys_chan_config PCHAN",
2383 "Physical Channel configuration (TCH/SDCCH/...)")
2384{
2385 struct gsm_bts_trx_ts *ts = vty->index;
2386 int pchanc;
2387
2388 pchanc = gsm_pchan_parse(argv[0]);
2389 if (pchanc < 0)
2390 return CMD_WARNING;
2391
2392 ts->pchan = pchanc;
2393
2394 return CMD_SUCCESS;
2395}
2396
Harald Weltea42a93f2010-06-14 22:26:10 +02002397#define HOPPING_STR "Configure frequency hopping\n"
2398
2399DEFUN(cfg_ts_hopping,
2400 cfg_ts_hopping_cmd,
2401 "hopping enabled (0|1)",
2402 HOPPING_STR "Enable or disable frequency hopping\n"
2403 "Disable frequency hopping\n" "Enable frequency hopping\n")
2404{
2405 struct gsm_bts_trx_ts *ts = vty->index;
Harald Welte059c1ef2010-06-14 22:47:37 +02002406 int enabled = atoi(argv[0]);
Harald Weltea42a93f2010-06-14 22:26:10 +02002407
Harald Welte059c1ef2010-06-14 22:47:37 +02002408 if (enabled && !gsm_bts_has_feature(ts->trx->bts, BTS_FEAT_HOPPING)) {
2409 vty_out(vty, "BTS model does not support hopping%s",
2410 VTY_NEWLINE);
2411 return CMD_WARNING;
2412 }
2413
2414 ts->hopping.enabled = enabled;
Harald Weltea42a93f2010-06-14 22:26:10 +02002415
2416 return CMD_SUCCESS;
2417}
2418
Harald Welte67104d12009-09-12 13:05:33 +02002419DEFUN(cfg_ts_hsn,
2420 cfg_ts_hsn_cmd,
Harald Weltea42a93f2010-06-14 22:26:10 +02002421 "hopping sequence-number <0-63>",
2422 HOPPING_STR
Harald Welte67104d12009-09-12 13:05:33 +02002423 "Which hopping sequence to use for this channel")
2424{
2425 struct gsm_bts_trx_ts *ts = vty->index;
2426
2427 ts->hopping.hsn = atoi(argv[0]);
2428
2429 return CMD_SUCCESS;
2430}
2431
2432DEFUN(cfg_ts_maio,
2433 cfg_ts_maio_cmd,
2434 "hopping maio <0-63>",
Harald Weltea42a93f2010-06-14 22:26:10 +02002435 HOPPING_STR
Harald Welte67104d12009-09-12 13:05:33 +02002436 "Which hopping MAIO to use for this channel")
2437{
2438 struct gsm_bts_trx_ts *ts = vty->index;
2439
2440 ts->hopping.maio = atoi(argv[0]);
2441
2442 return CMD_SUCCESS;
2443}
2444
2445DEFUN(cfg_ts_arfcn_add,
2446 cfg_ts_arfcn_add_cmd,
2447 "hopping arfcn add <0-1023>",
Harald Weltea42a93f2010-06-14 22:26:10 +02002448 HOPPING_STR "Configure hopping ARFCN list\n"
2449 "Add an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte67104d12009-09-12 13:05:33 +02002450{
2451 struct gsm_bts_trx_ts *ts = vty->index;
2452 int arfcn = atoi(argv[0]);
2453
Harald Weltea42a93f2010-06-14 22:26:10 +02002454 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
2455
Harald Welte67104d12009-09-12 13:05:33 +02002456 return CMD_SUCCESS;
2457}
2458
2459DEFUN(cfg_ts_arfcn_del,
2460 cfg_ts_arfcn_del_cmd,
2461 "hopping arfcn del <0-1023>",
Harald Weltea42a93f2010-06-14 22:26:10 +02002462 HOPPING_STR "Configure hopping ARFCN list\n"
2463 "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")
Harald Welte67104d12009-09-12 13:05:33 +02002464{
2465 struct gsm_bts_trx_ts *ts = vty->index;
2466 int arfcn = atoi(argv[0]);
2467
Harald Weltea42a93f2010-06-14 22:26:10 +02002468 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
2469
Harald Welte67104d12009-09-12 13:05:33 +02002470 return CMD_SUCCESS;
2471}
2472
Harald Welte3ffe1b32009-08-07 00:25:23 +02002473DEFUN(cfg_ts_e1_subslot,
2474 cfg_ts_e1_subslot_cmd,
Harald Welte62868882009-08-08 16:12:58 +02002475 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Welte3ffe1b32009-08-07 00:25:23 +02002476 "E1 sub-slot connected to this on-air timeslot")
2477{
2478 struct gsm_bts_trx_ts *ts = vty->index;
2479
Harald Welte62868882009-08-08 16:12:58 +02002480 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Welte3ffe1b32009-08-07 00:25:23 +02002481
2482 return CMD_SUCCESS;
2483}
Harald Welte59b04682009-06-10 05:40:52 +08002484
Harald Weltea5b1dae2010-05-16 21:47:13 +02002485void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
2486{
2487 vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
2488 counter_get(net->stats.chreq.total),
2489 counter_get(net->stats.chreq.no_channel), VTY_NEWLINE);
2490 vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
2491 counter_get(net->stats.chan.rf_fail),
2492 counter_get(net->stats.chan.rll_err), VTY_NEWLINE);
2493 vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
2494 counter_get(net->stats.paging.attempted),
2495 counter_get(net->stats.paging.completed),
2496 counter_get(net->stats.paging.expired), VTY_NEWLINE);
2497 vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
2498 counter_get(net->stats.bts.oml_fail),
2499 counter_get(net->stats.bts.rsl_fail), VTY_NEWLINE);
2500}
2501
Harald Welte682ee5f2010-05-16 22:02:16 +02002502DEFUN(logging_fltr_imsi,
2503 logging_fltr_imsi_cmd,
2504 "logging filter imsi IMSI",
2505 LOGGING_STR FILTER_STR
2506 "Filter log messages by IMSI\n" "IMSI to be used as filter\n")
2507{
Harald Welte58bef962011-02-18 21:10:05 +01002508 struct log_target *tgt = osmo_log_vty2tgt(vty);
Harald Welte682ee5f2010-05-16 22:02:16 +02002509
Harald Welte58bef962011-02-18 21:10:05 +01002510 if (!tgt)
Harald Welte682ee5f2010-05-16 22:02:16 +02002511 return CMD_WARNING;
Harald Welte682ee5f2010-05-16 22:02:16 +02002512
Harald Welte58bef962011-02-18 21:10:05 +01002513 log_set_imsi_filter(tgt, argv[0]);
Harald Welte682ee5f2010-05-16 22:02:16 +02002514 return CMD_SUCCESS;
2515}
2516
Harald Welte58bef962011-02-18 21:10:05 +01002517
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02002518DEFUN(drop_bts,
2519 drop_bts_cmd,
Holger Hans Peter Freythere4ac0e42010-04-11 12:46:45 +02002520 "drop bts connection <0-65535> (oml|rsl)",
2521 "Debug/Simulation command to drop ipaccess BTS\n"
2522 "BTS NR\n" "Connection Type\n")
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02002523{
2524 struct gsm_network *gsmnet;
2525 struct gsm_bts_trx *trx;
2526 struct gsm_bts *bts;
2527 unsigned int bts_nr;
2528
2529 gsmnet = gsmnet_from_vty(vty);
2530
2531 bts_nr = atoi(argv[0]);
2532 if (bts_nr >= gsmnet->num_bts) {
2533 vty_out(vty, "BTS number must be between 0 and %d. It was %d.%s",
2534 gsmnet->num_bts, bts_nr, VTY_NEWLINE);
2535 return CMD_WARNING;
2536 }
2537
2538 bts = gsm_bts_num(gsmnet, bts_nr);
2539 if (!bts) {
2540 vty_out(vty, "BTS Nr. %d could not be found.%s", bts_nr, VTY_NEWLINE);
2541 return CMD_WARNING;
2542 }
2543
2544 if (!is_ipaccess_bts(bts)) {
2545 vty_out(vty, "This command only works for ipaccess.%s", VTY_NEWLINE);
2546 return CMD_WARNING;
2547 }
2548
2549
2550 /* close all connections */
2551 if (strcmp(argv[1], "oml") == 0) {
Holger Hans Peter Freyther03f17d02010-11-15 20:29:46 +01002552 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02002553 } else if (strcmp(argv[1], "rsl") == 0) {
2554 /* close all rsl connections */
2555 llist_for_each_entry(trx, &bts->trx_list, list) {
Holger Hans Peter Freyther03f17d02010-11-15 20:29:46 +01002556 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02002557 }
2558 } else {
2559 vty_out(vty, "Argument must be 'oml# or 'rsl'.%s", VTY_NEWLINE);
2560 return CMD_WARNING;
2561 }
2562
2563 return CMD_SUCCESS;
2564}
2565
Harald Welte5213e992010-12-23 13:18:07 +01002566DEFUN(pdch_act, pdch_act_cmd,
2567 "bts <0-255> trx <0-255> timeslot <0-7> pdch (activate|deactivate)",
2568 "BTS related commands\n" "BTS Number\n" "Transceiver\n" "Transceiver Number\n"
2569 "TRX Timeslot\n" "Timeslot Number\n" "Packet Data Channel\n"
2570 "Activate Dynamic PDCH/TCH (-> PDCH mode)\n"
2571 "Deactivate Dynamic PDCH/TCH (-> TCH mode)\n")
2572{
2573 struct gsm_bts *bts;
2574 struct gsm_bts_trx *trx;
2575 struct gsm_bts_trx_ts *ts;
2576 int bts_nr = atoi(argv[0]);
2577 int trx_nr = atoi(argv[1]);
2578 int ts_nr = atoi(argv[2]);
2579 int activate;
2580
2581 bts = gsm_bts_num(bsc_gsmnet, bts_nr);
2582 if (!bts) {
2583 vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
2584 return CMD_WARNING;
2585 }
2586
2587 if (!is_ipaccess_bts(bts)) {
2588 vty_out(vty, "%% This command only works for ipaccess BTS%s",
2589 VTY_NEWLINE);
2590 return CMD_WARNING;
2591 }
2592
2593 trx = gsm_bts_trx_num(bts, trx_nr);
2594 if (!trx) {
2595 vty_out(vty, "%% No such TRX (%d)%s", trx_nr, VTY_NEWLINE);
2596 return CMD_WARNING;
2597 }
2598
2599 ts = &trx->ts[ts_nr];
2600 if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) {
2601 vty_out(vty, "%% Timeslot %u is not in dynamic TCH_F/PDCH "
2602 "mode%s", ts_nr, VTY_NEWLINE);
2603 return CMD_WARNING;
2604 }
2605
2606 if (!strcmp(argv[3], "activate"))
2607 activate = 1;
2608 else
2609 activate = 0;
2610
2611 rsl_ipacc_pdch_activate(ts, activate);
2612
2613 return CMD_SUCCESS;
2614
2615}
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02002616
Harald Welte40152872010-05-16 20:52:23 +02002617extern int bsc_vty_init_extra(void);
Harald Welte10c29f62010-05-16 19:20:24 +02002618extern const char *openbsc_copyright;
Holger Hans Peter Freytherc48a2a12010-04-10 00:08:28 +02002619
Harald Welte40152872010-05-16 20:52:23 +02002620int bsc_vty_init(void)
Harald Welte59b04682009-06-10 05:40:52 +08002621{
Harald Welte7bc28f62010-05-12 16:10:35 +00002622 install_element_ve(&show_net_cmd);
2623 install_element_ve(&show_bts_cmd);
2624 install_element_ve(&show_trx_cmd);
2625 install_element_ve(&show_ts_cmd);
2626 install_element_ve(&show_lchan_cmd);
Holger Hans Peter Freythere959b4e2010-05-14 02:08:49 +08002627 install_element_ve(&show_lchan_summary_cmd);
Harald Welte682ee5f2010-05-16 22:02:16 +02002628 install_element_ve(&logging_fltr_imsi_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002629
Harald Welte7bc28f62010-05-12 16:10:35 +00002630 install_element_ve(&show_e1drv_cmd);
2631 install_element_ve(&show_e1line_cmd);
2632 install_element_ve(&show_e1ts_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002633
Harald Welte7bc28f62010-05-12 16:10:35 +00002634 install_element_ve(&show_paging_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002635
Harald Welte682ee5f2010-05-16 22:02:16 +02002636 logging_vty_add_cmds();
Harald Welte58bef962011-02-18 21:10:05 +01002637 install_element(CFG_LOG_NODE, &logging_fltr_imsi_cmd);
Holger Hans Peter Freytherc8d862e2009-12-22 22:32:51 +01002638
Harald Weltee87eb462009-08-07 13:29:14 +02002639 install_element(CONFIG_NODE, &cfg_net_cmd);
2640 install_node(&net_node, config_write_net);
2641 install_default(GSMNET_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +02002642 install_element(GSMNET_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +02002643 install_element(GSMNET_NODE, &ournode_end_cmd);
Harald Welte62868882009-08-08 16:12:58 +02002644 install_element(GSMNET_NODE, &cfg_net_ncc_cmd);
Harald Weltee87eb462009-08-07 13:29:14 +02002645 install_element(GSMNET_NODE, &cfg_net_mnc_cmd);
2646 install_element(GSMNET_NODE, &cfg_net_name_short_cmd);
2647 install_element(GSMNET_NODE, &cfg_net_name_long_cmd);
Harald Welte (local)a59a27e2009-08-12 14:42:23 +02002648 install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd);
Harald Welte59936d72009-11-18 20:33:19 +01002649 install_element(GSMNET_NODE, &cfg_net_reject_cause_cmd);
Harald Weltecca253a2009-08-30 15:47:06 +09002650 install_element(GSMNET_NODE, &cfg_net_encryption_cmd);
Holger Hans Peter Freyther96c89822009-11-16 17:12:38 +01002651 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Welte52af1952009-12-13 10:53:12 +01002652 install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd);
Harald Welte284ddba2009-12-14 17:49:15 +01002653 install_element(GSMNET_NODE, &cfg_net_mm_info_cmd);
Harald Welte0af9c9f2009-12-19 21:41:52 +01002654 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Weltea8062f12009-12-21 16:51:50 +01002655 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_cmd);
2656 install_element(GSMNET_NODE, &cfg_net_ho_win_rxqual_avg_cmd);
2657 install_element(GSMNET_NODE, &cfg_net_ho_win_rxlev_avg_neigh_cmd);
2658 install_element(GSMNET_NODE, &cfg_net_ho_pwr_interval_cmd);
2659 install_element(GSMNET_NODE, &cfg_net_ho_pwr_hysteresis_cmd);
2660 install_element(GSMNET_NODE, &cfg_net_ho_max_distance_cmd);
Holger Hans Peter Freyther26ba2e72009-11-21 21:18:38 +01002661 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +01002662 install_element(GSMNET_NODE, &cfg_net_T3103_cmd);
2663 install_element(GSMNET_NODE, &cfg_net_T3105_cmd);
2664 install_element(GSMNET_NODE, &cfg_net_T3107_cmd);
2665 install_element(GSMNET_NODE, &cfg_net_T3109_cmd);
2666 install_element(GSMNET_NODE, &cfg_net_T3111_cmd);
2667 install_element(GSMNET_NODE, &cfg_net_T3113_cmd);
2668 install_element(GSMNET_NODE, &cfg_net_T3115_cmd);
2669 install_element(GSMNET_NODE, &cfg_net_T3117_cmd);
2670 install_element(GSMNET_NODE, &cfg_net_T3119_cmd);
Harald Weltee2aaf442010-12-23 22:53:50 +01002671 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther89733862009-11-21 21:42:26 +01002672 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther21d63ff2010-09-06 09:25:48 +08002673 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freyther68b21e12010-12-22 16:26:04 +01002674 install_element(GSMNET_NODE, &cfg_net_subscr_keep_cmd);
Holger Hans Peter Freytherb6b9d702010-09-06 09:41:50 +08002675 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Weltee87eb462009-08-07 13:29:14 +02002676
2677 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte97ceef92009-08-06 19:06:46 +02002678 install_node(&bts_node, config_write_bts);
Harald Welte59b04682009-06-10 05:40:52 +08002679 install_default(BTS_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +02002680 install_element(BTS_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +02002681 install_element(BTS_NODE, &ournode_end_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002682 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte8791dac2010-05-14 17:59:53 +02002683 install_element(BTS_NODE, &cfg_description_cmd);
2684 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Welte91afe4c2009-06-20 18:15:19 +02002685 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freythera098dfb2009-08-21 14:44:12 +02002686 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002687 install_element(BTS_NODE, &cfg_bts_lac_cmd);
2688 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte62868882009-08-08 16:12:58 +02002689 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002690 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte25572872009-10-20 00:22:00 +02002691 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte62868882009-08-08 16:12:58 +02002692 install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
2693 install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
Harald Welte3e774612009-08-10 13:48:16 +02002694 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut8e2d8de2009-12-22 13:43:26 +01002695 install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
2696 install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
Holger Hans Peter Freyther697ed2b2010-04-25 23:08:39 +08002697 install_element(BTS_NODE, &cfg_bts_rach_nm_b_thresh_cmd);
2698 install_element(BTS_NODE, &cfg_bts_rach_nm_ldavg_cmd);
Harald Welte (local)e19be3f2009-08-12 13:28:23 +02002699 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther440984b2010-05-14 00:39:19 +08002700 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Harald Welte (local)cbd46102009-08-13 10:14:26 +02002701 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)b6ea7f72009-08-14 23:09:25 +02002702 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Harald Welteb761bf82009-12-12 18:17:25 +01002703 install_element(BTS_NODE, &cfg_bts_cell_resel_hyst_cmd);
2704 install_element(BTS_NODE, &cfg_bts_rxlev_acc_min_cmd);
Sylvain Munaut00d71462010-11-28 18:17:28 +01002705 install_element(BTS_NODE, &cfg_bts_cell_bar_qualify_cmd);
2706 install_element(BTS_NODE, &cfg_bts_cell_resel_ofs_cmd);
2707 install_element(BTS_NODE, &cfg_bts_temp_ofs_cmd);
2708 install_element(BTS_NODE, &cfg_bts_temp_ofs_inf_cmd);
2709 install_element(BTS_NODE, &cfg_bts_penalty_time_cmd);
2710 install_element(BTS_NODE, &cfg_bts_penalty_time_rsvd_cmd);
Harald Weltecb20b7a2010-04-18 15:51:20 +02002711 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
Harald Weltea9251762010-05-11 23:50:21 +02002712 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte3055e332010-03-14 15:37:43 +08002713 install_element(BTS_NODE, &cfg_bts_gprs_rac_cmd);
2714 install_element(BTS_NODE, &cfg_bts_gprs_bvci_cmd);
Harald Weltea9251762010-05-11 23:50:21 +02002715 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Welte4a048c52010-03-22 11:48:36 +08002716 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte3055e332010-03-14 15:37:43 +08002717 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welte410575a2010-03-14 23:30:30 +08002718 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd);
2719 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd);
2720 install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd);
Holger Hans Peter Freyther3112f672010-09-06 10:11:25 +08002721 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welted8acf142010-07-30 11:50:09 +02002722 install_element(BTS_NODE, &cfg_bts_si_mode_cmd);
2723 install_element(BTS_NODE, &cfg_bts_si_static_cmd);
Harald Welteca46eff2011-01-11 23:44:56 +01002724 install_element(BTS_NODE, &cfg_bts_neigh_mode_cmd);
2725 install_element(BTS_NODE, &cfg_bts_neigh_cmd);
Harald Weltef989b782011-02-15 11:43:27 +01002726 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002727
2728 install_element(BTS_NODE, &cfg_trx_cmd);
2729 install_node(&trx_node, dummy_config_write);
2730 install_default(TRX_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +02002731 install_element(TRX_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +02002732 install_element(TRX_NODE, &ournode_end_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002733 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte8791dac2010-05-14 17:59:53 +02002734 install_element(TRX_NODE, &cfg_description_cmd);
2735 install_element(TRX_NODE, &cfg_no_description_cmd);
Harald Welte (local)b709bfe2009-12-27 20:56:38 +01002736 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte7f597bc2009-06-20 22:36:12 +02002737 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte62868882009-08-08 16:12:58 +02002738 install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);
2739 install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);
Holger Hans Peter Freyther1c8b4802009-11-11 11:54:24 +01002740 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002741
2742 install_element(TRX_NODE, &cfg_ts_cmd);
2743 install_node(&ts_node, dummy_config_write);
2744 install_default(TS_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +02002745 install_element(TS_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +02002746 install_element(TS_NODE, &ournode_end_cmd);
Harald Welte3ffe1b32009-08-07 00:25:23 +02002747 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Weltea42a93f2010-06-14 22:26:10 +02002748 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte67104d12009-09-12 13:05:33 +02002749 install_element(TS_NODE, &cfg_ts_hsn_cmd);
2750 install_element(TS_NODE, &cfg_ts_maio_cmd);
2751 install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);
2752 install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);
Harald Welte3ffe1b32009-08-07 00:25:23 +02002753 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte59b04682009-06-10 05:40:52 +08002754
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02002755 install_element(ENABLE_NODE, &drop_bts_cmd);
Harald Welte5213e992010-12-23 13:18:07 +01002756 install_element(ENABLE_NODE, &pdch_act_cmd);
Holger Hans Peter Freyther07ff1c32010-10-26 09:40:13 +02002757
Harald Welte63b964e2010-05-31 16:40:40 +02002758 abis_nm_vty_init();
Harald Welte1d5a2062011-02-12 14:42:59 +01002759 abis_om2k_vty_init();
Harald Weltee76bea02011-02-05 13:54:41 +01002760 e1inp_vty_init();
Harald Welte63b964e2010-05-31 16:40:40 +02002761
Harald Welte40152872010-05-16 20:52:23 +02002762 bsc_vty_init_extra();
Harald Welte59b04682009-06-10 05:40:52 +08002763
2764 return 0;
2765}