blob: ee3116fd10c93f551d791b8c7b2abfc949fc597d [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)
58 vty_out(vty, " egprs%s", VTY_NEWLINE);
59 else
60 vty_out(vty, " no egprs%s", VTY_NEWLINE);
61
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +020062 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
63 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +020064 if (bts->fc_bvc_bucket_size)
65 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
66 bts->fc_bvc_bucket_size, VTY_NEWLINE);
67 if (bts->fc_bvc_leak_rate)
68 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
69 bts->fc_bvc_leak_rate, VTY_NEWLINE);
70 if (bts->fc_ms_bucket_size)
71 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
72 bts->fc_ms_bucket_size, VTY_NEWLINE);
73 if (bts->fc_ms_leak_rate)
74 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
75 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +020076 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +020077 if (bts->initial_cs_ul == bts->initial_cs_dl)
78 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
79 VTY_NEWLINE);
80 else
81 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
82 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +020083 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +020084 if (bts->max_cs_dl && bts->max_cs_ul) {
85 if (bts->max_cs_ul == bts->max_cs_dl)
86 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
87 VTY_NEWLINE);
88 else
89 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
90 bts->max_cs_ul, VTY_NEWLINE);
91 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +020092 if (bts->cs_adj_enabled)
93 vty_out(vty, " cs threshold %d %d%s",
94 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
95 VTY_NEWLINE);
96 else
97 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
98
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +020099 if (bts->cs_downgrade_threshold)
100 vty_out(vty, " cs downgrade-threshold %d%s",
101 bts->cs_downgrade_threshold, VTY_NEWLINE);
102 else
103 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
104
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200105 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
106 bts->cs_lqual_ranges[0].high,
107 bts->cs_lqual_ranges[1].low,
108 bts->cs_lqual_ranges[1].high,
109 bts->cs_lqual_ranges[2].low,
110 bts->cs_lqual_ranges[2].high,
111 bts->cs_lqual_ranges[3].low,
112 VTY_NEWLINE);
113
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100114 if (bts->max_mcs_dl && bts->max_mcs_ul) {
115 if (bts->max_mcs_ul == bts->max_mcs_dl)
116 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
117 VTY_NEWLINE);
118 else
119 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
120 bts->max_mcs_ul, VTY_NEWLINE);
121 }
122
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200123 if (bts->force_llc_lifetime == 0xffff)
124 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
125 else if (bts->force_llc_lifetime)
126 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
127 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100128 if (bts->llc_discard_csec)
129 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
130 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200131 if (bts->llc_idle_ack_csec)
132 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
133 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200134 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
135 vty_out(vty, " queue codel%s", VTY_NEWLINE);
136 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
137 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
138 else
139 vty_out(vty, " queue codel interval %d%s",
140 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
141
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200142 if (bts->alloc_algorithm == alloc_algorithm_a)
143 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
144 if (bts->alloc_algorithm == alloc_algorithm_b)
145 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200146 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
147 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200148 if (bts->force_two_phase)
149 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200150 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
151 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100152 if (bts->dl_tbf_idle_msec)
153 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
154 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200155
Jacob Erlbeck62e96a32015-06-04 09:42:14 +0200156 return pcu_vty_config_write_pcu_ext(vty);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200157}
158
159/* per-BTS configuration */
160DEFUN(cfg_pcu,
161 cfg_pcu_cmd,
162 "pcu",
163 "BTS specific configure")
164{
165 vty->node = PCU_NODE;
166
167 return CMD_SUCCESS;
168}
169
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200170#define EGPRS_STR "EGPRS configuration\n"
171
172DEFUN(cfg_pcu_egprs,
173 cfg_pcu_egprs_cmd,
174 "egprs",
175 EGPRS_STR)
176{
177 struct gprs_rlcmac_bts *bts = bts_main_data();
178
179 bts->egprs_enabled = 1;
180
Jacob Erlbeck5265f592015-09-28 18:54:32 +0200181 vty_out(vty, "%%Note that EGPRS support is in an experimental state "
182 "and the PCU will currently fail to use a TBF if the MS is capable "
183 "to do EGPRS. You may want to disable this feature by entering "
184 "the \"no egprs\" command. "
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200185 "Do not use this in production!%s", VTY_NEWLINE);
186
187 return CMD_SUCCESS;
188}
189
190DEFUN(cfg_pcu_no_egprs,
191 cfg_pcu_no_egprs_cmd,
192 "no egprs",
193 NO_STR EGPRS_STR)
194{
195 struct gprs_rlcmac_bts *bts = bts_main_data();
196
197 bts->egprs_enabled = 0;
198
199 return CMD_SUCCESS;
200}
201
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200202DEFUN(cfg_pcu_fc_interval,
203 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200204 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200205 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200206 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200207{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200208 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200209
210 bts->fc_interval = atoi(argv[0]);
211
212 return CMD_SUCCESS;
213}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200214#define FC_STR "BSSGP Flow Control configuration\n"
215#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
216#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
217
218DEFUN(cfg_pcu_fc_bvc_bucket_size,
219 cfg_pcu_fc_bvc_bucket_size_cmd,
220 "flow-control force-bvc-bucket-size <1-6553500>",
221 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
222{
223 struct gprs_rlcmac_bts *bts = bts_main_data();
224
225 bts->fc_bvc_bucket_size = atoi(argv[0]);
226
227 return CMD_SUCCESS;
228}
229
230DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
231 cfg_pcu_no_fc_bvc_bucket_size_cmd,
232 "no flow-control force-bvc-bucket-size",
233 NO_STR FC_STR FC_BMAX_STR("BVC"))
234{
235 struct gprs_rlcmac_bts *bts = bts_main_data();
236
237 bts->fc_bvc_bucket_size = 0;
238
239 return CMD_SUCCESS;
240}
241
242DEFUN(cfg_pcu_fc_bvc_leak_rate,
243 cfg_pcu_fc_bvc_leak_rate_cmd,
244 "flow-control force-bvc-leak-rate <1-6553500>",
245 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
246{
247 struct gprs_rlcmac_bts *bts = bts_main_data();
248
249 bts->fc_bvc_leak_rate = atoi(argv[0]);
250
251 return CMD_SUCCESS;
252}
253
254DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
255 cfg_pcu_no_fc_bvc_leak_rate_cmd,
256 "no flow-control force-bvc-leak-rate",
257 NO_STR FC_STR FC_LR_STR("BVC"))
258{
259 struct gprs_rlcmac_bts *bts = bts_main_data();
260
261 bts->fc_bvc_leak_rate = 0;
262
263 return CMD_SUCCESS;
264}
265
266DEFUN(cfg_pcu_fc_ms_bucket_size,
267 cfg_pcu_fc_ms_bucket_size_cmd,
268 "flow-control force-ms-bucket-size <1-6553500>",
269 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
270{
271 struct gprs_rlcmac_bts *bts = bts_main_data();
272
273 bts->fc_ms_bucket_size = atoi(argv[0]);
274
275 return CMD_SUCCESS;
276}
277
278DEFUN(cfg_pcu_no_fc_ms_bucket_size,
279 cfg_pcu_no_fc_ms_bucket_size_cmd,
280 "no flow-control force-ms-bucket-size",
281 NO_STR FC_STR FC_BMAX_STR("default MS"))
282{
283 struct gprs_rlcmac_bts *bts = bts_main_data();
284
285 bts->fc_ms_bucket_size = 0;
286
287 return CMD_SUCCESS;
288}
289
290DEFUN(cfg_pcu_fc_ms_leak_rate,
291 cfg_pcu_fc_ms_leak_rate_cmd,
292 "flow-control force-ms-leak-rate <1-6553500>",
293 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
294{
295 struct gprs_rlcmac_bts *bts = bts_main_data();
296
297 bts->fc_ms_leak_rate = atoi(argv[0]);
298
299 return CMD_SUCCESS;
300}
301
302DEFUN(cfg_pcu_no_fc_ms_leak_rate,
303 cfg_pcu_no_fc_ms_leak_rate_cmd,
304 "no flow-control force-ms-leak-rate",
305 NO_STR FC_STR FC_LR_STR("default MS"))
306{
307 struct gprs_rlcmac_bts *bts = bts_main_data();
308
309 bts->fc_ms_leak_rate = 0;
310
311 return CMD_SUCCESS;
312}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200313
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200314#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
315DEFUN(cfg_pcu_fc_bucket_time,
316 cfg_pcu_fc_bucket_time_cmd,
317 "flow-control bucket-time <1-65534>",
318 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
319{
320 struct gprs_rlcmac_bts *bts = bts_main_data();
321
322 bts->fc_bucket_time = atoi(argv[0]);
323
324 return CMD_SUCCESS;
325}
326
327DEFUN(cfg_pcu_no_fc_bucket_time,
328 cfg_pcu_no_fc_bucket_time_cmd,
329 "no flow-control bucket-time",
330 NO_STR FC_STR FC_BTIME_STR)
331{
332 struct gprs_rlcmac_bts *bts = bts_main_data();
333
334 bts->fc_bucket_time = 0;
335
336 return CMD_SUCCESS;
337}
338
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200339#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200340
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200341DEFUN(cfg_pcu_cs,
342 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200343 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200344 CS_STR
345 "Initial CS value to be used (overrides BTS config)\n"
346 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200347{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200348 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200349 uint8_t cs = atoi(argv[0]);
350
351 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200352 bts->initial_cs_dl = cs;
353 if (argc > 1)
354 bts->initial_cs_ul = atoi(argv[1]);
355 else
356 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200357
358 return CMD_SUCCESS;
359}
360
361DEFUN(cfg_pcu_no_cs,
362 cfg_pcu_no_cs_cmd,
363 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200364 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200365{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200366 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200367
368 bts->force_cs = 0;
369
370 return CMD_SUCCESS;
371}
372
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100373#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200374DEFUN(cfg_pcu_cs_max,
375 cfg_pcu_cs_max_cmd,
376 "cs max <1-4> [<1-4>]",
377 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100378 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200379 "Maximum CS value to be used\n"
380 "Use a different maximum CS value for the uplink")
381{
382 struct gprs_rlcmac_bts *bts = bts_main_data();
383 uint8_t cs = atoi(argv[0]);
384
385 bts->max_cs_dl = cs;
386 if (argc > 1)
387 bts->max_cs_ul = atoi(argv[1]);
388 else
389 bts->max_cs_ul = cs;
390
391 return CMD_SUCCESS;
392}
393
394DEFUN(cfg_pcu_no_cs_max,
395 cfg_pcu_no_cs_max_cmd,
396 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100397 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200398{
399 struct gprs_rlcmac_bts *bts = bts_main_data();
400
401 bts->max_cs_dl = 0;
402 bts->max_cs_ul = 0;
403
404 return CMD_SUCCESS;
405}
406
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100407#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
408
409DEFUN(cfg_pcu_mcs_max,
410 cfg_pcu_mcs_max_cmd,
411 "mcs max <1-4> [<1-4>]",
412 MCS_STR
413 CS_MAX_STR
414 "Maximum MCS value to be used\n"
415 "Use a different maximum MCS value for the uplink")
416{
417 struct gprs_rlcmac_bts *bts = bts_main_data();
418 uint8_t mcs = atoi(argv[0]);
419
420 bts->max_mcs_dl = mcs;
421 if (argc > 1)
422 bts->max_mcs_ul = atoi(argv[1]);
423 else
424 bts->max_mcs_ul = mcs;
425
426 return CMD_SUCCESS;
427}
428
429DEFUN(cfg_pcu_no_mcs_max,
430 cfg_pcu_no_mcs_max_cmd,
431 "no mcs max",
432 NO_STR MCS_STR CS_MAX_STR)
433{
434 struct gprs_rlcmac_bts *bts = bts_main_data();
435
436 bts->max_mcs_dl = 0;
437 bts->max_mcs_ul = 0;
438
439 return CMD_SUCCESS;
440}
441
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200442#define QUEUE_STR "Packet queue options\n"
443#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
444 "(overrides the value given by SGSN)\n"
445
446DEFUN(cfg_pcu_queue_lifetime,
447 cfg_pcu_queue_lifetime_cmd,
448 "queue lifetime <1-65534>",
449 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
450{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200451 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200452 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200453
454 bts->force_llc_lifetime = csec;
455
456 return CMD_SUCCESS;
457}
458
459DEFUN(cfg_pcu_queue_lifetime_inf,
460 cfg_pcu_queue_lifetime_inf_cmd,
461 "queue lifetime infinite",
462 QUEUE_STR LIFETIME_STR "Infinite lifetime")
463{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200464 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200465
466 bts->force_llc_lifetime = 0xffff;
467
468 return CMD_SUCCESS;
469}
470
471DEFUN(cfg_pcu_no_queue_lifetime,
472 cfg_pcu_no_queue_lifetime_cmd,
473 "no queue lifetime",
474 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
475 "by SGSN)\n")
476{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200477 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200478
479 bts->force_llc_lifetime = 0;
480
481 return CMD_SUCCESS;
482}
483
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100484#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
485 "(continue discarding until lifetime-hysteresis is reached)\n"
486
487DEFUN(cfg_pcu_queue_hysteresis,
488 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200489 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100490 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
491{
492 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200493 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100494
495 bts->llc_discard_csec = csec;
496
497 return CMD_SUCCESS;
498}
499
500DEFUN(cfg_pcu_no_queue_hysteresis,
501 cfg_pcu_no_queue_hysteresis_cmd,
502 "no queue hysteresis",
503 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
504{
505 struct gprs_rlcmac_bts *bts = bts_main_data();
506
507 bts->llc_discard_csec = 0;
508
509 return CMD_SUCCESS;
510}
511
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200512#define QUEUE_CODEL_STR "Set CoDel queue management\n"
513
514DEFUN(cfg_pcu_queue_codel,
515 cfg_pcu_queue_codel_cmd,
516 "queue codel",
517 QUEUE_STR QUEUE_CODEL_STR)
518{
519 struct gprs_rlcmac_bts *bts = bts_main_data();
520
521 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
522
523 return CMD_SUCCESS;
524}
525
526DEFUN(cfg_pcu_queue_codel_interval,
527 cfg_pcu_queue_codel_interval_cmd,
528 "queue codel interval <1-1000>",
529 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
530{
531 struct gprs_rlcmac_bts *bts = bts_main_data();
532 uint16_t csec = atoi(argv[0]);
533
534 bts->llc_codel_interval_msec = 10*csec;
535
536 return CMD_SUCCESS;
537}
538
539DEFUN(cfg_pcu_no_queue_codel,
540 cfg_pcu_no_queue_codel_cmd,
541 "no queue codel",
542 NO_STR QUEUE_STR QUEUE_CODEL_STR)
543{
544 struct gprs_rlcmac_bts *bts = bts_main_data();
545
546 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
547
548 return CMD_SUCCESS;
549}
550
551
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200552#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
553
554DEFUN(cfg_pcu_queue_idle_ack_delay,
555 cfg_pcu_queue_idle_ack_delay_cmd,
556 "queue idle-ack-delay <1-65535>",
557 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
558{
559 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200560 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200561
562 bts->llc_idle_ack_csec = csec;
563
564 return CMD_SUCCESS;
565}
566
567DEFUN(cfg_pcu_no_queue_idle_ack_delay,
568 cfg_pcu_no_queue_idle_ack_delay_cmd,
569 "no queue idle-ack-delay",
570 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
571{
572 struct gprs_rlcmac_bts *bts = bts_main_data();
573
574 bts->llc_idle_ack_csec = 0;
575
576 return CMD_SUCCESS;
577}
578
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100579
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200580DEFUN(cfg_pcu_alloc,
581 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200582 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200583 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200584 "PACCH\n"
585 "Single slot is assigned only\n"
586 "Multiple slots are assigned for semi-duplex operation\n"
587 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200588{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200589 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200590
591 switch (argv[0][0]) {
592 case 'a':
593 bts->alloc_algorithm = alloc_algorithm_a;
594 break;
595 case 'b':
596 bts->alloc_algorithm = alloc_algorithm_b;
597 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200598 default:
599 bts->alloc_algorithm = alloc_algorithm_dynamic;
600 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200601 }
602
603 return CMD_SUCCESS;
604}
605
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200606DEFUN(cfg_pcu_two_phase,
607 cfg_pcu_two_phase_cmd,
608 "two-phase-access",
609 "Force two phase access when MS requests single phase access\n")
610{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200611 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200612
613 bts->force_two_phase = 1;
614
615 return CMD_SUCCESS;
616}
617
618DEFUN(cfg_pcu_no_two_phase,
619 cfg_pcu_no_two_phase_cmd,
620 "no two-phase-access",
621 NO_STR "Only use two phase access when requested my MS\n")
622{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200623 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200624
625 bts->force_two_phase = 0;
626
627 return CMD_SUCCESS;
628}
629
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200630DEFUN(cfg_pcu_alpha,
631 cfg_pcu_alpha_cmd,
632 "alpha <0-10>",
633 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
634 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
635 "Alpha in units of 0.1\n")
636{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200637 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200638
639 bts->alpha = atoi(argv[0]);
640
641 return CMD_SUCCESS;
642}
643
644DEFUN(cfg_pcu_gamma,
645 cfg_pcu_gamma_cmd,
646 "gamma <0-62>",
647 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
648 "Gamma in even unit of dBs\n")
649{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200650 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200651
652 bts->gamma = atoi(argv[0]) / 2;
653
654 return CMD_SUCCESS;
655}
656
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100657DEFUN(show_bts_stats,
658 show_bts_stats_cmd,
659 "show bts statistics",
660 SHOW_STR "BTS related functionality\nStatistics\n")
661{
662 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
663 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100664}
665
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100666#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
667DEFUN(cfg_pcu_dl_tbf_idle_time,
668 cfg_pcu_dl_tbf_idle_time_cmd,
669 "dl-tbf-idle-time <1-5000>",
670 IDLE_TIME_STR "idle time in msec")
671{
672 struct gprs_rlcmac_bts *bts = bts_main_data();
673
674 bts->dl_tbf_idle_msec = atoi(argv[0]);
675
676 return CMD_SUCCESS;
677}
678
679DEFUN(cfg_pcu_no_dl_tbf_idle_time,
680 cfg_pcu_no_dl_tbf_idle_time_cmd,
681 "no dl-tbf-idle-time",
682 NO_STR IDLE_TIME_STR)
683{
684 struct gprs_rlcmac_bts *bts = bts_main_data();
685
686 bts->dl_tbf_idle_msec = 0;
687
688 return CMD_SUCCESS;
689}
690
Jacob Erlbecka098c192015-05-28 16:11:19 +0200691#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
692DEFUN(cfg_pcu_ms_idle_time,
693 cfg_pcu_ms_idle_time_cmd,
694 "ms-idle-time <1-7200>",
695 MS_IDLE_TIME_STR "idle time in sec")
696{
697 struct gprs_rlcmac_bts *bts = bts_main_data();
698
699 bts->ms_idle_sec = atoi(argv[0]);
700
701 return CMD_SUCCESS;
702}
703
704DEFUN(cfg_pcu_no_ms_idle_time,
705 cfg_pcu_no_ms_idle_time_cmd,
706 "no ms-idle-time",
707 NO_STR MS_IDLE_TIME_STR)
708{
709 struct gprs_rlcmac_bts *bts = bts_main_data();
710
711 bts->ms_idle_sec = 0;
712
713 return CMD_SUCCESS;
714}
715
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200716#define CS_ERR_LIMITS_STR "set thresholds for error rate based CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200717DEFUN(cfg_pcu_cs_err_limits,
718 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200719 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200720 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
721{
722 struct gprs_rlcmac_bts *bts = bts_main_data();
723
724 uint8_t lower_limit = atoi(argv[0]);
725 uint8_t upper_limit = atoi(argv[1]);
726
727 if (lower_limit > upper_limit) {
728 vty_out(vty,
729 "The lower limit must be less than or equal to the "
730 "upper limit.%s", VTY_NEWLINE);
731 return CMD_WARNING;
732 }
733
734 bts->cs_adj_enabled = 1;
735 bts->cs_adj_upper_limit = upper_limit;
736 bts->cs_adj_lower_limit = lower_limit;
737
738 return CMD_SUCCESS;
739}
740
741DEFUN(cfg_pcu_no_cs_err_limits,
742 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200743 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200744 NO_STR CS_STR CS_ERR_LIMITS_STR)
745{
746 struct gprs_rlcmac_bts *bts = bts_main_data();
747
748 bts->cs_adj_enabled = 0;
749 bts->cs_adj_upper_limit = 100;
750 bts->cs_adj_lower_limit = 0;
751
752 return CMD_SUCCESS;
753}
754
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200755#define CS_DOWNGRADE_STR "set threshold for data size based CS downgrade\n"
756DEFUN(cfg_pcu_cs_downgrade_thrsh,
757 cfg_pcu_cs_downgrade_thrsh_cmd,
758 "cs downgrade-threshold <1-10000>",
759 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
760{
761 struct gprs_rlcmac_bts *bts = bts_main_data();
762
763 bts->cs_downgrade_threshold = atoi(argv[0]);
764
765 return CMD_SUCCESS;
766}
767
768DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
769 cfg_pcu_no_cs_downgrade_thrsh_cmd,
770 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200771 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200772{
773 struct gprs_rlcmac_bts *bts = bts_main_data();
774
775 bts->cs_downgrade_threshold = 0;
776
777 return CMD_SUCCESS;
778}
779
780
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200781DEFUN(cfg_pcu_cs_lqual_ranges,
782 cfg_pcu_cs_lqual_ranges_cmd,
783 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
784 CS_STR "Set link quality ranges\n"
785 "Set quality range for CS-1 (high value only)\n"
786 "CS-1 high (dB)\n"
787 "Set quality range for CS-2\n"
788 "CS-2 low (dB)\n"
789 "CS-2 high (dB)\n"
790 "Set quality range for CS-3\n"
791 "CS-3 low (dB)\n"
792 "CS-3 high (dB)\n"
793 "Set quality range for CS-4 (low value only)\n"
794 "CS-4 low (dB)\n")
795{
796 struct gprs_rlcmac_bts *bts = bts_main_data();
797
798 uint8_t cs1_high = atoi(argv[0]);
799 uint8_t cs2_low = atoi(argv[1]);
800 uint8_t cs2_high = atoi(argv[2]);
801 uint8_t cs3_low = atoi(argv[3]);
802 uint8_t cs3_high = atoi(argv[4]);
803 uint8_t cs4_low = atoi(argv[5]);
804
805 bts->cs_lqual_ranges[0].high = cs1_high;
806 bts->cs_lqual_ranges[1].low = cs2_low;
807 bts->cs_lqual_ranges[1].high = cs2_high;
808 bts->cs_lqual_ranges[2].low = cs3_low;
809 bts->cs_lqual_ranges[2].high = cs3_high;
810 bts->cs_lqual_ranges[3].low = cs4_low;
811
812 return CMD_SUCCESS;
813}
814
815
Daniel Willmann772415f2014-01-15 17:06:51 +0100816DEFUN(show_tbf,
817 show_tbf_cmd,
818 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100819 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100820{
821 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbecked2dbf62015-12-28 19:15:40 +0100822 return pcu_vty_show_tbf_all(vty, bts);
Daniel Willmann772415f2014-01-15 17:06:51 +0100823}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100824
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200825DEFUN(show_ms_all,
826 show_ms_all_cmd,
827 "show ms all",
828 SHOW_STR "information about MSs\n" "All TBFs\n")
829{
830 struct gprs_rlcmac_bts *bts = bts_main_data();
831 return pcu_vty_show_ms_all(vty, bts);
832}
833
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200834DEFUN(show_ms_tlli,
835 show_ms_tlli_cmd,
836 "show ms tlli TLLI",
837 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
838{
839 struct gprs_rlcmac_bts *bts = bts_main_data();
840 char *endp = NULL;
841 unsigned long long tlli = strtoll(argv[0], &endp, 16);
842 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
843 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
844 return CMD_WARNING;
845 }
846 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
847}
848
849DEFUN(show_ms_imsi,
850 show_ms_imsi_cmd,
851 "show ms imsi IMSI",
852 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
853{
854 struct gprs_rlcmac_bts *bts = bts_main_data();
855 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
856}
857
Andreas Eversberg12942562012-07-12 14:31:57 +0200858static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +0100859 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
860 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +0200861 "License GNU GPL version 2 or later\r\n"
862 "This is free software: you are free to change and redistribute it.\r\n"
863 "There is NO WARRANTY, to the extent permitted by law.\r\n";
864
865struct vty_app_info pcu_vty_info = {
866 .name = "Osmo-PCU",
867 .version = PACKAGE_VERSION,
868 .copyright = pcu_copyright,
869 .go_parent_cb = pcu_vty_go_parent,
870 .is_config_node = pcu_vty_is_config_node,
871};
872
873int pcu_vty_init(const struct log_info *cat)
874{
875// install_element_ve(&show_pcu_cmd);
876
877 logging_vty_add_cmds(cat);
Jacob Erlbeck42aba812015-11-10 15:32:00 +0100878 osmo_stats_vty_add_cmds(cat);
Andreas Eversberg12942562012-07-12 14:31:57 +0200879
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200880 install_node(&pcu_node, config_write_pcu);
881 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200882 vty_install_default(PCU_NODE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200883 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
884 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200885 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200886 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
887 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200888 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
889 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200890 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
891 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200892 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
893 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200894 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100895 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
896 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200897 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
898 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
899 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100900 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
901 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200902 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
903 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
904 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200905 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
906 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200907 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200908 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200909 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200910 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
911 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200912 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
913 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
914 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
915 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
916 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
917 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
918 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
919 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200920 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
921 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100922 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
923 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +0200924 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
925 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200926
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100927 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +0100928 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200929 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200930 install_element_ve(&show_ms_tlli_cmd);
931 install_element_ve(&show_ms_imsi_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100932
Andreas Eversberg12942562012-07-12 14:31:57 +0200933 return 0;
934}