blob: 7add3930653437bf0ef1dcb5ac513f44d11ad1d3 [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
Jacob Erlbeck62e96a32015-06-04 09:42:14 +020015#include "pcu_vty_functions.h"
16
Andreas Eversberg12942562012-07-12 14:31:57 +020017enum node_type pcu_vty_go_parent(struct vty *vty)
18{
19 switch (vty->node) {
20#if 0
21 case TRX_NODE:
Andreas Eversberg8b761a32012-07-20 21:50:31 +020022 vty->node = PCU_NODE;
Andreas Eversberg12942562012-07-12 14:31:57 +020023 {
24 struct gsm_bts_trx *trx = vty->index;
25 vty->index = trx->bts;
26 }
27 break;
28#endif
29 default:
30 vty->node = CONFIG_NODE;
31 }
Andreas Eversberg8b761a32012-07-20 21:50:31 +020032 return (enum node_type) vty->node;
Andreas Eversberg12942562012-07-12 14:31:57 +020033}
34
35int pcu_vty_is_config_node(struct vty *vty, int node)
36{
37 switch (node) {
Andreas Eversberg8b761a32012-07-20 21:50:31 +020038 case PCU_NODE:
Andreas Eversberg12942562012-07-12 14:31:57 +020039 return 1;
Andreas Eversberg12942562012-07-12 14:31:57 +020040 default:
41 return 0;
42 }
43}
44
Andreas Eversberg8b761a32012-07-20 21:50:31 +020045static struct cmd_node pcu_node = {
46 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +020047 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +020048 1,
49};
50
Andreas Eversberg8b761a32012-07-20 21:50:31 +020051static int config_write_pcu(struct vty *vty)
52{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +020053 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +020054
55 vty_out(vty, "pcu%s", VTY_NEWLINE);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +020056 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
57 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +020058 if (bts->fc_bvc_bucket_size)
59 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
60 bts->fc_bvc_bucket_size, VTY_NEWLINE);
61 if (bts->fc_bvc_leak_rate)
62 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
63 bts->fc_bvc_leak_rate, VTY_NEWLINE);
64 if (bts->fc_ms_bucket_size)
65 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
66 bts->fc_ms_bucket_size, VTY_NEWLINE);
67 if (bts->fc_ms_leak_rate)
68 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
69 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +020070 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +020071 if (bts->initial_cs_ul == bts->initial_cs_dl)
72 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
73 VTY_NEWLINE);
74 else
75 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
76 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +020077 }
Andreas Eversberg24131bf2012-07-21 11:09:58 +020078 if (bts->force_llc_lifetime == 0xffff)
79 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
80 else if (bts->force_llc_lifetime)
81 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
82 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +010083 if (bts->llc_discard_csec)
84 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
85 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +020086 if (bts->llc_idle_ack_csec)
87 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
88 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +020089 if (bts->alloc_algorithm == alloc_algorithm_a)
90 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
91 if (bts->alloc_algorithm == alloc_algorithm_b)
92 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +020093 if (bts->force_two_phase)
94 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +020095 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
96 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +010097 if (bts->dl_tbf_idle_msec)
98 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
99 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200100
Jacob Erlbeck62e96a32015-06-04 09:42:14 +0200101 return pcu_vty_config_write_pcu_ext(vty);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200102}
103
104/* per-BTS configuration */
105DEFUN(cfg_pcu,
106 cfg_pcu_cmd,
107 "pcu",
108 "BTS specific configure")
109{
110 vty->node = PCU_NODE;
111
112 return CMD_SUCCESS;
113}
114
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200115DEFUN(cfg_pcu_fc_interval,
116 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200117 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200118 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200119 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200120{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200121 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200122
123 bts->fc_interval = atoi(argv[0]);
124
125 return CMD_SUCCESS;
126}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200127#define FC_STR "BSSGP Flow Control configuration\n"
128#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
129#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
130
131DEFUN(cfg_pcu_fc_bvc_bucket_size,
132 cfg_pcu_fc_bvc_bucket_size_cmd,
133 "flow-control force-bvc-bucket-size <1-6553500>",
134 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
135{
136 struct gprs_rlcmac_bts *bts = bts_main_data();
137
138 bts->fc_bvc_bucket_size = atoi(argv[0]);
139
140 return CMD_SUCCESS;
141}
142
143DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
144 cfg_pcu_no_fc_bvc_bucket_size_cmd,
145 "no flow-control force-bvc-bucket-size",
146 NO_STR FC_STR FC_BMAX_STR("BVC"))
147{
148 struct gprs_rlcmac_bts *bts = bts_main_data();
149
150 bts->fc_bvc_bucket_size = 0;
151
152 return CMD_SUCCESS;
153}
154
155DEFUN(cfg_pcu_fc_bvc_leak_rate,
156 cfg_pcu_fc_bvc_leak_rate_cmd,
157 "flow-control force-bvc-leak-rate <1-6553500>",
158 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
159{
160 struct gprs_rlcmac_bts *bts = bts_main_data();
161
162 bts->fc_bvc_leak_rate = atoi(argv[0]);
163
164 return CMD_SUCCESS;
165}
166
167DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
168 cfg_pcu_no_fc_bvc_leak_rate_cmd,
169 "no flow-control force-bvc-leak-rate",
170 NO_STR FC_STR FC_LR_STR("BVC"))
171{
172 struct gprs_rlcmac_bts *bts = bts_main_data();
173
174 bts->fc_bvc_leak_rate = 0;
175
176 return CMD_SUCCESS;
177}
178
179DEFUN(cfg_pcu_fc_ms_bucket_size,
180 cfg_pcu_fc_ms_bucket_size_cmd,
181 "flow-control force-ms-bucket-size <1-6553500>",
182 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
183{
184 struct gprs_rlcmac_bts *bts = bts_main_data();
185
186 bts->fc_ms_bucket_size = atoi(argv[0]);
187
188 return CMD_SUCCESS;
189}
190
191DEFUN(cfg_pcu_no_fc_ms_bucket_size,
192 cfg_pcu_no_fc_ms_bucket_size_cmd,
193 "no flow-control force-ms-bucket-size",
194 NO_STR FC_STR FC_BMAX_STR("default MS"))
195{
196 struct gprs_rlcmac_bts *bts = bts_main_data();
197
198 bts->fc_ms_bucket_size = 0;
199
200 return CMD_SUCCESS;
201}
202
203DEFUN(cfg_pcu_fc_ms_leak_rate,
204 cfg_pcu_fc_ms_leak_rate_cmd,
205 "flow-control force-ms-leak-rate <1-6553500>",
206 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
207{
208 struct gprs_rlcmac_bts *bts = bts_main_data();
209
210 bts->fc_ms_leak_rate = atoi(argv[0]);
211
212 return CMD_SUCCESS;
213}
214
215DEFUN(cfg_pcu_no_fc_ms_leak_rate,
216 cfg_pcu_no_fc_ms_leak_rate_cmd,
217 "no flow-control force-ms-leak-rate",
218 NO_STR FC_STR FC_LR_STR("default MS"))
219{
220 struct gprs_rlcmac_bts *bts = bts_main_data();
221
222 bts->fc_ms_leak_rate = 0;
223
224 return CMD_SUCCESS;
225}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200226
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200227#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
228DEFUN(cfg_pcu_fc_bucket_time,
229 cfg_pcu_fc_bucket_time_cmd,
230 "flow-control bucket-time <1-65534>",
231 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
232{
233 struct gprs_rlcmac_bts *bts = bts_main_data();
234
235 bts->fc_bucket_time = atoi(argv[0]);
236
237 return CMD_SUCCESS;
238}
239
240DEFUN(cfg_pcu_no_fc_bucket_time,
241 cfg_pcu_no_fc_bucket_time_cmd,
242 "no flow-control bucket-time",
243 NO_STR FC_STR FC_BTIME_STR)
244{
245 struct gprs_rlcmac_bts *bts = bts_main_data();
246
247 bts->fc_bucket_time = 0;
248
249 return CMD_SUCCESS;
250}
251
252
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200253DEFUN(cfg_pcu_cs,
254 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200255 "cs <1-4> [<1-4>]",
256 "Set the Coding Scheme to be used, (overrides BTS config)\n"
257 "Initial CS used\nAlternative uplink CS")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200258{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200259 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200260 uint8_t cs = atoi(argv[0]);
261
262 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200263 bts->initial_cs_dl = cs;
264 if (argc > 1)
265 bts->initial_cs_ul = atoi(argv[1]);
266 else
267 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200268
269 return CMD_SUCCESS;
270}
271
272DEFUN(cfg_pcu_no_cs,
273 cfg_pcu_no_cs_cmd,
274 "no cs",
275 NO_STR "Don't force given Coding Scheme, (use BTS config)\n")
276{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200277 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200278
279 bts->force_cs = 0;
280
281 return CMD_SUCCESS;
282}
283
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200284#define QUEUE_STR "Packet queue options\n"
285#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
286 "(overrides the value given by SGSN)\n"
287
288DEFUN(cfg_pcu_queue_lifetime,
289 cfg_pcu_queue_lifetime_cmd,
290 "queue lifetime <1-65534>",
291 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
292{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200293 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200294 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200295
296 bts->force_llc_lifetime = csec;
297
298 return CMD_SUCCESS;
299}
300
301DEFUN(cfg_pcu_queue_lifetime_inf,
302 cfg_pcu_queue_lifetime_inf_cmd,
303 "queue lifetime infinite",
304 QUEUE_STR LIFETIME_STR "Infinite lifetime")
305{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200306 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200307
308 bts->force_llc_lifetime = 0xffff;
309
310 return CMD_SUCCESS;
311}
312
313DEFUN(cfg_pcu_no_queue_lifetime,
314 cfg_pcu_no_queue_lifetime_cmd,
315 "no queue lifetime",
316 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
317 "by SGSN)\n")
318{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200319 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200320
321 bts->force_llc_lifetime = 0;
322
323 return CMD_SUCCESS;
324}
325
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100326#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
327 "(continue discarding until lifetime-hysteresis is reached)\n"
328
329DEFUN(cfg_pcu_queue_hysteresis,
330 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200331 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100332 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
333{
334 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200335 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100336
337 bts->llc_discard_csec = csec;
338
339 return CMD_SUCCESS;
340}
341
342DEFUN(cfg_pcu_no_queue_hysteresis,
343 cfg_pcu_no_queue_hysteresis_cmd,
344 "no queue hysteresis",
345 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
346{
347 struct gprs_rlcmac_bts *bts = bts_main_data();
348
349 bts->llc_discard_csec = 0;
350
351 return CMD_SUCCESS;
352}
353
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200354#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
355
356DEFUN(cfg_pcu_queue_idle_ack_delay,
357 cfg_pcu_queue_idle_ack_delay_cmd,
358 "queue idle-ack-delay <1-65535>",
359 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
360{
361 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200362 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200363
364 bts->llc_idle_ack_csec = csec;
365
366 return CMD_SUCCESS;
367}
368
369DEFUN(cfg_pcu_no_queue_idle_ack_delay,
370 cfg_pcu_no_queue_idle_ack_delay_cmd,
371 "no queue idle-ack-delay",
372 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
373{
374 struct gprs_rlcmac_bts *bts = bts_main_data();
375
376 bts->llc_idle_ack_csec = 0;
377
378 return CMD_SUCCESS;
379}
380
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100381
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200382DEFUN(cfg_pcu_alloc,
383 cfg_pcu_alloc_cmd,
384 "alloc-algorithm (a|b)",
385 "Select slot allocation algorithm to use when assigning timeslots on "
386 "PACCH\nSingle slot is assigned only\nMultiple slots are assigned for "
387 "semi-duplex operation")
388{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200389 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200390
391 switch (argv[0][0]) {
392 case 'a':
393 bts->alloc_algorithm = alloc_algorithm_a;
394 break;
395 case 'b':
396 bts->alloc_algorithm = alloc_algorithm_b;
397 break;
398 }
399
400 return CMD_SUCCESS;
401}
402
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200403DEFUN(cfg_pcu_two_phase,
404 cfg_pcu_two_phase_cmd,
405 "two-phase-access",
406 "Force two phase access when MS requests single phase access\n")
407{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200408 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200409
410 bts->force_two_phase = 1;
411
412 return CMD_SUCCESS;
413}
414
415DEFUN(cfg_pcu_no_two_phase,
416 cfg_pcu_no_two_phase_cmd,
417 "no two-phase-access",
418 NO_STR "Only use two phase access when requested my MS\n")
419{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200420 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200421
422 bts->force_two_phase = 0;
423
424 return CMD_SUCCESS;
425}
426
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200427DEFUN(cfg_pcu_alpha,
428 cfg_pcu_alpha_cmd,
429 "alpha <0-10>",
430 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
431 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
432 "Alpha in units of 0.1\n")
433{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200434 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200435
436 bts->alpha = atoi(argv[0]);
437
438 return CMD_SUCCESS;
439}
440
441DEFUN(cfg_pcu_gamma,
442 cfg_pcu_gamma_cmd,
443 "gamma <0-62>",
444 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
445 "Gamma in even unit of dBs\n")
446{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200447 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200448
449 bts->gamma = atoi(argv[0]) / 2;
450
451 return CMD_SUCCESS;
452}
453
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100454DEFUN(show_bts_stats,
455 show_bts_stats_cmd,
456 "show bts statistics",
457 SHOW_STR "BTS related functionality\nStatistics\n")
458{
459 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
460 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100461}
462
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100463#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
464DEFUN(cfg_pcu_dl_tbf_idle_time,
465 cfg_pcu_dl_tbf_idle_time_cmd,
466 "dl-tbf-idle-time <1-5000>",
467 IDLE_TIME_STR "idle time in msec")
468{
469 struct gprs_rlcmac_bts *bts = bts_main_data();
470
471 bts->dl_tbf_idle_msec = atoi(argv[0]);
472
473 return CMD_SUCCESS;
474}
475
476DEFUN(cfg_pcu_no_dl_tbf_idle_time,
477 cfg_pcu_no_dl_tbf_idle_time_cmd,
478 "no dl-tbf-idle-time",
479 NO_STR IDLE_TIME_STR)
480{
481 struct gprs_rlcmac_bts *bts = bts_main_data();
482
483 bts->dl_tbf_idle_msec = 0;
484
485 return CMD_SUCCESS;
486}
487
Jacob Erlbecka098c192015-05-28 16:11:19 +0200488#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
489DEFUN(cfg_pcu_ms_idle_time,
490 cfg_pcu_ms_idle_time_cmd,
491 "ms-idle-time <1-7200>",
492 MS_IDLE_TIME_STR "idle time in sec")
493{
494 struct gprs_rlcmac_bts *bts = bts_main_data();
495
496 bts->ms_idle_sec = atoi(argv[0]);
497
498 return CMD_SUCCESS;
499}
500
501DEFUN(cfg_pcu_no_ms_idle_time,
502 cfg_pcu_no_ms_idle_time_cmd,
503 "no ms-idle-time",
504 NO_STR MS_IDLE_TIME_STR)
505{
506 struct gprs_rlcmac_bts *bts = bts_main_data();
507
508 bts->ms_idle_sec = 0;
509
510 return CMD_SUCCESS;
511}
512
Daniel Willmann772415f2014-01-15 17:06:51 +0100513DEFUN(show_tbf,
514 show_tbf_cmd,
515 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100516 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100517{
518 struct gprs_rlcmac_bts *bts = bts_main_data();
519 struct llist_head *tbf;
520
521 vty_out(vty, "UL TBFs%s", VTY_NEWLINE);
522 llist_for_each(tbf, &bts->ul_tbfs) {
523 tbf_print_vty_info(vty, tbf);
524 }
525
526 vty_out(vty, "%sDL TBFs%s", VTY_NEWLINE, VTY_NEWLINE);
527 llist_for_each(tbf, &bts->dl_tbfs) {
528 tbf_print_vty_info(vty, tbf);
529 }
530
531 return CMD_SUCCESS;
532}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100533
Andreas Eversberg12942562012-07-12 14:31:57 +0200534static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +0100535 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
536 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +0200537 "License GNU GPL version 2 or later\r\n"
538 "This is free software: you are free to change and redistribute it.\r\n"
539 "There is NO WARRANTY, to the extent permitted by law.\r\n";
540
541struct vty_app_info pcu_vty_info = {
542 .name = "Osmo-PCU",
543 .version = PACKAGE_VERSION,
544 .copyright = pcu_copyright,
545 .go_parent_cb = pcu_vty_go_parent,
546 .is_config_node = pcu_vty_is_config_node,
547};
548
549int pcu_vty_init(const struct log_info *cat)
550{
551// install_element_ve(&show_pcu_cmd);
552
553 logging_vty_add_cmds(cat);
554
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200555 install_node(&pcu_node, config_write_pcu);
556 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200557 vty_install_default(PCU_NODE);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200558 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200559 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
560 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200561 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
562 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
563 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100564 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
565 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200566 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
567 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200568 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200569 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200570 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200571 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
572 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200573 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
574 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
575 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
576 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
577 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
578 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
579 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
580 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200581 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
582 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100583 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
584 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +0200585 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
586 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200587
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100588 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +0100589 install_element_ve(&show_tbf_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100590
Andreas Eversberg12942562012-07-12 14:31:57 +0200591 return 0;
592}