blob: 0756136126402e717ceb1430830f506c77494510 [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>
Vadim Yanitskiy657a4c02019-11-30 20:15:22 +07008#include <osmocom/core/utils.h>
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02009#include <osmocom/vty/tdef_vty.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020010#include <osmocom/vty/logging.h>
Jacob Erlbeck42aba812015-11-10 15:32:00 +010011#include <osmocom/vty/stats.h>
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020012#include <osmocom/vty/misc.h>
Andreas Eversberg8b761a32012-07-20 21:50:31 +020013#include <osmocom/core/linuxlist.h>
Holger Hans Peter Freythere8915b92014-07-02 14:57:47 +020014#include <osmocom/core/rate_ctr.h>
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +020015#include <osmocom/pcu/pcuif_proto.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020016#include "pcu_vty.h"
Andreas Eversberg8b761a32012-07-20 21:50:31 +020017#include "gprs_rlcmac.h"
Max6dc90b82018-02-19 17:17:28 +010018#include <pdch.h>
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020019#include "bts.h"
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020020#include "tbf.h"
Jacob Erlbeck62e96a32015-06-04 09:42:14 +020021#include "pcu_vty_functions.h"
22
Harald Welte717cdf52017-07-21 21:56:23 +020023extern void *tall_pcu_ctx;
24
25static const struct value_string pcu_gsmtap_categ_names[] = {
26 { PCU_GSMTAP_C_DL_UNKNOWN, "dl-unknown" },
27 { PCU_GSMTAP_C_DL_DUMMY, "dl-dummy" },
28 { PCU_GSMTAP_C_DL_CTRL, "dl-ctrl" },
29 { PCU_GSMTAP_C_DL_DATA_GPRS, "dl-data-gprs" },
30 { PCU_GSMTAP_C_DL_DATA_EGPRS, "dl-data-egprs" },
Harald Weltebc219d52017-07-29 13:42:27 +020031 { PCU_GSMTAP_C_DL_PTCCH, "dl-ptcch" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020032 { PCU_GSMTAP_C_DL_AGCH, "dl-agch" },
33 { PCU_GSMTAP_C_DL_PCH, "dl-pch" },
Harald Welte717cdf52017-07-21 21:56:23 +020034
35 { PCU_GSMTAP_C_UL_UNKNOWN, "ul-unknown" },
36 { PCU_GSMTAP_C_UL_DUMMY, "ul-dummy" },
37 { PCU_GSMTAP_C_UL_CTRL, "ul-ctrl" },
38 { PCU_GSMTAP_C_UL_DATA_GPRS, "ul-data-gprs" },
39 { PCU_GSMTAP_C_UL_DATA_EGPRS, "ul-data-egprs" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020040 { PCU_GSMTAP_C_UL_RACH, "ul-rach" },
Vadim Yanitskiy07b64872020-06-11 00:26:15 +070041 { PCU_GSMTAP_C_UL_PTCCH, "ul-ptcch" },
Harald Welte717cdf52017-07-21 21:56:23 +020042
43 { 0, NULL }
44};
45
46static const struct value_string pcu_gsmtap_categ_help[] = {
47 { PCU_GSMTAP_C_DL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
48 { PCU_GSMTAP_C_DL_DUMMY, "Downlink Dummy Blocks" },
49 { PCU_GSMTAP_C_DL_CTRL, "Downlink Control Blocks" },
50 { PCU_GSMTAP_C_DL_DATA_GPRS, "Downlink Data Blocks (GPRS)" },
51 { PCU_GSMTAP_C_DL_DATA_EGPRS, "Downlink Data Blocks (EGPRS)" },
Harald Weltebc219d52017-07-29 13:42:27 +020052 { PCU_GSMTAP_C_DL_PTCCH, "Downlink PTCCH Blocks" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020053 { PCU_GSMTAP_C_DL_AGCH, "Downlink AGCH Blocks" },
54 { PCU_GSMTAP_C_DL_PCH, "Downlink PCH Blocks" },
Harald Welte717cdf52017-07-21 21:56:23 +020055
56 { PCU_GSMTAP_C_UL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
57 { PCU_GSMTAP_C_UL_DUMMY, "Uplink Dummy Blocks" },
58 { PCU_GSMTAP_C_UL_CTRL, "Uplink Control Blocks" },
59 { PCU_GSMTAP_C_UL_DATA_GPRS, "Uplink Data Blocks (GPRS)" },
60 { PCU_GSMTAP_C_UL_DATA_EGPRS, "Uplink Data Blocks (EGPRS)" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020061 { PCU_GSMTAP_C_UL_RACH, "Uplink RACH Bursts" },
Vadim Yanitskiy07b64872020-06-11 00:26:15 +070062 { PCU_GSMTAP_C_UL_PTCCH, "Uplink PTCCH Bursts" },
Harald Welte717cdf52017-07-21 21:56:23 +020063
64 { 0, NULL }
65};
66
67
68DEFUN(cfg_pcu_gsmtap_categ, cfg_pcu_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
69{
70 struct gprs_rlcmac_bts *bts = bts_main_data();
71 int categ;
72
73 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
74 if (categ < 0)
75 return CMD_WARNING;
76
77 bts->gsmtap_categ_mask |= (1 << categ);
78
79 return CMD_SUCCESS;
80}
81
82DEFUN(cfg_pcu_no_gsmtap_categ, cfg_pcu_no_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
83{
84 struct gprs_rlcmac_bts *bts = bts_main_data();
85 int categ;
86
87 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
88 if (categ < 0)
89 return CMD_WARNING;
90
91 bts->gsmtap_categ_mask &= ~(1 << categ);
92
93 return CMD_SUCCESS;
94}
95
Andreas Eversberg8b761a32012-07-20 21:50:31 +020096static struct cmd_node pcu_node = {
97 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +020098 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +020099 1,
100};
101
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200102static int config_write_pcu(struct vty *vty)
103{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200104 struct gprs_rlcmac_bts *bts = bts_main_data();
Harald Welte717cdf52017-07-21 21:56:23 +0200105 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200106
107 vty_out(vty, "pcu%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200108 if (bts->egprs_enabled)
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100109 vty_out(vty, " egprs only%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200110
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200111 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
112 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200113 if (bts->fc_bvc_bucket_size)
114 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
115 bts->fc_bvc_bucket_size, VTY_NEWLINE);
116 if (bts->fc_bvc_leak_rate)
117 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
118 bts->fc_bvc_leak_rate, VTY_NEWLINE);
119 if (bts->fc_ms_bucket_size)
120 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
121 bts->fc_ms_bucket_size, VTY_NEWLINE);
122 if (bts->fc_ms_leak_rate)
123 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
124 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200125 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +0200126 if (bts->initial_cs_ul == bts->initial_cs_dl)
127 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
128 VTY_NEWLINE);
129 else
130 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
131 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200132 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200133 if (bts->max_cs_dl && bts->max_cs_ul) {
134 if (bts->max_cs_ul == bts->max_cs_dl)
135 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
136 VTY_NEWLINE);
137 else
138 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
139 bts->max_cs_ul, VTY_NEWLINE);
140 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200141 if (bts->cs_adj_enabled)
142 vty_out(vty, " cs threshold %d %d%s",
143 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
144 VTY_NEWLINE);
145 else
146 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
147
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200148 if (bts->cs_downgrade_threshold)
149 vty_out(vty, " cs downgrade-threshold %d%s",
150 bts->cs_downgrade_threshold, VTY_NEWLINE);
151 else
152 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
153
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200154 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
155 bts->cs_lqual_ranges[0].high,
156 bts->cs_lqual_ranges[1].low,
157 bts->cs_lqual_ranges[1].high,
158 bts->cs_lqual_ranges[2].low,
159 bts->cs_lqual_ranges[2].high,
160 bts->cs_lqual_ranges[3].low,
161 VTY_NEWLINE);
162
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400163 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",
164 bts->mcs_lqual_ranges[0].high,
165 bts->mcs_lqual_ranges[1].low,
166 bts->mcs_lqual_ranges[1].high,
167 bts->mcs_lqual_ranges[2].low,
168 bts->mcs_lqual_ranges[2].high,
169 bts->mcs_lqual_ranges[3].low,
170 bts->mcs_lqual_ranges[3].high,
171 bts->mcs_lqual_ranges[4].low,
172 bts->mcs_lqual_ranges[4].high,
173 bts->mcs_lqual_ranges[5].low,
174 bts->mcs_lqual_ranges[5].high,
175 bts->mcs_lqual_ranges[6].low,
176 bts->mcs_lqual_ranges[6].high,
177 bts->mcs_lqual_ranges[7].low,
178 bts->mcs_lqual_ranges[7].high,
179 bts->mcs_lqual_ranges[8].low,
180 VTY_NEWLINE);
181
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100182 if (bts->initial_mcs_dl != 1 && bts->initial_mcs_ul != 1) {
183 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
184 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
185 VTY_NEWLINE);
186 else
187 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
188 bts->initial_mcs_ul, VTY_NEWLINE);
189 }
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400190
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100191 if (bts->max_mcs_dl && bts->max_mcs_ul) {
192 if (bts->max_mcs_ul == bts->max_mcs_dl)
193 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
194 VTY_NEWLINE);
195 else
196 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
197 bts->max_mcs_ul, VTY_NEWLINE);
198 }
199
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100200 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
201 VTY_NEWLINE);
202
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530203 if (bts->dl_arq_type)
204 vty_out(vty, " egprs dl arq-type arq2%s",
205 VTY_NEWLINE);
206
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200207 if (bts->force_llc_lifetime == 0xffff)
208 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
209 else if (bts->force_llc_lifetime)
210 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
211 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100212 if (bts->llc_discard_csec)
213 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
214 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200215 if (bts->llc_idle_ack_csec)
216 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
217 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200218 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
219 vty_out(vty, " queue codel%s", VTY_NEWLINE);
220 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
221 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
222 else
223 vty_out(vty, " queue codel interval %d%s",
224 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
225
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200226 if (bts->alloc_algorithm == alloc_algorithm_a)
227 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
228 if (bts->alloc_algorithm == alloc_algorithm_b)
229 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200230 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
231 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200232 if (bts->force_two_phase)
233 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200234 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
235 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Oliver Smith45fdc442019-09-05 15:12:20 +0200236 if (!bts->dl_tbf_preemptive_retransmission)
237 vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200238 if (strcmp(bts->pcu_sock_path, PCU_SOCK_DEFAULT))
239 vty_out(vty, " pcu-socket %s%s", bts->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200240
Harald Welte717cdf52017-07-21 21:56:23 +0200241 for (i = 0; i < 32; i++) {
242 unsigned int cs = (1 << i);
243 if (bts->gsmtap_categ_mask & cs) {
244 vty_out(vty, " gsmtap-category %s%s",
245 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
246 }
247 }
248
Harald Welte57d35152018-07-05 03:11:17 +0200249 if (bts->gb_dialect_sns)
250 vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);
251 else
252 vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);
253
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200254 osmo_tdef_vty_write(vty, bts->T_defs_pcu, " timer ");
255
Maxc9ce6f92018-01-30 17:53:02 +0100256 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200257}
258
259/* per-BTS configuration */
260DEFUN(cfg_pcu,
261 cfg_pcu_cmd,
262 "pcu",
263 "BTS specific configure")
264{
265 vty->node = PCU_NODE;
266
267 return CMD_SUCCESS;
268}
269
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200270#define EGPRS_STR "EGPRS configuration\n"
271
272DEFUN(cfg_pcu_egprs,
273 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100274 "egprs only",
275 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200276{
277 struct gprs_rlcmac_bts *bts = bts_main_data();
278
279 bts->egprs_enabled = 1;
280
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200281 return CMD_SUCCESS;
282}
283
284DEFUN(cfg_pcu_no_egprs,
285 cfg_pcu_no_egprs_cmd,
286 "no egprs",
287 NO_STR EGPRS_STR)
288{
289 struct gprs_rlcmac_bts *bts = bts_main_data();
290
291 bts->egprs_enabled = 0;
292
293 return CMD_SUCCESS;
294}
295
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200296DEFUN(cfg_pcu_fc_interval,
297 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200298 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200299 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200300 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200301{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200302 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200303
304 bts->fc_interval = atoi(argv[0]);
305
306 return CMD_SUCCESS;
307}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200308#define FC_STR "BSSGP Flow Control configuration\n"
309#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
310#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
311
312DEFUN(cfg_pcu_fc_bvc_bucket_size,
313 cfg_pcu_fc_bvc_bucket_size_cmd,
314 "flow-control force-bvc-bucket-size <1-6553500>",
315 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
316{
317 struct gprs_rlcmac_bts *bts = bts_main_data();
318
319 bts->fc_bvc_bucket_size = atoi(argv[0]);
320
321 return CMD_SUCCESS;
322}
323
324DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
325 cfg_pcu_no_fc_bvc_bucket_size_cmd,
326 "no flow-control force-bvc-bucket-size",
327 NO_STR FC_STR FC_BMAX_STR("BVC"))
328{
329 struct gprs_rlcmac_bts *bts = bts_main_data();
330
331 bts->fc_bvc_bucket_size = 0;
332
333 return CMD_SUCCESS;
334}
335
336DEFUN(cfg_pcu_fc_bvc_leak_rate,
337 cfg_pcu_fc_bvc_leak_rate_cmd,
338 "flow-control force-bvc-leak-rate <1-6553500>",
339 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
340{
341 struct gprs_rlcmac_bts *bts = bts_main_data();
342
343 bts->fc_bvc_leak_rate = atoi(argv[0]);
344
345 return CMD_SUCCESS;
346}
347
348DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
349 cfg_pcu_no_fc_bvc_leak_rate_cmd,
350 "no flow-control force-bvc-leak-rate",
351 NO_STR FC_STR FC_LR_STR("BVC"))
352{
353 struct gprs_rlcmac_bts *bts = bts_main_data();
354
355 bts->fc_bvc_leak_rate = 0;
356
357 return CMD_SUCCESS;
358}
359
360DEFUN(cfg_pcu_fc_ms_bucket_size,
361 cfg_pcu_fc_ms_bucket_size_cmd,
362 "flow-control force-ms-bucket-size <1-6553500>",
363 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
364{
365 struct gprs_rlcmac_bts *bts = bts_main_data();
366
367 bts->fc_ms_bucket_size = atoi(argv[0]);
368
369 return CMD_SUCCESS;
370}
371
372DEFUN(cfg_pcu_no_fc_ms_bucket_size,
373 cfg_pcu_no_fc_ms_bucket_size_cmd,
374 "no flow-control force-ms-bucket-size",
375 NO_STR FC_STR FC_BMAX_STR("default MS"))
376{
377 struct gprs_rlcmac_bts *bts = bts_main_data();
378
379 bts->fc_ms_bucket_size = 0;
380
381 return CMD_SUCCESS;
382}
383
384DEFUN(cfg_pcu_fc_ms_leak_rate,
385 cfg_pcu_fc_ms_leak_rate_cmd,
386 "flow-control force-ms-leak-rate <1-6553500>",
387 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
388{
389 struct gprs_rlcmac_bts *bts = bts_main_data();
390
391 bts->fc_ms_leak_rate = atoi(argv[0]);
392
393 return CMD_SUCCESS;
394}
395
396DEFUN(cfg_pcu_no_fc_ms_leak_rate,
397 cfg_pcu_no_fc_ms_leak_rate_cmd,
398 "no flow-control force-ms-leak-rate",
399 NO_STR FC_STR FC_LR_STR("default MS"))
400{
401 struct gprs_rlcmac_bts *bts = bts_main_data();
402
403 bts->fc_ms_leak_rate = 0;
404
405 return CMD_SUCCESS;
406}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200407
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200408#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
409DEFUN(cfg_pcu_fc_bucket_time,
410 cfg_pcu_fc_bucket_time_cmd,
411 "flow-control bucket-time <1-65534>",
412 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
413{
414 struct gprs_rlcmac_bts *bts = bts_main_data();
415
416 bts->fc_bucket_time = atoi(argv[0]);
417
418 return CMD_SUCCESS;
419}
420
421DEFUN(cfg_pcu_no_fc_bucket_time,
422 cfg_pcu_no_fc_bucket_time_cmd,
423 "no flow-control bucket-time",
424 NO_STR FC_STR FC_BTIME_STR)
425{
426 struct gprs_rlcmac_bts *bts = bts_main_data();
427
428 bts->fc_bucket_time = 0;
429
430 return CMD_SUCCESS;
431}
432
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200433#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200434
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200435DEFUN(cfg_pcu_cs,
436 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200437 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200438 CS_STR
439 "Initial CS value to be used (overrides BTS config)\n"
440 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200441{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200442 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200443 uint8_t cs = atoi(argv[0]);
444
445 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200446 bts->initial_cs_dl = cs;
447 if (argc > 1)
448 bts->initial_cs_ul = atoi(argv[1]);
449 else
450 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200451
452 return CMD_SUCCESS;
453}
454
455DEFUN(cfg_pcu_no_cs,
456 cfg_pcu_no_cs_cmd,
457 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200458 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200459{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200460 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200461
462 bts->force_cs = 0;
463
464 return CMD_SUCCESS;
465}
466
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100467#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200468DEFUN(cfg_pcu_cs_max,
469 cfg_pcu_cs_max_cmd,
470 "cs max <1-4> [<1-4>]",
471 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100472 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200473 "Maximum CS value to be used\n"
474 "Use a different maximum CS value for the uplink")
475{
476 struct gprs_rlcmac_bts *bts = bts_main_data();
477 uint8_t cs = atoi(argv[0]);
478
479 bts->max_cs_dl = cs;
480 if (argc > 1)
481 bts->max_cs_ul = atoi(argv[1]);
482 else
483 bts->max_cs_ul = cs;
484
485 return CMD_SUCCESS;
486}
487
488DEFUN(cfg_pcu_no_cs_max,
489 cfg_pcu_no_cs_max_cmd,
490 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100491 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200492{
493 struct gprs_rlcmac_bts *bts = bts_main_data();
494
495 bts->max_cs_dl = 0;
496 bts->max_cs_ul = 0;
497
498 return CMD_SUCCESS;
499}
500
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100501#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
502
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100503DEFUN(cfg_pcu_mcs,
504 cfg_pcu_mcs_cmd,
505 "mcs <1-9> [<1-9>]",
506 MCS_STR
507 "Initial MCS value to be used (default 1)\n"
508 "Use a different initial MCS value for the uplink")
509{
510 struct gprs_rlcmac_bts *bts = bts_main_data();
511 uint8_t cs = atoi(argv[0]);
512
513 bts->initial_mcs_dl = cs;
514 if (argc > 1)
515 bts->initial_mcs_ul = atoi(argv[1]);
516 else
517 bts->initial_mcs_ul = cs;
518
519 return CMD_SUCCESS;
520}
521
522DEFUN(cfg_pcu_no_mcs,
523 cfg_pcu_no_mcs_cmd,
524 "no mcs",
525 NO_STR MCS_STR)
526{
527 struct gprs_rlcmac_bts *bts = bts_main_data();
528
529 bts->initial_mcs_dl = 1;
530 bts->initial_mcs_ul = 1;
531
532 return CMD_SUCCESS;
533}
534
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100535DEFUN(cfg_pcu_mcs_max,
536 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100537 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100538 MCS_STR
539 CS_MAX_STR
540 "Maximum MCS value to be used\n"
541 "Use a different maximum MCS value for the uplink")
542{
543 struct gprs_rlcmac_bts *bts = bts_main_data();
544 uint8_t mcs = atoi(argv[0]);
545
546 bts->max_mcs_dl = mcs;
547 if (argc > 1)
548 bts->max_mcs_ul = atoi(argv[1]);
549 else
550 bts->max_mcs_ul = mcs;
551
552 return CMD_SUCCESS;
553}
554
555DEFUN(cfg_pcu_no_mcs_max,
556 cfg_pcu_no_mcs_max_cmd,
557 "no mcs max",
558 NO_STR MCS_STR CS_MAX_STR)
559{
560 struct gprs_rlcmac_bts *bts = bts_main_data();
561
562 bts->max_mcs_dl = 0;
563 bts->max_mcs_ul = 0;
564
565 return CMD_SUCCESS;
566}
567
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530568#define DL_STR "downlink specific configuration\n"
569
570DEFUN(cfg_pcu_dl_arq_type,
571 cfg_pcu_dl_arq_cmd,
572 "egprs dl arq-type (spb|arq2)",
573 EGPRS_STR DL_STR "ARQ options\n"
574 "enable SPB(ARQ1) support\n"
575 "enable ARQ2 support")
576{
577 struct gprs_rlcmac_bts *bts = bts_main_data();
578
579 if (!strcmp(argv[0], "arq2"))
580 bts->dl_arq_type = 1;
581 else
582 bts->dl_arq_type = 0;
583
584 return CMD_SUCCESS;
585}
586
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100587DEFUN(cfg_pcu_window_size,
588 cfg_pcu_window_size_cmd,
589 "window-size <0-1024> [<0-256>]",
590 "Window size configuration (b + N_PDCH * f)\n"
591 "Base value (b)\n"
592 "Factor for number of PDCH (f)")
593{
594 struct gprs_rlcmac_bts *bts = bts_main_data();
595 uint16_t b = atoi(argv[0]);
596
597 bts->ws_base = b;
598 if (argc > 1) {
599 uint16_t f = atoi(argv[1]);
600 bts->ws_pdch = f;
601 }
602
603 return CMD_SUCCESS;
604}
605
606
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200607#define QUEUE_STR "Packet queue options\n"
608#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
609 "(overrides the value given by SGSN)\n"
610
611DEFUN(cfg_pcu_queue_lifetime,
612 cfg_pcu_queue_lifetime_cmd,
613 "queue lifetime <1-65534>",
614 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
615{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200616 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200617 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200618
619 bts->force_llc_lifetime = csec;
620
621 return CMD_SUCCESS;
622}
623
624DEFUN(cfg_pcu_queue_lifetime_inf,
625 cfg_pcu_queue_lifetime_inf_cmd,
626 "queue lifetime infinite",
627 QUEUE_STR LIFETIME_STR "Infinite lifetime")
628{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200629 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200630
631 bts->force_llc_lifetime = 0xffff;
632
633 return CMD_SUCCESS;
634}
635
636DEFUN(cfg_pcu_no_queue_lifetime,
637 cfg_pcu_no_queue_lifetime_cmd,
638 "no queue lifetime",
639 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
640 "by SGSN)\n")
641{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200642 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200643
644 bts->force_llc_lifetime = 0;
645
646 return CMD_SUCCESS;
647}
648
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100649#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
650 "(continue discarding until lifetime-hysteresis is reached)\n"
651
652DEFUN(cfg_pcu_queue_hysteresis,
653 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200654 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100655 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
656{
657 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200658 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100659
660 bts->llc_discard_csec = csec;
661
662 return CMD_SUCCESS;
663}
664
665DEFUN(cfg_pcu_no_queue_hysteresis,
666 cfg_pcu_no_queue_hysteresis_cmd,
667 "no queue hysteresis",
668 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
669{
670 struct gprs_rlcmac_bts *bts = bts_main_data();
671
672 bts->llc_discard_csec = 0;
673
674 return CMD_SUCCESS;
675}
676
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200677#define QUEUE_CODEL_STR "Set CoDel queue management\n"
678
679DEFUN(cfg_pcu_queue_codel,
680 cfg_pcu_queue_codel_cmd,
681 "queue codel",
682 QUEUE_STR QUEUE_CODEL_STR)
683{
684 struct gprs_rlcmac_bts *bts = bts_main_data();
685
686 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
687
688 return CMD_SUCCESS;
689}
690
691DEFUN(cfg_pcu_queue_codel_interval,
692 cfg_pcu_queue_codel_interval_cmd,
693 "queue codel interval <1-1000>",
694 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
695{
696 struct gprs_rlcmac_bts *bts = bts_main_data();
697 uint16_t csec = atoi(argv[0]);
698
699 bts->llc_codel_interval_msec = 10*csec;
700
701 return CMD_SUCCESS;
702}
703
704DEFUN(cfg_pcu_no_queue_codel,
705 cfg_pcu_no_queue_codel_cmd,
706 "no queue codel",
707 NO_STR QUEUE_STR QUEUE_CODEL_STR)
708{
709 struct gprs_rlcmac_bts *bts = bts_main_data();
710
711 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
712
713 return CMD_SUCCESS;
714}
715
716
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200717#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
718
719DEFUN(cfg_pcu_queue_idle_ack_delay,
720 cfg_pcu_queue_idle_ack_delay_cmd,
721 "queue idle-ack-delay <1-65535>",
722 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
723{
724 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200725 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200726
727 bts->llc_idle_ack_csec = csec;
728
729 return CMD_SUCCESS;
730}
731
732DEFUN(cfg_pcu_no_queue_idle_ack_delay,
733 cfg_pcu_no_queue_idle_ack_delay_cmd,
734 "no queue idle-ack-delay",
735 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
736{
737 struct gprs_rlcmac_bts *bts = bts_main_data();
738
739 bts->llc_idle_ack_csec = 0;
740
741 return CMD_SUCCESS;
742}
743
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100744
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200745DEFUN(cfg_pcu_alloc,
746 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200747 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200748 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200749 "PACCH\n"
750 "Single slot is assigned only\n"
751 "Multiple slots are assigned for semi-duplex operation\n"
752 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200753{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200754 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200755
756 switch (argv[0][0]) {
757 case 'a':
758 bts->alloc_algorithm = alloc_algorithm_a;
759 break;
760 case 'b':
761 bts->alloc_algorithm = alloc_algorithm_b;
762 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200763 default:
764 bts->alloc_algorithm = alloc_algorithm_dynamic;
765 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200766 }
767
768 return CMD_SUCCESS;
769}
770
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200771DEFUN(cfg_pcu_two_phase,
772 cfg_pcu_two_phase_cmd,
773 "two-phase-access",
774 "Force two phase access when MS requests single phase access\n")
775{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200776 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200777
778 bts->force_two_phase = 1;
779
780 return CMD_SUCCESS;
781}
782
783DEFUN(cfg_pcu_no_two_phase,
784 cfg_pcu_no_two_phase_cmd,
785 "no two-phase-access",
786 NO_STR "Only use two phase access when requested my MS\n")
787{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200788 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200789
790 bts->force_two_phase = 0;
791
792 return CMD_SUCCESS;
793}
794
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200795DEFUN(cfg_pcu_alpha,
796 cfg_pcu_alpha_cmd,
797 "alpha <0-10>",
798 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
799 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
800 "Alpha in units of 0.1\n")
801{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200802 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200803
804 bts->alpha = atoi(argv[0]);
805
806 return CMD_SUCCESS;
807}
808
809DEFUN(cfg_pcu_gamma,
810 cfg_pcu_gamma_cmd,
811 "gamma <0-62>",
812 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
813 "Gamma in even unit of dBs\n")
814{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200815 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200816
817 bts->gamma = atoi(argv[0]) / 2;
818
819 return CMD_SUCCESS;
820}
821
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100822DEFUN(show_bts_stats,
823 show_bts_stats_cmd,
824 "show bts statistics",
825 SHOW_STR "BTS related functionality\nStatistics\n")
826{
827 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
828 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100829}
830
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +0200831DEFUN(show_bts_pdch,
832 show_bts_pdch_cmd,
833 "show bts pdch",
834 SHOW_STR "BTS related functionality\nPDCH timeslots\n")
835{
836 return pcu_vty_show_bts_pdch(vty, bts_main_data());
837}
838
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100839#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200840DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100841 cfg_pcu_dl_tbf_idle_time_cmd,
842 "dl-tbf-idle-time <1-5000>",
843 IDLE_TIME_STR "idle time in msec")
844{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200845 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
846
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100847 struct gprs_rlcmac_bts *bts = bts_main_data();
848
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200849 if (osmo_tdef_set(bts->T_defs_pcu, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
850 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100851 return CMD_SUCCESS;
852}
853
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200854DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100855 cfg_pcu_no_dl_tbf_idle_time_cmd,
856 "no dl-tbf-idle-time",
857 NO_STR IDLE_TIME_STR)
858{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200859 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' 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, 0, OSMO_TDEF_MS) < 0)
864 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100865 return CMD_SUCCESS;
866}
867
Oliver Smith45fdc442019-09-05 15:12:20 +0200868#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
869 " less readable traces)"
870DEFUN(cfg_pcu_dl_tbf_preemptive_retransmission,
871 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
872 "dl-tbf-preemptive-retransmission",
873 RETRANSMISSION_STR " (enabled by default)")
874{
875 struct gprs_rlcmac_bts *bts = bts_main_data();
876
877 bts->dl_tbf_preemptive_retransmission = true;
878
879 return CMD_SUCCESS;
880}
881
882DEFUN(cfg_pcu_no_dl_tbf_preemptive_retransmission,
883 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
884 "no dl-tbf-preemptive-retransmission",
885 NO_STR RETRANSMISSION_STR)
886{
887 struct gprs_rlcmac_bts *bts = bts_main_data();
888
889 bts->dl_tbf_preemptive_retransmission = false;
890
891 return CMD_SUCCESS;
892}
893
Jacob Erlbecka098c192015-05-28 16:11:19 +0200894#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200895DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200896 cfg_pcu_ms_idle_time_cmd,
897 "ms-idle-time <1-7200>",
898 MS_IDLE_TIME_STR "idle time in sec")
899{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200900 vty_out(vty, "%% 'ms-idle-time' is now deprecated: use 'timer X2030 <val>' instead%s", VTY_NEWLINE);
901
Jacob Erlbecka098c192015-05-28 16:11:19 +0200902 struct gprs_rlcmac_bts *bts = bts_main_data();
903
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200904 if (osmo_tdef_set(bts->T_defs_pcu, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
905 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200906 return CMD_SUCCESS;
907}
908
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200909DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200910 cfg_pcu_no_ms_idle_time_cmd,
911 "no ms-idle-time",
912 NO_STR MS_IDLE_TIME_STR)
913{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200914 vty_out(vty, "%% 'no ms-idle-time' is now deprecated: use 'timer X2030 0' 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, 0, OSMO_TDEF_S) < 0)
919 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200920 return CMD_SUCCESS;
921}
922
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100923#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200924DEFUN(cfg_pcu_cs_err_limits,
925 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200926 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200927 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
928{
929 struct gprs_rlcmac_bts *bts = bts_main_data();
930
931 uint8_t lower_limit = atoi(argv[0]);
932 uint8_t upper_limit = atoi(argv[1]);
933
934 if (lower_limit > upper_limit) {
935 vty_out(vty,
936 "The lower limit must be less than or equal to the "
937 "upper limit.%s", VTY_NEWLINE);
938 return CMD_WARNING;
939 }
940
941 bts->cs_adj_enabled = 1;
942 bts->cs_adj_upper_limit = upper_limit;
943 bts->cs_adj_lower_limit = lower_limit;
944
945 return CMD_SUCCESS;
946}
947
948DEFUN(cfg_pcu_no_cs_err_limits,
949 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200950 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200951 NO_STR CS_STR CS_ERR_LIMITS_STR)
952{
953 struct gprs_rlcmac_bts *bts = bts_main_data();
954
955 bts->cs_adj_enabled = 0;
956 bts->cs_adj_upper_limit = 100;
957 bts->cs_adj_lower_limit = 0;
958
959 return CMD_SUCCESS;
960}
961
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100962#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200963DEFUN(cfg_pcu_cs_downgrade_thrsh,
964 cfg_pcu_cs_downgrade_thrsh_cmd,
965 "cs downgrade-threshold <1-10000>",
966 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
967{
968 struct gprs_rlcmac_bts *bts = bts_main_data();
969
970 bts->cs_downgrade_threshold = atoi(argv[0]);
971
972 return CMD_SUCCESS;
973}
974
975DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
976 cfg_pcu_no_cs_downgrade_thrsh_cmd,
977 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200978 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200979{
980 struct gprs_rlcmac_bts *bts = bts_main_data();
981
982 bts->cs_downgrade_threshold = 0;
983
984 return CMD_SUCCESS;
985}
986
987
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200988DEFUN(cfg_pcu_cs_lqual_ranges,
989 cfg_pcu_cs_lqual_ranges_cmd,
990 "cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35> cs3 <0-35> <0-35> cs4 <0-35>",
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100991 CS_STR "Set link quality ranges for each uplink CS\n"
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200992 "Set quality range for CS-1 (high value only)\n"
993 "CS-1 high (dB)\n"
994 "Set quality range for CS-2\n"
995 "CS-2 low (dB)\n"
996 "CS-2 high (dB)\n"
997 "Set quality range for CS-3\n"
998 "CS-3 low (dB)\n"
999 "CS-3 high (dB)\n"
1000 "Set quality range for CS-4 (low value only)\n"
1001 "CS-4 low (dB)\n")
1002{
1003 struct gprs_rlcmac_bts *bts = bts_main_data();
1004
1005 uint8_t cs1_high = atoi(argv[0]);
1006 uint8_t cs2_low = atoi(argv[1]);
1007 uint8_t cs2_high = atoi(argv[2]);
1008 uint8_t cs3_low = atoi(argv[3]);
1009 uint8_t cs3_high = atoi(argv[4]);
1010 uint8_t cs4_low = atoi(argv[5]);
1011
1012 bts->cs_lqual_ranges[0].high = cs1_high;
1013 bts->cs_lqual_ranges[1].low = cs2_low;
1014 bts->cs_lqual_ranges[1].high = cs2_high;
1015 bts->cs_lqual_ranges[2].low = cs3_low;
1016 bts->cs_lqual_ranges[2].high = cs3_high;
1017 bts->cs_lqual_ranges[3].low = cs4_low;
1018
1019 return CMD_SUCCESS;
1020}
1021
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001022DEFUN(cfg_pcu_mcs_lqual_ranges,
1023 cfg_pcu_mcs_lqual_ranges_cmd,
1024 "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>",
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +01001025 CS_STR "Set link quality ranges for each uplink MCS\n"
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001026 "Set quality range for MCS-1 (high value only)\n"
1027 "MCS-1 high (dB)\n"
1028 "Set quality range for MCS-2\n"
1029 "MCS-2 high (dB)\n"
1030 "MCS-2 low (dB)\n"
1031 "Set quality range for MCS-3\n"
1032 "MCS-3 high (dB)\n"
1033 "MCS-3 low (dB)\n"
1034 "Set quality range for MCS-4\n"
1035 "MCS-4 high (dB)\n"
1036 "MCS-4 low (dB)\n"
1037 "Set quality range for MCS-5\n"
1038 "MCS-5 high (dB)\n"
1039 "MCS-5 low (dB)\n"
1040 "Set quality range for MCS-6\n"
1041 "MCS-6 low (dB)\n"
1042 "MCS-6 high (dB)\n"
1043 "Set quality range for MCS-7\n"
1044 "MCS-7 low (dB)\n"
1045 "MCS-7 high (dB)\n"
1046 "Set quality range for MCS-8\n"
1047 "MCS-8 low (dB)\n"
1048 "MCS-8 high (dB)\n"
1049 "Set quality range for MCS-9 (low value only)\n"
1050 "MCS-9 low (dB)\n")
1051{
1052 struct gprs_rlcmac_bts *bts = bts_main_data();
1053
1054 bts->mcs_lqual_ranges[0].high = atoi(argv[0]);
1055 bts->mcs_lqual_ranges[1].low = atoi(argv[1]);
1056 bts->mcs_lqual_ranges[1].high = atoi(argv[2]);
1057 bts->mcs_lqual_ranges[2].low = atoi(argv[3]);
1058 bts->mcs_lqual_ranges[2].high = atoi(argv[4]);
1059 bts->mcs_lqual_ranges[3].low = atoi(argv[5]);
1060 bts->mcs_lqual_ranges[3].high = atoi(argv[6]);
1061 bts->mcs_lqual_ranges[4].low = atoi(argv[7]);
1062 bts->mcs_lqual_ranges[4].high = atoi(argv[8]);
1063 bts->mcs_lqual_ranges[5].low = atoi(argv[9]);
1064 bts->mcs_lqual_ranges[5].high = atoi(argv[10]);
1065 bts->mcs_lqual_ranges[6].low = atoi(argv[11]);
1066 bts->mcs_lqual_ranges[6].high = atoi(argv[12]);
1067 bts->mcs_lqual_ranges[7].low = atoi(argv[13]);
1068 bts->mcs_lqual_ranges[7].high = atoi(argv[14]);
1069 bts->mcs_lqual_ranges[8].low = atoi(argv[15]);
1070
1071 return CMD_SUCCESS;
1072}
1073
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001074DEFUN(cfg_pcu_sock,
1075 cfg_pcu_sock_cmd,
1076 "pcu-socket PATH",
1077 "Configure the osmo-bts PCU socket file/path name\n"
1078 "Path of the socket to connect to\n")
1079{
1080 struct gprs_rlcmac_bts *bts = bts_main_data();
1081
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +07001082 if (vty->type != VTY_FILE)
1083 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
1084
Vadim Yanitskiy657a4c02019-11-30 20:15:22 +07001085 osmo_talloc_replace_string(tall_pcu_ctx, &bts->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001086
1087 return CMD_SUCCESS;
1088}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001089
Harald Welte57d35152018-07-05 03:11:17 +02001090DEFUN(cfg_pcu_gb_dialect,
1091 cfg_pcu_gb_dialect_cmd,
1092 "gb-dialect (classic|ip-sns)",
1093 "Select which Gb interface dialect to use\n"
1094 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1095 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
1096{
1097 struct gprs_rlcmac_bts *bts = bts_main_data();
1098
1099 if (!strcmp(argv[0], "ip-sns"))
1100 bts->gb_dialect_sns = true;
1101 else
1102 bts->gb_dialect_sns = false;
1103
1104 return CMD_SUCCESS;
1105}
1106
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001107DEFUN(show_bts_timer, show_bts_timer_cmd,
1108 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1109 SHOW_STR "Show BTS controlled timers\n"
1110 OSMO_TDEF_VTY_DOC_T)
1111{
1112 struct gprs_rlcmac_bts *bts = bts_main_data();
1113 const char *T_arg = argc > 0 ? argv[0] : NULL;
1114 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, NULL);
1115}
1116
1117DEFUN(show_timer, show_timer_cmd,
1118 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1119 SHOW_STR "Show PCU timers\n"
1120 OSMO_TDEF_VTY_DOC_T)
1121{
1122 struct gprs_rlcmac_bts *bts = bts_main_data();
1123 const char *T_arg = argc > 0 ? argv[0] : NULL;
1124 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_pcu, T_arg, NULL);
1125}
1126
1127DEFUN(cfg_pcu_timer, cfg_pcu_timer_cmd,
1128 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1129 "Configure or show PCU timers\n"
1130 OSMO_TDEF_VTY_DOC_SET)
1131{
1132 struct gprs_rlcmac_bts *bts = bts_main_data();
1133 /* If any arguments are missing, redirect to 'show' */
1134 if (argc < 2)
1135 return show_timer(self, vty, argc, argv);
1136 return osmo_tdef_vty_set_cmd(vty, bts->T_defs_pcu, argv);
1137}
1138
Daniel Willmann772415f2014-01-15 17:06:51 +01001139DEFUN(show_tbf,
1140 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001141 "show tbf (all|ccch|pacch)",
1142 SHOW_STR "information about TBFs\n"
1143 "All TBFs\n"
1144 "TBFs allocated via CCCH\n"
1145 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001146{
1147 struct gprs_rlcmac_bts *bts = bts_main_data();
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001148 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001149
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001150 if (argv[0][0] == 'c')
1151 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1152 else if (argv[0][0] == 'p')
1153 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001154
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001155 return pcu_vty_show_tbf_all(vty, bts, flags);
Daniel Willmann772415f2014-01-15 17:06:51 +01001156}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001157
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001158DEFUN(show_ms_all,
1159 show_ms_all_cmd,
1160 "show ms all",
1161 SHOW_STR "information about MSs\n" "All TBFs\n")
1162{
1163 struct gprs_rlcmac_bts *bts = bts_main_data();
1164 return pcu_vty_show_ms_all(vty, bts);
1165}
1166
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001167DEFUN(show_ms_tlli,
1168 show_ms_tlli_cmd,
1169 "show ms tlli TLLI",
1170 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1171{
1172 struct gprs_rlcmac_bts *bts = bts_main_data();
1173 char *endp = NULL;
1174 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1175 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1176 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1177 return CMD_WARNING;
1178 }
1179 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
1180}
1181
1182DEFUN(show_ms_imsi,
1183 show_ms_imsi_cmd,
1184 "show ms imsi IMSI",
1185 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1186{
1187 struct gprs_rlcmac_bts *bts = bts_main_data();
1188 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1189}
1190
Andreas Eversberg12942562012-07-12 14:31:57 +02001191static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001192 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1193 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001194 "License GNU GPL version 2 or later\r\n"
1195 "This is free software: you are free to change and redistribute it.\r\n"
1196 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1197
1198struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001199 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001200 .version = PACKAGE_VERSION,
1201 .copyright = pcu_copyright,
Andreas Eversberg12942562012-07-12 14:31:57 +02001202};
1203
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001204int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001205{
1206// install_element_ve(&show_pcu_cmd);
1207
Harald Welte717cdf52017-07-21 21:56:23 +02001208 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1209 "gsmtap-category (",
1210 "|",")", VTY_DO_LOWER);
1211 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1212 "GSMTAP Category\n",
1213 "\n", "", 0);
1214 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1215 "no gsmtap-category (",
1216 "|",")", VTY_DO_LOWER);
1217 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1218 NO_STR "GSMTAP Category\n",
1219 "\n", "", 0);
1220
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001221 logging_vty_add_cmds();
1222 osmo_stats_vty_add_cmds();
Vadim Yanitskiyd83c8ff2020-02-06 16:46:17 +07001223 osmo_talloc_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001224
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001225 install_node(&pcu_node, config_write_pcu);
1226 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001227 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1228 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001229 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001230 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1231 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001232 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1233 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001234 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1235 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001236 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1237 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001238 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001239 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001240 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301241 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001242 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001243 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1244 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001245 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001246 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1247 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1248 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001249 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1250 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001251 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1252 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1253 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001254 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1255 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001256 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001257 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001258 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001259 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1260 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001261 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1262 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1263 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1264 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1265 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1266 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1267 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1268 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001269 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1270 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001271 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1272 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001273 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1274 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001275 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1276 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001277 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1278 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001279 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001280 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001281 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001282
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001283 install_element_ve(&show_bts_stats_cmd);
Pau Espin Pedrola1ac2f02020-09-22 17:01:31 +02001284 install_element_ve(&show_bts_pdch_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001285 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001286 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001287 install_element_ve(&show_ms_tlli_cmd);
1288 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001289 install_element_ve(&show_bts_timer_cmd);
1290 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001291
Andreas Eversberg12942562012-07-12 14:31:57 +02001292 return 0;
1293}