blob: e5e424cec9ad91bce3b53190b4d9795a3317848d [file] [log] [blame]
Harald Welte68628e82009-03-10 12:17:57 +00001/* OpenBSC interface to quagga VTY */
Harald Welteaf387632010-03-14 23:30:30 +08002/* (C) 2009-2010 by Harald Welte <laforge@gnumonks.org>
Harald Welte68628e82009-03-10 12:17:57 +00003 * All Rights Reserved
4 *
5 * This program is free software; you can redistribute it and/or modify
Harald Welte9af6ddf2011-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 Welte68628e82009-03-10 12:17:57 +00008 * (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 Welte9af6ddf2011-01-01 15:25:50 +010013 * GNU Affero General Public License for more details.
Harald Welte68628e82009-03-10 12:17:57 +000014 *
Harald Welte9af6ddf2011-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 Welte68628e82009-03-10 12:17:57 +000017 *
18 */
19
20#include <stdlib.h>
21#include <unistd.h>
22#include <sys/types.h>
23
Harald Welte4b037e42010-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 Welte68628e82009-03-10 12:17:57 +000029
30#include <arpa/inet.h>
31
Harald Weltedfe6c7d2010-02-20 16:24:02 +010032#include <osmocore/linuxlist.h>
Harald Welte68628e82009-03-10 12:17:57 +000033#include <openbsc/gsm_data.h>
Harald Welte68628e82009-03-10 12:17:57 +000034#include <openbsc/e1_input.h>
Harald Welte1bc77352009-03-10 19:47:51 +000035#include <openbsc/abis_nm.h>
Harald Welte4d54d0b2011-02-19 16:48:17 +010036#include <openbsc/abis_om2000.h>
Harald Welte9fbff4a2010-07-30 11:50:09 +020037#include <osmocore/utils.h>
Harald Weltedfe6c7d2010-02-20 16:24:02 +010038#include <osmocore/gsm_utils.h>
Harald Welteb908cb72009-12-22 13:09:29 +010039#include <openbsc/chan_alloc.h>
Harald Welte8387a492009-12-22 21:43:14 +010040#include <openbsc/meas_rep.h>
Harald Welte40f82892009-05-23 17:31:39 +000041#include <openbsc/db.h>
Harald Weltedfe6c7d2010-02-20 16:24:02 +010042#include <osmocore/talloc.h>
Holger Hans Peter Freyther3c712322010-04-06 11:55:37 +020043#include <openbsc/vty.h>
Harald Welte22229d62010-05-12 20:28:04 +020044#include <openbsc/gprs_ns.h>
Harald Welte9fbff4a2010-07-30 11:50:09 +020045#include <openbsc/system_information.h>
Harald Welte5bc61dc2010-05-16 22:02:16 +020046#include <openbsc/debug.h>
Holger Hans Peter Freyther85334f12010-11-09 17:00:42 +010047#include <openbsc/paging.h>
Holger Hans Peter Freytherdab8e272010-11-15 20:29:46 +010048#include <openbsc/ipaccess.h>
Harald Welted0d2b0b2010-12-23 13:18:07 +010049#include <openbsc/abis_rsl.h>
Harald Welte68628e82009-03-10 12:17:57 +000050
Harald Welte1353f962010-05-16 19:20:24 +020051#include "../bscconfig.h"
52
Harald Welteea4647d2010-05-12 17:19:53 +000053/* FIXME: this should go to some common file */
54static const struct value_string gprs_ns_timer_strs[] = {
Harald Welte615e9562010-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 Welteea4647d2010-05-12 17:19:53 +000065static const struct value_string gprs_bssgp_cfg_strs[] = {
Harald Welte615e9562010-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 Welte64c07d22011-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 Welte5013b2a2009-08-07 13:29:14 +020087struct cmd_node net_node = {
88 GSMNET_NODE,
89 "%s(network)#",
90 1,
91};
92
Harald Welte68628e82009-03-10 12:17:57 +000093struct 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 Welte39231152010-05-27 13:39:40 +0200111extern struct gsm_network *bsc_gsmnet;
112
Harald Weltedcccb182010-05-16 20:52:23 +0200113struct gsm_network *gsmnet_from_vty(struct vty *v)
114{
Harald Welte39231152010-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 Weltedcccb182010-05-16 20:52:23 +0200119 struct telnet_connection *conn = v->priv;
120 return (struct gsm_network *) conn->priv;
Harald Welte39231152010-05-27 13:39:40 +0200121#else
122 return bsc_gsmnet;
123#endif
Harald Weltedcccb182010-05-16 20:52:23 +0200124}
125
Harald Welte68628e82009-03-10 12:17:57 +0000126static 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{
Harald Welte1bc77352009-03-10 19:47:51 +0000133 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);
Harald Welte68628e82009-03-10 12:17:57 +0000136}
137
Harald Welteb908cb72009-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 Welte68628e82009-03-10 12:17:57 +0000158static void net_dump_vty(struct vty *vty, struct gsm_network *net)
159{
Harald Welteb908cb72009-12-22 13:09:29 +0100160 struct pchan_load pl;
161
Harald Welteef235b52009-03-10 12:34:02 +0000162 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);
Harald Welte1bc77352009-03-10 19:47:51 +0000165 vty_out(vty, " Long network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000166 net->name_long, VTY_NEWLINE);
Harald Welte1bc77352009-03-10 19:47:51 +0000167 vty_out(vty, " Short network name: '%s'%s",
Harald Welte68628e82009-03-10 12:17:57 +0000168 net->name_short, VTY_NEWLINE);
Harald Welte (local)69de3972009-08-12 14:42:23 +0200169 vty_out(vty, " Authentication policy: %s%s",
170 gsm_auth_policy_name(net->auth_policy), VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100171 vty_out(vty, " Location updating reject cause: %u%s",
172 net->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900173 vty_out(vty, " Encryption: A5/%u%s", net->a5_encryption,
174 VTY_NEWLINE);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +0100175 vty_out(vty, " NECI (TCH/H): %u%s", net->neci,
176 VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800177 vty_out(vty, " Use TCH for Paging any: %d%s", net->pag_any_tch,
178 VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100179 vty_out(vty, " RRLP Mode: %s%s", rrlp_mode_name(net->rrlp.mode),
180 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100181 vty_out(vty, " MM Info: %s%s", net->send_mm_info ? "On" : "Off",
182 VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100183 vty_out(vty, " Handover: %s%s", net->handover.active ? "On" : "Off",
184 VTY_NEWLINE);
Harald Welteb908cb72009-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 Welte68628e82009-03-10 12:17:57 +0000188}
189
190DEFUN(show_net, show_net_cmd, "show network",
191 SHOW_STR "Display information about a GSM NETWORK\n")
192{
Harald Weltedcccb182010-05-16 20:52:23 +0200193 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000194 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{
Harald Welteedb37782009-05-01 14:59:07 +0000201 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,
Harald Welte1bc77352009-03-10 19:47:51 +0000212 e1inp_signtype_name(e1l->type), VTY_NEWLINE);
Harald Welteedb37782009-05-01 14:59:07 +0000213 vty_out(vty, " E1 TEI %u, SAPI %u%s",
Harald Welte68628e82009-03-10 12:17:57 +0000214 e1l->tei, e1l->sapi, VTY_NEWLINE);
215}
216
217static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
218{
Harald Welteb908cb72009-12-22 13:09:29 +0100219 struct pchan_load pl;
220
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200221 vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, "
Harald Weltefcd24452009-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 Freytherc4a49e32009-08-21 14:44:12 +0200224 bts->cell_identity,
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +0200225 bts->location_area_code, bts->bsic, bts->tsc,
Harald Weltefcd24452009-06-20 18:15:19 +0200226 bts->num_trx, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200227 vty_out(vty, "Description: %s%s",
228 bts->description ? bts->description : "(null)", VTY_NEWLINE);
Harald Welte1d8dbc42009-12-12 15:38:16 +0100229 vty_out(vty, "MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-12-12 18:17:25 +0100230 vty_out(vty, "Minimum Rx Level for Access: %i dBm%s",
Harald Welte1d8dbc42009-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 Welte73225282009-12-12 18:17:25 +0100234 bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
Sylvain Munaut4010f1e2009-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 Welte71355012009-12-21 23:08:18 +0100240 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200241 vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
Harald Welte9fbff4a2010-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 Welte4cc34222009-05-01 15:12:31 +0000244 if (is_ipaccess_bts(bts))
Harald Welte8175e952009-10-20 00:22:00 +0200245 vty_out(vty, " Unit ID: %u/%u/0, OML Stream ID 0x%02x%s",
Harald Welte4cc34222009-05-01 15:12:31 +0000246 bts->ip_access.site_id, bts->ip_access.bts_id,
Harald Welte8175e952009-10-20 00:22:00 +0200247 bts->oml_tei, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000248 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 Freytherd283db42010-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 Welte8175e952009-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 Freytherd283db42010-11-25 16:28:45 +0100261
262 /* FIXME: chan_desc */
Harald Welteb908cb72009-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 Welte68628e82009-03-10 12:17:57 +0000267}
268
269DEFUN(show_bts, show_bts_cmd, "show bts [number]",
270 SHOW_STR "Display information about a BTS\n"
271 "BTS number")
272{
Harald Weltedcccb182010-05-16 20:52:23 +0200273 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000274 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 Welte712ddbc2010-12-24 12:24:03 +0100279 if (bts_nr >= net->num_bts) {
Harald Welte1bc77352009-03-10 19:47:51 +0000280 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000281 VTY_NEWLINE);
282 return CMD_WARNING;
283 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200284 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000285 return CMD_SUCCESS;
286 }
287 /* print all BTS's */
288 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
Harald Weltee441d9c2009-06-21 16:17:15 +0200289 bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
Harald Welte68628e82009-03-10 12:17:57 +0000290
291 return CMD_SUCCESS;
292}
293
Harald Welte42581822009-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 Welte67ce0732009-08-06 19:06:46 +0200322static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)
323{
Harald Welte42581822009-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 Weltea39b0f22010-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 Welte6e0cd042009-09-12 13:05:33 +0200333 ts->hopping.hsn, VTY_NEWLINE);
Harald Weltea39b0f22010-06-14 22:26:10 +0200334 vty_out(vty, " hopping maio %u%s",
Harald Welte6e0cd042009-09-12 13:05:33 +0200335 ts->hopping.maio, VTY_NEWLINE);
Harald Weltea39b0f22010-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 Welte127af342010-12-24 12:07:07 +0100342 }
Harald Welte42581822009-08-08 16:12:58 +0200343 config_write_e1_link(vty, &ts->e1_link, " ");
Harald Welteface7ed2011-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 Welte67ce0732009-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 Welte5013b2a2009-08-07 13:29:14 +0200353 vty_out(vty, " trx %u%s", trx->nr, VTY_NEWLINE);
Harald Welte197dea92010-05-14 17:59:53 +0200354 if (trx->description)
355 vty_out(vty, " description %s%s", trx->description,
356 VTY_NEWLINE);
Holger Hans Peter Freyther2ba40af2010-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 Welte5013b2a2009-08-07 13:29:14 +0200360 vty_out(vty, " arfcn %u%s", trx->arfcn, VTY_NEWLINE);
Harald Welte (local)7b37d972009-12-27 20:56:38 +0100361 vty_out(vty, " nominal power %u%s", trx->nominal_power, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200362 vty_out(vty, " max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);
Harald Welte42581822009-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 Welte67ce0732009-08-06 19:06:46 +0200365
Harald Welteface7ed2011-02-14 16:15:21 +0100366 if (trx->bts->model->config_write_trx)
367 trx->bts->model->config_write_trx(vty, trx);
368
Harald Welte67ce0732009-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 Welte615e9562010-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 Welte67ce0732009-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 Welte9fbff4a2010-07-30 11:50:09 +0200415 int i;
Harald Welte67ce0732009-08-06 19:06:46 +0200416
Harald Welte5013b2a2009-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 Welte197dea92010-05-14 17:59:53 +0200419 if (bts->description)
420 vty_out(vty, " description %s%s", bts->description, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200421 vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE);
Holger Hans Peter Freytherf926ed62009-11-19 16:38:49 +0100422 vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200423 vty_out(vty, " location_area_code %u%s", bts->location_area_code,
Harald Welte67ce0732009-08-06 19:06:46 +0200424 VTY_NEWLINE);
Harald Welte5013b2a2009-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)0e451d02009-08-13 10:14:26 +0200427 vty_out(vty, " ms max power %u%s", bts->ms_max_power, VTY_NEWLINE);
Harald Welte73225282009-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 Munaute0b06b02010-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 Weltea43f7892009-12-01 18:04:30 +0530460 if (bts->si_common.chan_desc.t3212)
Harald Welte (local)efc92312009-08-14 23:09:25 +0200461 vty_out(vty, " periodic location update %u%s",
Dieter Spaard6613e02010-10-05 21:10:55 +0200462 bts->si_common.chan_desc.t3212 * 6, VTY_NEWLINE);
Harald Welte7a8fa412009-08-10 13:48:16 +0200463 vty_out(vty, " channel allocator %s%s",
464 bts->chan_alloc_reverse ? "descending" : "ascending",
465 VTY_NEWLINE);
Sylvain Munaut4010f1e2009-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 Freyther95c22902010-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 Welte71355012009-12-21 23:08:18 +0100478 if (bts->si_common.rach_control.cell_bar)
Harald Welte (local)5dececf2009-08-12 13:28:23 +0200479 vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
Holger Hans Peter Freyther3a0a4632010-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 Welte9fbff4a2010-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 Welte8175e952009-10-20 00:22:00 +0200492 if (is_ipaccess_bts(bts)) {
Harald Welte5013b2a2009-08-07 13:29:14 +0200493 vty_out(vty, " ip.access unit_id %u %u%s",
Harald Weltea6fd58e2009-08-07 00:25:23 +0200494 bts->ip_access.site_id, bts->ip_access.bts_id, VTY_NEWLINE);
Harald Welte8175e952009-10-20 00:22:00 +0200495 vty_out(vty, " oml ip.access stream_id %u%s", bts->oml_tei, VTY_NEWLINE);
496 } else {
Harald Welte42581822009-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 Freythere66bf1f2010-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 Welte32c09622011-01-11 23:44:56 +0100505 vty_out(vty, " neighbor-list mode %s%s",
Harald Welte64c07d22011-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 Welte32c09622011-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 Welte64c07d22011-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 Welte32c09622011-01-11 23:44:56 +0100521
Harald Welte615e9562010-05-11 23:50:21 +0200522 config_write_bts_gprs(vty, bts);
Harald Welte67ce0732009-08-06 19:06:46 +0200523
Harald Welteface7ed2011-02-14 16:15:21 +0100524 if (bts->model->config_write_bts)
525 bts->model->config_write_bts(vty, bts);
526
Harald Welte67ce0732009-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 Weltedcccb182010-05-16 20:52:23 +0200533 struct gsm_network *gsmnet = gsmnet_from_vty(v);
Harald Welte67ce0732009-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 Welte5013b2a2009-08-07 13:29:14 +0200542static int config_write_net(struct vty *vty)
543{
Harald Weltedcccb182010-05-16 20:52:23 +0200544 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
545
Harald Welte5013b2a2009-08-07 13:29:14 +0200546 vty_out(vty, "network%s", VTY_NEWLINE);
Harald Welte42581822009-08-08 16:12:58 +0200547 vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200548 vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE);
Harald Welte42581822009-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)69de3972009-08-12 14:42:23 +0200551 vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE);
Harald Welte1085c092009-11-18 20:33:19 +0100552 vty_out(vty, " location updating reject cause %u%s",
553 gsmnet->reject_cause, VTY_NEWLINE);
Harald Welte4381cfe2009-08-30 15:47:06 +0900554 vty_out(vty, " encryption a5 %u%s", gsmnet->a5_encryption, VTY_NEWLINE);
Holger Hans Peter Freytherd54c3372009-11-19 16:37:48 +0100555 vty_out(vty, " neci %u%s", gsmnet->neci, VTY_NEWLINE);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +0800556 vty_out(vty, " paging any use tch %d%s", gsmnet->pag_any_tch, VTY_NEWLINE);
Harald Welteeab84a12009-12-13 10:53:12 +0100557 vty_out(vty, " rrlp mode %s%s", rrlp_mode_name(gsmnet->rrlp.mode),
558 VTY_NEWLINE);
Harald Welte648b6ce2009-12-14 09:00:24 +0100559 vty_out(vty, " mm info %u%s", gsmnet->send_mm_info, VTY_NEWLINE);
Harald Weltebc814502009-12-19 21:41:52 +0100560 vty_out(vty, " handover %u%s", gsmnet->handover.active, VTY_NEWLINE);
Harald Welteb720bd32009-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 Freytherc4d88ad2009-11-21 21:18:38 +0100573 vty_out(vty, " timer t3101 %u%s", gsmnet->T3101, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-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 Welte2862dca2010-12-23 14:39:29 +0100583 vty_out(vty, " timer t3122 %u%s", gsmnet->T3122, VTY_NEWLINE);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100584 vty_out(vty, " timer t3141 %u%s", gsmnet->T3141, VTY_NEWLINE);
Harald Welte63dbfc62010-12-15 15:34:23 +0100585 vty_out(vty, " dtx-used %u%s", gsmnet->dtx_enabled, VTY_NEWLINE);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +0100586 vty_out(vty, " subscriber-keep-in-ram %d%s",
587 gsmnet->keep_subscr, VTY_NEWLINE);
Harald Welte5013b2a2009-08-07 13:29:14 +0200588
589 return CMD_SUCCESS;
590}
Harald Welte67ce0732009-08-06 19:06:46 +0200591
Harald Welte68628e82009-03-10 12:17:57 +0000592static 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 Welte197dea92010-05-14 17:59:53 +0200596 vty_out(vty, "Description: %s%s",
597 trx->description ? trx->description : "(null)", VTY_NEWLINE);
Harald Weltefcd24452009-06-20 18:15:19 +0200598 vty_out(vty, " RF Nominal Power: %d dBm, reduced by %u dB, "
Harald Welte42581822009-08-08 16:12:58 +0200599 "resulting BS power: %d dBm%s",
Harald Weltefcd24452009-06-20 18:15:19 +0200600 trx->nominal_power, trx->max_power_red,
Harald Welte42581822009-08-08 16:12:58 +0200601 trx->nominal_power - trx->max_power_red, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000602 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 Welte8175e952009-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 Welte68628e82009-03-10 12:17:57 +0000613}
614
615DEFUN(show_trx,
616 show_trx_cmd,
617 "show trx [bts_nr] [trx_nr]",
Harald Welte8f0ed552010-05-11 21:53:49 +0200618 SHOW_STR "Display information about a TRX\n"
619 "BTS Number\n"
620 "TRX Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000621{
Harald Weltedcccb182010-05-16 20:52:23 +0200622 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000623 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) {
Harald Welte1bc77352009-03-10 19:47:51 +0000631 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000632 VTY_NEWLINE);
633 return CMD_WARNING;
634 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200635 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000636 }
637 if (argc >= 2) {
638 trx_nr = atoi(argv[1]);
639 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000640 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000641 VTY_NEWLINE);
642 return CMD_WARNING;
643 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200644 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000645 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 Weltee441d9c2009-06-21 16:17:15 +0200651 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000652 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 Weltee441d9c2009-06-21 16:17:15 +0200658 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000659 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200660 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000661 trx_dump_vty(vty, trx);
662 }
663 }
664
665 return CMD_SUCCESS;
666}
667
Harald Welte67ce0732009-08-06 19:06:46 +0200668
Harald Welte68628e82009-03-10 12:17:57 +0000669static void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)
670{
Harald Weltecd103a92010-12-24 12:14:52 +0100671 vty_out(vty, "BTS %u, TRX %u, Timeslot %u, phys cfg %s",
Harald Welte026b4ca2010-12-24 12:12:10 +0100672 ts->trx->bts->nr, ts->trx->nr, ts->nr,
Harald Weltecd103a92010-12-24 12:14:52 +0100673 gsm_pchan_name(ts->pchan));
674 if (ts->pchan == GSM_PCHAN_TCH_F_PDCH)
Harald Welteb29cea12010-12-24 12:26:13 +0100675 vty_out(vty, " (%s mode)",
Harald Weltecd103a92010-12-24 12:14:52 +0100676 ts->flags & TS_F_PDCH_MODE ? "PDCH" : "TCH/F");
677 vty_out(vty, "%s", VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000678 vty_out(vty, " NM State: ");
679 net_dump_nmstate(vty, &ts->nm_state);
Harald Welte2c828992009-12-02 01:56:49 +0530680 if (!is_ipaccess_bts(ts->trx->bts))
Harald Welteef235b52009-03-10 12:34:02 +0000681 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 Welte68628e82009-03-10 12:17:57 +0000684}
685
686DEFUN(show_ts,
687 show_ts_cmd,
Harald Welte1bc77352009-03-10 19:47:51 +0000688 "show timeslot [bts_nr] [trx_nr] [ts_nr]",
Harald Welte8f0ed552010-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 Welte68628e82009-03-10 12:17:57 +0000691{
Harald Weltedcccb182010-05-16 20:52:23 +0200692 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte274d0152010-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 Welte68628e82009-03-10 12:17:57 +0000696 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) {
Harald Welte1bc77352009-03-10 19:47:51 +0000702 vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
Harald Welte68628e82009-03-10 12:17:57 +0000703 VTY_NEWLINE);
704 return CMD_WARNING;
705 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200706 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000707 }
708 if (argc >= 2) {
709 trx_nr = atoi(argv[1]);
710 if (trx_nr >= bts->num_trx) {
Harald Welte1bc77352009-03-10 19:47:51 +0000711 vty_out(vty, "%% can't find TRX '%s'%s", argv[1],
Harald Welte68628e82009-03-10 12:17:57 +0000712 VTY_NEWLINE);
713 return CMD_WARNING;
714 }
Harald Weltee441d9c2009-06-21 16:17:15 +0200715 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000716 }
717 if (argc >= 3) {
718 ts_nr = atoi(argv[2]);
719 if (ts_nr >= TRX_NR_TS) {
Harald Welte1bc77352009-03-10 19:47:51 +0000720 vty_out(vty, "%% can't find TS '%s'%s", argv[2],
Harald Welte68628e82009-03-10 12:17:57 +0000721 VTY_NEWLINE);
722 return CMD_WARNING;
723 }
Harald Welte274d0152010-12-24 12:05:03 +0100724 /* Fully Specified: print and exit */
Harald Welte68628e82009-03-10 12:17:57 +0000725 ts = &trx->ts[ts_nr];
726 ts_dump_vty(vty, ts);
727 return CMD_SUCCESS;
728 }
Harald Welte274d0152010-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 Welte68628e82009-03-10 12:17:57 +0000738 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200739 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000740 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 Welte274d0152010-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 Welte68628e82009-03-10 12:17:57 +0000757 }
758
759 return CMD_SUCCESS;
760}
761
Holger Hans Peter Freyther424c4f02010-01-06 06:00:40 +0100762static void subscr_dump_vty(struct vty *vty, struct gsm_subscriber *subscr)
Harald Welte68628e82009-03-10 12:17:57 +0000763{
Harald Weltefcd24452009-06-20 18:15:19 +0200764 vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
Harald Welte40f82892009-05-23 17:31:39 +0000765 subscr->authorized, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000766 if (subscr->name)
Harald Welte1bc77352009-03-10 19:47:51 +0000767 vty_out(vty, " Name: '%s'%s", subscr->name, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000768 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 Freyther22230252009-08-19 12:53:57 +0200773 if (subscr->tmsi != GSM_RESERVED_TMSI)
774 vty_out(vty, " TMSI: %08X%s", subscr->tmsi,
Harald Welte731fd912009-08-15 03:24:51 +0200775 VTY_NEWLINE);
Sylvain Munautaf292642009-12-27 19:29:28 +0100776
Harald Welte (local)15920de2009-08-14 20:27:16 +0200777 vty_out(vty, " Use count: %u%s", subscr->use_count, VTY_NEWLINE);
Harald Welte68628e82009-03-10 12:17:57 +0000778}
779
Harald Welte8387a492009-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 Freyther029235e2010-05-14 02:03:16 +0800814static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
Harald Welte68628e82009-03-10 12:17:57 +0000815{
Harald Welte8387a492009-12-22 21:43:14 +0100816 int idx;
817
Harald Welte85bded82010-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 Freyther40494552010-06-28 17:09:29 +0800821 vty_out(vty, " Connection: %u, State: %s%s",
822 lchan->conn ? 1: 0,
Harald Welte1887f9d2009-12-29 10:52:38 +0100823 gsm_lchans_name(lchan->state), VTY_NEWLINE);
Harald Welte73225282009-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 Freyther2412a072010-06-28 15:47:12 +0800829 if (lchan->conn && lchan->conn->subscr) {
Harald Welte68628e82009-03-10 12:17:57 +0000830 vty_out(vty, " Subscriber:%s", VTY_NEWLINE);
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +0800831 subscr_dump_vty(vty, lchan->conn->subscr);
Harald Welte68628e82009-03-10 12:17:57 +0000832 } else
833 vty_out(vty, " No Subscriber%s", VTY_NEWLINE);
Harald Welte2c828992009-12-02 01:56:49 +0530834 if (is_ipaccess_bts(lchan->ts->trx->bts)) {
835 struct in_addr ia;
Holger Hans Peter Freyther54fa7992010-04-07 15:39:16 +0200836 ia.s_addr = htonl(lchan->abis_ip.bound_ip);
Harald Welte2c828992009-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 Welte8387a492009-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 Welte68628e82009-03-10 12:17:57 +0000847}
848
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +0800849static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
850{
Holger Hans Peter Freythercf5cc5b2010-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 Welte85bded82010-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 Welteb29cea12010-12-24 12:26:13 +0100862 lchan->nr, gsm_lchant_name(lchan->type), mr->ms_l1.pwr,
Holger Hans Peter Freythercf5cc5b2010-05-14 01:57:02 +0800863 rxlev2dbm(mr->dl.full.rx_lev),
864 rxlev2dbm(mr->ul.full.rx_lev),
Holger Hans Peter Freyther3d6a5d62010-05-14 02:08:49 +0800865 VTY_NEWLINE);
866}
867
Holger Hans Peter Freyther029235e2010-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 Welte68628e82009-03-10 12:17:57 +0000870{
Harald Weltedcccb182010-05-16 20:52:23 +0200871 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Welte68628e82009-03-10 12:17:57 +0000872 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 Weltee441d9c2009-06-21 16:17:15 +0200886 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000887 }
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 Weltee441d9c2009-06-21 16:17:15 +0200895 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000896 }
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 Freyther029235e2010-05-14 02:03:16 +0800914 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +0000915 return CMD_SUCCESS;
916 }
917 for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200918 bts = gsm_bts_num(net, bts_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000919 for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200920 trx = gsm_bts_trx_num(bts, trx_nr);
Harald Welte68628e82009-03-10 12:17:57 +0000921 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];
Harald Welteef235b52009-03-10 12:34:02 +0000926 if (lchan->type == GSM_LCHAN_NONE)
927 continue;
Holger Hans Peter Freyther029235e2010-05-14 02:03:16 +0800928 dump_cb(vty, lchan);
Harald Welte68628e82009-03-10 12:17:57 +0000929 }
930 }
931 }
932 }
933
934 return CMD_SUCCESS;
935}
936
Holger Hans Peter Freyther029235e2010-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 Freyther3d6a5d62010-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 Welte1bc77352009-03-10 19:47:51 +0000959static 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
Harald Welte68628e82009-03-10 12:17:57 +0000977static 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 Welte8f0ed552010-05-11 21:53:49 +0200987 SHOW_STR "Display information about a E1 line\n"
988 "E1 Line Number\n")
Harald Welte68628e82009-03-10 12:17:57 +0000989{
Harald Welte1bc77352009-03-10 19:47:51 +0000990 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;
Harald Welte68628e82009-03-10 12:17:57 +00001007}
1008
1009static void e1ts_dump_vty(struct vty *vty, struct e1inp_ts *ts)
1010{
Harald Welte42581822009-08-08 16:12:58 +02001011 if (ts->type == E1INP_TS_TYPE_NONE)
1012 return;
Harald Welte1bc77352009-03-10 19:47:51 +00001013 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);
Harald Welte68628e82009-03-10 12:17:57 +00001016}
1017
1018DEFUN(show_e1ts,
1019 show_e1ts_cmd,
1020 "show e1_timeslot [line_nr] [ts_nr]",
Harald Welte8f0ed552010-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 Welte68628e82009-03-10 12:17:57 +00001023{
Harald Welte986c3d72009-11-17 06:12:16 +01001024 struct e1inp_line *line = NULL;
Harald Welte1bc77352009-03-10 19:47:51 +00001025 struct e1inp_ts *ts;
1026 int ts_nr;
Harald Welte68628e82009-03-10 12:17:57 +00001027
Harald Welte1bc77352009-03-10 19:47:51 +00001028 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;
Harald Welte68628e82009-03-10 12:17:57 +00001067}
1068
Harald Weltebe4b7302009-05-23 16:59:33 +00001069static void paging_dump_vty(struct vty *vty, struct gsm_paging_request *pag)
Harald Weltef5025b62009-03-28 16:55:11 +00001070{
1071 vty_out(vty, "Paging on BTS %u%s", pag->bts->nr, VTY_NEWLINE);
1072 subscr_dump_vty(vty, pag->subscr);
1073}
1074
Harald Weltebe4b7302009-05-23 16:59:33 +00001075static void bts_paging_dump_vty(struct vty *vty, struct gsm_bts *bts)
Harald Weltef5025b62009-03-28 16:55:11 +00001076{
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 Welte8f0ed552010-05-11 21:53:49 +02001086 SHOW_STR "Display information about paging reuqests of a BTS\n"
1087 "BTS Number\n")
Harald Weltef5025b62009-03-28 16:55:11 +00001088{
Harald Weltedcccb182010-05-16 20:52:23 +02001089 struct gsm_network *net = gsmnet_from_vty(vty);
Harald Weltef5025b62009-03-28 16:55:11 +00001090 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 Weltee441d9c2009-06-21 16:17:15 +02001101 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001102 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 Weltee441d9c2009-06-21 16:17:15 +02001107 bts = gsm_bts_num(net, bts_nr);
Harald Weltef5025b62009-03-28 16:55:11 +00001108 bts_paging_dump_vty(vty, bts);
1109 }
1110
1111 return CMD_SUCCESS;
1112}
1113
Harald Welte8f0ed552010-05-11 21:53:49 +02001114#define NETWORK_STR "Configure the GSM network\n"
1115
Harald Welte5013b2a2009-08-07 13:29:14 +02001116DEFUN(cfg_net,
1117 cfg_net_cmd,
Harald Welte8f0ed552010-05-11 21:53:49 +02001118 "network", NETWORK_STR)
Harald Welte5013b2a2009-08-07 13:29:14 +02001119{
Harald Weltedcccb182010-05-16 20:52:23 +02001120 vty->index = gsmnet_from_vty(vty);
Harald Welte5013b2a2009-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 Weltedcccb182010-05-16 20:52:23 +02001132 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1133
Harald Welte5013b2a2009-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 Weltedcccb182010-05-16 20:52:23 +02001144 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1145
Harald Welte5013b2a2009-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 Weltedcccb182010-05-16 20:52:23 +02001156 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1157
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +02001158 bsc_replace_string(gsmnet, &gsmnet->name_short, argv[0]);
Harald Welte5013b2a2009-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 Weltedcccb182010-05-16 20:52:23 +02001167 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1168
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +02001169 bsc_replace_string(gsmnet, &gsmnet->name_long, argv[0]);
Harald Welte5013b2a2009-08-07 13:29:14 +02001170 return CMD_SUCCESS;
1171}
Harald Welte40f82892009-05-23 17:31:39 +00001172
Harald Welte (local)69de3972009-08-12 14:42:23 +02001173DEFUN(cfg_net_auth_policy,
1174 cfg_net_auth_policy_cmd,
1175 "auth policy (closed|accept-all|token)",
Harald Welte8f0ed552010-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)69de3972009-08-12 14:42:23 +02001181{
1182 enum gsm_auth_policy policy = gsm_auth_policy_parse(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001183 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte (local)69de3972009-08-12 14:42:23 +02001184
1185 gsmnet->auth_policy = policy;
1186
1187 return CMD_SUCCESS;
1188}
1189
Harald Welte1085c092009-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 Weltedcccb182010-05-16 20:52:23 +02001195 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1196
Harald Welte1085c092009-11-18 20:33:19 +01001197 gsmnet->reject_cause = atoi(argv[0]);
1198
1199 return CMD_SUCCESS;
1200}
1201
Harald Welte4381cfe2009-08-30 15:47:06 +09001202DEFUN(cfg_net_encryption,
1203 cfg_net_encryption_cmd,
1204 "encryption a5 (0|1|2)",
Harald Welte28326062010-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 Welte4381cfe2009-08-30 15:47:06 +09001208{
Harald Weltedcccb182010-05-16 20:52:23 +02001209 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1210
Andreas.Eversberg1059deb2009-11-17 09:55:26 +01001211 gsmnet->a5_encryption= atoi(argv[0]);
Harald Welte4381cfe2009-08-30 15:47:06 +09001212
1213 return CMD_SUCCESS;
1214}
1215
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001216DEFUN(cfg_net_neci,
1217 cfg_net_neci_cmd,
1218 "neci (0|1)",
Harald Welte28326062010-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 Freytherf7d752f2009-11-16 17:12:38 +01001221{
Harald Weltedcccb182010-05-16 20:52:23 +02001222 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1223
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001224 gsmnet->neci = atoi(argv[0]);
Holger Hans Peter Freyther78891072010-09-06 09:36:02 +08001225 gsm_net_update_ctype(gsmnet);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01001226 return CMD_SUCCESS;
1227}
1228
Harald Welteeab84a12009-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 Welte8f0ed552010-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 Welteeab84a12009-12-13 10:53:12 +01001237{
Harald Weltedcccb182010-05-16 20:52:23 +02001238 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1239
Harald Welteeab84a12009-12-13 10:53:12 +01001240 gsmnet->rrlp.mode = rrlp_mode_parse(argv[0]);
1241
1242 return CMD_SUCCESS;
1243}
1244
Harald Welte648b6ce2009-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 Weltedcccb182010-05-16 20:52:23 +02001249 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
1250
Harald Welte648b6ce2009-12-14 09:00:24 +01001251 gsmnet->send_mm_info = atoi(argv[0]);
1252
1253 return CMD_SUCCESS;
1254}
1255
Harald Welte8f0ed552010-05-11 21:53:49 +02001256#define HANDOVER_STR "Handover Options\n"
1257
Harald Weltebc814502009-12-19 21:41:52 +01001258DEFUN(cfg_net_handover, cfg_net_handover_cmd,
1259 "handover (0|1)",
Harald Welte8f0ed552010-05-11 21:53:49 +02001260 HANDOVER_STR
1261 "Don't perform in-call handover\n"
1262 "Perform in-call handover\n")
Harald Weltebc814502009-12-19 21:41:52 +01001263{
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001264 int enable = atoi(argv[0]);
Harald Weltedcccb182010-05-16 20:52:23 +02001265 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freythercbcfe242010-01-07 16:14:38 +01001266
1267 if (enable && ipacc_rtp_direct) {
Harald Weltefe03f0d2009-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 Freythercbcfe242010-01-07 16:14:38 +01001273 gsmnet->handover.active = enable;
Harald Weltebc814502009-12-19 21:41:52 +01001274
1275 return CMD_SUCCESS;
1276}
1277
Harald Welte8f0ed552010-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 Welteb720bd32009-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 Welte8f0ed552010-05-11 21:53:49 +02001285 HO_WIN_RXLEV_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001286 "How many RxLev measurements are used for averaging")
1287{
Harald Weltedcccb182010-05-16 20:52:23 +02001288 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-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 Welte8f0ed552010-05-11 21:53:49 +02001295 HO_WIN_RXQUAL_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001296 "How many RxQual measurements are used for averaging")
1297{
Harald Weltedcccb182010-05-16 20:52:23 +02001298 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-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 Welte8f0ed552010-05-11 21:53:49 +02001305 HO_WIN_RXLEV_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001306 "How many RxQual measurements are used for averaging")
1307{
Harald Weltedcccb182010-05-16 20:52:23 +02001308 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-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 Welte8f0ed552010-05-11 21:53:49 +02001315 HO_PBUDGET_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001316 "How often to check if we have a better cell (SACCH frames)")
1317{
Harald Weltedcccb182010-05-16 20:52:23 +02001318 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-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 Welte8f0ed552010-05-11 21:53:49 +02001325 HO_PBUDGET_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001326 "How many dB does a neighbor to be stronger to become a HO candidate")
1327{
Harald Weltedcccb182010-05-16 20:52:23 +02001328 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-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 Welte8f0ed552010-05-11 21:53:49 +02001335 HANDOVER_STR
Harald Welteb720bd32009-12-21 16:51:50 +01001336 "How big is the maximum timing advance before HO is forced")
1337{
Harald Weltedcccb182010-05-16 20:52:23 +02001338 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welteb720bd32009-12-21 16:51:50 +01001339 gsmnet->handover.max_distance = atoi(argv[0]);
1340 return CMD_SUCCESS;
1341}
Harald Weltebc814502009-12-19 21:41:52 +01001342
Holger Hans Peter Freyther76fc4a32010-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 Freytherb0e88b82010-09-06 10:09:19 +08001348 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Holger Hans Peter Freyther76fc4a32010-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 Freytherc8021062009-12-22 08:27:21 +01001354#define DECLARE_TIMER(number, doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001355 DEFUN(cfg_net_T##number, \
1356 cfg_net_T##number##_cmd, \
1357 "timer t" #number " <0-65535>", \
Harald Welte8f0ed552010-05-11 21:53:49 +02001358 "Configure GSM Timers\n" \
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001359 doc) \
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001360{ \
Harald Weltedcccb182010-05-16 20:52:23 +02001361 struct gsm_network *gsmnet = gsmnet_from_vty(vty); \
Holger Hans Peter Freytherc4d88ad2009-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 Freytherc8021062009-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 Freytherf30c0dc2010-05-31 21:33:15 +08001379DECLARE_TIMER(3111, "Set the RSL timeout to wait before releasing the RF Channel.")
Holger Hans Peter Freytherc8021062009-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 Welte2862dca2010-12-23 14:39:29 +01001384DECLARE_TIMER(3122, "Waiting time (seconds) after IMM ASS REJECT")
Holger Hans Peter Freytherc8021062009-12-22 08:27:21 +01001385DECLARE_TIMER(3141, "Currently not used.")
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +01001386
Holger Hans Peter Freyther5a3a61d2010-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 Freytherc4d88ad2009-11-21 21:18:38 +01001397
Holger Hans Peter Freytherae9006a2010-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 Welte5258fc42009-03-28 19:07:53 +00001409/* per-BTS configuration */
1410DEFUN(cfg_bts,
1411 cfg_bts_cmd,
1412 "bts BTS_NR",
Harald Welte8f0ed552010-05-11 21:53:49 +02001413 "Select a BTS to configure\n"
1414 "BTS Number\n")
Harald Welte5258fc42009-03-28 19:07:53 +00001415{
Harald Weltedcccb182010-05-16 20:52:23 +02001416 struct gsm_network *gsmnet = gsmnet_from_vty(vty);
Harald Welte5258fc42009-03-28 19:07:53 +00001417 int bts_nr = atoi(argv[0]);
1418 struct gsm_bts *bts;
1419
Harald Weltee441d9c2009-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 Welte5258fc42009-03-28 19:07:53 +00001423 return CMD_WARNING;
Harald Weltee441d9c2009-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 Freytheracf8a0c2010-03-29 08:47:44 +02001428 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02001429 bts = gsm_bts_num(gsmnet, bts_nr);
1430
Daniel Willmannf15c2762010-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 Weltee441d9c2009-06-21 16:17:15 +02001434 return CMD_WARNING;
Daniel Willmannf15c2762010-01-11 13:43:07 +01001435 }
Harald Welte5258fc42009-03-28 19:07:53 +00001436
1437 vty->index = bts;
Harald Welte197dea92010-05-14 17:59:53 +02001438 vty->index_sub = &bts->description;
Harald Welte5258fc42009-03-28 19:07:53 +00001439 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 Welte39315c42010-01-10 18:01:52 +01001450 int rc;
Harald Welte5258fc42009-03-28 19:07:53 +00001451
Harald Welte39315c42010-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 Welte8175e952009-10-20 00:22:00 +02001455
Harald Welte5258fc42009-03-28 19:07:53 +00001456 return CMD_SUCCESS;
1457}
1458
Harald Weltefcd24452009-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 Welte42581822009-08-08 16:12:58 +02001465 int band = gsm_band_parse(argv[0]);
Harald Weltefcd24452009-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 Freytherc4a49e32009-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 Welte5258fc42009-03-28 19:07:53 +00001496DEFUN(cfg_bts_lac,
1497 cfg_bts_lac_cmd,
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +02001498 "location_area_code <0-65535>",
Harald Welte5258fc42009-03-28 19:07:53 +00001499 "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 Freyther0b7f4b32009-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 Welte5258fc42009-03-28 19:07:53 +00001506 lac, VTY_NEWLINE);
1507 return CMD_WARNING;
1508 }
Holger Hans Peter Freythere48b9562009-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 Welte5258fc42009-03-28 19:07:53 +00001516 bts->location_area_code = lac;
1517
1518 return CMD_SUCCESS;
1519}
1520
Harald Weltea43f7892009-12-01 18:04:30 +05301521
Harald Welte5258fc42009-03-28 19:07:53 +00001522DEFUN(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
Harald Welte78f2f502009-05-23 16:56:52 +00001540DEFUN(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 Welte42581822009-08-08 16:12:58 +02001549 vty_out(vty, "%% BSIC %d is not in the valid range (0-255)%s",
Harald Welte78f2f502009-05-23 16:56:52 +00001550 bsic, VTY_NEWLINE);
1551 return CMD_WARNING;
1552 }
1553 bts->bsic = bsic;
1554
1555 return CMD_SUCCESS;
1556}
1557
1558
Harald Welte4cc34222009-05-01 15:12:31 +00001559DEFUN(cfg_bts_unit_id,
1560 cfg_bts_unit_id_cmd,
Harald Welte07dc73d2009-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 Welte4cc34222009-05-01 15:12:31 +00001563{
1564 struct gsm_bts *bts = vty->index;
1565 int site_id = atoi(argv[0]);
1566 int bts_id = atoi(argv[1]);
1567
Harald Welte07dc73d2009-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 Welte4cc34222009-05-01 15:12:31 +00001573 bts->ip_access.site_id = site_id;
1574 bts->ip_access.bts_id = bts_id;
1575
1576 return CMD_SUCCESS;
1577}
1578
Harald Welte8f0ed552010-05-11 21:53:49 +02001579#define OML_STR "Organization & Maintenance Link\n"
1580#define IPA_STR "ip.access Specific Options\n"
1581
Harald Welte8175e952009-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 Welte8f0ed552010-05-11 21:53:49 +02001585 OML_STR IPA_STR
Harald Welte8175e952009-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 Welte8f0ed552010-05-11 21:53:49 +02001601#define OML_E1_STR OML_STR "E1 Line\n"
Harald Welte8175e952009-10-20 00:22:00 +02001602
Harald Welte42581822009-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 Welte8f0ed552010-05-11 21:53:49 +02001606 OML_E1_STR
Harald Welte42581822009-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 Welte8f0ed552010-05-11 21:53:49 +02001620 OML_E1_STR
Harald Welte42581822009-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 Welte7a8fa412009-08-10 13:48:16 +02001630DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
1631 "channel allocator (ascending|descending)",
Harald Welte8f0ed552010-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 Welte7a8fa412009-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 Welte8f0ed552010-05-11 21:53:49 +02001646#define RACH_STR "Random Access Control Channel\n"
1647
Sylvain Munaut4010f1e2009-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 Welte8f0ed552010-05-11 21:53:49 +02001651 RACH_STR
Sylvain Munaut4010f1e2009-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 Welte8f0ed552010-05-11 21:53:49 +02001662 RACH_STR
Sylvain Munaut4010f1e2009-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 Welte8f0ed552010-05-11 21:53:49 +02001670#define NM_STR "Network Management\n"
1671
Holger Hans Peter Freyther95c22902010-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 Welte8f0ed552010-05-11 21:53:49 +02001675 RACH_STR NM_STR
1676 "Set the NM Busy Threshold in dB")
Holger Hans Peter Freyther95c22902010-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 Welte8f0ed552010-05-11 21:53:49 +02001686 RACH_STR NM_STR
1687 "Set the NM Loadaverage Slots value")
Holger Hans Peter Freyther95c22902010-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)5dececf2009-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 Welte71355012009-12-21 23:08:18 +01001700 bts->si_common.rach_control.cell_bar = atoi(argv[0]);
Harald Welte (local)5dececf2009-08-12 13:28:23 +02001701
1702 return CMD_SUCCESS;
1703}
1704
Holger Hans Peter Freyther3a0a4632010-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)0e451d02009-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 Welte73225282009-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 Munaute0b06b02010-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)efc92312009-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 Spaard6613e02010-10-05 21:10:55 +02001832 bts->si_common.chan_desc.t3212 = atoi(argv[0]) / 6;
Harald Welte (local)efc92312009-08-14 23:09:25 +02001833
1834 return CMD_SUCCESS;
1835}
1836
Harald Welte8f0ed552010-05-11 21:53:49 +02001837#define GPRS_TEXT "GPRS Packet Network\n"
1838
Harald Welteaf387632010-03-14 23:30:30 +08001839DEFUN(cfg_bts_prs_bvci, cfg_bts_gprs_bvci_cmd,
Harald Welte57ba7e32010-04-18 14:00:26 +02001840 "gprs cell bvci <2-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001841 GPRS_TEXT
1842 "GPRS Cell Settings\n"
Harald Welte97a282b2010-03-14 15:37:43 +08001843 "GPRS BSSGP VC Identifier")
1844{
1845 struct gsm_bts *bts = vty->index;
1846
Harald Welte4511d892010-04-18 15:51:20 +02001847 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-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 Welte97a282b2010-03-14 15:37:43 +08001852 bts->gprs.cell.bvci = atoi(argv[0]);
1853
1854 return CMD_SUCCESS;
1855}
1856
Harald Weltea5731cf2010-03-22 11:48:36 +08001857DEFUN(cfg_bts_gprs_nsei, cfg_bts_gprs_nsei_cmd,
1858 "gprs nsei <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001859 GPRS_TEXT
Harald Weltea5731cf2010-03-22 11:48:36 +08001860 "GPRS NS Entity Identifier")
1861{
1862 struct gsm_bts *bts = vty->index;
1863
Harald Welte4511d892010-04-18 15:51:20 +02001864 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Weltea5731cf2010-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 Welte8f0ed552010-05-11 21:53:49 +02001874#define NSVC_TEXT "Network Service Virtual Connection (NS-VC)\n" \
1875 "NSVC Logical Number\n"
Harald Weltea5731cf2010-03-22 11:48:36 +08001876
Harald Welte97a282b2010-03-14 15:37:43 +08001877DEFUN(cfg_bts_gprs_nsvci, cfg_bts_gprs_nsvci_cmd,
1878 "gprs nsvc <0-1> nsvci <0-65535>",
Harald Welte8f0ed552010-05-11 21:53:49 +02001879 GPRS_TEXT NSVC_TEXT
1880 "NS Virtual Connection Identifier\n"
Harald Welte97a282b2010-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 Welte4511d892010-04-18 15:51:20 +02001886 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-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 Welte97a282b2010-03-14 15:37:43 +08001891 bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
1892
1893 return CMD_SUCCESS;
1894}
1895
Harald Welteaf387632010-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 Welte8f0ed552010-05-11 21:53:49 +02001898 GPRS_TEXT NSVC_TEXT
Harald Welteaf387632010-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 Welte4511d892010-04-18 15:51:20 +02001904 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-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 Welteaf387632010-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 Welte8f0ed552010-05-11 21:53:49 +02001916 GPRS_TEXT NSVC_TEXT
Harald Welteaf387632010-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 Welte4511d892010-04-18 15:51:20 +02001922 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-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 Welteaf387632010-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 Welte8f0ed552010-05-11 21:53:49 +02001934 GPRS_TEXT NSVC_TEXT
Harald Welteaf387632010-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 Welte4511d892010-04-18 15:51:20 +02001941 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-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 Welteaf387632010-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 Freythere66bf1f2010-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 Welte615e9562010-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 Welte28326062010-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 Welte615e9562010-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 Welte97a282b2010-03-14 15:37:43 +08002022DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd,
2023 "gprs routing area <0-255>",
Harald Welte8f0ed552010-05-11 21:53:49 +02002024 GPRS_TEXT
Harald Welte97a282b2010-03-14 15:37:43 +08002025 "GPRS Routing Area Code")
2026{
2027 struct gsm_bts *bts = vty->index;
2028
Harald Welte4511d892010-04-18 15:51:20 +02002029 if (bts->gprs.mode == BTS_GPRS_NONE) {
Harald Welte94036702010-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 Welte97a282b2010-03-14 15:37:43 +08002034 bts->gprs.rac = atoi(argv[0]);
2035
2036 return CMD_SUCCESS;
2037}
2038
Harald Welte4511d892010-04-18 15:51:20 +02002039DEFUN(cfg_bts_gprs_mode, cfg_bts_gprs_mode_cmd,
2040 "gprs mode (none|gprs|egprs)",
Harald Welte8f0ed552010-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 Welteaf387632010-03-14 23:30:30 +08002046{
2047 struct gsm_bts *bts = vty->index;
Harald Weltef3d8e922010-06-14 22:44:42 +02002048 enum bts_gprs_mode mode = bts_gprs_mode_parse(argv[0]);
Harald Welteaf387632010-03-14 23:30:30 +08002049
Harald Weltef3d8e922010-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 Welteaf387632010-03-14 23:30:30 +08002064
2065 return CMD_SUCCESS;
2066}
2067
Harald Welte9fbff4a2010-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 Welte290aaed2010-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 Welte9fbff4a2010-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 Welte32c09622011-01-11 23:44:56 +01002153DEFUN(cfg_bts_neigh_mode, cfg_bts_neigh_mode_cmd,
Harald Welte64c07d22011-02-15 11:43:27 +01002154 "neighbor-list mode (automatic|manual|manual-si5)",
Harald Welte32c09622011-01-11 23:44:56 +01002155 "Neighbor List\n" "Mode of Neighbor List generation\n"
Harald Welte64c07d22011-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 Welte32c09622011-01-11 23:44:56 +01002158{
2159 struct gsm_bts *bts = vty->index;
Harald Welte64c07d22011-02-15 11:43:27 +01002160 int mode = get_string_value(bts_neigh_mode_strs, argv[0]);
Harald Welte32c09622011-01-11 23:44:56 +01002161
Harald Welte64c07d22011-02-15 11:43:27 +01002162 switch (mode) {
2163 case NL_MODE_MANUAL_SI5SEP:
2164 case NL_MODE_MANUAL:
Harald Welte32c09622011-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 Welte64c07d22011-02-15 11:43:27 +01002170 break;
2171 default:
2172 break;
2173 }
2174
2175 bts->neigh_list_manual_mode = mode;
Harald Welte32c09622011-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 Welte64c07d22011-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 Welte9fbff4a2010-07-30 11:50:09 +02002227
Harald Welte8f0ed552010-05-11 21:53:49 +02002228#define TRX_TEXT "Radio Transceiver\n"
Harald Welte7a8fa412009-08-10 13:48:16 +02002229
Harald Welte5258fc42009-03-28 19:07:53 +00002230/* per TRX configuration */
2231DEFUN(cfg_trx,
2232 cfg_trx_cmd,
2233 "trx TRX_NR",
Harald Welte8f0ed552010-05-11 21:53:49 +02002234 TRX_TEXT
Harald Welte5258fc42009-03-28 19:07:53 +00002235 "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 Weltee441d9c2009-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 Welte5258fc42009-03-28 19:07:53 +00002244 return CMD_WARNING;
Harald Weltee441d9c2009-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 Freytheracf8a0c2010-03-29 08:47:44 +02002248 } else
Harald Weltee441d9c2009-06-21 16:17:15 +02002249 trx = gsm_bts_trx_num(bts, trx_nr);
Holger Hans Peter Freytheracf8a0c2010-03-29 08:47:44 +02002250
Harald Weltee441d9c2009-06-21 16:17:15 +02002251 if (!trx)
2252 return CMD_WARNING;
Harald Welte5258fc42009-03-28 19:07:53 +00002253
2254 vty->index = trx;
Harald Welte197dea92010-05-14 17:59:53 +02002255 vty->index_sub = &trx->description;
Harald Welte5258fc42009-03-28 19:07:53 +00002256 vty->node = TRX_NODE;
2257
2258 return CMD_SUCCESS;
2259}
2260
2261DEFUN(cfg_trx_arfcn,
2262 cfg_trx_arfcn_cmd,
Harald Welte93e90202010-05-14 19:00:52 +02002263 "arfcn <0-1024>",
Harald Welte5258fc42009-03-28 19:07:53 +00002264 "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)7b37d972009-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 Weltefcd24452009-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 Welte61a83b22009-11-18 09:20:22 +01002299 int upper_limit = 24; /* default 12.21 max power red. */
Harald Weltefcd24452009-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 Welte42581822009-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 Freyther2d501ea2009-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 Welte42581822009-08-08 16:12:58 +02002355
Harald Welte5258fc42009-03-28 19:07:53 +00002356/* per TS configuration */
2357DEFUN(cfg_ts,
2358 cfg_ts_cmd,
Harald Welte42581822009-08-08 16:12:58 +02002359 "timeslot <0-7>",
Harald Welte5258fc42009-03-28 19:07:53 +00002360 "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 Weltea6fd58e2009-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 Weltea39b0f22010-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 Weltec2fb3d02010-06-14 22:47:37 +02002406 int enabled = atoi(argv[0]);
Harald Weltea39b0f22010-06-14 22:26:10 +02002407
Harald Weltec2fb3d02010-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 Weltea39b0f22010-06-14 22:26:10 +02002415
2416 return CMD_SUCCESS;
2417}
2418
Harald Welte6e0cd042009-09-12 13:05:33 +02002419DEFUN(cfg_ts_hsn,
2420 cfg_ts_hsn_cmd,
Harald Weltea39b0f22010-06-14 22:26:10 +02002421 "hopping sequence-number <0-63>",
2422 HOPPING_STR
Harald Welte6e0cd042009-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 Weltea39b0f22010-06-14 22:26:10 +02002435 HOPPING_STR
Harald Welte6e0cd042009-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 Weltea39b0f22010-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 Welte6e0cd042009-09-12 13:05:33 +02002450{
2451 struct gsm_bts_trx_ts *ts = vty->index;
2452 int arfcn = atoi(argv[0]);
2453
Harald Weltea39b0f22010-06-14 22:26:10 +02002454 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);
2455
Harald Welte6e0cd042009-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 Weltea39b0f22010-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 Welte6e0cd042009-09-12 13:05:33 +02002464{
2465 struct gsm_bts_trx_ts *ts = vty->index;
2466 int arfcn = atoi(argv[0]);
2467
Harald Weltea39b0f22010-06-14 22:26:10 +02002468 bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);
2469
Harald Welte6e0cd042009-09-12 13:05:33 +02002470 return CMD_SUCCESS;
2471}
2472
Harald Weltea6fd58e2009-08-07 00:25:23 +02002473DEFUN(cfg_ts_e1_subslot,
2474 cfg_ts_e1_subslot_cmd,
Harald Welte42581822009-08-08 16:12:58 +02002475 "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",
Harald Weltea6fd58e2009-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 Welte42581822009-08-08 16:12:58 +02002480 parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);
Harald Weltea6fd58e2009-08-07 00:25:23 +02002481
2482 return CMD_SUCCESS;
2483}
Harald Welte5258fc42009-03-28 19:07:53 +00002484
Harald Welte4f10c252010-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 Welte5bc61dc2010-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 Welte8dcebd32011-02-18 21:10:05 +01002508 struct log_target *tgt = osmo_log_vty2tgt(vty);
Harald Welte5bc61dc2010-05-16 22:02:16 +02002509
Harald Welte8dcebd32011-02-18 21:10:05 +01002510 if (!tgt)
Harald Welte5bc61dc2010-05-16 22:02:16 +02002511 return CMD_WARNING;
Harald Welte5bc61dc2010-05-16 22:02:16 +02002512
Harald Welte8dcebd32011-02-18 21:10:05 +01002513 log_set_imsi_filter(tgt, argv[0]);
Harald Welte5bc61dc2010-05-16 22:02:16 +02002514 return CMD_SUCCESS;
2515}
2516
Harald Welte8dcebd32011-02-18 21:10:05 +01002517
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02002518DEFUN(drop_bts,
2519 drop_bts_cmd,
Holger Hans Peter Freyther0586b0f2010-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 Freyther2484ceb2010-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 Freytherdab8e272010-11-15 20:29:46 +01002552 ipaccess_drop_oml(bts);
Holger Hans Peter Freyther2484ceb2010-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 Freytherdab8e272010-11-15 20:29:46 +01002556 ipaccess_drop_rsl(trx);
Holger Hans Peter Freyther2484ceb2010-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 Welted0d2b0b2010-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 Freyther2484ceb2010-10-26 09:40:13 +02002616
Harald Weltedcccb182010-05-16 20:52:23 +02002617extern int bsc_vty_init_extra(void);
Harald Welte1353f962010-05-16 19:20:24 +02002618extern const char *openbsc_copyright;
Holger Hans Peter Freythere1ffc082010-04-10 00:08:28 +02002619
Harald Weltedcccb182010-05-16 20:52:23 +02002620int bsc_vty_init(void)
Harald Welte68628e82009-03-10 12:17:57 +00002621{
Harald Welteb4d5b172010-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 Freyther3d6a5d62010-05-14 02:08:49 +08002627 install_element_ve(&show_lchan_summary_cmd);
Harald Welte5bc61dc2010-05-16 22:02:16 +02002628 install_element_ve(&logging_fltr_imsi_cmd);
Harald Welte1bc77352009-03-10 19:47:51 +00002629
Harald Welteb4d5b172010-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 Welte68628e82009-03-10 12:17:57 +00002633
Harald Welteb4d5b172010-05-12 16:10:35 +00002634 install_element_ve(&show_paging_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00002635
Harald Welte5bc61dc2010-05-16 22:02:16 +02002636 logging_vty_add_cmds();
Harald Welte8dcebd32011-02-18 21:10:05 +01002637 install_element(CFG_LOG_NODE, &logging_fltr_imsi_cmd);
Holger Hans Peter Freytherb61e3b22009-12-22 22:32:51 +01002638
Harald Welte5013b2a2009-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 Welte62ab20c2010-05-14 18:59:17 +02002642 install_element(GSMNET_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +02002643 install_element(GSMNET_NODE, &ournode_end_cmd);
Harald Welte42581822009-08-08 16:12:58 +02002644 install_element(GSMNET_NODE, &cfg_net_ncc_cmd);
Harald Welte5013b2a2009-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)69de3972009-08-12 14:42:23 +02002648 install_element(GSMNET_NODE, &cfg_net_auth_policy_cmd);
Harald Welte1085c092009-11-18 20:33:19 +01002649 install_element(GSMNET_NODE, &cfg_net_reject_cause_cmd);
Harald Welte4381cfe2009-08-30 15:47:06 +09002650 install_element(GSMNET_NODE, &cfg_net_encryption_cmd);
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +01002651 install_element(GSMNET_NODE, &cfg_net_neci_cmd);
Harald Welteeab84a12009-12-13 10:53:12 +01002652 install_element(GSMNET_NODE, &cfg_net_rrlp_mode_cmd);
Harald Welte3d23db42009-12-14 17:49:15 +01002653 install_element(GSMNET_NODE, &cfg_net_mm_info_cmd);
Harald Weltebc814502009-12-19 21:41:52 +01002654 install_element(GSMNET_NODE, &cfg_net_handover_cmd);
Harald Welteb720bd32009-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 Freytherc4d88ad2009-11-21 21:18:38 +01002661 install_element(GSMNET_NODE, &cfg_net_T3101_cmd);
Holger Hans Peter Freyther23975e72009-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 Weltec9f499f2010-12-23 22:53:50 +01002671 install_element(GSMNET_NODE, &cfg_net_T3122_cmd);
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +01002672 install_element(GSMNET_NODE, &cfg_net_T3141_cmd);
Holger Hans Peter Freyther5a3a61d2010-09-06 09:25:48 +08002673 install_element(GSMNET_NODE, &cfg_net_dtx_cmd);
Holger Hans Peter Freytherae9006a2010-12-22 16:26:04 +01002674 install_element(GSMNET_NODE, &cfg_net_subscr_keep_cmd);
Holger Hans Peter Freyther76fc4a32010-09-06 09:41:50 +08002675 install_element(GSMNET_NODE, &cfg_net_pag_any_tch_cmd);
Harald Welte5013b2a2009-08-07 13:29:14 +02002676
2677 install_element(GSMNET_NODE, &cfg_bts_cmd);
Harald Welte67ce0732009-08-06 19:06:46 +02002678 install_node(&bts_node, config_write_bts);
Harald Welte68628e82009-03-10 12:17:57 +00002679 install_default(BTS_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +02002680 install_element(BTS_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +02002681 install_element(BTS_NODE, &ournode_end_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00002682 install_element(BTS_NODE, &cfg_bts_type_cmd);
Harald Welte197dea92010-05-14 17:59:53 +02002683 install_element(BTS_NODE, &cfg_description_cmd);
2684 install_element(BTS_NODE, &cfg_no_description_cmd);
Harald Weltefcd24452009-06-20 18:15:19 +02002685 install_element(BTS_NODE, &cfg_bts_band_cmd);
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +02002686 install_element(BTS_NODE, &cfg_bts_ci_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00002687 install_element(BTS_NODE, &cfg_bts_lac_cmd);
2688 install_element(BTS_NODE, &cfg_bts_tsc_cmd);
Harald Welte42581822009-08-08 16:12:58 +02002689 install_element(BTS_NODE, &cfg_bts_bsic_cmd);
Harald Welte4cc34222009-05-01 15:12:31 +00002690 install_element(BTS_NODE, &cfg_bts_unit_id_cmd);
Harald Welte8175e952009-10-20 00:22:00 +02002691 install_element(BTS_NODE, &cfg_bts_stream_id_cmd);
Harald Welte42581822009-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 Welte7a8fa412009-08-10 13:48:16 +02002694 install_element(BTS_NODE, &cfg_bts_challoc_cmd);
Sylvain Munaut4010f1e2009-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 Freyther95c22902010-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)5dececf2009-08-12 13:28:23 +02002699 install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
Holger Hans Peter Freyther3a0a4632010-05-14 00:39:19 +08002700 install_element(BTS_NODE, &cfg_bts_rach_ec_allowed_cmd);
Harald Welte (local)0e451d02009-08-13 10:14:26 +02002701 install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
Harald Welte (local)efc92312009-08-14 23:09:25 +02002702 install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
Harald Welte73225282009-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 Munaute0b06b02010-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 Welte4511d892010-04-18 15:51:20 +02002711 install_element(BTS_NODE, &cfg_bts_gprs_mode_cmd);
Harald Welte615e9562010-05-11 23:50:21 +02002712 install_element(BTS_NODE, &cfg_bts_gprs_ns_timer_cmd);
Harald Welte97a282b2010-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 Welte615e9562010-05-11 23:50:21 +02002715 install_element(BTS_NODE, &cfg_bts_gprs_cell_timer_cmd);
Harald Weltea5731cf2010-03-22 11:48:36 +08002716 install_element(BTS_NODE, &cfg_bts_gprs_nsei_cmd);
Harald Welte97a282b2010-03-14 15:37:43 +08002717 install_element(BTS_NODE, &cfg_bts_gprs_nsvci_cmd);
Harald Welteaf387632010-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 Freythere66bf1f2010-09-06 10:11:25 +08002721 install_element(BTS_NODE, &cfg_bts_pag_free_cmd);
Harald Welte9fbff4a2010-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 Welte32c09622011-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 Welte64c07d22011-02-15 11:43:27 +01002726 install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002727
Harald Welte5258fc42009-03-28 19:07:53 +00002728 install_element(BTS_NODE, &cfg_trx_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002729 install_node(&trx_node, dummy_config_write);
Harald Welte68628e82009-03-10 12:17:57 +00002730 install_default(TRX_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +02002731 install_element(TRX_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +02002732 install_element(TRX_NODE, &ournode_end_cmd);
Harald Welte5258fc42009-03-28 19:07:53 +00002733 install_element(TRX_NODE, &cfg_trx_arfcn_cmd);
Harald Welte197dea92010-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)7b37d972009-12-27 20:56:38 +01002736 install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);
Harald Welte879dc972009-06-20 22:36:12 +02002737 install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);
Harald Welte42581822009-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 Freyther2d501ea2009-11-11 11:54:24 +01002740 install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002741
Harald Welte5258fc42009-03-28 19:07:53 +00002742 install_element(TRX_NODE, &cfg_ts_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002743 install_node(&ts_node, dummy_config_write);
Harald Welte68628e82009-03-10 12:17:57 +00002744 install_default(TS_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +02002745 install_element(TS_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +02002746 install_element(TS_NODE, &ournode_end_cmd);
Harald Weltea6fd58e2009-08-07 00:25:23 +02002747 install_element(TS_NODE, &cfg_ts_pchan_cmd);
Harald Weltea39b0f22010-06-14 22:26:10 +02002748 install_element(TS_NODE, &cfg_ts_hopping_cmd);
Harald Welte6e0cd042009-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 Weltea6fd58e2009-08-07 00:25:23 +02002753 install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);
Harald Welte68628e82009-03-10 12:17:57 +00002754
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02002755 install_element(ENABLE_NODE, &drop_bts_cmd);
Harald Welted0d2b0b2010-12-23 13:18:07 +01002756 install_element(ENABLE_NODE, &pdch_act_cmd);
Holger Hans Peter Freyther2484ceb2010-10-26 09:40:13 +02002757
Harald Welte81c9b9c2010-05-31 16:40:40 +02002758 abis_nm_vty_init();
Harald Weltee1d5eca2011-02-12 14:42:59 +01002759 abis_om2k_vty_init();
Harald Welte3016d9f2011-02-05 13:54:41 +01002760 e1inp_vty_init();
Harald Welte81c9b9c2010-05-31 16:40:40 +02002761
Harald Weltedcccb182010-05-16 20:52:23 +02002762 bsc_vty_init_extra();
Harald Welte40f82892009-05-23 17:31:39 +00002763
Harald Welte68628e82009-03-10 12:17:57 +00002764 return 0;
2765}