blob: 3b5996c83fc9f3d183a79cf66f692b189ba343a7 [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>
Neels Hofmeyrd34646a2017-02-08 17:07:40 +01006#include <string.h>
Andreas Eversberg12942562012-07-12 14:31:57 +02007#include <osmocom/vty/logging.h>
Jacob Erlbeck42aba812015-11-10 15:32:00 +01008#include <osmocom/vty/stats.h>
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +02009#include <osmocom/vty/misc.h>
Andreas Eversberg8b761a32012-07-20 21:50:31 +020010#include <osmocom/core/linuxlist.h>
Holger Hans Peter Freythere8915b92014-07-02 14:57:47 +020011#include <osmocom/core/rate_ctr.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020012#include "pcu_vty.h"
Andreas Eversberg8b761a32012-07-20 21:50:31 +020013#include "gprs_rlcmac.h"
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020014#include "bts.h"
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020015#include "tbf.h"
Andreas Eversberg12942562012-07-12 14:31:57 +020016
Jacob Erlbeck62e96a32015-06-04 09:42:14 +020017#include "pcu_vty_functions.h"
18
Jacob Erlbeckf76fede2015-08-17 13:42:46 +020019int pcu_vty_go_parent(struct vty *vty)
Andreas Eversberg12942562012-07-12 14:31:57 +020020{
21 switch (vty->node) {
22#if 0
23 case TRX_NODE:
Andreas Eversberg8b761a32012-07-20 21:50:31 +020024 vty->node = PCU_NODE;
Andreas Eversberg12942562012-07-12 14:31:57 +020025 {
26 struct gsm_bts_trx *trx = vty->index;
27 vty->index = trx->bts;
28 }
29 break;
30#endif
31 default:
32 vty->node = CONFIG_NODE;
33 }
Andreas Eversberg8b761a32012-07-20 21:50:31 +020034 return (enum node_type) vty->node;
Andreas Eversberg12942562012-07-12 14:31:57 +020035}
36
37int pcu_vty_is_config_node(struct vty *vty, int node)
38{
39 switch (node) {
Andreas Eversberg8b761a32012-07-20 21:50:31 +020040 case PCU_NODE:
Andreas Eversberg12942562012-07-12 14:31:57 +020041 return 1;
Andreas Eversberg12942562012-07-12 14:31:57 +020042 default:
43 return 0;
44 }
45}
46
Andreas Eversberg8b761a32012-07-20 21:50:31 +020047static struct cmd_node pcu_node = {
48 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +020049 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +020050 1,
51};
52
Andreas Eversberg8b761a32012-07-20 21:50:31 +020053static int config_write_pcu(struct vty *vty)
54{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +020055 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +020056
57 vty_out(vty, "pcu%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +020058 if (bts->egprs_enabled)
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +010059 vty_out(vty, " egprs only%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +020060
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +020061 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
62 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +020063 if (bts->fc_bvc_bucket_size)
64 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
65 bts->fc_bvc_bucket_size, VTY_NEWLINE);
66 if (bts->fc_bvc_leak_rate)
67 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
68 bts->fc_bvc_leak_rate, VTY_NEWLINE);
69 if (bts->fc_ms_bucket_size)
70 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
71 bts->fc_ms_bucket_size, VTY_NEWLINE);
72 if (bts->fc_ms_leak_rate)
73 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
74 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +020075 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +020076 if (bts->initial_cs_ul == bts->initial_cs_dl)
77 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
78 VTY_NEWLINE);
79 else
80 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
81 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +020082 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +020083 if (bts->max_cs_dl && bts->max_cs_ul) {
84 if (bts->max_cs_ul == bts->max_cs_dl)
85 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
86 VTY_NEWLINE);
87 else
88 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
89 bts->max_cs_ul, VTY_NEWLINE);
90 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +020091 if (bts->cs_adj_enabled)
92 vty_out(vty, " cs threshold %d %d%s",
93 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
94 VTY_NEWLINE);
95 else
96 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
97
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +020098 if (bts->cs_downgrade_threshold)
99 vty_out(vty, " cs downgrade-threshold %d%s",
100 bts->cs_downgrade_threshold, VTY_NEWLINE);
101 else
102 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
103
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200104 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
105 bts->cs_lqual_ranges[0].high,
106 bts->cs_lqual_ranges[1].low,
107 bts->cs_lqual_ranges[1].high,
108 bts->cs_lqual_ranges[2].low,
109 bts->cs_lqual_ranges[2].high,
110 bts->cs_lqual_ranges[3].low,
111 VTY_NEWLINE);
112
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100113 if (bts->initial_mcs_dl != 1 && bts->initial_mcs_ul != 1) {
114 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
115 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
116 VTY_NEWLINE);
117 else
118 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
119 bts->initial_mcs_ul, VTY_NEWLINE);
120 }
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100121 if (bts->max_mcs_dl && bts->max_mcs_ul) {
122 if (bts->max_mcs_ul == bts->max_mcs_dl)
123 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
124 VTY_NEWLINE);
125 else
126 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
127 bts->max_mcs_ul, VTY_NEWLINE);
128 }
129
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100130 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
131 VTY_NEWLINE);
132
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530133 if (bts->dl_arq_type)
134 vty_out(vty, " egprs dl arq-type arq2%s",
135 VTY_NEWLINE);
136
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200137 if (bts->force_llc_lifetime == 0xffff)
138 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
139 else if (bts->force_llc_lifetime)
140 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
141 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100142 if (bts->llc_discard_csec)
143 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
144 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200145 if (bts->llc_idle_ack_csec)
146 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
147 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200148 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
149 vty_out(vty, " queue codel%s", VTY_NEWLINE);
150 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
151 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
152 else
153 vty_out(vty, " queue codel interval %d%s",
154 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
155
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200156 if (bts->alloc_algorithm == alloc_algorithm_a)
157 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
158 if (bts->alloc_algorithm == alloc_algorithm_b)
159 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200160 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
161 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200162 if (bts->force_two_phase)
163 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200164 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
165 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100166 if (bts->dl_tbf_idle_msec)
167 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
168 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200169
Jacob Erlbeck62e96a32015-06-04 09:42:14 +0200170 return pcu_vty_config_write_pcu_ext(vty);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200171}
172
173/* per-BTS configuration */
174DEFUN(cfg_pcu,
175 cfg_pcu_cmd,
176 "pcu",
177 "BTS specific configure")
178{
179 vty->node = PCU_NODE;
180
181 return CMD_SUCCESS;
182}
183
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200184#define EGPRS_STR "EGPRS configuration\n"
185
186DEFUN(cfg_pcu_egprs,
187 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100188 "egprs only",
189 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200190{
191 struct gprs_rlcmac_bts *bts = bts_main_data();
192
193 bts->egprs_enabled = 1;
194
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200195 return CMD_SUCCESS;
196}
197
198DEFUN(cfg_pcu_no_egprs,
199 cfg_pcu_no_egprs_cmd,
200 "no egprs",
201 NO_STR EGPRS_STR)
202{
203 struct gprs_rlcmac_bts *bts = bts_main_data();
204
205 bts->egprs_enabled = 0;
206
207 return CMD_SUCCESS;
208}
209
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200210DEFUN(cfg_pcu_fc_interval,
211 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200212 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200213 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200214 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200215{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200216 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200217
218 bts->fc_interval = atoi(argv[0]);
219
220 return CMD_SUCCESS;
221}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200222#define FC_STR "BSSGP Flow Control configuration\n"
223#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
224#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
225
226DEFUN(cfg_pcu_fc_bvc_bucket_size,
227 cfg_pcu_fc_bvc_bucket_size_cmd,
228 "flow-control force-bvc-bucket-size <1-6553500>",
229 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
230{
231 struct gprs_rlcmac_bts *bts = bts_main_data();
232
233 bts->fc_bvc_bucket_size = atoi(argv[0]);
234
235 return CMD_SUCCESS;
236}
237
238DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
239 cfg_pcu_no_fc_bvc_bucket_size_cmd,
240 "no flow-control force-bvc-bucket-size",
241 NO_STR FC_STR FC_BMAX_STR("BVC"))
242{
243 struct gprs_rlcmac_bts *bts = bts_main_data();
244
245 bts->fc_bvc_bucket_size = 0;
246
247 return CMD_SUCCESS;
248}
249
250DEFUN(cfg_pcu_fc_bvc_leak_rate,
251 cfg_pcu_fc_bvc_leak_rate_cmd,
252 "flow-control force-bvc-leak-rate <1-6553500>",
253 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
254{
255 struct gprs_rlcmac_bts *bts = bts_main_data();
256
257 bts->fc_bvc_leak_rate = atoi(argv[0]);
258
259 return CMD_SUCCESS;
260}
261
262DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
263 cfg_pcu_no_fc_bvc_leak_rate_cmd,
264 "no flow-control force-bvc-leak-rate",
265 NO_STR FC_STR FC_LR_STR("BVC"))
266{
267 struct gprs_rlcmac_bts *bts = bts_main_data();
268
269 bts->fc_bvc_leak_rate = 0;
270
271 return CMD_SUCCESS;
272}
273
274DEFUN(cfg_pcu_fc_ms_bucket_size,
275 cfg_pcu_fc_ms_bucket_size_cmd,
276 "flow-control force-ms-bucket-size <1-6553500>",
277 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
278{
279 struct gprs_rlcmac_bts *bts = bts_main_data();
280
281 bts->fc_ms_bucket_size = atoi(argv[0]);
282
283 return CMD_SUCCESS;
284}
285
286DEFUN(cfg_pcu_no_fc_ms_bucket_size,
287 cfg_pcu_no_fc_ms_bucket_size_cmd,
288 "no flow-control force-ms-bucket-size",
289 NO_STR FC_STR FC_BMAX_STR("default MS"))
290{
291 struct gprs_rlcmac_bts *bts = bts_main_data();
292
293 bts->fc_ms_bucket_size = 0;
294
295 return CMD_SUCCESS;
296}
297
298DEFUN(cfg_pcu_fc_ms_leak_rate,
299 cfg_pcu_fc_ms_leak_rate_cmd,
300 "flow-control force-ms-leak-rate <1-6553500>",
301 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
302{
303 struct gprs_rlcmac_bts *bts = bts_main_data();
304
305 bts->fc_ms_leak_rate = atoi(argv[0]);
306
307 return CMD_SUCCESS;
308}
309
310DEFUN(cfg_pcu_no_fc_ms_leak_rate,
311 cfg_pcu_no_fc_ms_leak_rate_cmd,
312 "no flow-control force-ms-leak-rate",
313 NO_STR FC_STR FC_LR_STR("default MS"))
314{
315 struct gprs_rlcmac_bts *bts = bts_main_data();
316
317 bts->fc_ms_leak_rate = 0;
318
319 return CMD_SUCCESS;
320}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200321
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200322#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
323DEFUN(cfg_pcu_fc_bucket_time,
324 cfg_pcu_fc_bucket_time_cmd,
325 "flow-control bucket-time <1-65534>",
326 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
327{
328 struct gprs_rlcmac_bts *bts = bts_main_data();
329
330 bts->fc_bucket_time = atoi(argv[0]);
331
332 return CMD_SUCCESS;
333}
334
335DEFUN(cfg_pcu_no_fc_bucket_time,
336 cfg_pcu_no_fc_bucket_time_cmd,
337 "no flow-control bucket-time",
338 NO_STR FC_STR FC_BTIME_STR)
339{
340 struct gprs_rlcmac_bts *bts = bts_main_data();
341
342 bts->fc_bucket_time = 0;
343
344 return CMD_SUCCESS;
345}
346
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200347#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200348
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200349DEFUN(cfg_pcu_cs,
350 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200351 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200352 CS_STR
353 "Initial CS value to be used (overrides BTS config)\n"
354 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200355{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200356 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200357 uint8_t cs = atoi(argv[0]);
358
359 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200360 bts->initial_cs_dl = cs;
361 if (argc > 1)
362 bts->initial_cs_ul = atoi(argv[1]);
363 else
364 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200365
366 return CMD_SUCCESS;
367}
368
369DEFUN(cfg_pcu_no_cs,
370 cfg_pcu_no_cs_cmd,
371 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200372 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200373{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200374 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200375
376 bts->force_cs = 0;
377
378 return CMD_SUCCESS;
379}
380
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100381#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200382DEFUN(cfg_pcu_cs_max,
383 cfg_pcu_cs_max_cmd,
384 "cs max <1-4> [<1-4>]",
385 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100386 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200387 "Maximum CS value to be used\n"
388 "Use a different maximum CS value for the uplink")
389{
390 struct gprs_rlcmac_bts *bts = bts_main_data();
391 uint8_t cs = atoi(argv[0]);
392
393 bts->max_cs_dl = cs;
394 if (argc > 1)
395 bts->max_cs_ul = atoi(argv[1]);
396 else
397 bts->max_cs_ul = cs;
398
399 return CMD_SUCCESS;
400}
401
402DEFUN(cfg_pcu_no_cs_max,
403 cfg_pcu_no_cs_max_cmd,
404 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100405 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200406{
407 struct gprs_rlcmac_bts *bts = bts_main_data();
408
409 bts->max_cs_dl = 0;
410 bts->max_cs_ul = 0;
411
412 return CMD_SUCCESS;
413}
414
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100415#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
416
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100417DEFUN(cfg_pcu_mcs,
418 cfg_pcu_mcs_cmd,
419 "mcs <1-9> [<1-9>]",
420 MCS_STR
421 "Initial MCS value to be used (default 1)\n"
422 "Use a different initial MCS value for the uplink")
423{
424 struct gprs_rlcmac_bts *bts = bts_main_data();
425 uint8_t cs = atoi(argv[0]);
426
427 bts->initial_mcs_dl = cs;
428 if (argc > 1)
429 bts->initial_mcs_ul = atoi(argv[1]);
430 else
431 bts->initial_mcs_ul = cs;
432
433 return CMD_SUCCESS;
434}
435
436DEFUN(cfg_pcu_no_mcs,
437 cfg_pcu_no_mcs_cmd,
438 "no mcs",
439 NO_STR MCS_STR)
440{
441 struct gprs_rlcmac_bts *bts = bts_main_data();
442
443 bts->initial_mcs_dl = 1;
444 bts->initial_mcs_ul = 1;
445
446 return CMD_SUCCESS;
447}
448
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100449DEFUN(cfg_pcu_mcs_max,
450 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100451 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100452 MCS_STR
453 CS_MAX_STR
454 "Maximum MCS value to be used\n"
455 "Use a different maximum MCS value for the uplink")
456{
457 struct gprs_rlcmac_bts *bts = bts_main_data();
458 uint8_t mcs = atoi(argv[0]);
459
460 bts->max_mcs_dl = mcs;
461 if (argc > 1)
462 bts->max_mcs_ul = atoi(argv[1]);
463 else
464 bts->max_mcs_ul = mcs;
465
466 return CMD_SUCCESS;
467}
468
469DEFUN(cfg_pcu_no_mcs_max,
470 cfg_pcu_no_mcs_max_cmd,
471 "no mcs max",
472 NO_STR MCS_STR CS_MAX_STR)
473{
474 struct gprs_rlcmac_bts *bts = bts_main_data();
475
476 bts->max_mcs_dl = 0;
477 bts->max_mcs_ul = 0;
478
479 return CMD_SUCCESS;
480}
481
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530482#define DL_STR "downlink specific configuration\n"
483
484DEFUN(cfg_pcu_dl_arq_type,
485 cfg_pcu_dl_arq_cmd,
486 "egprs dl arq-type (spb|arq2)",
487 EGPRS_STR DL_STR "ARQ options\n"
488 "enable SPB(ARQ1) support\n"
489 "enable ARQ2 support")
490{
491 struct gprs_rlcmac_bts *bts = bts_main_data();
492
493 if (!strcmp(argv[0], "arq2"))
494 bts->dl_arq_type = 1;
495 else
496 bts->dl_arq_type = 0;
497
498 return CMD_SUCCESS;
499}
500
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100501DEFUN(cfg_pcu_window_size,
502 cfg_pcu_window_size_cmd,
503 "window-size <0-1024> [<0-256>]",
504 "Window size configuration (b + N_PDCH * f)\n"
505 "Base value (b)\n"
506 "Factor for number of PDCH (f)")
507{
508 struct gprs_rlcmac_bts *bts = bts_main_data();
509 uint16_t b = atoi(argv[0]);
510
511 bts->ws_base = b;
512 if (argc > 1) {
513 uint16_t f = atoi(argv[1]);
514 bts->ws_pdch = f;
515 }
516
517 return CMD_SUCCESS;
518}
519
520
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200521#define QUEUE_STR "Packet queue options\n"
522#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
523 "(overrides the value given by SGSN)\n"
524
525DEFUN(cfg_pcu_queue_lifetime,
526 cfg_pcu_queue_lifetime_cmd,
527 "queue lifetime <1-65534>",
528 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
529{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200530 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200531 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200532
533 bts->force_llc_lifetime = csec;
534
535 return CMD_SUCCESS;
536}
537
538DEFUN(cfg_pcu_queue_lifetime_inf,
539 cfg_pcu_queue_lifetime_inf_cmd,
540 "queue lifetime infinite",
541 QUEUE_STR LIFETIME_STR "Infinite lifetime")
542{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200543 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200544
545 bts->force_llc_lifetime = 0xffff;
546
547 return CMD_SUCCESS;
548}
549
550DEFUN(cfg_pcu_no_queue_lifetime,
551 cfg_pcu_no_queue_lifetime_cmd,
552 "no queue lifetime",
553 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
554 "by SGSN)\n")
555{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200556 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200557
558 bts->force_llc_lifetime = 0;
559
560 return CMD_SUCCESS;
561}
562
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100563#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
564 "(continue discarding until lifetime-hysteresis is reached)\n"
565
566DEFUN(cfg_pcu_queue_hysteresis,
567 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200568 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100569 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
570{
571 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200572 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100573
574 bts->llc_discard_csec = csec;
575
576 return CMD_SUCCESS;
577}
578
579DEFUN(cfg_pcu_no_queue_hysteresis,
580 cfg_pcu_no_queue_hysteresis_cmd,
581 "no queue hysteresis",
582 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
583{
584 struct gprs_rlcmac_bts *bts = bts_main_data();
585
586 bts->llc_discard_csec = 0;
587
588 return CMD_SUCCESS;
589}
590
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200591#define QUEUE_CODEL_STR "Set CoDel queue management\n"
592
593DEFUN(cfg_pcu_queue_codel,
594 cfg_pcu_queue_codel_cmd,
595 "queue codel",
596 QUEUE_STR QUEUE_CODEL_STR)
597{
598 struct gprs_rlcmac_bts *bts = bts_main_data();
599
600 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
601
602 return CMD_SUCCESS;
603}
604
605DEFUN(cfg_pcu_queue_codel_interval,
606 cfg_pcu_queue_codel_interval_cmd,
607 "queue codel interval <1-1000>",
608 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
609{
610 struct gprs_rlcmac_bts *bts = bts_main_data();
611 uint16_t csec = atoi(argv[0]);
612
613 bts->llc_codel_interval_msec = 10*csec;
614
615 return CMD_SUCCESS;
616}
617
618DEFUN(cfg_pcu_no_queue_codel,
619 cfg_pcu_no_queue_codel_cmd,
620 "no queue codel",
621 NO_STR QUEUE_STR QUEUE_CODEL_STR)
622{
623 struct gprs_rlcmac_bts *bts = bts_main_data();
624
625 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
626
627 return CMD_SUCCESS;
628}
629
630
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200631#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
632
633DEFUN(cfg_pcu_queue_idle_ack_delay,
634 cfg_pcu_queue_idle_ack_delay_cmd,
635 "queue idle-ack-delay <1-65535>",
636 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
637{
638 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200639 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200640
641 bts->llc_idle_ack_csec = csec;
642
643 return CMD_SUCCESS;
644}
645
646DEFUN(cfg_pcu_no_queue_idle_ack_delay,
647 cfg_pcu_no_queue_idle_ack_delay_cmd,
648 "no queue idle-ack-delay",
649 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
650{
651 struct gprs_rlcmac_bts *bts = bts_main_data();
652
653 bts->llc_idle_ack_csec = 0;
654
655 return CMD_SUCCESS;
656}
657
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100658
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200659DEFUN(cfg_pcu_alloc,
660 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200661 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200662 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200663 "PACCH\n"
664 "Single slot is assigned only\n"
665 "Multiple slots are assigned for semi-duplex operation\n"
666 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200667{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200668 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200669
670 switch (argv[0][0]) {
671 case 'a':
672 bts->alloc_algorithm = alloc_algorithm_a;
673 break;
674 case 'b':
675 bts->alloc_algorithm = alloc_algorithm_b;
676 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200677 default:
678 bts->alloc_algorithm = alloc_algorithm_dynamic;
679 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200680 }
681
682 return CMD_SUCCESS;
683}
684
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200685DEFUN(cfg_pcu_two_phase,
686 cfg_pcu_two_phase_cmd,
687 "two-phase-access",
688 "Force two phase access when MS requests single phase access\n")
689{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200690 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200691
692 bts->force_two_phase = 1;
693
694 return CMD_SUCCESS;
695}
696
697DEFUN(cfg_pcu_no_two_phase,
698 cfg_pcu_no_two_phase_cmd,
699 "no two-phase-access",
700 NO_STR "Only use two phase access when requested my MS\n")
701{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200702 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200703
704 bts->force_two_phase = 0;
705
706 return CMD_SUCCESS;
707}
708
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200709DEFUN(cfg_pcu_alpha,
710 cfg_pcu_alpha_cmd,
711 "alpha <0-10>",
712 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
713 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
714 "Alpha in units of 0.1\n")
715{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200716 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200717
718 bts->alpha = atoi(argv[0]);
719
720 return CMD_SUCCESS;
721}
722
723DEFUN(cfg_pcu_gamma,
724 cfg_pcu_gamma_cmd,
725 "gamma <0-62>",
726 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
727 "Gamma in even unit of dBs\n")
728{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200729 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200730
731 bts->gamma = atoi(argv[0]) / 2;
732
733 return CMD_SUCCESS;
734}
735
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100736DEFUN(show_bts_stats,
737 show_bts_stats_cmd,
738 "show bts statistics",
739 SHOW_STR "BTS related functionality\nStatistics\n")
740{
741 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
742 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100743}
744
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100745#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
746DEFUN(cfg_pcu_dl_tbf_idle_time,
747 cfg_pcu_dl_tbf_idle_time_cmd,
748 "dl-tbf-idle-time <1-5000>",
749 IDLE_TIME_STR "idle time in msec")
750{
751 struct gprs_rlcmac_bts *bts = bts_main_data();
752
753 bts->dl_tbf_idle_msec = atoi(argv[0]);
754
755 return CMD_SUCCESS;
756}
757
758DEFUN(cfg_pcu_no_dl_tbf_idle_time,
759 cfg_pcu_no_dl_tbf_idle_time_cmd,
760 "no dl-tbf-idle-time",
761 NO_STR IDLE_TIME_STR)
762{
763 struct gprs_rlcmac_bts *bts = bts_main_data();
764
765 bts->dl_tbf_idle_msec = 0;
766
767 return CMD_SUCCESS;
768}
769
Jacob Erlbecka098c192015-05-28 16:11:19 +0200770#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
771DEFUN(cfg_pcu_ms_idle_time,
772 cfg_pcu_ms_idle_time_cmd,
773 "ms-idle-time <1-7200>",
774 MS_IDLE_TIME_STR "idle time in sec")
775{
776 struct gprs_rlcmac_bts *bts = bts_main_data();
777
778 bts->ms_idle_sec = atoi(argv[0]);
779
780 return CMD_SUCCESS;
781}
782
783DEFUN(cfg_pcu_no_ms_idle_time,
784 cfg_pcu_no_ms_idle_time_cmd,
785 "no ms-idle-time",
786 NO_STR MS_IDLE_TIME_STR)
787{
788 struct gprs_rlcmac_bts *bts = bts_main_data();
789
790 bts->ms_idle_sec = 0;
791
792 return CMD_SUCCESS;
793}
794
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200795#define CS_ERR_LIMITS_STR "set thresholds for error rate based CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200796DEFUN(cfg_pcu_cs_err_limits,
797 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200798 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200799 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
800{
801 struct gprs_rlcmac_bts *bts = bts_main_data();
802
803 uint8_t lower_limit = atoi(argv[0]);
804 uint8_t upper_limit = atoi(argv[1]);
805
806 if (lower_limit > upper_limit) {
807 vty_out(vty,
808 "The lower limit must be less than or equal to the "
809 "upper limit.%s", VTY_NEWLINE);
810 return CMD_WARNING;
811 }
812
813 bts->cs_adj_enabled = 1;
814 bts->cs_adj_upper_limit = upper_limit;
815 bts->cs_adj_lower_limit = lower_limit;
816
817 return CMD_SUCCESS;
818}
819
820DEFUN(cfg_pcu_no_cs_err_limits,
821 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200822 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200823 NO_STR CS_STR CS_ERR_LIMITS_STR)
824{
825 struct gprs_rlcmac_bts *bts = bts_main_data();
826
827 bts->cs_adj_enabled = 0;
828 bts->cs_adj_upper_limit = 100;
829 bts->cs_adj_lower_limit = 0;
830
831 return CMD_SUCCESS;
832}
833
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200834#define CS_DOWNGRADE_STR "set threshold for data size based CS downgrade\n"
835DEFUN(cfg_pcu_cs_downgrade_thrsh,
836 cfg_pcu_cs_downgrade_thrsh_cmd,
837 "cs downgrade-threshold <1-10000>",
838 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
839{
840 struct gprs_rlcmac_bts *bts = bts_main_data();
841
842 bts->cs_downgrade_threshold = atoi(argv[0]);
843
844 return CMD_SUCCESS;
845}
846
847DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
848 cfg_pcu_no_cs_downgrade_thrsh_cmd,
849 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200850 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200851{
852 struct gprs_rlcmac_bts *bts = bts_main_data();
853
854 bts->cs_downgrade_threshold = 0;
855
856 return CMD_SUCCESS;
857}
858
859
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200860DEFUN(cfg_pcu_cs_lqual_ranges,
861 cfg_pcu_cs_lqual_ranges_cmd,
862 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
863 CS_STR "Set link quality ranges\n"
864 "Set quality range for CS-1 (high value only)\n"
865 "CS-1 high (dB)\n"
866 "Set quality range for CS-2\n"
867 "CS-2 low (dB)\n"
868 "CS-2 high (dB)\n"
869 "Set quality range for CS-3\n"
870 "CS-3 low (dB)\n"
871 "CS-3 high (dB)\n"
872 "Set quality range for CS-4 (low value only)\n"
873 "CS-4 low (dB)\n")
874{
875 struct gprs_rlcmac_bts *bts = bts_main_data();
876
877 uint8_t cs1_high = atoi(argv[0]);
878 uint8_t cs2_low = atoi(argv[1]);
879 uint8_t cs2_high = atoi(argv[2]);
880 uint8_t cs3_low = atoi(argv[3]);
881 uint8_t cs3_high = atoi(argv[4]);
882 uint8_t cs4_low = atoi(argv[5]);
883
884 bts->cs_lqual_ranges[0].high = cs1_high;
885 bts->cs_lqual_ranges[1].low = cs2_low;
886 bts->cs_lqual_ranges[1].high = cs2_high;
887 bts->cs_lqual_ranges[2].low = cs3_low;
888 bts->cs_lqual_ranges[2].high = cs3_high;
889 bts->cs_lqual_ranges[3].low = cs4_low;
890
891 return CMD_SUCCESS;
892}
893
894
Daniel Willmann772415f2014-01-15 17:06:51 +0100895DEFUN(show_tbf,
896 show_tbf_cmd,
897 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100898 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100899{
900 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbecked2dbf62015-12-28 19:15:40 +0100901 return pcu_vty_show_tbf_all(vty, bts);
Daniel Willmann772415f2014-01-15 17:06:51 +0100902}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100903
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200904DEFUN(show_ms_all,
905 show_ms_all_cmd,
906 "show ms all",
907 SHOW_STR "information about MSs\n" "All TBFs\n")
908{
909 struct gprs_rlcmac_bts *bts = bts_main_data();
910 return pcu_vty_show_ms_all(vty, bts);
911}
912
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200913DEFUN(show_ms_tlli,
914 show_ms_tlli_cmd,
915 "show ms tlli TLLI",
916 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
917{
918 struct gprs_rlcmac_bts *bts = bts_main_data();
919 char *endp = NULL;
920 unsigned long long tlli = strtoll(argv[0], &endp, 16);
921 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
922 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
923 return CMD_WARNING;
924 }
925 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
926}
927
928DEFUN(show_ms_imsi,
929 show_ms_imsi_cmd,
930 "show ms imsi IMSI",
931 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
932{
933 struct gprs_rlcmac_bts *bts = bts_main_data();
934 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
935}
936
Andreas Eversberg12942562012-07-12 14:31:57 +0200937static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +0100938 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
939 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +0200940 "License GNU GPL version 2 or later\r\n"
941 "This is free software: you are free to change and redistribute it.\r\n"
942 "There is NO WARRANTY, to the extent permitted by law.\r\n";
943
944struct vty_app_info pcu_vty_info = {
945 .name = "Osmo-PCU",
946 .version = PACKAGE_VERSION,
947 .copyright = pcu_copyright,
948 .go_parent_cb = pcu_vty_go_parent,
949 .is_config_node = pcu_vty_is_config_node,
950};
951
952int pcu_vty_init(const struct log_info *cat)
953{
954// install_element_ve(&show_pcu_cmd);
955
956 logging_vty_add_cmds(cat);
Jacob Erlbeck42aba812015-11-10 15:32:00 +0100957 osmo_stats_vty_add_cmds(cat);
Andreas Eversberg12942562012-07-12 14:31:57 +0200958
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200959 install_node(&pcu_node, config_write_pcu);
960 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200961 vty_install_default(PCU_NODE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200962 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
963 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200964 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200965 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
966 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200967 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
968 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200969 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
970 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200971 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
972 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200973 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100974 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530975 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100976 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100977 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
978 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100979 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200980 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
981 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
982 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100983 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
984 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200985 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
986 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
987 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200988 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
989 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200990 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200991 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200992 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200993 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
994 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200995 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
996 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
997 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
998 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
999 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1000 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1001 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1002 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001003 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1004 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001005 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1006 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001007 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1008 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001009
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001010 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001011 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001012 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001013 install_element_ve(&show_ms_tlli_cmd);
1014 install_element_ve(&show_ms_imsi_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001015
Andreas Eversberg12942562012-07-12 14:31:57 +02001016 return 0;
1017}