blob: cd22e38cd0fe211ce32a97716bc4709394712ffa [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>
Andreas Eversberg12942562012-07-12 14:31:57 +020012#include "pcu_vty.h"
Andreas Eversberg8b761a32012-07-20 21:50:31 +020013#include "gprs_rlcmac.h"
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020014#include "bts.h"
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020015#include "tbf.h"
Andreas Eversberg12942562012-07-12 14:31:57 +020016
Jacob Erlbeck62e96a32015-06-04 09:42:14 +020017#include "pcu_vty_functions.h"
18
Harald Welte717cdf52017-07-21 21:56:23 +020019extern void *tall_pcu_ctx;
20
21static const struct value_string pcu_gsmtap_categ_names[] = {
22 { PCU_GSMTAP_C_DL_UNKNOWN, "dl-unknown" },
23 { PCU_GSMTAP_C_DL_DUMMY, "dl-dummy" },
24 { PCU_GSMTAP_C_DL_CTRL, "dl-ctrl" },
25 { PCU_GSMTAP_C_DL_DATA_GPRS, "dl-data-gprs" },
26 { PCU_GSMTAP_C_DL_DATA_EGPRS, "dl-data-egprs" },
Harald Weltebc219d52017-07-29 13:42:27 +020027 { PCU_GSMTAP_C_DL_PTCCH, "dl-ptcch" },
Harald Welte717cdf52017-07-21 21:56:23 +020028
29 { PCU_GSMTAP_C_UL_UNKNOWN, "ul-unknown" },
30 { PCU_GSMTAP_C_UL_DUMMY, "ul-dummy" },
31 { PCU_GSMTAP_C_UL_CTRL, "ul-ctrl" },
32 { PCU_GSMTAP_C_UL_DATA_GPRS, "ul-data-gprs" },
33 { PCU_GSMTAP_C_UL_DATA_EGPRS, "ul-data-egprs" },
34
35 { 0, NULL }
36};
37
38static const struct value_string pcu_gsmtap_categ_help[] = {
39 { PCU_GSMTAP_C_DL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
40 { PCU_GSMTAP_C_DL_DUMMY, "Downlink Dummy Blocks" },
41 { PCU_GSMTAP_C_DL_CTRL, "Downlink Control Blocks" },
42 { PCU_GSMTAP_C_DL_DATA_GPRS, "Downlink Data Blocks (GPRS)" },
43 { PCU_GSMTAP_C_DL_DATA_EGPRS, "Downlink Data Blocks (EGPRS)" },
Harald Weltebc219d52017-07-29 13:42:27 +020044 { PCU_GSMTAP_C_DL_PTCCH, "Downlink PTCCH Blocks" },
Harald Welte717cdf52017-07-21 21:56:23 +020045
46 { PCU_GSMTAP_C_UL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
47 { PCU_GSMTAP_C_UL_DUMMY, "Uplink Dummy Blocks" },
48 { PCU_GSMTAP_C_UL_CTRL, "Uplink Control Blocks" },
49 { PCU_GSMTAP_C_UL_DATA_GPRS, "Uplink Data Blocks (GPRS)" },
50 { PCU_GSMTAP_C_UL_DATA_EGPRS, "Uplink Data Blocks (EGPRS)" },
51
52 { 0, NULL }
53};
54
55
56DEFUN(cfg_pcu_gsmtap_categ, cfg_pcu_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
57{
58 struct gprs_rlcmac_bts *bts = bts_main_data();
59 int categ;
60
61 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
62 if (categ < 0)
63 return CMD_WARNING;
64
65 bts->gsmtap_categ_mask |= (1 << categ);
66
67 return CMD_SUCCESS;
68}
69
70DEFUN(cfg_pcu_no_gsmtap_categ, cfg_pcu_no_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
71{
72 struct gprs_rlcmac_bts *bts = bts_main_data();
73 int categ;
74
75 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
76 if (categ < 0)
77 return CMD_WARNING;
78
79 bts->gsmtap_categ_mask &= ~(1 << categ);
80
81 return CMD_SUCCESS;
82}
83
84
Jacob Erlbeckf76fede2015-08-17 13:42:46 +020085int pcu_vty_go_parent(struct vty *vty)
Andreas Eversberg12942562012-07-12 14:31:57 +020086{
87 switch (vty->node) {
88#if 0
89 case TRX_NODE:
Andreas Eversberg8b761a32012-07-20 21:50:31 +020090 vty->node = PCU_NODE;
Andreas Eversberg12942562012-07-12 14:31:57 +020091 {
92 struct gsm_bts_trx *trx = vty->index;
93 vty->index = trx->bts;
94 }
95 break;
96#endif
97 default:
98 vty->node = CONFIG_NODE;
99 }
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200100 return (enum node_type) vty->node;
Andreas Eversberg12942562012-07-12 14:31:57 +0200101}
102
103int pcu_vty_is_config_node(struct vty *vty, int node)
104{
105 switch (node) {
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200106 case PCU_NODE:
Andreas Eversberg12942562012-07-12 14:31:57 +0200107 return 1;
Andreas Eversberg12942562012-07-12 14:31:57 +0200108 default:
109 return 0;
110 }
111}
112
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200113static struct cmd_node pcu_node = {
114 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200115 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200116 1,
117};
118
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200119static int config_write_pcu(struct vty *vty)
120{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200121 struct gprs_rlcmac_bts *bts = bts_main_data();
Harald Welte717cdf52017-07-21 21:56:23 +0200122 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200123
124 vty_out(vty, "pcu%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200125 if (bts->egprs_enabled)
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100126 vty_out(vty, " egprs only%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200127
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200128 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
129 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200130 if (bts->fc_bvc_bucket_size)
131 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
132 bts->fc_bvc_bucket_size, VTY_NEWLINE);
133 if (bts->fc_bvc_leak_rate)
134 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
135 bts->fc_bvc_leak_rate, VTY_NEWLINE);
136 if (bts->fc_ms_bucket_size)
137 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
138 bts->fc_ms_bucket_size, VTY_NEWLINE);
139 if (bts->fc_ms_leak_rate)
140 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
141 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200142 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +0200143 if (bts->initial_cs_ul == bts->initial_cs_dl)
144 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
145 VTY_NEWLINE);
146 else
147 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
148 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200149 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200150 if (bts->max_cs_dl && bts->max_cs_ul) {
151 if (bts->max_cs_ul == bts->max_cs_dl)
152 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
153 VTY_NEWLINE);
154 else
155 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
156 bts->max_cs_ul, VTY_NEWLINE);
157 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200158 if (bts->cs_adj_enabled)
159 vty_out(vty, " cs threshold %d %d%s",
160 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
161 VTY_NEWLINE);
162 else
163 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
164
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200165 if (bts->cs_downgrade_threshold)
166 vty_out(vty, " cs downgrade-threshold %d%s",
167 bts->cs_downgrade_threshold, VTY_NEWLINE);
168 else
169 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
170
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200171 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
172 bts->cs_lqual_ranges[0].high,
173 bts->cs_lqual_ranges[1].low,
174 bts->cs_lqual_ranges[1].high,
175 bts->cs_lqual_ranges[2].low,
176 bts->cs_lqual_ranges[2].high,
177 bts->cs_lqual_ranges[3].low,
178 VTY_NEWLINE);
179
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100180 if (bts->initial_mcs_dl != 1 && bts->initial_mcs_ul != 1) {
181 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
182 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
183 VTY_NEWLINE);
184 else
185 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
186 bts->initial_mcs_ul, VTY_NEWLINE);
187 }
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100188 if (bts->max_mcs_dl && bts->max_mcs_ul) {
189 if (bts->max_mcs_ul == bts->max_mcs_dl)
190 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
191 VTY_NEWLINE);
192 else
193 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
194 bts->max_mcs_ul, VTY_NEWLINE);
195 }
196
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100197 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
198 VTY_NEWLINE);
199
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530200 if (bts->dl_arq_type)
201 vty_out(vty, " egprs dl arq-type arq2%s",
202 VTY_NEWLINE);
203
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200204 if (bts->force_llc_lifetime == 0xffff)
205 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
206 else if (bts->force_llc_lifetime)
207 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
208 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100209 if (bts->llc_discard_csec)
210 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
211 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200212 if (bts->llc_idle_ack_csec)
213 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
214 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200215 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
216 vty_out(vty, " queue codel%s", VTY_NEWLINE);
217 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
218 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
219 else
220 vty_out(vty, " queue codel interval %d%s",
221 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
222
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200223 if (bts->alloc_algorithm == alloc_algorithm_a)
224 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
225 if (bts->alloc_algorithm == alloc_algorithm_b)
226 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200227 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
228 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200229 if (bts->force_two_phase)
230 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200231 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
232 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100233 if (bts->dl_tbf_idle_msec)
234 vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec,
235 VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200236
Harald Welte717cdf52017-07-21 21:56:23 +0200237 for (i = 0; i < 32; i++) {
238 unsigned int cs = (1 << i);
239 if (bts->gsmtap_categ_mask & cs) {
240 vty_out(vty, " gsmtap-category %s%s",
241 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
242 }
243 }
244
Jacob Erlbeck62e96a32015-06-04 09:42:14 +0200245 return pcu_vty_config_write_pcu_ext(vty);
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200246}
247
248/* per-BTS configuration */
249DEFUN(cfg_pcu,
250 cfg_pcu_cmd,
251 "pcu",
252 "BTS specific configure")
253{
254 vty->node = PCU_NODE;
255
256 return CMD_SUCCESS;
257}
258
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200259#define EGPRS_STR "EGPRS configuration\n"
260
261DEFUN(cfg_pcu_egprs,
262 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100263 "egprs only",
264 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200265{
266 struct gprs_rlcmac_bts *bts = bts_main_data();
267
268 bts->egprs_enabled = 1;
269
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200270 return CMD_SUCCESS;
271}
272
273DEFUN(cfg_pcu_no_egprs,
274 cfg_pcu_no_egprs_cmd,
275 "no egprs",
276 NO_STR EGPRS_STR)
277{
278 struct gprs_rlcmac_bts *bts = bts_main_data();
279
280 bts->egprs_enabled = 0;
281
282 return CMD_SUCCESS;
283}
284
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200285DEFUN(cfg_pcu_fc_interval,
286 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200287 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200288 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200289 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200290{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200291 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200292
293 bts->fc_interval = atoi(argv[0]);
294
295 return CMD_SUCCESS;
296}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200297#define FC_STR "BSSGP Flow Control configuration\n"
298#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
299#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
300
301DEFUN(cfg_pcu_fc_bvc_bucket_size,
302 cfg_pcu_fc_bvc_bucket_size_cmd,
303 "flow-control force-bvc-bucket-size <1-6553500>",
304 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
305{
306 struct gprs_rlcmac_bts *bts = bts_main_data();
307
308 bts->fc_bvc_bucket_size = atoi(argv[0]);
309
310 return CMD_SUCCESS;
311}
312
313DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
314 cfg_pcu_no_fc_bvc_bucket_size_cmd,
315 "no flow-control force-bvc-bucket-size",
316 NO_STR FC_STR FC_BMAX_STR("BVC"))
317{
318 struct gprs_rlcmac_bts *bts = bts_main_data();
319
320 bts->fc_bvc_bucket_size = 0;
321
322 return CMD_SUCCESS;
323}
324
325DEFUN(cfg_pcu_fc_bvc_leak_rate,
326 cfg_pcu_fc_bvc_leak_rate_cmd,
327 "flow-control force-bvc-leak-rate <1-6553500>",
328 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
329{
330 struct gprs_rlcmac_bts *bts = bts_main_data();
331
332 bts->fc_bvc_leak_rate = atoi(argv[0]);
333
334 return CMD_SUCCESS;
335}
336
337DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
338 cfg_pcu_no_fc_bvc_leak_rate_cmd,
339 "no flow-control force-bvc-leak-rate",
340 NO_STR FC_STR FC_LR_STR("BVC"))
341{
342 struct gprs_rlcmac_bts *bts = bts_main_data();
343
344 bts->fc_bvc_leak_rate = 0;
345
346 return CMD_SUCCESS;
347}
348
349DEFUN(cfg_pcu_fc_ms_bucket_size,
350 cfg_pcu_fc_ms_bucket_size_cmd,
351 "flow-control force-ms-bucket-size <1-6553500>",
352 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
353{
354 struct gprs_rlcmac_bts *bts = bts_main_data();
355
356 bts->fc_ms_bucket_size = atoi(argv[0]);
357
358 return CMD_SUCCESS;
359}
360
361DEFUN(cfg_pcu_no_fc_ms_bucket_size,
362 cfg_pcu_no_fc_ms_bucket_size_cmd,
363 "no flow-control force-ms-bucket-size",
364 NO_STR FC_STR FC_BMAX_STR("default MS"))
365{
366 struct gprs_rlcmac_bts *bts = bts_main_data();
367
368 bts->fc_ms_bucket_size = 0;
369
370 return CMD_SUCCESS;
371}
372
373DEFUN(cfg_pcu_fc_ms_leak_rate,
374 cfg_pcu_fc_ms_leak_rate_cmd,
375 "flow-control force-ms-leak-rate <1-6553500>",
376 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
377{
378 struct gprs_rlcmac_bts *bts = bts_main_data();
379
380 bts->fc_ms_leak_rate = atoi(argv[0]);
381
382 return CMD_SUCCESS;
383}
384
385DEFUN(cfg_pcu_no_fc_ms_leak_rate,
386 cfg_pcu_no_fc_ms_leak_rate_cmd,
387 "no flow-control force-ms-leak-rate",
388 NO_STR FC_STR FC_LR_STR("default MS"))
389{
390 struct gprs_rlcmac_bts *bts = bts_main_data();
391
392 bts->fc_ms_leak_rate = 0;
393
394 return CMD_SUCCESS;
395}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200396
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200397#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
398DEFUN(cfg_pcu_fc_bucket_time,
399 cfg_pcu_fc_bucket_time_cmd,
400 "flow-control bucket-time <1-65534>",
401 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
402{
403 struct gprs_rlcmac_bts *bts = bts_main_data();
404
405 bts->fc_bucket_time = atoi(argv[0]);
406
407 return CMD_SUCCESS;
408}
409
410DEFUN(cfg_pcu_no_fc_bucket_time,
411 cfg_pcu_no_fc_bucket_time_cmd,
412 "no flow-control bucket-time",
413 NO_STR FC_STR FC_BTIME_STR)
414{
415 struct gprs_rlcmac_bts *bts = bts_main_data();
416
417 bts->fc_bucket_time = 0;
418
419 return CMD_SUCCESS;
420}
421
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200422#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200423
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200424DEFUN(cfg_pcu_cs,
425 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200426 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200427 CS_STR
428 "Initial CS value to be used (overrides BTS config)\n"
429 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200430{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200431 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200432 uint8_t cs = atoi(argv[0]);
433
434 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200435 bts->initial_cs_dl = cs;
436 if (argc > 1)
437 bts->initial_cs_ul = atoi(argv[1]);
438 else
439 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200440
441 return CMD_SUCCESS;
442}
443
444DEFUN(cfg_pcu_no_cs,
445 cfg_pcu_no_cs_cmd,
446 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200447 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200448{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200449 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200450
451 bts->force_cs = 0;
452
453 return CMD_SUCCESS;
454}
455
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100456#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200457DEFUN(cfg_pcu_cs_max,
458 cfg_pcu_cs_max_cmd,
459 "cs max <1-4> [<1-4>]",
460 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100461 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200462 "Maximum CS value to be used\n"
463 "Use a different maximum CS value for the uplink")
464{
465 struct gprs_rlcmac_bts *bts = bts_main_data();
466 uint8_t cs = atoi(argv[0]);
467
468 bts->max_cs_dl = cs;
469 if (argc > 1)
470 bts->max_cs_ul = atoi(argv[1]);
471 else
472 bts->max_cs_ul = cs;
473
474 return CMD_SUCCESS;
475}
476
477DEFUN(cfg_pcu_no_cs_max,
478 cfg_pcu_no_cs_max_cmd,
479 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100480 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200481{
482 struct gprs_rlcmac_bts *bts = bts_main_data();
483
484 bts->max_cs_dl = 0;
485 bts->max_cs_ul = 0;
486
487 return CMD_SUCCESS;
488}
489
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100490#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
491
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100492DEFUN(cfg_pcu_mcs,
493 cfg_pcu_mcs_cmd,
494 "mcs <1-9> [<1-9>]",
495 MCS_STR
496 "Initial MCS value to be used (default 1)\n"
497 "Use a different initial MCS value for the uplink")
498{
499 struct gprs_rlcmac_bts *bts = bts_main_data();
500 uint8_t cs = atoi(argv[0]);
501
502 bts->initial_mcs_dl = cs;
503 if (argc > 1)
504 bts->initial_mcs_ul = atoi(argv[1]);
505 else
506 bts->initial_mcs_ul = cs;
507
508 return CMD_SUCCESS;
509}
510
511DEFUN(cfg_pcu_no_mcs,
512 cfg_pcu_no_mcs_cmd,
513 "no mcs",
514 NO_STR MCS_STR)
515{
516 struct gprs_rlcmac_bts *bts = bts_main_data();
517
518 bts->initial_mcs_dl = 1;
519 bts->initial_mcs_ul = 1;
520
521 return CMD_SUCCESS;
522}
523
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100524DEFUN(cfg_pcu_mcs_max,
525 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100526 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100527 MCS_STR
528 CS_MAX_STR
529 "Maximum MCS value to be used\n"
530 "Use a different maximum MCS value for the uplink")
531{
532 struct gprs_rlcmac_bts *bts = bts_main_data();
533 uint8_t mcs = atoi(argv[0]);
534
535 bts->max_mcs_dl = mcs;
536 if (argc > 1)
537 bts->max_mcs_ul = atoi(argv[1]);
538 else
539 bts->max_mcs_ul = mcs;
540
541 return CMD_SUCCESS;
542}
543
544DEFUN(cfg_pcu_no_mcs_max,
545 cfg_pcu_no_mcs_max_cmd,
546 "no mcs max",
547 NO_STR MCS_STR CS_MAX_STR)
548{
549 struct gprs_rlcmac_bts *bts = bts_main_data();
550
551 bts->max_mcs_dl = 0;
552 bts->max_mcs_ul = 0;
553
554 return CMD_SUCCESS;
555}
556
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530557#define DL_STR "downlink specific configuration\n"
558
559DEFUN(cfg_pcu_dl_arq_type,
560 cfg_pcu_dl_arq_cmd,
561 "egprs dl arq-type (spb|arq2)",
562 EGPRS_STR DL_STR "ARQ options\n"
563 "enable SPB(ARQ1) support\n"
564 "enable ARQ2 support")
565{
566 struct gprs_rlcmac_bts *bts = bts_main_data();
567
568 if (!strcmp(argv[0], "arq2"))
569 bts->dl_arq_type = 1;
570 else
571 bts->dl_arq_type = 0;
572
573 return CMD_SUCCESS;
574}
575
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100576DEFUN(cfg_pcu_window_size,
577 cfg_pcu_window_size_cmd,
578 "window-size <0-1024> [<0-256>]",
579 "Window size configuration (b + N_PDCH * f)\n"
580 "Base value (b)\n"
581 "Factor for number of PDCH (f)")
582{
583 struct gprs_rlcmac_bts *bts = bts_main_data();
584 uint16_t b = atoi(argv[0]);
585
586 bts->ws_base = b;
587 if (argc > 1) {
588 uint16_t f = atoi(argv[1]);
589 bts->ws_pdch = f;
590 }
591
592 return CMD_SUCCESS;
593}
594
595
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200596#define QUEUE_STR "Packet queue options\n"
597#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
598 "(overrides the value given by SGSN)\n"
599
600DEFUN(cfg_pcu_queue_lifetime,
601 cfg_pcu_queue_lifetime_cmd,
602 "queue lifetime <1-65534>",
603 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
604{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200605 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200606 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200607
608 bts->force_llc_lifetime = csec;
609
610 return CMD_SUCCESS;
611}
612
613DEFUN(cfg_pcu_queue_lifetime_inf,
614 cfg_pcu_queue_lifetime_inf_cmd,
615 "queue lifetime infinite",
616 QUEUE_STR LIFETIME_STR "Infinite lifetime")
617{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200618 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200619
620 bts->force_llc_lifetime = 0xffff;
621
622 return CMD_SUCCESS;
623}
624
625DEFUN(cfg_pcu_no_queue_lifetime,
626 cfg_pcu_no_queue_lifetime_cmd,
627 "no queue lifetime",
628 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
629 "by SGSN)\n")
630{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200631 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200632
633 bts->force_llc_lifetime = 0;
634
635 return CMD_SUCCESS;
636}
637
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100638#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
639 "(continue discarding until lifetime-hysteresis is reached)\n"
640
641DEFUN(cfg_pcu_queue_hysteresis,
642 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200643 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100644 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
645{
646 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200647 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100648
649 bts->llc_discard_csec = csec;
650
651 return CMD_SUCCESS;
652}
653
654DEFUN(cfg_pcu_no_queue_hysteresis,
655 cfg_pcu_no_queue_hysteresis_cmd,
656 "no queue hysteresis",
657 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
658{
659 struct gprs_rlcmac_bts *bts = bts_main_data();
660
661 bts->llc_discard_csec = 0;
662
663 return CMD_SUCCESS;
664}
665
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200666#define QUEUE_CODEL_STR "Set CoDel queue management\n"
667
668DEFUN(cfg_pcu_queue_codel,
669 cfg_pcu_queue_codel_cmd,
670 "queue codel",
671 QUEUE_STR QUEUE_CODEL_STR)
672{
673 struct gprs_rlcmac_bts *bts = bts_main_data();
674
675 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
676
677 return CMD_SUCCESS;
678}
679
680DEFUN(cfg_pcu_queue_codel_interval,
681 cfg_pcu_queue_codel_interval_cmd,
682 "queue codel interval <1-1000>",
683 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
684{
685 struct gprs_rlcmac_bts *bts = bts_main_data();
686 uint16_t csec = atoi(argv[0]);
687
688 bts->llc_codel_interval_msec = 10*csec;
689
690 return CMD_SUCCESS;
691}
692
693DEFUN(cfg_pcu_no_queue_codel,
694 cfg_pcu_no_queue_codel_cmd,
695 "no queue codel",
696 NO_STR QUEUE_STR QUEUE_CODEL_STR)
697{
698 struct gprs_rlcmac_bts *bts = bts_main_data();
699
700 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
701
702 return CMD_SUCCESS;
703}
704
705
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200706#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
707
708DEFUN(cfg_pcu_queue_idle_ack_delay,
709 cfg_pcu_queue_idle_ack_delay_cmd,
710 "queue idle-ack-delay <1-65535>",
711 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
712{
713 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200714 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200715
716 bts->llc_idle_ack_csec = csec;
717
718 return CMD_SUCCESS;
719}
720
721DEFUN(cfg_pcu_no_queue_idle_ack_delay,
722 cfg_pcu_no_queue_idle_ack_delay_cmd,
723 "no queue idle-ack-delay",
724 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
725{
726 struct gprs_rlcmac_bts *bts = bts_main_data();
727
728 bts->llc_idle_ack_csec = 0;
729
730 return CMD_SUCCESS;
731}
732
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100733
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200734DEFUN(cfg_pcu_alloc,
735 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200736 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200737 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200738 "PACCH\n"
739 "Single slot is assigned only\n"
740 "Multiple slots are assigned for semi-duplex operation\n"
741 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200742{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200743 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200744
745 switch (argv[0][0]) {
746 case 'a':
747 bts->alloc_algorithm = alloc_algorithm_a;
748 break;
749 case 'b':
750 bts->alloc_algorithm = alloc_algorithm_b;
751 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200752 default:
753 bts->alloc_algorithm = alloc_algorithm_dynamic;
754 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200755 }
756
757 return CMD_SUCCESS;
758}
759
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200760DEFUN(cfg_pcu_two_phase,
761 cfg_pcu_two_phase_cmd,
762 "two-phase-access",
763 "Force two phase access when MS requests single phase access\n")
764{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200765 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200766
767 bts->force_two_phase = 1;
768
769 return CMD_SUCCESS;
770}
771
772DEFUN(cfg_pcu_no_two_phase,
773 cfg_pcu_no_two_phase_cmd,
774 "no two-phase-access",
775 NO_STR "Only use two phase access when requested my MS\n")
776{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200777 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200778
779 bts->force_two_phase = 0;
780
781 return CMD_SUCCESS;
782}
783
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200784DEFUN(cfg_pcu_alpha,
785 cfg_pcu_alpha_cmd,
786 "alpha <0-10>",
787 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
788 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
789 "Alpha in units of 0.1\n")
790{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200791 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200792
793 bts->alpha = atoi(argv[0]);
794
795 return CMD_SUCCESS;
796}
797
798DEFUN(cfg_pcu_gamma,
799 cfg_pcu_gamma_cmd,
800 "gamma <0-62>",
801 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
802 "Gamma in even unit of dBs\n")
803{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200804 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200805
806 bts->gamma = atoi(argv[0]) / 2;
807
808 return CMD_SUCCESS;
809}
810
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100811DEFUN(show_bts_stats,
812 show_bts_stats_cmd,
813 "show bts statistics",
814 SHOW_STR "BTS related functionality\nStatistics\n")
815{
816 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
817 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100818}
819
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100820#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
821DEFUN(cfg_pcu_dl_tbf_idle_time,
822 cfg_pcu_dl_tbf_idle_time_cmd,
823 "dl-tbf-idle-time <1-5000>",
824 IDLE_TIME_STR "idle time in msec")
825{
826 struct gprs_rlcmac_bts *bts = bts_main_data();
827
828 bts->dl_tbf_idle_msec = atoi(argv[0]);
829
830 return CMD_SUCCESS;
831}
832
833DEFUN(cfg_pcu_no_dl_tbf_idle_time,
834 cfg_pcu_no_dl_tbf_idle_time_cmd,
835 "no dl-tbf-idle-time",
836 NO_STR IDLE_TIME_STR)
837{
838 struct gprs_rlcmac_bts *bts = bts_main_data();
839
840 bts->dl_tbf_idle_msec = 0;
841
842 return CMD_SUCCESS;
843}
844
Jacob Erlbecka098c192015-05-28 16:11:19 +0200845#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
846DEFUN(cfg_pcu_ms_idle_time,
847 cfg_pcu_ms_idle_time_cmd,
848 "ms-idle-time <1-7200>",
849 MS_IDLE_TIME_STR "idle time in sec")
850{
851 struct gprs_rlcmac_bts *bts = bts_main_data();
852
853 bts->ms_idle_sec = atoi(argv[0]);
854
855 return CMD_SUCCESS;
856}
857
858DEFUN(cfg_pcu_no_ms_idle_time,
859 cfg_pcu_no_ms_idle_time_cmd,
860 "no ms-idle-time",
861 NO_STR MS_IDLE_TIME_STR)
862{
863 struct gprs_rlcmac_bts *bts = bts_main_data();
864
865 bts->ms_idle_sec = 0;
866
867 return CMD_SUCCESS;
868}
869
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200870#define CS_ERR_LIMITS_STR "set thresholds for error rate based CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200871DEFUN(cfg_pcu_cs_err_limits,
872 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200873 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200874 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
875{
876 struct gprs_rlcmac_bts *bts = bts_main_data();
877
878 uint8_t lower_limit = atoi(argv[0]);
879 uint8_t upper_limit = atoi(argv[1]);
880
881 if (lower_limit > upper_limit) {
882 vty_out(vty,
883 "The lower limit must be less than or equal to the "
884 "upper limit.%s", VTY_NEWLINE);
885 return CMD_WARNING;
886 }
887
888 bts->cs_adj_enabled = 1;
889 bts->cs_adj_upper_limit = upper_limit;
890 bts->cs_adj_lower_limit = lower_limit;
891
892 return CMD_SUCCESS;
893}
894
895DEFUN(cfg_pcu_no_cs_err_limits,
896 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200897 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200898 NO_STR CS_STR CS_ERR_LIMITS_STR)
899{
900 struct gprs_rlcmac_bts *bts = bts_main_data();
901
902 bts->cs_adj_enabled = 0;
903 bts->cs_adj_upper_limit = 100;
904 bts->cs_adj_lower_limit = 0;
905
906 return CMD_SUCCESS;
907}
908
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200909#define CS_DOWNGRADE_STR "set threshold for data size based CS downgrade\n"
910DEFUN(cfg_pcu_cs_downgrade_thrsh,
911 cfg_pcu_cs_downgrade_thrsh_cmd,
912 "cs downgrade-threshold <1-10000>",
913 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
914{
915 struct gprs_rlcmac_bts *bts = bts_main_data();
916
917 bts->cs_downgrade_threshold = atoi(argv[0]);
918
919 return CMD_SUCCESS;
920}
921
922DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
923 cfg_pcu_no_cs_downgrade_thrsh_cmd,
924 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200925 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200926{
927 struct gprs_rlcmac_bts *bts = bts_main_data();
928
929 bts->cs_downgrade_threshold = 0;
930
931 return CMD_SUCCESS;
932}
933
934
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200935DEFUN(cfg_pcu_cs_lqual_ranges,
936 cfg_pcu_cs_lqual_ranges_cmd,
937 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
938 CS_STR "Set link quality ranges\n"
939 "Set quality range for CS-1 (high value only)\n"
940 "CS-1 high (dB)\n"
941 "Set quality range for CS-2\n"
942 "CS-2 low (dB)\n"
943 "CS-2 high (dB)\n"
944 "Set quality range for CS-3\n"
945 "CS-3 low (dB)\n"
946 "CS-3 high (dB)\n"
947 "Set quality range for CS-4 (low value only)\n"
948 "CS-4 low (dB)\n")
949{
950 struct gprs_rlcmac_bts *bts = bts_main_data();
951
952 uint8_t cs1_high = atoi(argv[0]);
953 uint8_t cs2_low = atoi(argv[1]);
954 uint8_t cs2_high = atoi(argv[2]);
955 uint8_t cs3_low = atoi(argv[3]);
956 uint8_t cs3_high = atoi(argv[4]);
957 uint8_t cs4_low = atoi(argv[5]);
958
959 bts->cs_lqual_ranges[0].high = cs1_high;
960 bts->cs_lqual_ranges[1].low = cs2_low;
961 bts->cs_lqual_ranges[1].high = cs2_high;
962 bts->cs_lqual_ranges[2].low = cs3_low;
963 bts->cs_lqual_ranges[2].high = cs3_high;
964 bts->cs_lqual_ranges[3].low = cs4_low;
965
966 return CMD_SUCCESS;
967}
968
969
Daniel Willmann772415f2014-01-15 17:06:51 +0100970DEFUN(show_tbf,
971 show_tbf_cmd,
972 "show tbf all",
Holger Hans Peter Freyther49f26bf2014-12-20 15:21:43 +0100973 SHOW_STR "information about TBFs\n" "All TBFs\n")
Daniel Willmann772415f2014-01-15 17:06:51 +0100974{
975 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbecked2dbf62015-12-28 19:15:40 +0100976 return pcu_vty_show_tbf_all(vty, bts);
Daniel Willmann772415f2014-01-15 17:06:51 +0100977}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100978
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +0200979DEFUN(show_ms_all,
980 show_ms_all_cmd,
981 "show ms all",
982 SHOW_STR "information about MSs\n" "All TBFs\n")
983{
984 struct gprs_rlcmac_bts *bts = bts_main_data();
985 return pcu_vty_show_ms_all(vty, bts);
986}
987
Jacob Erlbeck37e896d2015-06-05 16:33:33 +0200988DEFUN(show_ms_tlli,
989 show_ms_tlli_cmd,
990 "show ms tlli TLLI",
991 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
992{
993 struct gprs_rlcmac_bts *bts = bts_main_data();
994 char *endp = NULL;
995 unsigned long long tlli = strtoll(argv[0], &endp, 16);
996 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
997 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
998 return CMD_WARNING;
999 }
1000 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
1001}
1002
1003DEFUN(show_ms_imsi,
1004 show_ms_imsi_cmd,
1005 "show ms imsi IMSI",
1006 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1007{
1008 struct gprs_rlcmac_bts *bts = bts_main_data();
1009 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1010}
1011
Andreas Eversberg12942562012-07-12 14:31:57 +02001012static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001013 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1014 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001015 "License GNU GPL version 2 or later\r\n"
1016 "This is free software: you are free to change and redistribute it.\r\n"
1017 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1018
1019struct vty_app_info pcu_vty_info = {
1020 .name = "Osmo-PCU",
1021 .version = PACKAGE_VERSION,
1022 .copyright = pcu_copyright,
1023 .go_parent_cb = pcu_vty_go_parent,
1024 .is_config_node = pcu_vty_is_config_node,
1025};
1026
1027int pcu_vty_init(const struct log_info *cat)
1028{
1029// install_element_ve(&show_pcu_cmd);
1030
Harald Welte717cdf52017-07-21 21:56:23 +02001031 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1032 "gsmtap-category (",
1033 "|",")", VTY_DO_LOWER);
1034 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1035 "GSMTAP Category\n",
1036 "\n", "", 0);
1037 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1038 "no gsmtap-category (",
1039 "|",")", VTY_DO_LOWER);
1040 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1041 NO_STR "GSMTAP Category\n",
1042 "\n", "", 0);
1043
Andreas Eversberg12942562012-07-12 14:31:57 +02001044 logging_vty_add_cmds(cat);
Jacob Erlbeck42aba812015-11-10 15:32:00 +01001045 osmo_stats_vty_add_cmds(cat);
Andreas Eversberg12942562012-07-12 14:31:57 +02001046
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001047 install_node(&pcu_node, config_write_pcu);
1048 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeckcc12f022015-04-09 15:45:24 +02001049 vty_install_default(PCU_NODE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001050 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1051 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001052 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001053 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1054 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001055 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1056 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001057 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1058 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001059 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1060 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001061 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001062 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301063 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001064 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001065 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1066 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001067 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001068 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1069 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1070 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001071 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1072 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001073 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1074 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1075 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001076 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1077 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001078 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001079 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001080 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001081 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1082 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001083 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1084 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1085 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1086 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1087 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1088 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1089 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1090 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001091 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1092 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001093 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1094 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001095 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1096 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001097 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1098 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001099
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001100 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001101 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001102 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001103 install_element_ve(&show_ms_tlli_cmd);
1104 install_element_ve(&show_ms_imsi_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001105
Andreas Eversberg12942562012-07-12 14:31:57 +02001106 return 0;
1107}