blob: 05c4b7a16ec8d9bf121588b3162e50164ec67495 [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 Erlbeck70b96aa2015-06-12 10:52:34 +020093 if (bts->cs_downgrade_threshold)
94 vty_out(vty, " cs downgrade-threshold %d%s",
95 bts->cs_downgrade_threshold, VTY_NEWLINE);
96 else
97 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
98
Jacob Erlbeck94cde132015-06-09 09:44:36 +020099 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
100 bts->cs_lqual_ranges[0].high,
101 bts->cs_lqual_ranges[1].low,
102 bts->cs_lqual_ranges[1].high,
103 bts->cs_lqual_ranges[2].low,
104 bts->cs_lqual_ranges[2].high,
105 bts->cs_lqual_ranges[3].low,
106 VTY_NEWLINE);
107
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200108 if (bts->force_llc_lifetime == 0xffff)
109 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
110 else if (bts->force_llc_lifetime)
111 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
112 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100113 if (bts->llc_discard_csec)
114 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
115 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200116 if (bts->llc_idle_ack_csec)
117 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
118 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200119 if (bts->alloc_algorithm == alloc_algorithm_a)
120 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
121 if (bts->alloc_algorithm == alloc_algorithm_b)
122 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200123 if (bts->force_two_phase)
124 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200125 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
126 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100127 if (bts->dl_tbf_idle_msec)
128 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
129 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200130
Jacob Erlbeck62e96a32015-06-04 09:42:14 +0200131 return pcu_vty_config_write_pcu_ext(vty);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200132}
133
134/* per-BTS configuration */
135DEFUN(cfg_pcu,
136 cfg_pcu_cmd,
137 "pcu",
138 "BTS specific configure")
139{
140 vty->node = PCU_NODE;
141
142 return CMD_SUCCESS;
143}
144
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200145DEFUN(cfg_pcu_fc_interval,
146 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200147 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200148 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200149 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200150{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200151 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200152
153 bts->fc_interval = atoi(argv[0]);
154
155 return CMD_SUCCESS;
156}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200157#define FC_STR "BSSGP Flow Control configuration\n"
158#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
159#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
160
161DEFUN(cfg_pcu_fc_bvc_bucket_size,
162 cfg_pcu_fc_bvc_bucket_size_cmd,
163 "flow-control force-bvc-bucket-size <1-6553500>",
164 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
165{
166 struct gprs_rlcmac_bts *bts = bts_main_data();
167
168 bts->fc_bvc_bucket_size = atoi(argv[0]);
169
170 return CMD_SUCCESS;
171}
172
173DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
174 cfg_pcu_no_fc_bvc_bucket_size_cmd,
175 "no flow-control force-bvc-bucket-size",
176 NO_STR FC_STR FC_BMAX_STR("BVC"))
177{
178 struct gprs_rlcmac_bts *bts = bts_main_data();
179
180 bts->fc_bvc_bucket_size = 0;
181
182 return CMD_SUCCESS;
183}
184
185DEFUN(cfg_pcu_fc_bvc_leak_rate,
186 cfg_pcu_fc_bvc_leak_rate_cmd,
187 "flow-control force-bvc-leak-rate <1-6553500>",
188 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
189{
190 struct gprs_rlcmac_bts *bts = bts_main_data();
191
192 bts->fc_bvc_leak_rate = atoi(argv[0]);
193
194 return CMD_SUCCESS;
195}
196
197DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
198 cfg_pcu_no_fc_bvc_leak_rate_cmd,
199 "no flow-control force-bvc-leak-rate",
200 NO_STR FC_STR FC_LR_STR("BVC"))
201{
202 struct gprs_rlcmac_bts *bts = bts_main_data();
203
204 bts->fc_bvc_leak_rate = 0;
205
206 return CMD_SUCCESS;
207}
208
209DEFUN(cfg_pcu_fc_ms_bucket_size,
210 cfg_pcu_fc_ms_bucket_size_cmd,
211 "flow-control force-ms-bucket-size <1-6553500>",
212 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
213{
214 struct gprs_rlcmac_bts *bts = bts_main_data();
215
216 bts->fc_ms_bucket_size = atoi(argv[0]);
217
218 return CMD_SUCCESS;
219}
220
221DEFUN(cfg_pcu_no_fc_ms_bucket_size,
222 cfg_pcu_no_fc_ms_bucket_size_cmd,
223 "no flow-control force-ms-bucket-size",
224 NO_STR FC_STR FC_BMAX_STR("default MS"))
225{
226 struct gprs_rlcmac_bts *bts = bts_main_data();
227
228 bts->fc_ms_bucket_size = 0;
229
230 return CMD_SUCCESS;
231}
232
233DEFUN(cfg_pcu_fc_ms_leak_rate,
234 cfg_pcu_fc_ms_leak_rate_cmd,
235 "flow-control force-ms-leak-rate <1-6553500>",
236 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
237{
238 struct gprs_rlcmac_bts *bts = bts_main_data();
239
240 bts->fc_ms_leak_rate = atoi(argv[0]);
241
242 return CMD_SUCCESS;
243}
244
245DEFUN(cfg_pcu_no_fc_ms_leak_rate,
246 cfg_pcu_no_fc_ms_leak_rate_cmd,
247 "no flow-control force-ms-leak-rate",
248 NO_STR FC_STR FC_LR_STR("default MS"))
249{
250 struct gprs_rlcmac_bts *bts = bts_main_data();
251
252 bts->fc_ms_leak_rate = 0;
253
254 return CMD_SUCCESS;
255}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200256
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200257#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
258DEFUN(cfg_pcu_fc_bucket_time,
259 cfg_pcu_fc_bucket_time_cmd,
260 "flow-control bucket-time <1-65534>",
261 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
262{
263 struct gprs_rlcmac_bts *bts = bts_main_data();
264
265 bts->fc_bucket_time = atoi(argv[0]);
266
267 return CMD_SUCCESS;
268}
269
270DEFUN(cfg_pcu_no_fc_bucket_time,
271 cfg_pcu_no_fc_bucket_time_cmd,
272 "no flow-control bucket-time",
273 NO_STR FC_STR FC_BTIME_STR)
274{
275 struct gprs_rlcmac_bts *bts = bts_main_data();
276
277 bts->fc_bucket_time = 0;
278
279 return CMD_SUCCESS;
280}
281
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200282#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200283
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200284DEFUN(cfg_pcu_cs,
285 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200286 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200287 CS_STR
288 "Initial CS value to be used (overrides BTS config)\n"
289 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200290{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200291 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200292 uint8_t cs = atoi(argv[0]);
293
294 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200295 bts->initial_cs_dl = cs;
296 if (argc > 1)
297 bts->initial_cs_ul = atoi(argv[1]);
298 else
299 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200300
301 return CMD_SUCCESS;
302}
303
304DEFUN(cfg_pcu_no_cs,
305 cfg_pcu_no_cs_cmd,
306 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200307 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200308{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200309 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200310
311 bts->force_cs = 0;
312
313 return CMD_SUCCESS;
314}
315
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200316DEFUN(cfg_pcu_cs_max,
317 cfg_pcu_cs_max_cmd,
318 "cs max <1-4> [<1-4>]",
319 CS_STR
320 "Set maximum values for adaptive CS selection (overrides BTS config)\n"
321 "Maximum CS value to be used\n"
322 "Use a different maximum CS value for the uplink")
323{
324 struct gprs_rlcmac_bts *bts = bts_main_data();
325 uint8_t cs = atoi(argv[0]);
326
327 bts->max_cs_dl = cs;
328 if (argc > 1)
329 bts->max_cs_ul = atoi(argv[1]);
330 else
331 bts->max_cs_ul = cs;
332
333 return CMD_SUCCESS;
334}
335
336DEFUN(cfg_pcu_no_cs_max,
337 cfg_pcu_no_cs_max_cmd,
338 "no cs max",
339 NO_STR CS_STR
340 "Set maximum values for adaptive CS selection (overrides BTS config)\n")
341{
342 struct gprs_rlcmac_bts *bts = bts_main_data();
343
344 bts->max_cs_dl = 0;
345 bts->max_cs_ul = 0;
346
347 return CMD_SUCCESS;
348}
349
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200350#define QUEUE_STR "Packet queue options\n"
351#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
352 "(overrides the value given by SGSN)\n"
353
354DEFUN(cfg_pcu_queue_lifetime,
355 cfg_pcu_queue_lifetime_cmd,
356 "queue lifetime <1-65534>",
357 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
358{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200359 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200360 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200361
362 bts->force_llc_lifetime = csec;
363
364 return CMD_SUCCESS;
365}
366
367DEFUN(cfg_pcu_queue_lifetime_inf,
368 cfg_pcu_queue_lifetime_inf_cmd,
369 "queue lifetime infinite",
370 QUEUE_STR LIFETIME_STR "Infinite lifetime")
371{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200372 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200373
374 bts->force_llc_lifetime = 0xffff;
375
376 return CMD_SUCCESS;
377}
378
379DEFUN(cfg_pcu_no_queue_lifetime,
380 cfg_pcu_no_queue_lifetime_cmd,
381 "no queue lifetime",
382 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
383 "by SGSN)\n")
384{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200385 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200386
387 bts->force_llc_lifetime = 0;
388
389 return CMD_SUCCESS;
390}
391
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100392#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
393 "(continue discarding until lifetime-hysteresis is reached)\n"
394
395DEFUN(cfg_pcu_queue_hysteresis,
396 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200397 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100398 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
399{
400 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200401 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100402
403 bts->llc_discard_csec = csec;
404
405 return CMD_SUCCESS;
406}
407
408DEFUN(cfg_pcu_no_queue_hysteresis,
409 cfg_pcu_no_queue_hysteresis_cmd,
410 "no queue hysteresis",
411 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
412{
413 struct gprs_rlcmac_bts *bts = bts_main_data();
414
415 bts->llc_discard_csec = 0;
416
417 return CMD_SUCCESS;
418}
419
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200420#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
421
422DEFUN(cfg_pcu_queue_idle_ack_delay,
423 cfg_pcu_queue_idle_ack_delay_cmd,
424 "queue idle-ack-delay <1-65535>",
425 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
426{
427 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200428 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200429
430 bts->llc_idle_ack_csec = csec;
431
432 return CMD_SUCCESS;
433}
434
435DEFUN(cfg_pcu_no_queue_idle_ack_delay,
436 cfg_pcu_no_queue_idle_ack_delay_cmd,
437 "no queue idle-ack-delay",
438 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
439{
440 struct gprs_rlcmac_bts *bts = bts_main_data();
441
442 bts->llc_idle_ack_csec = 0;
443
444 return CMD_SUCCESS;
445}
446
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100447
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200448DEFUN(cfg_pcu_alloc,
449 cfg_pcu_alloc_cmd,
450 "alloc-algorithm (a|b)",
451 "Select slot allocation algorithm to use when assigning timeslots on "
452 "PACCH\nSingle slot is assigned only\nMultiple slots are assigned for "
453 "semi-duplex operation")
454{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200455 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200456
457 switch (argv[0][0]) {
458 case 'a':
459 bts->alloc_algorithm = alloc_algorithm_a;
460 break;
461 case 'b':
462 bts->alloc_algorithm = alloc_algorithm_b;
463 break;
464 }
465
466 return CMD_SUCCESS;
467}
468
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200469DEFUN(cfg_pcu_two_phase,
470 cfg_pcu_two_phase_cmd,
471 "two-phase-access",
472 "Force two phase access when MS requests single phase access\n")
473{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200474 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200475
476 bts->force_two_phase = 1;
477
478 return CMD_SUCCESS;
479}
480
481DEFUN(cfg_pcu_no_two_phase,
482 cfg_pcu_no_two_phase_cmd,
483 "no two-phase-access",
484 NO_STR "Only use two phase access when requested my MS\n")
485{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200486 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200487
488 bts->force_two_phase = 0;
489
490 return CMD_SUCCESS;
491}
492
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200493DEFUN(cfg_pcu_alpha,
494 cfg_pcu_alpha_cmd,
495 "alpha <0-10>",
496 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
497 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
498 "Alpha in units of 0.1\n")
499{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200500 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200501
502 bts->alpha = atoi(argv[0]);
503
504 return CMD_SUCCESS;
505}
506
507DEFUN(cfg_pcu_gamma,
508 cfg_pcu_gamma_cmd,
509 "gamma <0-62>",
510 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
511 "Gamma in even unit of dBs\n")
512{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200513 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200514
515 bts->gamma = atoi(argv[0]) / 2;
516
517 return CMD_SUCCESS;
518}
519
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100520DEFUN(show_bts_stats,
521 show_bts_stats_cmd,
522 "show bts statistics",
523 SHOW_STR "BTS related functionality\nStatistics\n")
524{
525 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
526 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100527}
528
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100529#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
530DEFUN(cfg_pcu_dl_tbf_idle_time,
531 cfg_pcu_dl_tbf_idle_time_cmd,
532 "dl-tbf-idle-time <1-5000>",
533 IDLE_TIME_STR "idle time in msec")
534{
535 struct gprs_rlcmac_bts *bts = bts_main_data();
536
537 bts->dl_tbf_idle_msec = atoi(argv[0]);
538
539 return CMD_SUCCESS;
540}
541
542DEFUN(cfg_pcu_no_dl_tbf_idle_time,
543 cfg_pcu_no_dl_tbf_idle_time_cmd,
544 "no dl-tbf-idle-time",
545 NO_STR IDLE_TIME_STR)
546{
547 struct gprs_rlcmac_bts *bts = bts_main_data();
548
549 bts->dl_tbf_idle_msec = 0;
550
551 return CMD_SUCCESS;
552}
553
Jacob Erlbecka098c192015-05-28 16:11:19 +0200554#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
555DEFUN(cfg_pcu_ms_idle_time,
556 cfg_pcu_ms_idle_time_cmd,
557 "ms-idle-time <1-7200>",
558 MS_IDLE_TIME_STR "idle time in sec")
559{
560 struct gprs_rlcmac_bts *bts = bts_main_data();
561
562 bts->ms_idle_sec = atoi(argv[0]);
563
564 return CMD_SUCCESS;
565}
566
567DEFUN(cfg_pcu_no_ms_idle_time,
568 cfg_pcu_no_ms_idle_time_cmd,
569 "no ms-idle-time",
570 NO_STR MS_IDLE_TIME_STR)
571{
572 struct gprs_rlcmac_bts *bts = bts_main_data();
573
574 bts->ms_idle_sec = 0;
575
576 return CMD_SUCCESS;
577}
578
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200579#define CS_ERR_LIMITS_STR "set thresholds for error rate based CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200580DEFUN(cfg_pcu_cs_err_limits,
581 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200582 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200583 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
584{
585 struct gprs_rlcmac_bts *bts = bts_main_data();
586
587 uint8_t lower_limit = atoi(argv[0]);
588 uint8_t upper_limit = atoi(argv[1]);
589
590 if (lower_limit > upper_limit) {
591 vty_out(vty,
592 "The lower limit must be less than or equal to the "
593 "upper limit.%s", VTY_NEWLINE);
594 return CMD_WARNING;
595 }
596
597 bts->cs_adj_enabled = 1;
598 bts->cs_adj_upper_limit = upper_limit;
599 bts->cs_adj_lower_limit = lower_limit;
600
601 return CMD_SUCCESS;
602}
603
604DEFUN(cfg_pcu_no_cs_err_limits,
605 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200606 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200607 NO_STR CS_STR CS_ERR_LIMITS_STR)
608{
609 struct gprs_rlcmac_bts *bts = bts_main_data();
610
611 bts->cs_adj_enabled = 0;
612 bts->cs_adj_upper_limit = 100;
613 bts->cs_adj_lower_limit = 0;
614
615 return CMD_SUCCESS;
616}
617
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200618#define CS_DOWNGRADE_STR "set threshold for data size based CS downgrade\n"
619DEFUN(cfg_pcu_cs_downgrade_thrsh,
620 cfg_pcu_cs_downgrade_thrsh_cmd,
621 "cs downgrade-threshold <1-10000>",
622 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
623{
624 struct gprs_rlcmac_bts *bts = bts_main_data();
625
626 bts->cs_downgrade_threshold = atoi(argv[0]);
627
628 return CMD_SUCCESS;
629}
630
631DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
632 cfg_pcu_no_cs_downgrade_thrsh_cmd,
633 "no cs downgrade-threshold",
634 CS_STR CS_DOWNGRADE_STR)
635{
636 struct gprs_rlcmac_bts *bts = bts_main_data();
637
638 bts->cs_downgrade_threshold = 0;
639
640 return CMD_SUCCESS;
641}
642
643
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200644DEFUN(cfg_pcu_cs_lqual_ranges,
645 cfg_pcu_cs_lqual_ranges_cmd,
646 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
647 CS_STR "Set link quality ranges\n"
648 "Set quality range for CS-1 (high value only)\n"
649 "CS-1 high (dB)\n"
650 "Set quality range for CS-2\n"
651 "CS-2 low (dB)\n"
652 "CS-2 high (dB)\n"
653 "Set quality range for CS-3\n"
654 "CS-3 low (dB)\n"
655 "CS-3 high (dB)\n"
656 "Set quality range for CS-4 (low value only)\n"
657 "CS-4 low (dB)\n")
658{
659 struct gprs_rlcmac_bts *bts = bts_main_data();
660
661 uint8_t cs1_high = atoi(argv[0]);
662 uint8_t cs2_low = atoi(argv[1]);
663 uint8_t cs2_high = atoi(argv[2]);
664 uint8_t cs3_low = atoi(argv[3]);
665 uint8_t cs3_high = atoi(argv[4]);
666 uint8_t cs4_low = atoi(argv[5]);
667
668 bts->cs_lqual_ranges[0].high = cs1_high;
669 bts->cs_lqual_ranges[1].low = cs2_low;
670 bts->cs_lqual_ranges[1].high = cs2_high;
671 bts->cs_lqual_ranges[2].low = cs3_low;
672 bts->cs_lqual_ranges[2].high = cs3_high;
673 bts->cs_lqual_ranges[3].low = cs4_low;
674
675 return CMD_SUCCESS;
676}
677
678
Daniel Willmann772415f2014-01-15 17:06:51 +0100679DEFUN(show_tbf,
680 show_tbf_cmd,
681 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100682 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100683{
684 struct gprs_rlcmac_bts *bts = bts_main_data();
685 struct llist_head *tbf;
686
687 vty_out(vty, "UL TBFs%s", VTY_NEWLINE);
688 llist_for_each(tbf, &bts->ul_tbfs) {
689 tbf_print_vty_info(vty, tbf);
690 }
691
692 vty_out(vty, "%sDL TBFs%s", VTY_NEWLINE, VTY_NEWLINE);
693 llist_for_each(tbf, &bts->dl_tbfs) {
694 tbf_print_vty_info(vty, tbf);
695 }
696
697 return CMD_SUCCESS;
698}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100699
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200700DEFUN(show_ms_all,
701 show_ms_all_cmd,
702 "show ms all",
703 SHOW_STR "information about MSs\n" "All TBFs\n")
704{
705 struct gprs_rlcmac_bts *bts = bts_main_data();
706 return pcu_vty_show_ms_all(vty, bts);
707}
708
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200709DEFUN(show_ms_tlli,
710 show_ms_tlli_cmd,
711 "show ms tlli TLLI",
712 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
713{
714 struct gprs_rlcmac_bts *bts = bts_main_data();
715 char *endp = NULL;
716 unsigned long long tlli = strtoll(argv[0], &endp, 16);
717 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
718 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
719 return CMD_WARNING;
720 }
721 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
722}
723
724DEFUN(show_ms_imsi,
725 show_ms_imsi_cmd,
726 "show ms imsi IMSI",
727 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
728{
729 struct gprs_rlcmac_bts *bts = bts_main_data();
730 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
731}
732
Andreas Eversberg12942562012-07-12 14:31:57 +0200733static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +0100734 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
735 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +0200736 "License GNU GPL version 2 or later\r\n"
737 "This is free software: you are free to change and redistribute it.\r\n"
738 "There is NO WARRANTY, to the extent permitted by law.\r\n";
739
740struct vty_app_info pcu_vty_info = {
741 .name = "Osmo-PCU",
742 .version = PACKAGE_VERSION,
743 .copyright = pcu_copyright,
744 .go_parent_cb = pcu_vty_go_parent,
745 .is_config_node = pcu_vty_is_config_node,
746};
747
748int pcu_vty_init(const struct log_info *cat)
749{
750// install_element_ve(&show_pcu_cmd);
751
752 logging_vty_add_cmds(cat);
753
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200754 install_node(&pcu_node, config_write_pcu);
755 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200756 vty_install_default(PCU_NODE);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200757 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200758 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
759 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200760 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
761 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200762 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
763 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200764 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
765 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200766 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200767 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
768 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
769 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100770 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
771 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200772 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
773 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200774 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200775 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200776 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200777 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
778 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200779 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
780 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
781 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
782 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
783 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
784 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
785 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
786 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200787 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
788 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100789 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
790 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +0200791 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
792 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200793
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100794 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +0100795 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200796 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200797 install_element_ve(&show_ms_tlli_cmd);
798 install_element_ve(&show_ms_imsi_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100799
Andreas Eversberg12942562012-07-12 14:31:57 +0200800 return 0;
801}