blob: 355f54407e273be6c27e3b72fef1181563445b1a [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
Andreas Eversberg24131bf2012-07-21 11:09:58 +020093 if (bts->force_llc_lifetime == 0xffff)
94 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
95 else if (bts->force_llc_lifetime)
96 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
97 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +010098 if (bts->llc_discard_csec)
99 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
100 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200101 if (bts->llc_idle_ack_csec)
102 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
103 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200104 if (bts->alloc_algorithm == alloc_algorithm_a)
105 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
106 if (bts->alloc_algorithm == alloc_algorithm_b)
107 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200108 if (bts->force_two_phase)
109 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200110 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
111 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100112 if (bts->dl_tbf_idle_msec)
113 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
114 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200115
Jacob Erlbeck62e96a32015-06-04 09:42:14 +0200116 return pcu_vty_config_write_pcu_ext(vty);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200117}
118
119/* per-BTS configuration */
120DEFUN(cfg_pcu,
121 cfg_pcu_cmd,
122 "pcu",
123 "BTS specific configure")
124{
125 vty->node = PCU_NODE;
126
127 return CMD_SUCCESS;
128}
129
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200130DEFUN(cfg_pcu_fc_interval,
131 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200132 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200133 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200134 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200135{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200136 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200137
138 bts->fc_interval = atoi(argv[0]);
139
140 return CMD_SUCCESS;
141}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200142#define FC_STR "BSSGP Flow Control configuration\n"
143#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
144#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
145
146DEFUN(cfg_pcu_fc_bvc_bucket_size,
147 cfg_pcu_fc_bvc_bucket_size_cmd,
148 "flow-control force-bvc-bucket-size <1-6553500>",
149 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
150{
151 struct gprs_rlcmac_bts *bts = bts_main_data();
152
153 bts->fc_bvc_bucket_size = atoi(argv[0]);
154
155 return CMD_SUCCESS;
156}
157
158DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
159 cfg_pcu_no_fc_bvc_bucket_size_cmd,
160 "no flow-control force-bvc-bucket-size",
161 NO_STR FC_STR FC_BMAX_STR("BVC"))
162{
163 struct gprs_rlcmac_bts *bts = bts_main_data();
164
165 bts->fc_bvc_bucket_size = 0;
166
167 return CMD_SUCCESS;
168}
169
170DEFUN(cfg_pcu_fc_bvc_leak_rate,
171 cfg_pcu_fc_bvc_leak_rate_cmd,
172 "flow-control force-bvc-leak-rate <1-6553500>",
173 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
174{
175 struct gprs_rlcmac_bts *bts = bts_main_data();
176
177 bts->fc_bvc_leak_rate = atoi(argv[0]);
178
179 return CMD_SUCCESS;
180}
181
182DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
183 cfg_pcu_no_fc_bvc_leak_rate_cmd,
184 "no flow-control force-bvc-leak-rate",
185 NO_STR FC_STR FC_LR_STR("BVC"))
186{
187 struct gprs_rlcmac_bts *bts = bts_main_data();
188
189 bts->fc_bvc_leak_rate = 0;
190
191 return CMD_SUCCESS;
192}
193
194DEFUN(cfg_pcu_fc_ms_bucket_size,
195 cfg_pcu_fc_ms_bucket_size_cmd,
196 "flow-control force-ms-bucket-size <1-6553500>",
197 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
198{
199 struct gprs_rlcmac_bts *bts = bts_main_data();
200
201 bts->fc_ms_bucket_size = atoi(argv[0]);
202
203 return CMD_SUCCESS;
204}
205
206DEFUN(cfg_pcu_no_fc_ms_bucket_size,
207 cfg_pcu_no_fc_ms_bucket_size_cmd,
208 "no flow-control force-ms-bucket-size",
209 NO_STR FC_STR FC_BMAX_STR("default MS"))
210{
211 struct gprs_rlcmac_bts *bts = bts_main_data();
212
213 bts->fc_ms_bucket_size = 0;
214
215 return CMD_SUCCESS;
216}
217
218DEFUN(cfg_pcu_fc_ms_leak_rate,
219 cfg_pcu_fc_ms_leak_rate_cmd,
220 "flow-control force-ms-leak-rate <1-6553500>",
221 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
222{
223 struct gprs_rlcmac_bts *bts = bts_main_data();
224
225 bts->fc_ms_leak_rate = atoi(argv[0]);
226
227 return CMD_SUCCESS;
228}
229
230DEFUN(cfg_pcu_no_fc_ms_leak_rate,
231 cfg_pcu_no_fc_ms_leak_rate_cmd,
232 "no flow-control force-ms-leak-rate",
233 NO_STR FC_STR FC_LR_STR("default MS"))
234{
235 struct gprs_rlcmac_bts *bts = bts_main_data();
236
237 bts->fc_ms_leak_rate = 0;
238
239 return CMD_SUCCESS;
240}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200241
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200242#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
243DEFUN(cfg_pcu_fc_bucket_time,
244 cfg_pcu_fc_bucket_time_cmd,
245 "flow-control bucket-time <1-65534>",
246 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
247{
248 struct gprs_rlcmac_bts *bts = bts_main_data();
249
250 bts->fc_bucket_time = atoi(argv[0]);
251
252 return CMD_SUCCESS;
253}
254
255DEFUN(cfg_pcu_no_fc_bucket_time,
256 cfg_pcu_no_fc_bucket_time_cmd,
257 "no flow-control bucket-time",
258 NO_STR FC_STR FC_BTIME_STR)
259{
260 struct gprs_rlcmac_bts *bts = bts_main_data();
261
262 bts->fc_bucket_time = 0;
263
264 return CMD_SUCCESS;
265}
266
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200267#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200268
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200269DEFUN(cfg_pcu_cs,
270 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200271 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200272 CS_STR
273 "Initial CS value to be used (overrides BTS config)\n"
274 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200275{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200276 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200277 uint8_t cs = atoi(argv[0]);
278
279 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200280 bts->initial_cs_dl = cs;
281 if (argc > 1)
282 bts->initial_cs_ul = atoi(argv[1]);
283 else
284 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200285
286 return CMD_SUCCESS;
287}
288
289DEFUN(cfg_pcu_no_cs,
290 cfg_pcu_no_cs_cmd,
291 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200292 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200293{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200294 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200295
296 bts->force_cs = 0;
297
298 return CMD_SUCCESS;
299}
300
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200301DEFUN(cfg_pcu_cs_max,
302 cfg_pcu_cs_max_cmd,
303 "cs max <1-4> [<1-4>]",
304 CS_STR
305 "Set maximum values for adaptive CS selection (overrides BTS config)\n"
306 "Maximum CS value to be used\n"
307 "Use a different maximum CS value for the uplink")
308{
309 struct gprs_rlcmac_bts *bts = bts_main_data();
310 uint8_t cs = atoi(argv[0]);
311
312 bts->max_cs_dl = cs;
313 if (argc > 1)
314 bts->max_cs_ul = atoi(argv[1]);
315 else
316 bts->max_cs_ul = cs;
317
318 return CMD_SUCCESS;
319}
320
321DEFUN(cfg_pcu_no_cs_max,
322 cfg_pcu_no_cs_max_cmd,
323 "no cs max",
324 NO_STR CS_STR
325 "Set maximum values for adaptive CS selection (overrides BTS config)\n")
326{
327 struct gprs_rlcmac_bts *bts = bts_main_data();
328
329 bts->max_cs_dl = 0;
330 bts->max_cs_ul = 0;
331
332 return CMD_SUCCESS;
333}
334
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200335#define QUEUE_STR "Packet queue options\n"
336#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
337 "(overrides the value given by SGSN)\n"
338
339DEFUN(cfg_pcu_queue_lifetime,
340 cfg_pcu_queue_lifetime_cmd,
341 "queue lifetime <1-65534>",
342 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
343{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200344 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200345 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200346
347 bts->force_llc_lifetime = csec;
348
349 return CMD_SUCCESS;
350}
351
352DEFUN(cfg_pcu_queue_lifetime_inf,
353 cfg_pcu_queue_lifetime_inf_cmd,
354 "queue lifetime infinite",
355 QUEUE_STR LIFETIME_STR "Infinite lifetime")
356{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200357 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200358
359 bts->force_llc_lifetime = 0xffff;
360
361 return CMD_SUCCESS;
362}
363
364DEFUN(cfg_pcu_no_queue_lifetime,
365 cfg_pcu_no_queue_lifetime_cmd,
366 "no queue lifetime",
367 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
368 "by SGSN)\n")
369{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200370 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200371
372 bts->force_llc_lifetime = 0;
373
374 return CMD_SUCCESS;
375}
376
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100377#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
378 "(continue discarding until lifetime-hysteresis is reached)\n"
379
380DEFUN(cfg_pcu_queue_hysteresis,
381 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200382 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100383 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
384{
385 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200386 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100387
388 bts->llc_discard_csec = csec;
389
390 return CMD_SUCCESS;
391}
392
393DEFUN(cfg_pcu_no_queue_hysteresis,
394 cfg_pcu_no_queue_hysteresis_cmd,
395 "no queue hysteresis",
396 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
397{
398 struct gprs_rlcmac_bts *bts = bts_main_data();
399
400 bts->llc_discard_csec = 0;
401
402 return CMD_SUCCESS;
403}
404
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200405#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
406
407DEFUN(cfg_pcu_queue_idle_ack_delay,
408 cfg_pcu_queue_idle_ack_delay_cmd,
409 "queue idle-ack-delay <1-65535>",
410 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
411{
412 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200413 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200414
415 bts->llc_idle_ack_csec = csec;
416
417 return CMD_SUCCESS;
418}
419
420DEFUN(cfg_pcu_no_queue_idle_ack_delay,
421 cfg_pcu_no_queue_idle_ack_delay_cmd,
422 "no queue idle-ack-delay",
423 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
424{
425 struct gprs_rlcmac_bts *bts = bts_main_data();
426
427 bts->llc_idle_ack_csec = 0;
428
429 return CMD_SUCCESS;
430}
431
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100432
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200433DEFUN(cfg_pcu_alloc,
434 cfg_pcu_alloc_cmd,
435 "alloc-algorithm (a|b)",
436 "Select slot allocation algorithm to use when assigning timeslots on "
437 "PACCH\nSingle slot is assigned only\nMultiple slots are assigned for "
438 "semi-duplex operation")
439{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200440 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200441
442 switch (argv[0][0]) {
443 case 'a':
444 bts->alloc_algorithm = alloc_algorithm_a;
445 break;
446 case 'b':
447 bts->alloc_algorithm = alloc_algorithm_b;
448 break;
449 }
450
451 return CMD_SUCCESS;
452}
453
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200454DEFUN(cfg_pcu_two_phase,
455 cfg_pcu_two_phase_cmd,
456 "two-phase-access",
457 "Force two phase access when MS requests single phase access\n")
458{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200459 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200460
461 bts->force_two_phase = 1;
462
463 return CMD_SUCCESS;
464}
465
466DEFUN(cfg_pcu_no_two_phase,
467 cfg_pcu_no_two_phase_cmd,
468 "no two-phase-access",
469 NO_STR "Only use two phase access when requested my MS\n")
470{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200471 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200472
473 bts->force_two_phase = 0;
474
475 return CMD_SUCCESS;
476}
477
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200478DEFUN(cfg_pcu_alpha,
479 cfg_pcu_alpha_cmd,
480 "alpha <0-10>",
481 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
482 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
483 "Alpha in units of 0.1\n")
484{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200485 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200486
487 bts->alpha = atoi(argv[0]);
488
489 return CMD_SUCCESS;
490}
491
492DEFUN(cfg_pcu_gamma,
493 cfg_pcu_gamma_cmd,
494 "gamma <0-62>",
495 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
496 "Gamma in even unit of dBs\n")
497{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200498 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200499
500 bts->gamma = atoi(argv[0]) / 2;
501
502 return CMD_SUCCESS;
503}
504
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100505DEFUN(show_bts_stats,
506 show_bts_stats_cmd,
507 "show bts statistics",
508 SHOW_STR "BTS related functionality\nStatistics\n")
509{
510 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
511 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100512}
513
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100514#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
515DEFUN(cfg_pcu_dl_tbf_idle_time,
516 cfg_pcu_dl_tbf_idle_time_cmd,
517 "dl-tbf-idle-time <1-5000>",
518 IDLE_TIME_STR "idle time in msec")
519{
520 struct gprs_rlcmac_bts *bts = bts_main_data();
521
522 bts->dl_tbf_idle_msec = atoi(argv[0]);
523
524 return CMD_SUCCESS;
525}
526
527DEFUN(cfg_pcu_no_dl_tbf_idle_time,
528 cfg_pcu_no_dl_tbf_idle_time_cmd,
529 "no dl-tbf-idle-time",
530 NO_STR IDLE_TIME_STR)
531{
532 struct gprs_rlcmac_bts *bts = bts_main_data();
533
534 bts->dl_tbf_idle_msec = 0;
535
536 return CMD_SUCCESS;
537}
538
Jacob Erlbecka098c192015-05-28 16:11:19 +0200539#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
540DEFUN(cfg_pcu_ms_idle_time,
541 cfg_pcu_ms_idle_time_cmd,
542 "ms-idle-time <1-7200>",
543 MS_IDLE_TIME_STR "idle time in sec")
544{
545 struct gprs_rlcmac_bts *bts = bts_main_data();
546
547 bts->ms_idle_sec = atoi(argv[0]);
548
549 return CMD_SUCCESS;
550}
551
552DEFUN(cfg_pcu_no_ms_idle_time,
553 cfg_pcu_no_ms_idle_time_cmd,
554 "no ms-idle-time",
555 NO_STR MS_IDLE_TIME_STR)
556{
557 struct gprs_rlcmac_bts *bts = bts_main_data();
558
559 bts->ms_idle_sec = 0;
560
561 return CMD_SUCCESS;
562}
563
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200564#define CS_ERR_LIMITS_STR "set thresholds for error rate based CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200565DEFUN(cfg_pcu_cs_err_limits,
566 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200567 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200568 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
569{
570 struct gprs_rlcmac_bts *bts = bts_main_data();
571
572 uint8_t lower_limit = atoi(argv[0]);
573 uint8_t upper_limit = atoi(argv[1]);
574
575 if (lower_limit > upper_limit) {
576 vty_out(vty,
577 "The lower limit must be less than or equal to the "
578 "upper limit.%s", VTY_NEWLINE);
579 return CMD_WARNING;
580 }
581
582 bts->cs_adj_enabled = 1;
583 bts->cs_adj_upper_limit = upper_limit;
584 bts->cs_adj_lower_limit = lower_limit;
585
586 return CMD_SUCCESS;
587}
588
589DEFUN(cfg_pcu_no_cs_err_limits,
590 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200591 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200592 NO_STR CS_STR CS_ERR_LIMITS_STR)
593{
594 struct gprs_rlcmac_bts *bts = bts_main_data();
595
596 bts->cs_adj_enabled = 0;
597 bts->cs_adj_upper_limit = 100;
598 bts->cs_adj_lower_limit = 0;
599
600 return CMD_SUCCESS;
601}
602
Daniel Willmann772415f2014-01-15 17:06:51 +0100603DEFUN(show_tbf,
604 show_tbf_cmd,
605 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100606 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100607{
608 struct gprs_rlcmac_bts *bts = bts_main_data();
609 struct llist_head *tbf;
610
611 vty_out(vty, "UL TBFs%s", VTY_NEWLINE);
612 llist_for_each(tbf, &bts->ul_tbfs) {
613 tbf_print_vty_info(vty, tbf);
614 }
615
616 vty_out(vty, "%sDL TBFs%s", VTY_NEWLINE, VTY_NEWLINE);
617 llist_for_each(tbf, &bts->dl_tbfs) {
618 tbf_print_vty_info(vty, tbf);
619 }
620
621 return CMD_SUCCESS;
622}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100623
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200624DEFUN(show_ms_all,
625 show_ms_all_cmd,
626 "show ms all",
627 SHOW_STR "information about MSs\n" "All TBFs\n")
628{
629 struct gprs_rlcmac_bts *bts = bts_main_data();
630 return pcu_vty_show_ms_all(vty, bts);
631}
632
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200633DEFUN(show_ms_tlli,
634 show_ms_tlli_cmd,
635 "show ms tlli TLLI",
636 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
637{
638 struct gprs_rlcmac_bts *bts = bts_main_data();
639 char *endp = NULL;
640 unsigned long long tlli = strtoll(argv[0], &endp, 16);
641 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
642 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
643 return CMD_WARNING;
644 }
645 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
646}
647
648DEFUN(show_ms_imsi,
649 show_ms_imsi_cmd,
650 "show ms imsi IMSI",
651 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
652{
653 struct gprs_rlcmac_bts *bts = bts_main_data();
654 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
655}
656
Andreas Eversberg12942562012-07-12 14:31:57 +0200657static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +0100658 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
659 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +0200660 "License GNU GPL version 2 or later\r\n"
661 "This is free software: you are free to change and redistribute it.\r\n"
662 "There is NO WARRANTY, to the extent permitted by law.\r\n";
663
664struct vty_app_info pcu_vty_info = {
665 .name = "Osmo-PCU",
666 .version = PACKAGE_VERSION,
667 .copyright = pcu_copyright,
668 .go_parent_cb = pcu_vty_go_parent,
669 .is_config_node = pcu_vty_is_config_node,
670};
671
672int pcu_vty_init(const struct log_info *cat)
673{
674// install_element_ve(&show_pcu_cmd);
675
676 logging_vty_add_cmds(cat);
677
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200678 install_node(&pcu_node, config_write_pcu);
679 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200680 vty_install_default(PCU_NODE);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200681 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200682 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
683 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200684 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
685 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200686 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
687 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200688 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
689 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
690 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100691 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
692 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200693 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
694 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200695 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200696 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200697 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200698 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
699 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200700 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
701 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
702 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
703 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
704 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
705 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
706 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
707 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200708 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
709 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100710 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
711 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +0200712 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
713 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200714
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100715 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +0100716 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200717 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200718 install_element_ve(&show_ms_tlli_cmd);
719 install_element_ve(&show_ms_imsi_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100720
Andreas Eversberg12942562012-07-12 14:31:57 +0200721 return 0;
722}