blob: 8db025e62844fac49c2dd6c8b508395002aa675e [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 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +020078 if (bts->max_cs_dl && bts->max_cs_ul) {
79 if (bts->max_cs_ul == bts->max_cs_dl)
80 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
81 VTY_NEWLINE);
82 else
83 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
84 bts->max_cs_ul, VTY_NEWLINE);
85 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +020086 if (bts->cs_adj_enabled)
87 vty_out(vty, " cs threshold %d %d%s",
88 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
89 VTY_NEWLINE);
90 else
91 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
92
Jacob Erlbeck94cde132015-06-09 09:44:36 +020093 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
94 bts->cs_lqual_ranges[0].high,
95 bts->cs_lqual_ranges[1].low,
96 bts->cs_lqual_ranges[1].high,
97 bts->cs_lqual_ranges[2].low,
98 bts->cs_lqual_ranges[2].high,
99 bts->cs_lqual_ranges[3].low,
100 VTY_NEWLINE);
101
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200102 if (bts->force_llc_lifetime == 0xffff)
103 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
104 else if (bts->force_llc_lifetime)
105 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
106 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100107 if (bts->llc_discard_csec)
108 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
109 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200110 if (bts->llc_idle_ack_csec)
111 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
112 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200113 if (bts->alloc_algorithm == alloc_algorithm_a)
114 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
115 if (bts->alloc_algorithm == alloc_algorithm_b)
116 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200117 if (bts->force_two_phase)
118 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200119 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
120 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100121 if (bts->dl_tbf_idle_msec)
122 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
123 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200124
Jacob Erlbeck62e96a32015-06-04 09:42:14 +0200125 return pcu_vty_config_write_pcu_ext(vty);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200126}
127
128/* per-BTS configuration */
129DEFUN(cfg_pcu,
130 cfg_pcu_cmd,
131 "pcu",
132 "BTS specific configure")
133{
134 vty->node = PCU_NODE;
135
136 return CMD_SUCCESS;
137}
138
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200139DEFUN(cfg_pcu_fc_interval,
140 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200141 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200142 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200143 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200144{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200145 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200146
147 bts->fc_interval = atoi(argv[0]);
148
149 return CMD_SUCCESS;
150}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200151#define FC_STR "BSSGP Flow Control configuration\n"
152#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
153#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
154
155DEFUN(cfg_pcu_fc_bvc_bucket_size,
156 cfg_pcu_fc_bvc_bucket_size_cmd,
157 "flow-control force-bvc-bucket-size <1-6553500>",
158 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
159{
160 struct gprs_rlcmac_bts *bts = bts_main_data();
161
162 bts->fc_bvc_bucket_size = atoi(argv[0]);
163
164 return CMD_SUCCESS;
165}
166
167DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
168 cfg_pcu_no_fc_bvc_bucket_size_cmd,
169 "no flow-control force-bvc-bucket-size",
170 NO_STR FC_STR FC_BMAX_STR("BVC"))
171{
172 struct gprs_rlcmac_bts *bts = bts_main_data();
173
174 bts->fc_bvc_bucket_size = 0;
175
176 return CMD_SUCCESS;
177}
178
179DEFUN(cfg_pcu_fc_bvc_leak_rate,
180 cfg_pcu_fc_bvc_leak_rate_cmd,
181 "flow-control force-bvc-leak-rate <1-6553500>",
182 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
183{
184 struct gprs_rlcmac_bts *bts = bts_main_data();
185
186 bts->fc_bvc_leak_rate = atoi(argv[0]);
187
188 return CMD_SUCCESS;
189}
190
191DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
192 cfg_pcu_no_fc_bvc_leak_rate_cmd,
193 "no flow-control force-bvc-leak-rate",
194 NO_STR FC_STR FC_LR_STR("BVC"))
195{
196 struct gprs_rlcmac_bts *bts = bts_main_data();
197
198 bts->fc_bvc_leak_rate = 0;
199
200 return CMD_SUCCESS;
201}
202
203DEFUN(cfg_pcu_fc_ms_bucket_size,
204 cfg_pcu_fc_ms_bucket_size_cmd,
205 "flow-control force-ms-bucket-size <1-6553500>",
206 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
207{
208 struct gprs_rlcmac_bts *bts = bts_main_data();
209
210 bts->fc_ms_bucket_size = atoi(argv[0]);
211
212 return CMD_SUCCESS;
213}
214
215DEFUN(cfg_pcu_no_fc_ms_bucket_size,
216 cfg_pcu_no_fc_ms_bucket_size_cmd,
217 "no flow-control force-ms-bucket-size",
218 NO_STR FC_STR FC_BMAX_STR("default MS"))
219{
220 struct gprs_rlcmac_bts *bts = bts_main_data();
221
222 bts->fc_ms_bucket_size = 0;
223
224 return CMD_SUCCESS;
225}
226
227DEFUN(cfg_pcu_fc_ms_leak_rate,
228 cfg_pcu_fc_ms_leak_rate_cmd,
229 "flow-control force-ms-leak-rate <1-6553500>",
230 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
231{
232 struct gprs_rlcmac_bts *bts = bts_main_data();
233
234 bts->fc_ms_leak_rate = atoi(argv[0]);
235
236 return CMD_SUCCESS;
237}
238
239DEFUN(cfg_pcu_no_fc_ms_leak_rate,
240 cfg_pcu_no_fc_ms_leak_rate_cmd,
241 "no flow-control force-ms-leak-rate",
242 NO_STR FC_STR FC_LR_STR("default MS"))
243{
244 struct gprs_rlcmac_bts *bts = bts_main_data();
245
246 bts->fc_ms_leak_rate = 0;
247
248 return CMD_SUCCESS;
249}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200250
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200251#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
252DEFUN(cfg_pcu_fc_bucket_time,
253 cfg_pcu_fc_bucket_time_cmd,
254 "flow-control bucket-time <1-65534>",
255 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
256{
257 struct gprs_rlcmac_bts *bts = bts_main_data();
258
259 bts->fc_bucket_time = atoi(argv[0]);
260
261 return CMD_SUCCESS;
262}
263
264DEFUN(cfg_pcu_no_fc_bucket_time,
265 cfg_pcu_no_fc_bucket_time_cmd,
266 "no flow-control bucket-time",
267 NO_STR FC_STR FC_BTIME_STR)
268{
269 struct gprs_rlcmac_bts *bts = bts_main_data();
270
271 bts->fc_bucket_time = 0;
272
273 return CMD_SUCCESS;
274}
275
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200276#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200277
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200278DEFUN(cfg_pcu_cs,
279 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200280 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200281 CS_STR
282 "Initial CS value to be used (overrides BTS config)\n"
283 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200284{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200285 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200286 uint8_t cs = atoi(argv[0]);
287
288 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200289 bts->initial_cs_dl = cs;
290 if (argc > 1)
291 bts->initial_cs_ul = atoi(argv[1]);
292 else
293 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200294
295 return CMD_SUCCESS;
296}
297
298DEFUN(cfg_pcu_no_cs,
299 cfg_pcu_no_cs_cmd,
300 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200301 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200302{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200303 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200304
305 bts->force_cs = 0;
306
307 return CMD_SUCCESS;
308}
309
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200310DEFUN(cfg_pcu_cs_max,
311 cfg_pcu_cs_max_cmd,
312 "cs max <1-4> [<1-4>]",
313 CS_STR
314 "Set maximum values for adaptive CS selection (overrides BTS config)\n"
315 "Maximum CS value to be used\n"
316 "Use a different maximum CS value for the uplink")
317{
318 struct gprs_rlcmac_bts *bts = bts_main_data();
319 uint8_t cs = atoi(argv[0]);
320
321 bts->max_cs_dl = cs;
322 if (argc > 1)
323 bts->max_cs_ul = atoi(argv[1]);
324 else
325 bts->max_cs_ul = cs;
326
327 return CMD_SUCCESS;
328}
329
330DEFUN(cfg_pcu_no_cs_max,
331 cfg_pcu_no_cs_max_cmd,
332 "no cs max",
333 NO_STR CS_STR
334 "Set maximum values for adaptive CS selection (overrides BTS config)\n")
335{
336 struct gprs_rlcmac_bts *bts = bts_main_data();
337
338 bts->max_cs_dl = 0;
339 bts->max_cs_ul = 0;
340
341 return CMD_SUCCESS;
342}
343
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200344#define QUEUE_STR "Packet queue options\n"
345#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
346 "(overrides the value given by SGSN)\n"
347
348DEFUN(cfg_pcu_queue_lifetime,
349 cfg_pcu_queue_lifetime_cmd,
350 "queue lifetime <1-65534>",
351 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
352{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200353 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200354 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200355
356 bts->force_llc_lifetime = csec;
357
358 return CMD_SUCCESS;
359}
360
361DEFUN(cfg_pcu_queue_lifetime_inf,
362 cfg_pcu_queue_lifetime_inf_cmd,
363 "queue lifetime infinite",
364 QUEUE_STR LIFETIME_STR "Infinite lifetime")
365{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200366 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200367
368 bts->force_llc_lifetime = 0xffff;
369
370 return CMD_SUCCESS;
371}
372
373DEFUN(cfg_pcu_no_queue_lifetime,
374 cfg_pcu_no_queue_lifetime_cmd,
375 "no queue lifetime",
376 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
377 "by SGSN)\n")
378{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200379 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200380
381 bts->force_llc_lifetime = 0;
382
383 return CMD_SUCCESS;
384}
385
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100386#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
387 "(continue discarding until lifetime-hysteresis is reached)\n"
388
389DEFUN(cfg_pcu_queue_hysteresis,
390 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200391 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100392 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
393{
394 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200395 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100396
397 bts->llc_discard_csec = csec;
398
399 return CMD_SUCCESS;
400}
401
402DEFUN(cfg_pcu_no_queue_hysteresis,
403 cfg_pcu_no_queue_hysteresis_cmd,
404 "no queue hysteresis",
405 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
406{
407 struct gprs_rlcmac_bts *bts = bts_main_data();
408
409 bts->llc_discard_csec = 0;
410
411 return CMD_SUCCESS;
412}
413
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200414#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
415
416DEFUN(cfg_pcu_queue_idle_ack_delay,
417 cfg_pcu_queue_idle_ack_delay_cmd,
418 "queue idle-ack-delay <1-65535>",
419 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
420{
421 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200422 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200423
424 bts->llc_idle_ack_csec = csec;
425
426 return CMD_SUCCESS;
427}
428
429DEFUN(cfg_pcu_no_queue_idle_ack_delay,
430 cfg_pcu_no_queue_idle_ack_delay_cmd,
431 "no queue idle-ack-delay",
432 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
433{
434 struct gprs_rlcmac_bts *bts = bts_main_data();
435
436 bts->llc_idle_ack_csec = 0;
437
438 return CMD_SUCCESS;
439}
440
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100441
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200442DEFUN(cfg_pcu_alloc,
443 cfg_pcu_alloc_cmd,
444 "alloc-algorithm (a|b)",
445 "Select slot allocation algorithm to use when assigning timeslots on "
446 "PACCH\nSingle slot is assigned only\nMultiple slots are assigned for "
447 "semi-duplex operation")
448{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200449 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200450
451 switch (argv[0][0]) {
452 case 'a':
453 bts->alloc_algorithm = alloc_algorithm_a;
454 break;
455 case 'b':
456 bts->alloc_algorithm = alloc_algorithm_b;
457 break;
458 }
459
460 return CMD_SUCCESS;
461}
462
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200463DEFUN(cfg_pcu_two_phase,
464 cfg_pcu_two_phase_cmd,
465 "two-phase-access",
466 "Force two phase access when MS requests single phase access\n")
467{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200468 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200469
470 bts->force_two_phase = 1;
471
472 return CMD_SUCCESS;
473}
474
475DEFUN(cfg_pcu_no_two_phase,
476 cfg_pcu_no_two_phase_cmd,
477 "no two-phase-access",
478 NO_STR "Only use two phase access when requested my MS\n")
479{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200480 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200481
482 bts->force_two_phase = 0;
483
484 return CMD_SUCCESS;
485}
486
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200487DEFUN(cfg_pcu_alpha,
488 cfg_pcu_alpha_cmd,
489 "alpha <0-10>",
490 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
491 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
492 "Alpha in units of 0.1\n")
493{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200494 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200495
496 bts->alpha = atoi(argv[0]);
497
498 return CMD_SUCCESS;
499}
500
501DEFUN(cfg_pcu_gamma,
502 cfg_pcu_gamma_cmd,
503 "gamma <0-62>",
504 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
505 "Gamma in even unit of dBs\n")
506{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200507 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200508
509 bts->gamma = atoi(argv[0]) / 2;
510
511 return CMD_SUCCESS;
512}
513
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100514DEFUN(show_bts_stats,
515 show_bts_stats_cmd,
516 "show bts statistics",
517 SHOW_STR "BTS related functionality\nStatistics\n")
518{
519 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
520 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100521}
522
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100523#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
524DEFUN(cfg_pcu_dl_tbf_idle_time,
525 cfg_pcu_dl_tbf_idle_time_cmd,
526 "dl-tbf-idle-time <1-5000>",
527 IDLE_TIME_STR "idle time in msec")
528{
529 struct gprs_rlcmac_bts *bts = bts_main_data();
530
531 bts->dl_tbf_idle_msec = atoi(argv[0]);
532
533 return CMD_SUCCESS;
534}
535
536DEFUN(cfg_pcu_no_dl_tbf_idle_time,
537 cfg_pcu_no_dl_tbf_idle_time_cmd,
538 "no dl-tbf-idle-time",
539 NO_STR IDLE_TIME_STR)
540{
541 struct gprs_rlcmac_bts *bts = bts_main_data();
542
543 bts->dl_tbf_idle_msec = 0;
544
545 return CMD_SUCCESS;
546}
547
Jacob Erlbecka098c192015-05-28 16:11:19 +0200548#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
549DEFUN(cfg_pcu_ms_idle_time,
550 cfg_pcu_ms_idle_time_cmd,
551 "ms-idle-time <1-7200>",
552 MS_IDLE_TIME_STR "idle time in sec")
553{
554 struct gprs_rlcmac_bts *bts = bts_main_data();
555
556 bts->ms_idle_sec = atoi(argv[0]);
557
558 return CMD_SUCCESS;
559}
560
561DEFUN(cfg_pcu_no_ms_idle_time,
562 cfg_pcu_no_ms_idle_time_cmd,
563 "no ms-idle-time",
564 NO_STR MS_IDLE_TIME_STR)
565{
566 struct gprs_rlcmac_bts *bts = bts_main_data();
567
568 bts->ms_idle_sec = 0;
569
570 return CMD_SUCCESS;
571}
572
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200573#define CS_ERR_LIMITS_STR "set thresholds for error rate based CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200574DEFUN(cfg_pcu_cs_err_limits,
575 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200576 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200577 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
578{
579 struct gprs_rlcmac_bts *bts = bts_main_data();
580
581 uint8_t lower_limit = atoi(argv[0]);
582 uint8_t upper_limit = atoi(argv[1]);
583
584 if (lower_limit > upper_limit) {
585 vty_out(vty,
586 "The lower limit must be less than or equal to the "
587 "upper limit.%s", VTY_NEWLINE);
588 return CMD_WARNING;
589 }
590
591 bts->cs_adj_enabled = 1;
592 bts->cs_adj_upper_limit = upper_limit;
593 bts->cs_adj_lower_limit = lower_limit;
594
595 return CMD_SUCCESS;
596}
597
598DEFUN(cfg_pcu_no_cs_err_limits,
599 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200600 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200601 NO_STR CS_STR CS_ERR_LIMITS_STR)
602{
603 struct gprs_rlcmac_bts *bts = bts_main_data();
604
605 bts->cs_adj_enabled = 0;
606 bts->cs_adj_upper_limit = 100;
607 bts->cs_adj_lower_limit = 0;
608
609 return CMD_SUCCESS;
610}
611
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200612DEFUN(cfg_pcu_cs_lqual_ranges,
613 cfg_pcu_cs_lqual_ranges_cmd,
614 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
615 CS_STR "Set link quality ranges\n"
616 "Set quality range for CS-1 (high value only)\n"
617 "CS-1 high (dB)\n"
618 "Set quality range for CS-2\n"
619 "CS-2 low (dB)\n"
620 "CS-2 high (dB)\n"
621 "Set quality range for CS-3\n"
622 "CS-3 low (dB)\n"
623 "CS-3 high (dB)\n"
624 "Set quality range for CS-4 (low value only)\n"
625 "CS-4 low (dB)\n")
626{
627 struct gprs_rlcmac_bts *bts = bts_main_data();
628
629 uint8_t cs1_high = atoi(argv[0]);
630 uint8_t cs2_low = atoi(argv[1]);
631 uint8_t cs2_high = atoi(argv[2]);
632 uint8_t cs3_low = atoi(argv[3]);
633 uint8_t cs3_high = atoi(argv[4]);
634 uint8_t cs4_low = atoi(argv[5]);
635
636 bts->cs_lqual_ranges[0].high = cs1_high;
637 bts->cs_lqual_ranges[1].low = cs2_low;
638 bts->cs_lqual_ranges[1].high = cs2_high;
639 bts->cs_lqual_ranges[2].low = cs3_low;
640 bts->cs_lqual_ranges[2].high = cs3_high;
641 bts->cs_lqual_ranges[3].low = cs4_low;
642
643 return CMD_SUCCESS;
644}
645
646
Daniel Willmann772415f2014-01-15 17:06:51 +0100647DEFUN(show_tbf,
648 show_tbf_cmd,
649 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100650 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100651{
652 struct gprs_rlcmac_bts *bts = bts_main_data();
653 struct llist_head *tbf;
654
655 vty_out(vty, "UL TBFs%s", VTY_NEWLINE);
656 llist_for_each(tbf, &bts->ul_tbfs) {
657 tbf_print_vty_info(vty, tbf);
658 }
659
660 vty_out(vty, "%sDL TBFs%s", VTY_NEWLINE, VTY_NEWLINE);
661 llist_for_each(tbf, &bts->dl_tbfs) {
662 tbf_print_vty_info(vty, tbf);
663 }
664
665 return CMD_SUCCESS;
666}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100667
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200668DEFUN(show_ms_all,
669 show_ms_all_cmd,
670 "show ms all",
671 SHOW_STR "information about MSs\n" "All TBFs\n")
672{
673 struct gprs_rlcmac_bts *bts = bts_main_data();
674 return pcu_vty_show_ms_all(vty, bts);
675}
676
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200677DEFUN(show_ms_tlli,
678 show_ms_tlli_cmd,
679 "show ms tlli TLLI",
680 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
681{
682 struct gprs_rlcmac_bts *bts = bts_main_data();
683 char *endp = NULL;
684 unsigned long long tlli = strtoll(argv[0], &endp, 16);
685 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
686 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
687 return CMD_WARNING;
688 }
689 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
690}
691
692DEFUN(show_ms_imsi,
693 show_ms_imsi_cmd,
694 "show ms imsi IMSI",
695 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
696{
697 struct gprs_rlcmac_bts *bts = bts_main_data();
698 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
699}
700
Andreas Eversberg12942562012-07-12 14:31:57 +0200701static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +0100702 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
703 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +0200704 "License GNU GPL version 2 or later\r\n"
705 "This is free software: you are free to change and redistribute it.\r\n"
706 "There is NO WARRANTY, to the extent permitted by law.\r\n";
707
708struct vty_app_info pcu_vty_info = {
709 .name = "Osmo-PCU",
710 .version = PACKAGE_VERSION,
711 .copyright = pcu_copyright,
712 .go_parent_cb = pcu_vty_go_parent,
713 .is_config_node = pcu_vty_is_config_node,
714};
715
716int pcu_vty_init(const struct log_info *cat)
717{
718// install_element_ve(&show_pcu_cmd);
719
720 logging_vty_add_cmds(cat);
721
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200722 install_node(&pcu_node, config_write_pcu);
723 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200724 vty_install_default(PCU_NODE);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200725 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200726 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
727 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200728 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
729 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200730 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
731 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200732 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200733 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
734 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
735 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100736 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
737 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200738 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
739 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200740 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200741 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200742 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200743 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
744 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200745 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
746 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
747 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
748 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
749 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
750 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
751 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
752 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200753 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
754 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100755 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
756 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +0200757 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
758 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200759
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100760 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +0100761 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200762 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200763 install_element_ve(&show_ms_tlli_cmd);
764 install_element_ve(&show_ms_imsi_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100765
Andreas Eversberg12942562012-07-12 14:31:57 +0200766 return 0;
767}