blob: 1f46707eea4edd9e9650afcd1dfdd2bc9d5c6bde [file] [log] [blame]
Andreas Eversberg12942562012-07-12 14:31:57 +02001/* OsmoBTS VTY interface */
2
Andreas Eversberg12942562012-07-12 14:31:57 +02003
Andreas Eversberg8b761a32012-07-20 21:50:31 +02004#include <stdint.h>
Holger Hans Peter Freyther2c98f1d2014-07-02 14:56:36 +02005#include <stdlib.h>
Neels Hofmeyrd34646a2017-02-08 17:07:40 +01006#include <string.h>
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02007#include <osmocom/core/tdef.h>
8#include <osmocom/vty/tdef_vty.h>
Andreas Eversberg12942562012-07-12 14:31:57 +02009#include <osmocom/vty/logging.h>
Jacob Erlbeck42aba812015-11-10 15:32:00 +010010#include <osmocom/vty/stats.h>
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020011#include <osmocom/vty/misc.h>
Andreas Eversberg8b761a32012-07-20 21:50:31 +020012#include <osmocom/core/linuxlist.h>
Holger Hans Peter Freythere8915b92014-07-02 14:57:47 +020013#include <osmocom/core/rate_ctr.h>
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +020014#include <osmocom/pcu/pcuif_proto.h>
Andreas Eversberg12942562012-07-12 14:31:57 +020015#include "pcu_vty.h"
Andreas Eversberg8b761a32012-07-20 21:50:31 +020016#include "gprs_rlcmac.h"
Max6dc90b82018-02-19 17:17:28 +010017#include <pdch.h>
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020018#include "bts.h"
Jacob Erlbeckc0c580c2015-04-30 15:59:01 +020019#include "tbf.h"
Jacob Erlbeck62e96a32015-06-04 09:42:14 +020020#include "pcu_vty_functions.h"
21
Harald Welte717cdf52017-07-21 21:56:23 +020022extern void *tall_pcu_ctx;
23
24static const struct value_string pcu_gsmtap_categ_names[] = {
25 { PCU_GSMTAP_C_DL_UNKNOWN, "dl-unknown" },
26 { PCU_GSMTAP_C_DL_DUMMY, "dl-dummy" },
27 { PCU_GSMTAP_C_DL_CTRL, "dl-ctrl" },
28 { PCU_GSMTAP_C_DL_DATA_GPRS, "dl-data-gprs" },
29 { PCU_GSMTAP_C_DL_DATA_EGPRS, "dl-data-egprs" },
Harald Weltebc219d52017-07-29 13:42:27 +020030 { PCU_GSMTAP_C_DL_PTCCH, "dl-ptcch" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020031 { PCU_GSMTAP_C_DL_AGCH, "dl-agch" },
32 { PCU_GSMTAP_C_DL_PCH, "dl-pch" },
Harald Welte717cdf52017-07-21 21:56:23 +020033
34 { PCU_GSMTAP_C_UL_UNKNOWN, "ul-unknown" },
35 { PCU_GSMTAP_C_UL_DUMMY, "ul-dummy" },
36 { PCU_GSMTAP_C_UL_CTRL, "ul-ctrl" },
37 { PCU_GSMTAP_C_UL_DATA_GPRS, "ul-data-gprs" },
38 { PCU_GSMTAP_C_UL_DATA_EGPRS, "ul-data-egprs" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020039 { PCU_GSMTAP_C_UL_RACH, "ul-rach" },
Harald Welte717cdf52017-07-21 21:56:23 +020040
41 { 0, NULL }
42};
43
44static const struct value_string pcu_gsmtap_categ_help[] = {
45 { PCU_GSMTAP_C_DL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
46 { PCU_GSMTAP_C_DL_DUMMY, "Downlink Dummy Blocks" },
47 { PCU_GSMTAP_C_DL_CTRL, "Downlink Control Blocks" },
48 { PCU_GSMTAP_C_DL_DATA_GPRS, "Downlink Data Blocks (GPRS)" },
49 { PCU_GSMTAP_C_DL_DATA_EGPRS, "Downlink Data Blocks (EGPRS)" },
Harald Weltebc219d52017-07-29 13:42:27 +020050 { PCU_GSMTAP_C_DL_PTCCH, "Downlink PTCCH Blocks" },
Pau Espin Pedrol58543702019-09-30 19:07:16 +020051 { PCU_GSMTAP_C_DL_AGCH, "Downlink AGCH Blocks" },
52 { PCU_GSMTAP_C_DL_PCH, "Downlink PCH Blocks" },
Harald Welte717cdf52017-07-21 21:56:23 +020053
54 { PCU_GSMTAP_C_UL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" },
55 { PCU_GSMTAP_C_UL_DUMMY, "Uplink Dummy Blocks" },
56 { PCU_GSMTAP_C_UL_CTRL, "Uplink Control Blocks" },
57 { PCU_GSMTAP_C_UL_DATA_GPRS, "Uplink Data Blocks (GPRS)" },
58 { PCU_GSMTAP_C_UL_DATA_EGPRS, "Uplink Data Blocks (EGPRS)" },
Pau Espin Pedrol1ec211f2019-09-30 18:33:14 +020059 { PCU_GSMTAP_C_UL_RACH, "Uplink RACH Bursts" },
Harald Welte717cdf52017-07-21 21:56:23 +020060
61 { 0, NULL }
62};
63
64
65DEFUN(cfg_pcu_gsmtap_categ, cfg_pcu_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
66{
67 struct gprs_rlcmac_bts *bts = bts_main_data();
68 int categ;
69
70 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
71 if (categ < 0)
72 return CMD_WARNING;
73
74 bts->gsmtap_categ_mask |= (1 << categ);
75
76 return CMD_SUCCESS;
77}
78
79DEFUN(cfg_pcu_no_gsmtap_categ, cfg_pcu_no_gsmtap_categ_cmd, "HIDDEN", "HIDDEN")
80{
81 struct gprs_rlcmac_bts *bts = bts_main_data();
82 int categ;
83
84 categ = get_string_value(pcu_gsmtap_categ_names, argv[0]);
85 if (categ < 0)
86 return CMD_WARNING;
87
88 bts->gsmtap_categ_mask &= ~(1 << categ);
89
90 return CMD_SUCCESS;
91}
92
93
Jacob Erlbeckf76fede2015-08-17 13:42:46 +020094int pcu_vty_go_parent(struct vty *vty)
Andreas Eversberg12942562012-07-12 14:31:57 +020095{
96 switch (vty->node) {
97#if 0
98 case TRX_NODE:
Andreas Eversberg8b761a32012-07-20 21:50:31 +020099 vty->node = PCU_NODE;
Andreas Eversberg12942562012-07-12 14:31:57 +0200100 {
101 struct gsm_bts_trx *trx = vty->index;
102 vty->index = trx->bts;
103 }
104 break;
105#endif
106 default:
107 vty->node = CONFIG_NODE;
108 }
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200109 return (enum node_type) vty->node;
Andreas Eversberg12942562012-07-12 14:31:57 +0200110}
111
112int pcu_vty_is_config_node(struct vty *vty, int node)
113{
114 switch (node) {
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200115 case PCU_NODE:
Andreas Eversberg12942562012-07-12 14:31:57 +0200116 return 1;
Andreas Eversberg12942562012-07-12 14:31:57 +0200117 default:
118 return 0;
119 }
120}
121
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200122static struct cmd_node pcu_node = {
123 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200124 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200125 1,
126};
127
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200128static int config_write_pcu(struct vty *vty)
129{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200130 struct gprs_rlcmac_bts *bts = bts_main_data();
Harald Welte717cdf52017-07-21 21:56:23 +0200131 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200132
133 vty_out(vty, "pcu%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200134 if (bts->egprs_enabled)
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100135 vty_out(vty, " egprs only%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200136
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200137 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
138 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200139 if (bts->fc_bvc_bucket_size)
140 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
141 bts->fc_bvc_bucket_size, VTY_NEWLINE);
142 if (bts->fc_bvc_leak_rate)
143 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
144 bts->fc_bvc_leak_rate, VTY_NEWLINE);
145 if (bts->fc_ms_bucket_size)
146 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
147 bts->fc_ms_bucket_size, VTY_NEWLINE);
148 if (bts->fc_ms_leak_rate)
149 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
150 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200151 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +0200152 if (bts->initial_cs_ul == bts->initial_cs_dl)
153 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
154 VTY_NEWLINE);
155 else
156 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
157 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200158 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200159 if (bts->max_cs_dl && bts->max_cs_ul) {
160 if (bts->max_cs_ul == bts->max_cs_dl)
161 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
162 VTY_NEWLINE);
163 else
164 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
165 bts->max_cs_ul, VTY_NEWLINE);
166 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200167 if (bts->cs_adj_enabled)
168 vty_out(vty, " cs threshold %d %d%s",
169 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
170 VTY_NEWLINE);
171 else
172 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
173
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200174 if (bts->cs_downgrade_threshold)
175 vty_out(vty, " cs downgrade-threshold %d%s",
176 bts->cs_downgrade_threshold, VTY_NEWLINE);
177 else
178 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
179
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200180 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
181 bts->cs_lqual_ranges[0].high,
182 bts->cs_lqual_ranges[1].low,
183 bts->cs_lqual_ranges[1].high,
184 bts->cs_lqual_ranges[2].low,
185 bts->cs_lqual_ranges[2].high,
186 bts->cs_lqual_ranges[3].low,
187 VTY_NEWLINE);
188
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400189 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",
190 bts->mcs_lqual_ranges[0].high,
191 bts->mcs_lqual_ranges[1].low,
192 bts->mcs_lqual_ranges[1].high,
193 bts->mcs_lqual_ranges[2].low,
194 bts->mcs_lqual_ranges[2].high,
195 bts->mcs_lqual_ranges[3].low,
196 bts->mcs_lqual_ranges[3].high,
197 bts->mcs_lqual_ranges[4].low,
198 bts->mcs_lqual_ranges[4].high,
199 bts->mcs_lqual_ranges[5].low,
200 bts->mcs_lqual_ranges[5].high,
201 bts->mcs_lqual_ranges[6].low,
202 bts->mcs_lqual_ranges[6].high,
203 bts->mcs_lqual_ranges[7].low,
204 bts->mcs_lqual_ranges[7].high,
205 bts->mcs_lqual_ranges[8].low,
206 VTY_NEWLINE);
207
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100208 if (bts->initial_mcs_dl != 1 && bts->initial_mcs_ul != 1) {
209 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
210 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
211 VTY_NEWLINE);
212 else
213 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
214 bts->initial_mcs_ul, VTY_NEWLINE);
215 }
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400216
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100217 if (bts->max_mcs_dl && bts->max_mcs_ul) {
218 if (bts->max_mcs_ul == bts->max_mcs_dl)
219 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
220 VTY_NEWLINE);
221 else
222 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
223 bts->max_mcs_ul, VTY_NEWLINE);
224 }
225
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100226 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
227 VTY_NEWLINE);
228
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530229 if (bts->dl_arq_type)
230 vty_out(vty, " egprs dl arq-type arq2%s",
231 VTY_NEWLINE);
232
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200233 if (bts->force_llc_lifetime == 0xffff)
234 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
235 else if (bts->force_llc_lifetime)
236 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
237 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100238 if (bts->llc_discard_csec)
239 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
240 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200241 if (bts->llc_idle_ack_csec)
242 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
243 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200244 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
245 vty_out(vty, " queue codel%s", VTY_NEWLINE);
246 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
247 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
248 else
249 vty_out(vty, " queue codel interval %d%s",
250 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
251
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200252 if (bts->alloc_algorithm == alloc_algorithm_a)
253 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
254 if (bts->alloc_algorithm == alloc_algorithm_b)
255 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200256 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
257 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200258 if (bts->force_two_phase)
259 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200260 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
261 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Oliver Smith45fdc442019-09-05 15:12:20 +0200262 if (!bts->dl_tbf_preemptive_retransmission)
263 vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200264 if (strcmp(bts->pcu_sock_path, PCU_SOCK_DEFAULT))
265 vty_out(vty, " pcu-socket %s%s", bts->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200266
Harald Welte717cdf52017-07-21 21:56:23 +0200267 for (i = 0; i < 32; i++) {
268 unsigned int cs = (1 << i);
269 if (bts->gsmtap_categ_mask & cs) {
270 vty_out(vty, " gsmtap-category %s%s",
271 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
272 }
273 }
274
Harald Welte57d35152018-07-05 03:11:17 +0200275 if (bts->gb_dialect_sns)
276 vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);
277 else
278 vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);
279
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200280 osmo_tdef_vty_write(vty, bts->T_defs_pcu, " timer ");
281
Maxc9ce6f92018-01-30 17:53:02 +0100282 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200283}
284
285/* per-BTS configuration */
286DEFUN(cfg_pcu,
287 cfg_pcu_cmd,
288 "pcu",
289 "BTS specific configure")
290{
291 vty->node = PCU_NODE;
292
293 return CMD_SUCCESS;
294}
295
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200296#define EGPRS_STR "EGPRS configuration\n"
297
298DEFUN(cfg_pcu_egprs,
299 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100300 "egprs only",
301 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200302{
303 struct gprs_rlcmac_bts *bts = bts_main_data();
304
305 bts->egprs_enabled = 1;
306
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200307 return CMD_SUCCESS;
308}
309
310DEFUN(cfg_pcu_no_egprs,
311 cfg_pcu_no_egprs_cmd,
312 "no egprs",
313 NO_STR EGPRS_STR)
314{
315 struct gprs_rlcmac_bts *bts = bts_main_data();
316
317 bts->egprs_enabled = 0;
318
319 return CMD_SUCCESS;
320}
321
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200322DEFUN(cfg_pcu_fc_interval,
323 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200324 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200325 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200326 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200327{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200328 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200329
330 bts->fc_interval = atoi(argv[0]);
331
332 return CMD_SUCCESS;
333}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200334#define FC_STR "BSSGP Flow Control configuration\n"
335#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
336#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
337
338DEFUN(cfg_pcu_fc_bvc_bucket_size,
339 cfg_pcu_fc_bvc_bucket_size_cmd,
340 "flow-control force-bvc-bucket-size <1-6553500>",
341 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
342{
343 struct gprs_rlcmac_bts *bts = bts_main_data();
344
345 bts->fc_bvc_bucket_size = atoi(argv[0]);
346
347 return CMD_SUCCESS;
348}
349
350DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
351 cfg_pcu_no_fc_bvc_bucket_size_cmd,
352 "no flow-control force-bvc-bucket-size",
353 NO_STR FC_STR FC_BMAX_STR("BVC"))
354{
355 struct gprs_rlcmac_bts *bts = bts_main_data();
356
357 bts->fc_bvc_bucket_size = 0;
358
359 return CMD_SUCCESS;
360}
361
362DEFUN(cfg_pcu_fc_bvc_leak_rate,
363 cfg_pcu_fc_bvc_leak_rate_cmd,
364 "flow-control force-bvc-leak-rate <1-6553500>",
365 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
366{
367 struct gprs_rlcmac_bts *bts = bts_main_data();
368
369 bts->fc_bvc_leak_rate = atoi(argv[0]);
370
371 return CMD_SUCCESS;
372}
373
374DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
375 cfg_pcu_no_fc_bvc_leak_rate_cmd,
376 "no flow-control force-bvc-leak-rate",
377 NO_STR FC_STR FC_LR_STR("BVC"))
378{
379 struct gprs_rlcmac_bts *bts = bts_main_data();
380
381 bts->fc_bvc_leak_rate = 0;
382
383 return CMD_SUCCESS;
384}
385
386DEFUN(cfg_pcu_fc_ms_bucket_size,
387 cfg_pcu_fc_ms_bucket_size_cmd,
388 "flow-control force-ms-bucket-size <1-6553500>",
389 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
390{
391 struct gprs_rlcmac_bts *bts = bts_main_data();
392
393 bts->fc_ms_bucket_size = atoi(argv[0]);
394
395 return CMD_SUCCESS;
396}
397
398DEFUN(cfg_pcu_no_fc_ms_bucket_size,
399 cfg_pcu_no_fc_ms_bucket_size_cmd,
400 "no flow-control force-ms-bucket-size",
401 NO_STR FC_STR FC_BMAX_STR("default MS"))
402{
403 struct gprs_rlcmac_bts *bts = bts_main_data();
404
405 bts->fc_ms_bucket_size = 0;
406
407 return CMD_SUCCESS;
408}
409
410DEFUN(cfg_pcu_fc_ms_leak_rate,
411 cfg_pcu_fc_ms_leak_rate_cmd,
412 "flow-control force-ms-leak-rate <1-6553500>",
413 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
414{
415 struct gprs_rlcmac_bts *bts = bts_main_data();
416
417 bts->fc_ms_leak_rate = atoi(argv[0]);
418
419 return CMD_SUCCESS;
420}
421
422DEFUN(cfg_pcu_no_fc_ms_leak_rate,
423 cfg_pcu_no_fc_ms_leak_rate_cmd,
424 "no flow-control force-ms-leak-rate",
425 NO_STR FC_STR FC_LR_STR("default MS"))
426{
427 struct gprs_rlcmac_bts *bts = bts_main_data();
428
429 bts->fc_ms_leak_rate = 0;
430
431 return CMD_SUCCESS;
432}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200433
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200434#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
435DEFUN(cfg_pcu_fc_bucket_time,
436 cfg_pcu_fc_bucket_time_cmd,
437 "flow-control bucket-time <1-65534>",
438 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
439{
440 struct gprs_rlcmac_bts *bts = bts_main_data();
441
442 bts->fc_bucket_time = atoi(argv[0]);
443
444 return CMD_SUCCESS;
445}
446
447DEFUN(cfg_pcu_no_fc_bucket_time,
448 cfg_pcu_no_fc_bucket_time_cmd,
449 "no flow-control bucket-time",
450 NO_STR FC_STR FC_BTIME_STR)
451{
452 struct gprs_rlcmac_bts *bts = bts_main_data();
453
454 bts->fc_bucket_time = 0;
455
456 return CMD_SUCCESS;
457}
458
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200459#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200460
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200461DEFUN(cfg_pcu_cs,
462 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200463 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200464 CS_STR
465 "Initial CS value to be used (overrides BTS config)\n"
466 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200467{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200468 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200469 uint8_t cs = atoi(argv[0]);
470
471 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200472 bts->initial_cs_dl = cs;
473 if (argc > 1)
474 bts->initial_cs_ul = atoi(argv[1]);
475 else
476 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200477
478 return CMD_SUCCESS;
479}
480
481DEFUN(cfg_pcu_no_cs,
482 cfg_pcu_no_cs_cmd,
483 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200484 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200485{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200486 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200487
488 bts->force_cs = 0;
489
490 return CMD_SUCCESS;
491}
492
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100493#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200494DEFUN(cfg_pcu_cs_max,
495 cfg_pcu_cs_max_cmd,
496 "cs max <1-4> [<1-4>]",
497 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100498 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200499 "Maximum CS value to be used\n"
500 "Use a different maximum CS value for the uplink")
501{
502 struct gprs_rlcmac_bts *bts = bts_main_data();
503 uint8_t cs = atoi(argv[0]);
504
505 bts->max_cs_dl = cs;
506 if (argc > 1)
507 bts->max_cs_ul = atoi(argv[1]);
508 else
509 bts->max_cs_ul = cs;
510
511 return CMD_SUCCESS;
512}
513
514DEFUN(cfg_pcu_no_cs_max,
515 cfg_pcu_no_cs_max_cmd,
516 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100517 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200518{
519 struct gprs_rlcmac_bts *bts = bts_main_data();
520
521 bts->max_cs_dl = 0;
522 bts->max_cs_ul = 0;
523
524 return CMD_SUCCESS;
525}
526
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100527#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
528
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100529DEFUN(cfg_pcu_mcs,
530 cfg_pcu_mcs_cmd,
531 "mcs <1-9> [<1-9>]",
532 MCS_STR
533 "Initial MCS value to be used (default 1)\n"
534 "Use a different initial MCS value for the uplink")
535{
536 struct gprs_rlcmac_bts *bts = bts_main_data();
537 uint8_t cs = atoi(argv[0]);
538
539 bts->initial_mcs_dl = cs;
540 if (argc > 1)
541 bts->initial_mcs_ul = atoi(argv[1]);
542 else
543 bts->initial_mcs_ul = cs;
544
545 return CMD_SUCCESS;
546}
547
548DEFUN(cfg_pcu_no_mcs,
549 cfg_pcu_no_mcs_cmd,
550 "no mcs",
551 NO_STR MCS_STR)
552{
553 struct gprs_rlcmac_bts *bts = bts_main_data();
554
555 bts->initial_mcs_dl = 1;
556 bts->initial_mcs_ul = 1;
557
558 return CMD_SUCCESS;
559}
560
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100561DEFUN(cfg_pcu_mcs_max,
562 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100563 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100564 MCS_STR
565 CS_MAX_STR
566 "Maximum MCS value to be used\n"
567 "Use a different maximum MCS value for the uplink")
568{
569 struct gprs_rlcmac_bts *bts = bts_main_data();
570 uint8_t mcs = atoi(argv[0]);
571
572 bts->max_mcs_dl = mcs;
573 if (argc > 1)
574 bts->max_mcs_ul = atoi(argv[1]);
575 else
576 bts->max_mcs_ul = mcs;
577
578 return CMD_SUCCESS;
579}
580
581DEFUN(cfg_pcu_no_mcs_max,
582 cfg_pcu_no_mcs_max_cmd,
583 "no mcs max",
584 NO_STR MCS_STR CS_MAX_STR)
585{
586 struct gprs_rlcmac_bts *bts = bts_main_data();
587
588 bts->max_mcs_dl = 0;
589 bts->max_mcs_ul = 0;
590
591 return CMD_SUCCESS;
592}
593
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530594#define DL_STR "downlink specific configuration\n"
595
596DEFUN(cfg_pcu_dl_arq_type,
597 cfg_pcu_dl_arq_cmd,
598 "egprs dl arq-type (spb|arq2)",
599 EGPRS_STR DL_STR "ARQ options\n"
600 "enable SPB(ARQ1) support\n"
601 "enable ARQ2 support")
602{
603 struct gprs_rlcmac_bts *bts = bts_main_data();
604
605 if (!strcmp(argv[0], "arq2"))
606 bts->dl_arq_type = 1;
607 else
608 bts->dl_arq_type = 0;
609
610 return CMD_SUCCESS;
611}
612
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100613DEFUN(cfg_pcu_window_size,
614 cfg_pcu_window_size_cmd,
615 "window-size <0-1024> [<0-256>]",
616 "Window size configuration (b + N_PDCH * f)\n"
617 "Base value (b)\n"
618 "Factor for number of PDCH (f)")
619{
620 struct gprs_rlcmac_bts *bts = bts_main_data();
621 uint16_t b = atoi(argv[0]);
622
623 bts->ws_base = b;
624 if (argc > 1) {
625 uint16_t f = atoi(argv[1]);
626 bts->ws_pdch = f;
627 }
628
629 return CMD_SUCCESS;
630}
631
632
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200633#define QUEUE_STR "Packet queue options\n"
634#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
635 "(overrides the value given by SGSN)\n"
636
637DEFUN(cfg_pcu_queue_lifetime,
638 cfg_pcu_queue_lifetime_cmd,
639 "queue lifetime <1-65534>",
640 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
641{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200642 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200643 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200644
645 bts->force_llc_lifetime = csec;
646
647 return CMD_SUCCESS;
648}
649
650DEFUN(cfg_pcu_queue_lifetime_inf,
651 cfg_pcu_queue_lifetime_inf_cmd,
652 "queue lifetime infinite",
653 QUEUE_STR LIFETIME_STR "Infinite lifetime")
654{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200655 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200656
657 bts->force_llc_lifetime = 0xffff;
658
659 return CMD_SUCCESS;
660}
661
662DEFUN(cfg_pcu_no_queue_lifetime,
663 cfg_pcu_no_queue_lifetime_cmd,
664 "no queue lifetime",
665 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
666 "by SGSN)\n")
667{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200668 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200669
670 bts->force_llc_lifetime = 0;
671
672 return CMD_SUCCESS;
673}
674
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100675#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
676 "(continue discarding until lifetime-hysteresis is reached)\n"
677
678DEFUN(cfg_pcu_queue_hysteresis,
679 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200680 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100681 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
682{
683 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200684 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100685
686 bts->llc_discard_csec = csec;
687
688 return CMD_SUCCESS;
689}
690
691DEFUN(cfg_pcu_no_queue_hysteresis,
692 cfg_pcu_no_queue_hysteresis_cmd,
693 "no queue hysteresis",
694 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
695{
696 struct gprs_rlcmac_bts *bts = bts_main_data();
697
698 bts->llc_discard_csec = 0;
699
700 return CMD_SUCCESS;
701}
702
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200703#define QUEUE_CODEL_STR "Set CoDel queue management\n"
704
705DEFUN(cfg_pcu_queue_codel,
706 cfg_pcu_queue_codel_cmd,
707 "queue codel",
708 QUEUE_STR QUEUE_CODEL_STR)
709{
710 struct gprs_rlcmac_bts *bts = bts_main_data();
711
712 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
713
714 return CMD_SUCCESS;
715}
716
717DEFUN(cfg_pcu_queue_codel_interval,
718 cfg_pcu_queue_codel_interval_cmd,
719 "queue codel interval <1-1000>",
720 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
721{
722 struct gprs_rlcmac_bts *bts = bts_main_data();
723 uint16_t csec = atoi(argv[0]);
724
725 bts->llc_codel_interval_msec = 10*csec;
726
727 return CMD_SUCCESS;
728}
729
730DEFUN(cfg_pcu_no_queue_codel,
731 cfg_pcu_no_queue_codel_cmd,
732 "no queue codel",
733 NO_STR QUEUE_STR QUEUE_CODEL_STR)
734{
735 struct gprs_rlcmac_bts *bts = bts_main_data();
736
737 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
738
739 return CMD_SUCCESS;
740}
741
742
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200743#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
744
745DEFUN(cfg_pcu_queue_idle_ack_delay,
746 cfg_pcu_queue_idle_ack_delay_cmd,
747 "queue idle-ack-delay <1-65535>",
748 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
749{
750 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200751 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200752
753 bts->llc_idle_ack_csec = csec;
754
755 return CMD_SUCCESS;
756}
757
758DEFUN(cfg_pcu_no_queue_idle_ack_delay,
759 cfg_pcu_no_queue_idle_ack_delay_cmd,
760 "no queue idle-ack-delay",
761 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
762{
763 struct gprs_rlcmac_bts *bts = bts_main_data();
764
765 bts->llc_idle_ack_csec = 0;
766
767 return CMD_SUCCESS;
768}
769
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100770
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200771DEFUN(cfg_pcu_alloc,
772 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200773 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200774 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200775 "PACCH\n"
776 "Single slot is assigned only\n"
777 "Multiple slots are assigned for semi-duplex operation\n"
778 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200779{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200780 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200781
782 switch (argv[0][0]) {
783 case 'a':
784 bts->alloc_algorithm = alloc_algorithm_a;
785 break;
786 case 'b':
787 bts->alloc_algorithm = alloc_algorithm_b;
788 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200789 default:
790 bts->alloc_algorithm = alloc_algorithm_dynamic;
791 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200792 }
793
794 return CMD_SUCCESS;
795}
796
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200797DEFUN(cfg_pcu_two_phase,
798 cfg_pcu_two_phase_cmd,
799 "two-phase-access",
800 "Force two phase access when MS requests single phase access\n")
801{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200802 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200803
804 bts->force_two_phase = 1;
805
806 return CMD_SUCCESS;
807}
808
809DEFUN(cfg_pcu_no_two_phase,
810 cfg_pcu_no_two_phase_cmd,
811 "no two-phase-access",
812 NO_STR "Only use two phase access when requested my MS\n")
813{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200814 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200815
816 bts->force_two_phase = 0;
817
818 return CMD_SUCCESS;
819}
820
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200821DEFUN(cfg_pcu_alpha,
822 cfg_pcu_alpha_cmd,
823 "alpha <0-10>",
824 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
825 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
826 "Alpha in units of 0.1\n")
827{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200828 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200829
830 bts->alpha = atoi(argv[0]);
831
832 return CMD_SUCCESS;
833}
834
835DEFUN(cfg_pcu_gamma,
836 cfg_pcu_gamma_cmd,
837 "gamma <0-62>",
838 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
839 "Gamma in even unit of dBs\n")
840{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200841 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200842
843 bts->gamma = atoi(argv[0]) / 2;
844
845 return CMD_SUCCESS;
846}
847
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100848DEFUN(show_bts_stats,
849 show_bts_stats_cmd,
850 "show bts statistics",
851 SHOW_STR "BTS related functionality\nStatistics\n")
852{
853 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
854 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100855}
856
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100857#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200858DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100859 cfg_pcu_dl_tbf_idle_time_cmd,
860 "dl-tbf-idle-time <1-5000>",
861 IDLE_TIME_STR "idle time in msec")
862{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200863 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
864
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100865 struct gprs_rlcmac_bts *bts = bts_main_data();
866
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200867 if (osmo_tdef_set(bts->T_defs_pcu, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
868 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100869 return CMD_SUCCESS;
870}
871
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200872DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100873 cfg_pcu_no_dl_tbf_idle_time_cmd,
874 "no dl-tbf-idle-time",
875 NO_STR IDLE_TIME_STR)
876{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200877 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
878
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100879 struct gprs_rlcmac_bts *bts = bts_main_data();
880
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200881 if (osmo_tdef_set(bts->T_defs_pcu, -2031, 0, OSMO_TDEF_MS) < 0)
882 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100883 return CMD_SUCCESS;
884}
885
Oliver Smith45fdc442019-09-05 15:12:20 +0200886#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
887 " less readable traces)"
888DEFUN(cfg_pcu_dl_tbf_preemptive_retransmission,
889 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
890 "dl-tbf-preemptive-retransmission",
891 RETRANSMISSION_STR " (enabled by default)")
892{
893 struct gprs_rlcmac_bts *bts = bts_main_data();
894
895 bts->dl_tbf_preemptive_retransmission = true;
896
897 return CMD_SUCCESS;
898}
899
900DEFUN(cfg_pcu_no_dl_tbf_preemptive_retransmission,
901 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
902 "no dl-tbf-preemptive-retransmission",
903 NO_STR RETRANSMISSION_STR)
904{
905 struct gprs_rlcmac_bts *bts = bts_main_data();
906
907 bts->dl_tbf_preemptive_retransmission = false;
908
909 return CMD_SUCCESS;
910}
911
Jacob Erlbecka098c192015-05-28 16:11:19 +0200912#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200913DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200914 cfg_pcu_ms_idle_time_cmd,
915 "ms-idle-time <1-7200>",
916 MS_IDLE_TIME_STR "idle time in sec")
917{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200918 vty_out(vty, "%% 'ms-idle-time' is now deprecated: use 'timer X2030 <val>' instead%s", VTY_NEWLINE);
919
Jacob Erlbecka098c192015-05-28 16:11:19 +0200920 struct gprs_rlcmac_bts *bts = bts_main_data();
921
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200922 if (osmo_tdef_set(bts->T_defs_pcu, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
923 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200924 return CMD_SUCCESS;
925}
926
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200927DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200928 cfg_pcu_no_ms_idle_time_cmd,
929 "no ms-idle-time",
930 NO_STR MS_IDLE_TIME_STR)
931{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200932 vty_out(vty, "%% 'no ms-idle-time' is now deprecated: use 'timer X2030 0' instead%s", VTY_NEWLINE);
933
Jacob Erlbecka098c192015-05-28 16:11:19 +0200934 struct gprs_rlcmac_bts *bts = bts_main_data();
935
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200936 if (osmo_tdef_set(bts->T_defs_pcu, -2030, 0, OSMO_TDEF_S) < 0)
937 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200938 return CMD_SUCCESS;
939}
940
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100941#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200942DEFUN(cfg_pcu_cs_err_limits,
943 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200944 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200945 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
946{
947 struct gprs_rlcmac_bts *bts = bts_main_data();
948
949 uint8_t lower_limit = atoi(argv[0]);
950 uint8_t upper_limit = atoi(argv[1]);
951
952 if (lower_limit > upper_limit) {
953 vty_out(vty,
954 "The lower limit must be less than or equal to the "
955 "upper limit.%s", VTY_NEWLINE);
956 return CMD_WARNING;
957 }
958
959 bts->cs_adj_enabled = 1;
960 bts->cs_adj_upper_limit = upper_limit;
961 bts->cs_adj_lower_limit = lower_limit;
962
963 return CMD_SUCCESS;
964}
965
966DEFUN(cfg_pcu_no_cs_err_limits,
967 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200968 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200969 NO_STR CS_STR CS_ERR_LIMITS_STR)
970{
971 struct gprs_rlcmac_bts *bts = bts_main_data();
972
973 bts->cs_adj_enabled = 0;
974 bts->cs_adj_upper_limit = 100;
975 bts->cs_adj_lower_limit = 0;
976
977 return CMD_SUCCESS;
978}
979
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100980#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200981DEFUN(cfg_pcu_cs_downgrade_thrsh,
982 cfg_pcu_cs_downgrade_thrsh_cmd,
983 "cs downgrade-threshold <1-10000>",
984 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
985{
986 struct gprs_rlcmac_bts *bts = bts_main_data();
987
988 bts->cs_downgrade_threshold = atoi(argv[0]);
989
990 return CMD_SUCCESS;
991}
992
993DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
994 cfg_pcu_no_cs_downgrade_thrsh_cmd,
995 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200996 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200997{
998 struct gprs_rlcmac_bts *bts = bts_main_data();
999
1000 bts->cs_downgrade_threshold = 0;
1001
1002 return CMD_SUCCESS;
1003}
1004
1005
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001006DEFUN(cfg_pcu_cs_lqual_ranges,
1007 cfg_pcu_cs_lqual_ranges_cmd,
1008 "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 +01001009 CS_STR "Set link quality ranges for each uplink CS\n"
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001010 "Set quality range for CS-1 (high value only)\n"
1011 "CS-1 high (dB)\n"
1012 "Set quality range for CS-2\n"
1013 "CS-2 low (dB)\n"
1014 "CS-2 high (dB)\n"
1015 "Set quality range for CS-3\n"
1016 "CS-3 low (dB)\n"
1017 "CS-3 high (dB)\n"
1018 "Set quality range for CS-4 (low value only)\n"
1019 "CS-4 low (dB)\n")
1020{
1021 struct gprs_rlcmac_bts *bts = bts_main_data();
1022
1023 uint8_t cs1_high = atoi(argv[0]);
1024 uint8_t cs2_low = atoi(argv[1]);
1025 uint8_t cs2_high = atoi(argv[2]);
1026 uint8_t cs3_low = atoi(argv[3]);
1027 uint8_t cs3_high = atoi(argv[4]);
1028 uint8_t cs4_low = atoi(argv[5]);
1029
1030 bts->cs_lqual_ranges[0].high = cs1_high;
1031 bts->cs_lqual_ranges[1].low = cs2_low;
1032 bts->cs_lqual_ranges[1].high = cs2_high;
1033 bts->cs_lqual_ranges[2].low = cs3_low;
1034 bts->cs_lqual_ranges[2].high = cs3_high;
1035 bts->cs_lqual_ranges[3].low = cs4_low;
1036
1037 return CMD_SUCCESS;
1038}
1039
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001040DEFUN(cfg_pcu_mcs_lqual_ranges,
1041 cfg_pcu_mcs_lqual_ranges_cmd,
1042 "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 +01001043 CS_STR "Set link quality ranges for each uplink MCS\n"
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001044 "Set quality range for MCS-1 (high value only)\n"
1045 "MCS-1 high (dB)\n"
1046 "Set quality range for MCS-2\n"
1047 "MCS-2 high (dB)\n"
1048 "MCS-2 low (dB)\n"
1049 "Set quality range for MCS-3\n"
1050 "MCS-3 high (dB)\n"
1051 "MCS-3 low (dB)\n"
1052 "Set quality range for MCS-4\n"
1053 "MCS-4 high (dB)\n"
1054 "MCS-4 low (dB)\n"
1055 "Set quality range for MCS-5\n"
1056 "MCS-5 high (dB)\n"
1057 "MCS-5 low (dB)\n"
1058 "Set quality range for MCS-6\n"
1059 "MCS-6 low (dB)\n"
1060 "MCS-6 high (dB)\n"
1061 "Set quality range for MCS-7\n"
1062 "MCS-7 low (dB)\n"
1063 "MCS-7 high (dB)\n"
1064 "Set quality range for MCS-8\n"
1065 "MCS-8 low (dB)\n"
1066 "MCS-8 high (dB)\n"
1067 "Set quality range for MCS-9 (low value only)\n"
1068 "MCS-9 low (dB)\n")
1069{
1070 struct gprs_rlcmac_bts *bts = bts_main_data();
1071
1072 bts->mcs_lqual_ranges[0].high = atoi(argv[0]);
1073 bts->mcs_lqual_ranges[1].low = atoi(argv[1]);
1074 bts->mcs_lqual_ranges[1].high = atoi(argv[2]);
1075 bts->mcs_lqual_ranges[2].low = atoi(argv[3]);
1076 bts->mcs_lqual_ranges[2].high = atoi(argv[4]);
1077 bts->mcs_lqual_ranges[3].low = atoi(argv[5]);
1078 bts->mcs_lqual_ranges[3].high = atoi(argv[6]);
1079 bts->mcs_lqual_ranges[4].low = atoi(argv[7]);
1080 bts->mcs_lqual_ranges[4].high = atoi(argv[8]);
1081 bts->mcs_lqual_ranges[5].low = atoi(argv[9]);
1082 bts->mcs_lqual_ranges[5].high = atoi(argv[10]);
1083 bts->mcs_lqual_ranges[6].low = atoi(argv[11]);
1084 bts->mcs_lqual_ranges[6].high = atoi(argv[12]);
1085 bts->mcs_lqual_ranges[7].low = atoi(argv[13]);
1086 bts->mcs_lqual_ranges[7].high = atoi(argv[14]);
1087 bts->mcs_lqual_ranges[8].low = atoi(argv[15]);
1088
1089 return CMD_SUCCESS;
1090}
1091
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001092DEFUN(cfg_pcu_sock,
1093 cfg_pcu_sock_cmd,
1094 "pcu-socket PATH",
1095 "Configure the osmo-bts PCU socket file/path name\n"
1096 "Path of the socket to connect to\n")
1097{
1098 struct gprs_rlcmac_bts *bts = bts_main_data();
1099
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +07001100 if (vty->type != VTY_FILE)
1101 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
1102
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001103 if (bts->pcu_sock_path) {
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001104 talloc_free(bts->pcu_sock_path);
1105 }
1106 bts->pcu_sock_path = talloc_strdup(tall_pcu_ctx, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001107
1108 return CMD_SUCCESS;
1109}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001110
Harald Welte57d35152018-07-05 03:11:17 +02001111DEFUN(cfg_pcu_gb_dialect,
1112 cfg_pcu_gb_dialect_cmd,
1113 "gb-dialect (classic|ip-sns)",
1114 "Select which Gb interface dialect to use\n"
1115 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1116 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
1117{
1118 struct gprs_rlcmac_bts *bts = bts_main_data();
1119
1120 if (!strcmp(argv[0], "ip-sns"))
1121 bts->gb_dialect_sns = true;
1122 else
1123 bts->gb_dialect_sns = false;
1124
1125 return CMD_SUCCESS;
1126}
1127
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001128DEFUN(show_bts_timer, show_bts_timer_cmd,
1129 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1130 SHOW_STR "Show BTS controlled timers\n"
1131 OSMO_TDEF_VTY_DOC_T)
1132{
1133 struct gprs_rlcmac_bts *bts = bts_main_data();
1134 const char *T_arg = argc > 0 ? argv[0] : NULL;
1135 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, NULL);
1136}
1137
1138DEFUN(show_timer, show_timer_cmd,
1139 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1140 SHOW_STR "Show PCU timers\n"
1141 OSMO_TDEF_VTY_DOC_T)
1142{
1143 struct gprs_rlcmac_bts *bts = bts_main_data();
1144 const char *T_arg = argc > 0 ? argv[0] : NULL;
1145 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_pcu, T_arg, NULL);
1146}
1147
1148DEFUN(cfg_pcu_timer, cfg_pcu_timer_cmd,
1149 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1150 "Configure or show PCU timers\n"
1151 OSMO_TDEF_VTY_DOC_SET)
1152{
1153 struct gprs_rlcmac_bts *bts = bts_main_data();
1154 /* If any arguments are missing, redirect to 'show' */
1155 if (argc < 2)
1156 return show_timer(self, vty, argc, argv);
1157 return osmo_tdef_vty_set_cmd(vty, bts->T_defs_pcu, argv);
1158}
1159
Daniel Willmann772415f2014-01-15 17:06:51 +01001160DEFUN(show_tbf,
1161 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001162 "show tbf (all|ccch|pacch)",
1163 SHOW_STR "information about TBFs\n"
1164 "All TBFs\n"
1165 "TBFs allocated via CCCH\n"
1166 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001167{
1168 struct gprs_rlcmac_bts *bts = bts_main_data();
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001169 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001170
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001171 if (argv[0][0] == 'c')
1172 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1173 else if (argv[0][0] == 'p')
1174 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001175
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001176 return pcu_vty_show_tbf_all(vty, bts, flags);
Daniel Willmann772415f2014-01-15 17:06:51 +01001177}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001178
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001179DEFUN(show_ms_all,
1180 show_ms_all_cmd,
1181 "show ms all",
1182 SHOW_STR "information about MSs\n" "All TBFs\n")
1183{
1184 struct gprs_rlcmac_bts *bts = bts_main_data();
1185 return pcu_vty_show_ms_all(vty, bts);
1186}
1187
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001188DEFUN(show_ms_tlli,
1189 show_ms_tlli_cmd,
1190 "show ms tlli TLLI",
1191 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1192{
1193 struct gprs_rlcmac_bts *bts = bts_main_data();
1194 char *endp = NULL;
1195 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1196 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1197 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1198 return CMD_WARNING;
1199 }
1200 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
1201}
1202
1203DEFUN(show_ms_imsi,
1204 show_ms_imsi_cmd,
1205 "show ms imsi IMSI",
1206 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1207{
1208 struct gprs_rlcmac_bts *bts = bts_main_data();
1209 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1210}
1211
Andreas Eversberg12942562012-07-12 14:31:57 +02001212static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001213 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1214 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001215 "License GNU GPL version 2 or later\r\n"
1216 "This is free software: you are free to change and redistribute it.\r\n"
1217 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1218
1219struct vty_app_info pcu_vty_info = {
1220 .name = "Osmo-PCU",
1221 .version = PACKAGE_VERSION,
1222 .copyright = pcu_copyright,
1223 .go_parent_cb = pcu_vty_go_parent,
1224 .is_config_node = pcu_vty_is_config_node,
1225};
1226
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001227int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001228{
1229// install_element_ve(&show_pcu_cmd);
1230
Harald Welte717cdf52017-07-21 21:56:23 +02001231 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1232 "gsmtap-category (",
1233 "|",")", VTY_DO_LOWER);
1234 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1235 "GSMTAP Category\n",
1236 "\n", "", 0);
1237 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1238 "no gsmtap-category (",
1239 "|",")", VTY_DO_LOWER);
1240 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1241 NO_STR "GSMTAP Category\n",
1242 "\n", "", 0);
1243
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001244 logging_vty_add_cmds();
1245 osmo_stats_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001246
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001247 install_node(&pcu_node, config_write_pcu);
1248 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001249 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1250 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001251 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001252 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1253 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001254 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1255 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001256 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1257 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001258 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1259 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001260 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001261 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001262 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301263 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001264 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001265 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1266 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001267 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001268 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1269 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1270 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001271 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1272 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001273 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1274 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1275 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001276 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1277 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001278 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001279 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001280 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001281 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1282 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001283 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1284 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1285 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1286 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1287 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1288 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1289 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1290 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001291 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1292 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001293 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1294 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001295 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1296 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001297 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1298 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001299 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1300 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001301 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001302 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001303 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001304
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001305 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001306 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001307 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001308 install_element_ve(&show_ms_tlli_cmd);
1309 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001310 install_element_ve(&show_bts_timer_cmd);
1311 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001312
Andreas Eversberg12942562012-07-12 14:31:57 +02001313 return 0;
1314}