blob: 58fea993d6230a3d870c19f111461f975da97b5a [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 Erlbeck4cc46d32016-02-02 16:02:16 +0100112 if (bts->initial_mcs_dl != 1 && bts->initial_mcs_ul != 1) {
113 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
114 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
115 VTY_NEWLINE);
116 else
117 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
118 bts->initial_mcs_ul, VTY_NEWLINE);
119 }
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100120 if (bts->max_mcs_dl && bts->max_mcs_ul) {
121 if (bts->max_mcs_ul == bts->max_mcs_dl)
122 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
123 VTY_NEWLINE);
124 else
125 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
126 bts->max_mcs_ul, VTY_NEWLINE);
127 }
128
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100129 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
130 VTY_NEWLINE);
131
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200132 if (bts->force_llc_lifetime == 0xffff)
133 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
134 else if (bts->force_llc_lifetime)
135 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
136 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100137 if (bts->llc_discard_csec)
138 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
139 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200140 if (bts->llc_idle_ack_csec)
141 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
142 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200143 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
144 vty_out(vty, " queue codel%s", VTY_NEWLINE);
145 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
146 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
147 else
148 vty_out(vty, " queue codel interval %d%s",
149 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
150
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200151 if (bts->alloc_algorithm == alloc_algorithm_a)
152 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
153 if (bts->alloc_algorithm == alloc_algorithm_b)
154 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200155 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
156 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200157 if (bts->force_two_phase)
158 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200159 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
160 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100161 if (bts->dl_tbf_idle_msec)
162 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
163 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200164
Jacob Erlbeck62e96a32015-06-04 09:42:14 +0200165 return pcu_vty_config_write_pcu_ext(vty);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200166}
167
168/* per-BTS configuration */
169DEFUN(cfg_pcu,
170 cfg_pcu_cmd,
171 "pcu",
172 "BTS specific configure")
173{
174 vty->node = PCU_NODE;
175
176 return CMD_SUCCESS;
177}
178
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200179#define EGPRS_STR "EGPRS configuration\n"
180
181DEFUN(cfg_pcu_egprs,
182 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100183 "egprs only",
184 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200185{
186 struct gprs_rlcmac_bts *bts = bts_main_data();
187
188 bts->egprs_enabled = 1;
189
Jacob Erlbeck5265f592015-09-28 18:54:32 +0200190 vty_out(vty, "%%Note that EGPRS support is in an experimental state "
191 "and the PCU will currently fail to use a TBF if the MS is capable "
192 "to do EGPRS. You may want to disable this feature by entering "
193 "the \"no egprs\" command. "
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200194 "Do not use this in production!%s", VTY_NEWLINE);
195
196 return CMD_SUCCESS;
197}
198
199DEFUN(cfg_pcu_no_egprs,
200 cfg_pcu_no_egprs_cmd,
201 "no egprs",
202 NO_STR EGPRS_STR)
203{
204 struct gprs_rlcmac_bts *bts = bts_main_data();
205
206 bts->egprs_enabled = 0;
207
208 return CMD_SUCCESS;
209}
210
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200211DEFUN(cfg_pcu_fc_interval,
212 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200213 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200214 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200215 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200216{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200217 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200218
219 bts->fc_interval = atoi(argv[0]);
220
221 return CMD_SUCCESS;
222}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200223#define FC_STR "BSSGP Flow Control configuration\n"
224#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
225#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
226
227DEFUN(cfg_pcu_fc_bvc_bucket_size,
228 cfg_pcu_fc_bvc_bucket_size_cmd,
229 "flow-control force-bvc-bucket-size <1-6553500>",
230 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
231{
232 struct gprs_rlcmac_bts *bts = bts_main_data();
233
234 bts->fc_bvc_bucket_size = atoi(argv[0]);
235
236 return CMD_SUCCESS;
237}
238
239DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
240 cfg_pcu_no_fc_bvc_bucket_size_cmd,
241 "no flow-control force-bvc-bucket-size",
242 NO_STR FC_STR FC_BMAX_STR("BVC"))
243{
244 struct gprs_rlcmac_bts *bts = bts_main_data();
245
246 bts->fc_bvc_bucket_size = 0;
247
248 return CMD_SUCCESS;
249}
250
251DEFUN(cfg_pcu_fc_bvc_leak_rate,
252 cfg_pcu_fc_bvc_leak_rate_cmd,
253 "flow-control force-bvc-leak-rate <1-6553500>",
254 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
255{
256 struct gprs_rlcmac_bts *bts = bts_main_data();
257
258 bts->fc_bvc_leak_rate = atoi(argv[0]);
259
260 return CMD_SUCCESS;
261}
262
263DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
264 cfg_pcu_no_fc_bvc_leak_rate_cmd,
265 "no flow-control force-bvc-leak-rate",
266 NO_STR FC_STR FC_LR_STR("BVC"))
267{
268 struct gprs_rlcmac_bts *bts = bts_main_data();
269
270 bts->fc_bvc_leak_rate = 0;
271
272 return CMD_SUCCESS;
273}
274
275DEFUN(cfg_pcu_fc_ms_bucket_size,
276 cfg_pcu_fc_ms_bucket_size_cmd,
277 "flow-control force-ms-bucket-size <1-6553500>",
278 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
279{
280 struct gprs_rlcmac_bts *bts = bts_main_data();
281
282 bts->fc_ms_bucket_size = atoi(argv[0]);
283
284 return CMD_SUCCESS;
285}
286
287DEFUN(cfg_pcu_no_fc_ms_bucket_size,
288 cfg_pcu_no_fc_ms_bucket_size_cmd,
289 "no flow-control force-ms-bucket-size",
290 NO_STR FC_STR FC_BMAX_STR("default MS"))
291{
292 struct gprs_rlcmac_bts *bts = bts_main_data();
293
294 bts->fc_ms_bucket_size = 0;
295
296 return CMD_SUCCESS;
297}
298
299DEFUN(cfg_pcu_fc_ms_leak_rate,
300 cfg_pcu_fc_ms_leak_rate_cmd,
301 "flow-control force-ms-leak-rate <1-6553500>",
302 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
303{
304 struct gprs_rlcmac_bts *bts = bts_main_data();
305
306 bts->fc_ms_leak_rate = atoi(argv[0]);
307
308 return CMD_SUCCESS;
309}
310
311DEFUN(cfg_pcu_no_fc_ms_leak_rate,
312 cfg_pcu_no_fc_ms_leak_rate_cmd,
313 "no flow-control force-ms-leak-rate",
314 NO_STR FC_STR FC_LR_STR("default MS"))
315{
316 struct gprs_rlcmac_bts *bts = bts_main_data();
317
318 bts->fc_ms_leak_rate = 0;
319
320 return CMD_SUCCESS;
321}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200322
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200323#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
324DEFUN(cfg_pcu_fc_bucket_time,
325 cfg_pcu_fc_bucket_time_cmd,
326 "flow-control bucket-time <1-65534>",
327 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
328{
329 struct gprs_rlcmac_bts *bts = bts_main_data();
330
331 bts->fc_bucket_time = atoi(argv[0]);
332
333 return CMD_SUCCESS;
334}
335
336DEFUN(cfg_pcu_no_fc_bucket_time,
337 cfg_pcu_no_fc_bucket_time_cmd,
338 "no flow-control bucket-time",
339 NO_STR FC_STR FC_BTIME_STR)
340{
341 struct gprs_rlcmac_bts *bts = bts_main_data();
342
343 bts->fc_bucket_time = 0;
344
345 return CMD_SUCCESS;
346}
347
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200348#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200349
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200350DEFUN(cfg_pcu_cs,
351 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200352 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200353 CS_STR
354 "Initial CS value to be used (overrides BTS config)\n"
355 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200356{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200357 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200358 uint8_t cs = atoi(argv[0]);
359
360 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200361 bts->initial_cs_dl = cs;
362 if (argc > 1)
363 bts->initial_cs_ul = atoi(argv[1]);
364 else
365 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200366
367 return CMD_SUCCESS;
368}
369
370DEFUN(cfg_pcu_no_cs,
371 cfg_pcu_no_cs_cmd,
372 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200373 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200374{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200375 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200376
377 bts->force_cs = 0;
378
379 return CMD_SUCCESS;
380}
381
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100382#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200383DEFUN(cfg_pcu_cs_max,
384 cfg_pcu_cs_max_cmd,
385 "cs max <1-4> [<1-4>]",
386 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100387 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200388 "Maximum CS value to be used\n"
389 "Use a different maximum CS value for the uplink")
390{
391 struct gprs_rlcmac_bts *bts = bts_main_data();
392 uint8_t cs = atoi(argv[0]);
393
394 bts->max_cs_dl = cs;
395 if (argc > 1)
396 bts->max_cs_ul = atoi(argv[1]);
397 else
398 bts->max_cs_ul = cs;
399
400 return CMD_SUCCESS;
401}
402
403DEFUN(cfg_pcu_no_cs_max,
404 cfg_pcu_no_cs_max_cmd,
405 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100406 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200407{
408 struct gprs_rlcmac_bts *bts = bts_main_data();
409
410 bts->max_cs_dl = 0;
411 bts->max_cs_ul = 0;
412
413 return CMD_SUCCESS;
414}
415
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100416#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
417
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100418DEFUN(cfg_pcu_mcs,
419 cfg_pcu_mcs_cmd,
420 "mcs <1-9> [<1-9>]",
421 MCS_STR
422 "Initial MCS value to be used (default 1)\n"
423 "Use a different initial MCS value for the uplink")
424{
425 struct gprs_rlcmac_bts *bts = bts_main_data();
426 uint8_t cs = atoi(argv[0]);
427
428 bts->initial_mcs_dl = cs;
429 if (argc > 1)
430 bts->initial_mcs_ul = atoi(argv[1]);
431 else
432 bts->initial_mcs_ul = cs;
433
434 return CMD_SUCCESS;
435}
436
437DEFUN(cfg_pcu_no_mcs,
438 cfg_pcu_no_mcs_cmd,
439 "no mcs",
440 NO_STR MCS_STR)
441{
442 struct gprs_rlcmac_bts *bts = bts_main_data();
443
444 bts->initial_mcs_dl = 1;
445 bts->initial_mcs_ul = 1;
446
447 return CMD_SUCCESS;
448}
449
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100450DEFUN(cfg_pcu_mcs_max,
451 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100452 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100453 MCS_STR
454 CS_MAX_STR
455 "Maximum MCS value to be used\n"
456 "Use a different maximum MCS value for the uplink")
457{
458 struct gprs_rlcmac_bts *bts = bts_main_data();
459 uint8_t mcs = atoi(argv[0]);
460
461 bts->max_mcs_dl = mcs;
462 if (argc > 1)
463 bts->max_mcs_ul = atoi(argv[1]);
464 else
465 bts->max_mcs_ul = mcs;
466
467 return CMD_SUCCESS;
468}
469
470DEFUN(cfg_pcu_no_mcs_max,
471 cfg_pcu_no_mcs_max_cmd,
472 "no mcs max",
473 NO_STR MCS_STR CS_MAX_STR)
474{
475 struct gprs_rlcmac_bts *bts = bts_main_data();
476
477 bts->max_mcs_dl = 0;
478 bts->max_mcs_ul = 0;
479
480 return CMD_SUCCESS;
481}
482
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100483DEFUN(cfg_pcu_window_size,
484 cfg_pcu_window_size_cmd,
485 "window-size <0-1024> [<0-256>]",
486 "Window size configuration (b + N_PDCH * f)\n"
487 "Base value (b)\n"
488 "Factor for number of PDCH (f)")
489{
490 struct gprs_rlcmac_bts *bts = bts_main_data();
491 uint16_t b = atoi(argv[0]);
492
493 bts->ws_base = b;
494 if (argc > 1) {
495 uint16_t f = atoi(argv[1]);
496 bts->ws_pdch = f;
497 }
498
499 return CMD_SUCCESS;
500}
501
502
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200503#define QUEUE_STR "Packet queue options\n"
504#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
505 "(overrides the value given by SGSN)\n"
506
507DEFUN(cfg_pcu_queue_lifetime,
508 cfg_pcu_queue_lifetime_cmd,
509 "queue lifetime <1-65534>",
510 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
511{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200512 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200513 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200514
515 bts->force_llc_lifetime = csec;
516
517 return CMD_SUCCESS;
518}
519
520DEFUN(cfg_pcu_queue_lifetime_inf,
521 cfg_pcu_queue_lifetime_inf_cmd,
522 "queue lifetime infinite",
523 QUEUE_STR LIFETIME_STR "Infinite lifetime")
524{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200525 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200526
527 bts->force_llc_lifetime = 0xffff;
528
529 return CMD_SUCCESS;
530}
531
532DEFUN(cfg_pcu_no_queue_lifetime,
533 cfg_pcu_no_queue_lifetime_cmd,
534 "no queue lifetime",
535 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
536 "by SGSN)\n")
537{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200538 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200539
540 bts->force_llc_lifetime = 0;
541
542 return CMD_SUCCESS;
543}
544
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100545#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
546 "(continue discarding until lifetime-hysteresis is reached)\n"
547
548DEFUN(cfg_pcu_queue_hysteresis,
549 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200550 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100551 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
552{
553 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200554 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100555
556 bts->llc_discard_csec = csec;
557
558 return CMD_SUCCESS;
559}
560
561DEFUN(cfg_pcu_no_queue_hysteresis,
562 cfg_pcu_no_queue_hysteresis_cmd,
563 "no queue hysteresis",
564 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
565{
566 struct gprs_rlcmac_bts *bts = bts_main_data();
567
568 bts->llc_discard_csec = 0;
569
570 return CMD_SUCCESS;
571}
572
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200573#define QUEUE_CODEL_STR "Set CoDel queue management\n"
574
575DEFUN(cfg_pcu_queue_codel,
576 cfg_pcu_queue_codel_cmd,
577 "queue codel",
578 QUEUE_STR QUEUE_CODEL_STR)
579{
580 struct gprs_rlcmac_bts *bts = bts_main_data();
581
582 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
583
584 return CMD_SUCCESS;
585}
586
587DEFUN(cfg_pcu_queue_codel_interval,
588 cfg_pcu_queue_codel_interval_cmd,
589 "queue codel interval <1-1000>",
590 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
591{
592 struct gprs_rlcmac_bts *bts = bts_main_data();
593 uint16_t csec = atoi(argv[0]);
594
595 bts->llc_codel_interval_msec = 10*csec;
596
597 return CMD_SUCCESS;
598}
599
600DEFUN(cfg_pcu_no_queue_codel,
601 cfg_pcu_no_queue_codel_cmd,
602 "no queue codel",
603 NO_STR QUEUE_STR QUEUE_CODEL_STR)
604{
605 struct gprs_rlcmac_bts *bts = bts_main_data();
606
607 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
608
609 return CMD_SUCCESS;
610}
611
612
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200613#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
614
615DEFUN(cfg_pcu_queue_idle_ack_delay,
616 cfg_pcu_queue_idle_ack_delay_cmd,
617 "queue idle-ack-delay <1-65535>",
618 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
619{
620 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200621 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200622
623 bts->llc_idle_ack_csec = csec;
624
625 return CMD_SUCCESS;
626}
627
628DEFUN(cfg_pcu_no_queue_idle_ack_delay,
629 cfg_pcu_no_queue_idle_ack_delay_cmd,
630 "no queue idle-ack-delay",
631 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
632{
633 struct gprs_rlcmac_bts *bts = bts_main_data();
634
635 bts->llc_idle_ack_csec = 0;
636
637 return CMD_SUCCESS;
638}
639
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100640
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200641DEFUN(cfg_pcu_alloc,
642 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200643 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200644 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200645 "PACCH\n"
646 "Single slot is assigned only\n"
647 "Multiple slots are assigned for semi-duplex operation\n"
648 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200649{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200650 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200651
652 switch (argv[0][0]) {
653 case 'a':
654 bts->alloc_algorithm = alloc_algorithm_a;
655 break;
656 case 'b':
657 bts->alloc_algorithm = alloc_algorithm_b;
658 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200659 default:
660 bts->alloc_algorithm = alloc_algorithm_dynamic;
661 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200662 }
663
664 return CMD_SUCCESS;
665}
666
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200667DEFUN(cfg_pcu_two_phase,
668 cfg_pcu_two_phase_cmd,
669 "two-phase-access",
670 "Force two phase access when MS requests single phase access\n")
671{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200672 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200673
674 bts->force_two_phase = 1;
675
676 return CMD_SUCCESS;
677}
678
679DEFUN(cfg_pcu_no_two_phase,
680 cfg_pcu_no_two_phase_cmd,
681 "no two-phase-access",
682 NO_STR "Only use two phase access when requested my MS\n")
683{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200684 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200685
686 bts->force_two_phase = 0;
687
688 return CMD_SUCCESS;
689}
690
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200691DEFUN(cfg_pcu_alpha,
692 cfg_pcu_alpha_cmd,
693 "alpha <0-10>",
694 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
695 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
696 "Alpha in units of 0.1\n")
697{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200698 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200699
700 bts->alpha = atoi(argv[0]);
701
702 return CMD_SUCCESS;
703}
704
705DEFUN(cfg_pcu_gamma,
706 cfg_pcu_gamma_cmd,
707 "gamma <0-62>",
708 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
709 "Gamma in even unit of dBs\n")
710{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200711 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200712
713 bts->gamma = atoi(argv[0]) / 2;
714
715 return CMD_SUCCESS;
716}
717
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100718DEFUN(show_bts_stats,
719 show_bts_stats_cmd,
720 "show bts statistics",
721 SHOW_STR "BTS related functionality\nStatistics\n")
722{
723 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
724 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100725}
726
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100727#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
728DEFUN(cfg_pcu_dl_tbf_idle_time,
729 cfg_pcu_dl_tbf_idle_time_cmd,
730 "dl-tbf-idle-time <1-5000>",
731 IDLE_TIME_STR "idle time in msec")
732{
733 struct gprs_rlcmac_bts *bts = bts_main_data();
734
735 bts->dl_tbf_idle_msec = atoi(argv[0]);
736
737 return CMD_SUCCESS;
738}
739
740DEFUN(cfg_pcu_no_dl_tbf_idle_time,
741 cfg_pcu_no_dl_tbf_idle_time_cmd,
742 "no dl-tbf-idle-time",
743 NO_STR IDLE_TIME_STR)
744{
745 struct gprs_rlcmac_bts *bts = bts_main_data();
746
747 bts->dl_tbf_idle_msec = 0;
748
749 return CMD_SUCCESS;
750}
751
Jacob Erlbecka098c192015-05-28 16:11:19 +0200752#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
753DEFUN(cfg_pcu_ms_idle_time,
754 cfg_pcu_ms_idle_time_cmd,
755 "ms-idle-time <1-7200>",
756 MS_IDLE_TIME_STR "idle time in sec")
757{
758 struct gprs_rlcmac_bts *bts = bts_main_data();
759
760 bts->ms_idle_sec = atoi(argv[0]);
761
762 return CMD_SUCCESS;
763}
764
765DEFUN(cfg_pcu_no_ms_idle_time,
766 cfg_pcu_no_ms_idle_time_cmd,
767 "no ms-idle-time",
768 NO_STR MS_IDLE_TIME_STR)
769{
770 struct gprs_rlcmac_bts *bts = bts_main_data();
771
772 bts->ms_idle_sec = 0;
773
774 return CMD_SUCCESS;
775}
776
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200777#define CS_ERR_LIMITS_STR "set thresholds for error rate based CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200778DEFUN(cfg_pcu_cs_err_limits,
779 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200780 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200781 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
782{
783 struct gprs_rlcmac_bts *bts = bts_main_data();
784
785 uint8_t lower_limit = atoi(argv[0]);
786 uint8_t upper_limit = atoi(argv[1]);
787
788 if (lower_limit > upper_limit) {
789 vty_out(vty,
790 "The lower limit must be less than or equal to the "
791 "upper limit.%s", VTY_NEWLINE);
792 return CMD_WARNING;
793 }
794
795 bts->cs_adj_enabled = 1;
796 bts->cs_adj_upper_limit = upper_limit;
797 bts->cs_adj_lower_limit = lower_limit;
798
799 return CMD_SUCCESS;
800}
801
802DEFUN(cfg_pcu_no_cs_err_limits,
803 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200804 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200805 NO_STR CS_STR CS_ERR_LIMITS_STR)
806{
807 struct gprs_rlcmac_bts *bts = bts_main_data();
808
809 bts->cs_adj_enabled = 0;
810 bts->cs_adj_upper_limit = 100;
811 bts->cs_adj_lower_limit = 0;
812
813 return CMD_SUCCESS;
814}
815
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200816#define CS_DOWNGRADE_STR "set threshold for data size based CS downgrade\n"
817DEFUN(cfg_pcu_cs_downgrade_thrsh,
818 cfg_pcu_cs_downgrade_thrsh_cmd,
819 "cs downgrade-threshold <1-10000>",
820 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
821{
822 struct gprs_rlcmac_bts *bts = bts_main_data();
823
824 bts->cs_downgrade_threshold = atoi(argv[0]);
825
826 return CMD_SUCCESS;
827}
828
829DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
830 cfg_pcu_no_cs_downgrade_thrsh_cmd,
831 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200832 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200833{
834 struct gprs_rlcmac_bts *bts = bts_main_data();
835
836 bts->cs_downgrade_threshold = 0;
837
838 return CMD_SUCCESS;
839}
840
841
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200842DEFUN(cfg_pcu_cs_lqual_ranges,
843 cfg_pcu_cs_lqual_ranges_cmd,
844 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
845 CS_STR "Set link quality ranges\n"
846 "Set quality range for CS-1 (high value only)\n"
847 "CS-1 high (dB)\n"
848 "Set quality range for CS-2\n"
849 "CS-2 low (dB)\n"
850 "CS-2 high (dB)\n"
851 "Set quality range for CS-3\n"
852 "CS-3 low (dB)\n"
853 "CS-3 high (dB)\n"
854 "Set quality range for CS-4 (low value only)\n"
855 "CS-4 low (dB)\n")
856{
857 struct gprs_rlcmac_bts *bts = bts_main_data();
858
859 uint8_t cs1_high = atoi(argv[0]);
860 uint8_t cs2_low = atoi(argv[1]);
861 uint8_t cs2_high = atoi(argv[2]);
862 uint8_t cs3_low = atoi(argv[3]);
863 uint8_t cs3_high = atoi(argv[4]);
864 uint8_t cs4_low = atoi(argv[5]);
865
866 bts->cs_lqual_ranges[0].high = cs1_high;
867 bts->cs_lqual_ranges[1].low = cs2_low;
868 bts->cs_lqual_ranges[1].high = cs2_high;
869 bts->cs_lqual_ranges[2].low = cs3_low;
870 bts->cs_lqual_ranges[2].high = cs3_high;
871 bts->cs_lqual_ranges[3].low = cs4_low;
872
873 return CMD_SUCCESS;
874}
875
876
Daniel Willmann772415f2014-01-15 17:06:51 +0100877DEFUN(show_tbf,
878 show_tbf_cmd,
879 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100880 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100881{
882 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbecked2dbf62015-12-28 19:15:40 +0100883 return pcu_vty_show_tbf_all(vty, bts);
Daniel Willmann772415f2014-01-15 17:06:51 +0100884}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100885
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200886DEFUN(show_ms_all,
887 show_ms_all_cmd,
888 "show ms all",
889 SHOW_STR "information about MSs\n" "All TBFs\n")
890{
891 struct gprs_rlcmac_bts *bts = bts_main_data();
892 return pcu_vty_show_ms_all(vty, bts);
893}
894
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200895DEFUN(show_ms_tlli,
896 show_ms_tlli_cmd,
897 "show ms tlli TLLI",
898 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
899{
900 struct gprs_rlcmac_bts *bts = bts_main_data();
901 char *endp = NULL;
902 unsigned long long tlli = strtoll(argv[0], &endp, 16);
903 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
904 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
905 return CMD_WARNING;
906 }
907 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
908}
909
910DEFUN(show_ms_imsi,
911 show_ms_imsi_cmd,
912 "show ms imsi IMSI",
913 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
914{
915 struct gprs_rlcmac_bts *bts = bts_main_data();
916 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
917}
918
Andreas Eversberg12942562012-07-12 14:31:57 +0200919static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +0100920 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
921 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +0200922 "License GNU GPL version 2 or later\r\n"
923 "This is free software: you are free to change and redistribute it.\r\n"
924 "There is NO WARRANTY, to the extent permitted by law.\r\n";
925
926struct vty_app_info pcu_vty_info = {
927 .name = "Osmo-PCU",
928 .version = PACKAGE_VERSION,
929 .copyright = pcu_copyright,
930 .go_parent_cb = pcu_vty_go_parent,
931 .is_config_node = pcu_vty_is_config_node,
932};
933
934int pcu_vty_init(const struct log_info *cat)
935{
936// install_element_ve(&show_pcu_cmd);
937
938 logging_vty_add_cmds(cat);
Jacob Erlbeck42aba812015-11-10 15:32:00 +0100939 osmo_stats_vty_add_cmds(cat);
Andreas Eversberg12942562012-07-12 14:31:57 +0200940
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200941 install_node(&pcu_node, config_write_pcu);
942 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200943 vty_install_default(PCU_NODE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200944 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
945 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200946 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200947 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
948 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200949 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
950 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200951 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
952 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200953 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
954 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200955 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100956 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
957 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100958 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
959 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100960 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200961 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
962 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
963 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100964 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
965 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200966 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
967 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
968 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200969 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
970 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200971 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200972 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200973 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200974 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
975 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200976 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
977 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
978 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
979 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
980 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
981 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
982 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
983 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200984 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
985 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100986 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
987 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +0200988 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
989 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200990
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100991 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +0100992 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200993 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200994 install_element_ve(&show_ms_tlli_cmd);
995 install_element_ve(&show_ms_imsi_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100996
Andreas Eversberg12942562012-07-12 14:31:57 +0200997 return 0;
998}