blob: bddcaccb911f35f712126fb646421632dabc0dc7 [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 Erlbeckc0c580c2015-04-30 15:59:01 +02007#include <osmocom/vty/misc.h>
Andreas Eversberg8b761a32012-07-20 21:50:31 +02008#include <osmocom/core/linuxlist.h>
Holger Hans Peter Freythere8915b92014-07-02 14:57:47 +02009#include <osmocom/core/rate_ctr.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020010#include "pcu_vty.h"
Andreas Eversberg8b761a32012-07-20 21:50:31 +020011#include "gprs_rlcmac.h"
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020012#include "bts.h"
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020013#include "tbf.h"
Andreas Eversberg12942562012-07-12 14:31:57 +020014
15enum node_type pcu_vty_go_parent(struct vty *vty)
16{
17 switch (vty->node) {
18#if 0
19 case TRX_NODE:
Andreas Eversberg8b761a32012-07-20 21:50:31 +020020 vty->node = PCU_NODE;
Andreas Eversberg12942562012-07-12 14:31:57 +020021 {
22 struct gsm_bts_trx *trx = vty->index;
23 vty->index = trx->bts;
24 }
25 break;
26#endif
27 default:
28 vty->node = CONFIG_NODE;
29 }
Andreas Eversberg8b761a32012-07-20 21:50:31 +020030 return (enum node_type) vty->node;
Andreas Eversberg12942562012-07-12 14:31:57 +020031}
32
33int pcu_vty_is_config_node(struct vty *vty, int node)
34{
35 switch (node) {
Andreas Eversberg8b761a32012-07-20 21:50:31 +020036 case PCU_NODE:
Andreas Eversberg12942562012-07-12 14:31:57 +020037 return 1;
Andreas Eversberg12942562012-07-12 14:31:57 +020038 default:
39 return 0;
40 }
41}
42
Andreas Eversberg8b761a32012-07-20 21:50:31 +020043static struct cmd_node pcu_node = {
44 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +020045 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +020046 1,
47};
48
Andreas Eversberg8b761a32012-07-20 21:50:31 +020049static int config_write_pcu(struct vty *vty)
50{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +020051 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +020052
53 vty_out(vty, "pcu%s", VTY_NEWLINE);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +020054 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
55 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +020056 if (bts->fc_bvc_bucket_size)
57 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
58 bts->fc_bvc_bucket_size, VTY_NEWLINE);
59 if (bts->fc_bvc_leak_rate)
60 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
61 bts->fc_bvc_leak_rate, VTY_NEWLINE);
62 if (bts->fc_ms_bucket_size)
63 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
64 bts->fc_ms_bucket_size, VTY_NEWLINE);
65 if (bts->fc_ms_leak_rate)
66 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
67 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +020068 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +020069 if (bts->initial_cs_ul == bts->initial_cs_dl)
70 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
71 VTY_NEWLINE);
72 else
73 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
74 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +020075 }
Andreas Eversberg24131bf2012-07-21 11:09:58 +020076 if (bts->force_llc_lifetime == 0xffff)
77 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
78 else if (bts->force_llc_lifetime)
79 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
80 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +010081 if (bts->llc_discard_csec)
82 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
83 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +020084 if (bts->llc_idle_ack_csec)
85 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
86 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +020087 if (bts->alloc_algorithm == alloc_algorithm_a)
88 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
89 if (bts->alloc_algorithm == alloc_algorithm_b)
90 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +020091 if (bts->force_two_phase)
92 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +020093 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
94 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +010095 if (bts->dl_tbf_idle_msec)
96 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
97 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +020098
Holger Hans Peter Freyther0e0f2f52013-11-11 20:10:04 +010099 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200100}
101
102/* per-BTS configuration */
103DEFUN(cfg_pcu,
104 cfg_pcu_cmd,
105 "pcu",
106 "BTS specific configure")
107{
108 vty->node = PCU_NODE;
109
110 return CMD_SUCCESS;
111}
112
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200113DEFUN(cfg_pcu_fc_interval,
114 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200115 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200116 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200117 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200118{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200119 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200120
121 bts->fc_interval = atoi(argv[0]);
122
123 return CMD_SUCCESS;
124}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200125#define FC_STR "BSSGP Flow Control configuration\n"
126#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
127#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
128
129DEFUN(cfg_pcu_fc_bvc_bucket_size,
130 cfg_pcu_fc_bvc_bucket_size_cmd,
131 "flow-control force-bvc-bucket-size <1-6553500>",
132 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
133{
134 struct gprs_rlcmac_bts *bts = bts_main_data();
135
136 bts->fc_bvc_bucket_size = atoi(argv[0]);
137
138 return CMD_SUCCESS;
139}
140
141DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
142 cfg_pcu_no_fc_bvc_bucket_size_cmd,
143 "no flow-control force-bvc-bucket-size",
144 NO_STR FC_STR FC_BMAX_STR("BVC"))
145{
146 struct gprs_rlcmac_bts *bts = bts_main_data();
147
148 bts->fc_bvc_bucket_size = 0;
149
150 return CMD_SUCCESS;
151}
152
153DEFUN(cfg_pcu_fc_bvc_leak_rate,
154 cfg_pcu_fc_bvc_leak_rate_cmd,
155 "flow-control force-bvc-leak-rate <1-6553500>",
156 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
157{
158 struct gprs_rlcmac_bts *bts = bts_main_data();
159
160 bts->fc_bvc_leak_rate = atoi(argv[0]);
161
162 return CMD_SUCCESS;
163}
164
165DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
166 cfg_pcu_no_fc_bvc_leak_rate_cmd,
167 "no flow-control force-bvc-leak-rate",
168 NO_STR FC_STR FC_LR_STR("BVC"))
169{
170 struct gprs_rlcmac_bts *bts = bts_main_data();
171
172 bts->fc_bvc_leak_rate = 0;
173
174 return CMD_SUCCESS;
175}
176
177DEFUN(cfg_pcu_fc_ms_bucket_size,
178 cfg_pcu_fc_ms_bucket_size_cmd,
179 "flow-control force-ms-bucket-size <1-6553500>",
180 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
181{
182 struct gprs_rlcmac_bts *bts = bts_main_data();
183
184 bts->fc_ms_bucket_size = atoi(argv[0]);
185
186 return CMD_SUCCESS;
187}
188
189DEFUN(cfg_pcu_no_fc_ms_bucket_size,
190 cfg_pcu_no_fc_ms_bucket_size_cmd,
191 "no flow-control force-ms-bucket-size",
192 NO_STR FC_STR FC_BMAX_STR("default MS"))
193{
194 struct gprs_rlcmac_bts *bts = bts_main_data();
195
196 bts->fc_ms_bucket_size = 0;
197
198 return CMD_SUCCESS;
199}
200
201DEFUN(cfg_pcu_fc_ms_leak_rate,
202 cfg_pcu_fc_ms_leak_rate_cmd,
203 "flow-control force-ms-leak-rate <1-6553500>",
204 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
205{
206 struct gprs_rlcmac_bts *bts = bts_main_data();
207
208 bts->fc_ms_leak_rate = atoi(argv[0]);
209
210 return CMD_SUCCESS;
211}
212
213DEFUN(cfg_pcu_no_fc_ms_leak_rate,
214 cfg_pcu_no_fc_ms_leak_rate_cmd,
215 "no flow-control force-ms-leak-rate",
216 NO_STR FC_STR FC_LR_STR("default MS"))
217{
218 struct gprs_rlcmac_bts *bts = bts_main_data();
219
220 bts->fc_ms_leak_rate = 0;
221
222 return CMD_SUCCESS;
223}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200224
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200225DEFUN(cfg_pcu_cs,
226 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200227 "cs <1-4> [<1-4>]",
228 "Set the Coding Scheme to be used, (overrides BTS config)\n"
229 "Initial CS used\nAlternative uplink CS")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200230{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200231 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200232 uint8_t cs = atoi(argv[0]);
233
234 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200235 bts->initial_cs_dl = cs;
236 if (argc > 1)
237 bts->initial_cs_ul = atoi(argv[1]);
238 else
239 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200240
241 return CMD_SUCCESS;
242}
243
244DEFUN(cfg_pcu_no_cs,
245 cfg_pcu_no_cs_cmd,
246 "no cs",
247 NO_STR "Don't force given Coding Scheme, (use BTS config)\n")
248{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200249 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200250
251 bts->force_cs = 0;
252
253 return CMD_SUCCESS;
254}
255
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200256#define QUEUE_STR "Packet queue options\n"
257#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
258 "(overrides the value given by SGSN)\n"
259
260DEFUN(cfg_pcu_queue_lifetime,
261 cfg_pcu_queue_lifetime_cmd,
262 "queue lifetime <1-65534>",
263 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
264{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200265 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200266 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200267
268 bts->force_llc_lifetime = csec;
269
270 return CMD_SUCCESS;
271}
272
273DEFUN(cfg_pcu_queue_lifetime_inf,
274 cfg_pcu_queue_lifetime_inf_cmd,
275 "queue lifetime infinite",
276 QUEUE_STR LIFETIME_STR "Infinite lifetime")
277{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200278 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200279
280 bts->force_llc_lifetime = 0xffff;
281
282 return CMD_SUCCESS;
283}
284
285DEFUN(cfg_pcu_no_queue_lifetime,
286 cfg_pcu_no_queue_lifetime_cmd,
287 "no queue lifetime",
288 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
289 "by SGSN)\n")
290{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200291 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200292
293 bts->force_llc_lifetime = 0;
294
295 return CMD_SUCCESS;
296}
297
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100298#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
299 "(continue discarding until lifetime-hysteresis is reached)\n"
300
301DEFUN(cfg_pcu_queue_hysteresis,
302 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200303 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100304 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
305{
306 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200307 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100308
309 bts->llc_discard_csec = csec;
310
311 return CMD_SUCCESS;
312}
313
314DEFUN(cfg_pcu_no_queue_hysteresis,
315 cfg_pcu_no_queue_hysteresis_cmd,
316 "no queue hysteresis",
317 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
318{
319 struct gprs_rlcmac_bts *bts = bts_main_data();
320
321 bts->llc_discard_csec = 0;
322
323 return CMD_SUCCESS;
324}
325
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200326#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
327
328DEFUN(cfg_pcu_queue_idle_ack_delay,
329 cfg_pcu_queue_idle_ack_delay_cmd,
330 "queue idle-ack-delay <1-65535>",
331 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
332{
333 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200334 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200335
336 bts->llc_idle_ack_csec = csec;
337
338 return CMD_SUCCESS;
339}
340
341DEFUN(cfg_pcu_no_queue_idle_ack_delay,
342 cfg_pcu_no_queue_idle_ack_delay_cmd,
343 "no queue idle-ack-delay",
344 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
345{
346 struct gprs_rlcmac_bts *bts = bts_main_data();
347
348 bts->llc_idle_ack_csec = 0;
349
350 return CMD_SUCCESS;
351}
352
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100353
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200354DEFUN(cfg_pcu_alloc,
355 cfg_pcu_alloc_cmd,
356 "alloc-algorithm (a|b)",
357 "Select slot allocation algorithm to use when assigning timeslots on "
358 "PACCH\nSingle slot is assigned only\nMultiple slots are assigned for "
359 "semi-duplex operation")
360{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200361 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200362
363 switch (argv[0][0]) {
364 case 'a':
365 bts->alloc_algorithm = alloc_algorithm_a;
366 break;
367 case 'b':
368 bts->alloc_algorithm = alloc_algorithm_b;
369 break;
370 }
371
372 return CMD_SUCCESS;
373}
374
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200375DEFUN(cfg_pcu_two_phase,
376 cfg_pcu_two_phase_cmd,
377 "two-phase-access",
378 "Force two phase access when MS requests single phase access\n")
379{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200380 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200381
382 bts->force_two_phase = 1;
383
384 return CMD_SUCCESS;
385}
386
387DEFUN(cfg_pcu_no_two_phase,
388 cfg_pcu_no_two_phase_cmd,
389 "no two-phase-access",
390 NO_STR "Only use two phase access when requested my MS\n")
391{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200392 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200393
394 bts->force_two_phase = 0;
395
396 return CMD_SUCCESS;
397}
398
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200399DEFUN(cfg_pcu_alpha,
400 cfg_pcu_alpha_cmd,
401 "alpha <0-10>",
402 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
403 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
404 "Alpha in units of 0.1\n")
405{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200406 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200407
408 bts->alpha = atoi(argv[0]);
409
410 return CMD_SUCCESS;
411}
412
413DEFUN(cfg_pcu_gamma,
414 cfg_pcu_gamma_cmd,
415 "gamma <0-62>",
416 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
417 "Gamma in even unit of dBs\n")
418{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200419 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200420
421 bts->gamma = atoi(argv[0]) / 2;
422
423 return CMD_SUCCESS;
424}
425
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100426DEFUN(show_bts_stats,
427 show_bts_stats_cmd,
428 "show bts statistics",
429 SHOW_STR "BTS related functionality\nStatistics\n")
430{
431 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
432 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100433}
434
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100435#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
436DEFUN(cfg_pcu_dl_tbf_idle_time,
437 cfg_pcu_dl_tbf_idle_time_cmd,
438 "dl-tbf-idle-time <1-5000>",
439 IDLE_TIME_STR "idle time in msec")
440{
441 struct gprs_rlcmac_bts *bts = bts_main_data();
442
443 bts->dl_tbf_idle_msec = atoi(argv[0]);
444
445 return CMD_SUCCESS;
446}
447
448DEFUN(cfg_pcu_no_dl_tbf_idle_time,
449 cfg_pcu_no_dl_tbf_idle_time_cmd,
450 "no dl-tbf-idle-time",
451 NO_STR IDLE_TIME_STR)
452{
453 struct gprs_rlcmac_bts *bts = bts_main_data();
454
455 bts->dl_tbf_idle_msec = 0;
456
457 return CMD_SUCCESS;
458}
459
Daniel Willmann772415f2014-01-15 17:06:51 +0100460DEFUN(show_tbf,
461 show_tbf_cmd,
462 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100463 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100464{
465 struct gprs_rlcmac_bts *bts = bts_main_data();
466 struct llist_head *tbf;
467
468 vty_out(vty, "UL TBFs%s", VTY_NEWLINE);
469 llist_for_each(tbf, &bts->ul_tbfs) {
470 tbf_print_vty_info(vty, tbf);
471 }
472
473 vty_out(vty, "%sDL TBFs%s", VTY_NEWLINE, VTY_NEWLINE);
474 llist_for_each(tbf, &bts->dl_tbfs) {
475 tbf_print_vty_info(vty, tbf);
476 }
477
478 return CMD_SUCCESS;
479}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100480
Andreas Eversberg12942562012-07-12 14:31:57 +0200481static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +0100482 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
483 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +0200484 "License GNU GPL version 2 or later\r\n"
485 "This is free software: you are free to change and redistribute it.\r\n"
486 "There is NO WARRANTY, to the extent permitted by law.\r\n";
487
488struct vty_app_info pcu_vty_info = {
489 .name = "Osmo-PCU",
490 .version = PACKAGE_VERSION,
491 .copyright = pcu_copyright,
492 .go_parent_cb = pcu_vty_go_parent,
493 .is_config_node = pcu_vty_is_config_node,
494};
495
496int pcu_vty_init(const struct log_info *cat)
497{
498// install_element_ve(&show_pcu_cmd);
499
500 logging_vty_add_cmds(cat);
501
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200502 install_node(&pcu_node, config_write_pcu);
503 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200504 vty_install_default(PCU_NODE);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200505 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200506 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
507 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200508 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
509 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
510 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100511 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
512 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200513 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
514 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200515 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200516 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200517 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200518 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
519 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
520 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
521 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
522 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
523 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
524 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
525 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200526 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
527 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100528 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
529 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200530
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100531 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +0100532 install_element_ve(&show_tbf_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100533
Andreas Eversberg12942562012-07-12 14:31:57 +0200534 return 0;
535}