blob: a131dd2d444d900f5b66ba910fd2b0c8217f1490 [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>
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02007#include <osmocom/core/tdef.h>
8#include <osmocom/vty/tdef_vty.h>
Andreas Eversberg12942562012-07-12 14:31:57 +02009#include <osmocom/vty/logging.h>
Jacob Erlbeck42aba812015-11-10 15:32:00 +010010#include <osmocom/vty/stats.h>
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020011#include <osmocom/vty/misc.h>
Andreas Eversberg8b761a32012-07-20 21:50:31 +020012#include <osmocom/core/linuxlist.h>
Holger Hans Peter Freythere8915b92014-07-02 14:57:47 +020013#include <osmocom/core/rate_ctr.h>
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +020014#include <osmocom/pcu/pcuif_proto.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020015#include "pcu_vty.h"
Andreas Eversberg8b761a32012-07-20 21:50:31 +020016#include "gprs_rlcmac.h"
Max6dc90b82018-02-19 17:17:28 +010017#include <pdch.h>
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020018#include "bts.h"
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020019#include "tbf.h"
Jacob Erlbeck62e96a32015-06-04 09:42:14 +020020#include "pcu_vty_functions.h"
21
Harald Welte717cdf52017-07-21 21:56:23 +020022extern void *tall_pcu_ctx;
23
24static const struct value_string pcu_gsmtap_categ_names[] = {
25 { PCU_GSMTAP_C_DL_UNKNOWN, "dl-unknown" },
26 { PCU_GSMTAP_C_DL_DUMMY, "dl-dummy" },
27 { PCU_GSMTAP_C_DL_CTRL, "dl-ctrl" },
28 { PCU_GSMTAP_C_DL_DATA_GPRS, "dl-data-gprs" },
29 { PCU_GSMTAP_C_DL_DATA_EGPRS, "dl-data-egprs" },
Harald Weltebc219d52017-07-29 13:42:27 +020030 { PCU_GSMTAP_C_DL_PTCCH, "dl-ptcch" },
Harald Welte717cdf52017-07-21 21:56:23 +020031
32 { PCU_GSMTAP_C_UL_UNKNOWN, "ul-unknown" },
33 { PCU_GSMTAP_C_UL_DUMMY, "ul-dummy" },
34 { PCU_GSMTAP_C_UL_CTRL, "ul-ctrl" },
35 { PCU_GSMTAP_C_UL_DATA_GPRS, "ul-data-gprs" },
36 { PCU_GSMTAP_C_UL_DATA_EGPRS, "ul-data-egprs" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020037 { PCU_GSMTAP_C_UL_RACH, "ul-rach" },
Harald Welte717cdf52017-07-21 21:56:23 +020038
39 { 0, NULL }
40};
41
42static const struct value_string pcu_gsmtap_categ_help[] = {
43 { PCU_GSMTAP_C_DL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
44 { PCU_GSMTAP_C_DL_DUMMY, "Downlink Dummy Blocks" },
45 { PCU_GSMTAP_C_DL_CTRL, "Downlink Control Blocks" },
46 { PCU_GSMTAP_C_DL_DATA_GPRS, "Downlink Data Blocks (GPRS)" },
47 { PCU_GSMTAP_C_DL_DATA_EGPRS, "Downlink Data Blocks (EGPRS)" },
Harald Weltebc219d52017-07-29 13:42:27 +020048 { PCU_GSMTAP_C_DL_PTCCH, "Downlink PTCCH Blocks" },
Harald Welte717cdf52017-07-21 21:56:23 +020049
50 { PCU_GSMTAP_C_UL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
51 { PCU_GSMTAP_C_UL_DUMMY, "Uplink Dummy Blocks" },
52 { PCU_GSMTAP_C_UL_CTRL, "Uplink Control Blocks" },
53 { PCU_GSMTAP_C_UL_DATA_GPRS, "Uplink Data Blocks (GPRS)" },
54 { PCU_GSMTAP_C_UL_DATA_EGPRS, "Uplink Data Blocks (EGPRS)" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020055 { PCU_GSMTAP_C_UL_RACH, "Uplink RACH Bursts" },
Harald Welte717cdf52017-07-21 21:56:23 +020056
57 { 0, NULL }
58};
59
60
61DEFUN(cfg_pcu_gsmtap_categ, cfg_pcu_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
62{
63 struct gprs_rlcmac_bts *bts = bts_main_data();
64 int categ;
65
66 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
67 if (categ < 0)
68 return CMD_WARNING;
69
70 bts->gsmtap_categ_mask |= (1 << categ);
71
72 return CMD_SUCCESS;
73}
74
75DEFUN(cfg_pcu_no_gsmtap_categ, cfg_pcu_no_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
76{
77 struct gprs_rlcmac_bts *bts = bts_main_data();
78 int categ;
79
80 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
81 if (categ < 0)
82 return CMD_WARNING;
83
84 bts->gsmtap_categ_mask &= ~(1 << categ);
85
86 return CMD_SUCCESS;
87}
88
89
Jacob Erlbeckf76fede2015-08-17 13:42:46 +020090int pcu_vty_go_parent(struct vty *vty)
Andreas Eversberg12942562012-07-12 14:31:57 +020091{
92 switch (vty->node) {
93#if 0
94 case TRX_NODE:
Andreas Eversberg8b761a32012-07-20 21:50:31 +020095 vty->node = PCU_NODE;
Andreas Eversberg12942562012-07-12 14:31:57 +020096 {
97 struct gsm_bts_trx *trx = vty->index;
98 vty->index = trx->bts;
99 }
100 break;
101#endif
102 default:
103 vty->node = CONFIG_NODE;
104 }
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200105 return (enum node_type) vty->node;
Andreas Eversberg12942562012-07-12 14:31:57 +0200106}
107
108int pcu_vty_is_config_node(struct vty *vty, int node)
109{
110 switch (node) {
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200111 case PCU_NODE:
Andreas Eversberg12942562012-07-12 14:31:57 +0200112 return 1;
Andreas Eversberg12942562012-07-12 14:31:57 +0200113 default:
114 return 0;
115 }
116}
117
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200118static struct cmd_node pcu_node = {
119 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200120 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200121 1,
122};
123
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200124static int config_write_pcu(struct vty *vty)
125{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200126 struct gprs_rlcmac_bts *bts = bts_main_data();
Harald Welte717cdf52017-07-21 21:56:23 +0200127 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200128
129 vty_out(vty, "pcu%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200130 if (bts->egprs_enabled)
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100131 vty_out(vty, " egprs only%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200132
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200133 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
134 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200135 if (bts->fc_bvc_bucket_size)
136 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
137 bts->fc_bvc_bucket_size, VTY_NEWLINE);
138 if (bts->fc_bvc_leak_rate)
139 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
140 bts->fc_bvc_leak_rate, VTY_NEWLINE);
141 if (bts->fc_ms_bucket_size)
142 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
143 bts->fc_ms_bucket_size, VTY_NEWLINE);
144 if (bts->fc_ms_leak_rate)
145 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
146 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200147 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +0200148 if (bts->initial_cs_ul == bts->initial_cs_dl)
149 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
150 VTY_NEWLINE);
151 else
152 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
153 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200154 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200155 if (bts->max_cs_dl && bts->max_cs_ul) {
156 if (bts->max_cs_ul == bts->max_cs_dl)
157 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
158 VTY_NEWLINE);
159 else
160 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
161 bts->max_cs_ul, VTY_NEWLINE);
162 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200163 if (bts->cs_adj_enabled)
164 vty_out(vty, " cs threshold %d %d%s",
165 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
166 VTY_NEWLINE);
167 else
168 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
169
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200170 if (bts->cs_downgrade_threshold)
171 vty_out(vty, " cs downgrade-threshold %d%s",
172 bts->cs_downgrade_threshold, VTY_NEWLINE);
173 else
174 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
175
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200176 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
177 bts->cs_lqual_ranges[0].high,
178 bts->cs_lqual_ranges[1].low,
179 bts->cs_lqual_ranges[1].high,
180 bts->cs_lqual_ranges[2].low,
181 bts->cs_lqual_ranges[2].high,
182 bts->cs_lqual_ranges[3].low,
183 VTY_NEWLINE);
184
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400185 vty_out(vty, " mcs link-quality-ranges mcs1 %d mcs2 %d %d mcs3 %d %d mcs4 %d %d mcs5 %d %d mcs6 %d %d mcs7 %d %d mcs8 %d %d mcs9 %d%s",
186 bts->mcs_lqual_ranges[0].high,
187 bts->mcs_lqual_ranges[1].low,
188 bts->mcs_lqual_ranges[1].high,
189 bts->mcs_lqual_ranges[2].low,
190 bts->mcs_lqual_ranges[2].high,
191 bts->mcs_lqual_ranges[3].low,
192 bts->mcs_lqual_ranges[3].high,
193 bts->mcs_lqual_ranges[4].low,
194 bts->mcs_lqual_ranges[4].high,
195 bts->mcs_lqual_ranges[5].low,
196 bts->mcs_lqual_ranges[5].high,
197 bts->mcs_lqual_ranges[6].low,
198 bts->mcs_lqual_ranges[6].high,
199 bts->mcs_lqual_ranges[7].low,
200 bts->mcs_lqual_ranges[7].high,
201 bts->mcs_lqual_ranges[8].low,
202 VTY_NEWLINE);
203
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100204 if (bts->initial_mcs_dl != 1 && bts->initial_mcs_ul != 1) {
205 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
206 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
207 VTY_NEWLINE);
208 else
209 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
210 bts->initial_mcs_ul, VTY_NEWLINE);
211 }
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400212
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100213 if (bts->max_mcs_dl && bts->max_mcs_ul) {
214 if (bts->max_mcs_ul == bts->max_mcs_dl)
215 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
216 VTY_NEWLINE);
217 else
218 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
219 bts->max_mcs_ul, VTY_NEWLINE);
220 }
221
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100222 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
223 VTY_NEWLINE);
224
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530225 if (bts->dl_arq_type)
226 vty_out(vty, " egprs dl arq-type arq2%s",
227 VTY_NEWLINE);
228
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200229 if (bts->force_llc_lifetime == 0xffff)
230 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
231 else if (bts->force_llc_lifetime)
232 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
233 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100234 if (bts->llc_discard_csec)
235 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
236 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200237 if (bts->llc_idle_ack_csec)
238 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
239 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200240 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
241 vty_out(vty, " queue codel%s", VTY_NEWLINE);
242 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
243 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
244 else
245 vty_out(vty, " queue codel interval %d%s",
246 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
247
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200248 if (bts->alloc_algorithm == alloc_algorithm_a)
249 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
250 if (bts->alloc_algorithm == alloc_algorithm_b)
251 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200252 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
253 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200254 if (bts->force_two_phase)
255 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200256 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
257 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Oliver Smith45fdc442019-09-05 15:12:20 +0200258 if (!bts->dl_tbf_preemptive_retransmission)
259 vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200260 if (strcmp(bts->pcu_sock_path, PCU_SOCK_DEFAULT))
261 vty_out(vty, " pcu-socket %s%s", bts->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200262
Harald Welte717cdf52017-07-21 21:56:23 +0200263 for (i = 0; i < 32; i++) {
264 unsigned int cs = (1 << i);
265 if (bts->gsmtap_categ_mask & cs) {
266 vty_out(vty, " gsmtap-category %s%s",
267 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
268 }
269 }
270
Harald Welte57d35152018-07-05 03:11:17 +0200271 if (bts->gb_dialect_sns)
272 vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);
273 else
274 vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);
275
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200276 osmo_tdef_vty_write(vty, bts->T_defs_pcu, " timer ");
277
Maxc9ce6f92018-01-30 17:53:02 +0100278 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200279}
280
281/* per-BTS configuration */
282DEFUN(cfg_pcu,
283 cfg_pcu_cmd,
284 "pcu",
285 "BTS specific configure")
286{
287 vty->node = PCU_NODE;
288
289 return CMD_SUCCESS;
290}
291
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200292#define EGPRS_STR "EGPRS configuration\n"
293
294DEFUN(cfg_pcu_egprs,
295 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100296 "egprs only",
297 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200298{
299 struct gprs_rlcmac_bts *bts = bts_main_data();
300
301 bts->egprs_enabled = 1;
302
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200303 return CMD_SUCCESS;
304}
305
306DEFUN(cfg_pcu_no_egprs,
307 cfg_pcu_no_egprs_cmd,
308 "no egprs",
309 NO_STR EGPRS_STR)
310{
311 struct gprs_rlcmac_bts *bts = bts_main_data();
312
313 bts->egprs_enabled = 0;
314
315 return CMD_SUCCESS;
316}
317
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200318DEFUN(cfg_pcu_fc_interval,
319 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200320 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200321 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200322 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200323{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200324 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200325
326 bts->fc_interval = atoi(argv[0]);
327
328 return CMD_SUCCESS;
329}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200330#define FC_STR "BSSGP Flow Control configuration\n"
331#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
332#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
333
334DEFUN(cfg_pcu_fc_bvc_bucket_size,
335 cfg_pcu_fc_bvc_bucket_size_cmd,
336 "flow-control force-bvc-bucket-size <1-6553500>",
337 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
338{
339 struct gprs_rlcmac_bts *bts = bts_main_data();
340
341 bts->fc_bvc_bucket_size = atoi(argv[0]);
342
343 return CMD_SUCCESS;
344}
345
346DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
347 cfg_pcu_no_fc_bvc_bucket_size_cmd,
348 "no flow-control force-bvc-bucket-size",
349 NO_STR FC_STR FC_BMAX_STR("BVC"))
350{
351 struct gprs_rlcmac_bts *bts = bts_main_data();
352
353 bts->fc_bvc_bucket_size = 0;
354
355 return CMD_SUCCESS;
356}
357
358DEFUN(cfg_pcu_fc_bvc_leak_rate,
359 cfg_pcu_fc_bvc_leak_rate_cmd,
360 "flow-control force-bvc-leak-rate <1-6553500>",
361 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
362{
363 struct gprs_rlcmac_bts *bts = bts_main_data();
364
365 bts->fc_bvc_leak_rate = atoi(argv[0]);
366
367 return CMD_SUCCESS;
368}
369
370DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
371 cfg_pcu_no_fc_bvc_leak_rate_cmd,
372 "no flow-control force-bvc-leak-rate",
373 NO_STR FC_STR FC_LR_STR("BVC"))
374{
375 struct gprs_rlcmac_bts *bts = bts_main_data();
376
377 bts->fc_bvc_leak_rate = 0;
378
379 return CMD_SUCCESS;
380}
381
382DEFUN(cfg_pcu_fc_ms_bucket_size,
383 cfg_pcu_fc_ms_bucket_size_cmd,
384 "flow-control force-ms-bucket-size <1-6553500>",
385 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
386{
387 struct gprs_rlcmac_bts *bts = bts_main_data();
388
389 bts->fc_ms_bucket_size = atoi(argv[0]);
390
391 return CMD_SUCCESS;
392}
393
394DEFUN(cfg_pcu_no_fc_ms_bucket_size,
395 cfg_pcu_no_fc_ms_bucket_size_cmd,
396 "no flow-control force-ms-bucket-size",
397 NO_STR FC_STR FC_BMAX_STR("default MS"))
398{
399 struct gprs_rlcmac_bts *bts = bts_main_data();
400
401 bts->fc_ms_bucket_size = 0;
402
403 return CMD_SUCCESS;
404}
405
406DEFUN(cfg_pcu_fc_ms_leak_rate,
407 cfg_pcu_fc_ms_leak_rate_cmd,
408 "flow-control force-ms-leak-rate <1-6553500>",
409 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
410{
411 struct gprs_rlcmac_bts *bts = bts_main_data();
412
413 bts->fc_ms_leak_rate = atoi(argv[0]);
414
415 return CMD_SUCCESS;
416}
417
418DEFUN(cfg_pcu_no_fc_ms_leak_rate,
419 cfg_pcu_no_fc_ms_leak_rate_cmd,
420 "no flow-control force-ms-leak-rate",
421 NO_STR FC_STR FC_LR_STR("default MS"))
422{
423 struct gprs_rlcmac_bts *bts = bts_main_data();
424
425 bts->fc_ms_leak_rate = 0;
426
427 return CMD_SUCCESS;
428}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200429
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200430#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
431DEFUN(cfg_pcu_fc_bucket_time,
432 cfg_pcu_fc_bucket_time_cmd,
433 "flow-control bucket-time <1-65534>",
434 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
435{
436 struct gprs_rlcmac_bts *bts = bts_main_data();
437
438 bts->fc_bucket_time = atoi(argv[0]);
439
440 return CMD_SUCCESS;
441}
442
443DEFUN(cfg_pcu_no_fc_bucket_time,
444 cfg_pcu_no_fc_bucket_time_cmd,
445 "no flow-control bucket-time",
446 NO_STR FC_STR FC_BTIME_STR)
447{
448 struct gprs_rlcmac_bts *bts = bts_main_data();
449
450 bts->fc_bucket_time = 0;
451
452 return CMD_SUCCESS;
453}
454
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200455#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200456
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200457DEFUN(cfg_pcu_cs,
458 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200459 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200460 CS_STR
461 "Initial CS value to be used (overrides BTS config)\n"
462 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200463{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200464 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200465 uint8_t cs = atoi(argv[0]);
466
467 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200468 bts->initial_cs_dl = cs;
469 if (argc > 1)
470 bts->initial_cs_ul = atoi(argv[1]);
471 else
472 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200473
474 return CMD_SUCCESS;
475}
476
477DEFUN(cfg_pcu_no_cs,
478 cfg_pcu_no_cs_cmd,
479 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200480 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200481{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200482 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200483
484 bts->force_cs = 0;
485
486 return CMD_SUCCESS;
487}
488
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100489#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200490DEFUN(cfg_pcu_cs_max,
491 cfg_pcu_cs_max_cmd,
492 "cs max <1-4> [<1-4>]",
493 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100494 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200495 "Maximum CS value to be used\n"
496 "Use a different maximum CS value for the uplink")
497{
498 struct gprs_rlcmac_bts *bts = bts_main_data();
499 uint8_t cs = atoi(argv[0]);
500
501 bts->max_cs_dl = cs;
502 if (argc > 1)
503 bts->max_cs_ul = atoi(argv[1]);
504 else
505 bts->max_cs_ul = cs;
506
507 return CMD_SUCCESS;
508}
509
510DEFUN(cfg_pcu_no_cs_max,
511 cfg_pcu_no_cs_max_cmd,
512 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100513 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200514{
515 struct gprs_rlcmac_bts *bts = bts_main_data();
516
517 bts->max_cs_dl = 0;
518 bts->max_cs_ul = 0;
519
520 return CMD_SUCCESS;
521}
522
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100523#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
524
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100525DEFUN(cfg_pcu_mcs,
526 cfg_pcu_mcs_cmd,
527 "mcs <1-9> [<1-9>]",
528 MCS_STR
529 "Initial MCS value to be used (default 1)\n"
530 "Use a different initial MCS value for the uplink")
531{
532 struct gprs_rlcmac_bts *bts = bts_main_data();
533 uint8_t cs = atoi(argv[0]);
534
535 bts->initial_mcs_dl = cs;
536 if (argc > 1)
537 bts->initial_mcs_ul = atoi(argv[1]);
538 else
539 bts->initial_mcs_ul = cs;
540
541 return CMD_SUCCESS;
542}
543
544DEFUN(cfg_pcu_no_mcs,
545 cfg_pcu_no_mcs_cmd,
546 "no mcs",
547 NO_STR MCS_STR)
548{
549 struct gprs_rlcmac_bts *bts = bts_main_data();
550
551 bts->initial_mcs_dl = 1;
552 bts->initial_mcs_ul = 1;
553
554 return CMD_SUCCESS;
555}
556
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100557DEFUN(cfg_pcu_mcs_max,
558 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100559 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100560 MCS_STR
561 CS_MAX_STR
562 "Maximum MCS value to be used\n"
563 "Use a different maximum MCS value for the uplink")
564{
565 struct gprs_rlcmac_bts *bts = bts_main_data();
566 uint8_t mcs = atoi(argv[0]);
567
568 bts->max_mcs_dl = mcs;
569 if (argc > 1)
570 bts->max_mcs_ul = atoi(argv[1]);
571 else
572 bts->max_mcs_ul = mcs;
573
574 return CMD_SUCCESS;
575}
576
577DEFUN(cfg_pcu_no_mcs_max,
578 cfg_pcu_no_mcs_max_cmd,
579 "no mcs max",
580 NO_STR MCS_STR CS_MAX_STR)
581{
582 struct gprs_rlcmac_bts *bts = bts_main_data();
583
584 bts->max_mcs_dl = 0;
585 bts->max_mcs_ul = 0;
586
587 return CMD_SUCCESS;
588}
589
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530590#define DL_STR "downlink specific configuration\n"
591
592DEFUN(cfg_pcu_dl_arq_type,
593 cfg_pcu_dl_arq_cmd,
594 "egprs dl arq-type (spb|arq2)",
595 EGPRS_STR DL_STR "ARQ options\n"
596 "enable SPB(ARQ1) support\n"
597 "enable ARQ2 support")
598{
599 struct gprs_rlcmac_bts *bts = bts_main_data();
600
601 if (!strcmp(argv[0], "arq2"))
602 bts->dl_arq_type = 1;
603 else
604 bts->dl_arq_type = 0;
605
606 return CMD_SUCCESS;
607}
608
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100609DEFUN(cfg_pcu_window_size,
610 cfg_pcu_window_size_cmd,
611 "window-size <0-1024> [<0-256>]",
612 "Window size configuration (b + N_PDCH * f)\n"
613 "Base value (b)\n"
614 "Factor for number of PDCH (f)")
615{
616 struct gprs_rlcmac_bts *bts = bts_main_data();
617 uint16_t b = atoi(argv[0]);
618
619 bts->ws_base = b;
620 if (argc > 1) {
621 uint16_t f = atoi(argv[1]);
622 bts->ws_pdch = f;
623 }
624
625 return CMD_SUCCESS;
626}
627
628
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200629#define QUEUE_STR "Packet queue options\n"
630#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
631 "(overrides the value given by SGSN)\n"
632
633DEFUN(cfg_pcu_queue_lifetime,
634 cfg_pcu_queue_lifetime_cmd,
635 "queue lifetime <1-65534>",
636 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
637{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200638 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200639 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200640
641 bts->force_llc_lifetime = csec;
642
643 return CMD_SUCCESS;
644}
645
646DEFUN(cfg_pcu_queue_lifetime_inf,
647 cfg_pcu_queue_lifetime_inf_cmd,
648 "queue lifetime infinite",
649 QUEUE_STR LIFETIME_STR "Infinite lifetime")
650{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200651 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200652
653 bts->force_llc_lifetime = 0xffff;
654
655 return CMD_SUCCESS;
656}
657
658DEFUN(cfg_pcu_no_queue_lifetime,
659 cfg_pcu_no_queue_lifetime_cmd,
660 "no queue lifetime",
661 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
662 "by SGSN)\n")
663{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200664 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200665
666 bts->force_llc_lifetime = 0;
667
668 return CMD_SUCCESS;
669}
670
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100671#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
672 "(continue discarding until lifetime-hysteresis is reached)\n"
673
674DEFUN(cfg_pcu_queue_hysteresis,
675 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200676 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100677 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
678{
679 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200680 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100681
682 bts->llc_discard_csec = csec;
683
684 return CMD_SUCCESS;
685}
686
687DEFUN(cfg_pcu_no_queue_hysteresis,
688 cfg_pcu_no_queue_hysteresis_cmd,
689 "no queue hysteresis",
690 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
691{
692 struct gprs_rlcmac_bts *bts = bts_main_data();
693
694 bts->llc_discard_csec = 0;
695
696 return CMD_SUCCESS;
697}
698
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200699#define QUEUE_CODEL_STR "Set CoDel queue management\n"
700
701DEFUN(cfg_pcu_queue_codel,
702 cfg_pcu_queue_codel_cmd,
703 "queue codel",
704 QUEUE_STR QUEUE_CODEL_STR)
705{
706 struct gprs_rlcmac_bts *bts = bts_main_data();
707
708 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
709
710 return CMD_SUCCESS;
711}
712
713DEFUN(cfg_pcu_queue_codel_interval,
714 cfg_pcu_queue_codel_interval_cmd,
715 "queue codel interval <1-1000>",
716 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
717{
718 struct gprs_rlcmac_bts *bts = bts_main_data();
719 uint16_t csec = atoi(argv[0]);
720
721 bts->llc_codel_interval_msec = 10*csec;
722
723 return CMD_SUCCESS;
724}
725
726DEFUN(cfg_pcu_no_queue_codel,
727 cfg_pcu_no_queue_codel_cmd,
728 "no queue codel",
729 NO_STR QUEUE_STR QUEUE_CODEL_STR)
730{
731 struct gprs_rlcmac_bts *bts = bts_main_data();
732
733 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
734
735 return CMD_SUCCESS;
736}
737
738
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200739#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
740
741DEFUN(cfg_pcu_queue_idle_ack_delay,
742 cfg_pcu_queue_idle_ack_delay_cmd,
743 "queue idle-ack-delay <1-65535>",
744 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
745{
746 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200747 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200748
749 bts->llc_idle_ack_csec = csec;
750
751 return CMD_SUCCESS;
752}
753
754DEFUN(cfg_pcu_no_queue_idle_ack_delay,
755 cfg_pcu_no_queue_idle_ack_delay_cmd,
756 "no queue idle-ack-delay",
757 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
758{
759 struct gprs_rlcmac_bts *bts = bts_main_data();
760
761 bts->llc_idle_ack_csec = 0;
762
763 return CMD_SUCCESS;
764}
765
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100766
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200767DEFUN(cfg_pcu_alloc,
768 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200769 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200770 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200771 "PACCH\n"
772 "Single slot is assigned only\n"
773 "Multiple slots are assigned for semi-duplex operation\n"
774 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200775{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200776 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200777
778 switch (argv[0][0]) {
779 case 'a':
780 bts->alloc_algorithm = alloc_algorithm_a;
781 break;
782 case 'b':
783 bts->alloc_algorithm = alloc_algorithm_b;
784 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200785 default:
786 bts->alloc_algorithm = alloc_algorithm_dynamic;
787 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200788 }
789
790 return CMD_SUCCESS;
791}
792
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200793DEFUN(cfg_pcu_two_phase,
794 cfg_pcu_two_phase_cmd,
795 "two-phase-access",
796 "Force two phase access when MS requests single phase access\n")
797{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200798 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200799
800 bts->force_two_phase = 1;
801
802 return CMD_SUCCESS;
803}
804
805DEFUN(cfg_pcu_no_two_phase,
806 cfg_pcu_no_two_phase_cmd,
807 "no two-phase-access",
808 NO_STR "Only use two phase access when requested my MS\n")
809{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200810 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200811
812 bts->force_two_phase = 0;
813
814 return CMD_SUCCESS;
815}
816
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200817DEFUN(cfg_pcu_alpha,
818 cfg_pcu_alpha_cmd,
819 "alpha <0-10>",
820 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
821 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
822 "Alpha in units of 0.1\n")
823{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200824 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200825
826 bts->alpha = atoi(argv[0]);
827
828 return CMD_SUCCESS;
829}
830
831DEFUN(cfg_pcu_gamma,
832 cfg_pcu_gamma_cmd,
833 "gamma <0-62>",
834 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
835 "Gamma in even unit of dBs\n")
836{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200837 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200838
839 bts->gamma = atoi(argv[0]) / 2;
840
841 return CMD_SUCCESS;
842}
843
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100844DEFUN(show_bts_stats,
845 show_bts_stats_cmd,
846 "show bts statistics",
847 SHOW_STR "BTS related functionality\nStatistics\n")
848{
849 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
850 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100851}
852
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100853#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200854DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100855 cfg_pcu_dl_tbf_idle_time_cmd,
856 "dl-tbf-idle-time <1-5000>",
857 IDLE_TIME_STR "idle time in msec")
858{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200859 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
860
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100861 struct gprs_rlcmac_bts *bts = bts_main_data();
862
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200863 if (osmo_tdef_set(bts->T_defs_pcu, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
864 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100865 return CMD_SUCCESS;
866}
867
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200868DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100869 cfg_pcu_no_dl_tbf_idle_time_cmd,
870 "no dl-tbf-idle-time",
871 NO_STR IDLE_TIME_STR)
872{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200873 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
874
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100875 struct gprs_rlcmac_bts *bts = bts_main_data();
876
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200877 if (osmo_tdef_set(bts->T_defs_pcu, -2031, 0, OSMO_TDEF_MS) < 0)
878 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100879 return CMD_SUCCESS;
880}
881
Oliver Smith45fdc442019-09-05 15:12:20 +0200882#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
883 " less readable traces)"
884DEFUN(cfg_pcu_dl_tbf_preemptive_retransmission,
885 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
886 "dl-tbf-preemptive-retransmission",
887 RETRANSMISSION_STR " (enabled by default)")
888{
889 struct gprs_rlcmac_bts *bts = bts_main_data();
890
891 bts->dl_tbf_preemptive_retransmission = true;
892
893 return CMD_SUCCESS;
894}
895
896DEFUN(cfg_pcu_no_dl_tbf_preemptive_retransmission,
897 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
898 "no dl-tbf-preemptive-retransmission",
899 NO_STR RETRANSMISSION_STR)
900{
901 struct gprs_rlcmac_bts *bts = bts_main_data();
902
903 bts->dl_tbf_preemptive_retransmission = false;
904
905 return CMD_SUCCESS;
906}
907
Jacob Erlbecka098c192015-05-28 16:11:19 +0200908#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200909DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200910 cfg_pcu_ms_idle_time_cmd,
911 "ms-idle-time <1-7200>",
912 MS_IDLE_TIME_STR "idle time in sec")
913{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200914 vty_out(vty, "%% 'ms-idle-time' is now deprecated: use 'timer X2030 <val>' instead%s", VTY_NEWLINE);
915
Jacob Erlbecka098c192015-05-28 16:11:19 +0200916 struct gprs_rlcmac_bts *bts = bts_main_data();
917
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200918 if (osmo_tdef_set(bts->T_defs_pcu, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
919 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200920 return CMD_SUCCESS;
921}
922
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200923DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200924 cfg_pcu_no_ms_idle_time_cmd,
925 "no ms-idle-time",
926 NO_STR MS_IDLE_TIME_STR)
927{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200928 vty_out(vty, "%% 'no ms-idle-time' is now deprecated: use 'timer X2030 0' instead%s", VTY_NEWLINE);
929
Jacob Erlbecka098c192015-05-28 16:11:19 +0200930 struct gprs_rlcmac_bts *bts = bts_main_data();
931
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200932 if (osmo_tdef_set(bts->T_defs_pcu, -2030, 0, OSMO_TDEF_S) < 0)
933 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200934 return CMD_SUCCESS;
935}
936
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200937#define CS_ERR_LIMITS_STR "set thresholds for error rate based CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200938DEFUN(cfg_pcu_cs_err_limits,
939 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200940 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200941 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
942{
943 struct gprs_rlcmac_bts *bts = bts_main_data();
944
945 uint8_t lower_limit = atoi(argv[0]);
946 uint8_t upper_limit = atoi(argv[1]);
947
948 if (lower_limit > upper_limit) {
949 vty_out(vty,
950 "The lower limit must be less than or equal to the "
951 "upper limit.%s", VTY_NEWLINE);
952 return CMD_WARNING;
953 }
954
955 bts->cs_adj_enabled = 1;
956 bts->cs_adj_upper_limit = upper_limit;
957 bts->cs_adj_lower_limit = lower_limit;
958
959 return CMD_SUCCESS;
960}
961
962DEFUN(cfg_pcu_no_cs_err_limits,
963 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200964 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200965 NO_STR CS_STR CS_ERR_LIMITS_STR)
966{
967 struct gprs_rlcmac_bts *bts = bts_main_data();
968
969 bts->cs_adj_enabled = 0;
970 bts->cs_adj_upper_limit = 100;
971 bts->cs_adj_lower_limit = 0;
972
973 return CMD_SUCCESS;
974}
975
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200976#define CS_DOWNGRADE_STR "set threshold for data size based CS downgrade\n"
977DEFUN(cfg_pcu_cs_downgrade_thrsh,
978 cfg_pcu_cs_downgrade_thrsh_cmd,
979 "cs downgrade-threshold <1-10000>",
980 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
981{
982 struct gprs_rlcmac_bts *bts = bts_main_data();
983
984 bts->cs_downgrade_threshold = atoi(argv[0]);
985
986 return CMD_SUCCESS;
987}
988
989DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
990 cfg_pcu_no_cs_downgrade_thrsh_cmd,
991 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200992 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200993{
994 struct gprs_rlcmac_bts *bts = bts_main_data();
995
996 bts->cs_downgrade_threshold = 0;
997
998 return CMD_SUCCESS;
999}
1000
1001
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001002DEFUN(cfg_pcu_cs_lqual_ranges,
1003 cfg_pcu_cs_lqual_ranges_cmd,
1004 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
1005 CS_STR "Set link quality ranges\n"
1006 "Set quality range for CS-1 (high value only)\n"
1007 "CS-1 high (dB)\n"
1008 "Set quality range for CS-2\n"
1009 "CS-2 low (dB)\n"
1010 "CS-2 high (dB)\n"
1011 "Set quality range for CS-3\n"
1012 "CS-3 low (dB)\n"
1013 "CS-3 high (dB)\n"
1014 "Set quality range for CS-4 (low value only)\n"
1015 "CS-4 low (dB)\n")
1016{
1017 struct gprs_rlcmac_bts *bts = bts_main_data();
1018
1019 uint8_t cs1_high = atoi(argv[0]);
1020 uint8_t cs2_low = atoi(argv[1]);
1021 uint8_t cs2_high = atoi(argv[2]);
1022 uint8_t cs3_low = atoi(argv[3]);
1023 uint8_t cs3_high = atoi(argv[4]);
1024 uint8_t cs4_low = atoi(argv[5]);
1025
1026 bts->cs_lqual_ranges[0].high = cs1_high;
1027 bts->cs_lqual_ranges[1].low = cs2_low;
1028 bts->cs_lqual_ranges[1].high = cs2_high;
1029 bts->cs_lqual_ranges[2].low = cs3_low;
1030 bts->cs_lqual_ranges[2].high = cs3_high;
1031 bts->cs_lqual_ranges[3].low = cs4_low;
1032
1033 return CMD_SUCCESS;
1034}
1035
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001036DEFUN(cfg_pcu_mcs_lqual_ranges,
1037 cfg_pcu_mcs_lqual_ranges_cmd,
1038 "mcs link-quality-ranges mcs1 <0-35> mcs2 <0-35> <0-35> mcs3 <0-35> <0-35> mcs4 <0-35> <0-35> mcs5 <0-35> <0-35> mcs6 <0-35> <0-35> mcs7 <0-35> <0-35> mcs8 <0-35> <0-35> mcs9 <0-35>",
1039 CS_STR "Set link quality ranges\n"
1040 "Set quality range for MCS-1 (high value only)\n"
1041 "MCS-1 high (dB)\n"
1042 "Set quality range for MCS-2\n"
1043 "MCS-2 high (dB)\n"
1044 "MCS-2 low (dB)\n"
1045 "Set quality range for MCS-3\n"
1046 "MCS-3 high (dB)\n"
1047 "MCS-3 low (dB)\n"
1048 "Set quality range for MCS-4\n"
1049 "MCS-4 high (dB)\n"
1050 "MCS-4 low (dB)\n"
1051 "Set quality range for MCS-5\n"
1052 "MCS-5 high (dB)\n"
1053 "MCS-5 low (dB)\n"
1054 "Set quality range for MCS-6\n"
1055 "MCS-6 low (dB)\n"
1056 "MCS-6 high (dB)\n"
1057 "Set quality range for MCS-7\n"
1058 "MCS-7 low (dB)\n"
1059 "MCS-7 high (dB)\n"
1060 "Set quality range for MCS-8\n"
1061 "MCS-8 low (dB)\n"
1062 "MCS-8 high (dB)\n"
1063 "Set quality range for MCS-9 (low value only)\n"
1064 "MCS-9 low (dB)\n")
1065{
1066 struct gprs_rlcmac_bts *bts = bts_main_data();
1067
1068 bts->mcs_lqual_ranges[0].high = atoi(argv[0]);
1069 bts->mcs_lqual_ranges[1].low = atoi(argv[1]);
1070 bts->mcs_lqual_ranges[1].high = atoi(argv[2]);
1071 bts->mcs_lqual_ranges[2].low = atoi(argv[3]);
1072 bts->mcs_lqual_ranges[2].high = atoi(argv[4]);
1073 bts->mcs_lqual_ranges[3].low = atoi(argv[5]);
1074 bts->mcs_lqual_ranges[3].high = atoi(argv[6]);
1075 bts->mcs_lqual_ranges[4].low = atoi(argv[7]);
1076 bts->mcs_lqual_ranges[4].high = atoi(argv[8]);
1077 bts->mcs_lqual_ranges[5].low = atoi(argv[9]);
1078 bts->mcs_lqual_ranges[5].high = atoi(argv[10]);
1079 bts->mcs_lqual_ranges[6].low = atoi(argv[11]);
1080 bts->mcs_lqual_ranges[6].high = atoi(argv[12]);
1081 bts->mcs_lqual_ranges[7].low = atoi(argv[13]);
1082 bts->mcs_lqual_ranges[7].high = atoi(argv[14]);
1083 bts->mcs_lqual_ranges[8].low = atoi(argv[15]);
1084
1085 return CMD_SUCCESS;
1086}
1087
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001088DEFUN(cfg_pcu_sock,
1089 cfg_pcu_sock_cmd,
1090 "pcu-socket PATH",
1091 "Configure the osmo-bts PCU socket file/path name\n"
1092 "Path of the socket to connect to\n")
1093{
1094 struct gprs_rlcmac_bts *bts = bts_main_data();
1095
1096 if (bts->pcu_sock_path) {
1097 /* FIXME: close the interface? */
1098 talloc_free(bts->pcu_sock_path);
1099 }
1100 bts->pcu_sock_path = talloc_strdup(tall_pcu_ctx, argv[0]);
1101 /* FIXME: re-open the interface? */
1102
1103 return CMD_SUCCESS;
1104}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001105
Harald Welte57d35152018-07-05 03:11:17 +02001106DEFUN(cfg_pcu_gb_dialect,
1107 cfg_pcu_gb_dialect_cmd,
1108 "gb-dialect (classic|ip-sns)",
1109 "Select which Gb interface dialect to use\n"
1110 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1111 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
1112{
1113 struct gprs_rlcmac_bts *bts = bts_main_data();
1114
1115 if (!strcmp(argv[0], "ip-sns"))
1116 bts->gb_dialect_sns = true;
1117 else
1118 bts->gb_dialect_sns = false;
1119
1120 return CMD_SUCCESS;
1121}
1122
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001123DEFUN(show_bts_timer, show_bts_timer_cmd,
1124 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1125 SHOW_STR "Show BTS controlled timers\n"
1126 OSMO_TDEF_VTY_DOC_T)
1127{
1128 struct gprs_rlcmac_bts *bts = bts_main_data();
1129 const char *T_arg = argc > 0 ? argv[0] : NULL;
1130 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, NULL);
1131}
1132
1133DEFUN(show_timer, show_timer_cmd,
1134 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1135 SHOW_STR "Show PCU timers\n"
1136 OSMO_TDEF_VTY_DOC_T)
1137{
1138 struct gprs_rlcmac_bts *bts = bts_main_data();
1139 const char *T_arg = argc > 0 ? argv[0] : NULL;
1140 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_pcu, T_arg, NULL);
1141}
1142
1143DEFUN(cfg_pcu_timer, cfg_pcu_timer_cmd,
1144 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1145 "Configure or show PCU timers\n"
1146 OSMO_TDEF_VTY_DOC_SET)
1147{
1148 struct gprs_rlcmac_bts *bts = bts_main_data();
1149 /* If any arguments are missing, redirect to 'show' */
1150 if (argc < 2)
1151 return show_timer(self, vty, argc, argv);
1152 return osmo_tdef_vty_set_cmd(vty, bts->T_defs_pcu, argv);
1153}
1154
Daniel Willmann772415f2014-01-15 17:06:51 +01001155DEFUN(show_tbf,
1156 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001157 "show tbf (all|ccch|pacch)",
1158 SHOW_STR "information about TBFs\n"
1159 "All TBFs\n"
1160 "TBFs allocated via CCCH\n"
1161 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001162{
1163 struct gprs_rlcmac_bts *bts = bts_main_data();
Max12a09872018-02-01 16:07:33 +01001164 if (!strcmp(argv[0], "all"))
1165 return pcu_vty_show_tbf_all(vty, bts, true, true);
1166
1167 if (!strcmp(argv[0], "ccch"))
1168 return pcu_vty_show_tbf_all(vty, bts_main_data(), true, false);
1169
1170 return pcu_vty_show_tbf_all(vty, bts_main_data(), false, true);
Daniel Willmann772415f2014-01-15 17:06:51 +01001171}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001172
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001173DEFUN(show_ms_all,
1174 show_ms_all_cmd,
1175 "show ms all",
1176 SHOW_STR "information about MSs\n" "All TBFs\n")
1177{
1178 struct gprs_rlcmac_bts *bts = bts_main_data();
1179 return pcu_vty_show_ms_all(vty, bts);
1180}
1181
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001182DEFUN(show_ms_tlli,
1183 show_ms_tlli_cmd,
1184 "show ms tlli TLLI",
1185 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1186{
1187 struct gprs_rlcmac_bts *bts = bts_main_data();
1188 char *endp = NULL;
1189 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1190 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1191 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1192 return CMD_WARNING;
1193 }
1194 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
1195}
1196
1197DEFUN(show_ms_imsi,
1198 show_ms_imsi_cmd,
1199 "show ms imsi IMSI",
1200 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1201{
1202 struct gprs_rlcmac_bts *bts = bts_main_data();
1203 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1204}
1205
Andreas Eversberg12942562012-07-12 14:31:57 +02001206static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001207 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1208 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001209 "License GNU GPL version 2 or later\r\n"
1210 "This is free software: you are free to change and redistribute it.\r\n"
1211 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1212
1213struct vty_app_info pcu_vty_info = {
1214 .name = "Osmo-PCU",
1215 .version = PACKAGE_VERSION,
1216 .copyright = pcu_copyright,
1217 .go_parent_cb = pcu_vty_go_parent,
1218 .is_config_node = pcu_vty_is_config_node,
1219};
1220
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001221int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001222{
1223// install_element_ve(&show_pcu_cmd);
1224
Harald Welte717cdf52017-07-21 21:56:23 +02001225 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1226 "gsmtap-category (",
1227 "|",")", VTY_DO_LOWER);
1228 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1229 "GSMTAP Category\n",
1230 "\n", "", 0);
1231 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1232 "no gsmtap-category (",
1233 "|",")", VTY_DO_LOWER);
1234 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1235 NO_STR "GSMTAP Category\n",
1236 "\n", "", 0);
1237
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001238 logging_vty_add_cmds();
1239 osmo_stats_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001240
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001241 install_node(&pcu_node, config_write_pcu);
1242 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001243 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1244 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001245 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001246 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1247 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001248 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1249 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001250 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1251 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001252 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1253 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001254 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001255 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001256 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301257 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001258 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001259 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1260 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001261 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001262 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1263 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1264 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001265 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1266 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001267 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1268 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1269 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001270 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1271 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001272 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001273 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001274 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001275 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1276 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001277 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1278 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1279 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1280 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1281 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1282 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1283 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1284 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001285 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1286 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001287 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1288 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001289 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1290 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001291 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1292 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001293 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1294 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001295 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001296 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001297 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001298
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001299 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001300 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001301 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001302 install_element_ve(&show_ms_tlli_cmd);
1303 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001304 install_element_ve(&show_bts_timer_cmd);
1305 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001306
Andreas Eversberg12942562012-07-12 14:31:57 +02001307 return 0;
1308}