blob: 9cae77797797fc7568fa20821ff16f98849a5043 [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" },
Harald Welte717cdf52017-07-21 21:56:23 +020041
42 { 0, NULL }
43};
44
45static const struct value_string pcu_gsmtap_categ_help[] = {
46 { PCU_GSMTAP_C_DL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
47 { PCU_GSMTAP_C_DL_DUMMY, "Downlink Dummy Blocks" },
48 { PCU_GSMTAP_C_DL_CTRL, "Downlink Control Blocks" },
49 { PCU_GSMTAP_C_DL_DATA_GPRS, "Downlink Data Blocks (GPRS)" },
50 { PCU_GSMTAP_C_DL_DATA_EGPRS, "Downlink Data Blocks (EGPRS)" },
Harald Weltebc219d52017-07-29 13:42:27 +020051 { PCU_GSMTAP_C_DL_PTCCH, "Downlink PTCCH Blocks" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020052 { PCU_GSMTAP_C_DL_AGCH, "Downlink AGCH Blocks" },
53 { PCU_GSMTAP_C_DL_PCH, "Downlink PCH Blocks" },
Harald Welte717cdf52017-07-21 21:56:23 +020054
55 { PCU_GSMTAP_C_UL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
56 { PCU_GSMTAP_C_UL_DUMMY, "Uplink Dummy Blocks" },
57 { PCU_GSMTAP_C_UL_CTRL, "Uplink Control Blocks" },
58 { PCU_GSMTAP_C_UL_DATA_GPRS, "Uplink Data Blocks (GPRS)" },
59 { PCU_GSMTAP_C_UL_DATA_EGPRS, "Uplink Data Blocks (EGPRS)" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020060 { PCU_GSMTAP_C_UL_RACH, "Uplink RACH Bursts" },
Harald Welte717cdf52017-07-21 21:56:23 +020061
62 { 0, NULL }
63};
64
65
66DEFUN(cfg_pcu_gsmtap_categ, cfg_pcu_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
67{
68 struct gprs_rlcmac_bts *bts = bts_main_data();
69 int categ;
70
71 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
72 if (categ < 0)
73 return CMD_WARNING;
74
75 bts->gsmtap_categ_mask |= (1 << categ);
76
77 return CMD_SUCCESS;
78}
79
80DEFUN(cfg_pcu_no_gsmtap_categ, cfg_pcu_no_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
81{
82 struct gprs_rlcmac_bts *bts = bts_main_data();
83 int categ;
84
85 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
86 if (categ < 0)
87 return CMD_WARNING;
88
89 bts->gsmtap_categ_mask &= ~(1 << categ);
90
91 return CMD_SUCCESS;
92}
93
Andreas Eversberg8b761a32012-07-20 21:50:31 +020094static struct cmd_node pcu_node = {
95 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +020096 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +020097 1,
98};
99
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200100static int config_write_pcu(struct vty *vty)
101{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200102 struct gprs_rlcmac_bts *bts = bts_main_data();
Harald Welte717cdf52017-07-21 21:56:23 +0200103 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200104
105 vty_out(vty, "pcu%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200106 if (bts->egprs_enabled)
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100107 vty_out(vty, " egprs only%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200108
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200109 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
110 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200111 if (bts->fc_bvc_bucket_size)
112 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
113 bts->fc_bvc_bucket_size, VTY_NEWLINE);
114 if (bts->fc_bvc_leak_rate)
115 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
116 bts->fc_bvc_leak_rate, VTY_NEWLINE);
117 if (bts->fc_ms_bucket_size)
118 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
119 bts->fc_ms_bucket_size, VTY_NEWLINE);
120 if (bts->fc_ms_leak_rate)
121 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
122 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200123 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +0200124 if (bts->initial_cs_ul == bts->initial_cs_dl)
125 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
126 VTY_NEWLINE);
127 else
128 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
129 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200130 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200131 if (bts->max_cs_dl && bts->max_cs_ul) {
132 if (bts->max_cs_ul == bts->max_cs_dl)
133 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
134 VTY_NEWLINE);
135 else
136 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
137 bts->max_cs_ul, VTY_NEWLINE);
138 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200139 if (bts->cs_adj_enabled)
140 vty_out(vty, " cs threshold %d %d%s",
141 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
142 VTY_NEWLINE);
143 else
144 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
145
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200146 if (bts->cs_downgrade_threshold)
147 vty_out(vty, " cs downgrade-threshold %d%s",
148 bts->cs_downgrade_threshold, VTY_NEWLINE);
149 else
150 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
151
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200152 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
153 bts->cs_lqual_ranges[0].high,
154 bts->cs_lqual_ranges[1].low,
155 bts->cs_lqual_ranges[1].high,
156 bts->cs_lqual_ranges[2].low,
157 bts->cs_lqual_ranges[2].high,
158 bts->cs_lqual_ranges[3].low,
159 VTY_NEWLINE);
160
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400161 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",
162 bts->mcs_lqual_ranges[0].high,
163 bts->mcs_lqual_ranges[1].low,
164 bts->mcs_lqual_ranges[1].high,
165 bts->mcs_lqual_ranges[2].low,
166 bts->mcs_lqual_ranges[2].high,
167 bts->mcs_lqual_ranges[3].low,
168 bts->mcs_lqual_ranges[3].high,
169 bts->mcs_lqual_ranges[4].low,
170 bts->mcs_lqual_ranges[4].high,
171 bts->mcs_lqual_ranges[5].low,
172 bts->mcs_lqual_ranges[5].high,
173 bts->mcs_lqual_ranges[6].low,
174 bts->mcs_lqual_ranges[6].high,
175 bts->mcs_lqual_ranges[7].low,
176 bts->mcs_lqual_ranges[7].high,
177 bts->mcs_lqual_ranges[8].low,
178 VTY_NEWLINE);
179
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100180 if (bts->initial_mcs_dl != 1 && bts->initial_mcs_ul != 1) {
181 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
182 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
183 VTY_NEWLINE);
184 else
185 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
186 bts->initial_mcs_ul, VTY_NEWLINE);
187 }
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400188
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100189 if (bts->max_mcs_dl && bts->max_mcs_ul) {
190 if (bts->max_mcs_ul == bts->max_mcs_dl)
191 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
192 VTY_NEWLINE);
193 else
194 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
195 bts->max_mcs_ul, VTY_NEWLINE);
196 }
197
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100198 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
199 VTY_NEWLINE);
200
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530201 if (bts->dl_arq_type)
202 vty_out(vty, " egprs dl arq-type arq2%s",
203 VTY_NEWLINE);
204
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200205 if (bts->force_llc_lifetime == 0xffff)
206 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
207 else if (bts->force_llc_lifetime)
208 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
209 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100210 if (bts->llc_discard_csec)
211 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
212 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200213 if (bts->llc_idle_ack_csec)
214 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
215 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200216 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
217 vty_out(vty, " queue codel%s", VTY_NEWLINE);
218 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
219 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
220 else
221 vty_out(vty, " queue codel interval %d%s",
222 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
223
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200224 if (bts->alloc_algorithm == alloc_algorithm_a)
225 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
226 if (bts->alloc_algorithm == alloc_algorithm_b)
227 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200228 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
229 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200230 if (bts->force_two_phase)
231 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200232 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
233 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Oliver Smith45fdc442019-09-05 15:12:20 +0200234 if (!bts->dl_tbf_preemptive_retransmission)
235 vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200236 if (strcmp(bts->pcu_sock_path, PCU_SOCK_DEFAULT))
237 vty_out(vty, " pcu-socket %s%s", bts->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200238
Harald Welte717cdf52017-07-21 21:56:23 +0200239 for (i = 0; i < 32; i++) {
240 unsigned int cs = (1 << i);
241 if (bts->gsmtap_categ_mask & cs) {
242 vty_out(vty, " gsmtap-category %s%s",
243 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
244 }
245 }
246
Harald Welte57d35152018-07-05 03:11:17 +0200247 if (bts->gb_dialect_sns)
248 vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);
249 else
250 vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);
251
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200252 osmo_tdef_vty_write(vty, bts->T_defs_pcu, " timer ");
253
Maxc9ce6f92018-01-30 17:53:02 +0100254 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200255}
256
257/* per-BTS configuration */
258DEFUN(cfg_pcu,
259 cfg_pcu_cmd,
260 "pcu",
261 "BTS specific configure")
262{
263 vty->node = PCU_NODE;
264
265 return CMD_SUCCESS;
266}
267
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200268#define EGPRS_STR "EGPRS configuration\n"
269
270DEFUN(cfg_pcu_egprs,
271 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100272 "egprs only",
273 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200274{
275 struct gprs_rlcmac_bts *bts = bts_main_data();
276
277 bts->egprs_enabled = 1;
278
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200279 return CMD_SUCCESS;
280}
281
282DEFUN(cfg_pcu_no_egprs,
283 cfg_pcu_no_egprs_cmd,
284 "no egprs",
285 NO_STR EGPRS_STR)
286{
287 struct gprs_rlcmac_bts *bts = bts_main_data();
288
289 bts->egprs_enabled = 0;
290
291 return CMD_SUCCESS;
292}
293
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200294DEFUN(cfg_pcu_fc_interval,
295 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200296 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200297 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200298 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200299{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200300 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200301
302 bts->fc_interval = atoi(argv[0]);
303
304 return CMD_SUCCESS;
305}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200306#define FC_STR "BSSGP Flow Control configuration\n"
307#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
308#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
309
310DEFUN(cfg_pcu_fc_bvc_bucket_size,
311 cfg_pcu_fc_bvc_bucket_size_cmd,
312 "flow-control force-bvc-bucket-size <1-6553500>",
313 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
314{
315 struct gprs_rlcmac_bts *bts = bts_main_data();
316
317 bts->fc_bvc_bucket_size = atoi(argv[0]);
318
319 return CMD_SUCCESS;
320}
321
322DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
323 cfg_pcu_no_fc_bvc_bucket_size_cmd,
324 "no flow-control force-bvc-bucket-size",
325 NO_STR FC_STR FC_BMAX_STR("BVC"))
326{
327 struct gprs_rlcmac_bts *bts = bts_main_data();
328
329 bts->fc_bvc_bucket_size = 0;
330
331 return CMD_SUCCESS;
332}
333
334DEFUN(cfg_pcu_fc_bvc_leak_rate,
335 cfg_pcu_fc_bvc_leak_rate_cmd,
336 "flow-control force-bvc-leak-rate <1-6553500>",
337 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
338{
339 struct gprs_rlcmac_bts *bts = bts_main_data();
340
341 bts->fc_bvc_leak_rate = atoi(argv[0]);
342
343 return CMD_SUCCESS;
344}
345
346DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
347 cfg_pcu_no_fc_bvc_leak_rate_cmd,
348 "no flow-control force-bvc-leak-rate",
349 NO_STR FC_STR FC_LR_STR("BVC"))
350{
351 struct gprs_rlcmac_bts *bts = bts_main_data();
352
353 bts->fc_bvc_leak_rate = 0;
354
355 return CMD_SUCCESS;
356}
357
358DEFUN(cfg_pcu_fc_ms_bucket_size,
359 cfg_pcu_fc_ms_bucket_size_cmd,
360 "flow-control force-ms-bucket-size <1-6553500>",
361 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
362{
363 struct gprs_rlcmac_bts *bts = bts_main_data();
364
365 bts->fc_ms_bucket_size = atoi(argv[0]);
366
367 return CMD_SUCCESS;
368}
369
370DEFUN(cfg_pcu_no_fc_ms_bucket_size,
371 cfg_pcu_no_fc_ms_bucket_size_cmd,
372 "no flow-control force-ms-bucket-size",
373 NO_STR FC_STR FC_BMAX_STR("default MS"))
374{
375 struct gprs_rlcmac_bts *bts = bts_main_data();
376
377 bts->fc_ms_bucket_size = 0;
378
379 return CMD_SUCCESS;
380}
381
382DEFUN(cfg_pcu_fc_ms_leak_rate,
383 cfg_pcu_fc_ms_leak_rate_cmd,
384 "flow-control force-ms-leak-rate <1-6553500>",
385 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
386{
387 struct gprs_rlcmac_bts *bts = bts_main_data();
388
389 bts->fc_ms_leak_rate = atoi(argv[0]);
390
391 return CMD_SUCCESS;
392}
393
394DEFUN(cfg_pcu_no_fc_ms_leak_rate,
395 cfg_pcu_no_fc_ms_leak_rate_cmd,
396 "no flow-control force-ms-leak-rate",
397 NO_STR FC_STR FC_LR_STR("default MS"))
398{
399 struct gprs_rlcmac_bts *bts = bts_main_data();
400
401 bts->fc_ms_leak_rate = 0;
402
403 return CMD_SUCCESS;
404}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200405
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200406#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
407DEFUN(cfg_pcu_fc_bucket_time,
408 cfg_pcu_fc_bucket_time_cmd,
409 "flow-control bucket-time <1-65534>",
410 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
411{
412 struct gprs_rlcmac_bts *bts = bts_main_data();
413
414 bts->fc_bucket_time = atoi(argv[0]);
415
416 return CMD_SUCCESS;
417}
418
419DEFUN(cfg_pcu_no_fc_bucket_time,
420 cfg_pcu_no_fc_bucket_time_cmd,
421 "no flow-control bucket-time",
422 NO_STR FC_STR FC_BTIME_STR)
423{
424 struct gprs_rlcmac_bts *bts = bts_main_data();
425
426 bts->fc_bucket_time = 0;
427
428 return CMD_SUCCESS;
429}
430
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200431#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200432
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200433DEFUN(cfg_pcu_cs,
434 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200435 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200436 CS_STR
437 "Initial CS value to be used (overrides BTS config)\n"
438 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200439{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200440 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200441 uint8_t cs = atoi(argv[0]);
442
443 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200444 bts->initial_cs_dl = cs;
445 if (argc > 1)
446 bts->initial_cs_ul = atoi(argv[1]);
447 else
448 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200449
450 return CMD_SUCCESS;
451}
452
453DEFUN(cfg_pcu_no_cs,
454 cfg_pcu_no_cs_cmd,
455 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200456 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200457{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200458 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200459
460 bts->force_cs = 0;
461
462 return CMD_SUCCESS;
463}
464
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100465#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200466DEFUN(cfg_pcu_cs_max,
467 cfg_pcu_cs_max_cmd,
468 "cs max <1-4> [<1-4>]",
469 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100470 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200471 "Maximum CS value to be used\n"
472 "Use a different maximum CS value for the uplink")
473{
474 struct gprs_rlcmac_bts *bts = bts_main_data();
475 uint8_t cs = atoi(argv[0]);
476
477 bts->max_cs_dl = cs;
478 if (argc > 1)
479 bts->max_cs_ul = atoi(argv[1]);
480 else
481 bts->max_cs_ul = cs;
482
483 return CMD_SUCCESS;
484}
485
486DEFUN(cfg_pcu_no_cs_max,
487 cfg_pcu_no_cs_max_cmd,
488 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100489 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200490{
491 struct gprs_rlcmac_bts *bts = bts_main_data();
492
493 bts->max_cs_dl = 0;
494 bts->max_cs_ul = 0;
495
496 return CMD_SUCCESS;
497}
498
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100499#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
500
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100501DEFUN(cfg_pcu_mcs,
502 cfg_pcu_mcs_cmd,
503 "mcs <1-9> [<1-9>]",
504 MCS_STR
505 "Initial MCS value to be used (default 1)\n"
506 "Use a different initial MCS value for the uplink")
507{
508 struct gprs_rlcmac_bts *bts = bts_main_data();
509 uint8_t cs = atoi(argv[0]);
510
511 bts->initial_mcs_dl = cs;
512 if (argc > 1)
513 bts->initial_mcs_ul = atoi(argv[1]);
514 else
515 bts->initial_mcs_ul = cs;
516
517 return CMD_SUCCESS;
518}
519
520DEFUN(cfg_pcu_no_mcs,
521 cfg_pcu_no_mcs_cmd,
522 "no mcs",
523 NO_STR MCS_STR)
524{
525 struct gprs_rlcmac_bts *bts = bts_main_data();
526
527 bts->initial_mcs_dl = 1;
528 bts->initial_mcs_ul = 1;
529
530 return CMD_SUCCESS;
531}
532
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100533DEFUN(cfg_pcu_mcs_max,
534 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100535 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100536 MCS_STR
537 CS_MAX_STR
538 "Maximum MCS value to be used\n"
539 "Use a different maximum MCS value for the uplink")
540{
541 struct gprs_rlcmac_bts *bts = bts_main_data();
542 uint8_t mcs = atoi(argv[0]);
543
544 bts->max_mcs_dl = mcs;
545 if (argc > 1)
546 bts->max_mcs_ul = atoi(argv[1]);
547 else
548 bts->max_mcs_ul = mcs;
549
550 return CMD_SUCCESS;
551}
552
553DEFUN(cfg_pcu_no_mcs_max,
554 cfg_pcu_no_mcs_max_cmd,
555 "no mcs max",
556 NO_STR MCS_STR CS_MAX_STR)
557{
558 struct gprs_rlcmac_bts *bts = bts_main_data();
559
560 bts->max_mcs_dl = 0;
561 bts->max_mcs_ul = 0;
562
563 return CMD_SUCCESS;
564}
565
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530566#define DL_STR "downlink specific configuration\n"
567
568DEFUN(cfg_pcu_dl_arq_type,
569 cfg_pcu_dl_arq_cmd,
570 "egprs dl arq-type (spb|arq2)",
571 EGPRS_STR DL_STR "ARQ options\n"
572 "enable SPB(ARQ1) support\n"
573 "enable ARQ2 support")
574{
575 struct gprs_rlcmac_bts *bts = bts_main_data();
576
577 if (!strcmp(argv[0], "arq2"))
578 bts->dl_arq_type = 1;
579 else
580 bts->dl_arq_type = 0;
581
582 return CMD_SUCCESS;
583}
584
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100585DEFUN(cfg_pcu_window_size,
586 cfg_pcu_window_size_cmd,
587 "window-size <0-1024> [<0-256>]",
588 "Window size configuration (b + N_PDCH * f)\n"
589 "Base value (b)\n"
590 "Factor for number of PDCH (f)")
591{
592 struct gprs_rlcmac_bts *bts = bts_main_data();
593 uint16_t b = atoi(argv[0]);
594
595 bts->ws_base = b;
596 if (argc > 1) {
597 uint16_t f = atoi(argv[1]);
598 bts->ws_pdch = f;
599 }
600
601 return CMD_SUCCESS;
602}
603
604
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200605#define QUEUE_STR "Packet queue options\n"
606#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
607 "(overrides the value given by SGSN)\n"
608
609DEFUN(cfg_pcu_queue_lifetime,
610 cfg_pcu_queue_lifetime_cmd,
611 "queue lifetime <1-65534>",
612 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
613{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200614 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200615 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200616
617 bts->force_llc_lifetime = csec;
618
619 return CMD_SUCCESS;
620}
621
622DEFUN(cfg_pcu_queue_lifetime_inf,
623 cfg_pcu_queue_lifetime_inf_cmd,
624 "queue lifetime infinite",
625 QUEUE_STR LIFETIME_STR "Infinite lifetime")
626{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200627 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200628
629 bts->force_llc_lifetime = 0xffff;
630
631 return CMD_SUCCESS;
632}
633
634DEFUN(cfg_pcu_no_queue_lifetime,
635 cfg_pcu_no_queue_lifetime_cmd,
636 "no queue lifetime",
637 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
638 "by SGSN)\n")
639{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200640 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200641
642 bts->force_llc_lifetime = 0;
643
644 return CMD_SUCCESS;
645}
646
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100647#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
648 "(continue discarding until lifetime-hysteresis is reached)\n"
649
650DEFUN(cfg_pcu_queue_hysteresis,
651 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200652 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100653 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
654{
655 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200656 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100657
658 bts->llc_discard_csec = csec;
659
660 return CMD_SUCCESS;
661}
662
663DEFUN(cfg_pcu_no_queue_hysteresis,
664 cfg_pcu_no_queue_hysteresis_cmd,
665 "no queue hysteresis",
666 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
667{
668 struct gprs_rlcmac_bts *bts = bts_main_data();
669
670 bts->llc_discard_csec = 0;
671
672 return CMD_SUCCESS;
673}
674
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200675#define QUEUE_CODEL_STR "Set CoDel queue management\n"
676
677DEFUN(cfg_pcu_queue_codel,
678 cfg_pcu_queue_codel_cmd,
679 "queue codel",
680 QUEUE_STR QUEUE_CODEL_STR)
681{
682 struct gprs_rlcmac_bts *bts = bts_main_data();
683
684 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
685
686 return CMD_SUCCESS;
687}
688
689DEFUN(cfg_pcu_queue_codel_interval,
690 cfg_pcu_queue_codel_interval_cmd,
691 "queue codel interval <1-1000>",
692 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
693{
694 struct gprs_rlcmac_bts *bts = bts_main_data();
695 uint16_t csec = atoi(argv[0]);
696
697 bts->llc_codel_interval_msec = 10*csec;
698
699 return CMD_SUCCESS;
700}
701
702DEFUN(cfg_pcu_no_queue_codel,
703 cfg_pcu_no_queue_codel_cmd,
704 "no queue codel",
705 NO_STR QUEUE_STR QUEUE_CODEL_STR)
706{
707 struct gprs_rlcmac_bts *bts = bts_main_data();
708
709 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
710
711 return CMD_SUCCESS;
712}
713
714
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200715#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
716
717DEFUN(cfg_pcu_queue_idle_ack_delay,
718 cfg_pcu_queue_idle_ack_delay_cmd,
719 "queue idle-ack-delay <1-65535>",
720 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
721{
722 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200723 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200724
725 bts->llc_idle_ack_csec = csec;
726
727 return CMD_SUCCESS;
728}
729
730DEFUN(cfg_pcu_no_queue_idle_ack_delay,
731 cfg_pcu_no_queue_idle_ack_delay_cmd,
732 "no queue idle-ack-delay",
733 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
734{
735 struct gprs_rlcmac_bts *bts = bts_main_data();
736
737 bts->llc_idle_ack_csec = 0;
738
739 return CMD_SUCCESS;
740}
741
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100742
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200743DEFUN(cfg_pcu_alloc,
744 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200745 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200746 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200747 "PACCH\n"
748 "Single slot is assigned only\n"
749 "Multiple slots are assigned for semi-duplex operation\n"
750 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200751{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200752 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200753
754 switch (argv[0][0]) {
755 case 'a':
756 bts->alloc_algorithm = alloc_algorithm_a;
757 break;
758 case 'b':
759 bts->alloc_algorithm = alloc_algorithm_b;
760 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200761 default:
762 bts->alloc_algorithm = alloc_algorithm_dynamic;
763 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200764 }
765
766 return CMD_SUCCESS;
767}
768
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200769DEFUN(cfg_pcu_two_phase,
770 cfg_pcu_two_phase_cmd,
771 "two-phase-access",
772 "Force two phase access when MS requests single phase access\n")
773{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200774 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200775
776 bts->force_two_phase = 1;
777
778 return CMD_SUCCESS;
779}
780
781DEFUN(cfg_pcu_no_two_phase,
782 cfg_pcu_no_two_phase_cmd,
783 "no two-phase-access",
784 NO_STR "Only use two phase access when requested my MS\n")
785{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200786 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200787
788 bts->force_two_phase = 0;
789
790 return CMD_SUCCESS;
791}
792
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200793DEFUN(cfg_pcu_alpha,
794 cfg_pcu_alpha_cmd,
795 "alpha <0-10>",
796 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
797 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
798 "Alpha in units of 0.1\n")
799{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200800 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200801
802 bts->alpha = atoi(argv[0]);
803
804 return CMD_SUCCESS;
805}
806
807DEFUN(cfg_pcu_gamma,
808 cfg_pcu_gamma_cmd,
809 "gamma <0-62>",
810 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
811 "Gamma in even unit of dBs\n")
812{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200813 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200814
815 bts->gamma = atoi(argv[0]) / 2;
816
817 return CMD_SUCCESS;
818}
819
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100820DEFUN(show_bts_stats,
821 show_bts_stats_cmd,
822 "show bts statistics",
823 SHOW_STR "BTS related functionality\nStatistics\n")
824{
825 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
826 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100827}
828
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100829#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200830DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100831 cfg_pcu_dl_tbf_idle_time_cmd,
832 "dl-tbf-idle-time <1-5000>",
833 IDLE_TIME_STR "idle time in msec")
834{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200835 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
836
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100837 struct gprs_rlcmac_bts *bts = bts_main_data();
838
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200839 if (osmo_tdef_set(bts->T_defs_pcu, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
840 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100841 return CMD_SUCCESS;
842}
843
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200844DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100845 cfg_pcu_no_dl_tbf_idle_time_cmd,
846 "no dl-tbf-idle-time",
847 NO_STR IDLE_TIME_STR)
848{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200849 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
850
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100851 struct gprs_rlcmac_bts *bts = bts_main_data();
852
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200853 if (osmo_tdef_set(bts->T_defs_pcu, -2031, 0, OSMO_TDEF_MS) < 0)
854 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100855 return CMD_SUCCESS;
856}
857
Oliver Smith45fdc442019-09-05 15:12:20 +0200858#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
859 " less readable traces)"
860DEFUN(cfg_pcu_dl_tbf_preemptive_retransmission,
861 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
862 "dl-tbf-preemptive-retransmission",
863 RETRANSMISSION_STR " (enabled by default)")
864{
865 struct gprs_rlcmac_bts *bts = bts_main_data();
866
867 bts->dl_tbf_preemptive_retransmission = true;
868
869 return CMD_SUCCESS;
870}
871
872DEFUN(cfg_pcu_no_dl_tbf_preemptive_retransmission,
873 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
874 "no dl-tbf-preemptive-retransmission",
875 NO_STR RETRANSMISSION_STR)
876{
877 struct gprs_rlcmac_bts *bts = bts_main_data();
878
879 bts->dl_tbf_preemptive_retransmission = false;
880
881 return CMD_SUCCESS;
882}
883
Jacob Erlbecka098c192015-05-28 16:11:19 +0200884#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200885DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200886 cfg_pcu_ms_idle_time_cmd,
887 "ms-idle-time <1-7200>",
888 MS_IDLE_TIME_STR "idle time in sec")
889{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200890 vty_out(vty, "%% 'ms-idle-time' is now deprecated: use 'timer X2030 <val>' instead%s", VTY_NEWLINE);
891
Jacob Erlbecka098c192015-05-28 16:11:19 +0200892 struct gprs_rlcmac_bts *bts = bts_main_data();
893
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200894 if (osmo_tdef_set(bts->T_defs_pcu, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
895 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200896 return CMD_SUCCESS;
897}
898
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200899DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200900 cfg_pcu_no_ms_idle_time_cmd,
901 "no ms-idle-time",
902 NO_STR MS_IDLE_TIME_STR)
903{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200904 vty_out(vty, "%% 'no ms-idle-time' is now deprecated: use 'timer X2030 0' instead%s", VTY_NEWLINE);
905
Jacob Erlbecka098c192015-05-28 16:11:19 +0200906 struct gprs_rlcmac_bts *bts = bts_main_data();
907
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200908 if (osmo_tdef_set(bts->T_defs_pcu, -2030, 0, OSMO_TDEF_S) < 0)
909 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200910 return CMD_SUCCESS;
911}
912
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100913#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200914DEFUN(cfg_pcu_cs_err_limits,
915 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200916 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200917 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
918{
919 struct gprs_rlcmac_bts *bts = bts_main_data();
920
921 uint8_t lower_limit = atoi(argv[0]);
922 uint8_t upper_limit = atoi(argv[1]);
923
924 if (lower_limit > upper_limit) {
925 vty_out(vty,
926 "The lower limit must be less than or equal to the "
927 "upper limit.%s", VTY_NEWLINE);
928 return CMD_WARNING;
929 }
930
931 bts->cs_adj_enabled = 1;
932 bts->cs_adj_upper_limit = upper_limit;
933 bts->cs_adj_lower_limit = lower_limit;
934
935 return CMD_SUCCESS;
936}
937
938DEFUN(cfg_pcu_no_cs_err_limits,
939 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200940 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200941 NO_STR CS_STR CS_ERR_LIMITS_STR)
942{
943 struct gprs_rlcmac_bts *bts = bts_main_data();
944
945 bts->cs_adj_enabled = 0;
946 bts->cs_adj_upper_limit = 100;
947 bts->cs_adj_lower_limit = 0;
948
949 return CMD_SUCCESS;
950}
951
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100952#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200953DEFUN(cfg_pcu_cs_downgrade_thrsh,
954 cfg_pcu_cs_downgrade_thrsh_cmd,
955 "cs downgrade-threshold <1-10000>",
956 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
957{
958 struct gprs_rlcmac_bts *bts = bts_main_data();
959
960 bts->cs_downgrade_threshold = atoi(argv[0]);
961
962 return CMD_SUCCESS;
963}
964
965DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
966 cfg_pcu_no_cs_downgrade_thrsh_cmd,
967 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200968 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200969{
970 struct gprs_rlcmac_bts *bts = bts_main_data();
971
972 bts->cs_downgrade_threshold = 0;
973
974 return CMD_SUCCESS;
975}
976
977
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200978DEFUN(cfg_pcu_cs_lqual_ranges,
979 cfg_pcu_cs_lqual_ranges_cmd,
980 "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 +0100981 CS_STR "Set link quality ranges for each uplink CS\n"
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200982 "Set quality range for CS-1 (high value only)\n"
983 "CS-1 high (dB)\n"
984 "Set quality range for CS-2\n"
985 "CS-2 low (dB)\n"
986 "CS-2 high (dB)\n"
987 "Set quality range for CS-3\n"
988 "CS-3 low (dB)\n"
989 "CS-3 high (dB)\n"
990 "Set quality range for CS-4 (low value only)\n"
991 "CS-4 low (dB)\n")
992{
993 struct gprs_rlcmac_bts *bts = bts_main_data();
994
995 uint8_t cs1_high = atoi(argv[0]);
996 uint8_t cs2_low = atoi(argv[1]);
997 uint8_t cs2_high = atoi(argv[2]);
998 uint8_t cs3_low = atoi(argv[3]);
999 uint8_t cs3_high = atoi(argv[4]);
1000 uint8_t cs4_low = atoi(argv[5]);
1001
1002 bts->cs_lqual_ranges[0].high = cs1_high;
1003 bts->cs_lqual_ranges[1].low = cs2_low;
1004 bts->cs_lqual_ranges[1].high = cs2_high;
1005 bts->cs_lqual_ranges[2].low = cs3_low;
1006 bts->cs_lqual_ranges[2].high = cs3_high;
1007 bts->cs_lqual_ranges[3].low = cs4_low;
1008
1009 return CMD_SUCCESS;
1010}
1011
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001012DEFUN(cfg_pcu_mcs_lqual_ranges,
1013 cfg_pcu_mcs_lqual_ranges_cmd,
1014 "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 +01001015 CS_STR "Set link quality ranges for each uplink MCS\n"
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001016 "Set quality range for MCS-1 (high value only)\n"
1017 "MCS-1 high (dB)\n"
1018 "Set quality range for MCS-2\n"
1019 "MCS-2 high (dB)\n"
1020 "MCS-2 low (dB)\n"
1021 "Set quality range for MCS-3\n"
1022 "MCS-3 high (dB)\n"
1023 "MCS-3 low (dB)\n"
1024 "Set quality range for MCS-4\n"
1025 "MCS-4 high (dB)\n"
1026 "MCS-4 low (dB)\n"
1027 "Set quality range for MCS-5\n"
1028 "MCS-5 high (dB)\n"
1029 "MCS-5 low (dB)\n"
1030 "Set quality range for MCS-6\n"
1031 "MCS-6 low (dB)\n"
1032 "MCS-6 high (dB)\n"
1033 "Set quality range for MCS-7\n"
1034 "MCS-7 low (dB)\n"
1035 "MCS-7 high (dB)\n"
1036 "Set quality range for MCS-8\n"
1037 "MCS-8 low (dB)\n"
1038 "MCS-8 high (dB)\n"
1039 "Set quality range for MCS-9 (low value only)\n"
1040 "MCS-9 low (dB)\n")
1041{
1042 struct gprs_rlcmac_bts *bts = bts_main_data();
1043
1044 bts->mcs_lqual_ranges[0].high = atoi(argv[0]);
1045 bts->mcs_lqual_ranges[1].low = atoi(argv[1]);
1046 bts->mcs_lqual_ranges[1].high = atoi(argv[2]);
1047 bts->mcs_lqual_ranges[2].low = atoi(argv[3]);
1048 bts->mcs_lqual_ranges[2].high = atoi(argv[4]);
1049 bts->mcs_lqual_ranges[3].low = atoi(argv[5]);
1050 bts->mcs_lqual_ranges[3].high = atoi(argv[6]);
1051 bts->mcs_lqual_ranges[4].low = atoi(argv[7]);
1052 bts->mcs_lqual_ranges[4].high = atoi(argv[8]);
1053 bts->mcs_lqual_ranges[5].low = atoi(argv[9]);
1054 bts->mcs_lqual_ranges[5].high = atoi(argv[10]);
1055 bts->mcs_lqual_ranges[6].low = atoi(argv[11]);
1056 bts->mcs_lqual_ranges[6].high = atoi(argv[12]);
1057 bts->mcs_lqual_ranges[7].low = atoi(argv[13]);
1058 bts->mcs_lqual_ranges[7].high = atoi(argv[14]);
1059 bts->mcs_lqual_ranges[8].low = atoi(argv[15]);
1060
1061 return CMD_SUCCESS;
1062}
1063
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001064DEFUN(cfg_pcu_sock,
1065 cfg_pcu_sock_cmd,
1066 "pcu-socket PATH",
1067 "Configure the osmo-bts PCU socket file/path name\n"
1068 "Path of the socket to connect to\n")
1069{
1070 struct gprs_rlcmac_bts *bts = bts_main_data();
1071
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +07001072 if (vty->type != VTY_FILE)
1073 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
1074
Vadim Yanitskiy657a4c02019-11-30 20:15:22 +07001075 osmo_talloc_replace_string(tall_pcu_ctx, &bts->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001076
1077 return CMD_SUCCESS;
1078}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001079
Harald Welte57d35152018-07-05 03:11:17 +02001080DEFUN(cfg_pcu_gb_dialect,
1081 cfg_pcu_gb_dialect_cmd,
1082 "gb-dialect (classic|ip-sns)",
1083 "Select which Gb interface dialect to use\n"
1084 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1085 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
1086{
1087 struct gprs_rlcmac_bts *bts = bts_main_data();
1088
1089 if (!strcmp(argv[0], "ip-sns"))
1090 bts->gb_dialect_sns = true;
1091 else
1092 bts->gb_dialect_sns = false;
1093
1094 return CMD_SUCCESS;
1095}
1096
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001097DEFUN(show_bts_timer, show_bts_timer_cmd,
1098 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1099 SHOW_STR "Show BTS controlled timers\n"
1100 OSMO_TDEF_VTY_DOC_T)
1101{
1102 struct gprs_rlcmac_bts *bts = bts_main_data();
1103 const char *T_arg = argc > 0 ? argv[0] : NULL;
1104 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, NULL);
1105}
1106
1107DEFUN(show_timer, show_timer_cmd,
1108 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1109 SHOW_STR "Show PCU 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_pcu, T_arg, NULL);
1115}
1116
1117DEFUN(cfg_pcu_timer, cfg_pcu_timer_cmd,
1118 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1119 "Configure or show PCU timers\n"
1120 OSMO_TDEF_VTY_DOC_SET)
1121{
1122 struct gprs_rlcmac_bts *bts = bts_main_data();
1123 /* If any arguments are missing, redirect to 'show' */
1124 if (argc < 2)
1125 return show_timer(self, vty, argc, argv);
1126 return osmo_tdef_vty_set_cmd(vty, bts->T_defs_pcu, argv);
1127}
1128
Daniel Willmann772415f2014-01-15 17:06:51 +01001129DEFUN(show_tbf,
1130 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001131 "show tbf (all|ccch|pacch)",
1132 SHOW_STR "information about TBFs\n"
1133 "All TBFs\n"
1134 "TBFs allocated via CCCH\n"
1135 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001136{
1137 struct gprs_rlcmac_bts *bts = bts_main_data();
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001138 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001139
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001140 if (argv[0][0] == 'c')
1141 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1142 else if (argv[0][0] == 'p')
1143 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001144
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001145 return pcu_vty_show_tbf_all(vty, bts, flags);
Daniel Willmann772415f2014-01-15 17:06:51 +01001146}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001147
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001148DEFUN(show_ms_all,
1149 show_ms_all_cmd,
1150 "show ms all",
1151 SHOW_STR "information about MSs\n" "All TBFs\n")
1152{
1153 struct gprs_rlcmac_bts *bts = bts_main_data();
1154 return pcu_vty_show_ms_all(vty, bts);
1155}
1156
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001157DEFUN(show_ms_tlli,
1158 show_ms_tlli_cmd,
1159 "show ms tlli TLLI",
1160 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1161{
1162 struct gprs_rlcmac_bts *bts = bts_main_data();
1163 char *endp = NULL;
1164 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1165 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1166 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1167 return CMD_WARNING;
1168 }
1169 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
1170}
1171
1172DEFUN(show_ms_imsi,
1173 show_ms_imsi_cmd,
1174 "show ms imsi IMSI",
1175 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1176{
1177 struct gprs_rlcmac_bts *bts = bts_main_data();
1178 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1179}
1180
Andreas Eversberg12942562012-07-12 14:31:57 +02001181static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001182 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1183 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001184 "License GNU GPL version 2 or later\r\n"
1185 "This is free software: you are free to change and redistribute it.\r\n"
1186 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1187
1188struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001189 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001190 .version = PACKAGE_VERSION,
1191 .copyright = pcu_copyright,
Andreas Eversberg12942562012-07-12 14:31:57 +02001192};
1193
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001194int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001195{
1196// install_element_ve(&show_pcu_cmd);
1197
Harald Welte717cdf52017-07-21 21:56:23 +02001198 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1199 "gsmtap-category (",
1200 "|",")", VTY_DO_LOWER);
1201 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1202 "GSMTAP Category\n",
1203 "\n", "", 0);
1204 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1205 "no gsmtap-category (",
1206 "|",")", VTY_DO_LOWER);
1207 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1208 NO_STR "GSMTAP Category\n",
1209 "\n", "", 0);
1210
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001211 logging_vty_add_cmds();
1212 osmo_stats_vty_add_cmds();
Vadim Yanitskiyd83c8ff2020-02-06 16:46:17 +07001213 osmo_talloc_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001214
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001215 install_node(&pcu_node, config_write_pcu);
1216 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001217 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1218 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001219 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001220 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1221 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001222 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1223 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001224 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1225 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001226 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1227 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001228 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001229 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001230 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301231 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001232 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001233 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1234 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001235 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001236 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1237 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1238 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001239 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1240 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001241 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1242 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1243 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001244 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1245 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001246 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001247 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001248 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001249 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1250 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001251 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1252 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1253 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1254 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1255 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1256 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1257 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1258 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001259 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1260 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001261 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1262 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001263 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1264 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001265 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1266 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001267 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1268 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001269 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001270 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001271 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001272
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001273 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001274 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001275 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001276 install_element_ve(&show_ms_tlli_cmd);
1277 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001278 install_element_ve(&show_bts_timer_cmd);
1279 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001280
Andreas Eversberg12942562012-07-12 14:31:57 +02001281 return 0;
1282}