blob: 68d2f556264150be5c8f81ff90a84d355df3941b [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>
Neels Hofmeyrd34646a2017-02-08 17:07:40 +01006#include <string.h>
Andreas Eversberg12942562012-07-12 14:31:57 +02007#include <osmocom/vty/logging.h>
Jacob Erlbeck42aba812015-11-10 15:32:00 +01008#include <osmocom/vty/stats.h>
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +02009#include <osmocom/vty/misc.h>
Andreas Eversberg8b761a32012-07-20 21:50:31 +020010#include <osmocom/core/linuxlist.h>
Holger Hans Peter Freythere8915b92014-07-02 14:57:47 +020011#include <osmocom/core/rate_ctr.h>
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +020012#include <osmocom/pcu/pcuif_proto.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020013#include "pcu_vty.h"
Andreas Eversberg8b761a32012-07-20 21:50:31 +020014#include "gprs_rlcmac.h"
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020015#include "bts.h"
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020016#include "tbf.h"
Andreas Eversberg12942562012-07-12 14:31:57 +020017
Jacob Erlbeck62e96a32015-06-04 09:42:14 +020018#include "pcu_vty_functions.h"
19
Harald Welte717cdf52017-07-21 21:56:23 +020020extern void *tall_pcu_ctx;
21
22static const struct value_string pcu_gsmtap_categ_names[] = {
23 { PCU_GSMTAP_C_DL_UNKNOWN, "dl-unknown" },
24 { PCU_GSMTAP_C_DL_DUMMY, "dl-dummy" },
25 { PCU_GSMTAP_C_DL_CTRL, "dl-ctrl" },
26 { PCU_GSMTAP_C_DL_DATA_GPRS, "dl-data-gprs" },
27 { PCU_GSMTAP_C_DL_DATA_EGPRS, "dl-data-egprs" },
Harald Weltebc219d52017-07-29 13:42:27 +020028 { PCU_GSMTAP_C_DL_PTCCH, "dl-ptcch" },
Harald Welte717cdf52017-07-21 21:56:23 +020029
30 { PCU_GSMTAP_C_UL_UNKNOWN, "ul-unknown" },
31 { PCU_GSMTAP_C_UL_DUMMY, "ul-dummy" },
32 { PCU_GSMTAP_C_UL_CTRL, "ul-ctrl" },
33 { PCU_GSMTAP_C_UL_DATA_GPRS, "ul-data-gprs" },
34 { PCU_GSMTAP_C_UL_DATA_EGPRS, "ul-data-egprs" },
35
36 { 0, NULL }
37};
38
39static const struct value_string pcu_gsmtap_categ_help[] = {
40 { PCU_GSMTAP_C_DL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
41 { PCU_GSMTAP_C_DL_DUMMY, "Downlink Dummy Blocks" },
42 { PCU_GSMTAP_C_DL_CTRL, "Downlink Control Blocks" },
43 { PCU_GSMTAP_C_DL_DATA_GPRS, "Downlink Data Blocks (GPRS)" },
44 { PCU_GSMTAP_C_DL_DATA_EGPRS, "Downlink Data Blocks (EGPRS)" },
Harald Weltebc219d52017-07-29 13:42:27 +020045 { PCU_GSMTAP_C_DL_PTCCH, "Downlink PTCCH Blocks" },
Harald Welte717cdf52017-07-21 21:56:23 +020046
47 { PCU_GSMTAP_C_UL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
48 { PCU_GSMTAP_C_UL_DUMMY, "Uplink Dummy Blocks" },
49 { PCU_GSMTAP_C_UL_CTRL, "Uplink Control Blocks" },
50 { PCU_GSMTAP_C_UL_DATA_GPRS, "Uplink Data Blocks (GPRS)" },
51 { PCU_GSMTAP_C_UL_DATA_EGPRS, "Uplink Data Blocks (EGPRS)" },
52
53 { 0, NULL }
54};
55
56
57DEFUN(cfg_pcu_gsmtap_categ, cfg_pcu_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
58{
59 struct gprs_rlcmac_bts *bts = bts_main_data();
60 int categ;
61
62 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
63 if (categ < 0)
64 return CMD_WARNING;
65
66 bts->gsmtap_categ_mask |= (1 << categ);
67
68 return CMD_SUCCESS;
69}
70
71DEFUN(cfg_pcu_no_gsmtap_categ, cfg_pcu_no_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
72{
73 struct gprs_rlcmac_bts *bts = bts_main_data();
74 int categ;
75
76 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
77 if (categ < 0)
78 return CMD_WARNING;
79
80 bts->gsmtap_categ_mask &= ~(1 << categ);
81
82 return CMD_SUCCESS;
83}
84
85
Jacob Erlbeckf76fede2015-08-17 13:42:46 +020086int pcu_vty_go_parent(struct vty *vty)
Andreas Eversberg12942562012-07-12 14:31:57 +020087{
88 switch (vty->node) {
89#if 0
90 case TRX_NODE:
Andreas Eversberg8b761a32012-07-20 21:50:31 +020091 vty->node = PCU_NODE;
Andreas Eversberg12942562012-07-12 14:31:57 +020092 {
93 struct gsm_bts_trx *trx = vty->index;
94 vty->index = trx->bts;
95 }
96 break;
97#endif
98 default:
99 vty->node = CONFIG_NODE;
100 }
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200101 return (enum node_type) vty->node;
Andreas Eversberg12942562012-07-12 14:31:57 +0200102}
103
104int pcu_vty_is_config_node(struct vty *vty, int node)
105{
106 switch (node) {
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200107 case PCU_NODE:
Andreas Eversberg12942562012-07-12 14:31:57 +0200108 return 1;
Andreas Eversberg12942562012-07-12 14:31:57 +0200109 default:
110 return 0;
111 }
112}
113
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200114static struct cmd_node pcu_node = {
115 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200116 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200117 1,
118};
119
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200120static int config_write_pcu(struct vty *vty)
121{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200122 struct gprs_rlcmac_bts *bts = bts_main_data();
Harald Welte717cdf52017-07-21 21:56:23 +0200123 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200124
125 vty_out(vty, "pcu%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200126 if (bts->egprs_enabled)
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100127 vty_out(vty, " egprs only%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200128
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200129 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
130 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200131 if (bts->fc_bvc_bucket_size)
132 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
133 bts->fc_bvc_bucket_size, VTY_NEWLINE);
134 if (bts->fc_bvc_leak_rate)
135 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
136 bts->fc_bvc_leak_rate, VTY_NEWLINE);
137 if (bts->fc_ms_bucket_size)
138 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
139 bts->fc_ms_bucket_size, VTY_NEWLINE);
140 if (bts->fc_ms_leak_rate)
141 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
142 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200143 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +0200144 if (bts->initial_cs_ul == bts->initial_cs_dl)
145 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
146 VTY_NEWLINE);
147 else
148 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
149 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200150 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200151 if (bts->max_cs_dl && bts->max_cs_ul) {
152 if (bts->max_cs_ul == bts->max_cs_dl)
153 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
154 VTY_NEWLINE);
155 else
156 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
157 bts->max_cs_ul, VTY_NEWLINE);
158 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200159 if (bts->cs_adj_enabled)
160 vty_out(vty, " cs threshold %d %d%s",
161 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
162 VTY_NEWLINE);
163 else
164 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
165
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200166 if (bts->cs_downgrade_threshold)
167 vty_out(vty, " cs downgrade-threshold %d%s",
168 bts->cs_downgrade_threshold, VTY_NEWLINE);
169 else
170 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
171
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200172 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
173 bts->cs_lqual_ranges[0].high,
174 bts->cs_lqual_ranges[1].low,
175 bts->cs_lqual_ranges[1].high,
176 bts->cs_lqual_ranges[2].low,
177 bts->cs_lqual_ranges[2].high,
178 bts->cs_lqual_ranges[3].low,
179 VTY_NEWLINE);
180
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100181 if (bts->initial_mcs_dl != 1 && bts->initial_mcs_ul != 1) {
182 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
183 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
184 VTY_NEWLINE);
185 else
186 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
187 bts->initial_mcs_ul, VTY_NEWLINE);
188 }
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100189 if (bts->max_mcs_dl && bts->max_mcs_ul) {
190 if (bts->max_mcs_ul == bts->max_mcs_dl)
191 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
192 VTY_NEWLINE);
193 else
194 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
195 bts->max_mcs_ul, VTY_NEWLINE);
196 }
197
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100198 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
199 VTY_NEWLINE);
200
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530201 if (bts->dl_arq_type)
202 vty_out(vty, " egprs dl arq-type arq2%s",
203 VTY_NEWLINE);
204
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200205 if (bts->force_llc_lifetime == 0xffff)
206 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
207 else if (bts->force_llc_lifetime)
208 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
209 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100210 if (bts->llc_discard_csec)
211 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
212 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200213 if (bts->llc_idle_ack_csec)
214 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
215 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200216 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
217 vty_out(vty, " queue codel%s", VTY_NEWLINE);
218 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
219 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
220 else
221 vty_out(vty, " queue codel interval %d%s",
222 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
223
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200224 if (bts->alloc_algorithm == alloc_algorithm_a)
225 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
226 if (bts->alloc_algorithm == alloc_algorithm_b)
227 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200228 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
229 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200230 if (bts->force_two_phase)
231 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200232 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
233 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100234 if (bts->dl_tbf_idle_msec)
235 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
236 VTY_NEWLINE);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200237 if (strcmp(bts->pcu_sock_path, PCU_SOCK_DEFAULT))
238 vty_out(vty, " pcu-socket %s%s", bts->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200239
Harald Welte717cdf52017-07-21 21:56:23 +0200240 for (i = 0; i < 32; i++) {
241 unsigned int cs = (1 << i);
242 if (bts->gsmtap_categ_mask & cs) {
243 vty_out(vty, " gsmtap-category %s%s",
244 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
245 }
246 }
247
Jacob Erlbeck62e96a32015-06-04 09:42:14 +0200248 return pcu_vty_config_write_pcu_ext(vty);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200249}
250
251/* per-BTS configuration */
252DEFUN(cfg_pcu,
253 cfg_pcu_cmd,
254 "pcu",
255 "BTS specific configure")
256{
257 vty->node = PCU_NODE;
258
259 return CMD_SUCCESS;
260}
261
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200262#define EGPRS_STR "EGPRS configuration\n"
263
264DEFUN(cfg_pcu_egprs,
265 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100266 "egprs only",
267 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200268{
269 struct gprs_rlcmac_bts *bts = bts_main_data();
270
271 bts->egprs_enabled = 1;
272
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200273 return CMD_SUCCESS;
274}
275
276DEFUN(cfg_pcu_no_egprs,
277 cfg_pcu_no_egprs_cmd,
278 "no egprs",
279 NO_STR EGPRS_STR)
280{
281 struct gprs_rlcmac_bts *bts = bts_main_data();
282
283 bts->egprs_enabled = 0;
284
285 return CMD_SUCCESS;
286}
287
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200288DEFUN(cfg_pcu_fc_interval,
289 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200290 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200291 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200292 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200293{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200294 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200295
296 bts->fc_interval = atoi(argv[0]);
297
298 return CMD_SUCCESS;
299}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200300#define FC_STR "BSSGP Flow Control configuration\n"
301#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
302#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
303
304DEFUN(cfg_pcu_fc_bvc_bucket_size,
305 cfg_pcu_fc_bvc_bucket_size_cmd,
306 "flow-control force-bvc-bucket-size <1-6553500>",
307 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
308{
309 struct gprs_rlcmac_bts *bts = bts_main_data();
310
311 bts->fc_bvc_bucket_size = atoi(argv[0]);
312
313 return CMD_SUCCESS;
314}
315
316DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
317 cfg_pcu_no_fc_bvc_bucket_size_cmd,
318 "no flow-control force-bvc-bucket-size",
319 NO_STR FC_STR FC_BMAX_STR("BVC"))
320{
321 struct gprs_rlcmac_bts *bts = bts_main_data();
322
323 bts->fc_bvc_bucket_size = 0;
324
325 return CMD_SUCCESS;
326}
327
328DEFUN(cfg_pcu_fc_bvc_leak_rate,
329 cfg_pcu_fc_bvc_leak_rate_cmd,
330 "flow-control force-bvc-leak-rate <1-6553500>",
331 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
332{
333 struct gprs_rlcmac_bts *bts = bts_main_data();
334
335 bts->fc_bvc_leak_rate = atoi(argv[0]);
336
337 return CMD_SUCCESS;
338}
339
340DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
341 cfg_pcu_no_fc_bvc_leak_rate_cmd,
342 "no flow-control force-bvc-leak-rate",
343 NO_STR FC_STR FC_LR_STR("BVC"))
344{
345 struct gprs_rlcmac_bts *bts = bts_main_data();
346
347 bts->fc_bvc_leak_rate = 0;
348
349 return CMD_SUCCESS;
350}
351
352DEFUN(cfg_pcu_fc_ms_bucket_size,
353 cfg_pcu_fc_ms_bucket_size_cmd,
354 "flow-control force-ms-bucket-size <1-6553500>",
355 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
356{
357 struct gprs_rlcmac_bts *bts = bts_main_data();
358
359 bts->fc_ms_bucket_size = atoi(argv[0]);
360
361 return CMD_SUCCESS;
362}
363
364DEFUN(cfg_pcu_no_fc_ms_bucket_size,
365 cfg_pcu_no_fc_ms_bucket_size_cmd,
366 "no flow-control force-ms-bucket-size",
367 NO_STR FC_STR FC_BMAX_STR("default MS"))
368{
369 struct gprs_rlcmac_bts *bts = bts_main_data();
370
371 bts->fc_ms_bucket_size = 0;
372
373 return CMD_SUCCESS;
374}
375
376DEFUN(cfg_pcu_fc_ms_leak_rate,
377 cfg_pcu_fc_ms_leak_rate_cmd,
378 "flow-control force-ms-leak-rate <1-6553500>",
379 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
380{
381 struct gprs_rlcmac_bts *bts = bts_main_data();
382
383 bts->fc_ms_leak_rate = atoi(argv[0]);
384
385 return CMD_SUCCESS;
386}
387
388DEFUN(cfg_pcu_no_fc_ms_leak_rate,
389 cfg_pcu_no_fc_ms_leak_rate_cmd,
390 "no flow-control force-ms-leak-rate",
391 NO_STR FC_STR FC_LR_STR("default MS"))
392{
393 struct gprs_rlcmac_bts *bts = bts_main_data();
394
395 bts->fc_ms_leak_rate = 0;
396
397 return CMD_SUCCESS;
398}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200399
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200400#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
401DEFUN(cfg_pcu_fc_bucket_time,
402 cfg_pcu_fc_bucket_time_cmd,
403 "flow-control bucket-time <1-65534>",
404 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
405{
406 struct gprs_rlcmac_bts *bts = bts_main_data();
407
408 bts->fc_bucket_time = atoi(argv[0]);
409
410 return CMD_SUCCESS;
411}
412
413DEFUN(cfg_pcu_no_fc_bucket_time,
414 cfg_pcu_no_fc_bucket_time_cmd,
415 "no flow-control bucket-time",
416 NO_STR FC_STR FC_BTIME_STR)
417{
418 struct gprs_rlcmac_bts *bts = bts_main_data();
419
420 bts->fc_bucket_time = 0;
421
422 return CMD_SUCCESS;
423}
424
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200425#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200426
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200427DEFUN(cfg_pcu_cs,
428 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200429 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200430 CS_STR
431 "Initial CS value to be used (overrides BTS config)\n"
432 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200433{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200434 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200435 uint8_t cs = atoi(argv[0]);
436
437 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200438 bts->initial_cs_dl = cs;
439 if (argc > 1)
440 bts->initial_cs_ul = atoi(argv[1]);
441 else
442 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200443
444 return CMD_SUCCESS;
445}
446
447DEFUN(cfg_pcu_no_cs,
448 cfg_pcu_no_cs_cmd,
449 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200450 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200451{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200452 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200453
454 bts->force_cs = 0;
455
456 return CMD_SUCCESS;
457}
458
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100459#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200460DEFUN(cfg_pcu_cs_max,
461 cfg_pcu_cs_max_cmd,
462 "cs max <1-4> [<1-4>]",
463 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100464 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200465 "Maximum CS value to be used\n"
466 "Use a different maximum CS value for the uplink")
467{
468 struct gprs_rlcmac_bts *bts = bts_main_data();
469 uint8_t cs = atoi(argv[0]);
470
471 bts->max_cs_dl = cs;
472 if (argc > 1)
473 bts->max_cs_ul = atoi(argv[1]);
474 else
475 bts->max_cs_ul = cs;
476
477 return CMD_SUCCESS;
478}
479
480DEFUN(cfg_pcu_no_cs_max,
481 cfg_pcu_no_cs_max_cmd,
482 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100483 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200484{
485 struct gprs_rlcmac_bts *bts = bts_main_data();
486
487 bts->max_cs_dl = 0;
488 bts->max_cs_ul = 0;
489
490 return CMD_SUCCESS;
491}
492
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100493#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
494
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100495DEFUN(cfg_pcu_mcs,
496 cfg_pcu_mcs_cmd,
497 "mcs <1-9> [<1-9>]",
498 MCS_STR
499 "Initial MCS value to be used (default 1)\n"
500 "Use a different initial MCS value for the uplink")
501{
502 struct gprs_rlcmac_bts *bts = bts_main_data();
503 uint8_t cs = atoi(argv[0]);
504
505 bts->initial_mcs_dl = cs;
506 if (argc > 1)
507 bts->initial_mcs_ul = atoi(argv[1]);
508 else
509 bts->initial_mcs_ul = cs;
510
511 return CMD_SUCCESS;
512}
513
514DEFUN(cfg_pcu_no_mcs,
515 cfg_pcu_no_mcs_cmd,
516 "no mcs",
517 NO_STR MCS_STR)
518{
519 struct gprs_rlcmac_bts *bts = bts_main_data();
520
521 bts->initial_mcs_dl = 1;
522 bts->initial_mcs_ul = 1;
523
524 return CMD_SUCCESS;
525}
526
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100527DEFUN(cfg_pcu_mcs_max,
528 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100529 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100530 MCS_STR
531 CS_MAX_STR
532 "Maximum MCS value to be used\n"
533 "Use a different maximum MCS value for the uplink")
534{
535 struct gprs_rlcmac_bts *bts = bts_main_data();
536 uint8_t mcs = atoi(argv[0]);
537
538 bts->max_mcs_dl = mcs;
539 if (argc > 1)
540 bts->max_mcs_ul = atoi(argv[1]);
541 else
542 bts->max_mcs_ul = mcs;
543
544 return CMD_SUCCESS;
545}
546
547DEFUN(cfg_pcu_no_mcs_max,
548 cfg_pcu_no_mcs_max_cmd,
549 "no mcs max",
550 NO_STR MCS_STR CS_MAX_STR)
551{
552 struct gprs_rlcmac_bts *bts = bts_main_data();
553
554 bts->max_mcs_dl = 0;
555 bts->max_mcs_ul = 0;
556
557 return CMD_SUCCESS;
558}
559
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530560#define DL_STR "downlink specific configuration\n"
561
562DEFUN(cfg_pcu_dl_arq_type,
563 cfg_pcu_dl_arq_cmd,
564 "egprs dl arq-type (spb|arq2)",
565 EGPRS_STR DL_STR "ARQ options\n"
566 "enable SPB(ARQ1) support\n"
567 "enable ARQ2 support")
568{
569 struct gprs_rlcmac_bts *bts = bts_main_data();
570
571 if (!strcmp(argv[0], "arq2"))
572 bts->dl_arq_type = 1;
573 else
574 bts->dl_arq_type = 0;
575
576 return CMD_SUCCESS;
577}
578
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100579DEFUN(cfg_pcu_window_size,
580 cfg_pcu_window_size_cmd,
581 "window-size <0-1024> [<0-256>]",
582 "Window size configuration (b + N_PDCH * f)\n"
583 "Base value (b)\n"
584 "Factor for number of PDCH (f)")
585{
586 struct gprs_rlcmac_bts *bts = bts_main_data();
587 uint16_t b = atoi(argv[0]);
588
589 bts->ws_base = b;
590 if (argc > 1) {
591 uint16_t f = atoi(argv[1]);
592 bts->ws_pdch = f;
593 }
594
595 return CMD_SUCCESS;
596}
597
598
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200599#define QUEUE_STR "Packet queue options\n"
600#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
601 "(overrides the value given by SGSN)\n"
602
603DEFUN(cfg_pcu_queue_lifetime,
604 cfg_pcu_queue_lifetime_cmd,
605 "queue lifetime <1-65534>",
606 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
607{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200608 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200609 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200610
611 bts->force_llc_lifetime = csec;
612
613 return CMD_SUCCESS;
614}
615
616DEFUN(cfg_pcu_queue_lifetime_inf,
617 cfg_pcu_queue_lifetime_inf_cmd,
618 "queue lifetime infinite",
619 QUEUE_STR LIFETIME_STR "Infinite lifetime")
620{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200621 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200622
623 bts->force_llc_lifetime = 0xffff;
624
625 return CMD_SUCCESS;
626}
627
628DEFUN(cfg_pcu_no_queue_lifetime,
629 cfg_pcu_no_queue_lifetime_cmd,
630 "no queue lifetime",
631 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
632 "by SGSN)\n")
633{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200634 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200635
636 bts->force_llc_lifetime = 0;
637
638 return CMD_SUCCESS;
639}
640
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100641#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
642 "(continue discarding until lifetime-hysteresis is reached)\n"
643
644DEFUN(cfg_pcu_queue_hysteresis,
645 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200646 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100647 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
648{
649 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200650 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100651
652 bts->llc_discard_csec = csec;
653
654 return CMD_SUCCESS;
655}
656
657DEFUN(cfg_pcu_no_queue_hysteresis,
658 cfg_pcu_no_queue_hysteresis_cmd,
659 "no queue hysteresis",
660 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
661{
662 struct gprs_rlcmac_bts *bts = bts_main_data();
663
664 bts->llc_discard_csec = 0;
665
666 return CMD_SUCCESS;
667}
668
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200669#define QUEUE_CODEL_STR "Set CoDel queue management\n"
670
671DEFUN(cfg_pcu_queue_codel,
672 cfg_pcu_queue_codel_cmd,
673 "queue codel",
674 QUEUE_STR QUEUE_CODEL_STR)
675{
676 struct gprs_rlcmac_bts *bts = bts_main_data();
677
678 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
679
680 return CMD_SUCCESS;
681}
682
683DEFUN(cfg_pcu_queue_codel_interval,
684 cfg_pcu_queue_codel_interval_cmd,
685 "queue codel interval <1-1000>",
686 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
687{
688 struct gprs_rlcmac_bts *bts = bts_main_data();
689 uint16_t csec = atoi(argv[0]);
690
691 bts->llc_codel_interval_msec = 10*csec;
692
693 return CMD_SUCCESS;
694}
695
696DEFUN(cfg_pcu_no_queue_codel,
697 cfg_pcu_no_queue_codel_cmd,
698 "no queue codel",
699 NO_STR QUEUE_STR QUEUE_CODEL_STR)
700{
701 struct gprs_rlcmac_bts *bts = bts_main_data();
702
703 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
704
705 return CMD_SUCCESS;
706}
707
708
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200709#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
710
711DEFUN(cfg_pcu_queue_idle_ack_delay,
712 cfg_pcu_queue_idle_ack_delay_cmd,
713 "queue idle-ack-delay <1-65535>",
714 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
715{
716 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200717 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200718
719 bts->llc_idle_ack_csec = csec;
720
721 return CMD_SUCCESS;
722}
723
724DEFUN(cfg_pcu_no_queue_idle_ack_delay,
725 cfg_pcu_no_queue_idle_ack_delay_cmd,
726 "no queue idle-ack-delay",
727 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
728{
729 struct gprs_rlcmac_bts *bts = bts_main_data();
730
731 bts->llc_idle_ack_csec = 0;
732
733 return CMD_SUCCESS;
734}
735
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100736
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200737DEFUN(cfg_pcu_alloc,
738 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200739 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200740 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200741 "PACCH\n"
742 "Single slot is assigned only\n"
743 "Multiple slots are assigned for semi-duplex operation\n"
744 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200745{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200746 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200747
748 switch (argv[0][0]) {
749 case 'a':
750 bts->alloc_algorithm = alloc_algorithm_a;
751 break;
752 case 'b':
753 bts->alloc_algorithm = alloc_algorithm_b;
754 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200755 default:
756 bts->alloc_algorithm = alloc_algorithm_dynamic;
757 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200758 }
759
760 return CMD_SUCCESS;
761}
762
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200763DEFUN(cfg_pcu_two_phase,
764 cfg_pcu_two_phase_cmd,
765 "two-phase-access",
766 "Force two phase access when MS requests single phase access\n")
767{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200768 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200769
770 bts->force_two_phase = 1;
771
772 return CMD_SUCCESS;
773}
774
775DEFUN(cfg_pcu_no_two_phase,
776 cfg_pcu_no_two_phase_cmd,
777 "no two-phase-access",
778 NO_STR "Only use two phase access when requested my MS\n")
779{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200780 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200781
782 bts->force_two_phase = 0;
783
784 return CMD_SUCCESS;
785}
786
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200787DEFUN(cfg_pcu_alpha,
788 cfg_pcu_alpha_cmd,
789 "alpha <0-10>",
790 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
791 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
792 "Alpha in units of 0.1\n")
793{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200794 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200795
796 bts->alpha = atoi(argv[0]);
797
798 return CMD_SUCCESS;
799}
800
801DEFUN(cfg_pcu_gamma,
802 cfg_pcu_gamma_cmd,
803 "gamma <0-62>",
804 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
805 "Gamma in even unit of dBs\n")
806{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200807 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200808
809 bts->gamma = atoi(argv[0]) / 2;
810
811 return CMD_SUCCESS;
812}
813
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100814DEFUN(show_bts_stats,
815 show_bts_stats_cmd,
816 "show bts statistics",
817 SHOW_STR "BTS related functionality\nStatistics\n")
818{
819 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
820 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100821}
822
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100823#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
824DEFUN(cfg_pcu_dl_tbf_idle_time,
825 cfg_pcu_dl_tbf_idle_time_cmd,
826 "dl-tbf-idle-time <1-5000>",
827 IDLE_TIME_STR "idle time in msec")
828{
829 struct gprs_rlcmac_bts *bts = bts_main_data();
830
831 bts->dl_tbf_idle_msec = atoi(argv[0]);
832
833 return CMD_SUCCESS;
834}
835
836DEFUN(cfg_pcu_no_dl_tbf_idle_time,
837 cfg_pcu_no_dl_tbf_idle_time_cmd,
838 "no dl-tbf-idle-time",
839 NO_STR IDLE_TIME_STR)
840{
841 struct gprs_rlcmac_bts *bts = bts_main_data();
842
843 bts->dl_tbf_idle_msec = 0;
844
845 return CMD_SUCCESS;
846}
847
Jacob Erlbecka098c192015-05-28 16:11:19 +0200848#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
849DEFUN(cfg_pcu_ms_idle_time,
850 cfg_pcu_ms_idle_time_cmd,
851 "ms-idle-time <1-7200>",
852 MS_IDLE_TIME_STR "idle time in sec")
853{
854 struct gprs_rlcmac_bts *bts = bts_main_data();
855
856 bts->ms_idle_sec = atoi(argv[0]);
857
858 return CMD_SUCCESS;
859}
860
861DEFUN(cfg_pcu_no_ms_idle_time,
862 cfg_pcu_no_ms_idle_time_cmd,
863 "no ms-idle-time",
864 NO_STR MS_IDLE_TIME_STR)
865{
866 struct gprs_rlcmac_bts *bts = bts_main_data();
867
868 bts->ms_idle_sec = 0;
869
870 return CMD_SUCCESS;
871}
872
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200873#define CS_ERR_LIMITS_STR "set thresholds for error rate based CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200874DEFUN(cfg_pcu_cs_err_limits,
875 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200876 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200877 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
878{
879 struct gprs_rlcmac_bts *bts = bts_main_data();
880
881 uint8_t lower_limit = atoi(argv[0]);
882 uint8_t upper_limit = atoi(argv[1]);
883
884 if (lower_limit > upper_limit) {
885 vty_out(vty,
886 "The lower limit must be less than or equal to the "
887 "upper limit.%s", VTY_NEWLINE);
888 return CMD_WARNING;
889 }
890
891 bts->cs_adj_enabled = 1;
892 bts->cs_adj_upper_limit = upper_limit;
893 bts->cs_adj_lower_limit = lower_limit;
894
895 return CMD_SUCCESS;
896}
897
898DEFUN(cfg_pcu_no_cs_err_limits,
899 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200900 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200901 NO_STR CS_STR CS_ERR_LIMITS_STR)
902{
903 struct gprs_rlcmac_bts *bts = bts_main_data();
904
905 bts->cs_adj_enabled = 0;
906 bts->cs_adj_upper_limit = 100;
907 bts->cs_adj_lower_limit = 0;
908
909 return CMD_SUCCESS;
910}
911
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200912#define CS_DOWNGRADE_STR "set threshold for data size based CS downgrade\n"
913DEFUN(cfg_pcu_cs_downgrade_thrsh,
914 cfg_pcu_cs_downgrade_thrsh_cmd,
915 "cs downgrade-threshold <1-10000>",
916 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
917{
918 struct gprs_rlcmac_bts *bts = bts_main_data();
919
920 bts->cs_downgrade_threshold = atoi(argv[0]);
921
922 return CMD_SUCCESS;
923}
924
925DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
926 cfg_pcu_no_cs_downgrade_thrsh_cmd,
927 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200928 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200929{
930 struct gprs_rlcmac_bts *bts = bts_main_data();
931
932 bts->cs_downgrade_threshold = 0;
933
934 return CMD_SUCCESS;
935}
936
937
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200938DEFUN(cfg_pcu_cs_lqual_ranges,
939 cfg_pcu_cs_lqual_ranges_cmd,
940 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
941 CS_STR "Set link quality ranges\n"
942 "Set quality range for CS-1 (high value only)\n"
943 "CS-1 high (dB)\n"
944 "Set quality range for CS-2\n"
945 "CS-2 low (dB)\n"
946 "CS-2 high (dB)\n"
947 "Set quality range for CS-3\n"
948 "CS-3 low (dB)\n"
949 "CS-3 high (dB)\n"
950 "Set quality range for CS-4 (low value only)\n"
951 "CS-4 low (dB)\n")
952{
953 struct gprs_rlcmac_bts *bts = bts_main_data();
954
955 uint8_t cs1_high = atoi(argv[0]);
956 uint8_t cs2_low = atoi(argv[1]);
957 uint8_t cs2_high = atoi(argv[2]);
958 uint8_t cs3_low = atoi(argv[3]);
959 uint8_t cs3_high = atoi(argv[4]);
960 uint8_t cs4_low = atoi(argv[5]);
961
962 bts->cs_lqual_ranges[0].high = cs1_high;
963 bts->cs_lqual_ranges[1].low = cs2_low;
964 bts->cs_lqual_ranges[1].high = cs2_high;
965 bts->cs_lqual_ranges[2].low = cs3_low;
966 bts->cs_lqual_ranges[2].high = cs3_high;
967 bts->cs_lqual_ranges[3].low = cs4_low;
968
969 return CMD_SUCCESS;
970}
971
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200972DEFUN(cfg_pcu_sock,
973 cfg_pcu_sock_cmd,
974 "pcu-socket PATH",
975 "Configure the osmo-bts PCU socket file/path name\n"
976 "Path of the socket to connect to\n")
977{
978 struct gprs_rlcmac_bts *bts = bts_main_data();
979
980 if (bts->pcu_sock_path) {
981 /* FIXME: close the interface? */
982 talloc_free(bts->pcu_sock_path);
983 }
984 bts->pcu_sock_path = talloc_strdup(tall_pcu_ctx, argv[0]);
985 /* FIXME: re-open the interface? */
986
987 return CMD_SUCCESS;
988}
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200989
Daniel Willmann772415f2014-01-15 17:06:51 +0100990DEFUN(show_tbf,
991 show_tbf_cmd,
992 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100993 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100994{
995 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbecked2dbf62015-12-28 19:15:40 +0100996 return pcu_vty_show_tbf_all(vty, bts);
Daniel Willmann772415f2014-01-15 17:06:51 +0100997}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100998
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200999DEFUN(show_ms_all,
1000 show_ms_all_cmd,
1001 "show ms all",
1002 SHOW_STR "information about MSs\n" "All TBFs\n")
1003{
1004 struct gprs_rlcmac_bts *bts = bts_main_data();
1005 return pcu_vty_show_ms_all(vty, bts);
1006}
1007
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001008DEFUN(show_ms_tlli,
1009 show_ms_tlli_cmd,
1010 "show ms tlli TLLI",
1011 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1012{
1013 struct gprs_rlcmac_bts *bts = bts_main_data();
1014 char *endp = NULL;
1015 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1016 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1017 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1018 return CMD_WARNING;
1019 }
1020 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
1021}
1022
1023DEFUN(show_ms_imsi,
1024 show_ms_imsi_cmd,
1025 "show ms imsi IMSI",
1026 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1027{
1028 struct gprs_rlcmac_bts *bts = bts_main_data();
1029 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1030}
1031
Andreas Eversberg12942562012-07-12 14:31:57 +02001032static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001033 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1034 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001035 "License GNU GPL version 2 or later\r\n"
1036 "This is free software: you are free to change and redistribute it.\r\n"
1037 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1038
1039struct vty_app_info pcu_vty_info = {
1040 .name = "Osmo-PCU",
1041 .version = PACKAGE_VERSION,
1042 .copyright = pcu_copyright,
1043 .go_parent_cb = pcu_vty_go_parent,
1044 .is_config_node = pcu_vty_is_config_node,
1045};
1046
1047int pcu_vty_init(const struct log_info *cat)
1048{
1049// install_element_ve(&show_pcu_cmd);
1050
Harald Welte717cdf52017-07-21 21:56:23 +02001051 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1052 "gsmtap-category (",
1053 "|",")", VTY_DO_LOWER);
1054 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1055 "GSMTAP Category\n",
1056 "\n", "", 0);
1057 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1058 "no gsmtap-category (",
1059 "|",")", VTY_DO_LOWER);
1060 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1061 NO_STR "GSMTAP Category\n",
1062 "\n", "", 0);
1063
Andreas Eversberg12942562012-07-12 14:31:57 +02001064 logging_vty_add_cmds(cat);
Jacob Erlbeck42aba812015-11-10 15:32:00 +01001065 osmo_stats_vty_add_cmds(cat);
Andreas Eversberg12942562012-07-12 14:31:57 +02001066
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001067 install_node(&pcu_node, config_write_pcu);
1068 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +02001069 vty_install_default(PCU_NODE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001070 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1071 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001072 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001073 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1074 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001075 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1076 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001077 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1078 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001079 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1080 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001081 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001082 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301083 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001084 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001085 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1086 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001087 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001088 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1089 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1090 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001091 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1092 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001093 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1094 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1095 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001096 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1097 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001098 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001099 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001100 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001101 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1102 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001103 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1104 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1105 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1106 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1107 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1108 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1109 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1110 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001111 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1112 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001113 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1114 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001115 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1116 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001117 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1118 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001119 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001120
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001121 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001122 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001123 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001124 install_element_ve(&show_ms_tlli_cmd);
1125 install_element_ve(&show_ms_imsi_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001126
Andreas Eversberg12942562012-07-12 14:31:57 +02001127 return 0;
1128}