blob: b5ee1b55b3df0785ac746de85d709caddbaf92ea [file] [log] [blame]
Andreas Eversberg12942562012-07-12 14:31:57 +02001/* OsmoBTS VTY interface */
2
Andreas Eversberg12942562012-07-12 14:31:57 +02003
Andreas Eversberg8b761a32012-07-20 21:50:31 +02004#include <stdint.h>
Holger Hans Peter Freyther2c98f1d2014-07-02 14:56:36 +02005#include <stdlib.h>
Andreas Eversberg12942562012-07-12 14:31:57 +02006#include <osmocom/vty/logging.h>
Jacob Erlbeck42aba812015-11-10 15:32:00 +01007#include <osmocom/vty/stats.h>
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +02008#include <osmocom/vty/misc.h>
Andreas Eversberg8b761a32012-07-20 21:50:31 +02009#include <osmocom/core/linuxlist.h>
Holger Hans Peter Freythere8915b92014-07-02 14:57:47 +020010#include <osmocom/core/rate_ctr.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020011#include "pcu_vty.h"
Andreas Eversberg8b761a32012-07-20 21:50:31 +020012#include "gprs_rlcmac.h"
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020013#include "bts.h"
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020014#include "tbf.h"
Andreas Eversberg12942562012-07-12 14:31:57 +020015
Jacob Erlbeck62e96a32015-06-04 09:42:14 +020016#include "pcu_vty_functions.h"
17
Jacob Erlbeckf76fede2015-08-17 13:42:46 +020018int pcu_vty_go_parent(struct vty *vty)
Andreas Eversberg12942562012-07-12 14:31:57 +020019{
20 switch (vty->node) {
21#if 0
22 case TRX_NODE:
Andreas Eversberg8b761a32012-07-20 21:50:31 +020023 vty->node = PCU_NODE;
Andreas Eversberg12942562012-07-12 14:31:57 +020024 {
25 struct gsm_bts_trx *trx = vty->index;
26 vty->index = trx->bts;
27 }
28 break;
29#endif
30 default:
31 vty->node = CONFIG_NODE;
32 }
Andreas Eversberg8b761a32012-07-20 21:50:31 +020033 return (enum node_type) vty->node;
Andreas Eversberg12942562012-07-12 14:31:57 +020034}
35
36int pcu_vty_is_config_node(struct vty *vty, int node)
37{
38 switch (node) {
Andreas Eversberg8b761a32012-07-20 21:50:31 +020039 case PCU_NODE:
Andreas Eversberg12942562012-07-12 14:31:57 +020040 return 1;
Andreas Eversberg12942562012-07-12 14:31:57 +020041 default:
42 return 0;
43 }
44}
45
Andreas Eversberg8b761a32012-07-20 21:50:31 +020046static struct cmd_node pcu_node = {
47 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +020048 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +020049 1,
50};
51
Andreas Eversberg8b761a32012-07-20 21:50:31 +020052static int config_write_pcu(struct vty *vty)
53{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +020054 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +020055
56 vty_out(vty, "pcu%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +020057 if (bts->egprs_enabled)
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +010058 vty_out(vty, " egprs only%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +020059
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +020060 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
61 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +020062 if (bts->fc_bvc_bucket_size)
63 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
64 bts->fc_bvc_bucket_size, VTY_NEWLINE);
65 if (bts->fc_bvc_leak_rate)
66 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
67 bts->fc_bvc_leak_rate, VTY_NEWLINE);
68 if (bts->fc_ms_bucket_size)
69 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
70 bts->fc_ms_bucket_size, VTY_NEWLINE);
71 if (bts->fc_ms_leak_rate)
72 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
73 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +020074 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +020075 if (bts->initial_cs_ul == bts->initial_cs_dl)
76 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
77 VTY_NEWLINE);
78 else
79 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
80 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +020081 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +020082 if (bts->max_cs_dl && bts->max_cs_ul) {
83 if (bts->max_cs_ul == bts->max_cs_dl)
84 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
85 VTY_NEWLINE);
86 else
87 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
88 bts->max_cs_ul, VTY_NEWLINE);
89 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +020090 if (bts->cs_adj_enabled)
91 vty_out(vty, " cs threshold %d %d%s",
92 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
93 VTY_NEWLINE);
94 else
95 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
96
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +020097 if (bts->cs_downgrade_threshold)
98 vty_out(vty, " cs downgrade-threshold %d%s",
99 bts->cs_downgrade_threshold, VTY_NEWLINE);
100 else
101 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
102
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200103 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
104 bts->cs_lqual_ranges[0].high,
105 bts->cs_lqual_ranges[1].low,
106 bts->cs_lqual_ranges[1].high,
107 bts->cs_lqual_ranges[2].low,
108 bts->cs_lqual_ranges[2].high,
109 bts->cs_lqual_ranges[3].low,
110 VTY_NEWLINE);
111
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100112 if (bts->max_mcs_dl && bts->max_mcs_ul) {
113 if (bts->max_mcs_ul == bts->max_mcs_dl)
114 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
115 VTY_NEWLINE);
116 else
117 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
118 bts->max_mcs_ul, VTY_NEWLINE);
119 }
120
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100121 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
122 VTY_NEWLINE);
123
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200124 if (bts->force_llc_lifetime == 0xffff)
125 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
126 else if (bts->force_llc_lifetime)
127 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
128 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100129 if (bts->llc_discard_csec)
130 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
131 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200132 if (bts->llc_idle_ack_csec)
133 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
134 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200135 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
136 vty_out(vty, " queue codel%s", VTY_NEWLINE);
137 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
138 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
139 else
140 vty_out(vty, " queue codel interval %d%s",
141 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
142
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200143 if (bts->alloc_algorithm == alloc_algorithm_a)
144 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
145 if (bts->alloc_algorithm == alloc_algorithm_b)
146 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200147 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
148 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200149 if (bts->force_two_phase)
150 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200151 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
152 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100153 if (bts->dl_tbf_idle_msec)
154 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
155 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200156
Jacob Erlbeck62e96a32015-06-04 09:42:14 +0200157 return pcu_vty_config_write_pcu_ext(vty);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200158}
159
160/* per-BTS configuration */
161DEFUN(cfg_pcu,
162 cfg_pcu_cmd,
163 "pcu",
164 "BTS specific configure")
165{
166 vty->node = PCU_NODE;
167
168 return CMD_SUCCESS;
169}
170
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200171#define EGPRS_STR "EGPRS configuration\n"
172
173DEFUN(cfg_pcu_egprs,
174 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100175 "egprs only",
176 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200177{
178 struct gprs_rlcmac_bts *bts = bts_main_data();
179
180 bts->egprs_enabled = 1;
181
Jacob Erlbeck5265f592015-09-28 18:54:32 +0200182 vty_out(vty, "%%Note that EGPRS support is in an experimental state "
183 "and the PCU will currently fail to use a TBF if the MS is capable "
184 "to do EGPRS. You may want to disable this feature by entering "
185 "the \"no egprs\" command. "
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200186 "Do not use this in production!%s", VTY_NEWLINE);
187
188 return CMD_SUCCESS;
189}
190
191DEFUN(cfg_pcu_no_egprs,
192 cfg_pcu_no_egprs_cmd,
193 "no egprs",
194 NO_STR EGPRS_STR)
195{
196 struct gprs_rlcmac_bts *bts = bts_main_data();
197
198 bts->egprs_enabled = 0;
199
200 return CMD_SUCCESS;
201}
202
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200203DEFUN(cfg_pcu_fc_interval,
204 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200205 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200206 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200207 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200208{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200209 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200210
211 bts->fc_interval = atoi(argv[0]);
212
213 return CMD_SUCCESS;
214}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200215#define FC_STR "BSSGP Flow Control configuration\n"
216#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
217#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
218
219DEFUN(cfg_pcu_fc_bvc_bucket_size,
220 cfg_pcu_fc_bvc_bucket_size_cmd,
221 "flow-control force-bvc-bucket-size <1-6553500>",
222 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
223{
224 struct gprs_rlcmac_bts *bts = bts_main_data();
225
226 bts->fc_bvc_bucket_size = atoi(argv[0]);
227
228 return CMD_SUCCESS;
229}
230
231DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
232 cfg_pcu_no_fc_bvc_bucket_size_cmd,
233 "no flow-control force-bvc-bucket-size",
234 NO_STR FC_STR FC_BMAX_STR("BVC"))
235{
236 struct gprs_rlcmac_bts *bts = bts_main_data();
237
238 bts->fc_bvc_bucket_size = 0;
239
240 return CMD_SUCCESS;
241}
242
243DEFUN(cfg_pcu_fc_bvc_leak_rate,
244 cfg_pcu_fc_bvc_leak_rate_cmd,
245 "flow-control force-bvc-leak-rate <1-6553500>",
246 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
247{
248 struct gprs_rlcmac_bts *bts = bts_main_data();
249
250 bts->fc_bvc_leak_rate = atoi(argv[0]);
251
252 return CMD_SUCCESS;
253}
254
255DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
256 cfg_pcu_no_fc_bvc_leak_rate_cmd,
257 "no flow-control force-bvc-leak-rate",
258 NO_STR FC_STR FC_LR_STR("BVC"))
259{
260 struct gprs_rlcmac_bts *bts = bts_main_data();
261
262 bts->fc_bvc_leak_rate = 0;
263
264 return CMD_SUCCESS;
265}
266
267DEFUN(cfg_pcu_fc_ms_bucket_size,
268 cfg_pcu_fc_ms_bucket_size_cmd,
269 "flow-control force-ms-bucket-size <1-6553500>",
270 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
271{
272 struct gprs_rlcmac_bts *bts = bts_main_data();
273
274 bts->fc_ms_bucket_size = atoi(argv[0]);
275
276 return CMD_SUCCESS;
277}
278
279DEFUN(cfg_pcu_no_fc_ms_bucket_size,
280 cfg_pcu_no_fc_ms_bucket_size_cmd,
281 "no flow-control force-ms-bucket-size",
282 NO_STR FC_STR FC_BMAX_STR("default MS"))
283{
284 struct gprs_rlcmac_bts *bts = bts_main_data();
285
286 bts->fc_ms_bucket_size = 0;
287
288 return CMD_SUCCESS;
289}
290
291DEFUN(cfg_pcu_fc_ms_leak_rate,
292 cfg_pcu_fc_ms_leak_rate_cmd,
293 "flow-control force-ms-leak-rate <1-6553500>",
294 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
295{
296 struct gprs_rlcmac_bts *bts = bts_main_data();
297
298 bts->fc_ms_leak_rate = atoi(argv[0]);
299
300 return CMD_SUCCESS;
301}
302
303DEFUN(cfg_pcu_no_fc_ms_leak_rate,
304 cfg_pcu_no_fc_ms_leak_rate_cmd,
305 "no flow-control force-ms-leak-rate",
306 NO_STR FC_STR FC_LR_STR("default MS"))
307{
308 struct gprs_rlcmac_bts *bts = bts_main_data();
309
310 bts->fc_ms_leak_rate = 0;
311
312 return CMD_SUCCESS;
313}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200314
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200315#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
316DEFUN(cfg_pcu_fc_bucket_time,
317 cfg_pcu_fc_bucket_time_cmd,
318 "flow-control bucket-time <1-65534>",
319 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
320{
321 struct gprs_rlcmac_bts *bts = bts_main_data();
322
323 bts->fc_bucket_time = atoi(argv[0]);
324
325 return CMD_SUCCESS;
326}
327
328DEFUN(cfg_pcu_no_fc_bucket_time,
329 cfg_pcu_no_fc_bucket_time_cmd,
330 "no flow-control bucket-time",
331 NO_STR FC_STR FC_BTIME_STR)
332{
333 struct gprs_rlcmac_bts *bts = bts_main_data();
334
335 bts->fc_bucket_time = 0;
336
337 return CMD_SUCCESS;
338}
339
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200340#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200341
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200342DEFUN(cfg_pcu_cs,
343 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200344 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200345 CS_STR
346 "Initial CS value to be used (overrides BTS config)\n"
347 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200348{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200349 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200350 uint8_t cs = atoi(argv[0]);
351
352 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200353 bts->initial_cs_dl = cs;
354 if (argc > 1)
355 bts->initial_cs_ul = atoi(argv[1]);
356 else
357 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200358
359 return CMD_SUCCESS;
360}
361
362DEFUN(cfg_pcu_no_cs,
363 cfg_pcu_no_cs_cmd,
364 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200365 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200366{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200367 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200368
369 bts->force_cs = 0;
370
371 return CMD_SUCCESS;
372}
373
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100374#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200375DEFUN(cfg_pcu_cs_max,
376 cfg_pcu_cs_max_cmd,
377 "cs max <1-4> [<1-4>]",
378 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100379 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200380 "Maximum CS value to be used\n"
381 "Use a different maximum CS value for the uplink")
382{
383 struct gprs_rlcmac_bts *bts = bts_main_data();
384 uint8_t cs = atoi(argv[0]);
385
386 bts->max_cs_dl = cs;
387 if (argc > 1)
388 bts->max_cs_ul = atoi(argv[1]);
389 else
390 bts->max_cs_ul = cs;
391
392 return CMD_SUCCESS;
393}
394
395DEFUN(cfg_pcu_no_cs_max,
396 cfg_pcu_no_cs_max_cmd,
397 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100398 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200399{
400 struct gprs_rlcmac_bts *bts = bts_main_data();
401
402 bts->max_cs_dl = 0;
403 bts->max_cs_ul = 0;
404
405 return CMD_SUCCESS;
406}
407
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100408#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
409
410DEFUN(cfg_pcu_mcs_max,
411 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100412 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100413 MCS_STR
414 CS_MAX_STR
415 "Maximum MCS value to be used\n"
416 "Use a different maximum MCS value for the uplink")
417{
418 struct gprs_rlcmac_bts *bts = bts_main_data();
419 uint8_t mcs = atoi(argv[0]);
420
421 bts->max_mcs_dl = mcs;
422 if (argc > 1)
423 bts->max_mcs_ul = atoi(argv[1]);
424 else
425 bts->max_mcs_ul = mcs;
426
427 return CMD_SUCCESS;
428}
429
430DEFUN(cfg_pcu_no_mcs_max,
431 cfg_pcu_no_mcs_max_cmd,
432 "no mcs max",
433 NO_STR MCS_STR CS_MAX_STR)
434{
435 struct gprs_rlcmac_bts *bts = bts_main_data();
436
437 bts->max_mcs_dl = 0;
438 bts->max_mcs_ul = 0;
439
440 return CMD_SUCCESS;
441}
442
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100443DEFUN(cfg_pcu_window_size,
444 cfg_pcu_window_size_cmd,
445 "window-size <0-1024> [<0-256>]",
446 "Window size configuration (b + N_PDCH * f)\n"
447 "Base value (b)\n"
448 "Factor for number of PDCH (f)")
449{
450 struct gprs_rlcmac_bts *bts = bts_main_data();
451 uint16_t b = atoi(argv[0]);
452
453 bts->ws_base = b;
454 if (argc > 1) {
455 uint16_t f = atoi(argv[1]);
456 bts->ws_pdch = f;
457 }
458
459 return CMD_SUCCESS;
460}
461
462
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200463#define QUEUE_STR "Packet queue options\n"
464#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
465 "(overrides the value given by SGSN)\n"
466
467DEFUN(cfg_pcu_queue_lifetime,
468 cfg_pcu_queue_lifetime_cmd,
469 "queue lifetime <1-65534>",
470 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
471{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200472 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200473 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200474
475 bts->force_llc_lifetime = csec;
476
477 return CMD_SUCCESS;
478}
479
480DEFUN(cfg_pcu_queue_lifetime_inf,
481 cfg_pcu_queue_lifetime_inf_cmd,
482 "queue lifetime infinite",
483 QUEUE_STR LIFETIME_STR "Infinite lifetime")
484{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200485 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200486
487 bts->force_llc_lifetime = 0xffff;
488
489 return CMD_SUCCESS;
490}
491
492DEFUN(cfg_pcu_no_queue_lifetime,
493 cfg_pcu_no_queue_lifetime_cmd,
494 "no queue lifetime",
495 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
496 "by SGSN)\n")
497{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200498 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200499
500 bts->force_llc_lifetime = 0;
501
502 return CMD_SUCCESS;
503}
504
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100505#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
506 "(continue discarding until lifetime-hysteresis is reached)\n"
507
508DEFUN(cfg_pcu_queue_hysteresis,
509 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200510 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100511 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
512{
513 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200514 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100515
516 bts->llc_discard_csec = csec;
517
518 return CMD_SUCCESS;
519}
520
521DEFUN(cfg_pcu_no_queue_hysteresis,
522 cfg_pcu_no_queue_hysteresis_cmd,
523 "no queue hysteresis",
524 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
525{
526 struct gprs_rlcmac_bts *bts = bts_main_data();
527
528 bts->llc_discard_csec = 0;
529
530 return CMD_SUCCESS;
531}
532
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200533#define QUEUE_CODEL_STR "Set CoDel queue management\n"
534
535DEFUN(cfg_pcu_queue_codel,
536 cfg_pcu_queue_codel_cmd,
537 "queue codel",
538 QUEUE_STR QUEUE_CODEL_STR)
539{
540 struct gprs_rlcmac_bts *bts = bts_main_data();
541
542 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
543
544 return CMD_SUCCESS;
545}
546
547DEFUN(cfg_pcu_queue_codel_interval,
548 cfg_pcu_queue_codel_interval_cmd,
549 "queue codel interval <1-1000>",
550 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
551{
552 struct gprs_rlcmac_bts *bts = bts_main_data();
553 uint16_t csec = atoi(argv[0]);
554
555 bts->llc_codel_interval_msec = 10*csec;
556
557 return CMD_SUCCESS;
558}
559
560DEFUN(cfg_pcu_no_queue_codel,
561 cfg_pcu_no_queue_codel_cmd,
562 "no queue codel",
563 NO_STR QUEUE_STR QUEUE_CODEL_STR)
564{
565 struct gprs_rlcmac_bts *bts = bts_main_data();
566
567 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
568
569 return CMD_SUCCESS;
570}
571
572
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200573#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
574
575DEFUN(cfg_pcu_queue_idle_ack_delay,
576 cfg_pcu_queue_idle_ack_delay_cmd,
577 "queue idle-ack-delay <1-65535>",
578 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
579{
580 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200581 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200582
583 bts->llc_idle_ack_csec = csec;
584
585 return CMD_SUCCESS;
586}
587
588DEFUN(cfg_pcu_no_queue_idle_ack_delay,
589 cfg_pcu_no_queue_idle_ack_delay_cmd,
590 "no queue idle-ack-delay",
591 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
592{
593 struct gprs_rlcmac_bts *bts = bts_main_data();
594
595 bts->llc_idle_ack_csec = 0;
596
597 return CMD_SUCCESS;
598}
599
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100600
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200601DEFUN(cfg_pcu_alloc,
602 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200603 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200604 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200605 "PACCH\n"
606 "Single slot is assigned only\n"
607 "Multiple slots are assigned for semi-duplex operation\n"
608 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200609{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200610 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200611
612 switch (argv[0][0]) {
613 case 'a':
614 bts->alloc_algorithm = alloc_algorithm_a;
615 break;
616 case 'b':
617 bts->alloc_algorithm = alloc_algorithm_b;
618 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200619 default:
620 bts->alloc_algorithm = alloc_algorithm_dynamic;
621 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200622 }
623
624 return CMD_SUCCESS;
625}
626
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200627DEFUN(cfg_pcu_two_phase,
628 cfg_pcu_two_phase_cmd,
629 "two-phase-access",
630 "Force two phase access when MS requests single phase access\n")
631{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200632 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200633
634 bts->force_two_phase = 1;
635
636 return CMD_SUCCESS;
637}
638
639DEFUN(cfg_pcu_no_two_phase,
640 cfg_pcu_no_two_phase_cmd,
641 "no two-phase-access",
642 NO_STR "Only use two phase access when requested my MS\n")
643{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200644 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200645
646 bts->force_two_phase = 0;
647
648 return CMD_SUCCESS;
649}
650
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200651DEFUN(cfg_pcu_alpha,
652 cfg_pcu_alpha_cmd,
653 "alpha <0-10>",
654 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
655 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
656 "Alpha in units of 0.1\n")
657{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200658 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200659
660 bts->alpha = atoi(argv[0]);
661
662 return CMD_SUCCESS;
663}
664
665DEFUN(cfg_pcu_gamma,
666 cfg_pcu_gamma_cmd,
667 "gamma <0-62>",
668 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
669 "Gamma in even unit of dBs\n")
670{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200671 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200672
673 bts->gamma = atoi(argv[0]) / 2;
674
675 return CMD_SUCCESS;
676}
677
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100678DEFUN(show_bts_stats,
679 show_bts_stats_cmd,
680 "show bts statistics",
681 SHOW_STR "BTS related functionality\nStatistics\n")
682{
683 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
684 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100685}
686
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100687#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
688DEFUN(cfg_pcu_dl_tbf_idle_time,
689 cfg_pcu_dl_tbf_idle_time_cmd,
690 "dl-tbf-idle-time <1-5000>",
691 IDLE_TIME_STR "idle time in msec")
692{
693 struct gprs_rlcmac_bts *bts = bts_main_data();
694
695 bts->dl_tbf_idle_msec = atoi(argv[0]);
696
697 return CMD_SUCCESS;
698}
699
700DEFUN(cfg_pcu_no_dl_tbf_idle_time,
701 cfg_pcu_no_dl_tbf_idle_time_cmd,
702 "no dl-tbf-idle-time",
703 NO_STR IDLE_TIME_STR)
704{
705 struct gprs_rlcmac_bts *bts = bts_main_data();
706
707 bts->dl_tbf_idle_msec = 0;
708
709 return CMD_SUCCESS;
710}
711
Jacob Erlbecka098c192015-05-28 16:11:19 +0200712#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
713DEFUN(cfg_pcu_ms_idle_time,
714 cfg_pcu_ms_idle_time_cmd,
715 "ms-idle-time <1-7200>",
716 MS_IDLE_TIME_STR "idle time in sec")
717{
718 struct gprs_rlcmac_bts *bts = bts_main_data();
719
720 bts->ms_idle_sec = atoi(argv[0]);
721
722 return CMD_SUCCESS;
723}
724
725DEFUN(cfg_pcu_no_ms_idle_time,
726 cfg_pcu_no_ms_idle_time_cmd,
727 "no ms-idle-time",
728 NO_STR MS_IDLE_TIME_STR)
729{
730 struct gprs_rlcmac_bts *bts = bts_main_data();
731
732 bts->ms_idle_sec = 0;
733
734 return CMD_SUCCESS;
735}
736
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200737#define CS_ERR_LIMITS_STR "set thresholds for error rate based CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200738DEFUN(cfg_pcu_cs_err_limits,
739 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200740 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200741 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
742{
743 struct gprs_rlcmac_bts *bts = bts_main_data();
744
745 uint8_t lower_limit = atoi(argv[0]);
746 uint8_t upper_limit = atoi(argv[1]);
747
748 if (lower_limit > upper_limit) {
749 vty_out(vty,
750 "The lower limit must be less than or equal to the "
751 "upper limit.%s", VTY_NEWLINE);
752 return CMD_WARNING;
753 }
754
755 bts->cs_adj_enabled = 1;
756 bts->cs_adj_upper_limit = upper_limit;
757 bts->cs_adj_lower_limit = lower_limit;
758
759 return CMD_SUCCESS;
760}
761
762DEFUN(cfg_pcu_no_cs_err_limits,
763 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200764 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200765 NO_STR CS_STR CS_ERR_LIMITS_STR)
766{
767 struct gprs_rlcmac_bts *bts = bts_main_data();
768
769 bts->cs_adj_enabled = 0;
770 bts->cs_adj_upper_limit = 100;
771 bts->cs_adj_lower_limit = 0;
772
773 return CMD_SUCCESS;
774}
775
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200776#define CS_DOWNGRADE_STR "set threshold for data size based CS downgrade\n"
777DEFUN(cfg_pcu_cs_downgrade_thrsh,
778 cfg_pcu_cs_downgrade_thrsh_cmd,
779 "cs downgrade-threshold <1-10000>",
780 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
781{
782 struct gprs_rlcmac_bts *bts = bts_main_data();
783
784 bts->cs_downgrade_threshold = atoi(argv[0]);
785
786 return CMD_SUCCESS;
787}
788
789DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
790 cfg_pcu_no_cs_downgrade_thrsh_cmd,
791 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200792 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200793{
794 struct gprs_rlcmac_bts *bts = bts_main_data();
795
796 bts->cs_downgrade_threshold = 0;
797
798 return CMD_SUCCESS;
799}
800
801
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200802DEFUN(cfg_pcu_cs_lqual_ranges,
803 cfg_pcu_cs_lqual_ranges_cmd,
804 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
805 CS_STR "Set link quality ranges\n"
806 "Set quality range for CS-1 (high value only)\n"
807 "CS-1 high (dB)\n"
808 "Set quality range for CS-2\n"
809 "CS-2 low (dB)\n"
810 "CS-2 high (dB)\n"
811 "Set quality range for CS-3\n"
812 "CS-3 low (dB)\n"
813 "CS-3 high (dB)\n"
814 "Set quality range for CS-4 (low value only)\n"
815 "CS-4 low (dB)\n")
816{
817 struct gprs_rlcmac_bts *bts = bts_main_data();
818
819 uint8_t cs1_high = atoi(argv[0]);
820 uint8_t cs2_low = atoi(argv[1]);
821 uint8_t cs2_high = atoi(argv[2]);
822 uint8_t cs3_low = atoi(argv[3]);
823 uint8_t cs3_high = atoi(argv[4]);
824 uint8_t cs4_low = atoi(argv[5]);
825
826 bts->cs_lqual_ranges[0].high = cs1_high;
827 bts->cs_lqual_ranges[1].low = cs2_low;
828 bts->cs_lqual_ranges[1].high = cs2_high;
829 bts->cs_lqual_ranges[2].low = cs3_low;
830 bts->cs_lqual_ranges[2].high = cs3_high;
831 bts->cs_lqual_ranges[3].low = cs4_low;
832
833 return CMD_SUCCESS;
834}
835
836
Daniel Willmann772415f2014-01-15 17:06:51 +0100837DEFUN(show_tbf,
838 show_tbf_cmd,
839 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100840 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100841{
842 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbecked2dbf62015-12-28 19:15:40 +0100843 return pcu_vty_show_tbf_all(vty, bts);
Daniel Willmann772415f2014-01-15 17:06:51 +0100844}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100845
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200846DEFUN(show_ms_all,
847 show_ms_all_cmd,
848 "show ms all",
849 SHOW_STR "information about MSs\n" "All TBFs\n")
850{
851 struct gprs_rlcmac_bts *bts = bts_main_data();
852 return pcu_vty_show_ms_all(vty, bts);
853}
854
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200855DEFUN(show_ms_tlli,
856 show_ms_tlli_cmd,
857 "show ms tlli TLLI",
858 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
859{
860 struct gprs_rlcmac_bts *bts = bts_main_data();
861 char *endp = NULL;
862 unsigned long long tlli = strtoll(argv[0], &endp, 16);
863 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
864 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
865 return CMD_WARNING;
866 }
867 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
868}
869
870DEFUN(show_ms_imsi,
871 show_ms_imsi_cmd,
872 "show ms imsi IMSI",
873 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
874{
875 struct gprs_rlcmac_bts *bts = bts_main_data();
876 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
877}
878
Andreas Eversberg12942562012-07-12 14:31:57 +0200879static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +0100880 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
881 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +0200882 "License GNU GPL version 2 or later\r\n"
883 "This is free software: you are free to change and redistribute it.\r\n"
884 "There is NO WARRANTY, to the extent permitted by law.\r\n";
885
886struct vty_app_info pcu_vty_info = {
887 .name = "Osmo-PCU",
888 .version = PACKAGE_VERSION,
889 .copyright = pcu_copyright,
890 .go_parent_cb = pcu_vty_go_parent,
891 .is_config_node = pcu_vty_is_config_node,
892};
893
894int pcu_vty_init(const struct log_info *cat)
895{
896// install_element_ve(&show_pcu_cmd);
897
898 logging_vty_add_cmds(cat);
Jacob Erlbeck42aba812015-11-10 15:32:00 +0100899 osmo_stats_vty_add_cmds(cat);
Andreas Eversberg12942562012-07-12 14:31:57 +0200900
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200901 install_node(&pcu_node, config_write_pcu);
902 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200903 vty_install_default(PCU_NODE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200904 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
905 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200906 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200907 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
908 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200909 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
910 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200911 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
912 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200913 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
914 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200915 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100916 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
917 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100918 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200919 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
920 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
921 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100922 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
923 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200924 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
925 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
926 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200927 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
928 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200929 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200930 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200931 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200932 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
933 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200934 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
935 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
936 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
937 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
938 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
939 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
940 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
941 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200942 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
943 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100944 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
945 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +0200946 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
947 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200948
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100949 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +0100950 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200951 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200952 install_element_ve(&show_ms_tlli_cmd);
953 install_element_ve(&show_ms_imsi_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100954
Andreas Eversberg12942562012-07-12 14:31:57 +0200955 return 0;
956}