blob: 535d512bf25e32141f301e5ed7e2f5a8af3d76b9 [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
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530132 if (bts->dl_arq_type)
133 vty_out(vty, " egprs dl arq-type arq2%s",
134 VTY_NEWLINE);
135
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200136 if (bts->force_llc_lifetime == 0xffff)
137 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
138 else if (bts->force_llc_lifetime)
139 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
140 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100141 if (bts->llc_discard_csec)
142 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
143 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200144 if (bts->llc_idle_ack_csec)
145 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
146 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200147 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
148 vty_out(vty, " queue codel%s", VTY_NEWLINE);
149 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
150 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
151 else
152 vty_out(vty, " queue codel interval %d%s",
153 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
154
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200155 if (bts->alloc_algorithm == alloc_algorithm_a)
156 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
157 if (bts->alloc_algorithm == alloc_algorithm_b)
158 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200159 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
160 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200161 if (bts->force_two_phase)
162 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200163 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
164 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100165 if (bts->dl_tbf_idle_msec)
166 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
167 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200168
Jacob Erlbeck62e96a32015-06-04 09:42:14 +0200169 return pcu_vty_config_write_pcu_ext(vty);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200170}
171
172/* per-BTS configuration */
173DEFUN(cfg_pcu,
174 cfg_pcu_cmd,
175 "pcu",
176 "BTS specific configure")
177{
178 vty->node = PCU_NODE;
179
180 return CMD_SUCCESS;
181}
182
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200183#define EGPRS_STR "EGPRS configuration\n"
184
185DEFUN(cfg_pcu_egprs,
186 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100187 "egprs only",
188 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200189{
190 struct gprs_rlcmac_bts *bts = bts_main_data();
191
192 bts->egprs_enabled = 1;
193
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200194 return CMD_SUCCESS;
195}
196
197DEFUN(cfg_pcu_no_egprs,
198 cfg_pcu_no_egprs_cmd,
199 "no egprs",
200 NO_STR EGPRS_STR)
201{
202 struct gprs_rlcmac_bts *bts = bts_main_data();
203
204 bts->egprs_enabled = 0;
205
206 return CMD_SUCCESS;
207}
208
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200209DEFUN(cfg_pcu_fc_interval,
210 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200211 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200212 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200213 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200214{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200215 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200216
217 bts->fc_interval = atoi(argv[0]);
218
219 return CMD_SUCCESS;
220}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200221#define FC_STR "BSSGP Flow Control configuration\n"
222#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
223#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
224
225DEFUN(cfg_pcu_fc_bvc_bucket_size,
226 cfg_pcu_fc_bvc_bucket_size_cmd,
227 "flow-control force-bvc-bucket-size <1-6553500>",
228 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
229{
230 struct gprs_rlcmac_bts *bts = bts_main_data();
231
232 bts->fc_bvc_bucket_size = atoi(argv[0]);
233
234 return CMD_SUCCESS;
235}
236
237DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
238 cfg_pcu_no_fc_bvc_bucket_size_cmd,
239 "no flow-control force-bvc-bucket-size",
240 NO_STR FC_STR FC_BMAX_STR("BVC"))
241{
242 struct gprs_rlcmac_bts *bts = bts_main_data();
243
244 bts->fc_bvc_bucket_size = 0;
245
246 return CMD_SUCCESS;
247}
248
249DEFUN(cfg_pcu_fc_bvc_leak_rate,
250 cfg_pcu_fc_bvc_leak_rate_cmd,
251 "flow-control force-bvc-leak-rate <1-6553500>",
252 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
253{
254 struct gprs_rlcmac_bts *bts = bts_main_data();
255
256 bts->fc_bvc_leak_rate = atoi(argv[0]);
257
258 return CMD_SUCCESS;
259}
260
261DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
262 cfg_pcu_no_fc_bvc_leak_rate_cmd,
263 "no flow-control force-bvc-leak-rate",
264 NO_STR FC_STR FC_LR_STR("BVC"))
265{
266 struct gprs_rlcmac_bts *bts = bts_main_data();
267
268 bts->fc_bvc_leak_rate = 0;
269
270 return CMD_SUCCESS;
271}
272
273DEFUN(cfg_pcu_fc_ms_bucket_size,
274 cfg_pcu_fc_ms_bucket_size_cmd,
275 "flow-control force-ms-bucket-size <1-6553500>",
276 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
277{
278 struct gprs_rlcmac_bts *bts = bts_main_data();
279
280 bts->fc_ms_bucket_size = atoi(argv[0]);
281
282 return CMD_SUCCESS;
283}
284
285DEFUN(cfg_pcu_no_fc_ms_bucket_size,
286 cfg_pcu_no_fc_ms_bucket_size_cmd,
287 "no flow-control force-ms-bucket-size",
288 NO_STR FC_STR FC_BMAX_STR("default MS"))
289{
290 struct gprs_rlcmac_bts *bts = bts_main_data();
291
292 bts->fc_ms_bucket_size = 0;
293
294 return CMD_SUCCESS;
295}
296
297DEFUN(cfg_pcu_fc_ms_leak_rate,
298 cfg_pcu_fc_ms_leak_rate_cmd,
299 "flow-control force-ms-leak-rate <1-6553500>",
300 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
301{
302 struct gprs_rlcmac_bts *bts = bts_main_data();
303
304 bts->fc_ms_leak_rate = atoi(argv[0]);
305
306 return CMD_SUCCESS;
307}
308
309DEFUN(cfg_pcu_no_fc_ms_leak_rate,
310 cfg_pcu_no_fc_ms_leak_rate_cmd,
311 "no flow-control force-ms-leak-rate",
312 NO_STR FC_STR FC_LR_STR("default MS"))
313{
314 struct gprs_rlcmac_bts *bts = bts_main_data();
315
316 bts->fc_ms_leak_rate = 0;
317
318 return CMD_SUCCESS;
319}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200320
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200321#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
322DEFUN(cfg_pcu_fc_bucket_time,
323 cfg_pcu_fc_bucket_time_cmd,
324 "flow-control bucket-time <1-65534>",
325 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
326{
327 struct gprs_rlcmac_bts *bts = bts_main_data();
328
329 bts->fc_bucket_time = atoi(argv[0]);
330
331 return CMD_SUCCESS;
332}
333
334DEFUN(cfg_pcu_no_fc_bucket_time,
335 cfg_pcu_no_fc_bucket_time_cmd,
336 "no flow-control bucket-time",
337 NO_STR FC_STR FC_BTIME_STR)
338{
339 struct gprs_rlcmac_bts *bts = bts_main_data();
340
341 bts->fc_bucket_time = 0;
342
343 return CMD_SUCCESS;
344}
345
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200346#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200347
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200348DEFUN(cfg_pcu_cs,
349 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200350 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200351 CS_STR
352 "Initial CS value to be used (overrides BTS config)\n"
353 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200354{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200355 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200356 uint8_t cs = atoi(argv[0]);
357
358 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200359 bts->initial_cs_dl = cs;
360 if (argc > 1)
361 bts->initial_cs_ul = atoi(argv[1]);
362 else
363 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200364
365 return CMD_SUCCESS;
366}
367
368DEFUN(cfg_pcu_no_cs,
369 cfg_pcu_no_cs_cmd,
370 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200371 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200372{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200373 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200374
375 bts->force_cs = 0;
376
377 return CMD_SUCCESS;
378}
379
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100380#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200381DEFUN(cfg_pcu_cs_max,
382 cfg_pcu_cs_max_cmd,
383 "cs max <1-4> [<1-4>]",
384 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100385 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200386 "Maximum CS value to be used\n"
387 "Use a different maximum CS value for the uplink")
388{
389 struct gprs_rlcmac_bts *bts = bts_main_data();
390 uint8_t cs = atoi(argv[0]);
391
392 bts->max_cs_dl = cs;
393 if (argc > 1)
394 bts->max_cs_ul = atoi(argv[1]);
395 else
396 bts->max_cs_ul = cs;
397
398 return CMD_SUCCESS;
399}
400
401DEFUN(cfg_pcu_no_cs_max,
402 cfg_pcu_no_cs_max_cmd,
403 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100404 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200405{
406 struct gprs_rlcmac_bts *bts = bts_main_data();
407
408 bts->max_cs_dl = 0;
409 bts->max_cs_ul = 0;
410
411 return CMD_SUCCESS;
412}
413
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100414#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
415
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100416DEFUN(cfg_pcu_mcs,
417 cfg_pcu_mcs_cmd,
418 "mcs <1-9> [<1-9>]",
419 MCS_STR
420 "Initial MCS value to be used (default 1)\n"
421 "Use a different initial MCS value for the uplink")
422{
423 struct gprs_rlcmac_bts *bts = bts_main_data();
424 uint8_t cs = atoi(argv[0]);
425
426 bts->initial_mcs_dl = cs;
427 if (argc > 1)
428 bts->initial_mcs_ul = atoi(argv[1]);
429 else
430 bts->initial_mcs_ul = cs;
431
432 return CMD_SUCCESS;
433}
434
435DEFUN(cfg_pcu_no_mcs,
436 cfg_pcu_no_mcs_cmd,
437 "no mcs",
438 NO_STR MCS_STR)
439{
440 struct gprs_rlcmac_bts *bts = bts_main_data();
441
442 bts->initial_mcs_dl = 1;
443 bts->initial_mcs_ul = 1;
444
445 return CMD_SUCCESS;
446}
447
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100448DEFUN(cfg_pcu_mcs_max,
449 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100450 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100451 MCS_STR
452 CS_MAX_STR
453 "Maximum MCS value to be used\n"
454 "Use a different maximum MCS value for the uplink")
455{
456 struct gprs_rlcmac_bts *bts = bts_main_data();
457 uint8_t mcs = atoi(argv[0]);
458
459 bts->max_mcs_dl = mcs;
460 if (argc > 1)
461 bts->max_mcs_ul = atoi(argv[1]);
462 else
463 bts->max_mcs_ul = mcs;
464
465 return CMD_SUCCESS;
466}
467
468DEFUN(cfg_pcu_no_mcs_max,
469 cfg_pcu_no_mcs_max_cmd,
470 "no mcs max",
471 NO_STR MCS_STR CS_MAX_STR)
472{
473 struct gprs_rlcmac_bts *bts = bts_main_data();
474
475 bts->max_mcs_dl = 0;
476 bts->max_mcs_ul = 0;
477
478 return CMD_SUCCESS;
479}
480
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530481#define DL_STR "downlink specific configuration\n"
482
483DEFUN(cfg_pcu_dl_arq_type,
484 cfg_pcu_dl_arq_cmd,
485 "egprs dl arq-type (spb|arq2)",
486 EGPRS_STR DL_STR "ARQ options\n"
487 "enable SPB(ARQ1) support\n"
488 "enable ARQ2 support")
489{
490 struct gprs_rlcmac_bts *bts = bts_main_data();
491
492 if (!strcmp(argv[0], "arq2"))
493 bts->dl_arq_type = 1;
494 else
495 bts->dl_arq_type = 0;
496
497 return CMD_SUCCESS;
498}
499
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100500DEFUN(cfg_pcu_window_size,
501 cfg_pcu_window_size_cmd,
502 "window-size <0-1024> [<0-256>]",
503 "Window size configuration (b + N_PDCH * f)\n"
504 "Base value (b)\n"
505 "Factor for number of PDCH (f)")
506{
507 struct gprs_rlcmac_bts *bts = bts_main_data();
508 uint16_t b = atoi(argv[0]);
509
510 bts->ws_base = b;
511 if (argc > 1) {
512 uint16_t f = atoi(argv[1]);
513 bts->ws_pdch = f;
514 }
515
516 return CMD_SUCCESS;
517}
518
519
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200520#define QUEUE_STR "Packet queue options\n"
521#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
522 "(overrides the value given by SGSN)\n"
523
524DEFUN(cfg_pcu_queue_lifetime,
525 cfg_pcu_queue_lifetime_cmd,
526 "queue lifetime <1-65534>",
527 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
528{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200529 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200530 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200531
532 bts->force_llc_lifetime = csec;
533
534 return CMD_SUCCESS;
535}
536
537DEFUN(cfg_pcu_queue_lifetime_inf,
538 cfg_pcu_queue_lifetime_inf_cmd,
539 "queue lifetime infinite",
540 QUEUE_STR LIFETIME_STR "Infinite lifetime")
541{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200542 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200543
544 bts->force_llc_lifetime = 0xffff;
545
546 return CMD_SUCCESS;
547}
548
549DEFUN(cfg_pcu_no_queue_lifetime,
550 cfg_pcu_no_queue_lifetime_cmd,
551 "no queue lifetime",
552 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
553 "by SGSN)\n")
554{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200555 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200556
557 bts->force_llc_lifetime = 0;
558
559 return CMD_SUCCESS;
560}
561
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100562#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
563 "(continue discarding until lifetime-hysteresis is reached)\n"
564
565DEFUN(cfg_pcu_queue_hysteresis,
566 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200567 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100568 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
569{
570 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200571 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100572
573 bts->llc_discard_csec = csec;
574
575 return CMD_SUCCESS;
576}
577
578DEFUN(cfg_pcu_no_queue_hysteresis,
579 cfg_pcu_no_queue_hysteresis_cmd,
580 "no queue hysteresis",
581 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
582{
583 struct gprs_rlcmac_bts *bts = bts_main_data();
584
585 bts->llc_discard_csec = 0;
586
587 return CMD_SUCCESS;
588}
589
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200590#define QUEUE_CODEL_STR "Set CoDel queue management\n"
591
592DEFUN(cfg_pcu_queue_codel,
593 cfg_pcu_queue_codel_cmd,
594 "queue codel",
595 QUEUE_STR QUEUE_CODEL_STR)
596{
597 struct gprs_rlcmac_bts *bts = bts_main_data();
598
599 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
600
601 return CMD_SUCCESS;
602}
603
604DEFUN(cfg_pcu_queue_codel_interval,
605 cfg_pcu_queue_codel_interval_cmd,
606 "queue codel interval <1-1000>",
607 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
608{
609 struct gprs_rlcmac_bts *bts = bts_main_data();
610 uint16_t csec = atoi(argv[0]);
611
612 bts->llc_codel_interval_msec = 10*csec;
613
614 return CMD_SUCCESS;
615}
616
617DEFUN(cfg_pcu_no_queue_codel,
618 cfg_pcu_no_queue_codel_cmd,
619 "no queue codel",
620 NO_STR QUEUE_STR QUEUE_CODEL_STR)
621{
622 struct gprs_rlcmac_bts *bts = bts_main_data();
623
624 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
625
626 return CMD_SUCCESS;
627}
628
629
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200630#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
631
632DEFUN(cfg_pcu_queue_idle_ack_delay,
633 cfg_pcu_queue_idle_ack_delay_cmd,
634 "queue idle-ack-delay <1-65535>",
635 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
636{
637 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200638 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200639
640 bts->llc_idle_ack_csec = csec;
641
642 return CMD_SUCCESS;
643}
644
645DEFUN(cfg_pcu_no_queue_idle_ack_delay,
646 cfg_pcu_no_queue_idle_ack_delay_cmd,
647 "no queue idle-ack-delay",
648 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
649{
650 struct gprs_rlcmac_bts *bts = bts_main_data();
651
652 bts->llc_idle_ack_csec = 0;
653
654 return CMD_SUCCESS;
655}
656
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100657
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200658DEFUN(cfg_pcu_alloc,
659 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200660 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200661 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200662 "PACCH\n"
663 "Single slot is assigned only\n"
664 "Multiple slots are assigned for semi-duplex operation\n"
665 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200666{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200667 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200668
669 switch (argv[0][0]) {
670 case 'a':
671 bts->alloc_algorithm = alloc_algorithm_a;
672 break;
673 case 'b':
674 bts->alloc_algorithm = alloc_algorithm_b;
675 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200676 default:
677 bts->alloc_algorithm = alloc_algorithm_dynamic;
678 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200679 }
680
681 return CMD_SUCCESS;
682}
683
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200684DEFUN(cfg_pcu_two_phase,
685 cfg_pcu_two_phase_cmd,
686 "two-phase-access",
687 "Force two phase access when MS requests single phase access\n")
688{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200689 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200690
691 bts->force_two_phase = 1;
692
693 return CMD_SUCCESS;
694}
695
696DEFUN(cfg_pcu_no_two_phase,
697 cfg_pcu_no_two_phase_cmd,
698 "no two-phase-access",
699 NO_STR "Only use two phase access when requested my MS\n")
700{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200701 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200702
703 bts->force_two_phase = 0;
704
705 return CMD_SUCCESS;
706}
707
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200708DEFUN(cfg_pcu_alpha,
709 cfg_pcu_alpha_cmd,
710 "alpha <0-10>",
711 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
712 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
713 "Alpha in units of 0.1\n")
714{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200715 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200716
717 bts->alpha = atoi(argv[0]);
718
719 return CMD_SUCCESS;
720}
721
722DEFUN(cfg_pcu_gamma,
723 cfg_pcu_gamma_cmd,
724 "gamma <0-62>",
725 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
726 "Gamma in even unit of dBs\n")
727{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200728 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200729
730 bts->gamma = atoi(argv[0]) / 2;
731
732 return CMD_SUCCESS;
733}
734
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100735DEFUN(show_bts_stats,
736 show_bts_stats_cmd,
737 "show bts statistics",
738 SHOW_STR "BTS related functionality\nStatistics\n")
739{
740 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
741 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100742}
743
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100744#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
745DEFUN(cfg_pcu_dl_tbf_idle_time,
746 cfg_pcu_dl_tbf_idle_time_cmd,
747 "dl-tbf-idle-time <1-5000>",
748 IDLE_TIME_STR "idle time in msec")
749{
750 struct gprs_rlcmac_bts *bts = bts_main_data();
751
752 bts->dl_tbf_idle_msec = atoi(argv[0]);
753
754 return CMD_SUCCESS;
755}
756
757DEFUN(cfg_pcu_no_dl_tbf_idle_time,
758 cfg_pcu_no_dl_tbf_idle_time_cmd,
759 "no dl-tbf-idle-time",
760 NO_STR IDLE_TIME_STR)
761{
762 struct gprs_rlcmac_bts *bts = bts_main_data();
763
764 bts->dl_tbf_idle_msec = 0;
765
766 return CMD_SUCCESS;
767}
768
Jacob Erlbecka098c192015-05-28 16:11:19 +0200769#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
770DEFUN(cfg_pcu_ms_idle_time,
771 cfg_pcu_ms_idle_time_cmd,
772 "ms-idle-time <1-7200>",
773 MS_IDLE_TIME_STR "idle time in sec")
774{
775 struct gprs_rlcmac_bts *bts = bts_main_data();
776
777 bts->ms_idle_sec = atoi(argv[0]);
778
779 return CMD_SUCCESS;
780}
781
782DEFUN(cfg_pcu_no_ms_idle_time,
783 cfg_pcu_no_ms_idle_time_cmd,
784 "no ms-idle-time",
785 NO_STR MS_IDLE_TIME_STR)
786{
787 struct gprs_rlcmac_bts *bts = bts_main_data();
788
789 bts->ms_idle_sec = 0;
790
791 return CMD_SUCCESS;
792}
793
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200794#define CS_ERR_LIMITS_STR "set thresholds for error rate based CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200795DEFUN(cfg_pcu_cs_err_limits,
796 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200797 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200798 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
799{
800 struct gprs_rlcmac_bts *bts = bts_main_data();
801
802 uint8_t lower_limit = atoi(argv[0]);
803 uint8_t upper_limit = atoi(argv[1]);
804
805 if (lower_limit > upper_limit) {
806 vty_out(vty,
807 "The lower limit must be less than or equal to the "
808 "upper limit.%s", VTY_NEWLINE);
809 return CMD_WARNING;
810 }
811
812 bts->cs_adj_enabled = 1;
813 bts->cs_adj_upper_limit = upper_limit;
814 bts->cs_adj_lower_limit = lower_limit;
815
816 return CMD_SUCCESS;
817}
818
819DEFUN(cfg_pcu_no_cs_err_limits,
820 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200821 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200822 NO_STR CS_STR CS_ERR_LIMITS_STR)
823{
824 struct gprs_rlcmac_bts *bts = bts_main_data();
825
826 bts->cs_adj_enabled = 0;
827 bts->cs_adj_upper_limit = 100;
828 bts->cs_adj_lower_limit = 0;
829
830 return CMD_SUCCESS;
831}
832
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200833#define CS_DOWNGRADE_STR "set threshold for data size based CS downgrade\n"
834DEFUN(cfg_pcu_cs_downgrade_thrsh,
835 cfg_pcu_cs_downgrade_thrsh_cmd,
836 "cs downgrade-threshold <1-10000>",
837 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
838{
839 struct gprs_rlcmac_bts *bts = bts_main_data();
840
841 bts->cs_downgrade_threshold = atoi(argv[0]);
842
843 return CMD_SUCCESS;
844}
845
846DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
847 cfg_pcu_no_cs_downgrade_thrsh_cmd,
848 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200849 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200850{
851 struct gprs_rlcmac_bts *bts = bts_main_data();
852
853 bts->cs_downgrade_threshold = 0;
854
855 return CMD_SUCCESS;
856}
857
858
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200859DEFUN(cfg_pcu_cs_lqual_ranges,
860 cfg_pcu_cs_lqual_ranges_cmd,
861 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
862 CS_STR "Set link quality ranges\n"
863 "Set quality range for CS-1 (high value only)\n"
864 "CS-1 high (dB)\n"
865 "Set quality range for CS-2\n"
866 "CS-2 low (dB)\n"
867 "CS-2 high (dB)\n"
868 "Set quality range for CS-3\n"
869 "CS-3 low (dB)\n"
870 "CS-3 high (dB)\n"
871 "Set quality range for CS-4 (low value only)\n"
872 "CS-4 low (dB)\n")
873{
874 struct gprs_rlcmac_bts *bts = bts_main_data();
875
876 uint8_t cs1_high = atoi(argv[0]);
877 uint8_t cs2_low = atoi(argv[1]);
878 uint8_t cs2_high = atoi(argv[2]);
879 uint8_t cs3_low = atoi(argv[3]);
880 uint8_t cs3_high = atoi(argv[4]);
881 uint8_t cs4_low = atoi(argv[5]);
882
883 bts->cs_lqual_ranges[0].high = cs1_high;
884 bts->cs_lqual_ranges[1].low = cs2_low;
885 bts->cs_lqual_ranges[1].high = cs2_high;
886 bts->cs_lqual_ranges[2].low = cs3_low;
887 bts->cs_lqual_ranges[2].high = cs3_high;
888 bts->cs_lqual_ranges[3].low = cs4_low;
889
890 return CMD_SUCCESS;
891}
892
893
Daniel Willmann772415f2014-01-15 17:06:51 +0100894DEFUN(show_tbf,
895 show_tbf_cmd,
896 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100897 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100898{
899 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbecked2dbf62015-12-28 19:15:40 +0100900 return pcu_vty_show_tbf_all(vty, bts);
Daniel Willmann772415f2014-01-15 17:06:51 +0100901}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100902
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200903DEFUN(show_ms_all,
904 show_ms_all_cmd,
905 "show ms all",
906 SHOW_STR "information about MSs\n" "All TBFs\n")
907{
908 struct gprs_rlcmac_bts *bts = bts_main_data();
909 return pcu_vty_show_ms_all(vty, bts);
910}
911
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200912DEFUN(show_ms_tlli,
913 show_ms_tlli_cmd,
914 "show ms tlli TLLI",
915 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
916{
917 struct gprs_rlcmac_bts *bts = bts_main_data();
918 char *endp = NULL;
919 unsigned long long tlli = strtoll(argv[0], &endp, 16);
920 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
921 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
922 return CMD_WARNING;
923 }
924 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
925}
926
927DEFUN(show_ms_imsi,
928 show_ms_imsi_cmd,
929 "show ms imsi IMSI",
930 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
931{
932 struct gprs_rlcmac_bts *bts = bts_main_data();
933 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
934}
935
Andreas Eversberg12942562012-07-12 14:31:57 +0200936static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +0100937 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
938 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +0200939 "License GNU GPL version 2 or later\r\n"
940 "This is free software: you are free to change and redistribute it.\r\n"
941 "There is NO WARRANTY, to the extent permitted by law.\r\n";
942
943struct vty_app_info pcu_vty_info = {
944 .name = "Osmo-PCU",
945 .version = PACKAGE_VERSION,
946 .copyright = pcu_copyright,
947 .go_parent_cb = pcu_vty_go_parent,
948 .is_config_node = pcu_vty_is_config_node,
949};
950
951int pcu_vty_init(const struct log_info *cat)
952{
953// install_element_ve(&show_pcu_cmd);
954
955 logging_vty_add_cmds(cat);
Jacob Erlbeck42aba812015-11-10 15:32:00 +0100956 osmo_stats_vty_add_cmds(cat);
Andreas Eversberg12942562012-07-12 14:31:57 +0200957
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200958 install_node(&pcu_node, config_write_pcu);
959 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200960 vty_install_default(PCU_NODE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200961 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
962 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200963 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200964 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
965 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200966 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
967 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200968 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
969 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200970 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
971 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200972 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100973 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530974 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100975 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100976 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
977 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100978 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200979 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
980 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
981 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100982 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
983 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200984 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
985 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
986 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200987 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
988 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200989 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200990 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200991 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200992 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
993 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200994 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
995 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
996 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
997 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
998 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
999 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1000 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1001 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001002 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1003 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001004 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1005 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001006 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1007 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001008
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001009 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001010 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001011 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001012 install_element_ve(&show_ms_tlli_cmd);
1013 install_element_ve(&show_ms_imsi_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001014
Andreas Eversberg12942562012-07-12 14:31:57 +02001015 return 0;
1016}