blob: 97be4c72b77895156bd1d4768823c40b9a026bb6 [file] [log] [blame]
Andreas Eversberg12942562012-07-12 14:31:57 +02001/* OsmoBTS VTY interface */
2
Andreas Eversberg12942562012-07-12 14:31:57 +02003
Andreas Eversberg8b761a32012-07-20 21:50:31 +02004#include <stdint.h>
Holger Hans Peter Freyther2c98f1d2014-07-02 14:56:36 +02005#include <stdlib.h>
Andreas Eversberg12942562012-07-12 14:31:57 +02006#include <osmocom/vty/logging.h>
Jacob Erlbeck42aba812015-11-10 15:32:00 +01007#include <osmocom/vty/stats.h>
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +02008#include <osmocom/vty/misc.h>
Andreas Eversberg8b761a32012-07-20 21:50:31 +02009#include <osmocom/core/linuxlist.h>
Holger Hans Peter Freythere8915b92014-07-02 14:57:47 +020010#include <osmocom/core/rate_ctr.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020011#include "pcu_vty.h"
Andreas Eversberg8b761a32012-07-20 21:50:31 +020012#include "gprs_rlcmac.h"
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020013#include "bts.h"
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020014#include "tbf.h"
Andreas Eversberg12942562012-07-12 14:31:57 +020015
Jacob Erlbeck62e96a32015-06-04 09:42:14 +020016#include "pcu_vty_functions.h"
17
Jacob Erlbeckf76fede2015-08-17 13:42:46 +020018int pcu_vty_go_parent(struct vty *vty)
Andreas Eversberg12942562012-07-12 14:31:57 +020019{
20 switch (vty->node) {
21#if 0
22 case TRX_NODE:
Andreas Eversberg8b761a32012-07-20 21:50:31 +020023 vty->node = PCU_NODE;
Andreas Eversberg12942562012-07-12 14:31:57 +020024 {
25 struct gsm_bts_trx *trx = vty->index;
26 vty->index = trx->bts;
27 }
28 break;
29#endif
30 default:
31 vty->node = CONFIG_NODE;
32 }
Andreas Eversberg8b761a32012-07-20 21:50:31 +020033 return (enum node_type) vty->node;
Andreas Eversberg12942562012-07-12 14:31:57 +020034}
35
36int pcu_vty_is_config_node(struct vty *vty, int node)
37{
38 switch (node) {
Andreas Eversberg8b761a32012-07-20 21:50:31 +020039 case PCU_NODE:
Andreas Eversberg12942562012-07-12 14:31:57 +020040 return 1;
Andreas Eversberg12942562012-07-12 14:31:57 +020041 default:
42 return 0;
43 }
44}
45
Andreas Eversberg8b761a32012-07-20 21:50:31 +020046static struct cmd_node pcu_node = {
47 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +020048 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +020049 1,
50};
51
Andreas Eversberg8b761a32012-07-20 21:50:31 +020052static int config_write_pcu(struct vty *vty)
53{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +020054 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +020055
56 vty_out(vty, "pcu%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +020057 if (bts->egprs_enabled)
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +010058 vty_out(vty, " egprs only%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +020059
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +020060 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
61 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +020062 if (bts->fc_bvc_bucket_size)
63 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
64 bts->fc_bvc_bucket_size, VTY_NEWLINE);
65 if (bts->fc_bvc_leak_rate)
66 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
67 bts->fc_bvc_leak_rate, VTY_NEWLINE);
68 if (bts->fc_ms_bucket_size)
69 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
70 bts->fc_ms_bucket_size, VTY_NEWLINE);
71 if (bts->fc_ms_leak_rate)
72 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
73 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +020074 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +020075 if (bts->initial_cs_ul == bts->initial_cs_dl)
76 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
77 VTY_NEWLINE);
78 else
79 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
80 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +020081 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +020082 if (bts->max_cs_dl && bts->max_cs_ul) {
83 if (bts->max_cs_ul == bts->max_cs_dl)
84 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
85 VTY_NEWLINE);
86 else
87 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
88 bts->max_cs_ul, VTY_NEWLINE);
89 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +020090 if (bts->cs_adj_enabled)
91 vty_out(vty, " cs threshold %d %d%s",
92 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
93 VTY_NEWLINE);
94 else
95 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
96
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +020097 if (bts->cs_downgrade_threshold)
98 vty_out(vty, " cs downgrade-threshold %d%s",
99 bts->cs_downgrade_threshold, VTY_NEWLINE);
100 else
101 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
102
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200103 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
104 bts->cs_lqual_ranges[0].high,
105 bts->cs_lqual_ranges[1].low,
106 bts->cs_lqual_ranges[1].high,
107 bts->cs_lqual_ranges[2].low,
108 bts->cs_lqual_ranges[2].high,
109 bts->cs_lqual_ranges[3].low,
110 VTY_NEWLINE);
111
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100112 if (bts->max_mcs_dl && bts->max_mcs_ul) {
113 if (bts->max_mcs_ul == bts->max_mcs_dl)
114 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
115 VTY_NEWLINE);
116 else
117 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
118 bts->max_mcs_ul, VTY_NEWLINE);
119 }
120
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200121 if (bts->force_llc_lifetime == 0xffff)
122 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
123 else if (bts->force_llc_lifetime)
124 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
125 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100126 if (bts->llc_discard_csec)
127 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
128 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200129 if (bts->llc_idle_ack_csec)
130 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
131 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200132 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
133 vty_out(vty, " queue codel%s", VTY_NEWLINE);
134 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
135 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
136 else
137 vty_out(vty, " queue codel interval %d%s",
138 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
139
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200140 if (bts->alloc_algorithm == alloc_algorithm_a)
141 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
142 if (bts->alloc_algorithm == alloc_algorithm_b)
143 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200144 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
145 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200146 if (bts->force_two_phase)
147 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200148 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
149 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100150 if (bts->dl_tbf_idle_msec)
151 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
152 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200153
Jacob Erlbeck62e96a32015-06-04 09:42:14 +0200154 return pcu_vty_config_write_pcu_ext(vty);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200155}
156
157/* per-BTS configuration */
158DEFUN(cfg_pcu,
159 cfg_pcu_cmd,
160 "pcu",
161 "BTS specific configure")
162{
163 vty->node = PCU_NODE;
164
165 return CMD_SUCCESS;
166}
167
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200168#define EGPRS_STR "EGPRS configuration\n"
169
170DEFUN(cfg_pcu_egprs,
171 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100172 "egprs only",
173 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200174{
175 struct gprs_rlcmac_bts *bts = bts_main_data();
176
177 bts->egprs_enabled = 1;
178
Jacob Erlbeck5265f592015-09-28 18:54:32 +0200179 vty_out(vty, "%%Note that EGPRS support is in an experimental state "
180 "and the PCU will currently fail to use a TBF if the MS is capable "
181 "to do EGPRS. You may want to disable this feature by entering "
182 "the \"no egprs\" command. "
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200183 "Do not use this in production!%s", VTY_NEWLINE);
184
185 return CMD_SUCCESS;
186}
187
188DEFUN(cfg_pcu_no_egprs,
189 cfg_pcu_no_egprs_cmd,
190 "no egprs",
191 NO_STR EGPRS_STR)
192{
193 struct gprs_rlcmac_bts *bts = bts_main_data();
194
195 bts->egprs_enabled = 0;
196
197 return CMD_SUCCESS;
198}
199
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200200DEFUN(cfg_pcu_fc_interval,
201 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200202 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200203 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200204 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200205{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200206 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200207
208 bts->fc_interval = atoi(argv[0]);
209
210 return CMD_SUCCESS;
211}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200212#define FC_STR "BSSGP Flow Control configuration\n"
213#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
214#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
215
216DEFUN(cfg_pcu_fc_bvc_bucket_size,
217 cfg_pcu_fc_bvc_bucket_size_cmd,
218 "flow-control force-bvc-bucket-size <1-6553500>",
219 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
220{
221 struct gprs_rlcmac_bts *bts = bts_main_data();
222
223 bts->fc_bvc_bucket_size = atoi(argv[0]);
224
225 return CMD_SUCCESS;
226}
227
228DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
229 cfg_pcu_no_fc_bvc_bucket_size_cmd,
230 "no flow-control force-bvc-bucket-size",
231 NO_STR FC_STR FC_BMAX_STR("BVC"))
232{
233 struct gprs_rlcmac_bts *bts = bts_main_data();
234
235 bts->fc_bvc_bucket_size = 0;
236
237 return CMD_SUCCESS;
238}
239
240DEFUN(cfg_pcu_fc_bvc_leak_rate,
241 cfg_pcu_fc_bvc_leak_rate_cmd,
242 "flow-control force-bvc-leak-rate <1-6553500>",
243 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
244{
245 struct gprs_rlcmac_bts *bts = bts_main_data();
246
247 bts->fc_bvc_leak_rate = atoi(argv[0]);
248
249 return CMD_SUCCESS;
250}
251
252DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
253 cfg_pcu_no_fc_bvc_leak_rate_cmd,
254 "no flow-control force-bvc-leak-rate",
255 NO_STR FC_STR FC_LR_STR("BVC"))
256{
257 struct gprs_rlcmac_bts *bts = bts_main_data();
258
259 bts->fc_bvc_leak_rate = 0;
260
261 return CMD_SUCCESS;
262}
263
264DEFUN(cfg_pcu_fc_ms_bucket_size,
265 cfg_pcu_fc_ms_bucket_size_cmd,
266 "flow-control force-ms-bucket-size <1-6553500>",
267 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
268{
269 struct gprs_rlcmac_bts *bts = bts_main_data();
270
271 bts->fc_ms_bucket_size = atoi(argv[0]);
272
273 return CMD_SUCCESS;
274}
275
276DEFUN(cfg_pcu_no_fc_ms_bucket_size,
277 cfg_pcu_no_fc_ms_bucket_size_cmd,
278 "no flow-control force-ms-bucket-size",
279 NO_STR FC_STR FC_BMAX_STR("default MS"))
280{
281 struct gprs_rlcmac_bts *bts = bts_main_data();
282
283 bts->fc_ms_bucket_size = 0;
284
285 return CMD_SUCCESS;
286}
287
288DEFUN(cfg_pcu_fc_ms_leak_rate,
289 cfg_pcu_fc_ms_leak_rate_cmd,
290 "flow-control force-ms-leak-rate <1-6553500>",
291 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
292{
293 struct gprs_rlcmac_bts *bts = bts_main_data();
294
295 bts->fc_ms_leak_rate = atoi(argv[0]);
296
297 return CMD_SUCCESS;
298}
299
300DEFUN(cfg_pcu_no_fc_ms_leak_rate,
301 cfg_pcu_no_fc_ms_leak_rate_cmd,
302 "no flow-control force-ms-leak-rate",
303 NO_STR FC_STR FC_LR_STR("default MS"))
304{
305 struct gprs_rlcmac_bts *bts = bts_main_data();
306
307 bts->fc_ms_leak_rate = 0;
308
309 return CMD_SUCCESS;
310}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200311
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200312#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
313DEFUN(cfg_pcu_fc_bucket_time,
314 cfg_pcu_fc_bucket_time_cmd,
315 "flow-control bucket-time <1-65534>",
316 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
317{
318 struct gprs_rlcmac_bts *bts = bts_main_data();
319
320 bts->fc_bucket_time = atoi(argv[0]);
321
322 return CMD_SUCCESS;
323}
324
325DEFUN(cfg_pcu_no_fc_bucket_time,
326 cfg_pcu_no_fc_bucket_time_cmd,
327 "no flow-control bucket-time",
328 NO_STR FC_STR FC_BTIME_STR)
329{
330 struct gprs_rlcmac_bts *bts = bts_main_data();
331
332 bts->fc_bucket_time = 0;
333
334 return CMD_SUCCESS;
335}
336
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200337#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200338
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200339DEFUN(cfg_pcu_cs,
340 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200341 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200342 CS_STR
343 "Initial CS value to be used (overrides BTS config)\n"
344 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200345{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200346 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200347 uint8_t cs = atoi(argv[0]);
348
349 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200350 bts->initial_cs_dl = cs;
351 if (argc > 1)
352 bts->initial_cs_ul = atoi(argv[1]);
353 else
354 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200355
356 return CMD_SUCCESS;
357}
358
359DEFUN(cfg_pcu_no_cs,
360 cfg_pcu_no_cs_cmd,
361 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200362 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200363{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200364 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200365
366 bts->force_cs = 0;
367
368 return CMD_SUCCESS;
369}
370
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100371#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200372DEFUN(cfg_pcu_cs_max,
373 cfg_pcu_cs_max_cmd,
374 "cs max <1-4> [<1-4>]",
375 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100376 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200377 "Maximum CS value to be used\n"
378 "Use a different maximum CS value for the uplink")
379{
380 struct gprs_rlcmac_bts *bts = bts_main_data();
381 uint8_t cs = atoi(argv[0]);
382
383 bts->max_cs_dl = cs;
384 if (argc > 1)
385 bts->max_cs_ul = atoi(argv[1]);
386 else
387 bts->max_cs_ul = cs;
388
389 return CMD_SUCCESS;
390}
391
392DEFUN(cfg_pcu_no_cs_max,
393 cfg_pcu_no_cs_max_cmd,
394 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100395 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200396{
397 struct gprs_rlcmac_bts *bts = bts_main_data();
398
399 bts->max_cs_dl = 0;
400 bts->max_cs_ul = 0;
401
402 return CMD_SUCCESS;
403}
404
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100405#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
406
407DEFUN(cfg_pcu_mcs_max,
408 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100409 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100410 MCS_STR
411 CS_MAX_STR
412 "Maximum MCS value to be used\n"
413 "Use a different maximum MCS value for the uplink")
414{
415 struct gprs_rlcmac_bts *bts = bts_main_data();
416 uint8_t mcs = atoi(argv[0]);
417
418 bts->max_mcs_dl = mcs;
419 if (argc > 1)
420 bts->max_mcs_ul = atoi(argv[1]);
421 else
422 bts->max_mcs_ul = mcs;
423
424 return CMD_SUCCESS;
425}
426
427DEFUN(cfg_pcu_no_mcs_max,
428 cfg_pcu_no_mcs_max_cmd,
429 "no mcs max",
430 NO_STR MCS_STR CS_MAX_STR)
431{
432 struct gprs_rlcmac_bts *bts = bts_main_data();
433
434 bts->max_mcs_dl = 0;
435 bts->max_mcs_ul = 0;
436
437 return CMD_SUCCESS;
438}
439
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200440#define QUEUE_STR "Packet queue options\n"
441#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
442 "(overrides the value given by SGSN)\n"
443
444DEFUN(cfg_pcu_queue_lifetime,
445 cfg_pcu_queue_lifetime_cmd,
446 "queue lifetime <1-65534>",
447 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
448{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200449 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200450 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200451
452 bts->force_llc_lifetime = csec;
453
454 return CMD_SUCCESS;
455}
456
457DEFUN(cfg_pcu_queue_lifetime_inf,
458 cfg_pcu_queue_lifetime_inf_cmd,
459 "queue lifetime infinite",
460 QUEUE_STR LIFETIME_STR "Infinite lifetime")
461{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200462 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200463
464 bts->force_llc_lifetime = 0xffff;
465
466 return CMD_SUCCESS;
467}
468
469DEFUN(cfg_pcu_no_queue_lifetime,
470 cfg_pcu_no_queue_lifetime_cmd,
471 "no queue lifetime",
472 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
473 "by SGSN)\n")
474{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200475 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200476
477 bts->force_llc_lifetime = 0;
478
479 return CMD_SUCCESS;
480}
481
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100482#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
483 "(continue discarding until lifetime-hysteresis is reached)\n"
484
485DEFUN(cfg_pcu_queue_hysteresis,
486 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200487 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100488 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
489{
490 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200491 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100492
493 bts->llc_discard_csec = csec;
494
495 return CMD_SUCCESS;
496}
497
498DEFUN(cfg_pcu_no_queue_hysteresis,
499 cfg_pcu_no_queue_hysteresis_cmd,
500 "no queue hysteresis",
501 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
502{
503 struct gprs_rlcmac_bts *bts = bts_main_data();
504
505 bts->llc_discard_csec = 0;
506
507 return CMD_SUCCESS;
508}
509
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200510#define QUEUE_CODEL_STR "Set CoDel queue management\n"
511
512DEFUN(cfg_pcu_queue_codel,
513 cfg_pcu_queue_codel_cmd,
514 "queue codel",
515 QUEUE_STR QUEUE_CODEL_STR)
516{
517 struct gprs_rlcmac_bts *bts = bts_main_data();
518
519 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
520
521 return CMD_SUCCESS;
522}
523
524DEFUN(cfg_pcu_queue_codel_interval,
525 cfg_pcu_queue_codel_interval_cmd,
526 "queue codel interval <1-1000>",
527 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
528{
529 struct gprs_rlcmac_bts *bts = bts_main_data();
530 uint16_t csec = atoi(argv[0]);
531
532 bts->llc_codel_interval_msec = 10*csec;
533
534 return CMD_SUCCESS;
535}
536
537DEFUN(cfg_pcu_no_queue_codel,
538 cfg_pcu_no_queue_codel_cmd,
539 "no queue codel",
540 NO_STR QUEUE_STR QUEUE_CODEL_STR)
541{
542 struct gprs_rlcmac_bts *bts = bts_main_data();
543
544 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
545
546 return CMD_SUCCESS;
547}
548
549
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200550#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
551
552DEFUN(cfg_pcu_queue_idle_ack_delay,
553 cfg_pcu_queue_idle_ack_delay_cmd,
554 "queue idle-ack-delay <1-65535>",
555 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
556{
557 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200558 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200559
560 bts->llc_idle_ack_csec = csec;
561
562 return CMD_SUCCESS;
563}
564
565DEFUN(cfg_pcu_no_queue_idle_ack_delay,
566 cfg_pcu_no_queue_idle_ack_delay_cmd,
567 "no queue idle-ack-delay",
568 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
569{
570 struct gprs_rlcmac_bts *bts = bts_main_data();
571
572 bts->llc_idle_ack_csec = 0;
573
574 return CMD_SUCCESS;
575}
576
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100577
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200578DEFUN(cfg_pcu_alloc,
579 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200580 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200581 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200582 "PACCH\n"
583 "Single slot is assigned only\n"
584 "Multiple slots are assigned for semi-duplex operation\n"
585 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200586{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200587 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200588
589 switch (argv[0][0]) {
590 case 'a':
591 bts->alloc_algorithm = alloc_algorithm_a;
592 break;
593 case 'b':
594 bts->alloc_algorithm = alloc_algorithm_b;
595 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200596 default:
597 bts->alloc_algorithm = alloc_algorithm_dynamic;
598 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200599 }
600
601 return CMD_SUCCESS;
602}
603
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200604DEFUN(cfg_pcu_two_phase,
605 cfg_pcu_two_phase_cmd,
606 "two-phase-access",
607 "Force two phase access when MS requests single phase access\n")
608{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200609 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200610
611 bts->force_two_phase = 1;
612
613 return CMD_SUCCESS;
614}
615
616DEFUN(cfg_pcu_no_two_phase,
617 cfg_pcu_no_two_phase_cmd,
618 "no two-phase-access",
619 NO_STR "Only use two phase access when requested my MS\n")
620{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200621 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200622
623 bts->force_two_phase = 0;
624
625 return CMD_SUCCESS;
626}
627
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200628DEFUN(cfg_pcu_alpha,
629 cfg_pcu_alpha_cmd,
630 "alpha <0-10>",
631 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
632 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
633 "Alpha in units of 0.1\n")
634{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200635 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200636
637 bts->alpha = atoi(argv[0]);
638
639 return CMD_SUCCESS;
640}
641
642DEFUN(cfg_pcu_gamma,
643 cfg_pcu_gamma_cmd,
644 "gamma <0-62>",
645 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
646 "Gamma in even unit of dBs\n")
647{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200648 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200649
650 bts->gamma = atoi(argv[0]) / 2;
651
652 return CMD_SUCCESS;
653}
654
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100655DEFUN(show_bts_stats,
656 show_bts_stats_cmd,
657 "show bts statistics",
658 SHOW_STR "BTS related functionality\nStatistics\n")
659{
660 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
661 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100662}
663
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100664#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
665DEFUN(cfg_pcu_dl_tbf_idle_time,
666 cfg_pcu_dl_tbf_idle_time_cmd,
667 "dl-tbf-idle-time <1-5000>",
668 IDLE_TIME_STR "idle time in msec")
669{
670 struct gprs_rlcmac_bts *bts = bts_main_data();
671
672 bts->dl_tbf_idle_msec = atoi(argv[0]);
673
674 return CMD_SUCCESS;
675}
676
677DEFUN(cfg_pcu_no_dl_tbf_idle_time,
678 cfg_pcu_no_dl_tbf_idle_time_cmd,
679 "no dl-tbf-idle-time",
680 NO_STR IDLE_TIME_STR)
681{
682 struct gprs_rlcmac_bts *bts = bts_main_data();
683
684 bts->dl_tbf_idle_msec = 0;
685
686 return CMD_SUCCESS;
687}
688
Jacob Erlbecka098c192015-05-28 16:11:19 +0200689#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
690DEFUN(cfg_pcu_ms_idle_time,
691 cfg_pcu_ms_idle_time_cmd,
692 "ms-idle-time <1-7200>",
693 MS_IDLE_TIME_STR "idle time in sec")
694{
695 struct gprs_rlcmac_bts *bts = bts_main_data();
696
697 bts->ms_idle_sec = atoi(argv[0]);
698
699 return CMD_SUCCESS;
700}
701
702DEFUN(cfg_pcu_no_ms_idle_time,
703 cfg_pcu_no_ms_idle_time_cmd,
704 "no ms-idle-time",
705 NO_STR MS_IDLE_TIME_STR)
706{
707 struct gprs_rlcmac_bts *bts = bts_main_data();
708
709 bts->ms_idle_sec = 0;
710
711 return CMD_SUCCESS;
712}
713
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200714#define CS_ERR_LIMITS_STR "set thresholds for error rate based CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200715DEFUN(cfg_pcu_cs_err_limits,
716 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200717 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200718 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
719{
720 struct gprs_rlcmac_bts *bts = bts_main_data();
721
722 uint8_t lower_limit = atoi(argv[0]);
723 uint8_t upper_limit = atoi(argv[1]);
724
725 if (lower_limit > upper_limit) {
726 vty_out(vty,
727 "The lower limit must be less than or equal to the "
728 "upper limit.%s", VTY_NEWLINE);
729 return CMD_WARNING;
730 }
731
732 bts->cs_adj_enabled = 1;
733 bts->cs_adj_upper_limit = upper_limit;
734 bts->cs_adj_lower_limit = lower_limit;
735
736 return CMD_SUCCESS;
737}
738
739DEFUN(cfg_pcu_no_cs_err_limits,
740 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200741 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200742 NO_STR CS_STR CS_ERR_LIMITS_STR)
743{
744 struct gprs_rlcmac_bts *bts = bts_main_data();
745
746 bts->cs_adj_enabled = 0;
747 bts->cs_adj_upper_limit = 100;
748 bts->cs_adj_lower_limit = 0;
749
750 return CMD_SUCCESS;
751}
752
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200753#define CS_DOWNGRADE_STR "set threshold for data size based CS downgrade\n"
754DEFUN(cfg_pcu_cs_downgrade_thrsh,
755 cfg_pcu_cs_downgrade_thrsh_cmd,
756 "cs downgrade-threshold <1-10000>",
757 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
758{
759 struct gprs_rlcmac_bts *bts = bts_main_data();
760
761 bts->cs_downgrade_threshold = atoi(argv[0]);
762
763 return CMD_SUCCESS;
764}
765
766DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
767 cfg_pcu_no_cs_downgrade_thrsh_cmd,
768 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200769 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200770{
771 struct gprs_rlcmac_bts *bts = bts_main_data();
772
773 bts->cs_downgrade_threshold = 0;
774
775 return CMD_SUCCESS;
776}
777
778
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200779DEFUN(cfg_pcu_cs_lqual_ranges,
780 cfg_pcu_cs_lqual_ranges_cmd,
781 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
782 CS_STR "Set link quality ranges\n"
783 "Set quality range for CS-1 (high value only)\n"
784 "CS-1 high (dB)\n"
785 "Set quality range for CS-2\n"
786 "CS-2 low (dB)\n"
787 "CS-2 high (dB)\n"
788 "Set quality range for CS-3\n"
789 "CS-3 low (dB)\n"
790 "CS-3 high (dB)\n"
791 "Set quality range for CS-4 (low value only)\n"
792 "CS-4 low (dB)\n")
793{
794 struct gprs_rlcmac_bts *bts = bts_main_data();
795
796 uint8_t cs1_high = atoi(argv[0]);
797 uint8_t cs2_low = atoi(argv[1]);
798 uint8_t cs2_high = atoi(argv[2]);
799 uint8_t cs3_low = atoi(argv[3]);
800 uint8_t cs3_high = atoi(argv[4]);
801 uint8_t cs4_low = atoi(argv[5]);
802
803 bts->cs_lqual_ranges[0].high = cs1_high;
804 bts->cs_lqual_ranges[1].low = cs2_low;
805 bts->cs_lqual_ranges[1].high = cs2_high;
806 bts->cs_lqual_ranges[2].low = cs3_low;
807 bts->cs_lqual_ranges[2].high = cs3_high;
808 bts->cs_lqual_ranges[3].low = cs4_low;
809
810 return CMD_SUCCESS;
811}
812
813
Daniel Willmann772415f2014-01-15 17:06:51 +0100814DEFUN(show_tbf,
815 show_tbf_cmd,
816 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100817 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100818{
819 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbecked2dbf62015-12-28 19:15:40 +0100820 return pcu_vty_show_tbf_all(vty, bts);
Daniel Willmann772415f2014-01-15 17:06:51 +0100821}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100822
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200823DEFUN(show_ms_all,
824 show_ms_all_cmd,
825 "show ms all",
826 SHOW_STR "information about MSs\n" "All TBFs\n")
827{
828 struct gprs_rlcmac_bts *bts = bts_main_data();
829 return pcu_vty_show_ms_all(vty, bts);
830}
831
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200832DEFUN(show_ms_tlli,
833 show_ms_tlli_cmd,
834 "show ms tlli TLLI",
835 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
836{
837 struct gprs_rlcmac_bts *bts = bts_main_data();
838 char *endp = NULL;
839 unsigned long long tlli = strtoll(argv[0], &endp, 16);
840 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
841 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
842 return CMD_WARNING;
843 }
844 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
845}
846
847DEFUN(show_ms_imsi,
848 show_ms_imsi_cmd,
849 "show ms imsi IMSI",
850 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
851{
852 struct gprs_rlcmac_bts *bts = bts_main_data();
853 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
854}
855
Andreas Eversberg12942562012-07-12 14:31:57 +0200856static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +0100857 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
858 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +0200859 "License GNU GPL version 2 or later\r\n"
860 "This is free software: you are free to change and redistribute it.\r\n"
861 "There is NO WARRANTY, to the extent permitted by law.\r\n";
862
863struct vty_app_info pcu_vty_info = {
864 .name = "Osmo-PCU",
865 .version = PACKAGE_VERSION,
866 .copyright = pcu_copyright,
867 .go_parent_cb = pcu_vty_go_parent,
868 .is_config_node = pcu_vty_is_config_node,
869};
870
871int pcu_vty_init(const struct log_info *cat)
872{
873// install_element_ve(&show_pcu_cmd);
874
875 logging_vty_add_cmds(cat);
Jacob Erlbeck42aba812015-11-10 15:32:00 +0100876 osmo_stats_vty_add_cmds(cat);
Andreas Eversberg12942562012-07-12 14:31:57 +0200877
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200878 install_node(&pcu_node, config_write_pcu);
879 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200880 vty_install_default(PCU_NODE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200881 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
882 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200883 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200884 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
885 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200886 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
887 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200888 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
889 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200890 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
891 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200892 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100893 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
894 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200895 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
896 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
897 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100898 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
899 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200900 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
901 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
902 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200903 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
904 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200905 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200906 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200907 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200908 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
909 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200910 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
911 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
912 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
913 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
914 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
915 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
916 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
917 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200918 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
919 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100920 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
921 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +0200922 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
923 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200924
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100925 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +0100926 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200927 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200928 install_element_ve(&show_ms_tlli_cmd);
929 install_element_ve(&show_ms_imsi_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100930
Andreas Eversberg12942562012-07-12 14:31:57 +0200931 return 0;
932}