blob: 26d0b18b34d143cc88d042a06db4f98941e4c02a [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
94
Jacob Erlbeckf76fede2015-08-17 13:42:46 +020095int pcu_vty_go_parent(struct vty *vty)
Andreas Eversberg12942562012-07-12 14:31:57 +020096{
97 switch (vty->node) {
98#if 0
99 case TRX_NODE:
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200100 vty->node = PCU_NODE;
Andreas Eversberg12942562012-07-12 14:31:57 +0200101 {
102 struct gsm_bts_trx *trx = vty->index;
103 vty->index = trx->bts;
104 }
105 break;
106#endif
107 default:
108 vty->node = CONFIG_NODE;
109 }
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200110 return (enum node_type) vty->node;
Andreas Eversberg12942562012-07-12 14:31:57 +0200111}
112
113int pcu_vty_is_config_node(struct vty *vty, int node)
114{
115 switch (node) {
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200116 case PCU_NODE:
Andreas Eversberg12942562012-07-12 14:31:57 +0200117 return 1;
Andreas Eversberg12942562012-07-12 14:31:57 +0200118 default:
119 return 0;
120 }
121}
122
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200123static struct cmd_node pcu_node = {
124 (enum node_type) PCU_NODE,
Jacob Erlbeckcc12f022015-04-09 15:45:24 +0200125 "%s(config-pcu)# ",
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200126 1,
127};
128
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200129static int config_write_pcu(struct vty *vty)
130{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200131 struct gprs_rlcmac_bts *bts = bts_main_data();
Harald Welte717cdf52017-07-21 21:56:23 +0200132 unsigned int i;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200133
134 vty_out(vty, "pcu%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200135 if (bts->egprs_enabled)
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100136 vty_out(vty, " egprs only%s", VTY_NEWLINE);
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200137
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200138 vty_out(vty, " flow-control-interval %d%s", bts->fc_interval,
139 VTY_NEWLINE);
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200140 if (bts->fc_bvc_bucket_size)
141 vty_out(vty, " flow-control force-bvc-bucket-size %d%s",
142 bts->fc_bvc_bucket_size, VTY_NEWLINE);
143 if (bts->fc_bvc_leak_rate)
144 vty_out(vty, " flow-control force-bvc-leak-rate %d%s",
145 bts->fc_bvc_leak_rate, VTY_NEWLINE);
146 if (bts->fc_ms_bucket_size)
147 vty_out(vty, " flow-control force-ms-bucket-size %d%s",
148 bts->fc_ms_bucket_size, VTY_NEWLINE);
149 if (bts->fc_ms_leak_rate)
150 vty_out(vty, " flow-control force-ms-leak-rate %d%s",
151 bts->fc_ms_leak_rate, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200152 if (bts->force_cs) {
Andreas Eversberg499ff412012-10-03 14:21:36 +0200153 if (bts->initial_cs_ul == bts->initial_cs_dl)
154 vty_out(vty, " cs %d%s", bts->initial_cs_dl,
155 VTY_NEWLINE);
156 else
157 vty_out(vty, " cs %d %d%s", bts->initial_cs_dl,
158 bts->initial_cs_ul, VTY_NEWLINE);
Holger Hans Peter Freytherc421e8a2014-07-02 14:55:17 +0200159 }
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200160 if (bts->max_cs_dl && bts->max_cs_ul) {
161 if (bts->max_cs_ul == bts->max_cs_dl)
162 vty_out(vty, " cs max %d%s", bts->max_cs_dl,
163 VTY_NEWLINE);
164 else
165 vty_out(vty, " cs max %d %d%s", bts->max_cs_dl,
166 bts->max_cs_ul, VTY_NEWLINE);
167 }
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200168 if (bts->cs_adj_enabled)
169 vty_out(vty, " cs threshold %d %d%s",
170 bts->cs_adj_lower_limit, bts->cs_adj_upper_limit,
171 VTY_NEWLINE);
172 else
173 vty_out(vty, " no cs threshold%s", VTY_NEWLINE);
174
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200175 if (bts->cs_downgrade_threshold)
176 vty_out(vty, " cs downgrade-threshold %d%s",
177 bts->cs_downgrade_threshold, VTY_NEWLINE);
178 else
179 vty_out(vty, " no cs downgrade-threshold%s", VTY_NEWLINE);
180
Jacob Erlbeck94cde132015-06-09 09:44:36 +0200181 vty_out(vty, " cs link-quality-ranges cs1 %d cs2 %d %d cs3 %d %d cs4 %d%s",
182 bts->cs_lqual_ranges[0].high,
183 bts->cs_lqual_ranges[1].low,
184 bts->cs_lqual_ranges[1].high,
185 bts->cs_lqual_ranges[2].low,
186 bts->cs_lqual_ranges[2].high,
187 bts->cs_lqual_ranges[3].low,
188 VTY_NEWLINE);
189
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400190 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",
191 bts->mcs_lqual_ranges[0].high,
192 bts->mcs_lqual_ranges[1].low,
193 bts->mcs_lqual_ranges[1].high,
194 bts->mcs_lqual_ranges[2].low,
195 bts->mcs_lqual_ranges[2].high,
196 bts->mcs_lqual_ranges[3].low,
197 bts->mcs_lqual_ranges[3].high,
198 bts->mcs_lqual_ranges[4].low,
199 bts->mcs_lqual_ranges[4].high,
200 bts->mcs_lqual_ranges[5].low,
201 bts->mcs_lqual_ranges[5].high,
202 bts->mcs_lqual_ranges[6].low,
203 bts->mcs_lqual_ranges[6].high,
204 bts->mcs_lqual_ranges[7].low,
205 bts->mcs_lqual_ranges[7].high,
206 bts->mcs_lqual_ranges[8].low,
207 VTY_NEWLINE);
208
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100209 if (bts->initial_mcs_dl != 1 && bts->initial_mcs_ul != 1) {
210 if (bts->initial_mcs_ul == bts->initial_mcs_dl)
211 vty_out(vty, " mcs %d%s", bts->initial_mcs_dl,
212 VTY_NEWLINE);
213 else
214 vty_out(vty, " mcs %d %d%s", bts->initial_mcs_dl,
215 bts->initial_mcs_ul, VTY_NEWLINE);
216 }
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -0400217
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100218 if (bts->max_mcs_dl && bts->max_mcs_ul) {
219 if (bts->max_mcs_ul == bts->max_mcs_dl)
220 vty_out(vty, " mcs max %d%s", bts->max_mcs_dl,
221 VTY_NEWLINE);
222 else
223 vty_out(vty, " mcs max %d %d%s", bts->max_mcs_dl,
224 bts->max_mcs_ul, VTY_NEWLINE);
225 }
226
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100227 vty_out(vty, " window-size %d %d%s", bts->ws_base, bts->ws_pdch,
228 VTY_NEWLINE);
229
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530230 if (bts->dl_arq_type)
231 vty_out(vty, " egprs dl arq-type arq2%s",
232 VTY_NEWLINE);
233
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200234 if (bts->force_llc_lifetime == 0xffff)
235 vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
236 else if (bts->force_llc_lifetime)
237 vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
238 VTY_NEWLINE);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100239 if (bts->llc_discard_csec)
240 vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
241 VTY_NEWLINE);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200242 if (bts->llc_idle_ack_csec)
243 vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
244 VTY_NEWLINE);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200245 if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
246 vty_out(vty, " queue codel%s", VTY_NEWLINE);
247 else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
248 vty_out(vty, " no queue codel%s", VTY_NEWLINE);
249 else
250 vty_out(vty, " queue codel interval %d%s",
251 bts->llc_codel_interval_msec/10, VTY_NEWLINE);
252
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200253 if (bts->alloc_algorithm == alloc_algorithm_a)
254 vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
255 if (bts->alloc_algorithm == alloc_algorithm_b)
256 vty_out(vty, " alloc-algorithm b%s", VTY_NEWLINE);
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200257 if (bts->alloc_algorithm == alloc_algorithm_dynamic)
258 vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200259 if (bts->force_two_phase)
260 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200261 vty_out(vty, " alpha %d%s", bts->alpha, VTY_NEWLINE);
262 vty_out(vty, " gamma %d%s", bts->gamma * 2, VTY_NEWLINE);
Oliver Smith45fdc442019-09-05 15:12:20 +0200263 if (!bts->dl_tbf_preemptive_retransmission)
264 vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +0200265 if (strcmp(bts->pcu_sock_path, PCU_SOCK_DEFAULT))
266 vty_out(vty, " pcu-socket %s%s", bts->pcu_sock_path, VTY_NEWLINE);
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200267
Harald Welte717cdf52017-07-21 21:56:23 +0200268 for (i = 0; i < 32; i++) {
269 unsigned int cs = (1 << i);
270 if (bts->gsmtap_categ_mask & cs) {
271 vty_out(vty, " gsmtap-category %s%s",
272 get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE);
273 }
274 }
275
Harald Welte57d35152018-07-05 03:11:17 +0200276 if (bts->gb_dialect_sns)
277 vty_out(vty, " gb-dialect ip-sns%s", VTY_NEWLINE);
278 else
279 vty_out(vty, " gb-dialect classic%s", VTY_NEWLINE);
280
Pau Espin Pedrol18794422019-09-26 18:25:35 +0200281 osmo_tdef_vty_write(vty, bts->T_defs_pcu, " timer ");
282
Maxc9ce6f92018-01-30 17:53:02 +0100283 return CMD_SUCCESS;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200284}
285
286/* per-BTS configuration */
287DEFUN(cfg_pcu,
288 cfg_pcu_cmd,
289 "pcu",
290 "BTS specific configure")
291{
292 vty->node = PCU_NODE;
293
294 return CMD_SUCCESS;
295}
296
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200297#define EGPRS_STR "EGPRS configuration\n"
298
299DEFUN(cfg_pcu_egprs,
300 cfg_pcu_egprs_cmd,
Jacob Erlbeck9b3d7e02016-01-19 10:44:42 +0100301 "egprs only",
302 EGPRS_STR "Use EGPRS and disable plain GPRS\n")
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200303{
304 struct gprs_rlcmac_bts *bts = bts_main_data();
305
306 bts->egprs_enabled = 1;
307
Jacob Erlbeck953c7892015-09-28 18:12:57 +0200308 return CMD_SUCCESS;
309}
310
311DEFUN(cfg_pcu_no_egprs,
312 cfg_pcu_no_egprs_cmd,
313 "no egprs",
314 NO_STR EGPRS_STR)
315{
316 struct gprs_rlcmac_bts *bts = bts_main_data();
317
318 bts->egprs_enabled = 0;
319
320 return CMD_SUCCESS;
321}
322
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200323DEFUN(cfg_pcu_fc_interval,
324 cfg_pcu_fc_interval_cmd,
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200325 "flow-control-interval <1-10>",
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200326 "Interval between sending subsequent Flow Control PDUs\n"
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200327 "Interval time in seconds\n")
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200328{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200329 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200330
331 bts->fc_interval = atoi(argv[0]);
332
333 return CMD_SUCCESS;
334}
Jacob Erlbeck87d73412015-04-21 12:56:48 +0200335#define FC_STR "BSSGP Flow Control configuration\n"
336#define FC_BMAX_STR(who) "Force a fixed value for the " who " bucket size\n"
337#define FC_LR_STR(who) "Force a fixed value for the " who " leak rate\n"
338
339DEFUN(cfg_pcu_fc_bvc_bucket_size,
340 cfg_pcu_fc_bvc_bucket_size_cmd,
341 "flow-control force-bvc-bucket-size <1-6553500>",
342 FC_STR FC_BMAX_STR("BVC") "Bucket size in octets\n")
343{
344 struct gprs_rlcmac_bts *bts = bts_main_data();
345
346 bts->fc_bvc_bucket_size = atoi(argv[0]);
347
348 return CMD_SUCCESS;
349}
350
351DEFUN(cfg_pcu_no_fc_bvc_bucket_size,
352 cfg_pcu_no_fc_bvc_bucket_size_cmd,
353 "no flow-control force-bvc-bucket-size",
354 NO_STR FC_STR FC_BMAX_STR("BVC"))
355{
356 struct gprs_rlcmac_bts *bts = bts_main_data();
357
358 bts->fc_bvc_bucket_size = 0;
359
360 return CMD_SUCCESS;
361}
362
363DEFUN(cfg_pcu_fc_bvc_leak_rate,
364 cfg_pcu_fc_bvc_leak_rate_cmd,
365 "flow-control force-bvc-leak-rate <1-6553500>",
366 FC_STR FC_LR_STR("BVC") "Leak rate in bit/s\n")
367{
368 struct gprs_rlcmac_bts *bts = bts_main_data();
369
370 bts->fc_bvc_leak_rate = atoi(argv[0]);
371
372 return CMD_SUCCESS;
373}
374
375DEFUN(cfg_pcu_no_fc_bvc_leak_rate,
376 cfg_pcu_no_fc_bvc_leak_rate_cmd,
377 "no flow-control force-bvc-leak-rate",
378 NO_STR FC_STR FC_LR_STR("BVC"))
379{
380 struct gprs_rlcmac_bts *bts = bts_main_data();
381
382 bts->fc_bvc_leak_rate = 0;
383
384 return CMD_SUCCESS;
385}
386
387DEFUN(cfg_pcu_fc_ms_bucket_size,
388 cfg_pcu_fc_ms_bucket_size_cmd,
389 "flow-control force-ms-bucket-size <1-6553500>",
390 FC_STR FC_BMAX_STR("default MS") "Bucket size in octets\n")
391{
392 struct gprs_rlcmac_bts *bts = bts_main_data();
393
394 bts->fc_ms_bucket_size = atoi(argv[0]);
395
396 return CMD_SUCCESS;
397}
398
399DEFUN(cfg_pcu_no_fc_ms_bucket_size,
400 cfg_pcu_no_fc_ms_bucket_size_cmd,
401 "no flow-control force-ms-bucket-size",
402 NO_STR FC_STR FC_BMAX_STR("default MS"))
403{
404 struct gprs_rlcmac_bts *bts = bts_main_data();
405
406 bts->fc_ms_bucket_size = 0;
407
408 return CMD_SUCCESS;
409}
410
411DEFUN(cfg_pcu_fc_ms_leak_rate,
412 cfg_pcu_fc_ms_leak_rate_cmd,
413 "flow-control force-ms-leak-rate <1-6553500>",
414 FC_STR FC_LR_STR("default MS") "Leak rate in bit/s\n")
415{
416 struct gprs_rlcmac_bts *bts = bts_main_data();
417
418 bts->fc_ms_leak_rate = atoi(argv[0]);
419
420 return CMD_SUCCESS;
421}
422
423DEFUN(cfg_pcu_no_fc_ms_leak_rate,
424 cfg_pcu_no_fc_ms_leak_rate_cmd,
425 "no flow-control force-ms-leak-rate",
426 NO_STR FC_STR FC_LR_STR("default MS"))
427{
428 struct gprs_rlcmac_bts *bts = bts_main_data();
429
430 bts->fc_ms_leak_rate = 0;
431
432 return CMD_SUCCESS;
433}
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +0200434
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200435#define FC_BTIME_STR "Set target downlink maximum queueing time (only affects the advertised bucket size)\n"
436DEFUN(cfg_pcu_fc_bucket_time,
437 cfg_pcu_fc_bucket_time_cmd,
438 "flow-control bucket-time <1-65534>",
439 FC_STR FC_BTIME_STR "Time in centi-seconds\n")
440{
441 struct gprs_rlcmac_bts *bts = bts_main_data();
442
443 bts->fc_bucket_time = atoi(argv[0]);
444
445 return CMD_SUCCESS;
446}
447
448DEFUN(cfg_pcu_no_fc_bucket_time,
449 cfg_pcu_no_fc_bucket_time_cmd,
450 "no flow-control bucket-time",
451 NO_STR FC_STR FC_BTIME_STR)
452{
453 struct gprs_rlcmac_bts *bts = bts_main_data();
454
455 bts->fc_bucket_time = 0;
456
457 return CMD_SUCCESS;
458}
459
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200460#define CS_STR "Coding Scheme configuration\n"
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +0200461
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200462DEFUN(cfg_pcu_cs,
463 cfg_pcu_cs_cmd,
Andreas Eversberg499ff412012-10-03 14:21:36 +0200464 "cs <1-4> [<1-4>]",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200465 CS_STR
466 "Initial CS value to be used (overrides BTS config)\n"
467 "Use a different initial CS value for the uplink")
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200468{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200469 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200470 uint8_t cs = atoi(argv[0]);
471
472 bts->force_cs = 1;
Andreas Eversberg499ff412012-10-03 14:21:36 +0200473 bts->initial_cs_dl = cs;
474 if (argc > 1)
475 bts->initial_cs_ul = atoi(argv[1]);
476 else
477 bts->initial_cs_ul = cs;
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200478
479 return CMD_SUCCESS;
480}
481
482DEFUN(cfg_pcu_no_cs,
483 cfg_pcu_no_cs_cmd,
484 "no cs",
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200485 NO_STR CS_STR)
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200486{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200487 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg8b761a32012-07-20 21:50:31 +0200488
489 bts->force_cs = 0;
490
491 return CMD_SUCCESS;
492}
493
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100494#define CS_MAX_STR "Set maximum values for adaptive CS selection (overrides BTS config)\n"
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200495DEFUN(cfg_pcu_cs_max,
496 cfg_pcu_cs_max_cmd,
497 "cs max <1-4> [<1-4>]",
498 CS_STR
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100499 CS_MAX_STR
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200500 "Maximum CS value to be used\n"
501 "Use a different maximum CS value for the uplink")
502{
503 struct gprs_rlcmac_bts *bts = bts_main_data();
504 uint8_t cs = atoi(argv[0]);
505
506 bts->max_cs_dl = cs;
507 if (argc > 1)
508 bts->max_cs_ul = atoi(argv[1]);
509 else
510 bts->max_cs_ul = cs;
511
512 return CMD_SUCCESS;
513}
514
515DEFUN(cfg_pcu_no_cs_max,
516 cfg_pcu_no_cs_max_cmd,
517 "no cs max",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100518 NO_STR CS_STR CS_MAX_STR)
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200519{
520 struct gprs_rlcmac_bts *bts = bts_main_data();
521
522 bts->max_cs_dl = 0;
523 bts->max_cs_ul = 0;
524
525 return CMD_SUCCESS;
526}
527
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100528#define MCS_STR "Modulation and Coding Scheme configuration (EGPRS)\n"
529
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +0100530DEFUN(cfg_pcu_mcs,
531 cfg_pcu_mcs_cmd,
532 "mcs <1-9> [<1-9>]",
533 MCS_STR
534 "Initial MCS value to be used (default 1)\n"
535 "Use a different initial MCS value for the uplink")
536{
537 struct gprs_rlcmac_bts *bts = bts_main_data();
538 uint8_t cs = atoi(argv[0]);
539
540 bts->initial_mcs_dl = cs;
541 if (argc > 1)
542 bts->initial_mcs_ul = atoi(argv[1]);
543 else
544 bts->initial_mcs_ul = cs;
545
546 return CMD_SUCCESS;
547}
548
549DEFUN(cfg_pcu_no_mcs,
550 cfg_pcu_no_mcs_cmd,
551 "no mcs",
552 NO_STR MCS_STR)
553{
554 struct gprs_rlcmac_bts *bts = bts_main_data();
555
556 bts->initial_mcs_dl = 1;
557 bts->initial_mcs_ul = 1;
558
559 return CMD_SUCCESS;
560}
561
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100562DEFUN(cfg_pcu_mcs_max,
563 cfg_pcu_mcs_max_cmd,
Jacob Erlbeckf9940ca2016-01-19 10:32:33 +0100564 "mcs max <1-9> [<1-9>]",
Jacob Erlbeck0d058052016-01-07 11:48:28 +0100565 MCS_STR
566 CS_MAX_STR
567 "Maximum MCS value to be used\n"
568 "Use a different maximum MCS value for the uplink")
569{
570 struct gprs_rlcmac_bts *bts = bts_main_data();
571 uint8_t mcs = atoi(argv[0]);
572
573 bts->max_mcs_dl = mcs;
574 if (argc > 1)
575 bts->max_mcs_ul = atoi(argv[1]);
576 else
577 bts->max_mcs_ul = mcs;
578
579 return CMD_SUCCESS;
580}
581
582DEFUN(cfg_pcu_no_mcs_max,
583 cfg_pcu_no_mcs_max_cmd,
584 "no mcs max",
585 NO_STR MCS_STR CS_MAX_STR)
586{
587 struct gprs_rlcmac_bts *bts = bts_main_data();
588
589 bts->max_mcs_dl = 0;
590 bts->max_mcs_ul = 0;
591
592 return CMD_SUCCESS;
593}
594
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530595#define DL_STR "downlink specific configuration\n"
596
597DEFUN(cfg_pcu_dl_arq_type,
598 cfg_pcu_dl_arq_cmd,
599 "egprs dl arq-type (spb|arq2)",
600 EGPRS_STR DL_STR "ARQ options\n"
601 "enable SPB(ARQ1) support\n"
602 "enable ARQ2 support")
603{
604 struct gprs_rlcmac_bts *bts = bts_main_data();
605
606 if (!strcmp(argv[0], "arq2"))
607 bts->dl_arq_type = 1;
608 else
609 bts->dl_arq_type = 0;
610
611 return CMD_SUCCESS;
612}
613
Jacob Erlbeck36df7742016-01-19 15:53:30 +0100614DEFUN(cfg_pcu_window_size,
615 cfg_pcu_window_size_cmd,
616 "window-size <0-1024> [<0-256>]",
617 "Window size configuration (b + N_PDCH * f)\n"
618 "Base value (b)\n"
619 "Factor for number of PDCH (f)")
620{
621 struct gprs_rlcmac_bts *bts = bts_main_data();
622 uint16_t b = atoi(argv[0]);
623
624 bts->ws_base = b;
625 if (argc > 1) {
626 uint16_t f = atoi(argv[1]);
627 bts->ws_pdch = f;
628 }
629
630 return CMD_SUCCESS;
631}
632
633
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200634#define QUEUE_STR "Packet queue options\n"
635#define LIFETIME_STR "Set lifetime limit of LLC frame in centi-seconds " \
636 "(overrides the value given by SGSN)\n"
637
638DEFUN(cfg_pcu_queue_lifetime,
639 cfg_pcu_queue_lifetime_cmd,
640 "queue lifetime <1-65534>",
641 QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
642{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200643 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200644 uint16_t csec = atoi(argv[0]);
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200645
646 bts->force_llc_lifetime = csec;
647
648 return CMD_SUCCESS;
649}
650
651DEFUN(cfg_pcu_queue_lifetime_inf,
652 cfg_pcu_queue_lifetime_inf_cmd,
653 "queue lifetime infinite",
654 QUEUE_STR LIFETIME_STR "Infinite lifetime")
655{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200656 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200657
658 bts->force_llc_lifetime = 0xffff;
659
660 return CMD_SUCCESS;
661}
662
663DEFUN(cfg_pcu_no_queue_lifetime,
664 cfg_pcu_no_queue_lifetime_cmd,
665 "no queue lifetime",
666 NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
667 "by SGSN)\n")
668{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200669 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg24131bf2012-07-21 11:09:58 +0200670
671 bts->force_llc_lifetime = 0;
672
673 return CMD_SUCCESS;
674}
675
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100676#define QUEUE_HYSTERESIS_STR "Set lifetime hysteresis of LLC frame in centi-seconds " \
677 "(continue discarding until lifetime-hysteresis is reached)\n"
678
679DEFUN(cfg_pcu_queue_hysteresis,
680 cfg_pcu_queue_hysteresis_cmd,
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200681 "queue hysteresis <1-65535>",
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100682 QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
683{
684 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200685 uint16_t csec = atoi(argv[0]);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100686
687 bts->llc_discard_csec = csec;
688
689 return CMD_SUCCESS;
690}
691
692DEFUN(cfg_pcu_no_queue_hysteresis,
693 cfg_pcu_no_queue_hysteresis_cmd,
694 "no queue hysteresis",
695 NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
696{
697 struct gprs_rlcmac_bts *bts = bts_main_data();
698
699 bts->llc_discard_csec = 0;
700
701 return CMD_SUCCESS;
702}
703
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +0200704#define QUEUE_CODEL_STR "Set CoDel queue management\n"
705
706DEFUN(cfg_pcu_queue_codel,
707 cfg_pcu_queue_codel_cmd,
708 "queue codel",
709 QUEUE_STR QUEUE_CODEL_STR)
710{
711 struct gprs_rlcmac_bts *bts = bts_main_data();
712
713 bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
714
715 return CMD_SUCCESS;
716}
717
718DEFUN(cfg_pcu_queue_codel_interval,
719 cfg_pcu_queue_codel_interval_cmd,
720 "queue codel interval <1-1000>",
721 QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
722{
723 struct gprs_rlcmac_bts *bts = bts_main_data();
724 uint16_t csec = atoi(argv[0]);
725
726 bts->llc_codel_interval_msec = 10*csec;
727
728 return CMD_SUCCESS;
729}
730
731DEFUN(cfg_pcu_no_queue_codel,
732 cfg_pcu_no_queue_codel_cmd,
733 "no queue codel",
734 NO_STR QUEUE_STR QUEUE_CODEL_STR)
735{
736 struct gprs_rlcmac_bts *bts = bts_main_data();
737
738 bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
739
740 return CMD_SUCCESS;
741}
742
743
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200744#define QUEUE_IDLE_ACK_STR "Request an ACK after the last DL LLC frame in centi-seconds\n"
745
746DEFUN(cfg_pcu_queue_idle_ack_delay,
747 cfg_pcu_queue_idle_ack_delay_cmd,
748 "queue idle-ack-delay <1-65535>",
749 QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds")
750{
751 struct gprs_rlcmac_bts *bts = bts_main_data();
Jacob Erlbeck2acfbeb2015-04-30 17:55:16 +0200752 uint16_t csec = atoi(argv[0]);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +0200753
754 bts->llc_idle_ack_csec = csec;
755
756 return CMD_SUCCESS;
757}
758
759DEFUN(cfg_pcu_no_queue_idle_ack_delay,
760 cfg_pcu_no_queue_idle_ack_delay_cmd,
761 "no queue idle-ack-delay",
762 NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR)
763{
764 struct gprs_rlcmac_bts *bts = bts_main_data();
765
766 bts->llc_idle_ack_csec = 0;
767
768 return CMD_SUCCESS;
769}
770
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +0100771
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200772DEFUN(cfg_pcu_alloc,
773 cfg_pcu_alloc_cmd,
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200774 "alloc-algorithm (a|b|dynamic)",
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200775 "Select slot allocation algorithm to use when assigning timeslots on "
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200776 "PACCH\n"
777 "Single slot is assigned only\n"
778 "Multiple slots are assigned for semi-duplex operation\n"
779 "Dynamically select the algorithm based on the system state\n")
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200780{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200781 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200782
783 switch (argv[0][0]) {
784 case 'a':
785 bts->alloc_algorithm = alloc_algorithm_a;
786 break;
787 case 'b':
788 bts->alloc_algorithm = alloc_algorithm_b;
789 break;
Jacob Erlbeck400ec022015-07-14 13:31:48 +0200790 default:
791 bts->alloc_algorithm = alloc_algorithm_dynamic;
792 break;
Andreas Eversberga1503fa2012-07-22 08:58:09 +0200793 }
794
795 return CMD_SUCCESS;
796}
797
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200798DEFUN(cfg_pcu_two_phase,
799 cfg_pcu_two_phase_cmd,
800 "two-phase-access",
801 "Force two phase access when MS requests single phase access\n")
802{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200803 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200804
805 bts->force_two_phase = 1;
806
807 return CMD_SUCCESS;
808}
809
810DEFUN(cfg_pcu_no_two_phase,
811 cfg_pcu_no_two_phase_cmd,
812 "no two-phase-access",
813 NO_STR "Only use two phase access when requested my MS\n")
814{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200815 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversberg07e97cf2012-08-07 16:00:56 +0200816
817 bts->force_two_phase = 0;
818
819 return CMD_SUCCESS;
820}
821
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200822DEFUN(cfg_pcu_alpha,
823 cfg_pcu_alpha_cmd,
824 "alpha <0-10>",
825 "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
826 "NOTE: Be sure to set Alpha value at System information 13 too.\n"
827 "Alpha in units of 0.1\n")
828{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200829 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200830
831 bts->alpha = atoi(argv[0]);
832
833 return CMD_SUCCESS;
834}
835
836DEFUN(cfg_pcu_gamma,
837 cfg_pcu_gamma_cmd,
838 "gamma <0-62>",
839 "Gamma parameter for MS power control in units of dB (see TS 05.08)\n"
840 "Gamma in even unit of dBs\n")
841{
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200842 struct gprs_rlcmac_bts *bts = bts_main_data();
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +0200843
844 bts->gamma = atoi(argv[0]) / 2;
845
846 return CMD_SUCCESS;
847}
848
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +0100849DEFUN(show_bts_stats,
850 show_bts_stats_cmd,
851 "show bts statistics",
852 SHOW_STR "BTS related functionality\nStatistics\n")
853{
854 vty_out_rate_ctr_group(vty, "", bts_main_data_stats());
855 return CMD_SUCCESS;
Daniel Willmann772415f2014-01-15 17:06:51 +0100856}
857
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100858#define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200859DEFUN_DEPRECATED(cfg_pcu_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100860 cfg_pcu_dl_tbf_idle_time_cmd,
861 "dl-tbf-idle-time <1-5000>",
862 IDLE_TIME_STR "idle time in msec")
863{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200864 vty_out(vty, "%% 'dl-tbf-idle-time' is now deprecated: use 'timer X2031 <val>' instead%s", VTY_NEWLINE);
865
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100866 struct gprs_rlcmac_bts *bts = bts_main_data();
867
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200868 if (osmo_tdef_set(bts->T_defs_pcu, -2031, atoi(argv[0]), OSMO_TDEF_MS) < 0)
869 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100870 return CMD_SUCCESS;
871}
872
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200873DEFUN_DEPRECATED(cfg_pcu_no_dl_tbf_idle_time,
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100874 cfg_pcu_no_dl_tbf_idle_time_cmd,
875 "no dl-tbf-idle-time",
876 NO_STR IDLE_TIME_STR)
877{
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200878 vty_out(vty, "%% 'no dl-tbf-idle-time' is now deprecated: use 'timer X2031 0' instead%s", VTY_NEWLINE);
879
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100880 struct gprs_rlcmac_bts *bts = bts_main_data();
881
Pau Espin Pedrol2b5c6292019-09-09 13:41:00 +0200882 if (osmo_tdef_set(bts->T_defs_pcu, -2031, 0, OSMO_TDEF_MS) < 0)
883 return CMD_WARNING;
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +0100884 return CMD_SUCCESS;
885}
886
Oliver Smith45fdc442019-09-05 15:12:20 +0200887#define RETRANSMISSION_STR "retransmit blocks even before the MS had a chance to receive them (better throughput," \
888 " less readable traces)"
889DEFUN(cfg_pcu_dl_tbf_preemptive_retransmission,
890 cfg_pcu_dl_tbf_preemptive_retransmission_cmd,
891 "dl-tbf-preemptive-retransmission",
892 RETRANSMISSION_STR " (enabled by default)")
893{
894 struct gprs_rlcmac_bts *bts = bts_main_data();
895
896 bts->dl_tbf_preemptive_retransmission = true;
897
898 return CMD_SUCCESS;
899}
900
901DEFUN(cfg_pcu_no_dl_tbf_preemptive_retransmission,
902 cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd,
903 "no dl-tbf-preemptive-retransmission",
904 NO_STR RETRANSMISSION_STR)
905{
906 struct gprs_rlcmac_bts *bts = bts_main_data();
907
908 bts->dl_tbf_preemptive_retransmission = false;
909
910 return CMD_SUCCESS;
911}
912
Jacob Erlbecka098c192015-05-28 16:11:19 +0200913#define MS_IDLE_TIME_STR "keep an idle MS object alive for the time given\n"
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200914DEFUN_DEPRECATED(cfg_pcu_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200915 cfg_pcu_ms_idle_time_cmd,
916 "ms-idle-time <1-7200>",
917 MS_IDLE_TIME_STR "idle time in sec")
918{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200919 vty_out(vty, "%% 'ms-idle-time' is now deprecated: use 'timer X2030 <val>' instead%s", VTY_NEWLINE);
920
Jacob Erlbecka098c192015-05-28 16:11:19 +0200921 struct gprs_rlcmac_bts *bts = bts_main_data();
922
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200923 if (osmo_tdef_set(bts->T_defs_pcu, -2030, atoi(argv[0]), OSMO_TDEF_S) < 0)
924 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200925 return CMD_SUCCESS;
926}
927
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200928DEFUN_DEPRECATED(cfg_pcu_no_ms_idle_time,
Jacob Erlbecka098c192015-05-28 16:11:19 +0200929 cfg_pcu_no_ms_idle_time_cmd,
930 "no ms-idle-time",
931 NO_STR MS_IDLE_TIME_STR)
932{
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200933 vty_out(vty, "%% 'no ms-idle-time' is now deprecated: use 'timer X2030 0' instead%s", VTY_NEWLINE);
934
Jacob Erlbecka098c192015-05-28 16:11:19 +0200935 struct gprs_rlcmac_bts *bts = bts_main_data();
936
Pau Espin Pedrol63700ea2019-09-09 13:19:06 +0200937 if (osmo_tdef_set(bts->T_defs_pcu, -2030, 0, OSMO_TDEF_S) < 0)
938 return CMD_WARNING;
Jacob Erlbecka098c192015-05-28 16:11:19 +0200939 return CMD_SUCCESS;
940}
941
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100942#define CS_ERR_LIMITS_STR "set thresholds for error rate based downlink (M)CS adjustment\n"
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200943DEFUN(cfg_pcu_cs_err_limits,
944 cfg_pcu_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200945 "cs threshold <0-100> <0-100>",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200946 CS_STR CS_ERR_LIMITS_STR "lower limit in %\n" "upper limit in %\n")
947{
948 struct gprs_rlcmac_bts *bts = bts_main_data();
949
950 uint8_t lower_limit = atoi(argv[0]);
951 uint8_t upper_limit = atoi(argv[1]);
952
953 if (lower_limit > upper_limit) {
954 vty_out(vty,
955 "The lower limit must be less than or equal to the "
956 "upper limit.%s", VTY_NEWLINE);
957 return CMD_WARNING;
958 }
959
960 bts->cs_adj_enabled = 1;
961 bts->cs_adj_upper_limit = upper_limit;
962 bts->cs_adj_lower_limit = lower_limit;
963
964 return CMD_SUCCESS;
965}
966
967DEFUN(cfg_pcu_no_cs_err_limits,
968 cfg_pcu_no_cs_err_limits_cmd,
Jacob Erlbeckb33e6752015-06-04 19:04:30 +0200969 "no cs threshold",
Jacob Erlbeck8322d082015-06-04 15:12:10 +0200970 NO_STR CS_STR CS_ERR_LIMITS_STR)
971{
972 struct gprs_rlcmac_bts *bts = bts_main_data();
973
974 bts->cs_adj_enabled = 0;
975 bts->cs_adj_upper_limit = 100;
976 bts->cs_adj_lower_limit = 0;
977
978 return CMD_SUCCESS;
979}
980
Pau Espin Pedrol1e6eb302019-11-28 17:00:44 +0100981#define CS_DOWNGRADE_STR "set threshold for data size based downlink (M)CS downgrade\n"
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200982DEFUN(cfg_pcu_cs_downgrade_thrsh,
983 cfg_pcu_cs_downgrade_thrsh_cmd,
984 "cs downgrade-threshold <1-10000>",
985 CS_STR CS_DOWNGRADE_STR "downgrade if less octets left\n")
986{
987 struct gprs_rlcmac_bts *bts = bts_main_data();
988
989 bts->cs_downgrade_threshold = atoi(argv[0]);
990
991 return CMD_SUCCESS;
992}
993
994DEFUN(cfg_pcu_no_cs_downgrade_thrsh,
995 cfg_pcu_no_cs_downgrade_thrsh_cmd,
996 "no cs downgrade-threshold",
Jacob Erlbeckf1379342015-06-29 10:49:30 +0200997 NO_STR CS_STR CS_DOWNGRADE_STR)
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200998{
999 struct gprs_rlcmac_bts *bts = bts_main_data();
1000
1001 bts->cs_downgrade_threshold = 0;
1002
1003 return CMD_SUCCESS;
1004}
1005
1006
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001007DEFUN(cfg_pcu_cs_lqual_ranges,
1008 cfg_pcu_cs_lqual_ranges_cmd,
1009 "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 +01001010 CS_STR "Set link quality ranges for each uplink CS\n"
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001011 "Set quality range for CS-1 (high value only)\n"
1012 "CS-1 high (dB)\n"
1013 "Set quality range for CS-2\n"
1014 "CS-2 low (dB)\n"
1015 "CS-2 high (dB)\n"
1016 "Set quality range for CS-3\n"
1017 "CS-3 low (dB)\n"
1018 "CS-3 high (dB)\n"
1019 "Set quality range for CS-4 (low value only)\n"
1020 "CS-4 low (dB)\n")
1021{
1022 struct gprs_rlcmac_bts *bts = bts_main_data();
1023
1024 uint8_t cs1_high = atoi(argv[0]);
1025 uint8_t cs2_low = atoi(argv[1]);
1026 uint8_t cs2_high = atoi(argv[2]);
1027 uint8_t cs3_low = atoi(argv[3]);
1028 uint8_t cs3_high = atoi(argv[4]);
1029 uint8_t cs4_low = atoi(argv[5]);
1030
1031 bts->cs_lqual_ranges[0].high = cs1_high;
1032 bts->cs_lqual_ranges[1].low = cs2_low;
1033 bts->cs_lqual_ranges[1].high = cs2_high;
1034 bts->cs_lqual_ranges[2].low = cs3_low;
1035 bts->cs_lqual_ranges[2].high = cs3_high;
1036 bts->cs_lqual_ranges[3].low = cs4_low;
1037
1038 return CMD_SUCCESS;
1039}
1040
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001041DEFUN(cfg_pcu_mcs_lqual_ranges,
1042 cfg_pcu_mcs_lqual_ranges_cmd,
1043 "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 +01001044 CS_STR "Set link quality ranges for each uplink MCS\n"
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001045 "Set quality range for MCS-1 (high value only)\n"
1046 "MCS-1 high (dB)\n"
1047 "Set quality range for MCS-2\n"
1048 "MCS-2 high (dB)\n"
1049 "MCS-2 low (dB)\n"
1050 "Set quality range for MCS-3\n"
1051 "MCS-3 high (dB)\n"
1052 "MCS-3 low (dB)\n"
1053 "Set quality range for MCS-4\n"
1054 "MCS-4 high (dB)\n"
1055 "MCS-4 low (dB)\n"
1056 "Set quality range for MCS-5\n"
1057 "MCS-5 high (dB)\n"
1058 "MCS-5 low (dB)\n"
1059 "Set quality range for MCS-6\n"
1060 "MCS-6 low (dB)\n"
1061 "MCS-6 high (dB)\n"
1062 "Set quality range for MCS-7\n"
1063 "MCS-7 low (dB)\n"
1064 "MCS-7 high (dB)\n"
1065 "Set quality range for MCS-8\n"
1066 "MCS-8 low (dB)\n"
1067 "MCS-8 high (dB)\n"
1068 "Set quality range for MCS-9 (low value only)\n"
1069 "MCS-9 low (dB)\n")
1070{
1071 struct gprs_rlcmac_bts *bts = bts_main_data();
1072
1073 bts->mcs_lqual_ranges[0].high = atoi(argv[0]);
1074 bts->mcs_lqual_ranges[1].low = atoi(argv[1]);
1075 bts->mcs_lqual_ranges[1].high = atoi(argv[2]);
1076 bts->mcs_lqual_ranges[2].low = atoi(argv[3]);
1077 bts->mcs_lqual_ranges[2].high = atoi(argv[4]);
1078 bts->mcs_lqual_ranges[3].low = atoi(argv[5]);
1079 bts->mcs_lqual_ranges[3].high = atoi(argv[6]);
1080 bts->mcs_lqual_ranges[4].low = atoi(argv[7]);
1081 bts->mcs_lqual_ranges[4].high = atoi(argv[8]);
1082 bts->mcs_lqual_ranges[5].low = atoi(argv[9]);
1083 bts->mcs_lqual_ranges[5].high = atoi(argv[10]);
1084 bts->mcs_lqual_ranges[6].low = atoi(argv[11]);
1085 bts->mcs_lqual_ranges[6].high = atoi(argv[12]);
1086 bts->mcs_lqual_ranges[7].low = atoi(argv[13]);
1087 bts->mcs_lqual_ranges[7].high = atoi(argv[14]);
1088 bts->mcs_lqual_ranges[8].low = atoi(argv[15]);
1089
1090 return CMD_SUCCESS;
1091}
1092
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001093DEFUN(cfg_pcu_sock,
1094 cfg_pcu_sock_cmd,
1095 "pcu-socket PATH",
1096 "Configure the osmo-bts PCU socket file/path name\n"
1097 "Path of the socket to connect to\n")
1098{
1099 struct gprs_rlcmac_bts *bts = bts_main_data();
1100
Vadim Yanitskiyfc75cc02019-11-30 20:13:25 +07001101 if (vty->type != VTY_FILE)
1102 vty_out(vty, "Changing PCU socket path at run-time has no effect%s", VTY_NEWLINE);
1103
Vadim Yanitskiy657a4c02019-11-30 20:15:22 +07001104 osmo_talloc_replace_string(tall_pcu_ctx, &bts->pcu_sock_path, argv[0]);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001105
1106 return CMD_SUCCESS;
1107}
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001108
Harald Welte57d35152018-07-05 03:11:17 +02001109DEFUN(cfg_pcu_gb_dialect,
1110 cfg_pcu_gb_dialect_cmd,
1111 "gb-dialect (classic|ip-sns)",
1112 "Select which Gb interface dialect to use\n"
1113 "Classic Gb interface with NS-{RESET,BLOCK,UNBLOCK} and static configuration\n"
1114 "Modern Gb interface with IP-SNS (Sub Network Service) and dynamic configuration\n")
1115{
1116 struct gprs_rlcmac_bts *bts = bts_main_data();
1117
1118 if (!strcmp(argv[0], "ip-sns"))
1119 bts->gb_dialect_sns = true;
1120 else
1121 bts->gb_dialect_sns = false;
1122
1123 return CMD_SUCCESS;
1124}
1125
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001126DEFUN(show_bts_timer, show_bts_timer_cmd,
1127 "show bts-timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1128 SHOW_STR "Show BTS controlled timers\n"
1129 OSMO_TDEF_VTY_DOC_T)
1130{
1131 struct gprs_rlcmac_bts *bts = bts_main_data();
1132 const char *T_arg = argc > 0 ? argv[0] : NULL;
1133 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, NULL);
1134}
1135
1136DEFUN(show_timer, show_timer_cmd,
1137 "show timer " OSMO_TDEF_VTY_ARG_T_OPTIONAL,
1138 SHOW_STR "Show PCU timers\n"
1139 OSMO_TDEF_VTY_DOC_T)
1140{
1141 struct gprs_rlcmac_bts *bts = bts_main_data();
1142 const char *T_arg = argc > 0 ? argv[0] : NULL;
1143 return osmo_tdef_vty_show_cmd(vty, bts->T_defs_pcu, T_arg, NULL);
1144}
1145
1146DEFUN(cfg_pcu_timer, cfg_pcu_timer_cmd,
1147 "timer " OSMO_TDEF_VTY_ARG_SET_OPTIONAL,
1148 "Configure or show PCU timers\n"
1149 OSMO_TDEF_VTY_DOC_SET)
1150{
1151 struct gprs_rlcmac_bts *bts = bts_main_data();
1152 /* If any arguments are missing, redirect to 'show' */
1153 if (argc < 2)
1154 return show_timer(self, vty, argc, argv);
1155 return osmo_tdef_vty_set_cmd(vty, bts->T_defs_pcu, argv);
1156}
1157
Daniel Willmann772415f2014-01-15 17:06:51 +01001158DEFUN(show_tbf,
1159 show_tbf_cmd,
Max12a09872018-02-01 16:07:33 +01001160 "show tbf (all|ccch|pacch)",
1161 SHOW_STR "information about TBFs\n"
1162 "All TBFs\n"
1163 "TBFs allocated via CCCH\n"
1164 "TBFs allocated via PACCH\n")
Daniel Willmann772415f2014-01-15 17:06:51 +01001165{
1166 struct gprs_rlcmac_bts *bts = bts_main_data();
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001167 uint32_t flags = UINT32_MAX;
Max12a09872018-02-01 16:07:33 +01001168
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001169 if (argv[0][0] == 'c')
1170 flags = (1 << GPRS_RLCMAC_FLAG_CCCH);
1171 else if (argv[0][0] == 'p')
1172 flags = (1 << GPRS_RLCMAC_FLAG_PACCH);
Max12a09872018-02-01 16:07:33 +01001173
Vadim Yanitskiycef2f842019-10-09 21:52:50 +07001174 return pcu_vty_show_tbf_all(vty, bts, flags);
Daniel Willmann772415f2014-01-15 17:06:51 +01001175}
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001176
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001177DEFUN(show_ms_all,
1178 show_ms_all_cmd,
1179 "show ms all",
1180 SHOW_STR "information about MSs\n" "All TBFs\n")
1181{
1182 struct gprs_rlcmac_bts *bts = bts_main_data();
1183 return pcu_vty_show_ms_all(vty, bts);
1184}
1185
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001186DEFUN(show_ms_tlli,
1187 show_ms_tlli_cmd,
1188 "show ms tlli TLLI",
1189 SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")
1190{
1191 struct gprs_rlcmac_bts *bts = bts_main_data();
1192 char *endp = NULL;
1193 unsigned long long tlli = strtoll(argv[0], &endp, 16);
1194 if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {
1195 vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);
1196 return CMD_WARNING;
1197 }
1198 return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);
1199}
1200
1201DEFUN(show_ms_imsi,
1202 show_ms_imsi_cmd,
1203 "show ms imsi IMSI",
1204 SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")
1205{
1206 struct gprs_rlcmac_bts *bts = bts_main_data();
1207 return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);
1208}
1209
Andreas Eversberg12942562012-07-12 14:31:57 +02001210static const char pcu_copyright[] =
Harald Welted1e340f2013-01-17 12:24:29 +01001211 "Copyright (C) 2012 by Ivan Kluchnikov <kluchnikovi@gmail.com> and \r\n"
1212 " Andreas Eversberg <jolly@eversberg.eu>\r\n"
Andreas Eversberg12942562012-07-12 14:31:57 +02001213 "License GNU GPL version 2 or later\r\n"
1214 "This is free software: you are free to change and redistribute it.\r\n"
1215 "There is NO WARRANTY, to the extent permitted by law.\r\n";
1216
1217struct vty_app_info pcu_vty_info = {
Pau Espin Pedrold0fc9e82019-11-29 13:37:45 +01001218 .name = "OsmoPCU",
Andreas Eversberg12942562012-07-12 14:31:57 +02001219 .version = PACKAGE_VERSION,
1220 .copyright = pcu_copyright,
1221 .go_parent_cb = pcu_vty_go_parent,
1222 .is_config_node = pcu_vty_is_config_node,
1223};
1224
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001225int pcu_vty_init(void)
Andreas Eversberg12942562012-07-12 14:31:57 +02001226{
1227// install_element_ve(&show_pcu_cmd);
1228
Harald Welte717cdf52017-07-21 21:56:23 +02001229 cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1230 "gsmtap-category (",
1231 "|",")", VTY_DO_LOWER);
1232 cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1233 "GSMTAP Category\n",
1234 "\n", "", 0);
1235 cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names,
1236 "no gsmtap-category (",
1237 "|",")", VTY_DO_LOWER);
1238 cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help,
1239 NO_STR "GSMTAP Category\n",
1240 "\n", "", 0);
1241
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001242 logging_vty_add_cmds();
1243 osmo_stats_vty_add_cmds();
Andreas Eversberg12942562012-07-12 14:31:57 +02001244
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001245 install_node(&pcu_node, config_write_pcu);
1246 install_element(CONFIG_NODE, &cfg_pcu_cmd);
Jacob Erlbeck953c7892015-09-28 18:12:57 +02001247 install_element(PCU_NODE, &cfg_pcu_egprs_cmd);
1248 install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001249 install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001250 install_element(PCU_NODE, &cfg_pcu_cs_cmd);
1251 install_element(PCU_NODE, &cfg_pcu_no_cs_cmd);
Jacob Erlbeckb33e6752015-06-04 19:04:30 +02001252 install_element(PCU_NODE, &cfg_pcu_cs_max_cmd);
1253 install_element(PCU_NODE, &cfg_pcu_no_cs_max_cmd);
Jacob Erlbeck8322d082015-06-04 15:12:10 +02001254 install_element(PCU_NODE, &cfg_pcu_cs_err_limits_cmd);
1255 install_element(PCU_NODE, &cfg_pcu_no_cs_err_limits_cmd);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +02001256 install_element(PCU_NODE, &cfg_pcu_cs_downgrade_thrsh_cmd);
1257 install_element(PCU_NODE, &cfg_pcu_no_cs_downgrade_thrsh_cmd);
Jacob Erlbeck94cde132015-06-09 09:44:36 +02001258 install_element(PCU_NODE, &cfg_pcu_cs_lqual_ranges_cmd);
Minh-Quang Nguyen1f189092017-08-16 09:50:06 -04001259 install_element(PCU_NODE, &cfg_pcu_mcs_lqual_ranges_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001260 install_element(PCU_NODE, &cfg_pcu_mcs_cmd);
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301261 install_element(PCU_NODE, &cfg_pcu_dl_arq_cmd);
Jacob Erlbeck4cc46d32016-02-02 16:02:16 +01001262 install_element(PCU_NODE, &cfg_pcu_no_mcs_cmd);
Jacob Erlbeck0d058052016-01-07 11:48:28 +01001263 install_element(PCU_NODE, &cfg_pcu_mcs_max_cmd);
1264 install_element(PCU_NODE, &cfg_pcu_no_mcs_max_cmd);
Jacob Erlbeck36df7742016-01-19 15:53:30 +01001265 install_element(PCU_NODE, &cfg_pcu_window_size_cmd);
Andreas Eversberg24131bf2012-07-21 11:09:58 +02001266 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_cmd);
1267 install_element(PCU_NODE, &cfg_pcu_queue_lifetime_inf_cmd);
1268 install_element(PCU_NODE, &cfg_pcu_no_queue_lifetime_cmd);
Jacob Erlbeck0c1c8772015-03-20 12:02:42 +01001269 install_element(PCU_NODE, &cfg_pcu_queue_hysteresis_cmd);
1270 install_element(PCU_NODE, &cfg_pcu_no_queue_hysteresis_cmd);
Jacob Erlbeckd4ad7312015-07-17 16:39:09 +02001271 install_element(PCU_NODE, &cfg_pcu_queue_codel_cmd);
1272 install_element(PCU_NODE, &cfg_pcu_queue_codel_interval_cmd);
1273 install_element(PCU_NODE, &cfg_pcu_no_queue_codel_cmd);
Jacob Erlbeckd0261b72015-04-02 13:58:09 +02001274 install_element(PCU_NODE, &cfg_pcu_queue_idle_ack_delay_cmd);
1275 install_element(PCU_NODE, &cfg_pcu_no_queue_idle_ack_delay_cmd);
Andreas Eversberga1503fa2012-07-22 08:58:09 +02001276 install_element(PCU_NODE, &cfg_pcu_alloc_cmd);
Andreas Eversberg07e97cf2012-08-07 16:00:56 +02001277 install_element(PCU_NODE, &cfg_pcu_two_phase_cmd);
Andreas Eversbergcd8a83a2012-09-23 06:41:21 +02001278 install_element(PCU_NODE, &cfg_pcu_fc_interval_cmd);
Jacob Erlbeck0288cdb2015-05-06 10:47:30 +02001279 install_element(PCU_NODE, &cfg_pcu_fc_bucket_time_cmd);
1280 install_element(PCU_NODE, &cfg_pcu_no_fc_bucket_time_cmd);
Jacob Erlbeck87d73412015-04-21 12:56:48 +02001281 install_element(PCU_NODE, &cfg_pcu_fc_bvc_bucket_size_cmd);
1282 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_bucket_size_cmd);
1283 install_element(PCU_NODE, &cfg_pcu_fc_bvc_leak_rate_cmd);
1284 install_element(PCU_NODE, &cfg_pcu_no_fc_bvc_leak_rate_cmd);
1285 install_element(PCU_NODE, &cfg_pcu_fc_ms_bucket_size_cmd);
1286 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_bucket_size_cmd);
1287 install_element(PCU_NODE, &cfg_pcu_fc_ms_leak_rate_cmd);
1288 install_element(PCU_NODE, &cfg_pcu_no_fc_ms_leak_rate_cmd);
Andreas Eversbergaafcbbb2012-09-27 09:20:45 +02001289 install_element(PCU_NODE, &cfg_pcu_alpha_cmd);
1290 install_element(PCU_NODE, &cfg_pcu_gamma_cmd);
Jacob Erlbeck3bed5d12015-03-19 11:22:38 +01001291 install_element(PCU_NODE, &cfg_pcu_dl_tbf_idle_time_cmd);
1292 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd);
Oliver Smith45fdc442019-09-05 15:12:20 +02001293 install_element(PCU_NODE, &cfg_pcu_dl_tbf_preemptive_retransmission_cmd);
1294 install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_preemptive_retransmission_cmd);
Jacob Erlbecka098c192015-05-28 16:11:19 +02001295 install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd);
1296 install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd);
Harald Welte717cdf52017-07-21 21:56:23 +02001297 install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd);
1298 install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd);
Pau Espin Pedrolc4178e52017-08-08 15:03:50 +02001299 install_element(PCU_NODE, &cfg_pcu_sock_cmd);
Harald Welte57d35152018-07-05 03:11:17 +02001300 install_element(PCU_NODE, &cfg_pcu_gb_dialect_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001301 install_element(PCU_NODE, &cfg_pcu_timer_cmd);
Andreas Eversberg8b761a32012-07-20 21:50:31 +02001302
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001303 install_element_ve(&show_bts_stats_cmd);
Daniel Willmann772415f2014-01-15 17:06:51 +01001304 install_element_ve(&show_tbf_cmd);
Jacob Erlbeckf47f68a2015-06-04 10:23:24 +02001305 install_element_ve(&show_ms_all_cmd);
Jacob Erlbeck37e896d2015-06-05 16:33:33 +02001306 install_element_ve(&show_ms_tlli_cmd);
1307 install_element_ve(&show_ms_imsi_cmd);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +02001308 install_element_ve(&show_bts_timer_cmd);
1309 install_element_ve(&show_timer_cmd);
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +01001310
Andreas Eversberg12942562012-07-12 14:31:57 +02001311 return 0;
1312}